@sugarat/easypicker2-client 2.4.3 → 2.6.1-beta.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-632af70e.js +2 -0
  5. package/dist/assets/data-analysis-632af70e.js.map +1 -0
  6. package/dist/assets/data-analysis-legacy.297ff95d.js +2 -0
  7. package/dist/assets/data-board-4290cade.js +2 -0
  8. package/dist/assets/data-board-4290cade.js.map +1 -0
  9. package/dist/assets/data-board-legacy.b3bf2f61.js +2 -0
  10. package/dist/assets/el-date-picker-b3398f8f.js +2 -0
  11. package/dist/assets/el-date-picker-b3398f8f.js.map +1 -0
  12. package/dist/assets/el-date-picker-cf2e83b6.css +1 -0
  13. package/dist/assets/el-date-picker-legacy.fd044c30.js +2 -0
  14. package/dist/assets/el-dialog-25bd2fb8.css +1 -0
  15. package/dist/assets/el-dialog-c11c4af2.js +2 -0
  16. package/dist/assets/el-dialog-c11c4af2.js.map +1 -0
  17. package/dist/assets/el-dialog-legacy.d2229175.js +2 -0
  18. package/dist/assets/el-dropdown-item-0c6ddabc.css +1 -0
  19. package/dist/assets/el-dropdown-item-3eb29c67.js +2 -0
  20. package/dist/assets/el-dropdown-item-3eb29c67.js.map +1 -0
  21. package/dist/assets/el-dropdown-item-legacy.60575f42.js +2 -0
  22. package/dist/assets/el-form-item-3aad794a.css +1 -0
  23. package/dist/assets/el-form-item-fb230be3.js +2 -0
  24. package/dist/assets/el-form-item-fb230be3.js.map +1 -0
  25. package/dist/assets/el-form-item-legacy.237ed4b6.js +2 -0
  26. package/dist/assets/el-loading-d0f2d079.css +1 -0
  27. package/dist/assets/el-loading-e9365e7e.js +2 -0
  28. package/dist/assets/el-loading-e9365e7e.js.map +1 -0
  29. package/dist/assets/el-loading-legacy.8045609e.js +2 -0
  30. package/dist/assets/el-pagination-85149e11.js +2 -0
  31. package/dist/assets/el-pagination-85149e11.js.map +1 -0
  32. package/dist/assets/el-pagination-bf7c736d.css +1 -0
  33. package/dist/assets/el-pagination-legacy.02ed0149.js +2 -0
  34. package/dist/assets/el-progress-63aabe3a.css +1 -0
  35. package/dist/assets/el-progress-b98becda.js +2 -0
  36. package/dist/assets/el-progress-b98becda.js.map +1 -0
  37. package/dist/assets/el-progress-legacy.1165db46.js +2 -0
  38. package/dist/assets/el-select-2a16e5df.js +2 -0
  39. package/dist/assets/el-select-2a16e5df.js.map +1 -0
  40. package/dist/assets/el-select-6be23320.css +1 -0
  41. package/dist/assets/el-select-legacy.5ccdd9a4.js +2 -0
  42. package/dist/assets/el-switch-abdd5a33.js +2 -0
  43. package/dist/assets/el-switch-abdd5a33.js.map +1 -0
  44. package/dist/assets/el-switch-aeab2c6b.css +1 -0
  45. package/dist/assets/el-switch-legacy.96786863.js +2 -0
  46. package/dist/assets/el-tab-pane-4a1bb4c7.css +1 -0
  47. package/dist/assets/el-tab-pane-db271c8d.js +2 -0
  48. package/dist/assets/el-tab-pane-db271c8d.js.map +1 -0
  49. package/dist/assets/el-tab-pane-legacy.143cbc33.js +2 -0
  50. package/dist/assets/el-table-column-19feeab8.js +21 -0
  51. package/dist/assets/el-table-column-19feeab8.js.map +1 -0
  52. package/dist/assets/el-table-column-6c2089f9.css +1 -0
  53. package/dist/assets/el-table-column-legacy.afba06f3.js +24 -0
  54. package/dist/assets/index-01e33329.css +1 -0
  55. package/dist/assets/index-0f83ff96.css +1 -0
  56. package/dist/assets/index-0fbe23b2.js +2 -0
  57. package/dist/assets/index-0fbe23b2.js.map +1 -0
  58. package/dist/assets/index-14d600a5.js +2 -0
  59. package/dist/assets/index-14d600a5.js.map +1 -0
  60. package/dist/assets/index-1639ad54.js +15 -0
  61. package/dist/assets/index-1639ad54.js.map +1 -0
  62. package/dist/assets/index-16b096cf.js +2 -0
  63. package/dist/assets/index-16b096cf.js.map +1 -0
  64. package/dist/assets/index-1bd2cd2e.js +2 -0
  65. package/dist/assets/index-1bd2cd2e.js.map +1 -0
  66. package/dist/assets/index-2c76567d.js +2 -0
  67. package/dist/assets/index-2c76567d.js.map +1 -0
  68. package/dist/assets/index-3091894a.css +1 -0
  69. package/dist/assets/index-34fd4f9f.css +1 -0
  70. package/dist/assets/index-37e15bc6.css +1 -0
  71. package/dist/assets/index-3f82ab7a.css +1 -0
  72. package/dist/assets/index-43d1d27e.js +2 -0
  73. package/dist/assets/index-43d1d27e.js.map +1 -0
  74. package/dist/assets/index-488b0f9e.js +2 -0
  75. package/dist/assets/index-488b0f9e.js.map +1 -0
  76. package/dist/assets/index-4b1f55ea.js +2 -0
  77. package/dist/assets/index-4b1f55ea.js.map +1 -0
  78. package/dist/assets/index-4c81cf78.css +1 -0
  79. package/dist/assets/index-51740dfd.js +2 -0
  80. package/dist/assets/index-51740dfd.js.map +1 -0
  81. package/dist/assets/index-5281fad0.js +2 -0
  82. package/dist/assets/index-5281fad0.js.map +1 -0
  83. package/dist/assets/index-68448dbd.js +2 -0
  84. package/dist/assets/index-68448dbd.js.map +1 -0
  85. package/dist/assets/index-74330c06.js +2 -0
  86. package/dist/assets/index-74330c06.js.map +1 -0
  87. package/dist/assets/index-76f31e30.css +1 -0
  88. package/dist/assets/index-76ff9b9b.css +1 -0
  89. package/dist/assets/index-78a8b3c7.js +2 -0
  90. package/dist/assets/index-78a8b3c7.js.map +1 -0
  91. package/dist/assets/index-82a6b493.css +1 -0
  92. package/dist/assets/index-93c733b3.css +1 -0
  93. package/dist/assets/index-98b55468.css +1 -0
  94. package/dist/assets/index-9e6a9bcf.js +2 -0
  95. package/dist/assets/index-9e6a9bcf.js.map +1 -0
  96. package/dist/assets/index-9e6bd406.js +2 -0
  97. package/dist/assets/index-9e6bd406.js.map +1 -0
  98. package/dist/assets/index-ac06071b.js +2 -0
  99. package/dist/assets/index-ac06071b.js.map +1 -0
  100. package/dist/assets/index-adc1b681.js +2 -0
  101. package/dist/assets/index-adc1b681.js.map +1 -0
  102. package/dist/assets/index-b8357360.js +2 -0
  103. package/dist/assets/index-b8357360.js.map +1 -0
  104. package/dist/assets/index-d09329eb.js +2 -0
  105. package/dist/assets/index-d09329eb.js.map +1 -0
  106. package/dist/assets/index-d3ae2239.css +1 -0
  107. package/dist/assets/index-da51da36.css +1 -0
  108. package/dist/assets/index-e7d8a83e.css +1 -0
  109. package/dist/assets/index-eb08e7b7.css +1 -0
  110. package/dist/assets/index-f31c9ba4.css +1 -0
  111. package/dist/assets/index-f74b7eb6.js +2 -0
  112. package/dist/assets/index-f74b7eb6.js.map +1 -0
  113. package/dist/assets/index-legacy.082ccf5b.js +2 -0
  114. package/dist/assets/index-legacy.12de1889.js +2 -0
  115. package/dist/assets/index-legacy.1796b3ef.js +2 -0
  116. package/dist/assets/index-legacy.227978b5.js +2 -0
  117. package/dist/assets/index-legacy.296716c3.js +2 -0
  118. package/dist/assets/index-legacy.36482c14.js +2 -0
  119. package/dist/assets/index-legacy.41d8801d.js +2 -0
  120. package/dist/assets/index-legacy.4b2923ee.js +2 -0
  121. package/dist/assets/index-legacy.4c1d6eb3.js +2 -0
  122. package/dist/assets/index-legacy.7a041259.js +2 -0
  123. package/dist/assets/index-legacy.820f4ba0.js +2 -0
  124. package/dist/assets/index-legacy.8311ba4a.js +2 -0
  125. package/dist/assets/index-legacy.9eb93981.js +18 -0
  126. package/dist/assets/index-legacy.a19ed25e.js +2 -0
  127. package/dist/assets/index-legacy.b8de0bf4.js +2 -0
  128. package/dist/assets/index-legacy.e932a3d4.js +2 -0
  129. package/dist/assets/index-legacy.e96fb189.js +2 -0
  130. package/dist/assets/index-legacy.ec490514.js +2 -0
  131. package/dist/assets/index-legacy.ed2883a1.js +2 -0
  132. package/dist/assets/index-legacy.f16524a6.js +2 -0
  133. package/dist/assets/index-legacy.f84efe08.js +2 -0
  134. package/dist/assets/isEqual-95d6c129.js +2 -0
  135. package/dist/assets/isEqual-95d6c129.js.map +1 -0
  136. package/dist/assets/isEqual-legacy.83836994.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-be31af7a.js +2 -0
  142. package/dist/assets/refresh-be31af7a.js.map +1 -0
  143. package/dist/assets/refresh-legacy.600c5af4.js +2 -0
  144. package/dist/assets/tip-822b05b7.js +2 -0
  145. package/dist/assets/tip-822b05b7.js.map +1 -0
  146. package/dist/assets/tip-9cb18ee8.css +1 -0
  147. package/dist/assets/tip-legacy.b6d754fd.js +2 -0
  148. package/dist/assets/validator-5c60ab85.js +2 -0
  149. package/dist/assets/validator-5c60ab85.js.map +1 -0
  150. package/dist/assets/validator-legacy.86b93c0e.js +2 -0
  151. package/{index.html → dist/index.html} +8 -1
  152. package/package.json +26 -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
