@sugarat/easypicker2-client 2.4.3 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/dist/assets/aria-bc8e8b0f.js +2 -0
  2. package/dist/assets/aria-bc8e8b0f.js.map +1 -0
  3. package/dist/assets/aria-legacy.af0825d3.js +2 -0
  4. package/dist/assets/data-analysis-3ce8c1c1.js +2 -0
  5. package/dist/assets/data-analysis-3ce8c1c1.js.map +1 -0
  6. package/dist/assets/data-analysis-legacy.985137a1.js +2 -0
  7. package/dist/assets/data-board-fc2c2ec1.js +2 -0
  8. package/dist/assets/data-board-fc2c2ec1.js.map +1 -0
  9. package/dist/assets/data-board-legacy.33116f7c.js +2 -0
  10. package/dist/assets/el-date-picker-b377a533.js +2 -0
  11. package/dist/assets/el-date-picker-b377a533.js.map +1 -0
  12. package/dist/assets/el-date-picker-cf2e83b6.css +1 -0
  13. package/dist/assets/el-date-picker-legacy.127f0787.js +2 -0
  14. package/dist/assets/el-dialog-25bd2fb8.css +1 -0
  15. package/dist/assets/el-dialog-5b7bce58.js +2 -0
  16. package/dist/assets/el-dialog-5b7bce58.js.map +1 -0
  17. package/dist/assets/el-dialog-legacy.e6ef2c86.js +2 -0
  18. package/dist/assets/el-dropdown-item-0c6ddabc.css +1 -0
  19. package/dist/assets/el-dropdown-item-e0275106.js +2 -0
  20. package/dist/assets/el-dropdown-item-e0275106.js.map +1 -0
  21. package/dist/assets/el-dropdown-item-legacy.4888d114.js +2 -0
  22. package/dist/assets/el-form-item-3aad794a.css +1 -0
  23. package/dist/assets/el-form-item-c0658f70.js +2 -0
  24. package/dist/assets/el-form-item-c0658f70.js.map +1 -0
  25. package/dist/assets/el-form-item-legacy.a8e8784e.js +2 -0
  26. package/dist/assets/el-loading-c8798044.js +2 -0
  27. package/dist/assets/el-loading-c8798044.js.map +1 -0
  28. package/dist/assets/el-loading-d0f2d079.css +1 -0
  29. package/dist/assets/el-loading-legacy.534bd799.js +2 -0
  30. package/dist/assets/el-pagination-bf7c736d.css +1 -0
  31. package/dist/assets/el-pagination-dabcccbb.js +2 -0
  32. package/dist/assets/el-pagination-dabcccbb.js.map +1 -0
  33. package/dist/assets/el-pagination-legacy.7d2ae10d.js +2 -0
  34. package/dist/assets/el-progress-54b274cd.js +2 -0
  35. package/dist/assets/el-progress-54b274cd.js.map +1 -0
  36. package/dist/assets/el-progress-63aabe3a.css +1 -0
  37. package/dist/assets/el-progress-legacy.07ca6502.js +2 -0
  38. package/dist/assets/el-select-6be23320.css +1 -0
  39. package/dist/assets/el-select-f81a7377.js +2 -0
  40. package/dist/assets/el-select-f81a7377.js.map +1 -0
  41. package/dist/assets/el-select-legacy.94fad7fa.js +2 -0
  42. package/dist/assets/el-switch-9eba6fd0.js +2 -0
  43. package/dist/assets/el-switch-9eba6fd0.js.map +1 -0
  44. package/dist/assets/el-switch-aeab2c6b.css +1 -0
  45. package/dist/assets/el-switch-legacy.490534be.js +2 -0
  46. package/dist/assets/el-tab-pane-4a1bb4c7.css +1 -0
  47. package/dist/assets/el-tab-pane-89bdd69b.js +2 -0
  48. package/dist/assets/el-tab-pane-89bdd69b.js.map +1 -0
  49. package/dist/assets/el-tab-pane-legacy.cfdbc441.js +2 -0
  50. package/dist/assets/el-table-column-6716308a.js +21 -0
  51. package/dist/assets/el-table-column-6716308a.js.map +1 -0
  52. package/dist/assets/el-table-column-6c2089f9.css +1 -0
  53. package/dist/assets/el-table-column-legacy.49685e5a.js +24 -0
  54. package/dist/assets/index-01e33329.css +1 -0
  55. package/dist/assets/index-0b0f29ec.js +2 -0
  56. package/dist/assets/index-0b0f29ec.js.map +1 -0
  57. package/dist/assets/index-17c6005d.css +1 -0
  58. package/dist/assets/index-20019c57.js +2 -0
  59. package/dist/assets/index-20019c57.js.map +1 -0
  60. package/dist/assets/index-247f2c67.css +1 -0
  61. package/dist/assets/index-248e88e2.js +2 -0
  62. package/dist/assets/index-248e88e2.js.map +1 -0
  63. package/dist/assets/index-3091894a.css +1 -0
  64. package/dist/assets/index-37e15bc6.css +1 -0
  65. package/dist/assets/index-39637d43.js +2 -0
  66. package/dist/assets/index-39637d43.js.map +1 -0
  67. package/dist/assets/index-3f82ab7a.css +1 -0
  68. package/dist/assets/index-4c81cf78.css +1 -0
  69. package/dist/assets/index-5099f123.js +2 -0
  70. package/dist/assets/index-5099f123.js.map +1 -0
  71. package/dist/assets/index-57513f17.css +1 -0
  72. package/dist/assets/index-76f31e30.css +1 -0
  73. package/dist/assets/index-76ff9b9b.css +1 -0
  74. package/dist/assets/index-8557974a.js +2 -0
  75. package/dist/assets/index-8557974a.js.map +1 -0
  76. package/dist/assets/index-85fcd87a.css +1 -0
  77. package/dist/assets/index-867d07e4.js +2 -0
  78. package/dist/assets/index-867d07e4.js.map +1 -0
  79. package/dist/assets/index-8f353d3b.js +2 -0
  80. package/dist/assets/index-8f353d3b.js.map +1 -0
  81. package/dist/assets/index-8f7abc30.js +2 -0
  82. package/dist/assets/index-8f7abc30.js.map +1 -0
  83. package/dist/assets/index-8fbd06a5.js +2 -0
  84. package/dist/assets/index-8fbd06a5.js.map +1 -0
  85. package/dist/assets/index-93c733b3.css +1 -0
  86. package/dist/assets/index-98b55468.css +1 -0
  87. package/dist/assets/index-9e6bd406.js +2 -0
  88. package/dist/assets/index-9e6bd406.js.map +1 -0
  89. package/dist/assets/index-a880597c.css +1 -0
  90. package/dist/assets/index-acdbf3b6.js +2 -0
  91. package/dist/assets/index-acdbf3b6.js.map +1 -0
  92. package/dist/assets/index-b3e58b02.js +2 -0
  93. package/dist/assets/index-b3e58b02.js.map +1 -0
  94. package/dist/assets/index-c13133c5.js +2 -0
  95. package/dist/assets/index-c13133c5.js.map +1 -0
  96. package/dist/assets/index-c1d6836c.js +2 -0
  97. package/dist/assets/index-c1d6836c.js.map +1 -0
  98. package/dist/assets/index-d26aeed5.css +1 -0
  99. package/dist/assets/index-d98be3e4.js +19 -0
  100. package/dist/assets/index-d98be3e4.js.map +1 -0
  101. package/dist/assets/index-d9db6cc1.js +2 -0
  102. package/dist/assets/index-d9db6cc1.js.map +1 -0
  103. package/dist/assets/index-da51da36.css +1 -0
  104. package/dist/assets/index-e0ef7135.js +2 -0
  105. package/dist/assets/index-e0ef7135.js.map +1 -0
  106. package/dist/assets/index-e7d8a83e.css +1 -0
  107. package/dist/assets/index-ebf625c9.js +2 -0
  108. package/dist/assets/index-ebf625c9.js.map +1 -0
  109. package/dist/assets/index-eda7d85a.js +2 -0
  110. package/dist/assets/index-eda7d85a.js.map +1 -0
  111. package/dist/assets/index-fdc557f8.js +2 -0
  112. package/dist/assets/index-fdc557f8.js.map +1 -0
  113. package/dist/assets/index-legacy.0c570346.js +2 -0
  114. package/dist/assets/index-legacy.24edddf9.js +2 -0
  115. package/dist/assets/index-legacy.31681402.js +2 -0
  116. package/dist/assets/index-legacy.3e6b32cf.js +2 -0
  117. package/dist/assets/index-legacy.4edc099d.js +2 -0
  118. package/dist/assets/index-legacy.614df679.js +2 -0
  119. package/dist/assets/index-legacy.6420d0ab.js +2 -0
  120. package/dist/assets/index-legacy.679e5ce1.js +2 -0
  121. package/dist/assets/index-legacy.7b42e0cb.js +2 -0
  122. package/dist/assets/index-legacy.7bafa2e6.js +2 -0
  123. package/dist/assets/index-legacy.7ff3d773.js +2 -0
  124. package/dist/assets/index-legacy.84e0eca9.js +2 -0
  125. package/dist/assets/index-legacy.9ca64f8c.js +2 -0
  126. package/dist/assets/index-legacy.a4371211.js +2 -0
  127. package/dist/assets/index-legacy.acb8b137.js +23 -0
  128. package/dist/assets/index-legacy.bc3790f6.js +2 -0
  129. package/dist/assets/index-legacy.d0e21cb1.js +2 -0
  130. package/dist/assets/index-legacy.daf56c8f.js +2 -0
  131. package/dist/assets/index-legacy.e12feae0.js +2 -0
  132. package/dist/assets/index-legacy.e7f8790c.js +2 -0
  133. package/dist/assets/index-legacy.f84efe08.js +2 -0
  134. package/dist/assets/isEqual-82bb65ad.js +2 -0
  135. package/dist/assets/isEqual-82bb65ad.js.map +1 -0
  136. package/dist/assets/isEqual-legacy.dbaa2a6e.js +2 -0
  137. package/dist/assets/other-8d7ba6a0.js +2 -0
  138. package/dist/assets/other-8d7ba6a0.js.map +1 -0
  139. package/dist/assets/other-legacy.39078796.js +2 -0
  140. package/dist/assets/polyfills-legacy.99e38685.js +4 -0
  141. package/dist/assets/refresh-f2c4c532.js +2 -0
  142. package/dist/assets/refresh-f2c4c532.js.map +1 -0
  143. package/dist/assets/refresh-legacy.0ee83ca1.js +2 -0
  144. package/dist/assets/tip-3d272885.js +2 -0
  145. package/dist/assets/tip-3d272885.js.map +1 -0
  146. package/dist/assets/tip-9cb18ee8.css +1 -0
  147. package/dist/assets/tip-legacy.dee89e85.js +2 -0
  148. package/dist/assets/validator-d4ea1237.js +2 -0
  149. package/dist/assets/validator-d4ea1237.js.map +1 -0
  150. package/dist/assets/validator-legacy.ecd1e5dd.js +2 -0
  151. package/{index.html → dist/index.html} +8 -1
  152. package/package.json +30 -19
  153. package/.env +0 -6
  154. package/.env.production +0 -3
  155. package/.env.test +0 -4
  156. package/.eslintignore +0 -0
  157. package/.eslintrc.json +0 -57
  158. package/.github/workflows/main.yml +0 -61
  159. package/.prettierrc.js +0 -9
  160. package/auto-imports.d.ts +0 -6
  161. package/components.d.ts +0 -56
  162. package/docker/ep_backup/easypicker2.sql +0 -214
  163. package/docker/ep_backup/mongodb/easypicker2/action.bson +0 -0
  164. package/docker/ep_backup/mongodb/easypicker2/action.metadata.json +0 -1
  165. package/docker/ep_backup/mongodb/easypicker2/log.bson +0 -0
  166. package/docker/ep_backup/mongodb/easypicker2/log.metadata.json +0 -1
  167. package/docker/ep_backup/user-config.json +0 -176
  168. package/docs/.env +0 -1
  169. package/docs/.env.production +0 -2
  170. package/docs/.vitepress/config.ts +0 -204
  171. package/docs/.vitepress/theme/bg.png +0 -0
  172. package/docs/.vitepress/theme/index.scss +0 -41
  173. package/docs/.vitepress/theme/index.ts +0 -5
  174. package/docs/author.md +0 -24
  175. package/docs/auto-imports.d.ts +0 -6
  176. package/docs/components.d.ts +0 -17
  177. package/docs/deploy/design/api.md +0 -3
  178. package/docs/deploy/design/db.md +0 -3
  179. package/docs/deploy/design/index.md +0 -3
  180. package/docs/deploy/design/shell.md +0 -9
  181. package/docs/deploy/faq.md +0 -86
  182. package/docs/deploy/index.md +0 -9
  183. package/docs/deploy/local.md +0 -275
  184. package/docs/deploy/online-new.md +0 -610
  185. package/docs/deploy/online.md +0 -683
  186. package/docs/deploy/qiniu.md +0 -183
  187. package/docs/index.md +0 -40
  188. package/docs/introduction/about/code.md +0 -26
  189. package/docs/introduction/about/index.md +0 -33
  190. package/docs/introduction/feature/index.md +0 -3
  191. package/docs/plan/log.md +0 -346
  192. package/docs/plan/todo.md +0 -127
  193. package/docs/plan/wish.md +0 -29
  194. package/docs/praise/index.md +0 -45
  195. package/docs/public/robots.txt +0 -2
  196. package/docs/src/apis/ajax.ts +0 -66
  197. package/docs/src/apis/index.ts +0 -1
  198. package/docs/src/apis/modules/wish.ts +0 -20
  199. package/docs/src/components/Avatar.vue +0 -60
  200. package/docs/src/components/Home.vue +0 -85
  201. package/docs/src/components/Picture.vue +0 -13
  202. package/docs/src/components/Praise.vue +0 -52
  203. package/docs/src/components/WishBtn.vue +0 -98
  204. package/docs/src/components/WishPanel.vue +0 -170
  205. package/docs/src/components/callme/index.vue +0 -72
  206. package/docs/vite.config.ts +0 -42
  207. package/public/favicon.ico +0 -0
  208. package/public/logo.png +0 -0
  209. package/scripts/deploy/docs.mjs +0 -24
  210. package/scripts/deploy/prod.mjs +0 -24
  211. package/scripts/deploy/test.mjs +0 -26
  212. package/src/@types/ajax.d.ts +0 -5
  213. package/src/@types/api.d.ts +0 -305
  214. package/src/@types/lib.d.ts +0 -26
  215. package/src/@types/page.d.ts +0 -18
  216. package/src/App.vue +0 -36
  217. package/src/apis/ajax.ts +0 -72
  218. package/src/apis/index.ts +0 -20
  219. package/src/apis/modules/action.ts +0 -17
  220. package/src/apis/modules/category.ts +0 -20
  221. package/src/apis/modules/config.ts +0 -19
  222. package/src/apis/modules/file.ts +0 -150
  223. package/src/apis/modules/people.ts +0 -81
  224. package/src/apis/modules/public.ts +0 -49
  225. package/src/apis/modules/super/overview.ts +0 -56
  226. package/src/apis/modules/super/user.ts +0 -62
  227. package/src/apis/modules/task.ts +0 -67
  228. package/src/apis/modules/user.ts +0 -56
  229. package/src/apis/modules/wish.ts +0 -31
  230. package/src/assets/i/EasyPicker.png +0 -0
  231. package/src/assets/logo.png +0 -0
  232. package/src/assets/styles/app.css +0 -69
  233. package/src/components/HomeFooter/index.vue +0 -134
  234. package/src/components/HomeHeader/index.vue +0 -156
  235. package/src/components/InfosForm/index.vue +0 -73
  236. package/src/components/MessageList/index.vue +0 -155
  237. package/src/components/MessagePanel/index.vue +0 -46
  238. package/src/components/Praise/index.vue +0 -102
  239. package/src/components/QrCode.vue +0 -44
  240. package/src/components/linkDialog.vue +0 -104
  241. package/src/components/loginPanel.vue +0 -92
  242. package/src/constants/index.ts +0 -83
  243. package/src/env.d.ts +0 -8
  244. package/src/main.ts +0 -19
  245. package/src/pages/404/index.vue +0 -59
  246. package/src/pages/about/index.vue +0 -152
  247. package/src/pages/callme/index.vue +0 -155
  248. package/src/pages/dashboard/config/index.vue +0 -304
  249. package/src/pages/dashboard/files/index.vue +0 -1152
  250. package/src/pages/dashboard/index.vue +0 -335
  251. package/src/pages/dashboard/manage/config/index.vue +0 -97
  252. package/src/pages/dashboard/manage/index.vue +0 -105
  253. package/src/pages/dashboard/manage/overview/index.vue +0 -486
  254. package/src/pages/dashboard/manage/user/index.vue +0 -678
  255. package/src/pages/dashboard/manage/wish/index.vue +0 -257
  256. package/src/pages/dashboard/tasks/components/CategoryPanel.vue +0 -208
  257. package/src/pages/dashboard/tasks/components/CreateTask.vue +0 -93
  258. package/src/pages/dashboard/tasks/components/TaskInfo.vue +0 -129
  259. package/src/pages/dashboard/tasks/components/infoPanel/ddl.vue +0 -96
  260. package/src/pages/dashboard/tasks/components/infoPanel/file.vue +0 -175
  261. package/src/pages/dashboard/tasks/components/infoPanel/info.vue +0 -467
  262. package/src/pages/dashboard/tasks/components/infoPanel/people.vue +0 -566
  263. package/src/pages/dashboard/tasks/components/infoPanel/template.vue +0 -146
  264. package/src/pages/dashboard/tasks/components/infoPanel/tip.vue +0 -55
  265. package/src/pages/dashboard/tasks/components/infoPanel/tipInfo.vue +0 -196
  266. package/src/pages/dashboard/tasks/index.vue +0 -302
  267. package/src/pages/dashboard/tasks/public.ts +0 -32
  268. package/src/pages/disabled/index.vue +0 -47
  269. package/src/pages/feedback/index.vue +0 -5
  270. package/src/pages/home/index.vue +0 -72
  271. package/src/pages/login/index.vue +0 -270
  272. package/src/pages/register/index.vue +0 -211
  273. package/src/pages/reset/index.vue +0 -186
  274. package/src/pages/task/index.vue +0 -895
  275. package/src/pages/wish/index.vue +0 -152
  276. package/src/router/Interceptor/index.ts +0 -112
  277. package/src/router/index.ts +0 -13
  278. package/src/router/routes/index.ts +0 -197
  279. package/src/shims-vue.d.ts +0 -6
  280. package/src/store/index.ts +0 -17
  281. package/src/store/modules/category.ts +0 -44
  282. package/src/store/modules/public.ts +0 -27
  283. package/src/store/modules/task.ts +0 -55
  284. package/src/store/modules/user.ts +0 -57
  285. package/src/utils/elementUI.ts +0 -8
  286. package/src/utils/networkUtil.ts +0 -236
  287. package/src/utils/other.ts +0 -25
  288. package/src/utils/regExp.ts +0 -11
  289. package/src/utils/stringUtil.ts +0 -241
  290. package/tsconfig.json +0 -24
  291. package/vite.config.ts +0 -55
  292. /package/{docs/public → dist}/favicon.ico +0 -0
  293. /package/{docs/public → dist}/logo.png +0 -0
