Quellcode durchsuchen

Merge branch 'master' of https://bitbucket.org/EthanYeh/gambleadmin

EthnaYeh vor 7 Jahren
Ursprung
Commit
2ff8069fd6

+ 8 - 0
config/index.js

@@ -34,5 +34,13 @@ module.exports = {
34 34
     // In our experience, they generally work as expected,
35 35
     // just be aware of this issue when enabling this option.
36 36
     cssSourceMap: false
37
+  },
38
+  const: {
39
+    GambleMemberChipsLog: {
40
+      type: {
41
+        deposit: 0,
42
+        reward: 1,
43
+      },
44
+    },
37 45
   }
38 46
 }

+ 15 - 0
src/api/room.js

@@ -0,0 +1,15 @@
1
+import request from '@/utils/request'
2
+
3
+export function fetchWechatRooms(query) {
4
+  return request({
5
+    url: `/wechatRooms`,
6
+    method: 'get',
7
+    params: {
8
+      limit: query.limit,
9
+      offset: (query.page - 1) * query.limit,
10
+      startAt: query.startAt,
11
+      endAt: query.endAt,
12
+      name: query.name
13
+    }
14
+  })
15
+}

+ 4 - 4
src/router/index.js

@@ -53,7 +53,7 @@ export const constantRouterMap = [
53 53
       {
54 54
         path: 'index',
55 55
         component: _import('room/index'),
56
-        name: 'Room',
56
+        name: 'room',
57 57
         // redirect: '/round/index/gambleMember/index',
58 58
         meta: {
59 59
           title: '房間管理',
@@ -62,7 +62,7 @@ export const constantRouterMap = [
62 62
         },
63 63
         children: [
64 64
           {
65
-            path: 'index',
65
+            path: '/room/index/gambleMember/index',
66 66
             name: 'GambleMember',
67 67
             component: _import('room/gambleMember/index'),
68 68
             hidden: true,
@@ -72,7 +72,7 @@ export const constantRouterMap = [
72 72
             },
73 73
             children: [
74 74
               {
75
-                path: '/round/index/gambleMember/index/gameHistory',
75
+                path: '/room/index/gambleMember/index/gameHistory',
76 76
                 name: 'gameHistory',
77 77
                 component: _import('room/gameHistory/index'),
78 78
                 hidden: true,
@@ -82,7 +82,7 @@ export const constantRouterMap = [
82 82
                 }
83 83
               },
84 84
               {
85
-                path: '/round/index/gambleMember/index/chipsHistory',
85
+                path: '/room/index/gambleMember/index/chipsHistory',
86 86
                 name: 'chipsHistory',
87 87
                 component: _import('room/chipsHistory/index'),
88 88
                 hidden: true,

+ 29 - 2
src/store/modules/breadcrumb.js

@@ -1,10 +1,37 @@
1
+// TODO refactor better state mangement
1 2
 const breadcrumb = {
2 3
   state: {
3
-    visible: true
4
+    visible: {
5
+      firstLayer: true,
6
+      secondLayer: false,
7
+      thridLayer: false
8
+    }
4 9
   },
5 10
   mutations: {
6 11
     SET_VISIBLE: (state, visible) => {
7
-      state.visible = visible
12
+      switch (visible) {
13
+        case 1:
14
+          state.visible = {
15
+            firstLayer: true,
16
+            secondLayer: false,
17
+            thridLayer: false
18
+          }
19
+          break
20
+        case 2:
21
+          state.visible = {
22
+            firstLayer: false,
23
+            secondLayer: true,
24
+            thridLayer: false
25
+          }
26
+          break
27
+        case 3:
28
+          state.visible = {
29
+            firstLayer: false,
30
+            secondLayer: false,
31
+            thridLayer: true
32
+          }
33
+          break
34
+      }
8 35
     }
9 36
   },
10 37
   actions: {

+ 2 - 2
src/views/gambleGameBucket/detail/index.vue

@@ -173,7 +173,7 @@ export default {
173 173
         this.roundOptions.push({ label: `第 ${i} 關`, key: i })
174 174
       }
175 175
     })
176
-    this.SetVisible(false)
176
+    this.SetVisible(2)
177 177
     this.getList()
178 178
     fetchList({ page: 1, limit: 9999999999, chipsSort: 'DESC' }).then(response => {
179 179
       const { rows } = response.data
@@ -350,7 +350,7 @@ export default {
350 350
     }
351 351
   },
352 352
   destroyed() {
353
-    this.SetVisible(true)
353
+    this.SetVisible(1)
354 354
   }
355 355
 }
356 356
 </script>

+ 3 - 3
src/views/gambleGameBucket/index.vue

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
 <div class="app-container calendar-list-container">
3
-  <div class="app-container" v-show="visible">
3
+  <div class="app-container" v-show="visible.firstLayer">
4 4
     <div class="app-container">
5 5
       <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="莊家" v-model="listQuery.bookie">
6 6
       </el-input>
@@ -124,7 +124,7 @@ export default {
124 124
   },
125 125
   created() {
126 126
     this.getList()
127
-    this.SetVisible(true)
127
+    this.SetVisible(1)
128 128
   },
129 129
   computed: {
130 130
     ...mapGetters([
@@ -148,7 +148,7 @@ export default {
148 148
       fetchGameBid(row).then(response => {
149 149
         this.temp.bidChips = response.data
150 150
       })
151
-      this.SetVisible(false)
151
+      this.SetVisible(2)
152 152
       this.bucket = this.temp
153 153
       // fetchMemberRecords(row).then(response => {
154 154
       //   console.log(response.data)

+ 25 - 6
src/views/room/chipsHistory/index.vue

@@ -1,6 +1,6 @@
1 1
 <template>
2
-  <div class="app-container">
3
-    <div class="app-container">
2
+  <div   class="app-container">
3
+    <div v-show="visible.thirdLayer" class="app-container">
4 4
         <div class="block">
5 5
             <!-- <span class="demonstration">時間篩選</span> -->
6 6
             <el-date-picker
@@ -22,7 +22,12 @@
22 22
             {{scope.row.admin}}
23 23
           </template>
24 24
         </el-table-column>
25
-        <el-table-column label="上下分" align="center">
25
+        <el-table-column label="操作" align="center">
26
+          <template slot-scope="scope">
27
+            {{typeName(scope.row.type)}}
28
+          </template>
29
+        </el-table-column>
30
+        <el-table-column label="點數" align="center">
26 31
           <template slot-scope="scope">
27 32
             <span :style="moneyColor(scope.row.chips)">{{scope.row.chips}}</span>
28 33
           </template>
@@ -51,10 +56,11 @@
51 56
 
52 57
 <script>
53 58
 
54
-import { mapActions } from 'vuex'
59
+import { mapActions, mapGetters } from 'vuex'
55 60
 import { fetchChipsHistory } from '@/api/gambleMember'
56 61
 import waves from '@/directive/waves' // 水波纹指令
57 62
 import moment from 'moment-timezone'
63
+import config from '../../../../config' 
58 64
 
59 65
 export default {
60 66
   directives: {
@@ -121,10 +127,15 @@ export default {
121 127
     }
122 128
   },
123 129
   created() {
124
-    this.SetVisible(false)
130
+    this.SetVisible(3)
125 131
     this.getList()
126 132
   },
127 133
   props: ['member'],
134
+  computed: {
135
+    ...mapGetters([
136
+      'visible'
137
+    ])
138
+  },
128 139
   methods: {
129 140
     ...mapActions([
130 141
       'SetVisible'
@@ -161,10 +172,18 @@ export default {
161 172
     },
162 173
     moneyColor(money) {
163 174
       return money >= 0 ? { color: '#67C23A' } : { color: '#FA5555' }
175
+    },
176
+    typeName(type) {
177
+      if(type === config.const.GambleMemberChipsLog.type.deposit) {
178
+        return `上 / 下 分`
179
+      }
180
+      if(type === config.const.GambleMemberChipsLog.type.reward) {
181
+        return `獎勵 / 懲罰`
182
+      }
164 183
     }
165 184
   },
166 185
   destroyed() {
167
-    this.SetVisible(true)
186
+    this.SetVisible(2)
168 187
   }
169 188
 }
170 189
 </script>

+ 11 - 7
src/views/room/gambleMember/index.vue

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
 <div class="app-container calendar-list-container">
3
-  <div  v-show="visible">
3
+  <div  v-show="visible.secondLayer">
4 4
     <div class="app-container">
5 5
       <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="名稱" v-model="listQuery.name">
6 6
       </el-input>
@@ -35,10 +35,10 @@
35 35
       <el-table-column align="center" label="操作" width="350">
36 36
         <template slot-scope="scope">
37 37
             <el-button type="primary" size="mini" icon="el-icon-edit" @click="handleDeposit(scope.row)">上下分</el-button>
38
-            <router-link to="/gambleMember/index/chipsHistory">
38
+            <router-link to="/room/index/gambleMember/index/chipsHistory">
39 39
               <el-button type="primary" size="mini" icon="el-icon-tickets" @click="handleLog(scope.row)">上下分紀錄</el-button>            
40 40
             </router-link>
41
-            <router-link to="/gambleMember/index/gameHistory">
41
+            <router-link to="/room/index/gambleMember/index/gameHistory">
42 42
               <el-button type="primary" size="mini" icon="el-icon-tickets" @click="handlePage(scope.row)">歷史查詢</el-button>
43 43
             </router-link>       
44 44
         </template>
@@ -51,7 +51,7 @@
51 51
       </el-pagination>
52 52
     </div>
53 53
 
54
-    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
54
+    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" center>
55 55
       <el-form :rules="rules" ref="dataForm" :model="temp" label-position="left" label-width="100px" style='width: 400px; margin-left:50px;'>
56 56
         <el-form-item v-if="dialogStatus=='deposit'" label="ID" prop="id">
57 57
           <el-input v-model="temp.id" :disabled="true"></el-input>
@@ -83,6 +83,7 @@
83 83
 <script>
84 84
 
85 85
 import { mapGetters, mapActions } from 'vuex'
86
+// TODO 需更改抓取此房間人員
86 87
 import { fetchList, updateChips, createGambleMember } from '@/api/gambleMember'
87 88
 import waves from '@/directive/waves' // 水波纹指令
88 89
 
@@ -125,9 +126,12 @@ export default {
125 126
     }
126 127
   },
127 128
   created() {
128
-    this.SetVisible(true)
129
+    this.SetVisible(2)
129 130
     this.getList()
130 131
   },
132
+  destroyed() {
133
+    this.SetVisible(1)
134
+  },
131 135
   computed: {
132 136
     ...mapGetters([
133 137
       'visible'
@@ -211,12 +215,12 @@ export default {
211 215
     },
212 216
     handlePage(row) {
213 217
       const temp = Object.assign({}, row) // copy obj
214
-      this.SetVisible(false)
218
+      this.SetVisible(3)
215 219
       this.member = temp
216 220
     },
217 221
     handleLog(row) {
218 222
       const temp = Object.assign({}, row) // copy obj
219
-      this.SetVisible(false)
223
+      this.SetVisible(3)
220 224
       this.member = temp
221 225
     },
222 226
     handleFilter() {

+ 10 - 5
src/views/room/gameHistory/index.vue

@@ -1,6 +1,6 @@
1 1
 <template>
2
-  <div class="app-container">
3
-    <div class="app-container">
2
+  <div  class="app-container">
3
+    <div v-show="visible.thirdLayer" class="app-container">
4 4
         <div class="block">
5 5
             <!-- <span class="demonstration">時間篩選</span> -->
6 6
             <el-date-picker
@@ -91,7 +91,7 @@
91 91
 
92 92
 <script>
93 93
 
94
-import { mapActions } from 'vuex'
94
+import { mapActions, mapGetters } from 'vuex'
95 95
 import { fetchGameHistory, fetchPersonGameDetail } from '@/api/gambleMember'
96 96
 import waves from '@/directive/waves' // 水波纹指令
97 97
 import moment from 'moment-timezone'
@@ -161,9 +161,14 @@ export default {
161 161
     }
162 162
   },
163 163
   created() {
164
-    this.SetVisible(false)
164
+    this.SetVisible(3)
165 165
     this.getList()
166 166
   },
167
+  computed: {
168
+    ...mapGetters([
169
+      'visible'
170
+    ])
171
+  },
167 172
   props: ['member'],
168 173
   methods: {
169 174
     ...mapActions([
@@ -234,7 +239,7 @@ export default {
234 239
     }
235 240
   },
236 241
   destroyed() {
237
-    this.SetVisible(true)
242
+    this.SetVisible(2)
238 243
   }
239 244
 }
240 245
 </script>

+ 20 - 134
src/views/room/index.vue

@@ -1,18 +1,10 @@
1 1
 <!-- TODO select -->
2 2
 <template>
3 3
 <div class="app-container calendar-list-container">
4
-  <div  v-show="visible">
4
+  <div  v-show="visible.firstLayer">
5 5
     <div class="app-container">
6
-      <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="名" v-model="listQuery.name">
6
+      <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="房間名" v-model="listQuery.name">
7 7
       </el-input>
8
-      <el-select clearable @change='handleFilter' style="width: 120px" class="filter-item" v-model="listQuery.chipsSort" placeholder="點數">
9
-        <el-option v-for="item in chipsSortOptions" :key="item.label" :label="item.label" :value="item.key">
10
-        </el-option>
11
-      </el-select>
12
-      <el-select clearable @change='handleFilter' style="width: 120px" class="filter-item" v-model="listQuery.updatedSort" placeholder="更新時間">
13
-        <el-option v-for="item in updatedSortOptions" :key="item.label" :label="item.label" :value="item.key">
14
-        </el-option>
15
-      </el-select>
16 8
       <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">搜尋</el-button>
17 9
       <el-button class="filter-item" @click="handleCreate" type="primary" icon="el-icon-edit">創建</el-button>
18 10
     </div>
@@ -23,24 +15,20 @@
23 15
           {{scope.row.id}}
24 16
         </template>
25 17
       </el-table-column>
26
-      <el-table-column label="名稱" align="center">
18
+      <el-table-column label="房間" align="center">
27 19
         <template slot-scope="scope">
28 20
           {{scope.row.name}}
29 21
         </template>
30 22
       </el-table-column>
31
-      <el-table-column label="點數" align="center">
23
+      <el-table-column label="時間" align="center">
32 24
         <template slot-scope="scope">
33
-          <span>{{scope.row.chips}}</span>
25
+          <span>{{moment(scope.row.createdAt)}}</span>
34 26
         </template>
35 27
       </el-table-column>
36 28
       <el-table-column align="center" label="操作" width="350">
37 29
         <template slot-scope="scope">
38
-            <el-button type="primary" size="mini" icon="el-icon-edit" @click="handleDeposit(scope.row)">上下分</el-button>
39
-            <router-link to="/gambleMember/index/chipsHistory">
40
-              <el-button type="primary" size="mini" icon="el-icon-tickets" @click="handleLog(scope.row)">上下分紀錄</el-button>            
41
-            </router-link>
42
-            <router-link to="/gambleMember/index/gameHistory">
43
-              <el-button type="primary" size="mini" icon="el-icon-tickets" @click="handlePage(scope.row)">歷史查詢</el-button>
30
+            <router-link to="/room/index/gambleMember/index">
31
+              <el-button type="primary" size="mini" icon="el-icon-tickets" @click="handlePage(scope.row)">會員管理</el-button>
44 32
             </router-link>       
45 33
         </template>
46 34
       </el-table-column>
@@ -52,30 +40,6 @@
52 40
       </el-pagination>
53 41
     </div>
54 42
 
55
-    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
56
-      <el-form :rules="rules" ref="dataForm" :model="temp" label-position="left" label-width="100px" style='width: 400px; margin-left:50px;'>
57
-        <el-form-item v-if="dialogStatus=='deposit'" label="ID" prop="id">
58
-          <el-input v-model="temp.id" :disabled="true"></el-input>
59
-        </el-form-item>
60
-        <el-form-item label="名稱" prop="name">
61
-          <el-input v-if="dialogStatus=='deposit'" v-model="temp.name" :disabled="true"></el-input>
62
-          <el-input v-if="dialogStatus=='create'" v-model="temp.name"></el-input>          
63
-        </el-form-item>
64
-        <el-form-item label="點數" prop="chips">
65
-          <el-input v-if="dialogStatus=='deposit'" v-model="temp.chips" :disabled="true"></el-input>
66
-          <el-input v-if="dialogStatus=='create'" v-model="temp.chips"></el-input>          
67
-        </el-form-item>
68
-        <el-form-item v-if="dialogStatus=='deposit'" label="上下分" prop="depositChips">
69
-          <el-input placeholder="請輸入上下分" v-model="temp.depositChips">
70
-          </el-input>
71
-        </el-form-item>
72
-      </el-form>
73
-      <div slot="footer" class="dialog-footer">
74
-        <el-button @click="dialogFormVisible = false">取 消</el-button>
75
-        <el-button v-if="dialogStatus=='create'" type="primary" @click="createData">確 定</el-button>
76
-        <el-button v-if="dialogStatus=='deposit'" type="primary" @click="depositChips">確 定</el-button>
77
-      </div>
78
-    </el-dialog>
79 43
   </div>
80 44
     <router-view :member="member"></router-view>
81 45
   </div>
@@ -84,8 +48,9 @@
84 48
 <script>
85 49
 
86 50
 import { mapGetters, mapActions } from 'vuex'
87
-import { fetchList, updateChips, createGambleMember } from '@/api/gambleMember'
51
+import { fetchWechatRooms } from '@/api/room'
88 52
 import waves from '@/directive/waves' // 水波纹指令
53
+import moment from 'moment-timezone'
89 54
 
90 55
 export default {
91 56
   name: 'gambleMemberTable',
@@ -100,33 +65,17 @@ export default {
100 65
       listQuery: {
101 66
         page: 1,
102 67
         limit: 20,
103
-        chipsSort: '',
104
-        updatedSort: ''
105 68
       },
106 69
       temp: {
107 70
         id: '',
108 71
         name: '',
109 72
         chips: '',
110
-        depositChips: ''
111
-      },
112
-      dialogFormVisible: false,
113
-      dialogStatus: '',
114
-      textMap: {
115
-        deposit: '儲值',
116
-        create: '新增'
117 73
       },
118 74
       member: {},
119
-      chipsSortOptions: [{ label: '多 -> 少', key: 'DESC' }, { label: '少 -> 多', key: 'ASC' }],
120
-      updatedSortOptions: [{ label: '新 -> 舊', key: 'DESC' }, { label: '舊 -> 新', key: 'ASC' }],
121
-      rules: {
122
-        depositChips: [{ pattern: /^-?\d+$/, required: true, message: '請輸入整數', trigger: 'change' }],
123
-        chips: [{ pattern: /^(0|[1-9][0-9]*)$/, required: true, message: '請輸入整數', trigger: 'change' }],
124
-        name: [{ type: 'string', required: true, message: '必填', trigger: 'change' }]
125
-      }
126 75
     }
127 76
   },
128 77
   created() {
129
-    this.SetVisible(true)
78
+    this.SetVisible(1)
130 79
     this.getList()
131 80
   },
132 81
   computed: {
@@ -140,85 +89,19 @@ export default {
140 89
     ]),
141 90
     getList() {
142 91
       this.listLoading = true
143
-      fetchList(this.listQuery).then(response => {
144
-        this.list = response.data.rows
145
-        this.total = response.data.count
92
+      fetchWechatRooms(this.listQuery).then(response => {
93
+        this.list = response.data
94
+        this.total = response.data.length
146 95
         this.listLoading = false
147 96
       })
148 97
     },
149
-    handleDeposit(row) {
150
-      this.temp = Object.assign({}, row) // copy obj
151
-      this.dialogStatus = 'deposit'
152
-      this.dialogFormVisible = true
153
-      this.$nextTick(() => {
154
-        this.$refs['dataForm'].clearValidate()
155
-      })
156
-    },
157
-    depositChips() {
158
-      this.$refs['dataForm'].validate((valid) => {
159
-        if (valid) {
160
-          const tempData = Object.assign({}, this.temp)
161
-          updateChips(tempData).then(() => {
162
-            for (const v of this.list) {
163
-              if (v.id === this.temp.id) {
164
-                const index = this.list.indexOf(v)
165
-                this.list.splice(index, 1, this.temp)
166
-                break
167
-              }
168
-            }
169
-            this.dialogFormVisible = false
170
-            this.$notify({
171
-              title: '成功',
172
-              message: '操作成功',
173
-              type: 'success',
174
-              duration: 2000
175
-            })
176
-            this.getList()
177
-          })
178
-        }
179
-      })
180
-    },
181
-    resetTemp() {
182
-      this.temp = {
183
-        id: undefined,
184
-        name: '',
185
-        chips: '',
186
-        depositChips: ''
187
-      }
188
-    },
189
-    handleCreate() {
190
-      this.resetTemp()
191
-      this.dialogStatus = 'create'
192
-      this.dialogFormVisible = true
193
-      this.$nextTick(() => {
194
-        this.$refs['dataForm'].clearValidate()
195
-      })
196
-    },
197
-    createData() {
198
-      this.$refs['dataForm'].validate((valid) => {
199
-        if (valid) {
200
-          createGambleMember(this.temp).then((response) => {
201
-            this.list.unshift(response.data)
202
-            this.dialogFormVisible = false
203
-            this.$notify({
204
-              title: '成功',
205
-              message: '創建成功',
206
-              type: 'success',
207
-              duration: 2000
208
-            })
209
-          })
210
-        }
211
-      })
212
-    },
213 98
     handlePage(row) {
214 99
       const temp = Object.assign({}, row) // copy obj
215
-      this.SetVisible(false)
100
+      this.SetVisible(2)
216 101
       this.member = temp
217 102
     },
218
-    handleLog(row) {
219
-      const temp = Object.assign({}, row) // copy obj
220
-      this.SetVisible(false)
221
-      this.member = temp
103
+    handleCreate() {
104
+      //TODO 了解wechat 的 room 關聯
222 105
     },
223 106
     handleFilter() {
224 107
       this.listQuery.page = 1
@@ -231,7 +114,10 @@ export default {
231 114
     handleCurrentChange(val) {
232 115
       this.listQuery.page = val
233 116
       this.getList()
234
-    }
117
+    },
118
+    moment(time) {
119
+      return moment(time).tz('Asia/Taipei').format('YYYY-MM-DD HH:mm:ss')
120
+    },
235 121
   }
236 122
 }
237 123
 </script>