@@ -0,0 +1,2 @@
1
+ import{d,_ as r,i as F,c as i,a as u,j as c,w as e,b as t,B as s,f,p as o,e as n}from"./index-1639ad54.js";const v=d({setup(){return{}}});const l=a=>(o("data-v-57f0136c"),a=a(),n(),a),A={class:"about"},p={class:"panel"},B=l(()=>u("img",{class:"logo",src:"https://img.cdn.sugarat.top/easypicker/EasyPicker.png"},null,-1)),D=l(()=>u("div",{class:"panel"},[u("h1",null,"简介"),u("p",null,"在线文件收取助手,帮助用户快速的完成一对多的文件收取")],-1)),h={class:"panel"},g=s('<h1 data-v-57f0136c>诞生背景</h1><p data-v-57f0136c>校园学习或者工作场景中会有以下几个场景:</p><ul data-v-57f0136c><li data-v-57f0136c><strong data-v-57f0136c>电子文件:</strong> 班委向同学收取各种实验电子报告</li><li data-v-57f0136c><strong data-v-57f0136c>图片:</strong> 收取各种截图证明/活动照片</li><li data-v-57f0136c>...</li></ul><p data-v-57f0136c>目前最广泛的收取方式为,通过邮箱,QQ,微信等通讯工具传递</p><p data-v-57f0136c>弊端显而易见,不方便整理统计。还占用电脑/手机内存</p><p data-v-57f0136c>为了解决这个问题,此项目应运而生</p><p data-v-57f0136c>当然<span data-v-57f0136c><strong data-v-57f0136c>市面上也有几款类似的办公工具</strong></span> ,功能及使用方式都差不多</p><p data-v-57f0136c>本项目<strong data-v-57f0136c>是 <a href="https://github.com/ATQQ/easypicker2-client" data-v-57f0136c>开源</a> 的</strong></p>',8),_=s('<div class="panel" data-v-57f0136c><h1 data-v-57f0136c>现有功能 <span style="color:grey;font-size:0.8rem;" data-v-57f0136c>(用户关心的)</span></h1><h2 data-v-57f0136c>收集任务</h2><ul data-v-57f0136c><li data-v-57f0136c><strong data-v-57f0136c>分类管理: </strong> 收集任务支持分类管理</li><li data-v-57f0136c><strong data-v-57f0136c>设置DDL(截止日期): </strong> 任务截止后不可再提交文件</li><li data-v-57f0136c><strong data-v-57f0136c>限制提交人员: </strong> 非指定的人员(姓名),无法提交文件</li><li data-v-57f0136c><strong data-v-57f0136c>设置模板文件: </strong> 提交者可直接在提交页面下载此文件</li><li data-v-57f0136c><strong data-v-57f0136c>自动重命名: </strong> 提交的文件按填写表单信息进行自动重名(如:姓名-工号.后缀)</li></ul><h2 data-v-57f0136c>文件相关</h2><ul data-v-57f0136c><li data-v-57f0136c><strong data-v-57f0136c>上传(提交): </strong>单个/多个</li><li data-v-57f0136c><strong data-v-57f0136c>下载: </strong>单个/多个/按收集任务</li><li data-v-57f0136c><strong data-v-57f0136c>撤回: </strong>用户可以撤回自己提交的文件</li><li data-v-57f0136c><strong data-v-57f0136c>分享: </strong>用户可以将文件下载链接分享给朋友</li><li data-v-57f0136c><strong data-v-57f0136c>模板下载: </strong> 下载任务发布者设置的模板文件</li><li data-v-57f0136c><strong data-v-57f0136c>导出: </strong> 导出提交记录</li></ul></div><div class="panel" data-v-57f0136c><h1 data-v-57f0136c>相关链接</h1><h2 data-v-57f0136c>应用链接相关</h2><ul data-v-57f0136c><li data-v-57f0136c><a href="https://docs.ep.sugarat.top" target="_blank" rel="noopener noreferrer" data-v-57f0136c>私有化部署</a></li><li data-v-57f0136c><a target="_blank" href="https://ep.sugarat.top" data-v-57f0136c>Easypicker1.0</a></li><li data-v-57f0136c><a target="_blank" href="https://ep2.sugarat.top" data-v-57f0136c>Easypicker2.0</a></li></ul><h2 data-v-57f0136c>应用源代码 <span style="color:grey;font-size:0.8rem;" data-v-57f0136c>(开发者需要的)</span></h2><ul data-v-57f0136c><li data-v-57f0136c><a target="_blank" href="https://github.com/ATQQ/EasyPicker-webpack" data-v-57f0136c>Easypicker1.0-客户端</a></li><li data-v-57f0136c><a target="_blank" href="https://github.com/ATQQ/easypicker-server" data-v-57f0136c>Easypicker1.0-服务端</a></li></ul><ul data-v-57f0136c><li data-v-57f0136c><a target="_blank" href="https://github.com/ATQQ/easypicker2-client" data-v-57f0136c>Easypicker2.0-客户端</a></li><li data-v-57f0136c><a target="_blank" href="https://github.com/ATQQ/easypicker2-server" data-v-57f0136c>Easypicker2.0-服务端</a></li></ul><ul data-v-57f0136c><li data-v-57f0136c><a target="_blank" href="https://github.com/ATQQ/vite-vue3-template" data-v-57f0136c>Easypicker2.0-客户端模板仓库</a></li><li data-v-57f0136c><a target="_blank" href="https://github.com/ATQQ/node-server" data-v-57f0136c>Easypicker2.0-服务端模板仓库</a></li></ul><h2 data-v-57f0136c>作者 <span style="color:grey;font-size:0.8rem;" data-v-57f0136c>(夹带私货)</span></h2><ul data-v-57f0136c><li data-v-57f0136c><a target="_blank" href="https://sugarat.top" data-v-57f0136c>博客</a></li><li data-v-57f0136c><a target="_blank" href="https://github.com/ATQQ" data-v-57f0136c>GitHub</a></li><li data-v-57f0136c><a target="_blank" href="https://juejin.cn/user/1028798615918983" data-v-57f0136c>掘金</a></li></ul></div>',2);function C(a,k,b,y,m,Q){const E=F("router-link");return f(),i("div",A,[u("main",null,[u("div",p,[c(E,{to:"/"},{default:e(()=>[B]),_:1})]),D,u("div",h,[g,u("p",null,[t("如有私有化的需求,可自行部署使用(也可 "),c(E,{to:"/author"},{default:e(()=>[t("联系作者")]),_:1}),t(" 提供帮助)")])]),_])])}const x=r(v,[["render",C],["__scopeId","data-v-57f0136c"]]);export{x as default};
2
+ //# sourceMappingURL=index-16b096cf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-16b096cf.js","sources":["../../src/pages/about/index.vue"],"sourcesContent":["<template>\n <div class=\"about\">\n <main>\n <div class=\"panel\">\n <router-link to=\"/\">\n <img class=\"logo\" src=\"https://img.cdn.sugarat.top/easypicker/EasyPicker.png\">\n </router-link>\n </div>\n <div class=\"panel\">\n <h1>简介</h1>\n <p>在线文件收取助手,帮助用户快速的完成一对多的文件收取</p>\n </div>\n <div class=\"panel\">\n <h1>诞生背景</h1>\n <p>校园学习或者工作场景中会有以下几个场景:</p>\n <ul>\n <li><strong>电子文件:</strong> 班委向同学收取各种实验电子报告</li>\n <li><strong>图片:</strong> 收取各种截图证明/活动照片</li>\n <li>...</li>\n </ul>\n <p>目前最广泛的收取方式为,通过邮箱,QQ,微信等通讯工具传递</p>\n <p>弊端显而易见,不方便整理统计。还占用电脑/手机内存</p>\n <p>为了解决这个问题,此项目应运而生</p>\n <p>当然<span><strong>市面上也有几款类似的办公工具</strong></span> ,功能及使用方式都差不多</p>\n <p>本项目<strong>是 <a href=\"https://github.com/ATQQ/easypicker2-client\">开源</a> 的</strong> </p>\n <p>如有私有化的需求,可自行部署使用(也可 <router-link to=\"/author\">联系作者</router-link> 提供帮助)</p>\n </div>\n <div class=\"panel\">\n <h1>现有功能 <span style=\"color:grey;font-size:0.8rem;\">(用户关心的)</span></h1>\n <h2>收集任务</h2>\n <ul>\n <li><strong>分类管理: </strong> 收集任务支持分类管理</li>\n <li><strong>设置DDL(截止日期): </strong> 任务截止后不可再提交文件</li>\n <li><strong>限制提交人员: </strong> 非指定的人员(姓名),无法提交文件</li>\n <li><strong>设置模板文件: </strong> 提交者可直接在提交页面下载此文件</li>\n <li><strong>自动重命名: </strong> 提交的文件按填写表单信息进行自动重名(如:姓名-工号.后缀)</li>\n </ul>\n <h2>文件相关</h2>\n <ul>\n <li><strong>上传(提交): </strong>单个/多个</li>\n <li><strong>下载: </strong>单个/多个/按收集任务</li>\n <li><strong>撤回: </strong>用户可以撤回自己提交的文件</li>\n <li><strong>分享: </strong>用户可以将文件下载链接分享给朋友</li>\n <li><strong>模板下载: </strong> 下载任务发布者设置的模板文件</li>\n <li><strong>导出: </strong> 导出提交记录</li>\n </ul>\n </div>\n <div class=\"panel\">\n <h1>相关链接</h1>\n <h2>应用链接相关</h2>\n <ul>\n <li><a href=\"https://docs.ep.sugarat.top\" target=\"_blank\" rel=\"noopener noreferrer\">私有化部署</a></li>\n <li><a target=\"_blank\" href=\"https://ep.sugarat.top\">Easypicker1.0</a></li>\n <li><a target=\"_blank\" href=\"https://ep2.sugarat.top\">Easypicker2.0</a></li>\n </ul>\n <h2>应用源代码 <span style=\"color:grey;font-size:0.8rem;\">(开发者需要的)</span></h2>\n <ul>\n <li><a target=\"_blank\" href=\"https://github.com/ATQQ/EasyPicker-webpack\">Easypicker1.0-客户端</a></li>\n <li><a target=\"_blank\" href=\"https://github.com/ATQQ/easypicker-server\">Easypicker1.0-服务端</a></li>\n </ul>\n <ul>\n <li><a target=\"_blank\" href=\"https://github.com/ATQQ/easypicker2-client\">Easypicker2.0-客户端</a></li>\n <li><a target=\"_blank\" href=\"https://github.com/ATQQ/easypicker2-server\">Easypicker2.0-服务端</a></li>\n </ul>\n <ul>\n <li><a target=\"_blank\" href=\"https://github.com/ATQQ/vite-vue3-template\">Easypicker2.0-客户端模板仓库</a></li>\n <li><a target=\"_blank\" href=\"https://github.com/ATQQ/node-server\">Easypicker2.0-服务端模板仓库</a></li>\n </ul>\n <h2>作者 <span style=\"color:grey;font-size:0.8rem;\">(夹带私货)</span></h2>\n <ul>\n <li><a target=\"_blank\" href=\"https://sugarat.top\">博客</a></li>\n <li><a target=\"_blank\" href=\"https://github.com/ATQQ\">GitHub</a></li>\n <li><a target=\"_blank\" href=\"https://juejin.cn/user/1028798615918983\">掘金</a></li>\n </ul>\n </div>\n <!-- <div class=\"panel\">\n <h1>开发计划</h1>\n <h2>...未完待续</h2>\n </div>\n <div class=\"panel\">\n <h1>涉及技术</h1>\n <h2>...未完待续</h2>\n </div> -->\n </main>\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n setup() {\n return {\n\n }\n },\n})\n</script>\n<style lang=\"scss\" scoped>\nh1,\nh2,\nh3,\nh4 {\n font-weight: 500;\n}\n.about {\n background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);\n min-height: 100vh;\n}\nmain {\n max-width: 860px;\n margin: 0 auto;\n padding: 20px;\n .panel {\n position: relative;\n margin: 0 auto 10px;\n padding: 16px 20px;\n width: 100%;\n overflow: hidden;\n border-radius: 0.25rem;\n box-shadow: #eee;\n box-sizing: border-box;\n transition: all 0.3s;\n background-color: #fff;\n }\n .logo{\n width: 100%;\n max-width: 520px;\n margin: 0 auto;\n display: block;\n }\n h1 {\n font-size: 1.6rem;\n margin-bottom: 10px;\n }\n h2{\n font-size: 1.3rem;\n margin-bottom: 12px;\n }\n ul,ol{\n margin-left: 20px;\n font-size: 15px;\n margin-bottom: 1em;\n }\n p{\n font-size: 15px;\n margin-bottom: 1em;\n }\n a{\n color: #409eff;\n }\n}\n</style>\n"],"names":["_sfc_main","defineComponent","_withScopeId","n","_pushScopeId","_popScopeId","_hoisted_3","_createElementVNode","_hoisted_4","_hoisted_2","_createVNode","_component_router_link","_withCtx","_hoisted_6","_createTextVNode"],"mappings":"2GAyFA,MAAAA,EAAAC,EAAA,CAA+B,OAAA,CAE3B,MAAA,EAEA,CAEJ,CAAA,EA5FiB,MAAAC,EAAAC,IAAAC,EAAA,iBAAA,EAAAD,EAAAA,IAAAE,IAAAF,uCAEwBG,EAAAJ,EAAA,IAAAK,EAAA,MAAA,CAAwD,MAAA,8EAKjFC,EAAAN,EAAA,IAAAK,EAAA,MAAA,CAAA,MAAA,SAAA,CAA6BA,EAAA,KAAA,KAAA,IAAA,EAEfA,EAAA,IAAA,KAAA,4BAAA,+rHALZA,EAAA,OAAA,KAAA,CADYA,EAAA,MAAAE,EAAA,CADoEC,EAAAC,EAAA,CAAA,GAAA,GAAA,EAAA,CAAA,QAAAC,EAAA,IAAA,QAGtF,CAAA,CAAA,CAAA,EAIAJ,aAaiFK,EAAVN,EAAA,IAAA,KAAA,CAAAO,EAAA,sBAAA,EAAdJ,EAAAC,EAAA,CAAA,GAAA,SAAA,EAAA,CAAA,QAAAC,EAAA,IAAA,8BAEzD,CAAA,CAAA,CAAA"}
@@ -0,0 +1,2 @@
1
+ import{J as et,aj as vt,N as tt,d as Q,Q as lt,f as d,c as h,H as he,k as y,T as qe,b as u,t as L,S as R,a as i,aB as at,Y as nt,aD as gt,aE as de,aF as yt,aG as ht,aH as Ce,aI as kt,r as I,Z as W,aJ as bt,O,aK as Ne,aw as $t,aL as wt,$ as Se,o as Le,aM as Vt,a6 as ce,aN as Ve,j as e,w as t,D,av as Ct,aO as xt,I as $e,aP as It,aQ as Tt,aR as Be,v as _e,aS as Et,aT as Ge,g as fe,h as xe,E as U,_ as ve,i as Ae,F as ee,C as le,x as se,p as Me,e as Fe,a7 as be,s as ye,aU as Ie,a5 as we,aV as ot,aW as ke,aX as Nt,aa as Pe,ab as st,aY as ut,aZ as it,ad as We,a_ as rt,P as St,a$ as Mt,a9 as Ft,ac as dt}from"./index-1639ad54.js";import{E as zt,a as Ut}from"./el-tab-pane-db271c8d.js";import{E as Oe}from"./el-dialog-c11c4af2.js";import{E as Ke,a as je}from"./el-form-item-fb230be3.js";import{b as ct,a as ze,E as Ue}from"./el-select-2a16e5df.js";import{E as He,a as Dt}from"./el-progress-b98becda.js";import{E as Bt,a as Pt,b as Lt,I as At,L as Ot}from"./index-74330c06.js";import{R as Ze,d as Kt,E as jt}from"./el-date-picker-b3398f8f.js";import{E as De}from"./index-b8357360.js";import{T as S,a as Ht}from"./tip-822b05b7.js";import{d as Yt}from"./other-8d7ba6a0.js";import{v as Rt}from"./el-loading-e9365e7e.js";import{a as Qt,E as Jt}from"./el-table-column-19feeab8.js";import{E as pt}from"./el-switch-abdd5a33.js";import{u as qt}from"./index-68448dbd.js";import"./isEqual-95d6c129.js";import"./validator-5c60ab85.js";import"./aria-bc8e8b0f.js";const Gt=et({header:{type:String,default:""},bodyStyle:{type:vt([String,Object,Array]),default:""},shadow:{type:String,values:["always","hover","never"],default:"always"}}),Wt={name:"ElCard"},Zt=Q({...Wt,props:Gt,setup(o){const a=lt("card");return(n,s)=>(d(),h("div",{class:he([y(a).b(),y(a).is("".concat(n.shadow,"-shadow"))])},[n.$slots.header||n.header?(d(),h("div",{key:0,class:he(y(a).e("header"))},[qe(n.$slots,"header",{},()=>[u(L(n.header),1)])],2)):R("v-if",!0),i("div",{class:he(y(a).e("body")),style:at(n.bodyStyle)},[qe(n.$slots,"default")],6)],2))}});var Xt=tt(Zt,[["__file","/home/runner/work/element-plus/element-plus/packages/components/card/src/card.vue"]]);const el=nt(Xt),tl=et({id:{type:String,default:void 0},step:{type:Number,default:1},stepStrictly:Boolean,max:{type:Number,default:Number.POSITIVE_INFINITY},min:{type:Number,default:Number.NEGATIVE_INFINITY},modelValue:Number,disabled:Boolean,size:gt,controls:{type:Boolean,default:!0},controlsPosition:{type:String,default:"",values:["","right"]},valueOnClear:{type:[String,Number,null],validator:o=>o===null||de(o)||["min","max"].includes(o),default:null},name:String,label:String,placeholder:String,precision:{type:Number,validator:o=>o>=0&&o===Number.parseInt("".concat(o),10)},validateEvent:{type:Boolean,default:!0}}),ll={[yt]:(o,a)=>o!==a,blur:o=>o instanceof FocusEvent,focus:o=>o instanceof FocusEvent,[ht]:o=>de(o)||Ce(o),[kt]:o=>de(o)||Ce(o)},al=["aria-label","onKeydown"],nl=["aria-label","onKeydown"],ol={name:"ElInputNumber"},sl=Q({...ol,props:tl,emits:ll,setup(o,{expose:a,emit:n}){const s=o,{t:v}=qt(),p=lt("input-number"),k=I(),f=W({currentValue:s.modelValue,userInput:null}),{formItem:C}=bt(),c=O(()=>de(s.modelValue)&&B(s.modelValue,-1)<s.min),b=O(()=>de(s.modelValue)&&B(s.modelValue)>s.max),$=O(()=>{const l=H(s.step);return Ne(s.precision)?Math.max(H(s.modelValue),l):(l>s.precision,s.precision)}),F=O(()=>s.controls&&s.controlsPosition==="right"),j=$t(),z=wt(),m=O(()=>{if(f.userInput!==null)return f.userInput;let l=f.currentValue;if(Ce(l))return"";if(de(l)){if(Number.isNaN(l))return"";Ne(s.precision)||(l=l.toFixed(s.precision))}return l}),T=(l,r)=>{if(Ne(r)&&(r=$.value),r===0)return Math.round(l);let w=String(l);const M=w.indexOf(".");if(M===-1||!w.replace(".","").split("")[M+r])return l;const Z=w.length;return w.charAt(Z-1)==="5"&&(w="".concat(w.slice(0,Math.max(0,Z-1)),"6")),Number.parseFloat(Number(w).toFixed(r))},H=l=>{if(Ce(l))return 0;const r=l.toString(),w=r.indexOf(".");let M=0;return w!==-1&&(M=r.length-w-1),M},B=(l,r=1)=>de(l)?T(l+s.step*r):f.currentValue,A=()=>{if(z.value||b.value)return;const l=s.modelValue||0,r=B(l);E(r)},Y=()=>{if(z.value||c.value)return;const l=s.modelValue||0,r=B(l,-1);E(r)},K=(l,r)=>{const{max:w,min:M,step:x,precision:q,stepStrictly:Z,valueOnClear:re}=s;let V=Number(l);if(Ce(l)||Number.isNaN(V))return null;if(l===""){if(re===null)return null;V=Et(re)?{min:M,max:w}[re]:re}return Z&&(V=T(Math.round(V/x)*x,q)),Ne(q)||(V=T(V,q)),(V>w||V<M)&&(V=V>w?w:M,r&&n("update:modelValue",V)),V},E=l=>{var r;const w=f.currentValue,M=K(l);w!==M&&(f.userInput=null,n("update:modelValue",M),n("input",M),n("change",M,w),s.validateEvent&&((r=C==null?void 0:C.validate)==null||r.call(C,"change").catch(x=>Ge())),f.currentValue=M)},J=l=>f.userInput=l,ae=l=>{const r=l!==""?Number(l):"";(de(r)&&!Number.isNaN(r)||l==="")&&E(r),f.userInput=null},ue=()=>{var l,r;(r=(l=k.value)==null?void 0:l.focus)==null||r.call(l)},pe=()=>{var l,r;(r=(l=k.value)==null?void 0:l.blur)==null||r.call(l)},ge=l=>{n("focus",l)},ie=l=>{var r;n("blur",l),s.validateEvent&&((r=C==null?void 0:C.validate)==null||r.call(C,"blur").catch(w=>Ge()))};return Se(()=>s.modelValue,l=>{f.currentValue=K(l,!0),f.userInput=null},{immediate:!0}),Le(()=>{var l;const{min:r,max:w,modelValue:M}=s,x=(l=k.value)==null?void 0:l.input;if(x.setAttribute("role","spinbutton"),Number.isFinite(w)?x.setAttribute("aria-valuemax",String(w)):x.removeAttribute("aria-valuemax"),Number.isFinite(r)?x.setAttribute("aria-valuemin",String(r)):x.removeAttribute("aria-valuemin"),x.setAttribute("aria-valuenow",String(f.currentValue)),x.setAttribute("aria-disabled",String(z.value)),!de(M)&&M!=null){let q=Number(M);Number.isNaN(q)&&(q=null),n("update:modelValue",q)}}),Vt(()=>{var l;const r=(l=k.value)==null?void 0:l.input;r==null||r.setAttribute("aria-valuenow","".concat(f.currentValue))}),a({focus:ue,blur:pe}),(l,r)=>(d(),h("div",{class:he([y(p).b(),y(p).m(y(j)),y(p).is("disabled",y(z)),y(p).is("without-controls",!l.controls),y(p).is("controls-right",y(F))]),onDragstart:r[0]||(r[0]=Be(()=>{},["prevent"]))},[l.controls?ce((d(),h("span",{key:0,role:"button","aria-label":y(v)("el.inputNumber.decrease"),class:he([y(p).e("decrease"),y(p).is("disabled",y(c))]),onKeydown:Ve(Y,["enter"])},[e(y($e),null,{default:t(()=>[y(F)?(d(),D(y(Ct),{key:0})):(d(),D(y(xt),{key:1}))]),_:1})],42,al)),[[y(Ze),Y]]):R("v-if",!0),l.controls?ce((d(),h("span",{key:1,role:"button","aria-label":y(v)("el.inputNumber.increase"),class:he([y(p).e("increase"),y(p).is("disabled",y(b))]),onKeydown:Ve(A,["enter"])},[e(y($e),null,{default:t(()=>[y(F)?(d(),D(y(It),{key:0})):(d(),D(y(Tt),{key:1}))]),_:1})],42,nl)),[[y(Ze),A]]):R("v-if",!0),e(y(_e),{id:l.id,ref_key:"input",ref:k,type:"number",step:l.step,"model-value":y(m),placeholder:l.placeholder,disabled:y(z),size:y(j),max:l.max,min:l.min,name:l.name,label:l.label,"validate-event":!1,onKeydown:[Ve(Be(A,["prevent"]),["up"]),Ve(Be(Y,["prevent"]),["down"])],onBlur:ie,onFocus:ge,onInput:J,onChange:ae},null,8,["id","step","model-value","placeholder","disabled","size","max","min","name","label","onKeydown"])],34))}});var ul=tt(sl,[["__file","/home/runner/work/element-plus/element-plus/packages/components/input-number/src/input-number.vue"]]);const il=nt(ul),rl=Q({name:"CircleCloseFilled"}),dl={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},cl=i("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336L512 457.664z"},null,-1),pl=[cl];function ml(o,a,n,s,v,p){return d(),h("svg",dl,pl)}var Xe=fe(rl,[["render",ml]]);const _l=Q({name:"CirclePlusFilled"}),fl={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},vl=i("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm-38.4 409.6H326.4a38.4 38.4 0 1 0 0 76.8h147.2v147.2a38.4 38.4 0 0 0 76.8 0V550.4h147.2a38.4 38.4 0 0 0 0-76.8H550.4V326.4a38.4 38.4 0 1 0-76.8 0v147.2z"},null,-1),gl=[vl];function yl(o,a,n,s,v,p){return d(),h("svg",fl,gl)}var hl=fe(_l,[["render",yl]]);const kl=Q({name:"Delete"}),bl={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},$l=i("path",{fill:"currentColor",d:"M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32V256zm448-64v-64H416v64h192zM224 896h576V256H224v640zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32zm192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32z"},null,-1),wl=[$l];function Vl(o,a,n,s,v,p){return d(),h("svg",bl,wl)}var Cl=fe(kl,[["render",Vl]]);const xl=Q({name:"Edit"}),Il={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Tl=i("path",{fill:"currentColor",d:"M832 512a32 32 0 1 1 64 0v352a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h352a32 32 0 0 1 0 64H192v640h640V512z"},null,-1),El=i("path",{fill:"currentColor",d:"m469.952 554.24 52.8-7.552L847.104 222.4a32 32 0 1 0-45.248-45.248L477.44 501.44l-7.552 52.8zm422.4-422.4a96 96 0 0 1 0 135.808l-331.84 331.84a32 32 0 0 1-18.112 9.088L436.8 623.68a32 32 0 0 1-36.224-36.224l15.104-105.6a32 32 0 0 1 9.024-18.112l331.904-331.84a96 96 0 0 1 135.744 0z"},null,-1),Nl=[Tl,El];function Sl(o,a,n,s,v,p){return d(),h("svg",Il,Nl)}var Ml=fe(xl,[["render",Sl]]);const Fl=Q({name:"Menu"}),zl={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Ul=i("path",{fill:"currentColor",d:"M160 448a32 32 0 0 1-32-32V160.064a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V416a32 32 0 0 1-32 32H160zm448 0a32 32 0 0 1-32-32V160.064a32 32 0 0 1 32-32h255.936a32 32 0 0 1 32 32V416a32 32 0 0 1-32 32H608zM160 896a32 32 0 0 1-32-32V608a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32v256a32 32 0 0 1-32 32H160zm448 0a32 32 0 0 1-32-32V608a32 32 0 0 1 32-32h255.936a32 32 0 0 1 32 32v256a32 32 0 0 1-32 32H608z"},null,-1),Dl=[Ul];function Bl(o,a,n,s,v,p){return d(),h("svg",zl,Dl)}var mt=fe(Fl,[["render",Bl]]);const Pl=Q({name:"Plus"}),Ll={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Al=i("path",{fill:"currentColor",d:"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64h352z"},null,-1),Ol=[Al];function Kl(o,a,n,s,v,p){return d(),h("svg",Ll,Ol)}var jl=fe(Pl,[["render",Kl]]);const Hl=Q({name:"Share"}),Yl={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Rl=i("path",{fill:"currentColor",d:"m679.872 348.8-301.76 188.608a127.808 127.808 0 0 1 5.12 52.16l279.936 104.96a128 128 0 1 1-22.464 59.904l-279.872-104.96a128 128 0 1 1-16.64-166.272l301.696-188.608a128 128 0 1 1 33.92 54.272z"},null,-1),Ql=[Rl];function Jl(o,a,n,s,v,p){return d(),h("svg",Yl,Ql)}var ql=fe(Hl,[["render",Jl]]);const Gl=Q({name:"Top"}),Wl={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Zl=i("path",{fill:"currentColor",d:"M572.235 205.282v600.365a30.118 30.118 0 1 1-60.235 0V205.282L292.382 438.633a28.913 28.913 0 0 1-42.646 0 33.43 33.43 0 0 1 0-45.236l271.058-288.045a28.913 28.913 0 0 1 42.647 0L834.5 393.397a33.43 33.43 0 0 1 0 45.176 28.913 28.913 0 0 1-42.647 0l-219.618-233.23z"},null,-1),Xl=[Zl];function ea(o,a,n,s,v,p){return d(),h("svg",Wl,Xl)}var ta=fe(Gl,[["render",ea]]);const la=Q({name:"categoryPanel",components:{DeleteFilled:Kt},props:{category:{type:String,required:!0,default:"default"}},setup(o,a){const n=xe(),s=O(()=>n.state.category.categoryList),v=O(()=>n.state.task.taskList),p=$=>{const F=v.value.filter(j=>j.category===$).length;return F===0?"":" (".concat(F,")")},k=I(!1),f=I(""),C=()=>{k.value=!1,f.value.trim()&&(n.dispatch("category/createCategory",f.value).then(()=>{U.success("创建成功")}).catch($=>{$.code===2001&&U.warning("分类名称已存在")}),f.value="")},c=$=>{a.emit("update:category",$)};return{categorys:s,isShowCreateCategory:k,categoryName:f,addCategory:C,handleDeleteCategory:$=>{De.confirm("是否删除","提示",{confirmButtonText:"确定",cancelButtonText:"取消"}).then(()=>{n.dispatch("category/deleteCategory",$.k).then(()=>{c("default"),U.success("删除成功"),n.dispatch("task/getTask")})}).catch(()=>{U.info("取消删除")})},handleClickCategory:c,taskCount:p}}});const aa=o=>(Me("data-v-89760030"),o=o(),Fe(),o),na={class:"panel"},oa=aa(()=>i("div",{class:"btn-area"},[i("h5",null,"分类列表"),i("h6",{style:{"font-weight":"lighter"}},"(点击分类可筛选任务)")],-1)),sa={style:{"margin-top":"15px"},class:"category-list"},ua={class:"new-tag-wrap"},ia={class:"list-tip"},ra={class:"tag-wrap"},da={class:"tag-list"};function ca(o,a,n,s,v,p){const k=_e,f=se,C=ct,c=Ae("DeleteFilled"),b=$e;return d(),h("div",na,[oa,i("div",sa,[i("div",ua,[o.isShowCreateCategory?(d(),D(k,{key:0,class:"input-new-tag el-tag",modelValue:o.categoryName,"onUpdate:modelValue":a[0]||(a[0]=$=>o.categoryName=$),ref:"saveTagInput",placeholder:"分类名称",onKeyup:Ve(o.addCategory,["enter"]),onFocusout:o.addCategory},null,8,["modelValue","onKeyup","onFocusout"])):(d(),D(f,{key:1,class:"button-new-tag el-tag",size:"small",onClick:a[1]||(a[1]=$=>o.isShowCreateCategory=!0)},{default:t(()=>[u("+ New 分类")]),_:1})),e(C,{effect:o.category==="default"?"dark":"plain",onClick:a[2]||(a[2]=$=>o.handleClickCategory("default"))},{default:t(()=>[u("默认"+L(o.taskCount("default")),1)]),_:1},8,["effect"]),i("span",ia,[e(C,{type:"danger",effect:o.category==="trash"?"dark":"plain",onClick:a[3]||(a[3]=$=>o.handleClickCategory("trash"))},{default:t(()=>[e(b,null,{default:t(()=>[e(c)]),_:1}),u(" 回收站"+L(o.taskCount("trash")),1)]),_:1},8,["effect"])])]),i("div",ra,[i("div",da,[(d(!0),h(ee,null,le(o.categorys,$=>(d(),D(C,{key:$.k,closable:"",effect:o.category===$.k?"dark":"plain",onClose:F=>o.handleDeleteCategory($),onClick:F=>o.handleClickCategory($.k)},{default:t(()=>[u(L($.name)+L(o.taskCount($.k)),1)]),_:2},1032,["effect","onClose","onClick"]))),128))])])])])}const pa=ve(la,[["render",ca],["__scopeId","data-v-89760030"]]),ma={class:"btn-area"},_a={class:"input-container"},fa=Q({__name:"CreateTask",props:{activeCategoryKey:{type:String,default:"default"}},setup(o){const a=o,n=xe(),s=O(()=>n.state.category.categoryList);O(()=>a.activeCategoryKey==="default"?"默认":s.value.find(f=>f.k===a.activeCategoryKey).name);const v=I(!1),p=I(""),k=()=>{if(!p.value.trim()){U.warning("不能为空");return}n.dispatch("task/createTask",{name:p.value,category:a.activeCategoryKey}).then(()=>{U.success("创建成功")}),p.value=""};return(f,C)=>{var F;const c=se,b=_e,$=$e;return d(),h("div",null,[i("div",ma,[e(c,{size:"large",type:"primary",plain:!v.value,onClick:C[0]||(C[0]=j=>v.value=!v.value)},{default:t(()=>[u(L(v.value?"关闭创建面板":"创建收集任务"),1)]),_:1},8,["plain"])]),ce(i("div",null,[i("div",_a,[e(b,{placeholder:"请输入任务名称(上述列表选择分类)",modelValue:p.value,"onUpdate:modelValue":C[1]||(C[1]=j=>p.value=j)},null,8,["modelValue"]),e(c,{onClick:k,type:(F=p.value)!=null&&F.length?"success":"default"},{default:t(()=>[u("确定")]),_:1},8,["type"])])],512),[[be,v.value]]),e(S,{class:"p10"},{default:t(()=>[u(" 点击 "),e($,null,{default:t(()=>[e(y(mt))]),_:1}),u(" 可以进一步的调整任务 ")]),_:1}),e(S,null,{default:t(()=>[u(" 设置截止时间,自动重命名,名单限制,批注,文件模板。。🚀 ")]),_:1})])}}});const va=ve(fa,[["__scopeId","data-v-74937fc2"]]);const ga={class:"header"},ya={class:"ellipsis"},ha={class:"actions"},ka={class:"body"},ba={key:0,class:"empty"},$a={key:1},wa={class:"check-files"},Va={class:"time"},Ca={class:"name"},xa=Q({__name:"TaskInfo",props:{item:{}},setup(o){return(a,n)=>{const s=se,v=Ae("router-link"),p=el;return d(),D(p,{class:"task-item"},{header:t(()=>[i("div",ga,[i("span",ya,L(a.item.name),1),i("div",ha,[e(s,{circle:"",type:"warning",icon:y(mt),title:"更多",onClick:n[0]||(n[0]=k=>a.$emit("more",a.item))},null,8,["icon"]),e(s,{circle:"",type:"success",icon:y(Ml),title:"编辑基本信息",onClick:n[1]||(n[1]=k=>a.$emit("edit",a.item))},null,8,["icon"]),e(s,{circle:"",type:"primary",icon:y(ql),title:"分享",onClick:n[2]||(n[2]=k=>a.$emit("share",a.item.key))},null,8,["icon"]),e(s,{circle:"",type:"danger",icon:y(Cl),title:"删除",onClick:n[3]||(n[3]=k=>a.$emit("delete",a.item.key,a.item.category==="trash"))},null,8,["icon"])])])]),default:t(()=>[i("div",ka,[a.item.recentLog.length===0?(d(),h("div",ba," 暂时没有提交记录... ")):(d(),h("ul",$a,[i("li",wa,[i("strong",null,"近 "+L(a.item.recentLog.length)+" 条提交记录",1),e(v,{to:"/dashboard/files?task=".concat(a.item.key)},{default:t(()=>[u("查看详情")]),_:1},8,["to"])]),(d(!0),h(ee,null,le(a.item.recentLog,(k,f)=>(d(),h("li",{key:Number(f),class:"ellipsis"},[i("span",Va,L(y(ye)(new Date(k.date))),1),i("span",Ca,L(k.filename),1)]))),128))]))])]),_:1})}}});const Ia=ve(xa,[["__scopeId","data-v-15cc9632"]]),oe=Yt((o,a,n=!0)=>{o&&Ie.updateTaskMoreInfo(o,a).then(()=>{n&&U.success({message:"设置成功",zIndex:4e3,duration:1e3})}).catch(()=>{U.error({message:"设置失败",zIndex:4e3})})},1e3,!0),Ta={class:"tc ddl"},Ea={class:"tc flex fc fac"},Na={key:0,style:{"margin-top":"10px"}},Sa=Q({__name:"ddl",props:{ddl:{type:String,default:"",required:!1},k:{type:String,default:""}},setup(o){const a=o,n=I();we(()=>{a.ddl?n.value=new Date(a.ddl):n.value=null});const s=()=>{if(n.value){const c=ye(new Date(n.value.getTime()-288e5));oe(a.k,{ddl:c})}},v=()=>{n.value=null,oe(a.k,{ddl:null})},p=I(0),k=O(()=>p.value<=0),f=O(()=>{let c=~~(p.value/1e3),b=~~(c/(60*60));const $=~~(b/24);b%=24;const F=~~(c%3600/60);return c%=60,"剩余".concat($,"天").concat(b,"时").concat(F,"分").concat(c,"秒")}),C=(c=!0)=>{n.value?p.value=n.value.getTime()-Date.now():p.value=0,c&&setTimeout(()=>{C()},1e3)};return Le(()=>{C()}),(c,b)=>{const $=jt,F=se;return d(),h("div",Ta,[e(S,{imgs:["https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTI4NjU5Nw==649149286597","https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTMxMDEyOQ==649149310129","https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTM3MzgxOA==649149373818"]},{default:t(()=>[u("设置截止日期,截止后将不能再提交文件。")]),_:1},8,["imgs"]),i("div",Ea,[e($,{editable:!1,modelValue:n.value,"onUpdate:modelValue":b[0]||(b[0]=j=>n.value=j),type:"datetime",placeholder:"点击设置新截止日期",onChange:s,"default-time":new Date(o.ddl)},null,8,["modelValue","default-time"]),n.value?(d(),D(F,{key:0,onClick:v},{default:t(()=>[u("取消")]),_:1})):R("",!0)]),n.value?(d(),h("div",Na,[e(S,null,{default:t(()=>[u(L(k.value?"已经截止":"剩余时间: ".concat(f.value)),1)]),_:1})])):R("",!0)])}}});const Ma={class:"tc info-panel"},Fa={key:3,class:"upload-people"},za={class:"import-people-wrapper"},Ua={class:"el-upload__tip"},Da={class:"p10"},Ba={style:{"max-width":"300px",margin:"0 auto"}},Pa={class:"p10"},La={style:{"max-width":"320px",margin:"0 auto"}},Aa={class:"nav"},Oa={class:"item"},Ka={class:"item"},ja={class:"item"},Ha={class:"item"},Ya={class:"tc p10"},Ra={class:"tc p10"},Qa={style:{"text-align":"center"}},Ja={key:0,class:"submit-ok"},qa={key:1,class:"submit-fail"},Ga={class:"dialog-footer"},Wa=Q({__name:"people",props:{value:{type:Number,defalut:0},k:{type:String,default:""},name:{type:String,default:""},field:{type:String,default:"姓名"}},setup(o){const a=o;ot(V=>({"1fa0305c":q.value}));const n=I("手动添加"),s=I(""),v=I(!1),p=()=>{s.value&&(v.value=!0,ke.addPeopleByUser(s.value,a.k).then(V=>{U.success("添加 ".concat(s.value," 成功"))}).catch(()=>{U.error("".concat(s.value," 已存在"))}).finally(()=>{v.value=!1,s.value=""}))},k=I(!1),f=I(0);we(()=>{f.value=a.value});const C=V=>{oe(a.k,{people:+V}),f.value=+V},c=I(!1),b=W([]),$=I("all"),F=I(""),j=O(()=>F.value?b.filter(V=>V.name.includes(F.value)):b),z=O(()=>$.value==="all"?j.value:j.value.filter(V=>V.status===$.value)),m=I(!1),T=()=>{m.value=!0,ke.getPeople(a.k,"".concat(+k.value)).then(V=>{b.splice(0,b.length),b.push(...V.data.people),b.forEach(_=>{!_.status&&_.count===0?_.lastDate="暂无记录":_.lastDate=ye(new Date(_.lastDate),"yyyy-MM-dd hh:mm:ss")}),m.value=!1})},H=()=>{k.value=!k.value,k.value&&T()},B=()=>{c.value=!0,k.value=!1,T()},A=V=>{De.confirm("确认删除此人员吗","数据无价,请谨慎操作").then(()=>{ke.deletePeople(a.k,V.id).then(()=>{U.success("删除成功"),b.splice(b.findIndex(_=>_.id===V.id),1)})}).catch(()=>{U.info("取消删除")})},Y=I([]),K=I(),E=()=>{U.error("只能选择一个文件,可删除后重新选择")},J=()=>{Y.value.splice(0,Y.value.length),K.value.clearFiles()},ae=()=>{Y.value.forEach(V=>{Nt(V.raw,"/api/public/upload",{success:_=>{const{name:P,type:g}=_.data;ke.importPeople(a.k,P,g).then(G=>{const{success:te,fail:X}=G.data;U.success("导入完成:".concat(te,"成功,").concat(X.length,"失败")),X.length>0&&setTimeout(()=>{U.info("自动开始下载未成功导入名单"),Pe(["未成功导入名单"],X.map(ne=>[ne]),"".concat(a.name,"_导入失败名单_").concat(ye(new Date,"yyyy年MM月日hh时mm分ss秒"),".xlsx"))},1e3),J()})}})})},ue=V=>{V.raw.type!=="text/plain"&&(U.warning({message:"只支持txt文件",zIndex:4e3}),J())},pe=()=>{if(z.value.length===0){U.warning("表格中没有可导出数据");return}const V=["姓名","提交状态","提交数量","最后操作时间",...k.value?["现存数量","提交次数"]:[]],_=z.value.map(P=>{const{name:g,status:G,lastDate:te,submitCount:X,fileCount:ne,count:Te}=P;return[g,G?"✔":"x",X,G?ye(new Date(te)):"",...k.value?[ne,Te]:[]]});Pe(V,_,"".concat(a.name,"_提交情况_").concat(ye(new Date,"yyyy年MM月日hh时mm分ss秒"),".xlsx")),U.success("导出成功")},ge=xe(),ie=O(()=>ge.getters["public/isMobile"]),l=W({taskList:[],type:"override",taskValue:""}),r=I(!1),w=async()=>{var P;const V=a.k,{data:_}=await ke.getUsefulTemplate(V);l.taskList=_,l.taskValue=((P=_[0])==null?void 0:P.taskKey)||"",r.value=!0},M=O(()=>{const{taskList:V,taskValue:_}=l,P=V.find(g=>g.taskKey===_);return P?"".concat(P.count," 条数据"):"无可用任务"}),x=()=>{ke.importPeopleFromTpl(a.k,l.taskValue,l.type).then(V=>{r.value=!1;const{success:_,fail:P}=V.data;U.success("导入成功".concat(_,"条,失败").concat(P.length,"条")),P.length>0&&setTimeout(()=>{U.info("自动开始下载未成功导入名单"),Pe(["未成功导入名单"],P.map(g=>[g]),"".concat(a.name,"_导入失败名单_").concat(ye(new Date,"yyyy年MM月日hh时mm分ss秒"),".xlsx"))},1e3)})},q=O(()=>ie.value?"0 0 auto":.5),Z=I("姓名");Se(()=>a.field,V=>{Z.value=V},{immediate:!0});const re=()=>{if(!Z.value.trim().length){U.warning("绑定的表单项不能为空");return}Ie.updateTaskMoreInfo(a.k,{bindField:Z.value}).then(()=>{U.success("保存成功")})};return(V,_)=>{const P=se,g=Bt,G=Pt,te=He,X=_e,ne=Ke,Te=je,Ee=ze,Re=Ue,me=Qt,_t=Jt,Qe=Oe,Je=Lt,ft=Rt;return d(),h("div",Ma,[e(S,{imgs:["https://img.cdn.sugarat.top/mdImg/MTY1MDE4MzEwOTEzOQ==650183109139","https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjY3MTUyMw==651496671523"]},{default:t(()=>[u("只有名单里的成员,才可提交文件")]),_:1},8,["imgs"]),f.value?R("",!0):(d(),D(P,{key:0,onClick:_[0]||(_[0]=N=>C(!0)),size:"default",round:"",type:"success"},{default:t(()=>[u("开启")]),_:1})),f.value?(d(),D(P,{key:1,onClick:_[1]||(_[1]=N=>C(!1)),size:"default",round:"",type:"danger"},{default:t(()=>[u("关闭")]),_:1})):R("",!0),f.value?(d(),D(P,{key:2,onClick:B,round:"",size:"default",type:"primary"},{default:t(()=>[u("查看提交情况")]),_:1})):R("",!0),f.value?(d(),h("div",Fa,[e(G,{modelValue:n.value,"onUpdate:modelValue":_[2]||(_[2]=N=>n.value=N),size:"small"},{default:t(()=>[e(g,{label:"文件导入"}),e(g,{label:"任务导入"}),e(g,{label:"手动添加"})]),_:1},8,["modelValue"]),i("div",za,[ce(i("div",null,[e(te,{accept:"text/plain",action:"",class:"upload-demo",ref_key:"peopleUpload",ref:K,"on-change":ue,"on-exceed":E,"on-remove":J,"auto-upload":!1,limit:1,"file-list":Y.value,"onUpdate:fileList":_[3]||(_[3]=N=>Y.value=N)},{trigger:t(()=>[e(P,{size:"small",type:"primary"},{default:t(()=>[u("选择文件")]),_:1})]),tip:t(()=>[i("div",Ua,[e(S,{imgs:["https://img.cdn.sugarat.top/mdImg/MTY1MDE4Mjk2NjUxMA==650182966510"]},{default:t(()=>[u("只能上传 .txt 文本文件,每行一个名字")]),_:1},8,["imgs"]),e(S,null,{default:t(()=>[u("如名字有特殊字符,建议去除")]),_:1}),e(S,null,{default:t(()=>[u("上传文件导入的方式,为追加导入,不会覆盖已存在数据")]),_:1})])]),default:t(()=>[e(P,{onClick:ae,style:{"margin-left":"10px"},size:"small",type:"success",disabled:!Y.value.length},{default:t(()=>[u("确定上传")]),_:1},8,["disabled"])]),_:1},8,["file-list"])],512),[[be,n.value==="文件导入"]]),ce(i("div",null,[e(P,{size:"small",type:"success",onClick:w},{default:t(()=>[u("选择任务")]),_:1}),i("div",Da,[e(S,null,{default:t(()=>[u("支持从已有的任务直接导入名单")]),_:1})])],512),[[be,n.value==="任务导入"]]),ce(i("div",null,[i("div",Ba,[e(X,{disabled:v.value,modelValue:s.value,"onUpdate:modelValue":_[4]||(_[4]=N=>s.value=N),placeholder:"请输入姓名"},{append:t(()=>[e(P,{onClick:p},{default:t(()=>[u(" 确定 ")]),_:1})]),_:1},8,["disabled","modelValue"])]),i("div",Pa,[e(S,null,{default:t(()=>[u("会自动判重,不会重复添加")]),_:1}),e(S,null,{default:t(()=>[u("大量名单优先推荐使用文件导入")]),_:1})])],512),[[be,n.value==="手动添加"]])]),i("div",La,[e(Te,{"label-width":"120px"},{default:t(()=>[e(ne,{label:"绑定表单项",style:{"margin-bottom":"6px"}},{default:t(()=>[e(X,{size:"small",modelValue:Z.value,"onUpdate:modelValue":_[5]||(_[5]=N=>Z.value=N),clearable:""},{append:t(()=>[e(P,{onClick:re},{default:t(()=>[u(" 确定 ")]),_:1})]),_:1},8,["modelValue"])]),_:1}),e(S,{style:{}},{default:t(()=>[u("和表单项同名字段,可以避免重复填写!!")]),_:1})]),_:1})])])):R("",!0),e(Qe,{fullscreen:ie.value,title:"提交情况",modelValue:c.value,"onUpdate:modelValue":_[8]||(_[8]=N=>c.value=N)},{default:t(()=>[i("div",Aa,[i("div",Oa,[e(P,{disabled:b.length===0,type:"success",size:"default",onClick:pe},{default:t(()=>[u("导出记录")]),_:1},8,["disabled"])]),i("div",Ka,[e(Re,{size:"default",modelValue:$.value,"onUpdate:modelValue":_[6]||(_[6]=N=>$.value=N),placeholder:"状态筛选"},{default:t(()=>[e(Ee,{label:"全部",value:"all"}),e(Ee,{label:"已提交",value:1}),e(Ee,{label:"未提交",value:0})]),_:1},8,["modelValue"])]),i("div",ja,[e(X,{size:"default",placeholder:"输入要查询的姓名",modelValue:F.value,"onUpdate:modelValue":_[7]||(_[7]=N=>F.value=N)},null,8,["modelValue"])]),i("div",Ha,[e(P,{type:"primary",size:"default",onClick:H},{default:t(()=>[u(L(k.value?"隐藏":"显示")+"详细提交情况 ",1)]),_:1})])]),i("div",Ya,[i("span",null,"共: "+L(z.value.length)+" 条数据",1),u(", "),i("span",null,"已提交: "+L(z.value.filter(N=>N.status).length),1),u(", "),i("span",null,"未提交: "+L(z.value.filter(N=>!N.status).length),1)]),i("div",Ra,[e(S,null,{default:t(()=>[u('"提交次数" 用户实际的提交次数')]),_:1}),e(S,null,{default:t(()=>[u('"现存数量" 还存在于服务器上的文件数 (不包含删除) --- 慢查询')]),_:1}),e(S,null,{default:t(()=>[u('"提交数量" 用户实际提交的文件数 (不包含撤回) --- 慢查询')]),_:1})]),ce((d(),D(_t,{"element-loading-text":"Loading...",stripe:"",border:"",data:z.value,height:"460px"},{default:t(()=>[e(me,{label:"序号",width:"60"},{default:t(N=>[i("div",Qa,L(N.$index+1),1)]),_:1}),e(me,{property:"name",label:"姓名"}),e(me,{label:"提交状态",width:"100"},{default:t(N=>[N.row.status?(d(),h("span",Ja,"已提交")):(d(),h("span",qa,"未提交"))]),_:1}),e(me,{property:"count",label:"提交次数",width:"94"}),e(me,{sortable:"",property:"lastDate",label:"最后操作时间",width:"120"}),k.value?(d(),h(ee,{key:0},[e(me,{property:"fileCount",label:"现存数量",width:"94"}),e(me,{sortable:"",property:"submitCount",label:"提交数量",width:"120"})],64)):R("",!0),e(me,{label:"操作",width:"100"},{default:t(N=>[e(P,{onClick:Gn=>A(N.row),type:"primary",text:"",size:"small"},{default:t(()=>[u("删除")]),_:2},1032,["onClick"])]),_:1})]),_:1},8,["data"])),[[ft,m.value]])]),_:1},8,["fullscreen","modelValue"]),e(Qe,{fullscreen:ie.value,title:"人员列表导入",modelValue:r.value,"onUpdate:modelValue":_[12]||(_[12]=N=>r.value=N)},{footer:t(()=>[i("span",Ga,[e(P,{onClick:_[11]||(_[11]=N=>r.value=!1)},{default:t(()=>[u("取 消")]),_:1}),e(P,{disabled:!l.taskValue,type:"primary",onClick:x},{default:t(()=>[u("确 定")]),_:1},8,["disabled"])])]),default:t(()=>[e(Te,{model:l,"label-width":"100px","label-position":"right"},{default:t(()=>[e(ne,{label:"任务"},{default:t(()=>[e(Re,{filterable:"",modelValue:l.taskValue,"onUpdate:modelValue":_[9]||(_[9]=N=>l.taskValue=N),placeholder:"请选择","no-data-text":"无可用任务"},{default:t(()=>[(d(!0),h(ee,null,le(l.taskList,N=>(d(),D(Ee,{key:N.taskKey,label:N.name,value:N.taskKey},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),e(S,null,{default:t(()=>[u(L(M.value),1)]),_:1}),e(ne,{label:"任务"},{default:t(()=>[e(G,{modelValue:l.type,"onUpdate:modelValue":_[10]||(_[10]=N=>l.type=N)},{default:t(()=>[e(Je,{label:"override"},{default:t(()=>[u("覆盖导入")]),_:1}),e(Je,{label:"add"},{default:t(()=>[u("追加导入")]),_:1})]),_:1},8,["modelValue"])]),_:1}),e(S,null,{default:t(()=>[u(L(l.type==="override"?"“覆盖导入” 将会覆盖原来的数据":"“追加导入” 将只会导入不存在数据"),1)]),_:1})]),_:1},8,["model"])]),_:1},8,["fullscreen","modelValue"])])}}});const Za=ve(Wa,[["__scopeId","data-v-325c5841"]]),Xa=Q({name:"templatePanel",props:{value:{type:String,default:""},k:{type:String,default:""}},setup(o){const a=I();we(()=>{o.value?a.value=o.value:a.value=""});const n=I(0),s=()=>{a.value&&(oe(o.k,{template:""}),a.value="",n.value=0)},v=I([]),p=I(),k=()=>{U.error("只能选择一个文件,可删除后重新选择")},f=()=>{p.value.clearFiles()};return{template:a,deleteTemplate:s,fileList:v,handleExceedFile:k,clearFiles:f,submitUploadPeople:()=>{v.value.forEach(c=>{if(!o.k)return;const{name:b}=c,$="easypicker2/".concat(o.k,"_template/").concat(b);c.status==="ready"&&(c.status="uploading",st.getUploadToken().then(F=>{ut(F.data.token,c.raw,$,{success(){U.success("上传成功"),oe(o.k,{template:b}),f(),a.value=b,c.status="success"},process(j){c.percentage=~~j}})}))})},elUpload:p,percentage:n}},components:{Tip:S}});const en=o=>(Me("data-v-77b4c9c1"),o=o(),Fe(),o),tn={class:"tc info-panel"},ln={class:"p10"},an={key:1,class:"upload-file"},nn=en(()=>i("div",{class:"el-upload__tip"},"选择模板文件,然后点击上传",-1));function on(o,a,n,s,v,p){const k=Ae("tip"),f=se,C=He;return d(),h("div",tn,[e(k,{imgs:["https://img.cdn.sugarat.top/mdImg/MTY1MDE4MjY3MjUxNw==650182672517"]},{default:t(()=>[u("设置的模板文件,可供用户在提交页下载。")]),_:1},8,["imgs"]),o.template?(d(),D(f,{key:0,disabled:!o.template,onClick:o.deleteTemplate,size:"default",round:"",type:"danger"},{default:t(()=>[u("删除")]),_:1},8,["disabled","onClick"])):R("",!0),i("div",ln,L(o.template||"尚未设置模板文件"),1),o.template?R("",!0):(d(),h("div",an,[e(C,{action:"",ref:"elUpload","on-exceed":o.handleExceedFile,"on-remove":o.clearFiles,"auto-upload":!1,limit:1,"file-list":o.fileList,"onUpdate:fileList":a[0]||(a[0]=c=>o.fileList=c)},{trigger:t(()=>[e(f,{size:"small",type:"primary"},{default:t(()=>[u("选取文件")]),_:1})]),tip:t(()=>[nn]),default:t(()=>[e(f,{onClick:o.submitUploadPeople,style:{"margin-left":"10px"},size:"small",type:"success"},{default:t(()=>[u("设为模板")]),_:1},8,["onClick"])]),_:1},8,["on-exceed","on-remove","file-list"])]))])}const sn=ve(Xa,[["render",on],["__scopeId","data-v-77b4c9c1"]]),un=o=>(Me("data-v-3fba454a"),o=o(),Fe(),o),rn={class:"tc"},dn={class:"auto-format"},cn=un(()=>i("span",null,"文件自动重命名:",-1)),pn={key:0,style:{"margin-bottom":"10px"}},mn={style:{color:"#409eff"}},_n={key:1,style:{"margin-bottom":"10px"}},fn={class:"form-wrapper"},vn={class:"flex fc fac"},gn={class:"num-wrapper"},yn={class:"form-item-wrapper"},hn={key:0,class:"radio-list"},kn={class:"form-item-wrapper"},bn={key:3,class:"p10"},$n={class:"p10"},wn={key:4,style:{color:"red"}},Vn={class:"info-panel"},Cn={class:"dialog-footer"},xn=Q({__name:"info",props:{rewrite:{type:Number,default:0},info:{typs:String,default:"[]"},k:{type:String,default:""},format:{type:String,default:"",required:!1}},setup(o){const a=o;ot(l=>({ddfb70e2:ue.value}));const n=W(it()),s=I(!1),v=W([{label:"输入框",value:"input"},{label:"固定内容",value:"text"},{label:"单选框",value:"radio"},{label:"下拉选择",value:"select"}]),p=l=>{var r;return(r=v.find(w=>w.value===l))==null?void 0:r.label},k=I("input"),f=+"14",C=I(!1),c=W([]),b=I(!1),$=O(()=>c.length<10&&!s.value);Se(()=>a.info,()=>{c.splice(0,c.length),k.value="input",s.value=!1,c.push(...We(a.info)),b.value=!1},{immediate:!0});const F=O(()=>"".concat(c.map(l=>l.text).join(n.splitChar),".后缀"));we(()=>{C.value=!!a.rewrite});const j=l=>{oe(a.k,{rewrite:+l})},z=(l,r)=>{const w=l||c,M=r||k.value,x={text:"标题".concat(w.length+1),type:M,value:""};(M==="radio"||M==="select")&&(x.children=[{text:"选项1"},{text:"选项2"}]),w.push(x),b.value=!0},m=(l,r,w=1)=>{const M=r||c;M.length<=w||(M.splice(l,1),b.value=!0)},T=l=>l.every(r=>r.text.trim()&&T(r.children||[])),H=()=>{if(!T(c)){U.error("请完整填写表单信息"),setTimeout(()=>{U.warning("不能有空项")},100);return}oe(a.k,{info:JSON.stringify(c.map(l=>(l.type==="text"&&(l.value=l.text),l)))}),b.value=!1},B=l=>{if(l===0)return;const r=c[l-1];c.splice(l-1,1),c.splice(l,0,r)},A=W({taskList:[],taskValue:""}),Y=I(!1),K=async()=>{var w;const l=a.k,{data:r}=await Ie.getUsefulTemplate(l);A.taskList=r,A.taskValue=((w=r[0])==null?void 0:w.taskKey)||"",Y.value=!0},E=()=>{const l=A.taskList.find(r=>r.taskKey===A.taskValue).info;c.splice(0,c.length),c.push(...We(l)),Y.value=!1,b.value=!0},J=xe(),ae=O(()=>J.getters["public/isMobile"]),ue=O(()=>ae.value?"0 0 auto":.5),pe=()=>{De.alert("<p>固定内容主要用于重命名中,固定的部分,如“活动名”,“班级名”</p><p>如要设置注意事项,请使用 <strong>批注</strong> 功能</p>","注意事项",{dangerouslyUseHTMLString:!0})},ge=()=>{oe(a.k,{format:JSON.stringify(n)})},ie=W(["-","+","_"]);return we(()=>{a.format!==null&&Object.assign(n,rt(a.format))}),(l,r)=>{const w=pt,M=ze,x=Ue,q=$e,Z=_e,re=Ke,V=je,_=se,P=Oe;return d(),h("div",rn,[e(S,{imgs:["https://img.cdn.sugarat.top/mdImg/MTY1MDE4MzM3NjUyNg==650183376526","https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjU2ODcyNg==651496568726"]},{default:t(()=>[u("上传文件必填表单信息")]),_:1},8,["imgs"]),i("div",dn,[cn,e(w,{style:{display:"block"},modelValue:C.value,"onUpdate:modelValue":r[0]||(r[0]=g=>C.value=g),"active-color":"#13ce66","inactive-color":"#ff4949","active-text":"开",onChange:j,"inactive-text":"关"},null,8,["modelValue"])]),C.value?(d(),h("div",pn,[u(" 预期格式: "),i("span",mn,L(F.value),1)])):R("",!0),C.value?(d(),h("div",_n,[u(" 分割符: "),e(x,{onChange:ge,modelValue:n.splitChar,"onUpdate:modelValue":r[1]||(r[1]=g=>n.splitChar=g),placeholder:"分隔符",style:{width:"60px"},size:"small"},{default:t(()=>[(d(!0),h(ee,null,le(ie,g=>(d(),D(M,{key:g,label:g,value:g},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])):R("",!0),C.value?(d(),D(S,{key:2,style:{color:"red"}},{default:t(()=>[u("开启自动重命名后,重点关注文件名格式是否符合预期")]),_:1})):R("",!0),i("div",null,[u(" 预览 "),e(w,{modelValue:s.value,"onUpdate:modelValue":r[2]||(r[2]=g=>s.value=g),"inline-prompt":"","active-text":"是","inactive-text":"否","active-color":"#13ce66","inactive-color":"#ff4949"},null,8,["modelValue"])]),i("div",fn,[s.value?(d(),D(At,{key:0,infos:c,disabled:s.value},null,8,["infos","disabled"])):(d(),D(V,{key:1,"label-width":"100px"},{default:t(()=>[(d(!0),h(ee,null,le(c,(g,G)=>(d(),D(re,{key:G},{label:t(()=>[i("div",vn,[i("div",gn,[i("div",null,L(G+1),1)]),i("div",{class:he(["form-item-type",g.type])},L(p(g.type)),3)])]),default:t(()=>[e(Z,{placeholder:"输入内容",modelValue:g.text,"onUpdate:modelValue":te=>g.text=te,maxlength:y(f),clearable:"","show-word-limit":""},{append:t(()=>[i("div",yn,[e(q,{color:c.length>1?"red":"grey",onClick:te=>m(G)},{default:t(()=>[e(y(Xe))]),_:2},1032,["color","onClick"]),G>0?(d(),D(q,{key:0,color:"#000",style:{"margin-left":"6px"},onClick:te=>B(G)},{default:t(()=>[e(y(ta))]),_:2},1032,["onClick"])):R("",!0)])]),_:2},1032,["modelValue","onUpdate:modelValue","maxlength"]),g.type==="radio"||g.type==="select"?(d(),h("div",hn,[(d(!0),h(ee,null,le(g.children,(te,X)=>(d(),D(Z,{size:"small",key:X,placeholder:"输入内容",modelValue:te.text,"onUpdate:modelValue":ne=>te.text=ne,maxlength:y(f),clearable:"","show-word-limit":""},{append:t(()=>[i("div",kn,[e(q,{color:g.children.length>2?"red":"grey",onClick:ne=>m(X,g.children,2)},{default:t(()=>[e(y(Xe))]),_:2},1032,["color","onClick"]),X+1===g.children.length?(d(),D(q,{key:0,style:{"margin-left":"10px"},color:"#67C23A",onClick:ne=>z(g.children,g.type)},{default:t(()=>[e(y(hl))]),_:2},1032,["onClick"])):R("",!0)])]),_:2},1032,["modelValue","onUpdate:modelValue","maxlength"]))),128))])):R("",!0)]),_:2},1024))),128))]),_:1}))]),$.value?(d(),h("div",bn,[e(_,{size:"small",type:"primary",onClick:r[3]||(r[3]=()=>{z()}),round:""},{default:t(()=>[u("添加一项")]),_:1}),e(x,{style:{margin:"0 10px"},size:"small",modelValue:k.value,"onUpdate:modelValue":r[4]||(r[4]=g=>k.value=g),placeholder:"选择添加的类型"},{default:t(()=>[(d(!0),h(ee,null,le(v,(g,G)=>(d(),D(M,{key:G,label:g.label,value:g.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),e(_,{type:"primary",text:"",onClick:pe},{default:t(()=>[u("提示❓")]),_:1})])):R("",!0),e(_,{size:"small",type:"warning",onClick:K},{default:t(()=>[u("从其它任务导入")]),_:1}),i("div",$n,[e(S,null,{default:t(()=>[u("支持从已有的任务直接导入表单信息")]),_:1}),e(_,{type:"success",onClick:H,style:{width:"200px"}},{default:t(()=>[u("保存")]),_:1})]),b.value?(d(),h("div",wn,"有变动,请记得点击保存")):R("",!0),i("div",Vn,[e(P,{fullscreen:ae.value,title:"表单信息导入",modelValue:Y.value,"onUpdate:modelValue":r[7]||(r[7]=g=>Y.value=g)},{footer:t(()=>[i("span",Cn,[e(_,{onClick:r[6]||(r[6]=g=>Y.value=!1)},{default:t(()=>[u("取 消")]),_:1}),e(_,{disabled:!A.taskValue,type:"primary",onClick:E},{default:t(()=>[u("确 定 ")]),_:1},8,["disabled"])])]),default:t(()=>[e(V,{model:A,"label-width":"100px","label-position":"right"},{default:t(()=>[e(re,{label:"任务"},{default:t(()=>[e(x,{filterable:"",modelValue:A.taskValue,"onUpdate:modelValue":r[5]||(r[5]=g=>A.taskValue=g),placeholder:"请选择","no-data-text":"无可用任务"},{default:t(()=>[(d(!0),h(ee,null,le(A.taskList,g=>(d(),D(M,{key:g.taskKey,label:g.name,value:g.taskKey},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),e(S,null,{default:t(()=>[u(L(A.taskValue?"":"无可用任务"),1)]),_:1})]),_:1},8,["model"])]),_:1},8,["fullscreen","modelValue"])])])}}});const In=ve(xn,[["__scopeId","data-v-3fba454a"]]),Tn={class:"tc ddl"},En={class:"tc flex fc fac"},Nn={class:"p10"},Sn=Q({__name:"tipInfo",props:{tip:{type:String,default:"",required:!1},k:{type:String,default:""}},setup(o){const a=o,n=I(""),s=W({text:"",imgs:[]}),v=I(3),p=I([]),k=O(()=>p.value.map(m=>m.preview||m.url)),f=I(0);Se(()=>a.tip,()=>{try{const m=JSON.parse(a.tip);s.imgs=m.imgs,s.text=m.text||"",p.value=s.imgs.map(T=>({...T,url:"https://img.cdn.sugarat.top/mdImg/MTY3NzkxMDI1NTU1Nw==20140524124237518.gif"})),p.value.length&&St.getTipImageUrl(a.k,p.value.map(T=>({uid:T.uid,name:T.name}))).then(T=>{T.data.forEach((H,B)=>{p.value[B].url=H.cover,Object.assign(p.value[B],{preview:H.preview})})})}catch(m){s.text=a.tip||"",s.imgs=[],p.value=[]}s.text?n.value=s.text:n.value=""},{immediate:!0});const C=O(()=>s.text!==n.value),c=(m=!0)=>{s.text!==n.value&&(s.text=n.value),oe(a.k,{tip:JSON.stringify(s)},m)},b=I(!1),$=m=>{if(!a.k)return;const{name:T,uid:H}=m,B=Mt(a.k,T,H);m.status==="ready"&&(m.status="success",st.getUploadToken().then(A=>{ut(A.data.token,m.raw,B,{success(){s.imgs.push({uid:H,name:T}),c()}})}))},F=m=>{const{uid:T,name:H}=m,B=s.imgs.findIndex(A=>A.uid===T);s.imgs.splice(B,1),c(),Ie.delTipImage(a.k,T,H)},j=m=>{b.value=!0;const T=p.value.findIndex(H=>H.uid===m.uid);f.value=T},z=()=>{U.error("只能选择".concat(v.value,"个图片,可删除后重新选择"))};return(m,T)=>{const H=_e,B=se,A=$e,Y=He,K=Ht;return d(),h("div",Tn,[e(S,{imgs:["https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjI2OTI0MQ==651496269241"]},{default:t(()=>[u("设置注意事项,供用户提交时查看")]),_:1},8,["imgs"]),e(S,null,{default:t(()=>[u("注意控制字数和换行,避免展示异常,建议内容不超过5行")]),_:1}),i("div",En,[e(H,{modelValue:n.value,"onUpdate:modelValue":T[0]||(T[0]=E=>n.value=E),rows:5,clearable:"",max:500,"show-word-limit":"",type:"textarea",placeholder:"请输入要展示的批注信息"},null,8,["modelValue"])]),i("div",Nn,[e(B,{size:"default",onClick:c,type:"success"},{default:t(()=>[u("保存")]),_:1}),e(B,{size:"default",onClick:T[1]||(T[1]=E=>n.value=""),type:"danger"},{default:t(()=>[u("清空")]),_:1})]),C.value?(d(),D(S,{key:0},{default:t(()=>[u(" 有变动记得保存 ")]),_:1})):R("",!0),e(S,null,{default:t(()=>[u(" 可以设置图片啦↓ 最多3张 ")]),_:1}),e(Y,{accept:"image/*",limit:v.value,"file-list":p.value,"onUpdate:fileList":T[2]||(T[2]=E=>p.value=E),action:"",ref:"imgUpload","list-type":"picture-card","on-change":$,"on-exceed":z,"on-preview":j,"on-remove":F,"auto-upload":!1},{default:t(()=>[e(A,null,{default:t(()=>[e(y(jl))]),_:1})]),_:1},8,["limit","file-list"]),b.value?(d(),D(K,{key:1,"hide-on-click-modal":"","initial-index":f.value,"url-list":k.value,onClose:T[3]||(T[3]=E=>b.value=!1),teleported:""},null,8,["initial-index","url-list"])):R("",!0)])}}});const Ye=o=>(Me("data-v-28b884c6"),o=o(),Fe(),o),Mn={class:"tc"},Fn={class:"tc"},zn={style:{"max-width":"300px",margin:"0 auto"}},Un=Ye(()=>i("div",{class:"split-line"},null,-1)),Dn={class:"tc"},Bn=Ye(()=>i("div",{class:"split-line"},null,-1)),Pn={class:"tc"},Ln=Ye(()=>i("div",{class:"split-line"},null,-1)),An=Q({__name:"file",props:{format:{type:String,default:"",required:!1},k:{type:String,default:""}},setup(o){const a=o,n=W(it()),s=I(""),v=()=>{oe(a.k,{format:JSON.stringify(n)})},p=z=>{n.status=!!z,v()},k=()=>{const z=s.value.split(",");for(const m of z)if(n.format.includes(m)){U.error("".concat(m," 已存在"));return}n.format.push(...z),v(),s.value=""},f=z=>{n.format.splice(z,1),v()},C=()=>{dt(n.format.join(","))},c=z=>{n.limit=z,v()},b=I(0),$=W(["B","KB","MB","GB"]),F=()=>{const z=$.findIndex(m=>m===n.sizeUnit);n.size=b.value*1024**z,v()},j=z=>{b.value=z;const m=$.findIndex(T=>T===n.sizeUnit);n.size=b.value*1024**m,v()};return we(()=>{a.format!==null&&Object.assign(n,rt(a.format))}),(z,m)=>{const T=pt,H=se,B=_e,A=ct,Y=il,K=ze,E=Ue;return d(),h("div",Mn,[e(S,{class:"title"},{default:t(()=>[u(" ↓下方设置允许提交的文件类型↓ ")]),_:1}),e(S,null,{default:t(()=>[u("暂时只支持通过文件名后缀进行卡控,后续根据反馈再优化")]),_:1}),e(S,null,{default:t(()=>[u("例如:txt,png,jpeg,webp")]),_:1}),i("div",Fn,[e(T,{"active-text":"限制文件类型","inactive-text":"不限制文件类型",onChange:p,value:n.status,style:{"--el-switch-on-color":"#13ce66","--el-switch-off-color":"#ff4949"}},null,8,["value"])]),ce(i("div",null,[e(S,null,{default:t(()=>[u('支持英文逗号","分割,一次添加多个')]),_:1}),i("div",zn,[e(B,{modelValue:s.value,"onUpdate:modelValue":m[0]||(m[0]=J=>s.value=J),placeholder:"请输入文件类型(省略.)"},{append:t(()=>[e(H,{onClick:k},{default:t(()=>[u(" 确定 ")]),_:1})]),_:1},8,["modelValue"])]),(d(!0),h(ee,null,le(n.format,(J,ae)=>(d(),D(A,{key:ae,class:"type",closable:"","disable-transitions":!1,onClose:ue=>f(ae)},{default:t(()=>[u(L(J),1)]),_:2},1032,["onClose"]))),128)),ce(e(S,null,{default:t(()=>[u("已添加: "),i("span",null,L(n.format.join(",")),1),e(H,{type:"primary",text:"",size:"small",onClick:C},{default:t(()=>[u("一键复制")]),_:1})]),_:1},512),[[be,n.format.length]])],512),[[be,n.status]]),Un,e(S,{class:"title"},{default:t(()=>[u("↓下方设置最大同时提交文件数量(16 >= x >=1 默认 10)↓")]),_:1}),i("div",Dn,[e(Y,{"model-value":n.limit,min:1,max:16,onChange:c},null,8,["model-value"])]),Bn,e(S,{class:"title"},{default:t(()=>[u(" ↓下方设置文件最大的大小↓ ")]),_:1}),e(S,null,{default:t(()=>[u("1024B = 1KB, 1024KB = 1MB, 1024MB = 1GB")]),_:1}),e(S,null,{default:t(()=>[u("0表示不限制")]),_:1}),i("div",Pn,[e(Y,{"model-value":b.value,min:0,max:1024,onChange:j},null,8,["model-value"]),e(E,{onChange:F,modelValue:n.sizeUnit,"onUpdate:modelValue":m[1]||(m[1]=J=>n.sizeUnit=J),placeholder:"单位",style:{width:"100px"}},{default:t(()=>[(d(!0),h(ee,null,le($,J=>(d(),D(K,{key:J,label:J,value:J},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),Ln,e(S,{style:at(n.size===0?"color:grey":"color:red")},{default:t(()=>[u(L(n.size===0?"不限制大小":"限制为不超过: ".concat(y(Ft)(n.size))),1)]),_:1},8,["style"])])}}});const On=ve(An,[["__scopeId","data-v-28b884c6"]]),Kn={class:"tasks"},jn={class:"categorys-area"},Hn={class:"panel task-panel"},Yn={class:"task-list"},Rn={class:"dialog-footer"},Qn={class:"tc",style:{"font-size":"14px",color:"#9e9e9e"}},Jn={style:{color:"#000000"}},qn=Q({__name:"index",setup(o){const a=xe(),n=O(()=>a.getters["public/isMobile"]),s=O(()=>a.state.category.categoryList),v=I("default"),p=O(()=>a.state.task.taskList),k=O(()=>p.value.filter(E=>E.category===v.value)),f=(K,E=!1)=>{K&&De.confirm("确认删除此任务吗?",E?"!!回收站的删除后无法再恢复":"数据无价,请谨慎操作",{confirmButtonText:"确定",cancelButtonText:"取消",type:E?"error":"info"}).then(()=>{a.dispatch("task/deleteTask",K).then(()=>{U.success("删除成功")})}).catch(()=>{U.info("取消删除")})},C=I(!1),c=W({name:"",category:"",key:""}),b=K=>{c.name=K.name,c.category=K.category,c.key=K.key,C.value=!0},$=()=>{if(C.value=!1,!c.name.trim()){U.warning("不能为空");return}a.dispatch("task/updateTask",c).then(()=>{U.success("更新成功")})},F=I(""),j=I(!1),z=K=>{F.value="default";const{origin:E}=window.location;F.value="".concat(E,"/task/").concat(K),dt(F.value,"收集链接已自动复制到粘贴板"),j.value=!0},m=W({}),T=I(!1),H=I("info"),B=W({category:"",key:"",name:"",recentLog:[]}),A=K=>{Object.assign(B,K),Ie.getTaskMoreInfo(K.key).then(E=>{m.info="[]",m.ddl="",m.tip="",m.format="",m.bindField="",setTimeout(()=>{Object.assign(m,E.data),T.value=!0})})};Le(()=>{a.dispatch("category/getCategory"),a.dispatch("task/getTask")});const Y=()=>{window.open("/task/".concat(B.key))};return(K,E)=>{const J=Dt,ae=_e,ue=Ke,pe=ze,ge=Ue,ie=je,l=se,r=Oe,w=zt,M=Ut;return d(),h("div",Kn,[i("div",jn,[e(pa,{category:v.value,"onUpdate:category":E[0]||(E[0]=x=>v.value=x)},null,8,["category"])]),i("div",Hn,[e(va,{activeCategoryKey:v.value},null,8,["activeCategoryKey"]),i("div",Yn,[(d(!0),h(ee,null,le(k.value,x=>(d(),D(Ia,{onEdit:b,onDelete:f,onShare:z,onMore:A,key:x.key,item:x},null,8,["item"]))),128)),k.value.length===0?(d(),D(J,{key:0,description:"此分类下没有任务哟,快去创建吧"})):R("",!0)])]),e(r,{draggable:"",fullscreen:n.value,title:"基本信息修改",modelValue:C.value,"onUpdate:modelValue":E[4]||(E[4]=x=>C.value=x)},{footer:t(()=>[i("span",Rn,[e(l,{onClick:E[3]||(E[3]=x=>C.value=!1)},{default:t(()=>[u("取 消")]),_:1}),e(l,{type:"primary",onClick:$},{default:t(()=>[u("确 定")]),_:1})])]),default:t(()=>[e(ie,{model:c},{default:t(()=>[e(ue,{label:"任务名称","label-width":"100px"},{default:t(()=>[e(ae,{modelValue:c.name,"onUpdate:modelValue":E[1]||(E[1]=x=>c.name=x),autocomplete:"off"},null,8,["modelValue"])]),_:1}),e(ue,{label:"新的分类","label-width":"100px"},{default:t(()=>[e(ge,{modelValue:c.category,"onUpdate:modelValue":E[2]||(E[2]=x=>c.category=x),placeholder:"请选择新分类"},{default:t(()=>[e(pe,{label:"默认",value:"default"}),(d(!0),h(ee,null,le(s.value,x=>(d(),D(pe,{key:x.k,label:x.name,value:x.k},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["fullscreen","modelValue"]),e(Ot,{value:j.value,"onUpdate:value":E[5]||(E[5]=x=>j.value=x),download:!1,title:"收取链接",link:F.value},null,8,["value","link"]),e(r,{fullscreen:n.value,title:"更多设置",modelValue:T.value,"onUpdate:modelValue":E[7]||(E[7]=x=>T.value=x),center:""},{default:t(()=>[i("div",null,[i("h3",Qn,[u(" 任务名:"),i("strong",Jn,L(B.name),1),u(", "),e(l,{type:"primary",text:"",onClick:Y},{default:t(()=>[u("去查看效果")]),_:1})]),e(M,{modelValue:H.value,"onUpdate:modelValue":E[6]||(E[6]=x=>H.value=x)},{default:t(()=>[e(w,{label:"截止日期",name:"ddl"},{default:t(()=>[e(Sa,{ddl:m.ddl,k:B.key},null,8,["ddl","k"])]),_:1}),e(w,{label:"批注信息",name:"tip"},{default:t(()=>[e(Sn,{rewrite:m.rewrite,tip:m.tip,k:B.key},null,8,["rewrite","tip","k"])]),_:1}),e(w,{label:"限制名单",name:"people"},{default:t(()=>[e(Za,{name:B.name,value:m.people,k:B.key,field:m.bindField},null,8,["name","value","k","field"])]),_:1}),e(w,{label:"必填信息",name:"info"},{default:t(()=>[e(In,{rewrite:m.rewrite,info:m.info,k:B.key,format:m.format},null,8,["rewrite","info","k","format"])]),_:1}),e(w,{label:"模板文件",name:"template"},{default:t(()=>[e(sn,{value:m.template,k:B.key},null,8,["value","k"])]),_:1}),e(w,{label:"文件属性",name:"attr"},{default:t(()=>[e(On,{format:m.format,k:B.key},null,8,["format","k"])]),_:1})]),_:1},8,["modelValue"])])]),_:1},8,["fullscreen","modelValue"])])}}});const vo=ve(qn,[["__scopeId","data-v-a447a8ef"]]);export{vo as default};
2
+ //# sourceMappingURL=index-1bd2cd2e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-1bd2cd2e.js","sources":["../../node_modules/.pnpm/element-plus@2.2.13_vue@3.3.4/node_modules/element-plus/es/components/card/src/card.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.3.4/node_modules/element-plus/es/components/card/src/card2.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.3.4/node_modules/element-plus/es/components/card/index.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.3.4/node_modules/element-plus/es/components/input-number/src/input-number.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.3.4/node_modules/element-plus/es/components/input-number/src/input-number2.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.3.4/node_modules/element-plus/es/components/input-number/index.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.3.4/node_modules/@element-plus/icons-vue/dist/es/circle-close-filled.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.3.4/node_modules/@element-plus/icons-vue/dist/es/circle-plus-filled.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.3.4/node_modules/@element-plus/icons-vue/dist/es/delete.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.3.4/node_modules/@element-plus/icons-vue/dist/es/edit.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.3.4/node_modules/@element-plus/icons-vue/dist/es/menu.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.3.4/node_modules/@element-plus/icons-vue/dist/es/plus.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.3.4/node_modules/@element-plus/icons-vue/dist/es/share.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.3.4/node_modules/@element-plus/icons-vue/dist/es/top.mjs","../../src/pages/dashboard/tasks/components/CategoryPanel.vue","../../src/pages/dashboard/tasks/components/CreateTask.vue","../../src/pages/dashboard/tasks/public.ts","../../src/pages/dashboard/tasks/components/infoPanel/ddl.vue","../../src/pages/dashboard/tasks/components/infoPanel/people.vue","../../src/pages/dashboard/tasks/components/infoPanel/template.vue","../../src/pages/dashboard/tasks/components/infoPanel/info.vue","../../src/pages/dashboard/tasks/components/infoPanel/tipInfo.vue","../../src/pages/dashboard/tasks/components/infoPanel/file.vue","../../src/pages/dashboard/tasks/index.vue"],"sourcesContent":["import '../../../utils/index.mjs';\nimport { buildProps, definePropType } from '../../../utils/vue/props/runtime.mjs';\n\nconst cardProps = buildProps({\n header: {\n type: String,\n default: \"\"\n },\n bodyStyle: {\n type: definePropType([String, Object, Array]),\n default: \"\"\n },\n shadow: {\n type: String,\n values: [\"always\", \"hover\", \"never\"],\n default: \"always\"\n }\n});\n\nexport { cardProps };\n//# sourceMappingURL=card.mjs.map\n","import { defineComponent, openBlock, createElementBlock, normalizeClass, unref, renderSlot, createTextVNode, toDisplayString, createCommentVNode, createElementVNode, normalizeStyle } from 'vue';\nimport '../../../hooks/index.mjs';\nimport { cardProps } from './card.mjs';\nimport _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\n\nconst __default__ = {\n name: \"ElCard\"\n};\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...__default__,\n props: cardProps,\n setup(__props) {\n const ns = useNamespace(\"card\");\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([unref(ns).b(), unref(ns).is(`${_ctx.shadow}-shadow`)])\n }, [\n _ctx.$slots.header || _ctx.header ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n class: normalizeClass(unref(ns).e(\"header\"))\n }, [\n renderSlot(_ctx.$slots, \"header\", {}, () => [\n createTextVNode(toDisplayString(_ctx.header), 1)\n ])\n ], 2)) : createCommentVNode(\"v-if\", true),\n createElementVNode(\"div\", {\n class: normalizeClass(unref(ns).e(\"body\")),\n style: normalizeStyle(_ctx.bodyStyle)\n }, [\n renderSlot(_ctx.$slots, \"default\")\n ], 6)\n ], 2);\n };\n }\n});\nvar Card = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__file\", \"/home/runner/work/element-plus/element-plus/packages/components/card/src/card.vue\"]]);\n\nexport { Card as default };\n//# sourceMappingURL=card2.mjs.map\n","import '../../utils/index.mjs';\nimport Card from './src/card2.mjs';\nexport { cardProps } from './src/card.mjs';\nimport { withInstall } from '../../utils/vue/install.mjs';\n\nconst ElCard = withInstall(Card);\n\nexport { ElCard, ElCard as default };\n//# sourceMappingURL=index.mjs.map\n","import { isNil } from 'lodash-unified';\nimport '../../../hooks/index.mjs';\nimport '../../../utils/index.mjs';\nimport '../../../constants/index.mjs';\nimport { buildProps } from '../../../utils/vue/props/runtime.mjs';\nimport { useSizeProp } from '../../../hooks/use-common-props/index.mjs';\nimport { isNumber } from '@vueuse/core';\nimport { CHANGE_EVENT, INPUT_EVENT, UPDATE_MODEL_EVENT } from '../../../constants/event.mjs';\n\nconst inputNumberProps = buildProps({\n id: {\n type: String,\n default: void 0\n },\n step: {\n type: Number,\n default: 1\n },\n stepStrictly: Boolean,\n max: {\n type: Number,\n default: Number.POSITIVE_INFINITY\n },\n min: {\n type: Number,\n default: Number.NEGATIVE_INFINITY\n },\n modelValue: Number,\n disabled: Boolean,\n size: useSizeProp,\n controls: {\n type: Boolean,\n default: true\n },\n controlsPosition: {\n type: String,\n default: \"\",\n values: [\"\", \"right\"]\n },\n valueOnClear: {\n type: [String, Number, null],\n validator: (val) => val === null || isNumber(val) || [\"min\", \"max\"].includes(val),\n default: null\n },\n name: String,\n label: String,\n placeholder: String,\n precision: {\n type: Number,\n validator: (val) => val >= 0 && val === Number.parseInt(`${val}`, 10)\n },\n validateEvent: {\n type: Boolean,\n default: true\n }\n});\nconst inputNumberEmits = {\n [CHANGE_EVENT]: (prev, cur) => prev !== cur,\n blur: (e) => e instanceof FocusEvent,\n focus: (e) => e instanceof FocusEvent,\n [INPUT_EVENT]: (val) => isNumber(val) || isNil(val),\n [UPDATE_MODEL_EVENT]: (val) => isNumber(val) || isNil(val)\n};\n\nexport { inputNumberEmits, inputNumberProps };\n//# sourceMappingURL=input-number.mjs.map\n","import { defineComponent, ref, reactive, computed, watch, onMounted, onUpdated, openBlock, createElementBlock, normalizeClass, unref, withModifiers, withDirectives, withKeys, createVNode, withCtx, createBlock, createCommentVNode } from 'vue';\nimport { isNil } from 'lodash-unified';\nimport { ElInput } from '../../input/index.mjs';\nimport { ElIcon } from '../../icon/index.mjs';\nimport '../../../directives/index.mjs';\nimport '../../../hooks/index.mjs';\nimport '../../../utils/index.mjs';\nimport { ArrowDown, Minus, ArrowUp, Plus } from '@element-plus/icons-vue';\nimport { inputNumberProps, inputNumberEmits } from './input-number.mjs';\nimport _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';\nimport { useLocale } from '../../../hooks/use-locale/index.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\nimport { useFormItem } from '../../../hooks/use-form-item/index.mjs';\nimport { isNumber } from '@vueuse/core';\nimport { isUndefined } from '../../../utils/types.mjs';\nimport { debugWarn } from '../../../utils/error.mjs';\nimport { useSize, useDisabled } from '../../../hooks/use-common-props/index.mjs';\nimport { isString } from '@vue/shared';\nimport RepeatClick from '../../../directives/repeat-click/index.mjs';\n\nconst _hoisted_1 = [\"aria-label\", \"onKeydown\"];\nconst _hoisted_2 = [\"aria-label\", \"onKeydown\"];\nconst __default__ = {\n name: \"ElInputNumber\"\n};\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...__default__,\n props: inputNumberProps,\n emits: inputNumberEmits,\n setup(__props, { expose, emit }) {\n const props = __props;\n const { t } = useLocale();\n const ns = useNamespace(\"input-number\");\n const input = ref();\n const data = reactive({\n currentValue: props.modelValue,\n userInput: null\n });\n const { formItem } = useFormItem();\n const minDisabled = computed(() => isNumber(props.modelValue) && ensurePrecision(props.modelValue, -1) < props.min);\n const maxDisabled = computed(() => isNumber(props.modelValue) && ensurePrecision(props.modelValue) > props.max);\n const numPrecision = computed(() => {\n const stepPrecision = getPrecision(props.step);\n if (!isUndefined(props.precision)) {\n if (stepPrecision > props.precision) {\n debugWarn(\"InputNumber\", \"precision should not be less than the decimal places of step\");\n }\n return props.precision;\n } else {\n return Math.max(getPrecision(props.modelValue), stepPrecision);\n }\n });\n const controlsAtRight = computed(() => {\n return props.controls && props.controlsPosition === \"right\";\n });\n const inputNumberSize = useSize();\n const inputNumberDisabled = useDisabled();\n const displayValue = computed(() => {\n if (data.userInput !== null) {\n return data.userInput;\n }\n let currentValue = data.currentValue;\n if (isNil(currentValue))\n return \"\";\n if (isNumber(currentValue)) {\n if (Number.isNaN(currentValue))\n return \"\";\n if (!isUndefined(props.precision)) {\n currentValue = currentValue.toFixed(props.precision);\n }\n }\n return currentValue;\n });\n const toPrecision = (num, pre) => {\n if (isUndefined(pre))\n pre = numPrecision.value;\n if (pre === 0)\n return Math.round(num);\n let snum = String(num);\n const pointPos = snum.indexOf(\".\");\n if (pointPos === -1)\n return num;\n const nums = snum.replace(\".\", \"\").split(\"\");\n const datum = nums[pointPos + pre];\n if (!datum)\n return num;\n const length = snum.length;\n if (snum.charAt(length - 1) === \"5\") {\n snum = `${snum.slice(0, Math.max(0, length - 1))}6`;\n }\n return Number.parseFloat(Number(snum).toFixed(pre));\n };\n const getPrecision = (value) => {\n if (isNil(value))\n return 0;\n const valueString = value.toString();\n const dotPosition = valueString.indexOf(\".\");\n let precision = 0;\n if (dotPosition !== -1) {\n precision = valueString.length - dotPosition - 1;\n }\n return precision;\n };\n const ensurePrecision = (val, coefficient = 1) => {\n if (!isNumber(val))\n return data.currentValue;\n return toPrecision(val + props.step * coefficient);\n };\n const increase = () => {\n if (inputNumberDisabled.value || maxDisabled.value)\n return;\n const value = props.modelValue || 0;\n const newVal = ensurePrecision(value);\n setCurrentValue(newVal);\n };\n const decrease = () => {\n if (inputNumberDisabled.value || minDisabled.value)\n return;\n const value = props.modelValue || 0;\n const newVal = ensurePrecision(value, -1);\n setCurrentValue(newVal);\n };\n const verifyValue = (value, update) => {\n const { max, min, step, precision, stepStrictly, valueOnClear } = props;\n let newVal = Number(value);\n if (isNil(value) || Number.isNaN(newVal)) {\n return null;\n }\n if (value === \"\") {\n if (valueOnClear === null) {\n return null;\n }\n newVal = isString(valueOnClear) ? { min, max }[valueOnClear] : valueOnClear;\n }\n if (stepStrictly) {\n newVal = toPrecision(Math.round(newVal / step) * step, precision);\n }\n if (!isUndefined(precision)) {\n newVal = toPrecision(newVal, precision);\n }\n if (newVal > max || newVal < min) {\n newVal = newVal > max ? max : min;\n update && emit(\"update:modelValue\", newVal);\n }\n return newVal;\n };\n const setCurrentValue = (value) => {\n var _a;\n const oldVal = data.currentValue;\n const newVal = verifyValue(value);\n if (oldVal === newVal)\n return;\n data.userInput = null;\n emit(\"update:modelValue\", newVal);\n emit(\"input\", newVal);\n emit(\"change\", newVal, oldVal);\n if (props.validateEvent) {\n (_a = formItem == null ? void 0 : formItem.validate) == null ? void 0 : _a.call(formItem, \"change\").catch((err) => debugWarn(err));\n }\n data.currentValue = newVal;\n };\n const handleInput = (value) => {\n return data.userInput = value;\n };\n const handleInputChange = (value) => {\n const newVal = value !== \"\" ? Number(value) : \"\";\n if (isNumber(newVal) && !Number.isNaN(newVal) || value === \"\") {\n setCurrentValue(newVal);\n }\n data.userInput = null;\n };\n const focus = () => {\n var _a, _b;\n (_b = (_a = input.value) == null ? void 0 : _a.focus) == null ? void 0 : _b.call(_a);\n };\n const blur = () => {\n var _a, _b;\n (_b = (_a = input.value) == null ? void 0 : _a.blur) == null ? void 0 : _b.call(_a);\n };\n const handleFocus = (event) => {\n emit(\"focus\", event);\n };\n const handleBlur = (event) => {\n var _a;\n emit(\"blur\", event);\n if (props.validateEvent) {\n (_a = formItem == null ? void 0 : formItem.validate) == null ? void 0 : _a.call(formItem, \"blur\").catch((err) => debugWarn(err));\n }\n };\n watch(() => props.modelValue, (value) => {\n data.currentValue = verifyValue(value, true);\n data.userInput = null;\n }, { immediate: true });\n onMounted(() => {\n var _a;\n const { min, max, modelValue } = props;\n const innerInput = (_a = input.value) == null ? void 0 : _a.input;\n innerInput.setAttribute(\"role\", \"spinbutton\");\n if (Number.isFinite(max)) {\n innerInput.setAttribute(\"aria-valuemax\", String(max));\n } else {\n innerInput.removeAttribute(\"aria-valuemax\");\n }\n if (Number.isFinite(min)) {\n innerInput.setAttribute(\"aria-valuemin\", String(min));\n } else {\n innerInput.removeAttribute(\"aria-valuemin\");\n }\n innerInput.setAttribute(\"aria-valuenow\", String(data.currentValue));\n innerInput.setAttribute(\"aria-disabled\", String(inputNumberDisabled.value));\n if (!isNumber(modelValue) && modelValue != null) {\n let val = Number(modelValue);\n if (Number.isNaN(val)) {\n val = null;\n }\n emit(\"update:modelValue\", val);\n }\n });\n onUpdated(() => {\n var _a;\n const innerInput = (_a = input.value) == null ? void 0 : _a.input;\n innerInput == null ? void 0 : innerInput.setAttribute(\"aria-valuenow\", `${data.currentValue}`);\n });\n expose({\n focus,\n blur\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\n unref(ns).b(),\n unref(ns).m(unref(inputNumberSize)),\n unref(ns).is(\"disabled\", unref(inputNumberDisabled)),\n unref(ns).is(\"without-controls\", !_ctx.controls),\n unref(ns).is(\"controls-right\", unref(controlsAtRight))\n ]),\n onDragstart: _cache[0] || (_cache[0] = withModifiers(() => {\n }, [\"prevent\"]))\n }, [\n _ctx.controls ? withDirectives((openBlock(), createElementBlock(\"span\", {\n key: 0,\n role: \"button\",\n \"aria-label\": unref(t)(\"el.inputNumber.decrease\"),\n class: normalizeClass([unref(ns).e(\"decrease\"), unref(ns).is(\"disabled\", unref(minDisabled))]),\n onKeydown: withKeys(decrease, [\"enter\"])\n }, [\n createVNode(unref(ElIcon), null, {\n default: withCtx(() => [\n unref(controlsAtRight) ? (openBlock(), createBlock(unref(ArrowDown), { key: 0 })) : (openBlock(), createBlock(unref(Minus), { key: 1 }))\n ]),\n _: 1\n })\n ], 42, _hoisted_1)), [\n [unref(RepeatClick), decrease]\n ]) : createCommentVNode(\"v-if\", true),\n _ctx.controls ? withDirectives((openBlock(), createElementBlock(\"span\", {\n key: 1,\n role: \"button\",\n \"aria-label\": unref(t)(\"el.inputNumber.increase\"),\n class: normalizeClass([unref(ns).e(\"increase\"), unref(ns).is(\"disabled\", unref(maxDisabled))]),\n onKeydown: withKeys(increase, [\"enter\"])\n }, [\n createVNode(unref(ElIcon), null, {\n default: withCtx(() => [\n unref(controlsAtRight) ? (openBlock(), createBlock(unref(ArrowUp), { key: 0 })) : (openBlock(), createBlock(unref(Plus), { key: 1 }))\n ]),\n _: 1\n })\n ], 42, _hoisted_2)), [\n [unref(RepeatClick), increase]\n ]) : createCommentVNode(\"v-if\", true),\n createVNode(unref(ElInput), {\n id: _ctx.id,\n ref_key: \"input\",\n ref: input,\n type: \"number\",\n step: _ctx.step,\n \"model-value\": unref(displayValue),\n placeholder: _ctx.placeholder,\n disabled: unref(inputNumberDisabled),\n size: unref(inputNumberSize),\n max: _ctx.max,\n min: _ctx.min,\n name: _ctx.name,\n label: _ctx.label,\n \"validate-event\": false,\n onKeydown: [\n withKeys(withModifiers(increase, [\"prevent\"]), [\"up\"]),\n withKeys(withModifiers(decrease, [\"prevent\"]), [\"down\"])\n ],\n onBlur: handleBlur,\n onFocus: handleFocus,\n onInput: handleInput,\n onChange: handleInputChange\n }, null, 8, [\"id\", \"step\", \"model-value\", \"placeholder\", \"disabled\", \"size\", \"max\", \"min\", \"name\", \"label\", \"onKeydown\"])\n ], 34);\n };\n }\n});\nvar InputNumber = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__file\", \"/home/runner/work/element-plus/element-plus/packages/components/input-number/src/input-number.vue\"]]);\n\nexport { InputNumber as default };\n//# sourceMappingURL=input-number2.mjs.map\n","import '../../utils/index.mjs';\nimport InputNumber from './src/input-number2.mjs';\nexport { inputNumberEmits, inputNumberProps } from './src/input-number.mjs';\nimport { withInstall } from '../../utils/vue/install.mjs';\n\nconst ElInputNumber = withInstall(InputNumber);\n\nexport { ElInputNumber, ElInputNumber as default };\n//# sourceMappingURL=index.mjs.map\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"CircleCloseFilled\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336L512 457.664z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar circleCloseFilled = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { circleCloseFilled as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"CirclePlusFilled\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm-38.4 409.6H326.4a38.4 38.4 0 1 0 0 76.8h147.2v147.2a38.4 38.4 0 0 0 76.8 0V550.4h147.2a38.4 38.4 0 0 0 0-76.8H550.4V326.4a38.4 38.4 0 1 0-76.8 0v147.2z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar circlePlusFilled = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { circlePlusFilled as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Delete\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32V256zm448-64v-64H416v64h192zM224 896h576V256H224v640zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32zm192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar _delete = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { _delete as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Edit\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M832 512a32 32 0 1 1 64 0v352a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h352a32 32 0 0 1 0 64H192v640h640V512z\"\n}, null, -1);\nconst _hoisted_3 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"m469.952 554.24 52.8-7.552L847.104 222.4a32 32 0 1 0-45.248-45.248L477.44 501.44l-7.552 52.8zm422.4-422.4a96 96 0 0 1 0 135.808l-331.84 331.84a32 32 0 0 1-18.112 9.088L436.8 623.68a32 32 0 0 1-36.224-36.224l15.104-105.6a32 32 0 0 1 9.024-18.112l331.904-331.84a96 96 0 0 1 135.744 0z\"\n}, null, -1);\nconst _hoisted_4 = [\n _hoisted_2,\n _hoisted_3\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_4);\n}\nvar edit = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { edit as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Menu\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M160 448a32 32 0 0 1-32-32V160.064a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V416a32 32 0 0 1-32 32H160zm448 0a32 32 0 0 1-32-32V160.064a32 32 0 0 1 32-32h255.936a32 32 0 0 1 32 32V416a32 32 0 0 1-32 32H608zM160 896a32 32 0 0 1-32-32V608a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32v256a32 32 0 0 1-32 32H160zm448 0a32 32 0 0 1-32-32V608a32 32 0 0 1 32-32h255.936a32 32 0 0 1 32 32v256a32 32 0 0 1-32 32H608z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar menu = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { menu as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Plus\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64h352z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar plus = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { plus as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Share\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"m679.872 348.8-301.76 188.608a127.808 127.808 0 0 1 5.12 52.16l279.936 104.96a128 128 0 1 1-22.464 59.904l-279.872-104.96a128 128 0 1 1-16.64-166.272l301.696-188.608a128 128 0 1 1 33.92 54.272z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar share = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { share as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Top\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M572.235 205.282v600.365a30.118 30.118 0 1 1-60.235 0V205.282L292.382 438.633a28.913 28.913 0 0 1-42.646 0 33.43 33.43 0 0 1 0-45.236l271.058-288.045a28.913 28.913 0 0 1 42.647 0L834.5 393.397a33.43 33.43 0 0 1 0 45.176 28.913 28.913 0 0 1-42.647 0l-219.618-233.23z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar top = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { top as default };\n","<template>\n <!-- 分类管理 -->\n <div class=\"panel\">\n <!-- 按钮 -->\n <div class=\"btn-area\">\n <h5>分类列表</h5>\n <h6 style=\"font-weight: lighter\">(点击分类可筛选任务)</h6>\n </div>\n <!-- 分类列表 -->\n <div style=\"margin-top: 15px\" class=\"category-list\">\n <div class=\"new-tag-wrap\">\n <!-- 新分类 -->\n <el-input\n class=\"input-new-tag el-tag\"\n v-if=\"isShowCreateCategory\"\n v-model=\"categoryName\"\n ref=\"saveTagInput\"\n placeholder=\"分类名称\"\n @keyup.enter=\"addCategory\"\n @focusout=\"addCategory\"\n ></el-input>\n <el-button\n v-else\n class=\"button-new-tag el-tag\"\n size=\"small\"\n @click=\"isShowCreateCategory = true\"\n >+ New 分类</el-button\n >\n <el-tag\n :effect=\"category === 'default' ? 'dark' : 'plain'\"\n @click=\"handleClickCategory('default')\"\n >默认{{ taskCount('default') }}</el-tag\n >\n <span class=\"list-tip\"\n ><el-tag\n type=\"danger\"\n :effect=\"category === 'trash' ? 'dark' : 'plain'\"\n @click=\"handleClickCategory('trash')\"\n ><el-icon><DeleteFilled /></el-icon> 回收站{{\n taskCount('trash')\n }}</el-tag\n ></span\n >\n </div>\n <div class=\"tag-wrap\">\n <div class=\"tag-list\">\n <el-tag\n v-for=\"tag in categorys\"\n :key=\"tag.k\"\n closable\n :effect=\"category === tag.k ? 'dark' : 'plain'\"\n @close=\"handleDeleteCategory(tag)\"\n @click=\"handleClickCategory(tag.k)\"\n >{{ tag.name }}{{ taskCount(tag.k) }}</el-tag\n >\n </div>\n </div>\n </div>\n </div>\n</template>\n<script lang=\"ts\">\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, defineComponent, ref } from 'vue'\nimport { DeleteFilled } from '@element-plus/icons-vue'\nimport { useStore } from 'vuex'\n\nexport default defineComponent({\n name: 'categoryPanel',\n components: {\n DeleteFilled\n },\n props: {\n category: {\n type: String,\n required: true,\n default: 'default'\n }\n },\n setup(props, context) {\n const $store = useStore()\n // 分类相关\n const categorys = computed(() => $store.state.category.categoryList)\n const tasks = computed(() => $store.state.task.taskList)\n const taskCount = (c: string) => {\n const count = tasks.value.filter((t: any) => t.category === c).length\n return count === 0 ? '' : ` (${count})`\n }\n const isShowCreateCategory = ref(false)\n const categoryName = ref('')\n const addCategory = () => {\n isShowCreateCategory.value = false\n if (!categoryName.value.trim()) {\n // ElMessage.warning('不能为空')\n return\n }\n $store\n .dispatch('category/createCategory', categoryName.value)\n .then(() => {\n ElMessage.success('创建成功')\n })\n .catch((err) => {\n if (err.code === 2001) {\n ElMessage.warning('分类名称已存在')\n }\n })\n categoryName.value = ''\n }\n\n const handleClickCategory = (k: string) => {\n context.emit('update:category', k)\n }\n\n const handleDeleteCategory = (c: any) => {\n ElMessageBox.confirm('是否删除', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消'\n })\n .then(() => {\n $store.dispatch('category/deleteCategory', c.k).then(() => {\n // 删除后变动的默认选择\n handleClickCategory('default')\n ElMessage.success('删除成功')\n // 获取最新的任务\n $store.dispatch('task/getTask')\n })\n })\n .catch(() => {\n ElMessage.info('取消删除')\n })\n }\n\n return {\n categorys,\n isShowCreateCategory,\n categoryName,\n addCategory,\n handleDeleteCategory,\n handleClickCategory,\n taskCount\n }\n }\n})\n</script>\n<style scoped lang=\"scss\">\n.el-tag {\n margin-left: 10px;\n margin-bottom: 10px;\n cursor: pointer;\n}\n.new-tag-wrap {\n display: flex;\n align-items: center;\n}\n.button-new-tag {\n margin-left: 10px;\n height: 32px;\n line-height: 30px;\n padding-top: 0;\n padding-bottom: 0;\n}\n.input-new-tag {\n width: 120px;\n padding: 0;\n margin-left: 10px;\n margin-bottom: 10px;\n vertical-align: bottom;\n}\n.panel {\n padding: 1em;\n background-color: #fff;\n margin: 10px auto;\n box-sizing: border-box;\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n}\n.btn-area {\n display: flex;\n justify-content: center;\n}\n.list-tip {\n // color: #67c23a;\n // font-size: 10px;\n margin-right: 10px;\n flex: 1;\n text-align: right;\n}\n.tag-wrap {\n width: 100%;\n height: 150px;\n}\n.tag-list {\n height: 150px;\n overflow-x: hidden;\n overflow-y: scroll;\n display: flex;\n flex-wrap: wrap;\n :deep(.el-tag) {\n width: 140px;\n }\n :deep(.el-tag__content) {\n width: 100px;\n text-align: center;\n text-overflow: ellipsis;\n word-break: keep-all;\n overflow: hidden;\n }\n}\n</style>\n","<template>\n <div>\n <div class=\"btn-area\">\n <el-button size=\"large\" type=\"primary\" :plain=\"!isShowCreateTask\" @click=\"\n isShowCreateTask =\n !isShowCreateTask\n \">\n {{\n isShowCreateTask\n ? '关闭创建面板'\n : '创建收集任务'\n }}\n </el-button>\n </div>\n <!-- 新增区域 -->\n <div v-show=\"isShowCreateTask\">\n <div class=\"input-container\">\n <el-input placeholder=\"请输入任务名称(上述列表选择分类)\" v-model=\"taskName\"></el-input>\n <el-button @click=\"createTask\" :type=\"taskName?.length ? 'success' : 'default'\">确定</el-button>\n </div>\n </div>\n <tip class=\"p10\">\n 点击\n <el-icon>\n <Menu />\n </el-icon> 可以进一步的调整任务\n </tip>\n <tip>\n 设置截止时间,自动重命名,名单限制,批注,文件模板。。🚀\n </tip>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage } from 'element-plus'\nimport {\n computed,\n ref,\n} from 'vue'\nimport { useStore } from 'vuex'\nimport { Menu } from '@element-plus/icons-vue'\nimport Tip from './infoPanel/tip.vue'\n\nconst props = defineProps({\n activeCategoryKey: {\n type: String,\n default: 'default',\n },\n})\nconst $store = useStore()\nconst categorys = computed(() => $store.state.category\n .categoryList)\nconst categoryName = computed(() => {\n if (props.activeCategoryKey\n === 'default') {\n return '默认'\n }\n return categorys.value.find((v: any) => v.k\n === props.activeCategoryKey).name\n})\n// 任务相关\nconst isShowCreateTask = ref(false)\nconst taskName = ref('')\nconst createTask = () => {\n if (!taskName.value.trim()) {\n ElMessage.warning('不能为空')\n return\n }\n $store\n .dispatch('task/createTask', {\n name: taskName.value,\n category: props.activeCategoryKey,\n })\n .then(() => {\n ElMessage.success('创建成功')\n })\n taskName.value = ''\n}\n\n</script>\n<style scoped>\n.btn-area {\n display: flex;\n justify-content: center;\n}\n\n.input-container {\n margin: 15px auto;\n max-width: 600px;\n background-color: #fff;\n display: flex;\n justify-content: space-around;\n}\n</style>\n","import { ElMessage } from 'element-plus'\nimport { TaskApi } from '@/apis'\nimport { debounce } from '@/utils/other'\n\nexport const updateTaskInfo: (\n key: string,\n options: TaskApiTypes.TaskInfo,\n successInfo?: boolean\n) => void = debounce(\n (key, options, successInfo = true) => {\n if (key) {\n TaskApi.updateTaskMoreInfo(key, options)\n .then(() => {\n if (successInfo) {\n ElMessage.success({\n message: '设置成功',\n zIndex: 4000,\n duration: 1000\n })\n }\n })\n .catch(() => {\n ElMessage.error({\n message: '设置失败',\n zIndex: 4000\n })\n })\n }\n },\n 1000,\n true\n)\n","<template>\n <div class=\"tc ddl\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTI4NjU5Nw==649149286597',\n 'https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTMxMDEyOQ==649149310129',\n 'https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTM3MzgxOA==649149373818'\n ]\"\n >设置截止日期,截止后将不能再提交文件。</tip\n >\n <div class=\"tc flex fc fac\">\n <el-date-picker\n :editable=\"false\"\n v-model=\"newDate\"\n type=\"datetime\"\n placeholder=\"点击设置新截止日期\"\n @change=\"updateDDL\"\n :default-time=\"new Date(ddl)\"\n ></el-date-picker>\n <el-button v-if=\"newDate\" @click=\"closeDDL\">取消</el-button>\n </div>\n <div style=\"margin-top: 10px\" v-if=\"newDate\">\n <tip>{{ isOver ? '已经截止' : `剩余时间: ${waitTimeStr}` }} </tip>\n </div>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, onMounted, ref, watchEffect } from 'vue'\nimport { formatDate } from '@/utils/stringUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nconst props = defineProps({\n ddl: {\n type: String,\n default: '',\n required: false\n },\n k: {\n type: String,\n default: ''\n }\n})\n\nconst newDate = ref()\nwatchEffect(() => {\n if (props.ddl) {\n newDate.value = new Date(props.ddl)\n } else {\n newDate.value = null\n }\n})\n// 更新DDL\nconst updateDDL = () => {\n if (newDate.value) {\n const ddl = formatDate(\n new Date(newDate.value.getTime() - 1000 * 60 * 60 * 8)\n )\n updateTaskInfo(props.k, { ddl })\n }\n}\n// 关闭DDL\nconst closeDDL = () => {\n newDate.value = null\n updateTaskInfo(props.k, { ddl: null })\n}\n\nconst waitTime = ref(0)\nconst isOver = computed(() => waitTime.value <= 0)\nconst waitTimeStr = computed(() => {\n let seconds = ~~(waitTime.value / 1000)\n let hour = ~~(seconds / (60 * 60))\n const day = ~~(hour / 24)\n hour %= 24\n const minute = ~~((seconds % 3600) / 60)\n seconds %= 60\n return `剩余${day}天${hour}时${minute}分${seconds}秒`\n})\n\nconst refreshWaitTime = (loop = true) => {\n if (newDate.value) {\n waitTime.value = newDate.value.getTime() - Date.now()\n } else {\n waitTime.value = 0\n }\n if (loop) {\n setTimeout(() => {\n refreshWaitTime()\n }, 1000)\n }\n}\n\nonMounted(() => {\n refreshWaitTime()\n})\n</script>\n","<template>\n <div class=\"tc info-panel\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4MzEwOTEzOQ==650183109139',\n 'https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjY3MTUyMw==651496671523'\n ]\"\n >只有名单里的成员,才可提交文件</tip\n >\n <el-button\n @click=\"updateLimitPeople(true)\"\n v-if=\"!people\"\n size=\"default\"\n round\n type=\"success\"\n >开启</el-button\n >\n <el-button\n @click=\"updateLimitPeople(false)\"\n v-if=\"people\"\n size=\"default\"\n round\n type=\"danger\"\n >关闭</el-button\n >\n <el-button\n @click=\"checkPeople\"\n v-if=\"people\"\n round\n size=\"default\"\n type=\"primary\"\n >查看提交情况</el-button\n >\n <div class=\"upload-people\" v-if=\"people\">\n <el-radio-group v-model=\"activeTab\" size=\"small\">\n <el-radio-button label=\"文件导入\" />\n <el-radio-button label=\"任务导入\" />\n <el-radio-button label=\"手动添加\" />\n </el-radio-group>\n <div class=\"import-people-wrapper\">\n <div v-show=\"activeTab === '文件导入'\">\n <el-upload\n accept=\"text/plain\"\n action=\"\"\n class=\"upload-demo\"\n ref=\"peopleUpload\"\n :on-change=\"handleChangeFile\"\n :on-exceed=\"handleExceedFile\"\n :on-remove=\"clearFiles\"\n :auto-upload=\"false\"\n :limit=\"1\"\n v-model:file-list=\"peopleFileList\"\n >\n <template #trigger>\n <el-button size=\"small\" type=\"primary\">选择文件</el-button>\n </template>\n <el-button\n @click=\"submitUploadPeople\"\n style=\"margin-left: 10px\"\n size=\"small\"\n type=\"success\"\n :disabled=\"!peopleFileList.length\"\n >确定上传</el-button\n >\n <template #tip>\n <div class=\"el-upload__tip\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4Mjk2NjUxMA==650182966510'\n ]\"\n >只能上传 .txt 文本文件,每行一个名字</tip\n >\n <tip>如名字有特殊字符,建议去除</tip>\n <tip>上传文件导入的方式,为追加导入,不会覆盖已存在数据</tip>\n </div>\n </template>\n </el-upload>\n </div>\n <div v-show=\"activeTab === '任务导入'\">\n <!-- 从其它任务导入 -->\n <el-button size=\"small\" type=\"success\" @click=\"openImportPanel\"\n >选择任务</el-button\n >\n <div class=\"p10\">\n <tip>支持从已有的任务直接导入名单</tip>\n </div>\n </div>\n <div v-show=\"activeTab === '手动添加'\">\n <div style=\"max-width: 300px; margin: 0 auto\">\n <el-input\n :disabled=\"importStatus\"\n v-model=\"userInputName\"\n placeholder=\"请输入姓名\"\n >\n <template #append>\n <el-button @click=\"handAddName\"> 确定 </el-button>\n </template>\n </el-input>\n </div>\n <div class=\"p10\">\n <tip>会自动判重,不会重复添加</tip>\n <tip>大量名单优先推荐使用文件导入</tip>\n </div>\n </div>\n </div>\n <div style=\"max-width: 320px; margin: 0 auto\">\n <el-form label-width=\"120px\">\n <el-form-item label=\"绑定表单项\" style=\"margin-bottom: 6px\">\n <el-input size=\"small\" v-model=\"bindField\" clearable>\n <template #append>\n <el-button @click=\"handleSureBind\"> 确定 </el-button>\n </template>\n </el-input>\n </el-form-item>\n <tip style=\"\">和表单项同名字段,可以避免重复填写!!</tip>\n </el-form>\n </div>\n </div>\n <el-dialog :fullscreen=\"isMobile\" title=\"提交情况\" v-model=\"showPeopleList\">\n <!-- 上部分的筛选菜单 -->\n <div class=\"nav\">\n <div class=\"item\">\n <el-button\n :disabled=\"peopleList.length === 0\"\n type=\"success\"\n size=\"default\"\n @click=\"handleExportExcel\"\n >导出记录</el-button\n >\n </div>\n <div class=\"item\">\n <el-select\n size=\"default\"\n v-model=\"selectSubmitStatus\"\n placeholder=\"状态筛选\"\n >\n <el-option label=\"全部\" value=\"all\" />\n <el-option label=\"已提交\" :value=\"1\" />\n <el-option label=\"未提交\" :value=\"0\" />\n </el-select>\n </div>\n <div class=\"item\">\n <el-input\n size=\"default\"\n placeholder=\"输入要查询的姓名\"\n v-model=\"searchName\"\n ></el-input>\n </div>\n <div class=\"item\">\n <el-button type=\"primary\" size=\"default\" @click=\"handleCheckMore\"\n >{{ checkMore ? '隐藏' : '显示' }}详细提交情况\n </el-button>\n </div>\n </div>\n <!-- 概况信息 -->\n <div class=\"tc p10\">\n <span>共: {{ peopleSubmitData.length }} 条数据</span>,\n <span\n >已提交: {{ peopleSubmitData.filter((v) => v.status).length }}</span\n >,\n <span\n >未提交: {{ peopleSubmitData.filter((v) => !v.status).length }}</span\n >\n </div>\n <div class=\"tc p10\">\n <tip>\"提交次数\" 用户实际的提交次数</tip>\n <tip>\"现存数量\" 还存在于服务器上的文件数 (不包含删除) --- 慢查询</tip>\n <tip>\"提交数量\" 用户实际提交的文件数 (不包含撤回) --- 慢查询</tip>\n </div>\n <!-- 数据部分 -->\n <el-table\n v-loading=\"isLoadingPeopleData\"\n element-loading-text=\"Loading...\"\n stripe\n border\n :data=\"peopleSubmitData\"\n height=\"460px\"\n >\n <el-table-column label=\"序号\" width=\"60\">\n <template #default=\"scope\">\n <div style=\"text-align: center\">{{ scope.$index + 1 }}</div>\n </template>\n </el-table-column>\n <el-table-column property=\"name\" label=\"姓名\"></el-table-column>\n <el-table-column label=\"提交状态\" width=\"100\">\n <template #default=\"scope\">\n <span class=\"submit-ok\" v-if=\"scope.row.status\">已提交</span>\n <span class=\"submit-fail\" v-else>未提交</span>\n </template>\n </el-table-column>\n <el-table-column\n property=\"count\"\n label=\"提交次数\"\n width=\"94\"\n ></el-table-column>\n <el-table-column\n sortable\n property=\"lastDate\"\n label=\"最后操作时间\"\n width=\"120\"\n ></el-table-column>\n <template v-if=\"checkMore\">\n <el-table-column\n property=\"fileCount\"\n label=\"现存数量\"\n width=\"94\"\n ></el-table-column>\n <el-table-column\n sortable\n property=\"submitCount\"\n label=\"提交数量\"\n width=\"120\"\n ></el-table-column>\n </template>\n <el-table-column label=\"操作\" width=\"100\">\n <template #default=\"scope\">\n <el-button\n @click=\"handleDeletePeople(scope.row)\"\n type=\"primary\"\n text\n size=\"small\"\n >删除</el-button\n >\n </template>\n </el-table-column>\n </el-table>\n </el-dialog>\n <el-dialog\n :fullscreen=\"isMobile\"\n title=\"人员列表导入\"\n v-model=\"showImportPanel\"\n >\n <el-form\n :model=\"importPanelInfo\"\n label-width=\"100px\"\n label-position=\"right\"\n >\n <el-form-item label=\"任务\">\n <el-select\n filterable\n v-model=\"importPanelInfo.taskValue\"\n placeholder=\"请选择\"\n no-data-text=\"无可用任务\"\n >\n <el-option\n v-for=\"t in importPanelInfo.taskList\"\n :key=\"t.taskKey\"\n :label=\"t.name\"\n :value=\"t.taskKey\"\n >\n </el-option>\n </el-select>\n </el-form-item>\n <tip>{{ ImportTaskTipMsg }}</tip>\n <el-form-item label=\"任务\">\n <el-radio-group v-model=\"importPanelInfo.type\">\n <el-radio label=\"override\">覆盖导入</el-radio>\n <el-radio label=\"add\">追加导入</el-radio>\n </el-radio-group>\n </el-form-item>\n <tip>{{\n importPanelInfo.type === 'override'\n ? '“覆盖导入” 将会覆盖原来的数据'\n : '“追加导入” 将只会导入不存在数据'\n }}</tip>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"showImportPanel = false\">取 消</el-button>\n <el-button\n :disabled=\"!importPanelInfo.taskValue\"\n type=\"primary\"\n @click=\"handleSaveImportInfo\"\n >确 定</el-button\n >\n </span>\n </template>\n </el-dialog>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage, ElMessageBox, UploadUserFile } from 'element-plus'\nimport { computed, reactive, ref, watch, watchEffect } from 'vue'\nimport { useStore } from 'vuex'\nimport { PeopleApi, TaskApi } from '@/apis'\nimport { uploadFile, tableToExcel } from '@/utils/networkUtil'\nimport { formatDate } from '@/utils/stringUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nconst props = defineProps({\n value: {\n type: Number,\n defalut: 0\n },\n k: {\n type: String,\n default: ''\n },\n name: {\n type: String,\n default: ''\n },\n field: {\n type: String,\n default: '姓名'\n }\n})\n\nconst activeTab = ref('手动添加')\nconst userInputName = ref('')\nconst importStatus = ref(false)\n\nconst handAddName = () => {\n if (!userInputName.value) {\n return\n }\n importStatus.value = true\n PeopleApi.addPeopleByUser(userInputName.value, props.k)\n .then((v) => {\n ElMessage.success(`添加 ${userInputName.value} 成功`)\n })\n .catch(() => {\n ElMessage.error(`${userInputName.value} 已存在`)\n })\n .finally(() => {\n importStatus.value = false\n userInputName.value = ''\n })\n}\nconst checkMore = ref(false)\n\nconst people = ref(0)\nwatchEffect(() => {\n people.value = props.value as number\n})\n// 限制提交人员\nconst updateLimitPeople = (limit: boolean) => {\n updateTaskInfo(props.k, {\n people: +limit\n })\n people.value = +limit\n}\n\n// 查看提交情况\nconst showPeopleList = ref(false)\nconst peopleList: any = reactive([])\nconst selectSubmitStatus = ref('all')\nconst searchName = ref('')\nconst filterPeopleBySearchWord = computed(() => {\n if (!searchName.value) {\n return peopleList\n }\n return peopleList.filter((v) => v.name.includes(searchName.value))\n})\nconst peopleSubmitData = computed(() => {\n if (selectSubmitStatus.value === 'all') {\n return filterPeopleBySearchWord.value\n }\n return filterPeopleBySearchWord.value.filter(\n (p) => p.status === selectSubmitStatus.value\n )\n})\nconst isLoadingPeopleData = ref(false)\nconst refreshSubmitData = () => {\n isLoadingPeopleData.value = true\n PeopleApi.getPeople(props.k, `${+checkMore.value}`).then((res) => {\n peopleList.splice(0, peopleList.length)\n peopleList.push(...res.data.people)\n peopleList.forEach((p) => {\n if (!p.status && p.count === 0) {\n p.lastDate = '暂无记录'\n } else {\n p.lastDate = formatDate(new Date(p.lastDate), 'yyyy-MM-dd hh:mm:ss')\n }\n })\n isLoadingPeopleData.value = false\n })\n}\nconst handleCheckMore = () => {\n checkMore.value = !checkMore.value\n if (checkMore.value) {\n refreshSubmitData()\n }\n}\nconst checkPeople = () => {\n showPeopleList.value = true\n // 默认不展示提交数量\n checkMore.value = false\n refreshSubmitData()\n}\nconst handleDeletePeople = (item: any) => {\n ElMessageBox.confirm('确认删除此人员吗', '数据无价,请谨慎操作')\n .then(() => {\n PeopleApi.deletePeople(props.k, item.id).then(() => {\n ElMessage.success('删除成功')\n peopleList.splice(\n peopleList.findIndex((v) => v.id === item.id),\n 1\n )\n })\n })\n .catch(() => {\n ElMessage.info('取消删除')\n })\n}\n// 文件上传\nconst peopleFileList = ref<UploadUserFile[]>([])\nconst peopleUpload = ref()\n// 超出选择的文件个数\nconst handleExceedFile = () => {\n ElMessage.error('只能选择一个文件,可删除后重新选择')\n}\n// 清空文件\nconst clearFiles = () => {\n peopleFileList.value.splice(0, peopleFileList.value.length)\n peopleUpload.value.clearFiles()\n}\n// 开始上传\nconst submitUploadPeople = () => {\n peopleFileList.value.forEach((file) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n uploadFile(\n file.raw,\n `${import.meta.env.VITE_APP_AXIOS_BASE_URL}public/upload`,\n {\n success: (e: any) => {\n const { name, type } = e.data\n PeopleApi.importPeople(props.k, name, type).then((res) => {\n const { success, fail } = res.data\n ElMessage.success(`导入完成:${success}成功,${fail.length}失败`)\n if (fail.length > 0) {\n setTimeout(() => {\n ElMessage.info('自动开始下载未成功导入名单')\n tableToExcel(\n ['未成功导入名单'],\n fail.map((v: string) => [v]),\n `${props.name}_导入失败名单_${formatDate(\n new Date(),\n 'yyyy年MM月日hh时mm分ss秒'\n )}.xlsx`\n )\n }, 1000)\n }\n clearFiles()\n })\n }\n }\n )\n })\n}\n// 添加文件\nconst handleChangeFile = (file: any) => {\n if (file.raw.type !== 'text/plain') {\n ElMessage.warning({\n message: '只支持txt文件',\n zIndex: 4000\n })\n clearFiles()\n }\n}\nconst handleExportExcel = () => {\n if (peopleSubmitData.value.length === 0) {\n ElMessage.warning('表格中没有可导出数据')\n return\n }\n const headers = [\n '姓名',\n '提交状态',\n '提交数量',\n '最后操作时间',\n ...(checkMore.value ? ['现存数量', '提交次数'] : [])\n ]\n const body = peopleSubmitData.value.map((v) => {\n const { name, status, lastDate, submitCount, fileCount, count } = v\n return [\n name,\n status ? '✔' : 'x',\n submitCount,\n status ? formatDate(new Date(lastDate)) : '',\n ...(checkMore.value ? [fileCount, count] : [])\n ]\n })\n tableToExcel(\n headers,\n body,\n `${props.name}_提交情况_${formatDate(\n new Date(),\n 'yyyy年MM月日hh时mm分ss秒'\n )}.xlsx`\n )\n ElMessage.success('导出成功')\n}\nconst $store = useStore()\nconst isMobile = computed(() => $store.getters['public/isMobile'])\nconst importPanelInfo = reactive({\n taskList: [],\n type: 'override',\n taskValue: ''\n})\nconst showImportPanel = ref(false)\nconst openImportPanel = async () => {\n const taskKey = props.k\n // 通过任务Key获取可用任务列表,与概况信息\n const { data } = await PeopleApi.getUsefulTemplate(taskKey)\n importPanelInfo.taskList = data\n importPanelInfo.taskValue = data[0]?.taskKey || ''\n showImportPanel.value = true\n}\nconst ImportTaskTipMsg = computed(() => {\n const { taskList, taskValue } = importPanelInfo\n const task = taskList.find((v) => v.taskKey === taskValue)\n if (!task) {\n return '无可用任务'\n }\n return `${task.count} 条数据`\n})\nconst handleSaveImportInfo = () => {\n PeopleApi.importPeopleFromTpl(\n props.k,\n importPanelInfo.taskValue,\n importPanelInfo.type\n ).then((res) => {\n showImportPanel.value = false\n const { success, fail } = res.data\n ElMessage.success(`导入成功${success}条,失败${fail.length}条`)\n\n if (fail.length > 0) {\n setTimeout(() => {\n ElMessage.info('自动开始下载未成功导入名单')\n tableToExcel(\n ['未成功导入名单'],\n fail.map((v: string) => [v]),\n `${props.name}_导入失败名单_${formatDate(\n new Date(),\n 'yyyy年MM月日hh时mm分ss秒'\n )}.xlsx`\n )\n }, 1000)\n }\n })\n}\n\nconst importPanelFlexStyle = computed(() => (isMobile.value ? '0 0 auto' : 0.5))\n\nconst bindField = ref('姓名')\nwatch(\n () => props.field,\n (v) => {\n bindField.value = v\n },\n {\n immediate: true\n }\n)\nconst handleSureBind = () => {\n // 空值校验\n if (!bindField.value.trim().length) {\n ElMessage.warning('绑定的表单项不能为空')\n return\n }\n\n // 提交保存\n TaskApi.updateTaskMoreInfo(props.k, {\n bindField: bindField.value\n }).then(() => {\n ElMessage.success('保存成功')\n })\n}\n</script>\n<style scoped>\n.upload-people {\n padding: 10px;\n}\n\n.import-people-wrapper {\n padding: 10px 0;\n}\n.submit-ok {\n color: #67c23a;\n}\n\n.submit-fail {\n color: #f56c6c;\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n padding-bottom: 5px;\n}\n\n.nav .item {\n margin-left: 10px;\n margin-top: 5px;\n}\n\n.info-panel :deep(.el-form-item__label) {\n flex: v-bind(importPanelFlexStyle);\n}\n\n.info-panel :deep(.el-upload-list__item-name) {\n justify-content: center;\n}\n</style>\n","<template>\n <div class=\"tc info-panel\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4MjY3MjUxNw==650182672517'\n ]\"\n >设置的模板文件,可供用户在提交页下载。</tip\n >\n <el-button\n v-if=\"template\"\n :disabled=\"!template\"\n @click=\"deleteTemplate\"\n size=\"default\"\n round\n type=\"danger\"\n >删除</el-button\n >\n <div class=\"p10\">{{ template || '尚未设置模板文件' }}</div>\n <div class=\"upload-file\" v-if=\"!template\">\n <el-upload\n action=\"\"\n ref=\"elUpload\"\n :on-exceed=\"handleExceedFile\"\n :on-remove=\"clearFiles\"\n :auto-upload=\"false\"\n :limit=\"1\"\n v-model:file-list=\"fileList\"\n >\n <template #trigger>\n <el-button size=\"small\" type=\"primary\">选取文件</el-button>\n </template>\n <el-button\n @click=\"submitUploadPeople\"\n style=\"margin-left: 10px\"\n size=\"small\"\n type=\"success\"\n >设为模板</el-button\n >\n <template #tip>\n <div class=\"el-upload__tip\">选择模板文件,然后点击上传</div>\n </template>\n </el-upload>\n </div>\n </div>\n</template>\n<script lang=\"ts\">\nimport { ElMessage, UploadUserFile } from 'element-plus'\nimport { defineComponent, ref, watchEffect } from 'vue'\nimport { FileApi } from '@/apis'\nimport { qiniuUpload } from '@/utils/networkUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nexport default defineComponent({\n name: 'templatePanel',\n props: {\n value: {\n type: String,\n default: ''\n },\n k: {\n type: String,\n default: ''\n }\n },\n setup(props) {\n const template = ref()\n watchEffect(() => {\n if (props.value) {\n template.value = props.value\n } else {\n template.value = ''\n }\n })\n const percentage = ref(0)\n // 删除模板\n const deleteTemplate = () => {\n if (template.value) {\n // 移除文件,避免空间被长时间占用\n updateTaskInfo(props.k, { template: '' })\n template.value = ''\n percentage.value = 0\n }\n }\n // 文件上传\n const fileList = ref<UploadUserFile[]>([])\n const elUpload = ref()\n // 超出选择的文件个数\n const handleExceedFile = () => {\n ElMessage.error('只能选择一个文件,可删除后重新选择')\n }\n // 清空文件\n const clearFiles = () => {\n elUpload.value.clearFiles()\n }\n // 开始上传\n const submitUploadPeople = () => {\n fileList.value.forEach((file) => {\n if (!props.k) {\n return\n }\n const { name } = file\n const key = `easypicker2/${props.k}_template/${name}`\n if (file.status === 'ready') {\n file.status = 'uploading'\n // qiniu上传\n FileApi.getUploadToken().then((res) => {\n qiniuUpload(res.data.token, file.raw, key, {\n success() {\n ElMessage.success('上传成功')\n updateTaskInfo(props.k, { template: name })\n // 清理上传完成的\n clearFiles()\n template.value = name\n file.status = 'success'\n // hash,key\n // console.log(data)\n },\n process(per: number) {\n file.percentage = ~~per\n }\n })\n })\n }\n })\n }\n return {\n template,\n deleteTemplate,\n fileList,\n handleExceedFile,\n clearFiles,\n submitUploadPeople,\n elUpload,\n percentage\n }\n },\n components: { Tip }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.info-panel :deep(.el-upload-list__item-name) {\n justify-content: center;\n}\n</style>\n","<template>\n <div class=\"tc\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4MzM3NjUyNg==650183376526',\n 'https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjU2ODcyNg==651496568726'\n ]\"\n >上传文件必填表单信息</tip\n >\n <div class=\"auto-format\">\n <span>文件自动重命名:</span>\n <el-switch\n style=\"display: block\"\n v-model=\"autoRewrite\"\n active-color=\"#13ce66\"\n inactive-color=\"#ff4949\"\n active-text=\"开\"\n @change=\"handleChange\"\n inactive-text=\"关\"\n ></el-switch>\n </div>\n <div v-if=\"autoRewrite\" style=\"margin-bottom: 10px\">\n 预期格式:\n <span style=\"color: #409eff\">{{ resFormat }}</span>\n </div>\n <div v-if=\"autoRewrite\" style=\"margin-bottom: 10px\">\n 分割符:\n <el-select\n @change=\"handleChangeSplitChar\"\n v-model=\"formatData.splitChar\"\n placeholder=\"分隔符\"\n style=\"width: 60px\"\n size=\"small\"\n >\n <el-option v-for=\"v in splitCharList\" :key=\"v\" :label=\"v\" :value=\"v\" />\n </el-select>\n </div>\n <tip v-if=\"autoRewrite\" style=\"color: red\"\n >开启自动重命名后,重点关注文件名格式是否符合预期</tip\n >\n <div>\n 预览\n <el-switch\n v-model=\"openPreview\"\n inline-prompt\n active-text=\"是\"\n inactive-text=\"否\"\n active-color=\"#13ce66\"\n inactive-color=\"#ff4949\"\n />\n </div>\n <!-- 必填信息区域 -->\n <div class=\"form-wrapper\">\n <InfosForm v-if=\"openPreview\" :infos=\"infos\" :disabled=\"openPreview\" />\n <el-form v-else label-width=\"100px\">\n <el-form-item v-for=\"(item, idx) in infos\" :key=\"idx\">\n <template #label>\n <div class=\"flex fc fac\">\n <div class=\"num-wrapper\">\n <div>{{ idx + 1 }}</div>\n </div>\n <div class=\"form-item-type\" :class=\"item.type\">\n {{ getTypeDes(item.type) }}\n </div>\n </div>\n </template>\n <el-input\n placeholder=\"输入内容\"\n v-model=\"item.text\"\n :maxlength=\"maxInputLength\"\n clearable\n show-word-limit\n >\n <template #append>\n <div class=\"form-item-wrapper\">\n <el-icon\n :color=\"infos.length > 1 ? 'red' : 'grey'\"\n @click=\"deleteInfo(idx)\"\n >\n <CircleCloseFilled />\n </el-icon>\n <el-icon\n color=\"#000\"\n style=\"margin-left: 6px\"\n v-if=\"idx > 0\"\n @click=\"moveInfoUp(idx)\"\n >\n <Top />\n </el-icon>\n </div>\n </template>\n </el-input>\n <div\n v-if=\"item.type === 'radio' || item.type === 'select'\"\n class=\"radio-list\"\n >\n <el-input\n size=\"small\"\n v-for=\"(v, idx) in item.children\"\n :key=\"idx\"\n placeholder=\"输入内容\"\n v-model=\"v.text\"\n :maxlength=\"maxInputLength\"\n clearable\n show-word-limit\n >\n <template #append>\n <div class=\"form-item-wrapper\">\n <el-icon\n :color=\"item.children.length > 2 ? 'red' : 'grey'\"\n @click=\"deleteInfo(idx, item.children, 2)\"\n >\n <CircleCloseFilled />\n </el-icon>\n <template v-if=\"idx + 1 === item.children.length\">\n <el-icon\n style=\"margin-left: 10px\"\n color=\"#67C23A\"\n @click=\"addInfo(item.children, item.type)\"\n >\n <CirclePlusFilled />\n </el-icon>\n </template>\n </div>\n </template>\n </el-input>\n </div>\n </el-form-item>\n </el-form>\n </div>\n <div class=\"p10\" v-if=\"showAddInfo\">\n <el-button\n size=\"small\"\n type=\"primary\"\n @click=\"\n () => {\n addInfo()\n }\n \"\n round\n >添加一项</el-button\n >\n <el-select\n style=\"margin: 0 10px\"\n size=\"small\"\n v-model=\"selectType\"\n placeholder=\"选择添加的类型\"\n >\n <el-option\n v-for=\"(v, idx) in infoTypeList\"\n :key=\"idx\"\n :label=\"v.label\"\n :value=\"v.value\"\n />\n </el-select>\n <el-button type=\"primary\" text @click=\"showHelp\">提示❓</el-button>\n </div>\n <!-- 从其它任务导入 -->\n <el-button size=\"small\" type=\"warning\" @click=\"openImportPanel\"\n >从其它任务导入</el-button\n >\n <div class=\"p10\">\n <tip>支持从已有的任务直接导入表单信息</tip>\n <el-button type=\"success\" @click=\"saveInfo\" style=\"width: 200px\"\n >保存</el-button\n >\n </div>\n <div style=\"color: red\" v-if=\"needSave\">有变动,请记得点击保存</div>\n <div class=\"info-panel\">\n <el-dialog\n :fullscreen=\"isMobile\"\n title=\"表单信息导入\"\n v-model=\"showImportPanel\"\n >\n <el-form\n :model=\"importPanelInfo\"\n label-width=\"100px\"\n label-position=\"right\"\n >\n <el-form-item label=\"任务\">\n <el-select\n filterable\n v-model=\"importPanelInfo.taskValue\"\n placeholder=\"请选择\"\n no-data-text=\"无可用任务\"\n >\n <el-option\n v-for=\"t in importPanelInfo.taskList\"\n :key=\"t.taskKey\"\n :label=\"t.name\"\n :value=\"t.taskKey\"\n >\n </el-option>\n </el-select>\n </el-form-item>\n <tip>{{ importPanelInfo.taskValue ? '' : '无可用任务' }}</tip>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"showImportPanel = false\">取 消</el-button>\n <el-button\n :disabled=\"!importPanelInfo.taskValue\"\n type=\"primary\"\n @click=\"handleSaveImportInfo\"\n >确 定\n </el-button>\n </span>\n </template>\n </el-dialog>\n </div>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, reactive, ref, watch, watchEffect } from 'vue'\nimport {\n CircleCloseFilled,\n CirclePlusFilled,\n Top\n} from '@element-plus/icons-vue'\nimport { useStore } from 'vuex'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\nimport { TaskApi } from '@/apis'\nimport InfosForm from '@/components/InfosForm/index.vue'\nimport {\n getDefaultFormat,\n parseFileFormat,\n parseInfo\n} from '@/utils/stringUtil'\n\nconst props = defineProps({\n rewrite: {\n type: Number,\n default: 0\n },\n info: {\n typs: String,\n default: '[]'\n },\n k: {\n type: String,\n default: ''\n },\n format: {\n type: String,\n default: '',\n required: false\n }\n})\nconst formatData = reactive(getDefaultFormat())\nconst openPreview = ref(false)\nconst infoTypeList = reactive<{ label: string; value: InfoItemType }[]>([\n {\n label: '输入框',\n value: 'input'\n },\n {\n label: '固定内容',\n value: 'text'\n },\n {\n label: '单选框',\n value: 'radio'\n },\n {\n label: '下拉选择',\n value: 'select'\n }\n])\nconst getTypeDes = (type: string) =>\n infoTypeList.find((v) => v.value === type)?.label\n\nconst selectType = ref<InfoItemType>('input')\n\nconst maxInputLength = +import.meta.env.VITE_APP_INPUT_MAX_LENGTH || 10\n\nconst autoRewrite = ref(false)\nconst infos = reactive<InfoItem[]>([])\nconst needSave = ref(false)\n// TODO:暂时限制表单的题目数为10,遇到case再修改\nconst showAddInfo = computed(() => infos.length < 10 && !openPreview.value)\n// 负责清空&更新\nwatch(\n () => props.info,\n () => {\n infos.splice(0, infos.length)\n selectType.value = 'input'\n openPreview.value = false\n infos.push(...parseInfo(props.info))\n needSave.value = false\n },\n {\n immediate: true\n }\n)\n\n// 预计格式\nconst resFormat = computed(\n () => `${infos.map((v) => v.text).join(formatData.splitChar)}.后缀`\n)\nwatchEffect(() => {\n autoRewrite.value = !!props.rewrite\n})\nconst handleChange = (v: boolean) => {\n updateTaskInfo(props.k, {\n rewrite: +v\n })\n}\n\nconst addInfo = (infoList?: InfoItem[], type?: InfoItemType) => {\n const list = infoList || infos\n const t = type || selectType.value\n const item: InfoItem = { text: `标题${list.length + 1}`, type: t, value: '' }\n if (t === 'radio' || t === 'select') {\n item.children = [{ text: '选项1' }, { text: '选项2' }]\n }\n list.push(item)\n needSave.value = true\n}\nconst deleteInfo = (idx: number, infoList?: InfoItem[], minLen = 1) => {\n const list = infoList || infos\n if (list.length <= minLen) {\n return\n }\n list.splice(idx, 1)\n needSave.value = true\n}\nconst judgeInfoForm = (items: InfoItem[]) =>\n items.every((v) => v.text.trim() && judgeInfoForm(v.children || []))\nconst saveInfo = () => {\n if (!judgeInfoForm(infos)) {\n ElMessage.error('请完整填写表单信息')\n setTimeout(() => {\n ElMessage.warning('不能有空项')\n }, 100)\n return\n }\n updateTaskInfo(props.k, {\n info: JSON.stringify(\n infos.map((v) => {\n // 特殊处理固定值的内容\n if (v.type === 'text') {\n v.value = v.text\n }\n return v\n })\n )\n })\n needSave.value = false\n}\n\nconst moveInfoUp = (idx: number) => {\n if (idx === 0) return\n const temp = infos[idx - 1]\n infos.splice(idx - 1, 1)\n infos.splice(idx, 0, temp)\n}\n\nconst importPanelInfo = reactive({ taskList: [], taskValue: '' })\nconst showImportPanel = ref(false)\nconst openImportPanel = async () => {\n const taskKey = props.k\n // 通过任务Key获取可用任务列表,与概况信息\n const { data } = await TaskApi.getUsefulTemplate(taskKey)\n importPanelInfo.taskList = data\n importPanelInfo.taskValue = data[0]?.taskKey || ''\n showImportPanel.value = true\n}\n\nconst handleSaveImportInfo = () => {\n const usefulInfo = importPanelInfo.taskList.find(\n (v) => v.taskKey === importPanelInfo.taskValue\n ).info\n infos.splice(0, infos.length)\n infos.push(...parseInfo(usefulInfo))\n showImportPanel.value = false\n needSave.value = true\n}\n\nconst $store = useStore()\nconst isMobile = computed(() => $store.getters['public/isMobile'])\nconst importPanelFlexStyle = computed(() => (isMobile.value ? '0 0 auto' : 0.5))\n\nconst showHelp = () => {\n ElMessageBox.alert(\n '<p>固定内容主要用于重命名中,固定的部分,如“活动名”,“班级名”</p><p>如要设置注意事项,请使用 <strong>批注</strong> 功能</p>',\n '注意事项',\n { dangerouslyUseHTMLString: true }\n )\n}\n\nconst handleChangeSplitChar = () => {\n updateTaskInfo(props.k, {\n format: JSON.stringify(formatData)\n })\n}\nconst splitCharList = reactive(['-', '+', '_'])\nwatchEffect(() => {\n if (props.format !== null) {\n Object.assign(formatData, parseFileFormat(props.format))\n }\n})\n</script>\n<style scoped lang=\"scss\">\n.auto-format {\n display: flex;\n justify-content: center;\n}\n\n:deep(.el-form-item__label) {\n display: flex;\n justify-content: center;\n align-items: flex-start;\n}\n\n.num-wrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 2px solid #000;\n text-align: center;\n font-size: 14px;\n}\n\n.info-panel :deep(.el-form-item__label) {\n flex: v-bind(importPanelFlexStyle);\n justify-content: flex-end;\n}\n\n.form-wrapper {\n max-width: 380px;\n margin: 0 auto;\n}\n\n.form-wrapper :deep(.el-input-group__append) {\n background-color: transparent;\n border: none;\n box-shadow: none;\n padding: 0;\n}\n\n.form-item-wrapper {\n width: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.form-item-type {\n margin-left: 10px;\n font-size: 12px;\n width: 48px;\n text-align: left;\n}\n\n.radio-list {\n padding-top: 10px;\n}\n\n.radio-list :deep(.el-input) {\n width: 80%;\n}\n</style>\n","<template>\n <div class=\"tc ddl\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjI2OTI0MQ==651496269241'\n ]\"\n >设置注意事项,供用户提交时查看</tip\n >\n <tip>注意控制字数和换行,避免展示异常,建议内容不超过5行</tip>\n <div class=\"tc flex fc fac\">\n <el-input\n v-model=\"textValue\"\n :rows=\"5\"\n clearable\n :max=\"500\"\n show-word-limit\n type=\"textarea\"\n placeholder=\"请输入要展示的批注信息\"\n />\n </div>\n <div class=\"p10\">\n <el-button size=\"default\" @click=\"updateTip\" type=\"success\"\n >保存</el-button\n >\n <el-button size=\"default\" @click=\"textValue = ''\" type=\"danger\"\n >清空</el-button\n >\n </div>\n <tip v-if=\"needSave\"> 有变动记得保存 </tip>\n <tip> 可以设置图片啦↓ 最多3张 </tip>\n <el-upload\n accept=\"image/*\"\n :limit=\"MaxImgCount\"\n v-model:file-list=\"imageList\"\n action=\"\"\n ref=\"imgUpload\"\n list-type=\"picture-card\"\n :on-change=\"handleChangeFile\"\n :on-exceed=\"handleExceedFile\"\n :on-preview=\"handlePictureCardPreview\"\n :on-remove=\"handleRemove\"\n :auto-upload=\"false\"\n >\n <el-icon><Plus /></el-icon>\n </el-upload>\n <ElImageViewer\n hide-on-click-modal\n :initial-index=\"previewIdx\"\n :url-list=\"previewList\"\n @close=\"imageViewerVisible = false\"\n teleported\n v-if=\"imageViewerVisible\"\n />\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ref, watch, computed, reactive } from 'vue'\nimport { Plus } from '@element-plus/icons-vue'\nimport { ElMessage, UploadProps, UploadUserFile } from 'element-plus'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\nimport { FileApi, PublicApi, TaskApi } from '@/apis'\nimport { qiniuUpload } from '@/utils/networkUtil'\nimport { getTipImageKey } from '@/utils/stringUtil'\n\nconst props = defineProps({\n tip: {\n type: String,\n default: '',\n required: false\n },\n k: {\n type: String,\n default: ''\n }\n})\nconst textValue = ref('')\n\nconst tipData = reactive<{\n text: string\n imgs: {\n uid: number\n name: string\n }[]\n}>({\n text: '',\n imgs: []\n})\nconst MaxImgCount = ref(3)\nconst imageList = ref<UploadUserFile[]>([])\nconst previewList = computed(() => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return imageList.value.map((v) => v!.preview || v.url)\n})\nconst previewIdx = ref(0)\n\nwatch(\n () => props.tip,\n () => {\n // 初始化\n try {\n const parseData = JSON.parse(props.tip)\n tipData.imgs = parseData.imgs\n tipData.text = parseData.text || ''\n imageList.value = tipData.imgs.map((v) => {\n return {\n ...v,\n url: 'https://img.cdn.sugarat.top/mdImg/MTY3NzkxMDI1NTU1Nw==20140524124237518.gif'\n }\n })\n if (imageList.value.length) {\n // 异步填充url\n PublicApi.getTipImageUrl(\n props.k,\n imageList.value.map((v) => ({\n uid: v.uid,\n name: v.name\n }))\n ).then((v) => {\n v.data.forEach((url, idx) => {\n imageList.value[idx].url = url.cover\n Object.assign(imageList.value[idx], {\n preview: url.preview\n })\n })\n })\n }\n } catch {\n tipData.text = props.tip || ''\n tipData.imgs = []\n imageList.value = []\n }\n\n // 外部变动\n if (tipData.text) {\n textValue.value = tipData.text\n } else {\n textValue.value = ''\n }\n },\n {\n immediate: true\n }\n)\nconst needSave = computed(() => tipData.text !== textValue.value)\n\n// 更新批注信息\nconst updateTip = (notify = true) => {\n if (tipData.text !== textValue.value) {\n tipData.text = textValue.value\n }\n updateTaskInfo(props.k, { tip: JSON.stringify(tipData) }, notify)\n}\n\nconst imageViewerVisible = ref(false)\nconst handleChangeFile = (file: UploadUserFile) => {\n if (!props.k) {\n return\n }\n const { name, uid } = file\n const key = getTipImageKey(props.k, name, uid)\n if (file.status === 'ready') {\n file.status = 'success'\n // qiniu上传\n FileApi.getUploadToken().then((res) => {\n qiniuUpload(res.data.token, file.raw, key, {\n success() {\n tipData.imgs.push({\n uid,\n name\n })\n updateTip()\n }\n })\n })\n }\n}\nconst handleRemove: UploadProps['onRemove'] = (file) => {\n const { uid, name } = file\n const idx = tipData.imgs.findIndex((v) => v.uid === uid)\n tipData.imgs.splice(idx, 1)\n updateTip()\n TaskApi.delTipImage(props.k, uid, name)\n}\n\nconst handlePictureCardPreview = (file) => {\n imageViewerVisible.value = true\n const idx = imageList.value.findIndex((v) => v.uid === file.uid)\n previewIdx.value = idx\n}\n// 超出选择的文件个数\nconst handleExceedFile = () => {\n ElMessage.error(`只能选择${MaxImgCount.value}个图片,可删除后重新选择`)\n}\n</script>\n","<template>\n <div class=\"tc\">\n <tip class=\"title\"> ↓下方设置允许提交的文件类型↓ </tip>\n <tip>暂时只支持通过文件名后缀进行卡控,后续根据反馈再优化</tip>\n <tip>例如:txt,png,jpeg,webp</tip>\n <div class=\"tc\">\n <el-switch\n active-text=\"限制文件类型\"\n inactive-text=\"不限制文件类型\"\n @change=\"handleChange\"\n :value=\"formatData.status\"\n style=\"--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949\"\n />\n </div>\n <div v-show=\"formatData.status\">\n <tip>支持英文逗号\",\"分割,一次添加多个</tip>\n <div style=\"max-width: 300px; margin: 0 auto\">\n <el-input v-model=\"typeName\" placeholder=\"请输入文件类型(省略.)\">\n <template #append>\n <el-button @click=\"handleAddType\"> 确定 </el-button>\n </template>\n </el-input>\n </div>\n <el-tag\n v-for=\"(tag, idx) in formatData.format\"\n :key=\"idx\"\n class=\"type\"\n closable\n :disable-transitions=\"false\"\n @close=\"handleDelType(idx)\"\n >\n {{ tag }}\n </el-tag>\n <tip v-show=\"formatData.format.length\"\n >已添加: <span>{{ formatData.format.join(',') }}</span>\n <el-button type=\"primary\" text size=\"small\" @click=\"handleCopyType\"\n >一键复制</el-button\n >\n </tip>\n </div>\n <div class=\"split-line\"></div>\n <tip class=\"title\"\n >↓下方设置最大同时提交文件数量(16 >= x >=1 默认 10)↓</tip\n >\n <div class=\"tc\">\n <el-input-number\n :model-value=\"formatData.limit\"\n :min=\"1\"\n :max=\"16\"\n @change=\"handleChangeLimit\"\n />\n </div>\n <div class=\"split-line\"></div>\n <tip class=\"title\"> ↓下方设置文件最大的大小↓ </tip>\n <tip>1024B = 1KB, 1024KB = 1MB, 1024MB = 1GB</tip>\n <tip>0表示不限制</tip>\n <div class=\"tc\">\n <el-input-number\n :model-value=\"inputSize\"\n :min=\"0\"\n :max=\"1024\"\n @change=\"handleLimitSize\"\n />\n <el-select\n @change=\"handleChangeUnit\"\n v-model=\"formatData.sizeUnit\"\n placeholder=\"单位\"\n style=\"width: 100px\"\n >\n <el-option v-for=\"v in unitList\" :key=\"v\" :label=\"v\" :value=\"v\" />\n </el-select>\n </div>\n <div class=\"split-line\"></div>\n <tip :style=\"formatData.size === 0 ? 'color:grey' : 'color:red'\">{{\n formatData.size === 0\n ? '不限制大小'\n : `限制为不超过: ${formatSize(formatData.size)}`\n }}</tip>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage } from 'element-plus'\nimport { reactive, ref, watchEffect } from 'vue'\nimport {\n copyRes,\n formatSize,\n getDefaultFormat,\n parseFileFormat\n} from '@/utils/stringUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nconst props = defineProps({\n format: {\n type: String,\n default: '',\n required: false\n },\n k: {\n type: String,\n default: ''\n }\n})\n\nconst formatData = reactive(getDefaultFormat())\nconst typeName = ref('')\nconst updateInfo = () => {\n updateTaskInfo(props.k, {\n format: JSON.stringify(formatData)\n })\n}\nconst handleChange = (v: boolean) => {\n formatData.status = !!v\n updateInfo()\n}\n\nconst handleAddType = () => {\n const inputValue = typeName.value.split(',')\n for (const v of inputValue) {\n if (formatData.format.includes(v)) {\n ElMessage.error(`${v} 已存在`)\n return\n }\n }\n\n formatData.format.push(...inputValue)\n updateInfo()\n\n typeName.value = ''\n}\nconst handleDelType = (idx) => {\n formatData.format.splice(idx, 1)\n updateInfo()\n}\nconst handleCopyType = () => {\n copyRes(formatData.format.join(','))\n}\n\nconst handleChangeLimit = (limit: number) => {\n formatData.limit = limit\n updateInfo()\n}\n\nconst inputSize = ref(0)\nconst unitList = reactive(['B', 'KB', 'MB', 'GB'])\nconst handleChangeUnit = () => {\n const idx = unitList.findIndex((v) => v === formatData.sizeUnit)\n formatData.size = inputSize.value * 1024 ** idx\n updateInfo()\n}\nconst handleLimitSize = (limit: number) => {\n inputSize.value = limit\n const idx = unitList.findIndex((v) => v === formatData.sizeUnit)\n formatData.size = inputSize.value * 1024 ** idx\n updateInfo()\n}\n\nwatchEffect(() => {\n if (props.format !== null) {\n Object.assign(formatData, parseFileFormat(props.format))\n }\n})\n</script>\n<style scoped>\n.type {\n margin: 10px;\n}\n.split-line {\n margin-top: 10px;\n}\n.title {\n color: black;\n font-weight: bold;\n}\n</style>\n","<template>\n <div class=\"tasks\">\n <!-- 分类管理 -->\n <div class=\"categorys-area\">\n <CategoryPanel v-model:category=\"selectCategory\"></CategoryPanel>\n </div>\n\n <!-- 任务管理 -->\n <div class=\"panel task-panel\">\n <!-- 创建任务 -->\n <create-task :activeCategoryKey=\"selectCategory\"></create-task>\n\n <!-- 任务列表 -->\n <div class=\"task-list\">\n <TaskInfo\n @edit=\"editBaseInfo\"\n @delete=\"deleteTask\"\n @share=\"shareTask\"\n @more=\"editMore\"\n v-for=\"item in filterTasks\"\n :key=\"item.key\"\n :item=\"item\"\n ></TaskInfo>\n <el-empty\n v-if=\"filterTasks.length === 0\"\n description=\"此分类下没有任务哟,快去创建吧\"\n ></el-empty>\n </div>\n </div>\n\n <!-- 任务基本信息维护弹窗 -->\n <el-dialog\n draggable\n :fullscreen=\"isMobile\"\n title=\"基本信息修改\"\n v-model=\"showBaseInfoDialog\"\n >\n <el-form :model=\"taskBaseInfo\">\n <el-form-item label=\"任务名称\" label-width=\"100px\">\n <el-input v-model=\"taskBaseInfo.name\" autocomplete=\"off\"></el-input>\n </el-form-item>\n <el-form-item label=\"新的分类\" label-width=\"100px\">\n <el-select v-model=\"taskBaseInfo.category\" placeholder=\"请选择新分类\">\n <el-option label=\"默认\" value=\"default\"></el-option>\n <el-option\n v-for=\"c in categorys\"\n :key=\"c.k\"\n :label=\"c.name\"\n :value=\"c.k\"\n ></el-option>\n </el-select>\n </el-form-item>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"showBaseInfoDialog = false\">取 消</el-button>\n <el-button type=\"primary\" @click=\"handleSaveEditInfo\"\n >确 定</el-button\n >\n </span>\n </template>\n </el-dialog>\n\n <!-- 分享链接弹窗(二维码/链接/短链) -->\n <LinkDialog\n v-model:value=\"showLinkModal\"\n :download=\"false\"\n title=\"收取链接\"\n :link=\"shareTaskLink\"\n >\n </LinkDialog>\n <!-- 附加属性编辑弹窗 -->\n <el-dialog\n :fullscreen=\"isMobile\"\n title=\"更多设置\"\n v-model=\"showTaskInfoPanel\"\n center\n >\n <div>\n <h3 class=\"tc\" style=\"font-size: 14px; color: #9e9e9e\">\n 任务名:<strong style=\"color: #000000\">{{ activeTask.name }}</strong\n >,\n <el-button type=\"primary\" text @click=\"openTaskPage\"\n >去查看效果</el-button\n >\n </h3>\n <el-tabs v-model=\"activeInfo\">\n <el-tab-pane label=\"截止日期\" name=\"ddl\">\n <DDlPanel :ddl=\"taskInfo.ddl\" :k=\"activeTask.key\" />\n </el-tab-pane>\n <el-tab-pane label=\"批注信息\" name=\"tip\">\n <TipInfoPanel\n :rewrite=\"taskInfo.rewrite\"\n :tip=\"taskInfo.tip\"\n :k=\"activeTask.key\"\n />\n </el-tab-pane>\n <el-tab-pane label=\"限制名单\" name=\"people\">\n <PeoplePanel\n :name=\"activeTask.name\"\n :value=\"taskInfo.people\"\n :k=\"activeTask.key\"\n :field=\"taskInfo.bindField\"\n />\n </el-tab-pane>\n <el-tab-pane label=\"必填信息\" name=\"info\">\n <InfoPanel\n :rewrite=\"taskInfo.rewrite\"\n :info=\"taskInfo.info\"\n :k=\"activeTask.key\"\n :format=\"taskInfo.format\"\n />\n </el-tab-pane>\n <el-tab-pane label=\"模板文件\" name=\"template\">\n <TemplatePanel :value=\"taskInfo.template\" :k=\"activeTask.key\" />\n </el-tab-pane>\n <el-tab-pane label=\"文件属性\" name=\"attr\">\n <FileInfoPanel :format=\"taskInfo.format\" :k=\"activeTask.key\" />\n </el-tab-pane>\n </el-tabs>\n </div>\n </el-dialog>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, onMounted, reactive, ref, watchEffect } from 'vue'\nimport { useStore } from 'vuex'\nimport LinkDialog from '@components/linkDialog.vue'\nimport { TaskApi } from '@/apis'\nimport { copyRes } from '@/utils/stringUtil'\nimport CategoryPanel from './components/CategoryPanel.vue'\nimport CreateTask from './components/CreateTask.vue'\nimport TaskInfo from './components/TaskInfo.vue'\nimport DDlPanel from './components/infoPanel/ddl.vue'\nimport PeoplePanel from './components/infoPanel/people.vue'\nimport TemplatePanel from './components/infoPanel/template.vue'\nimport InfoPanel from './components/infoPanel/info.vue'\nimport TipInfoPanel from './components/infoPanel/tipInfo.vue'\nimport FileInfoPanel from './components/infoPanel/file.vue'\n\nconst $store = useStore()\nconst isMobile = computed(() => $store.getters['public/isMobile'])\n// 分类相关\nconst categorys = computed(() => $store.state.category.categoryList)\n\n// 任务相关\nconst selectCategory = ref('default')\nconst tasks = computed<TaskApiTypes.TaskItem[]>(\n () => $store.state.task.taskList\n)\nconst filterTasks = computed(() => {\n const t = tasks.value.filter((v) => v.category === selectCategory.value)\n return t\n})\n\n// 删除任务\nconst deleteTask = (k: string, isTrash = false) => {\n if (!k) return\n ElMessageBox.confirm(\n '确认删除此任务吗?',\n isTrash ? '!!回收站的删除后无法再恢复' : '数据无价,请谨慎操作',\n {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: isTrash ? 'error' : 'info'\n }\n )\n .then(() => {\n $store.dispatch('task/deleteTask', k).then(() => {\n ElMessage.success('删除成功')\n })\n })\n .catch(() => {\n ElMessage.info('取消删除')\n })\n}\n\n// 基本信息编辑\nconst showBaseInfoDialog = ref(false)\nconst taskBaseInfo = reactive({ name: '', category: '', key: '' })\nconst editBaseInfo = (task: any) => {\n taskBaseInfo.name = task.name\n taskBaseInfo.category = task.category\n taskBaseInfo.key = task.key\n showBaseInfoDialog.value = true\n}\nconst handleSaveEditInfo = () => {\n showBaseInfoDialog.value = false\n if (!taskBaseInfo.name.trim()) {\n ElMessage.warning('不能为空')\n return\n }\n $store.dispatch('task/updateTask', taskBaseInfo).then(() => {\n ElMessage.success('更新成功')\n })\n}\n\n// 生成分享链接\nconst shareTaskLink = ref('')\nconst showLinkModal = ref(false)\nconst shareTask = (k: string) => {\n shareTaskLink.value = 'default'\n const { origin } = window.location\n shareTaskLink.value = `${origin}/task/${k}`\n copyRes(shareTaskLink.value, '收集链接已自动复制到粘贴板')\n showLinkModal.value = true\n}\n\n// 附加属性编辑\nconst taskInfo = reactive<TaskApiTypes.TaskInfo>({})\nconst showTaskInfoPanel = ref(false)\nconst activeInfo = ref('info')\nconst activeTask: TaskApiTypes.TaskItem = reactive({\n category: '',\n key: '',\n name: '',\n recentLog: []\n})\nconst editMore = (item: any) => {\n Object.assign(activeTask, item)\n TaskApi.getTaskMoreInfo(item.key).then((res) => {\n // 先初始化,再赋值\n taskInfo.info = '[]'\n taskInfo.ddl = ''\n taskInfo.tip = ''\n taskInfo.format = ''\n taskInfo.bindField = ''\n setTimeout(() => {\n Object.assign(taskInfo, res.data)\n showTaskInfoPanel.value = true\n })\n })\n}\n\n// TODO: 有需要再优化,目前像bug\n// 用于选择默认展示项目\n// const taskCount = (c: string) => {\n// const count = tasks.value.filter((t: any) => t.category === c).length\n// return count\n// }\n\n// 选中一个有任务数据的分类\n// watchEffect(() => {\n// if (taskCount('default') > 0) {\n// return\n// }\n// if (categorys.value.length > 0) {\n// for (const c of categorys.value) {\n// if (taskCount(c.k) > 0) {\n// selectCategory.value = c.k\n// break\n// }\n// }\n// }\n// })\n\nonMounted(() => {\n $store.dispatch('category/getCategory')\n $store.dispatch('task/getTask')\n})\n\nconst openTaskPage = () => {\n window.open(`/task/${activeTask.key}`)\n}\n</script>\n<style scoped lang=\"scss\">\n.tasks {\n max-width: 1024px;\n margin: 0 auto;\n padding-bottom: 2em;\n}\n\n.tasks :deep(.el-dialog__body) {\n padding-top: 10px;\n}\n\n.panel {\n padding: 1em;\n background-color: #fff;\n margin: 10px auto;\n box-sizing: border-box;\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n}\n\n.task-list {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-around;\n}\n\n@media screen and (max-width: 700px) {\n .categorys-area {\n margin-top: 20px;\n }\n :deep(.el-tabs__nav-scroll) {\n overflow-x: scroll;\n &::-webkit-scrollbar {\n display: none; /* Chrome Safari */\n }\n }\n}\n</style>\n"],"names":["cardProps","buildProps","definePropType","__default__","_sfc_main","defineComponent","__props","ns","useNamespace","_ctx","_cache","openBlock","createElementBlock","normalizeClass","unref","renderSlot","createTextVNode","toDisplayString","createCommentVNode","createElementVNode","normalizeStyle","Card","_export_sfc","ElCard","withInstall","inputNumberProps","useSizeProp","val","isNumber","inputNumberEmits","CHANGE_EVENT","prev","cur","e","INPUT_EVENT","isNil","UPDATE_MODEL_EVENT","_hoisted_1","_hoisted_2","expose","emit","props","t","useLocale","input","ref","data","reactive","formItem","useFormItem","minDisabled","computed","ensurePrecision","maxDisabled","numPrecision","stepPrecision","getPrecision","isUndefined","controlsAtRight","inputNumberSize","useSize","inputNumberDisabled","useDisabled","displayValue","currentValue","toPrecision","num","pre","snum","pointPos","length","value","valueString","dotPosition","precision","coefficient","increase","newVal","setCurrentValue","decrease","verifyValue","update","max","min","step","stepStrictly","valueOnClear","isString","_a","oldVal","err","debugWarn","handleInput","handleInputChange","focus","_b","blur","handleFocus","event","handleBlur","watch","onMounted","modelValue","innerInput","onUpdated","withModifiers","withDirectives","withKeys","createVNode","ElIcon","withCtx","createBlock","ArrowDown","Minus","RepeatClick","ArrowUp","Plus","ElInput","InputNumber","ElInputNumber","_hoisted_3","_sfc_render","$props","$setup","$data","$options","circleCloseFilled","circlePlusFilled","_delete","_hoisted_4","edit","menu","plus","share","top","_sfc_main$9","DeleteFilled","context","$store","useStore","categorys","tasks","taskCount","c","count","isShowCreateCategory","categoryName","addCategory","ElMessage","handleClickCategory","k","ElMessageBox","_withScopeId","n","_pushScopeId","_popScopeId","_createElementVNode","_hoisted_5","_component_el_icon","__unplugin_components_3","_openBlock","_createBlock","_component_el_input","$event","_withKeys","_component_el_button","_createVNode","_component_el_tag","_withCtx","_hoisted_6","_hoisted_7","_createElementBlock","_Fragment","_renderList","tag","v","isShowCreateTask","taskName","createTask","updateTaskInfo","debounce","key","options","successInfo","TaskApi","newDate","watchEffect","updateDDL","ddl","formatDate","closeDDL","waitTime","isOver","waitTimeStr","seconds","hour","day","minute","refreshWaitTime","loop","activeTab","userInputName","importStatus","handAddName","PeopleApi","checkMore","people","updateLimitPeople","limit","showPeopleList","peopleList","selectSubmitStatus","searchName","filterPeopleBySearchWord","peopleSubmitData","p","isLoadingPeopleData","refreshSubmitData","res","handleCheckMore","checkPeople","handleDeletePeople","item","peopleFileList","peopleUpload","handleExceedFile","clearFiles","submitUploadPeople","file","uploadFile","name","type","success","fail","tableToExcel","handleChangeFile","handleExportExcel","headers","body","status","lastDate","submitCount","fileCount","isMobile","importPanelInfo","showImportPanel","openImportPanel","taskKey","ImportTaskTipMsg","taskList","taskValue","task","handleSaveImportInfo","importPanelFlexStyle","bindField","handleSureBind","_sfc_main$4","template","percentage","deleteTemplate","fileList","elUpload","FileApi","qiniuUpload","per","Tip","_component_el_upload","__unplugin_components_1","_component_tip","_toDisplayString","formatData","getDefaultFormat","openPreview","infoTypeList","getTypeDes","selectType","maxInputLength","autoRewrite","infos","needSave","showAddInfo","parseInfo","resFormat","handleChange","addInfo","infoList","list","deleteInfo","idx","minLen","judgeInfoForm","items","saveInfo","moveInfoUp","temp","usefulInfo","showHelp","handleChangeSplitChar","splitCharList","parseFileFormat","textValue","tipData","MaxImgCount","imageList","previewList","previewIdx","parseData","PublicApi","url","updateTip","notify","imageViewerVisible","uid","getTipImageKey","handleRemove","handlePictureCardPreview","typeName","updateInfo","handleAddType","inputValue","handleDelType","handleCopyType","copyRes","handleChangeLimit","inputSize","unitList","handleChangeUnit","handleLimitSize","selectCategory","filterTasks","deleteTask","isTrash","showBaseInfoDialog","taskBaseInfo","editBaseInfo","handleSaveEditInfo","shareTaskLink","showLinkModal","shareTask","origin","taskInfo","showTaskInfoPanel","activeInfo","activeTask","editMore","openTaskPage"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]}
@@ -0,0 +1,2 @@
1
+ import{g as U,d as $,f as b,c as k,a as o,r as u,h as A,u as M,i as S,j as a,w as d,l as q,k as m,m as H,b as h,t as N,n as g,q as V,E as n,P as I,U as j,s as F,v as L,x as R,y as G,z as J,A as K,_ as O}from"./index-1639ad54.js";const Q=$({name:"ChatDotSquare"}),W={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},X=o("path",{fill:"currentColor",d:"M273.536 736H800a64 64 0 0 0 64-64V256a64 64 0 0 0-64-64H224a64 64 0 0 0-64 64v570.88L273.536 736zM296 800 147.968 918.4A32 32 0 0 1 96 893.44V256a128 128 0 0 1 128-128h576a128 128 0 0 1 128 128v416a128 128 0 0 1-128 128H296z"},null,-1),Y=o("path",{fill:"currentColor",d:"M512 499.2a51.2 51.2 0 1 1 0-102.4 51.2 51.2 0 0 1 0 102.4zm192 0a51.2 51.2 0 1 1 0-102.4 51.2 51.2 0 0 1 0 102.4zm-384 0a51.2 51.2 0 1 1 0-102.4 51.2 51.2 0 0 1 0 102.4z"},null,-1),Z=[X,Y];function ee(C,s,i,r,p,x){return b(),k("svg",W,Z)}var te=U(Q,[["render",ee]]);const ae={class:"login"},oe={class:"inputArea"},ne={class:"tc"},se={class:"links"},le=$({__name:"index",setup(C){const s=u(""),i=u(""),r=u(""),p=u(""),x=A(),y=M(),D=()=>{y.replace({name:"dashboard"})},T=()=>V.test(s.value)?J.test(r.value)?r.value!==p.value?(n.warning("两次输入的密码不一致"),!1):K.test(i.value)?!0:(n.warning("验证码不正确(4位 数字)"),!1):(n.warning("密码格式不正确(6-16位 支持字母/数字/下划线)"),!1):(n.warning("手机号格式不正确"),!1),f=u("获取验证码"),c=u(0),w=()=>{if(c.value===0){f.value="获取验证码";return}f.value="".concat(c.value,"s"),c.value-=1,setTimeout(w,1e3)},z=()=>{if(!V.test(s.value)){n.warning("手机号格式不正确");return}I.getCode(s.value).then(()=>{c.value=120,w(),n.success("获取成功,请注意查看手机短信")})},B=()=>{T()&&j.resetPwd(s.value,i.value,r.value).then(_=>{n.success("密码重置成功");const{token:e}=_.data;x.commit("user/setToken",e),D()}).catch(_=>{const{code:e,data:t}=_,v={1008:"该手机号未绑定任何账号",1003:"验证码不正确",1004:"密码格式不正确",1010:"账号已被封禁,有疑问请联系管理员",1009:"账号已被冻结,解冻时间".concat((t==null?void 0:t.openTime)&&F(new Date(t.openTime)))};n.error(v[e]||"重置失败,未知错误")})};return(_,e)=>{const t=L,v=R,E=G,P=S("router-link");return b(),k("div",ae,[a(q,null,{default:d(()=>[o("div",oe,[o("div",null,[a(t,{maxlength:"11",placeholder:"手机号","prefix-icon":m(H),modelValue:s.value,"onUpdate:modelValue":e[0]||(e[0]=l=>s.value=l),clearable:""},null,8,["prefix-icon","modelValue"])]),o("div",null,[a(t,{maxlength:"4",type:"number",placeholder:"请输入验证码","prefix-icon":m(te),modelValue:i.value,"onUpdate:modelValue":e[1]||(e[1]=l=>i.value=l),clearable:""},{append:d(()=>[a(v,{disabled:c.value!==0,onClick:z},{default:d(()=>[h(N(f.value),1)]),_:1},8,["disabled"])]),_:1},8,["prefix-icon","modelValue"])]),o("div",null,[a(t,{maxlength:"16",minlength:"6",type:"password",placeholder:"请输入新密码","prefix-icon":m(g),modelValue:r.value,"onUpdate:modelValue":e[2]||(e[2]=l=>r.value=l),"show-password":"",clearable:""},null,8,["prefix-icon","modelValue"])]),o("div",null,[a(t,{maxlength:"16",minlength:"6",type:"password",placeholder:"请再次输入新密码","prefix-icon":m(g),modelValue:p.value,"onUpdate:modelValue":e[3]||(e[3]=l=>p.value=l),"show-password":"",clearable:""},null,8,["prefix-icon","modelValue"])]),o("div",ne,[a(v,{onClick:B,type:"primary",class:"fw-w100"},{default:d(()=>[h("确认重置")]),_:1})]),a(E),o("div",se,[a(P,{to:"/login"},{default:d(()=>[h("去登陆")]),_:1})])])]),_:1})])}}});const ue=O(le,[["__scopeId","data-v-4e645608"]]);export{ue as default};
2
+ //# sourceMappingURL=index-2c76567d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-2c76567d.js","sources":["../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.3.4/node_modules/@element-plus/icons-vue/dist/es/chat-dot-square.mjs","../../src/pages/reset/index.vue"],"sourcesContent":["import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"ChatDotSquare\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M273.536 736H800a64 64 0 0 0 64-64V256a64 64 0 0 0-64-64H224a64 64 0 0 0-64 64v570.88L273.536 736zM296 800 147.968 918.4A32 32 0 0 1 96 893.44V256a128 128 0 0 1 128-128h576a128 128 0 0 1 128 128v416a128 128 0 0 1-128 128H296z\"\n}, null, -1);\nconst _hoisted_3 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M512 499.2a51.2 51.2 0 1 1 0-102.4 51.2 51.2 0 0 1 0 102.4zm192 0a51.2 51.2 0 1 1 0-102.4 51.2 51.2 0 0 1 0 102.4zm-384 0a51.2 51.2 0 1 1 0-102.4 51.2 51.2 0 0 1 0 102.4z\"\n}, null, -1);\nconst _hoisted_4 = [\n _hoisted_2,\n _hoisted_3\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_4);\n}\nvar chatDotSquare = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { chatDotSquare as default };\n","<template>\n <div class=\"login\">\n <login-panel>\n <!-- 表单输入区域 -->\n <div class=\"inputArea\">\n <div>\n <el-input\n maxlength=\"11\"\n placeholder=\"手机号\"\n :prefix-icon=\"Phone\"\n v-model=\"account\"\n clearable\n ></el-input>\n </div>\n <div>\n <el-input\n maxlength=\"4\"\n type=\"number\"\n placeholder=\"请输入验证码\"\n :prefix-icon=\"ChatDotSquare\"\n v-model=\"code\"\n clearable\n >\n <template #append>\n <!-- 获取验证码 -->\n <el-button :disabled=\"time !== 0\" @click=\"getCode\">{{ codeText }}</el-button>\n </template>\n </el-input>\n </div>\n <div>\n <el-input\n maxlength=\"16\"\n minlength=\"6\"\n type=\"password\"\n placeholder=\"请输入新密码\"\n :prefix-icon=\"Lock\"\n v-model=\"pwd1\"\n show-password\n clearable\n ></el-input>\n </div>\n <div>\n <el-input\n maxlength=\"16\"\n minlength=\"6\"\n type=\"password\"\n placeholder=\"请再次输入新密码\"\n :prefix-icon=\"Lock\"\n v-model=\"pwd2\"\n show-password\n clearable\n ></el-input>\n </div>\n <div class=\"tc\">\n <el-button @click=\"reset\" type=\"primary\" class=\"fw-w100\">确认重置</el-button>\n </div>\n <el-divider></el-divider>\n <div class=\"links\">\n <router-link to=\"/login\">去登陆</router-link>\n </div>\n </div>\n </login-panel>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage } from 'element-plus'\nimport {\n Lock, Phone, ChatDotSquare,\n} from '@element-plus/icons-vue'\nimport {\n ref,\n} from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useStore } from 'vuex'\nimport loginPanel from '@components/loginPanel.vue'\nimport { PublicApi, UserApi } from '@/apis'\nimport {\n rMobilePhone, rPassword, rVerCode,\n} from '@/utils/regExp'\nimport { formatDate } from '@/utils/stringUtil'\n\nconst account = ref('')\nconst code = ref('')\nconst pwd1 = ref('')\nconst pwd2 = ref('')\nconst $store = useStore()\nconst $router = useRouter()\nconst redirectDashBoard = () => {\n $router.replace({\n name: 'dashboard',\n })\n}\nconst checkForm = () => {\n if (!rMobilePhone.test(account.value)) {\n ElMessage.warning('手机号格式不正确')\n return false\n }\n\n if (!rPassword.test(pwd1.value)) {\n ElMessage.warning('密码格式不正确(6-16位 支持字母/数字/下划线)')\n return false\n }\n if (pwd1.value !== pwd2.value) {\n ElMessage.warning('两次输入的密码不一致')\n return false\n }\n\n if (!rVerCode.test(code.value)) {\n ElMessage.warning('验证码不正确(4位 数字)')\n return false\n }\n return true\n}\nconst codeText = ref('获取验证码')\nconst time = ref(0)\nconst refreshCodeText = () => {\n if (time.value === 0) {\n codeText.value = '获取验证码'\n return\n }\n codeText.value = `${time.value}s`\n time.value -= 1\n setTimeout(refreshCodeText, 1000)\n}\nconst getCode = () => {\n if (!rMobilePhone.test(account.value)) {\n ElMessage.warning('手机号格式不正确')\n return\n }\n PublicApi.getCode(account.value).then(() => {\n time.value = 120\n refreshCodeText()\n ElMessage.success('获取成功,请注意查看手机短信')\n })\n}\nconst reset = () => {\n if (!checkForm()) {\n return\n }\n UserApi\n .resetPwd(account.value, code.value, pwd1.value)\n .then((res) => {\n ElMessage.success('密码重置成功')\n const { token } = res.data\n $store.commit('user/setToken', token)\n redirectDashBoard()\n })\n .catch((err) => {\n const { code: c, data } = err\n const options: any = {\n 1008: '该手机号未绑定任何账号',\n 1003: '验证码不正确',\n 1004: '密码格式不正确',\n 1010: '账号已被封禁,有疑问请联系管理员',\n 1009: `账号已被冻结,解冻时间${data?.openTime && formatDate(new Date(data.openTime))}`,\n }\n ElMessage.error(options[c] || '重置失败,未知错误')\n })\n}\n\n</script>\n\n<style scoped lang=\"scss\">\n.login {\n background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);\n min-height: 100vh;\n}\n\n.inputArea {\n // padding: 1rem;\n margin: 0 auto;\n max-width: 320px;\n div {\n margin-top: 10px;\n }\n}\n// 登录按钮下方链接\n.links {\n display: flex;\n justify-content: center;\n a {\n color: #409eff;\n margin-left: 10px;\n }\n}\n</style>\n"],"names":["_sfc_main","defineComponent","_hoisted_1","_hoisted_2","createElementVNode","_hoisted_3","_hoisted_4","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","chatDotSquare","_export_sfc","account","ref","code","pwd1","pwd2","$store","useStore","$router","useRouter","redirectDashBoard","checkForm","rMobilePhone","rPassword","ElMessage","rVerCode","codeText","time","refreshCodeText","getCode","PublicApi","reset","UserApi","res","token","err","c","data","options","formatDate"],"mappings":"qOAGA,MAAMA,EAAYC,EAAgB,CAChC,KAAM,eACR,CAAC,EACKC,EAAa,CACjB,QAAS,gBACT,MAAO,4BACT,EACMC,EAA6BC,EAAmB,OAAQ,CAC5D,KAAM,eACN,EAAG,mOACL,EAAG,KAAM,EAAE,EACLC,EAA6BD,EAAmB,OAAQ,CAC5D,KAAM,eACN,EAAG,4KACL,EAAG,KAAM,EAAE,EACLE,EAAa,CACjBH,EACAE,CACF,EACA,SAASE,GAAYC,EAAMC,EAAQC,EAAQC,EAAQC,EAAOC,EAAU,CAClE,OAAOC,EAAW,EAAEC,EAAmB,MAAOb,EAAYI,CAAU,CACtE,CACA,IAAIU,GAAgCC,EAAYjB,EAAW,CAAC,CAAC,SAAUO,EAAW,CAAC,CAAC,mHCwDpF,MAAAW,EAAAC,EAAA,EAAA,EACAC,EAAAD,EAAA,EAAA,EACAE,EAAAF,EAAA,EAAA,EACAG,EAAAH,EAAA,EAAA,EACAI,EAAAC,IACAC,EAAAC,IACAC,EAAA,IAAA,CACEF,EAAA,QAAA,CAAgB,KAAA,WACR,CAAA,CACP,EAEHG,EAAA,IACEC,EAAA,KAAAX,EAAA,KAAA,EAKAY,EAAA,KAAAT,EAAA,KAAA,EAIAA,EAAA,QAAAC,EAAA,OACES,EAAA,QAAA,YAAA,EACA,IAGFC,EAAA,KAAAZ,EAAA,KAAA,EAIA,IAHEW,EAAA,QAAA,eAAA,EACA,KAVAA,EAAA,QAAA,4BAAA,EACA,KANAA,EAAA,QAAA,UAAA,EACA,IAkBJE,EAAAd,EAAA,OAAA,EACAe,EAAAf,EAAA,CAAA,EACAgB,EAAA,IAAA,CACE,GAAAD,EAAA,QAAA,EAAA,CACED,EAAA,MAAA,QACA,MAAA,CAEFA,EAAA,MAAA,GAAA,OAAAC,EAAA,MAAA,KACAA,EAAA,OAAA,EACA,WAAAC,EAAA,GAAA,CAAgC,EAElCC,EAAA,IAAA,CACE,GAAA,CAAAP,EAAA,KAAAX,EAAA,KAAA,EAAA,CACEa,EAAA,QAAA,UAAA,EACA,MAAA,CAEFM,EAAA,QAAAnB,EAAA,KAAA,EAAA,KAAA,IAAA,CACEgB,EAAA,MAAA,IACAC,IACAJ,EAAA,QAAA,gBAAA,CAAkC,CAAA,CACnC,EAEHO,EAAA,IAAA,CACEV,EAAA,GAGAW,EAAA,SAAArB,EAAA,MAAAE,EAAA,MAAAC,EAAA,KAAA,EAAA,KAAAmB,GAAA,CAGIT,EAAA,QAAA,QAAA,EACA,KAAA,CAAA,MAAAU,CAAA,EAAAD,EAAA,KACAjB,EAAA,OAAA,gBAAAkB,CAAA,EACAd,GAAkB,CAAA,EAAA,MAAAe,GAAA,CAGlB,KAAA,CAAA,KAAAC,EAAA,KAAAC,CAAA,EAAAF,EACAG,EAAA,CAAqB,KAAA,cACb,KAAA,SACA,KAAA,UACA,KAAA,mBACA,KAAA,cAAA,QAAAD,GAAA,YAAAA,EAAA,WAAAE,EAAA,IAAA,KAAAF,EAAA,QAAA,CAAA,EACmE,EAE3Eb,EAAA,MAAAc,EAAAF,CAAA,GAAA,WAAA,CAAyC,CAAA,CAC1C","x_google_ignoreList":[0]}