@@ -1,678 +0,0 @@
1
- <template>
2
- <div class="user">
3
- <div class="panel">
4
- <div class="p10 log-filter">
5
- <span class="item">
6
- <span class="label">状态</span>
7
- <el-select
8
- v-model="filterLogType"
9
- size="default"
10
- placeholder="请选择日志类型"
11
- >
12
- <el-option
13
- v-for="(item, idx) in logTypeList"
14
- :key="idx"
15
- :label="item.label"
16
- :value="item.type"
17
- ></el-option>
18
- </el-select>
19
- </span>
20
- <span class="item">
21
- <el-input
22
- size="default"
23
- clearable
24
- placeholder="请输入要检索的内容"
25
- :prefix-icon="Search"
26
- v-model="searchWord"
27
- >
28
- </el-input>
29
- </span>
30
- <span class="item">
31
- <el-button size="default" :icon="Refresh" @click="refreshUsers"
32
- >刷新</el-button
33
- >
34
- </span>
35
- <span class="item">
36
- <el-button
37
- size="warning"
38
- :icon="Message"
39
- @click="sendMessage(null, 0)"
40
- >推送全局消息</el-button
41
- >
42
- </span>
43
- </div>
44
- <el-table
45
- height="550"
46
- stripe
47
- border
48
- :default-sort="{ prop: 'date', order: 'descending' }"
49
- :data="pageUsers"
50
- style="width: 100%"
51
- >
52
- <el-table-column
53
- prop="account"
54
- label="账号"
55
- width="120"
56
- ></el-table-column>
57
- <el-table-column
58
- prop="phone"
59
- label="手机号"
60
- width="100"
61
- ></el-table-column>
62
- <el-table-column
63
- sortable
64
- prop="login_time"
65
- label="最后登录时间"
66
- width="190"
67
- >
68
- <template #default="scope">{{
69
- scope.row.login_time && formatDate(new Date(scope.row.login_time))
70
- }}</template>
71
- </el-table-column>
72
- <el-table-column prop="join_time" label="注册时间" width="190">
73
- <template #default="scope">{{
74
- formatDate(new Date(scope.row.join_time))
75
- }}</template>
76
- </el-table-column>
77
- <el-table-column
78
- sortable
79
- prop="login_count"
80
- label="登录次数"
81
- ></el-table-column>
82
- <el-table-column
83
- prop="open_time"
84
- label="解封时间"
85
- v-if="filterLogType === 1"
86
- >
87
- <template #default="scope">{{
88
- scope.row.open_time && formatDate(new Date(scope.row.open_time))
89
- }}</template>
90
- </el-table-column>
91
- <el-table-column
92
- sortable
93
- prop="fileCount"
94
- label="收集文件数"
95
- ></el-table-column>
96
- <el-table-column label="占用云空间" width="200">
97
- <template
98
- #default="{
99
- row: { resources, monthAgoSize, quarterAgoSize, halfYearSize, id }
100
- }"
101
- >
102
- <ul class="user-oss-info">
103
- <li>总大小:{{ resources }}</li>
104
- <li>
105
- 一月前:{{ monthAgoSize
106
- }}<el-button
107
- v-if="resources !== '0B'"
108
- class="clear-btn"
109
- @click="handleClearFiles(id, 'month')"
110
- :icon="DeleteFilled"
111
- circle
112
- size="small"
113
- ></el-button>
114
- </li>
115
- <li>
116
- 三月前:{{ quarterAgoSize
117
- }}<el-button
118
- v-if="quarterAgoSize !== '0B'"
119
- class="clear-btn"
120
- @click="handleClearFiles(id, 'quarter')"
121
- :icon="DeleteFilled"
122
- circle
123
- size="small"
124
- ></el-button>
125
- </li>
126
- <li>
127
- 半年前:{{ halfYearSize
128
- }}<el-button
129
- v-if="halfYearSize !== '0B'"
130
- class="clear-btn"
131
- @click="handleClearFiles(id, 'half')"
132
- :icon="DeleteFilled"
133
- circle
134
- size="small"
135
- ></el-button>
136
- </li>
137
- </ul>
138
- </template>
139
- </el-table-column>
140
- <el-table-column fixed="right" label="操作" width="100">
141
- <template #default="scope">
142
- <div class="text-btn-list">
143
- <el-button
144
- @click="
145
- handleChangeStatus(
146
- scope.row.id,
147
- scope.row.status,
148
- scope.row.open_time
149
- )
150
- "
151
- type="primary"
152
- text
153
- size="small"
154
- >修改状态</el-button
155
- >
156
- <el-button
157
- @click="handleResetPassword(scope.row.id)"
158
- type="primary"
159
- text
160
- size="small"
161
- >重置密码</el-button
162
- >
163
- <el-button
164
- @click="handleBindPhone(scope.row.id)"
165
- type="primary"
166
- text
167
- size="small"
168
- >绑定手机号</el-button
169
- >
170
- <el-button
171
- @click="sendMessage(scope.row.id)"
172
- type="warning"
173
- text
174
- size="small"
175
- >发送消息</el-button
176
- >
177
- </div>
178
- </template>
179
- </el-table-column>
180
- </el-table>
181
- <div class="flex fc p10">
182
- <el-pagination
183
- :current-page="pageCurrent"
184
- @current-change="handlePageChange"
185
- background
186
- :page-count="pageCount"
187
- :page-sizes="[10, 50, 100, 200]"
188
- :page-size="pageSize"
189
- @size-change="handleSizeChange"
190
- :total="filterUsers.length"
191
- layout="total, sizes, prev, pager, next, jumper"
192
- ></el-pagination>
193
- </div>
194
- </div>
195
- <!-- 消息推送弹窗 -->
196
- <el-dialog
197
- :fullscreen="isMobile"
198
- center
199
- title="消息推送"
200
- v-model="showMessageDialog"
201
- >
202
- <div class="tc">
203
- <el-input
204
- v-model="pushMessageText"
205
- :autosize="{ minRows: 6, maxRows: 20 }"
206
- type="textarea"
207
- placeholder="输入要推送的消息,支持HTML内容(推荐使用mdnice 转 markdown 转html)"
208
- />
209
- </div>
210
- <template #footer>
211
- <span class="dialog-footer">
212
- <el-button @click="showMessageDialog = false">取 消</el-button>
213
- <el-button type="primary" @click="sureSendMessage">确 定</el-button>
214
- </span>
215
- </template>
216
- </el-dialog>
217
- <!-- 用户状态修改弹窗 -->
218
- <el-dialog
219
- :fullscreen="isMobile"
220
- center
221
- title="状态修改"
222
- v-model="showUserStatusDialog"
223
- >
224
- <div class="tc">
225
- <el-select v-model="selectStatus" placeholder="请选择新分类">
226
- <el-option
227
- v-for="s in userStatusList"
228
- :key="s.type"
229
- :label="s.label"
230
- :value="s.type"
231
- ></el-option>
232
- </el-select>
233
- </div>
234
- <div style="margin-top: 10px" class="tc" v-if="selectStatus === 1">
235
- <el-date-picker
236
- :editable="false"
237
- v-model="openTime"
238
- type="datetime"
239
- placeholder="点击设置解封日期"
240
- ></el-date-picker>
241
- </div>
242
- <template #footer>
243
- <span class="dialog-footer">
244
- <el-button @click="showUserStatusDialog = false">取 消</el-button>
245
- <el-button type="primary" @click="handleSaveStatus">确 定</el-button>
246
- </span>
247
- </template>
248
- </el-dialog>
249
-
250
- <!-- 重置密码 -->
251
- <el-dialog
252
- :fullscreen="isMobile"
253
- center
254
- title="密码重置"
255
- v-model="showResetPasswordDialog"
256
- >
257
- <div class="tc">
258
- <el-form :model="pwdForm" label-width="80px">
259
- <el-form-item label="新密码">
260
- <el-input
261
- show-word-limit
262
- clearable
263
- v-model="pwdForm.pwd1"
264
- placeholder="请输入新密码"
265
- maxlength="16"
266
- minlength="6"
267
- />
268
- </el-form-item>
269
- <el-form-item>
270
- <el-input
271
- show-word-limit
272
- clearable
273
- v-model="pwdForm.pwd2"
274
- placeholder="请再次输入"
275
- maxlength="16"
276
- minlength="6"
277
- />
278
- </el-form-item>
279
- </el-form>
280
- </div>
281
- <template #footer>
282
- <span class="dialog-footer">
283
- <el-button @click="showResetPasswordDialog = false">取 消</el-button>
284
- <el-button type="primary" @click="handleSavePassword"
285
- >确 定</el-button
286
- >
287
- </span>
288
- </template>
289
- </el-dialog>
290
- <!-- 重绑定手机号 -->
291
- <el-dialog
292
- :fullscreen="isMobile"
293
- center
294
- title="绑定手机号"
295
- v-model="showPhoneDialog"
296
- >
297
- <div class="tc">
298
- <el-form :model="phoneForm" label-width="60px">
299
- <el-form-item label="手机号">
300
- <el-input
301
- show-word-limit
302
- clearable
303
- v-model="phoneForm.phone"
304
- placeholder="请输入手机号"
305
- maxlength="11"
306
- >
307
- <template #append>
308
- <!-- 获取验证码 -->
309
- <el-button :disabled="time !== 0" @click="getCode">{{
310
- codeText
311
- }}</el-button>
312
- </template>
313
- </el-input>
314
- </el-form-item>
315
- <el-form-item>
316
- <el-input
317
- show-word-limit
318
- clearable
319
- v-model="phoneForm.code"
320
- placeholder="请输入验证码"
321
- maxlength="4"
322
- />
323
- </el-form-item>
324
- </el-form>
325
- </div>
326
- <template #footer>
327
- <span class="dialog-footer">
328
- <el-button @click="showPhoneDialog = false">取 消</el-button>
329
- <el-button type="primary" @click="handleSavePhone">确 定</el-button>
330
- </span>
331
- </template>
332
- </el-dialog>
333
- </div>
334
- </template>
335
- <script lang="ts" setup>
336
- import { ElMessage, ElMessageBox } from 'element-plus'
337
- import { computed, onMounted, reactive, ref } from 'vue'
338
- import { useStore } from 'vuex'
339
- import { Search, DeleteFilled, Refresh, Message } from '@element-plus/icons-vue'
340
- import { PublicApi, SuperUserApi } from '@/apis'
341
- import { USER_STATUS } from '@/constants'
342
- import { formatDate } from '@/utils/stringUtil'
343
- import { rMobilePhone, rPassword, rVerCode } from '@/utils/regExp'
344
-
345
- const $store = useStore()
346
- // 用户
347
- const users: any[] = reactive([])
348
- const refreshUsers = () => {
349
- SuperUserApi.getUserList().then((res) => {
350
- users.splice(0, users.length)
351
- const d = res.data.list
352
- users.push(...d)
353
- })
354
- }
355
-
356
- // 筛选用户状态
357
- const filterLogType = ref(USER_STATUS.NORMAL)
358
- const searchWord = ref('')
359
- const logTypeList = reactive([
360
- {
361
- label: '正常',
362
- type: USER_STATUS.NORMAL
363
- },
364
- {
365
- label: '冻结',
366
- type: USER_STATUS.FREEZE
367
- },
368
- {
369
- label: '封禁',
370
- type: USER_STATUS.BAN
371
- }
372
- ])
373
-
374
- const filterUsers = computed(() =>
375
- users
376
- .filter((v) => v.status === filterLogType.value)
377
- .filter((v) => {
378
- const { account, phone, join_time, login_count, login_time, open_time } =
379
- v
380
- if (searchWord.value.length === 0) return true
381
- return `${account} ${phone} ${login_count} ${formatDate(
382
- open_time
383
- )} ${formatDate(login_time)} ${formatDate(join_time)}`.includes(
384
- searchWord.value
385
- )
386
- })
387
- )
388
-
389
- // 分页
390
- const pageSize = ref(10)
391
- const handleSizeChange = (v: number) => {
392
- pageSize.value = v
393
- }
394
- const pageCount = computed(() => {
395
- const t = Math.ceil(filterUsers.value.length / pageSize.value)
396
- return t
397
- })
398
- const pageCurrent = ref(1)
399
- const pageUsers = computed(() => {
400
- const start = (pageCurrent.value - 1) * pageSize.value
401
- const end = pageCurrent.value * pageSize.value
402
- return filterUsers.value.slice(start, end)
403
- })
404
- const handlePageChange = (idx: number) => {
405
- pageCurrent.value = idx
406
- }
407
-
408
- // 状态修改
409
- const showUserStatusDialog = ref(false)
410
- const selectUserId = ref(0)
411
- const selectStatus = ref(USER_STATUS.NORMAL)
412
- const userStatusList = logTypeList
413
- const openTime = ref('')
414
- const handleChangeStatus = (
415
- userId: number,
416
- status: USER_STATUS,
417
- oTime: string
418
- ) => {
419
- selectUserId.value = userId
420
- selectStatus.value = status
421
- openTime.value = oTime
422
- showUserStatusDialog.value = true
423
- }
424
- const handleSaveStatus = () => {
425
- const user = users.find((u) => u.id === selectUserId.value)
426
- if (selectStatus.value === USER_STATUS.FREEZE) {
427
- if (!openTime.value) {
428
- ElMessage.warning('请设置解冻时间')
429
- return
430
- }
431
- user.open_time = openTime.value
432
- } else {
433
- user.open_time = ''
434
- }
435
- user.status = selectStatus.value
436
- showUserStatusDialog.value = false
437
- SuperUserApi.updateUserStatus(user.id, user.status, user.open_time).then(
438
- () => {
439
- ElMessage.success('修改成功')
440
- }
441
- )
442
- }
443
-
444
- // 重置密码
445
- const showResetPasswordDialog = ref(false)
446
- const pwdForm = reactive({
447
- pwd1: '',
448
- pwd2: ''
449
- })
450
- const handleResetPassword = (userId: number) => {
451
- selectUserId.value = userId
452
- showResetPasswordDialog.value = true
453
- pwdForm.pwd1 = ''
454
- pwdForm.pwd2 = ''
455
- }
456
-
457
- const checkPwdForm = () => {
458
- if (!rPassword.test(pwdForm.pwd1)) {
459
- ElMessage.warning('密码格式不正确(6-16位 支持字母/数字/下划线)')
460
- return false
461
- }
462
- if (pwdForm.pwd1 !== pwdForm.pwd2) {
463
- ElMessage.warning('两次输入的密码不一致')
464
- return false
465
- }
466
-
467
- return true
468
- }
469
-
470
- const handleSavePassword = () => {
471
- if (!checkPwdForm()) return
472
- ElMessageBox.confirm('此操作不可逆,请谨慎操作', '确定要重置用户的密码吗?', {
473
- confirmButtonText: '确定',
474
- cancelButtonText: '取消',
475
- type: 'warning'
476
- })
477
- .then(() => {
478
- SuperUserApi.resetPassword(selectUserId.value, pwdForm.pwd1).then(() => {
479
- ElMessage.success('重置成功')
480
- showResetPasswordDialog.value = false
481
- })
482
- })
483
- .catch(() => {
484
- //
485
- })
486
- }
487
-
488
- // 绑定手机号
489
- const showPhoneDialog = ref(false)
490
- const phoneForm = reactive({
491
- phone: '',
492
- code: ''
493
- })
494
- const codeText = ref('获取验证码')
495
- const time = ref(0)
496
- const refreshCodeText = () => {
497
- if (time.value === 0) {
498
- codeText.value = '获取验证码'
499
- return
500
- }
501
- codeText.value = `${time.value}s`
502
- time.value -= 1
503
- setTimeout(refreshCodeText, 1000)
504
- }
505
- const getCode = () => {
506
- if (!rMobilePhone.test(phoneForm.phone)) {
507
- ElMessage.warning('手机号格式不正确')
508
- return
509
- }
510
- // check是否可用
511
- PublicApi.checkPhone(phoneForm.phone)
512
- .then(() => {
513
- PublicApi.getCode(phoneForm.phone).then(() => {
514
- time.value = 120
515
- refreshCodeText()
516
- ElMessage.success('获取成功,请注意查看手机短信')
517
- })
518
- })
519
- .catch((err) => {
520
- const { code: c } = err
521
- const msg = '注册失败,未知错误'
522
- const options: any = {
523
- 1002: '手机号已被注册',
524
- 1006: '手机号格式不正确'
525
- }
526
- ElMessage.error(options[c] || msg)
527
- })
528
- }
529
- const checkPhoneForm = () => {
530
- if (!rMobilePhone.test(phoneForm.phone)) {
531
- ElMessage.warning('手机号格式不正确')
532
- return false
533
- }
534
- if (!rVerCode.test(phoneForm.code)) {
535
- ElMessage.warning('验证码格式不正确')
536
- return false
537
- }
538
-
539
- return true
540
- }
541
- const handleBindPhone = (id: number) => {
542
- selectUserId.value = id
543
- showPhoneDialog.value = true
544
- }
545
- const handleSavePhone = async () => {
546
- if (!checkPhoneForm()) {
547
- return
548
- }
549
- // 调用API更新,验证码 不正确判断
550
- SuperUserApi.resetPhone(selectUserId.value, phoneForm.phone, phoneForm.code)
551
- .then(() => {
552
- ElMessage.success('绑定成功')
553
- showPhoneDialog.value = false
554
- phoneForm.code = ''
555
- phoneForm.phone = ''
556
- refreshUsers()
557
- })
558
- .catch((err) => {
559
- const { code: c } = err
560
- const msg = '绑定失败,未知错误'
561
- const options: any = {
562
- 1002: '手机号已被注册',
563
- 1003: '验证码不正确'
564
- }
565
- ElMessage.error(options[c] || msg)
566
- })
567
- }
568
-
569
- const handleClearFiles = (
570
- userId: number,
571
- type: 'month' | 'quarter' | 'half'
572
- ) => {
573
- const tipWords = {
574
- month: '一个月前',
575
- quarter: '三个月前',
576
- half: '半年前'
577
- }
578
- selectUserId.value = userId
579
- ElMessageBox.confirm('移除后这些文件将无法恢复,请谨慎操作', '删除前确认?', {
580
- confirmButtonText: `确认删除 ${tipWords[type]}文件`
581
- })
582
- .then(() => {
583
- SuperUserApi.clearOssFile(userId, type).then(() => {
584
- ElMessage.success('清理成功')
585
- })
586
- })
587
- // eslint-disable-next-line @typescript-eslint/no-empty-function
588
- .catch(() => {})
589
- }
590
-
591
- // TODO: 0 global 1 user_push
592
- const pushMessageType = ref(1)
593
- const showMessageDialog = ref(false)
594
- const pushMessageText = ref('')
595
- const sendMessage = (id: number, type = 1) => {
596
- selectUserId.value = id
597
- pushMessageType.value = type
598
- showMessageDialog.value = true
599
- }
600
-
601
- const sureSendMessage = () => {
602
- SuperUserApi.sendMessage(
603
- pushMessageText.value,
604
- pushMessageType.value,
605
- selectUserId.value
606
- ).then(() => {
607
- ElMessage.success('推送成功')
608
- // 推送成功
609
- pushMessageText.value = ''
610
- showMessageDialog.value = false
611
- })
612
- }
613
-
614
- onMounted(() => {
615
- refreshUsers()
616
- })
617
- const isMobile = computed(() => $store.getters['public/isMobile'])
618
- </script>
619
-
620
- <style scoped lang="scss">
621
- @media screen and (max-width: 700px) {
622
- .user {
623
- margin-top: 40px !important;
624
- }
625
-
626
- .log-filter {
627
- justify-content: center;
628
- }
629
- }
630
-
631
- .user {
632
- margin: 0 auto;
633
- }
634
-
635
- .panel {
636
- max-width: 1256px;
637
- padding: 1em;
638
- background-color: #fff;
639
- margin: 10px auto;
640
- box-sizing: border-box;
641
- box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
642
- border-radius: 4px;
643
- }
644
-
645
- .log-filter {
646
- display: flex;
647
- flex-wrap: wrap;
648
-
649
- .item {
650
- margin-right: 10px;
651
- margin-bottom: 10px;
652
-
653
- .label {
654
- margin-right: 10px;
655
- font-size: 12px;
656
- }
657
- }
658
- }
659
-
660
- .text-btn-list {
661
- display: flex;
662
- flex-wrap: wrap;
663
-
664
- button {
665
- margin-left: 0;
666
- }
667
- }
668
-
669
- .user-oss-info {
670
- list-style: none;
671
- li {
672
- margin-bottom: 10px;
673
- }
674
- .clear-btn {
675
- margin-left: 10px;
676
- }
677
- }
678
- </style>