list.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. <template>
  2. <div class="app-container">
  3. <el-form ref="searchArr" :inline="true" :model="search" class="demo-form-inline" size="mini">
  4. <el-form-item label="用戶名">
  5. <el-input v-model="search.nickname" clearable />
  6. </el-form-item>
  7. <el-form-item label="狀態">
  8. <el-select v-model="search.status" clearable>
  9. <el-option :value="0" label="waiting" />
  10. <el-option :value="1" label="processing" />
  11. <el-option :value="2" label="end" />
  12. </el-select>
  13. </el-form-item>
  14. <el-form-item label="開始日期">
  15. <el-date-picker
  16. v-model="search.scaleStart"
  17. type="date"
  18. value-format="yyyy-MM-dd"
  19. placeholder="选择日期">
  20. </el-date-picker>
  21. </el-form-item>
  22. <el-form-item label="遊戲次數">
  23. <el-input v-model="search.gameCount" clearable />
  24. </el-form-item>
  25. <el-form-item label="版本">
  26. <el-input v-model="search.versions" clearable />
  27. </el-form-item>
  28. <el-form-item>
  29. <el-button type="primary" size="small" @click="nextPage()">搜索</el-button>
  30. </el-form-item>
  31. <el-form-item>
  32. <router-link to="/user/add">
  33. <el-button type="primary" size="small">添加</el-button>
  34. </router-link>
  35. </el-form-item>
  36. <el-form-item>
  37. <el-button type="primary" size="small" @click="download()">下載</el-button>
  38. </el-form-item>
  39. <el-form-item>
  40. <el-button type="primary" size="small" @click="back()">返回</el-button>
  41. </el-form-item>
  42. </el-form>
  43. <el-table
  44. v-loading="listLoading"
  45. :data="list"
  46. element-loading-text="Loading"
  47. border
  48. fit
  49. highlight-current-row
  50. @sort-change="sortChange"
  51. >
  52. <el-table-column align="center" label="ID" width="55">
  53. <template slot-scope="scope">
  54. {{ scope.row.id }}
  55. </template>
  56. </el-table-column>
  57. <el-table-column sortable prop="nickname" align="center" label="用戶名">
  58. <template slot-scope="scope">
  59. {{ scope.row.nickname }}
  60. </template>
  61. </el-table-column>
  62. <el-table-column align="center" label="狀態">
  63. <template slot-scope="scope">
  64. <div v-if="scope.row.status===0" class="green">waiting</div>
  65. <div v-if="scope.row.status===1" class="green">processing</div>
  66. <div v-if="scope.row.status===2" class="green">end</div>
  67. </template>
  68. </el-table-column>
  69. <!-- <el-table-column align="center" label="性别">-->
  70. <!-- <template slot-scope="scope">-->
  71. <!-- <div v-if="scope.row.gender===1" class="green">男</div>-->
  72. <!-- <div v-if="scope.row.gender===2" class="green">女</div>-->
  73. <!-- </template>-->
  74. <!-- </el-table-column>-->
  75. <el-table-column sortable="custom" prop="createTime" align="center" label="創建日期">
  76. <template slot-scope="scope">
  77. {{ scope.row.createTime.substring(0,10) }}
  78. </template>
  79. </el-table-column>
  80. <el-table-column align="center" sortable label="開始日期" prop="scaleStart">
  81. <template slot-scope="scope">
  82. {{ scope.row.scaleStart.substring(0, 10) }}
  83. </template>
  84. </el-table-column>
  85. <el-table-column align="center" sortable prop="scaleEnd" label="結束日期">
  86. <template slot-scope="scope">
  87. {{ scope.row.scaleEnd.substring(0,10) }}
  88. </template>
  89. </el-table-column>
  90. <el-table-column align="center" label="量表提示時間">
  91. <template slot-scope="scope">
  92. {{ scope.row.scaleTime }}
  93. </template>
  94. </el-table-column>
  95. <el-table-column align="center" sortable label="遊戲數字顯示的時長" prop="showTime">
  96. <template slot-scope="scope">
  97. {{ scope.row.showTime }}
  98. </template>
  99. </el-table-column>
  100. <el-table-column align="center" sortable label="數字交換間隔" prop="hideTime">
  101. <template slot-scope="scope">
  102. {{ scope.row.hideTime }}
  103. </template>
  104. </el-table-column>
  105. <el-table-column align="center" label="正確數字出現次數" sortable prop="correct">
  106. <template slot-scope="scope">
  107. {{ scope.row.correct }}
  108. </template>
  109. </el-table-column>
  110. <el-table-column align="center" label="隨機數字出現次數">
  111. <template slot-scope="scope">
  112. {{ scope.row.supporting }}
  113. </template>
  114. </el-table-column>
  115. <el-table-column align="center" label="遊戲練習結束進入測試的時長" sortable prop="practice">
  116. <template slot-scope="scope">
  117. {{ scope.row.practice }}
  118. </template>
  119. </el-table-column>
  120. <el-table-column align="center" label="遊戲前練習正確數字出現次數" sortable prop="practice">
  121. <template slot-scope="scope">
  122. {{ scope.row.exerciseRight }}
  123. </template>
  124. </el-table-column>
  125. <el-table-column align="center" label="遊戲前練習隨機數字出現次數" sortable prop="practice">
  126. <template slot-scope="scope">
  127. {{ scope.row.exercise }}
  128. </template>
  129. </el-table-column>
  130. <el-table-column align="center" label="每天遊戲次數" sortable prop="gameCount">
  131. <template slot-scope="scope">
  132. {{ scope.row.gameCount }}
  133. </template>
  134. </el-table-column>
  135. <el-table-column align="center" label="每天遊戲版本">
  136. <template slot-scope="scope">
  137. {{ scope.row.version }}
  138. </template>
  139. </el-table-column>
  140. <el-table-column align="center" label="登出">
  141. <template slot-scope="scope">
  142. <div v-if="scope.row.loginOut===0" class="green">yes</div>
  143. <div v-if="scope.row.loginOut===1" class="green">no</div>
  144. </template>
  145. </el-table-column>
  146. <el-table-column align="center" label="操作" width="300">
  147. <template slot-scope="{row}">
  148. <el-button v-if="checkPermission(['admin'])" type="warning" size="mini" @click="openeditor(row,true,row.enable)">
  149. 編輯
  150. </el-button>
  151. <el-button v-if="checkPermission(['admin'])" size="mini" @click="openeditor(row,false,row.enable)">
  152. 查看
  153. </el-button>
  154. <el-button v-if="checkPermission(['admin'])" size="mini" @click="openPlayTimeDetail(row.id)">
  155. 查看推送時間
  156. </el-button>
  157. <el-button type="danger" v-if="checkPermission(['admin'])" size="mini" @click="opendel(row)">
  158. 刪除
  159. </el-button>
  160. </template>
  161. </el-table-column>
  162. </el-table>
  163. <pagination
  164. :total="page.total"
  165. :page.sync="page.pageNum"
  166. :limit.sync="page.size"
  167. @pagination="nextPage"
  168. />
  169. <el-dialog title="編輯用戶" :visible.sync="customerVisible" width="300">
  170. <el-form ref="loginForm" :model="rateForm" label-width="160px" class="customer-form" size="mini">
  171. <el-form-item label="用戶名字" prop="nickname">
  172. <el-input v-model="rateForm.nickname" />
  173. </el-form-item>
  174. <el-form-item label="登錄密碼" prop="password">
  175. <el-input v-model="rateForm.password" />
  176. </el-form-item>
  177. <el-form-item label="禁止登出" prop="enable">
  178. <el-switch
  179. v-model="rateForm.loginOut"
  180. active-color="#13ce66"
  181. :active-value="1"
  182. :inactive-value="0"
  183. />
  184. </el-form-item>
  185. <!-- <el-form-item label="性別" prop="password">-->
  186. <!-- <el-radio-group v-model="rateForm.gender">-->
  187. <!-- <el-radio :label="1">男</el-radio>-->
  188. <!-- <el-radio :label="2">女</el-radio>-->
  189. <!-- </el-radio-group>-->
  190. <!-- </el-form-item>-->
  191. <el-form-item label="時間">
  192. <el-date-picker
  193. v-model="rateForm.period"
  194. type="daterange"
  195. range-separator="至"
  196. start-placeholder="開始日期"
  197. end-placeholder="結束日期"
  198. value-format="yyyy-MM-dd HH:mm:ss"
  199. @input="choseDate"
  200. />
  201. </el-form-item>
  202. <el-form-item label="量表提示時間">
  203. <el-time-picker
  204. v-model="rateForm.scaleTime"
  205. placeholder="量表提示時間"
  206. value-format="HH:mm:ss"
  207. />
  208. </el-form-item>
  209. <el-form-item label="數字顯示時長" prop="password">
  210. <el-input v-model="rateForm.showTime">
  211. <template slot="append">ms</template>
  212. </el-input>
  213. </el-form-item>
  214. <el-form-item label="數字交換間隔" prop="password">
  215. <el-input v-model="rateForm.hideTime">
  216. <template slot="append">ms</template>
  217. </el-input>
  218. </el-form-item>
  219. <el-form-item label="正確數字出現次數" prop="password">
  220. <el-input v-model="rateForm.correct" />
  221. </el-form-item>
  222. <el-form-item label="隨機數字出現次數" prop="password">
  223. <el-input v-model="rateForm.supporting" />
  224. </el-form-item>
  225. <el-form-item label="遊戲練習結束進入測試的時長" prop="practice">
  226. <el-input v-model="rateForm.practice">
  227. <template slot="append">ms</template>
  228. </el-input>
  229. </el-form-item>
  230. <el-form-item label="遊戲前練習正確數字出現次數" prop="practice">
  231. <el-input v-model="rateForm.exerciseRight" type="number" />
  232. </el-form-item>
  233. <el-form-item label="遊戲前練習隨機數字出現次數" prop="practice">
  234. <el-input v-model="rateForm.exercise" type="number" />
  235. </el-form-item>
  236. <el-form-item label="游戏版本" prop="practice">
  237. <el-checkbox-group v-model="rateForm.versions">
  238. <el-checkbox label="A" style="margin-right: 10px" />
  239. <el-checkbox label="B" style="margin-right: 10px" />
  240. <el-checkbox label="C" style="margin-right: 10px" />
  241. </el-checkbox-group>
  242. </el-form-item>
  243. <el-form-item label="遊戲時間段" style="width: 800px">
  244. <el-row v-for="(items, index) in gameConfigs" :key="index" style="display: flex;align-items: center">
  245. <div />
  246. <el-time-select
  247. v-model="items.startTime"
  248. size="mini"
  249. placeholder="遊戲時間段"
  250. style="width: 150px"
  251. :picker-options="{
  252. start: '00:00',
  253. end: '23:59',
  254. minTime: index > 0 ? gameConfigs[index-1].endTime : null,
  255. }"
  256. />
  257. <el-time-select
  258. v-model="items.endTime"
  259. size="mini"
  260. placeholder="遊戲時間段"
  261. style="width: 150px"
  262. :picker-options="{
  263. step: '00:15:00',
  264. minTime: items.startTime,
  265. start: '00:00',
  266. end: '23:59'
  267. }"
  268. />
  269. <div>
  270. <i v-if="editor" class="el-icon-circle-plus" @click="addConfig()" />
  271. <i v-if="gameConfigs.length != 1&&editor" class="el-icon-remove a_style" @click="deleteConfig(index)" />
  272. </div>
  273. </el-row>
  274. </el-form-item>
  275. <el-form-item label="">
  276. <el-button v-if="editor" size="small" type="primary" @click="updateUser">修改</el-button>
  277. </el-form-item>
  278. </el-form>
  279. </el-dialog>
  280. <el-dialog title="遊戲時間詳情" :visible.sync="showPlayTimeDetail" width="40%" center>
  281. <el-table :data="playTimeDetail" size="mini">
  282. <el-table-column align="center" label="時間">
  283. <template slot-scope="scope">
  284. {{ scope.row.gameTime }}
  285. </template>
  286. </el-table-column>
  287. <el-table-column align="center" label="類型">
  288. <template slot-scope="scope">
  289. {{ scope.row.type === 0 ? '遊戲' : '量表' }}
  290. </template>
  291. </el-table-column>
  292. </el-table>
  293. </el-dialog>
  294. </div>
  295. </template>
  296. <script>
  297. import Pagination from '@/components/Pagination'
  298. import { getuserList, deluser, updateUser, download } from '@/api/user'
  299. import checkPermission from '@/utils/permission'
  300. import { Message } from 'element-ui'
  301. import GameApi from '@/api/game'
  302. export default {
  303. name: 'List',
  304. components: { Pagination },
  305. data() {
  306. return {
  307. list: [],
  308. search: {},
  309. order: {},
  310. listLoading: false,
  311. customerVisible: false,
  312. page: { total: 0, size: 0, pageNum: 0 },
  313. rateForm: {
  314. period: []
  315. },
  316. userConfig: {},
  317. gameConfigs: [{}],
  318. editor: false,
  319. playTimeDetail: [],
  320. showPlayTimeDetail: false
  321. }
  322. },
  323. created() {
  324. this.nextPage()
  325. },
  326. mounted() {
  327. },
  328. methods: {
  329. checkPermission,
  330. openeditor(r, t, e) {
  331. this.editor = t
  332. var thiz = this
  333. GameApi.gameConfig({ uid: r.id }).then(response => {
  334. if (response.data.length > 0) {
  335. this.gameConfigs = response.data
  336. } else {
  337. this.gameConfigs = []
  338. }
  339. Object.keys(r).forEach(function(key) {
  340. thiz.$set(thiz.rateForm, key, r[key])
  341. })
  342. if (this.rateForm.version != null) {
  343. this.$set(this.rateForm, 'versions', this.rateForm.version.split(','))
  344. } else {
  345. this.$set(this.rateForm, 'versions', [])
  346. }
  347. this.$set(this.rateForm, 'period', [r.scaleStart, r.scaleEnd])
  348. this.customerVisible = true
  349. console.log(this.rateForm)
  350. })
  351. },
  352. opendel(r) {
  353. this.$confirm('此操作将永久 ' + r.nickname + ', 是否继续?', '提示', {
  354. confirmButtonText: '确定',
  355. cancelButtonText: '取消',
  356. type: 'warning'
  357. }).then(() => {
  358. this.delUser(r)
  359. }).catch(() => {
  360. this.$message({
  361. type: 'info',
  362. message: '已取消删除'
  363. })
  364. })
  365. },
  366. openPlayTimeDetail(uid) {
  367. GameApi.playTimeDetail(uid).then(response => {
  368. if (response.code === 200) {
  369. this.playTimeDetail = response.data
  370. this.showPlayTimeDetail = true
  371. }
  372. })
  373. },
  374. delUser(r) {
  375. deluser({ id: r.userId }).then(response => {
  376. Message({
  377. message: '刪除成功',
  378. type: 'success',
  379. duration: 2 * 1000
  380. })
  381. if (response.code === 200) {
  382. this.nextPage()
  383. }
  384. })
  385. },
  386. choseDate(e) {
  387. this.$nextTick(() => {
  388. this.rateForm.period = null
  389. this.$set(this.rateForm, 'period', [e[0], e[1]])
  390. this.rateForm.scaleStart = this.rateForm.period[0]
  391. this.rateForm.scaleEnd = this.rateForm.period[1]
  392. })
  393. },
  394. updateUser() {
  395. this.rateForm.version = this.rateForm.versions.join(',')
  396. this.rateForm.configs = JSON.stringify(this.gameConfigs)
  397. updateUser(this.rateForm).then(response => {
  398. if (response.code === 200) {
  399. this.nextPage()
  400. this.customerVisible = false
  401. }
  402. })
  403. },
  404. nextPage() {
  405. this.listLoading = true
  406. getuserList({ page: this.page.pageNum, search: JSON.stringify(this.search), order: JSON.stringify(this.order) }).then(response => {
  407. this.list = response.data.list
  408. this.page.total = response.data.total
  409. setTimeout(() => {
  410. this.listLoading = false
  411. }, 1 * 1000)
  412. })
  413. },
  414. sortChange(column) {
  415. // console.log(column)
  416. this.order[column.prop] = column.order
  417. this.nextPage()
  418. },
  419. download() {
  420. download({ search: JSON.stringify(this.search), order: JSON.stringify(this.order) }).then(response => {
  421. const url = window.URL.createObjectURL(new Blob([response.data]))
  422. const link = document.createElement('a')
  423. link.style.display = 'none'
  424. link.href = url
  425. link.setAttribute('download', response.headers['filename'])
  426. document.body.appendChild(link)
  427. link.click()
  428. })
  429. },
  430. addConfig() {
  431. this.gameConfigs.push({ versions: [] })
  432. },
  433. deleteConfig(index) {
  434. this.gameConfigs.splice(index, 1)
  435. },
  436. back() {
  437. this.search = {}
  438. this.order = {}
  439. this.nextPage()
  440. }
  441. }
  442. }
  443. </script>
  444. <style scoped>
  445. .flex.vc {
  446. -moz-box-align: center;
  447. -webkit-box-align: center;
  448. -ms-flex-align: center;
  449. -webkit-align-items: center;
  450. align-items: center;
  451. }
  452. </style>