hrp-ui-base 1.4.7 → 1.4.8

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 (373) hide show
  1. package/README.md +51 -51
  2. package/dist/components.cjs +1 -1
  3. package/dist/components.es.js +25 -25
  4. package/dist/style.css +1 -1
  5. package/package.json +101 -101
  6. package/packages/approval-process/.eslintrc +6 -6
  7. package/packages/approval-process/README.md +22 -22
  8. package/packages/approval-process/index.ts +65 -65
  9. package/packages/approval-process/package.json +17 -17
  10. package/packages/approval-process/packages/components/choose-member/BO/departBo.ts +8 -8
  11. package/packages/approval-process/packages/components/choose-member/BO/memberBo.ts +14 -14
  12. package/packages/approval-process/packages/components/choose-member/BO/roleBo.ts +16 -16
  13. package/packages/approval-process/packages/components/choose-member/index.vue +496 -496
  14. package/packages/approval-process/packages/components/choose-member/styles/common.scss +133 -133
  15. package/packages/approval-process/packages/components/comment/assets/download.svg +4 -4
  16. package/packages/approval-process/packages/components/comment/assets/mp3.svg +11 -11
  17. package/packages/approval-process/packages/components/comment/assets/mp4.svg +11 -11
  18. package/packages/approval-process/packages/components/comment/assets/other.svg +11 -11
  19. package/packages/approval-process/packages/components/comment/assets/pdf.svg +11 -11
  20. package/packages/approval-process/packages/components/comment/assets/ppt.svg +11 -11
  21. package/packages/approval-process/packages/components/comment/assets/preview.svg +4 -4
  22. package/packages/approval-process/packages/components/comment/assets/word.svg +11 -11
  23. package/packages/approval-process/packages/components/comment/assets/xls.svg +11 -11
  24. package/packages/approval-process/packages/components/comment/index.vue +843 -843
  25. package/packages/approval-process/packages/components/comment/modules/previewMp.vue +53 -53
  26. package/packages/approval-process/packages/components/comment/styles/comment-style.scss +303 -303
  27. package/packages/approval-process/packages/components/image-cropper/index.vue +202 -202
  28. package/packages/approval-process/packages/components/sign/index.vue +766 -766
  29. package/packages/approval-process/packages/components/sign/modules/full-screen-sign.vue +19 -19
  30. package/packages/approval-process/packages/components/urge-dialog/index.vue +120 -120
  31. package/packages/approval-process/packages/components/vue-esign/index.vue +289 -289
  32. package/packages/approval-process/packages/flow/approve-component/approve-success.vue +81 -81
  33. package/packages/approval-process/packages/flow/approve-component/route-params-error.vue +48 -48
  34. package/packages/approval-process/packages/flow/approve-component/submit-success.vue +58 -58
  35. package/packages/approval-process/packages/flow/examine-approve-itr.vue +978 -978
  36. package/packages/approval-process/packages/flow/examine-approve.vue +1065 -1065
  37. package/packages/approval-process/packages/flow/form-component/associated-approval-form/README.md +38 -38
  38. package/packages/approval-process/packages/flow/form-component/associated-approval-form/index.vue +158 -158
  39. package/packages/approval-process/packages/flow/form-component/associated-approval-form/modules/associated-approval-form-mobile.vue +297 -297
  40. package/packages/approval-process/packages/flow/form-component/associated-approval-form/modules/associated-approval-form-pc.vue +314 -314
  41. package/packages/approval-process/packages/flow/form-component/associated-approval-form/style/curd-area-mobile.scss +109 -109
  42. package/packages/approval-process/packages/flow/form-component/associated-approval-form/style/curd-area.scss +95 -95
  43. package/packages/approval-process/packages/flow/form-component/associated-approval-form/style/out-put.scss +47 -47
  44. package/packages/approval-process/packages/flow/form-component/show-sign.vue +27 -27
  45. package/packages/approval-process/packages/flow/styles/common.scss +133 -133
  46. package/packages/approval-process/packages/flow/styles/examine-approve-pc.scss +465 -465
  47. package/packages/approval-process/packages/flow/styles/examine-approve-phone.scss +292 -292
  48. package/packages/approval-process/packages/flow/styles/submit-approve-pc.scss +379 -379
  49. package/packages/approval-process/packages/flow/styles/submit-approve-phone.scss +336 -336
  50. package/packages/approval-process/packages/flow/submit-approve-itr.vue +622 -622
  51. package/packages/approval-process/packages/flow/submit-approve.vue +627 -627
  52. package/packages/approval-process/packages/flow/systemCom/BO/departBo.ts +8 -8
  53. package/packages/approval-process/packages/flow/systemCom/BO/memberBo.ts +14 -14
  54. package/packages/approval-process/packages/flow/systemCom/BO/roleBo.ts +16 -16
  55. package/packages/approval-process/packages/flow/systemCom/choose-depart.vue +398 -398
  56. package/packages/approval-process/packages/flow/systemCom/choose-member-phone.vue +514 -514
  57. package/packages/approval-process/packages/flow/systemCom/choose-member.vue +564 -564
  58. package/packages/approval-process/packages/flow/systemCom/choose-role.vue +300 -300
  59. package/packages/approval-process/packages/styles/common.scss +133 -133
  60. package/packages/approval-process/packages/styles/flex-common.scss +117 -117
  61. package/packages/approval-process/packages/styles/flexCommon.scss +72 -72
  62. package/packages/approval-process/packages/styles/main.css +216 -216
  63. package/packages/approval-process/packages/styles/router-page.scss +370 -370
  64. package/packages/approval-process/packages/styles/style-set.ts +207 -207
  65. package/packages/approval-process/packages/types.d.ts +3 -3
  66. package/packages/approval-process/packages/utils/base.ts +15 -15
  67. package/packages/approval-process/packages/utils/crypto.ts +66 -66
  68. package/packages/approval-process/packages/utils/ddUtils.ts +56 -56
  69. package/packages/approval-process/packages/utils/debounce.ts +35 -35
  70. package/packages/approval-process/packages/utils/des.js +1107 -1107
  71. package/packages/approval-process/packages/utils/download.ts +38 -38
  72. package/packages/approval-process/packages/utils/editor.ts +36 -36
  73. package/packages/approval-process/packages/utils/getEnv.ts +36 -36
  74. package/packages/approval-process/packages/utils/os.ts +20 -20
  75. package/packages/approval-process/packages/utils/path-util.ts +31 -31
  76. package/packages/approval-process/packages/utils/routerUtil.ts +304 -304
  77. package/packages/approval-process/packages/utils/string-utils.ts +13 -13
  78. package/packages/approval-process/packages/utils/throttle.ts +44 -44
  79. package/packages/approval-process/packages/utils/validate.ts +92 -92
  80. package/packages/approval-process/packages/utils/ws.ts +218 -218
  81. package/packages/approval-process/tsconfig.json +72 -72
  82. package/packages/approval-process/vite.config.ts +56 -56
  83. package/src/api/bms/dict/bo/DictConfigBO.ts +23 -23
  84. package/src/api/bms/dict/bo/DictConfigBaseVO.ts +24 -24
  85. package/src/api/bms/dict/bo/DictConfigSearchBO.ts +12 -12
  86. package/src/api/bms/dict/bo/DictImportBO.ts +6 -6
  87. package/src/api/bms/dict/bo/DictVO.ts +21 -21
  88. package/src/api/bms/dict/bo/PageBaseVO.ts +8 -8
  89. package/src/api/bms/dict/bo/TotalDictBO.ts +11 -11
  90. package/src/api/bms/dict/bo/TotalDictPageVO.ts +17 -17
  91. package/src/api/bms/dict/dict-controller.ts +78 -78
  92. package/src/api/bms/file/FileExportController.ts +19 -19
  93. package/src/api/bms/file/FileUploadController.ts +131 -131
  94. package/src/api/bms/file/bo/FileBaseInfo.ts +13 -13
  95. package/src/api/bms/file/bo/FileExportVO.ts +17 -17
  96. package/src/api/bms/file/bo/FilePreviewVO.ts +8 -8
  97. package/src/api/bms/file/bo/FileUploadInfo.ts +22 -22
  98. package/src/api/bms/file/bo/FileUrlVO.ts +10 -10
  99. package/src/api/bms/file/bo/StsTokenVO.ts +20 -20
  100. package/src/api/bms/flow/FlowCommentController.ts +50 -50
  101. package/src/api/bms/flow/FlowInstanceController.ts +179 -179
  102. package/src/api/bms/flow/FlowProcessController.ts +55 -55
  103. package/src/api/bms/flow/FlowSheetController.ts +27 -27
  104. package/src/api/bms/flow/FlowSignController.ts +76 -76
  105. package/src/api/bms/flow/bo/AssociatedApprovalBO.ts +15 -15
  106. package/src/api/bms/flow/bo/AssociatedApprovalVO.ts +35 -35
  107. package/src/api/bms/flow/bo/AuditBaseInfo.ts +39 -39
  108. package/src/api/bms/flow/bo/ButtonVo.ts +7 -7
  109. package/src/api/bms/flow/bo/DingCallbackBo.ts +13 -13
  110. package/src/api/bms/flow/bo/FlowCommentBO.ts +12 -12
  111. package/src/api/bms/flow/bo/FlowCommentVO.ts +23 -23
  112. package/src/api/bms/flow/bo/FlowInstanceBO.ts +14 -14
  113. package/src/api/bms/flow/bo/FlowNodeVO.ts +24 -24
  114. package/src/api/bms/flow/bo/FlowNoticeBO.ts +17 -17
  115. package/src/api/bms/flow/bo/FlowProcessBO.ts +13 -13
  116. package/src/api/bms/flow/bo/FlowProcessVO.ts +9 -9
  117. package/src/api/bms/flow/bo/FlowReplyVO.ts +23 -23
  118. package/src/api/bms/flow/bo/FlowSheetVO.ts +16 -16
  119. package/src/api/bms/flow/bo/InstanceBackBO.ts +9 -9
  120. package/src/api/bms/flow/bo/InstanceNodeBO.ts +13 -13
  121. package/src/api/bms/flow/bo/InstanceNodeVO.ts +21 -21
  122. package/src/api/bms/flow/bo/NodeShowVo.ts +19 -19
  123. package/src/api/bms/flow/bo/ReviewBO.ts +11 -11
  124. package/src/api/bms/flow/bo/SheetSearchBO.ts +11 -11
  125. package/src/api/bms/flow/bo/SystemVO.ts +7 -7
  126. package/src/api/bms/flow/bo/TransmitBO.ts +9 -9
  127. package/src/api/bms/flow/bo/UrgeFlowBO.ts +7 -7
  128. package/src/api/bms/flow/bo/UserBaseInfoVo.ts +13 -13
  129. package/src/api/bms/flow/bo/UserInfoVo.ts +44 -44
  130. package/src/api/bms/flow/bo/UserResultVo.ts +17 -17
  131. package/src/api/bms/flow/bo/ValueMapBo.ts +7 -7
  132. package/src/api/bms/home/HomeController.ts +106 -106
  133. package/src/api/bms/home/bo/CollectedMenuBo.ts +9 -9
  134. package/src/api/bms/home/bo/DeptBaseVo.ts +9 -9
  135. package/src/api/bms/home/bo/DomainVO.ts +13 -13
  136. package/src/api/bms/home/bo/FunPermission.ts +17 -17
  137. package/src/api/bms/home/bo/GroupVO.ts +10 -10
  138. package/src/api/bms/home/bo/HomeMenu.ts +22 -22
  139. package/src/api/bms/home/bo/HomeMenuVo.ts +11 -11
  140. package/src/api/bms/home/bo/PersonalizationBo.ts +17 -17
  141. package/src/api/bms/home/bo/PersonalizationVo.ts +19 -19
  142. package/src/api/bms/home/bo/PhoneMenu.ts +14 -14
  143. package/src/api/bms/home/bo/SearchMenuVo.ts +10 -10
  144. package/src/api/bms/home/bo/UserBaseInfoVo.ts +11 -11
  145. package/src/api/bms/permission-manage/PermissionController.ts +133 -133
  146. package/src/api/bms/permission-manage/bo/DataScopeConfig.ts +17 -17
  147. package/src/api/bms/permission-manage/bo/DataScopePoint.ts +15 -15
  148. package/src/api/bms/permission-manage/bo/DeptBaseVo.ts +9 -9
  149. package/src/api/bms/permission-manage/bo/FunPermissionConfig.ts +18 -18
  150. package/src/api/bms/permission-manage/bo/FunPointVo.ts +9 -9
  151. package/src/api/bms/permission-manage/bo/PermissionGroupBo.ts +11 -11
  152. package/src/api/bms/permission-manage/bo/PermissionGroupMemberVo.ts +18 -18
  153. package/src/api/bms/permission-manage/bo/PermissionGroupPageVo.ts +17 -17
  154. package/src/api/bms/permission-manage/bo/PermissionGroupVo.ts +17 -17
  155. package/src/api/bms/permission-manage/bo/RoleBaseVo.ts +9 -9
  156. package/src/api/bms/permission-manage/bo/TheFirstStepVo.ts +13 -13
  157. package/src/api/bms/permission-manage/bo/TheSecondStepVo.ts +14 -14
  158. package/src/api/bms/permission-manage/bo/UserBaseInfoVo.ts +11 -11
  159. package/src/api/bms/tabulation/TabulationController.ts +78 -78
  160. package/src/api/bms/tabulation/bo/FieldConditionBO.ts +10 -10
  161. package/src/api/bms/tabulation/bo/FieldConditionVO.ts +10 -10
  162. package/src/api/bms/tabulation/bo/OperateButtonVO.ts +9 -9
  163. package/src/api/bms/tabulation/bo/PersonViewVO.ts +33 -33
  164. package/src/api/bms/tabulation/bo/SearchVO.ts +33 -33
  165. package/src/api/bms/tabulation/bo/TabulationBO.ts +14 -14
  166. package/src/api/bms/tabulation/bo/ViewSortBO.ts +7 -7
  167. package/src/api/bms/tabulation/bo/ViewVO.ts +12 -12
  168. package/src/api/common/FileBaseInfo.ts +10 -10
  169. package/src/api/common/ResponseBean.ts +9 -9
  170. package/src/api/common/ResponseBeanList.ts +15 -15
  171. package/src/api/common/ResponseBeanTablePage.ts +21 -21
  172. package/src/api/common/TableQueryCriteriaVO.ts +10 -10
  173. package/src/api/common/bo/PageResult.ts +22 -22
  174. package/src/api/hrms/dept/bo/DeptBaseVo.ts +6 -6
  175. package/src/api/hrms/dept/bo/DeptTreeVo.ts +23 -23
  176. package/src/api/hrms/dept/bo/DeptUserVo.ts +9 -9
  177. package/src/api/hrms/dept/bo/DeptUsersVo.ts +10 -10
  178. package/src/api/hrms/dept/bo/DeptVo.ts +19 -19
  179. package/src/api/hrms/dept/bo/UserBaseInfoVo.ts +7 -7
  180. package/src/api/hrms/dept/deptController.ts +100 -100
  181. package/src/api/hrms/role/bo/RoleBaseVo.ts +6 -6
  182. package/src/api/hrms/role/bo/RoleGroupVo.ts +11 -11
  183. package/src/api/hrms/role/bo/RoleVo.ts +22 -22
  184. package/src/api/hrms/role/roleController.ts +19 -19
  185. package/src/api/hrms/user/bo/UserBaseInfoVo.ts +11 -11
  186. package/src/api/hrms/user/bo/UserCardVO.ts +13 -13
  187. package/src/api/hrms/user/bo/UserDeptBO.ts +13 -13
  188. package/src/api/hrms/user/bo/UserRoleBO.ts +11 -11
  189. package/src/api/hrms/user/bo/UserVO.ts +23 -23
  190. package/src/api/hrms/user/userController.ts +86 -86
  191. package/src/api/index.ts +9 -9
  192. package/src/api/notice/NoticeController.ts +73 -73
  193. package/src/api/notice/bo/NoticePageBO.ts +24 -24
  194. package/src/api/notice/bo/NoticeVO.ts +31 -31
  195. package/src/api/work-order-pc/flow/Bo/ValueMapBo.ts +7 -7
  196. package/src/api/work-order-pc/flow/ItrFlowProcessController.ts +41 -41
  197. package/src/api/work-order-pc/flow/Vo/FlowNodeVO.ts +24 -24
  198. package/src/api/work-order-pc/flow/Vo/UserInfoVo.ts +44 -44
  199. package/src/assets/layout/avatar-default.svg +6 -6
  200. package/src/assets/layout/collect-active.svg +7 -7
  201. package/src/assets/layout/collect-default.svg +7 -7
  202. package/src/assets/layout/download-active.svg +8 -8
  203. package/src/assets/layout/download-default.svg +8 -8
  204. package/src/assets/layout/export-dark.svg +7 -7
  205. package/src/assets/layout/export-default.svg +7 -7
  206. package/src/assets/layout/font-active.svg +6 -6
  207. package/src/assets/layout/font-default.svg +6 -6
  208. package/src/assets/layout/help-active.svg +10 -10
  209. package/src/assets/layout/help-default.svg +10 -10
  210. package/src/assets/layout/home-active.svg +6 -6
  211. package/src/assets/layout/home.svg +6 -6
  212. package/src/assets/layout/menu-expand.svg +6 -6
  213. package/src/assets/layout/menu-position-active.svg +6 -6
  214. package/src/assets/layout/menu-position-default.svg +6 -6
  215. package/src/assets/layout/message-active.svg +9 -9
  216. package/src/assets/layout/message-default.svg +9 -9
  217. package/src/assets/layout/moon.svg +8 -8
  218. package/src/assets/layout/router-all-dark.svg +11 -11
  219. package/src/assets/layout/router-all-default.svg +17 -17
  220. package/src/assets/layout/search-active.svg +20 -20
  221. package/src/assets/layout/search-default.svg +20 -20
  222. package/src/assets/layout/star-default.svg +3 -3
  223. package/src/assets/layout/sun-active.svg +6 -6
  224. package/src/assets/layout/sun-default.svg +6 -6
  225. package/src/assets/layout/switch-moon.svg +3 -3
  226. package/src/assets/layout/switch-sun.svg +41 -41
  227. package/src/assets/layout/todo-active.svg +12 -12
  228. package/src/assets/layout/todo-default.svg +12 -12
  229. package/src/assets/layout/user-dark.svg +13 -13
  230. package/src/assets/layout/user-default.svg +13 -13
  231. package/src/assets/no-permiss-dark.svg +16 -16
  232. package/src/assets/no-permiss-day.svg +16 -16
  233. package/src/assets/process/drawer/manyLevel1close.svg +9 -9
  234. package/src/assets/process/drawer/manyLevel1open.svg +6 -6
  235. package/src/assets/process/drawer/manyLevel2close.svg +6 -6
  236. package/src/assets/process/drawer/manyLevel2open.svg +6 -6
  237. package/src/assets/table-delete/table-delete.svg +2 -2
  238. package/src/components/annex-img-upload/assets/download.svg +4 -4
  239. package/src/components/annex-img-upload/assets/mp3.svg +11 -11
  240. package/src/components/annex-img-upload/assets/mp4.svg +11 -11
  241. package/src/components/annex-img-upload/assets/other.svg +11 -11
  242. package/src/components/annex-img-upload/assets/pdf.svg +11 -11
  243. package/src/components/annex-img-upload/assets/ppt.svg +11 -11
  244. package/src/components/annex-img-upload/assets/preview.svg +4 -4
  245. package/src/components/annex-img-upload/assets/word.svg +11 -11
  246. package/src/components/annex-img-upload/assets/xls.svg +11 -11
  247. package/src/components/annex-img-upload/index.vue +609 -609
  248. package/src/components/annex-img-upload/modules/previewMp.vue +53 -53
  249. package/src/components/annex-upload/assets/download.svg +4 -4
  250. package/src/components/annex-upload/assets/mp3.svg +11 -11
  251. package/src/components/annex-upload/assets/mp4.svg +11 -11
  252. package/src/components/annex-upload/assets/other.svg +11 -11
  253. package/src/components/annex-upload/assets/pdf.svg +11 -11
  254. package/src/components/annex-upload/assets/ppt.svg +11 -11
  255. package/src/components/annex-upload/assets/preview.svg +4 -4
  256. package/src/components/annex-upload/assets/word.svg +11 -11
  257. package/src/components/annex-upload/assets/xls.svg +11 -11
  258. package/src/components/annex-upload/index.vue +800 -800
  259. package/src/components/annex-upload/modules/previewMp.vue +53 -53
  260. package/src/components/annex-upload-weijian/assets/download.svg +4 -4
  261. package/src/components/annex-upload-weijian/assets/mp3.svg +11 -11
  262. package/src/components/annex-upload-weijian/assets/mp4.svg +11 -11
  263. package/src/components/annex-upload-weijian/assets/other.svg +11 -11
  264. package/src/components/annex-upload-weijian/assets/pdf.svg +11 -11
  265. package/src/components/annex-upload-weijian/assets/ppt.svg +11 -11
  266. package/src/components/annex-upload-weijian/assets/preview.svg +4 -4
  267. package/src/components/annex-upload-weijian/assets/word.svg +11 -11
  268. package/src/components/annex-upload-weijian/assets/xls.svg +11 -11
  269. package/src/components/annex-upload-weijian/index.vue +772 -772
  270. package/src/components/annex-upload-weijian/modules/previewMp.vue +53 -53
  271. package/src/components/base-layout/index.vue +199 -199
  272. package/src/components/button.vue +14 -14
  273. package/src/components/layout/ApprovalCenterDrawer.vue +231 -231
  274. package/src/components/layout/ExportCenterDrawer.vue +164 -164
  275. package/src/components/layout/LayoutContainer.vue +542 -542
  276. package/src/components/layout/SysHeader.vue +90 -90
  277. package/src/components/layout/SysHeaderLeft.vue +114 -114
  278. package/src/components/layout/SysHeaderRight.vue +112 -112
  279. package/src/components/layout/SysHeaderTabs.vue +289 -289
  280. package/src/components/layout/components/avatar-component.vue +77 -77
  281. package/src/components/layout/components/dark-component.vue +82 -82
  282. package/src/components/layout/components/download-component.vue +49 -49
  283. package/src/components/layout/components/font-size-component.vue +66 -66
  284. package/src/components/layout/components/menu-position-component.vue +97 -97
  285. package/src/components/layout/components/message-component.vue +64 -64
  286. package/src/components/layout/components/todo-component.vue +55 -55
  287. package/src/components/layout/index.ts +34 -34
  288. package/src/components/layout/message/message-dictionary.ts +27 -27
  289. package/src/components/layout/message/message-icon//345/205/250/351/203/250/351/200/232/347/237/245-/350/223/235.svg +8 -8
  290. package/src/components/layout/message/message-icon//345/205/250/351/203/250/351/200/232/347/237/245-/351/273/221.svg +8 -8
  291. package/src/components/layout/message/message-icon//345/205/250/351/203/250/351/200/232/347/237/245.svg +8 -8
  292. package/src/components/layout/message/message-icon//345/205/254/345/221/212/351/200/232/347/237/245-/350/223/235.svg +12 -12
  293. package/src/components/layout/message/message-icon//345/205/254/345/221/212/351/200/232/347/237/245-/351/273/221.svg +12 -12
  294. package/src/components/layout/message/message-icon//345/205/254/345/221/212/351/200/232/347/237/245.svg +12 -12
  295. package/src/components/layout/message/message-icon//345/256/241/346/211/271/351/200/232/347/237/245-/350/223/235.svg +8 -8
  296. package/src/components/layout/message/message-icon//345/256/241/346/211/271/351/200/232/347/237/245-/351/273/221.svg +8 -8
  297. package/src/components/layout/message/message-icon//345/256/241/346/211/271/351/200/232/347/237/245.svg +8 -8
  298. package/src/components/layout/message/message-icon//345/257/274/345/207/272/351/200/232/347/237/245-/350/223/235.svg +13 -13
  299. package/src/components/layout/message/message-icon//345/257/274/345/207/272/351/200/232/347/237/245-/351/273/221.svg +13 -13
  300. package/src/components/layout/message/message-icon//345/257/274/345/207/272/351/200/232/347/237/245.svg +13 -13
  301. package/src/components/layout/message/message-icon//346/234/252/350/257/273/351/200/232/347/237/245-/350/223/235.svg +11 -11
  302. package/src/components/layout/message/message-icon//346/234/252/350/257/273/351/200/232/347/237/245-/351/273/221.svg +11 -11
  303. package/src/components/layout/message/message-icon//346/234/252/350/257/273/351/200/232/347/237/245.svg +11 -11
  304. package/src/components/layout/message/message-icon//347/251/272/347/212/266/346/200/201.svg +17 -17
  305. package/src/components/layout/message/message-icon//347/263/273/347/273/237/351/200/232/347/237/245-/350/223/235.svg +13 -13
  306. package/src/components/layout/message/message-icon//347/263/273/347/273/237/351/200/232/347/237/245-/351/273/221.svg +13 -13
  307. package/src/components/layout/message/message-icon//347/263/273/347/273/237/351/200/232/347/237/245.svg +13 -13
  308. package/src/components/layout/message/message-notification-drawer.vue +533 -533
  309. package/src/components/layout/personal-sign/ImageCropper.vue +187 -187
  310. package/src/components/layout/personal-sign/PersonalSignDialog.vue +658 -658
  311. package/src/components/layout/personalization-guide-dialog.vue +255 -255
  312. package/src/components/layout/plugin.ts +32 -32
  313. package/src/components/layout/sideMenu-global.scss +115 -115
  314. package/src/components/layout/sideMenu.scss +312 -312
  315. package/src/components/layout/sideMenu.vue +541 -541
  316. package/src/components/layout/sideMenuSonList.vue +185 -185
  317. package/src/components/layout/stores/index.ts +5 -5
  318. package/src/components/layout/stores/useLayoutConfigStore.ts +231 -231
  319. package/src/components/layout/stores/useLayoutMenuStore.ts +232 -232
  320. package/src/components/layout/stores/useLayoutNoticeStore.ts +77 -77
  321. package/src/components/layout/stores/useLayoutTabsStore.ts +367 -367
  322. package/src/components/layout/styles/icon.scss +72 -72
  323. package/src/components/layout/types.ts +98 -98
  324. package/src/components/layout/utils/redirect.ts +144 -144
  325. package/src/components/list-search-content/components/index.ts +11 -11
  326. package/src/components/list-search-content/components/search-date-range.vue +74 -74
  327. package/src/components/list-search-content/components/search-date-time-range.vue +48 -48
  328. package/src/components/list-search-content/components/search-date.vue +97 -97
  329. package/src/components/list-search-content/components/search-input-number.vue +59 -59
  330. package/src/components/list-search-content/components/search-input.vue +46 -46
  331. package/src/components/list-search-content/components/search-multiple_select.vue +69 -69
  332. package/src/components/list-search-content/components/search-select.vue +64 -64
  333. package/src/components/list-search-content/index.vue +803 -803
  334. package/src/components/list-search-content/modules/add-views-package-dialog.vue +147 -147
  335. package/src/components/list-search-content/modules/search-condition-area.vue +252 -252
  336. package/src/components/list-search-content/modules/views-package-manage-dialog.vue +265 -265
  337. package/src/components/switch.vue +16 -16
  338. package/src/components.ts +67 -67
  339. package/src/enum/system/StorageEnum.ts +4 -4
  340. package/src/global.d.ts +19 -19
  341. package/src/index.ts +4 -4
  342. package/src/init.ts +37 -37
  343. package/src/styles/common.scss +133 -133
  344. package/src/styles/flex-common.scss +117 -117
  345. package/src/styles/flexCommon.scss +72 -72
  346. package/src/styles/main.css +277 -277
  347. package/src/styles/router-page.scss +370 -370
  348. package/src/styles/style-set.ts +809 -809
  349. package/src/utils/HttpUtil.ts +427 -427
  350. package/src/utils/base.ts +47 -47
  351. package/src/utils/cell-style.ts +11 -11
  352. package/src/utils/crypto.ts +98 -98
  353. package/src/utils/dd-utils.ts +157 -157
  354. package/src/utils/debounce.ts +35 -35
  355. package/src/utils/debounceleading.ts +48 -48
  356. package/src/utils/download.ts +38 -38
  357. package/src/utils/exitLogin.ts +58 -58
  358. package/src/utils/filter-key.ts +4 -4
  359. package/src/utils/formatter-handler.ts +12 -12
  360. package/src/utils/get-dict.ts +26 -26
  361. package/src/utils/get-env.ts +36 -36
  362. package/src/utils/login-path.ts +35 -35
  363. package/src/utils/path-utils.ts +31 -31
  364. package/src/utils/permit-utils.ts +68 -68
  365. package/src/utils/router-utils.ts +321 -321
  366. package/src/utils/string-utils.ts +166 -166
  367. package/src/utils/style-set.ts +750 -750
  368. package/src/utils/throttle.ts +62 -62
  369. package/src/utils/transform-data.ts +31 -31
  370. package/src/utils/validate.ts +92 -92
  371. package/src/utils/ws.ts +218 -218
  372. package/src/utils/wujie-son.ts +50 -50
  373. package/src/utils.ts +24 -24
@@ -1,609 +1,609 @@
1
- <!--
2
- * @description: 附件上传组件
3
- * @fileName: annex-upload-component.vue
4
- * @author: huatuo
5
- !-->
6
- <template>
7
- <div class="upload-attachments">
8
-
9
- <!-- oss 上传 -->
10
- <el-upload class="fzile-uploader" ref="upload" v-model:file-list="fileList" :auto-upload="true"
11
- accept=".jpg,.png,.jpeg,.JPG,.PNG,.JPEG"
12
- :before-upload="beforeUploadOSS" :action="uploadUrl" :show-file-list="false" :data="{ pageId: props.pageId }"
13
- list-type="picture" :on-exceed="handleExceed" :limit="props.limited" v-if="props.formType != 'detail'"
14
- :headers="ossHeader" size="large" :disabled="props.loading" :http-request="uploadFileOSS" multiple>
15
- <el-button type="primary" text bg icon="Upload" style="font-size: var(--font-size-body);"
16
- size="large">上传附件</el-button>
17
- <template #tip>
18
- <div class="el-upload__tip">
19
- 附件上限数量{{ props.limited }}个,单次最多选择{{ props.limited }}个,单文件大小不超过20MB
20
- 且附件上传格式仅限jpg、png、jpeg。
21
- </div>
22
- </template>
23
- </el-upload>
24
-
25
- <div class="file-list-box flex-row-start">
26
- <div class="file-out-box" v-for="(item, index) in sendFileList" :key="index">
27
- <div class="file-list-item flex-row-between">
28
- <div class="flex-row-start file-list-item-left">
29
- <el-image class="file-list-item-icon" :src="item.url" :zoom-rate="1.2" :initial-index="0" fit="cover"
30
- :preview-src-list="[item.url]" preview-teleported="true" @error="handleImageError" @load="handleImageLoad"
31
- v-loading="submitLoading"
32
- v-if="getFileType(item.url) === 'jpg' || getFileType(item.url) === 'png' || getFileType(item.url) === 'bmp' || getFileType(item.url) === 'jpeg' || getFileType(item.url) === 'raw' || getFileType(item.url) === 'heif' || getFileType(item.url) === 'tiff' || getFileType(item.url) === 'gif'">
33
- <template #error>
34
- <img src="./assets/other.svg" class="file-icon">
35
- </template>
36
- </el-image>
37
- <div v-else class="file-list-item-icon">
38
- <img src="./assets/pdf.svg" v-if="getFileType(item.url) === 'pdf'" class="file-icon" />
39
- <img src="./assets/word.svg"
40
- v-else-if="getFileType(item.url) === 'docx' || getFileType(item.url) === 'doc'" class="file-icon" />
41
- <img src="./assets/mp3.svg" v-else-if="getFileType(item.url) === 'mp3'" class="file-icon" />
42
- <img src="./assets/mp4.svg" v-else-if="getFileType(item.url) === 'mp4'" class="file-icon" />
43
- <img src="./assets/xls.svg"
44
- v-else-if="getFileType(item.url) === 'xls' || getFileType(item.url) === 'xlsx'" class="file-icon" />
45
- <img src="./assets/ppt.svg"
46
- v-else-if="getFileType(item.url) === 'ppt' || getFileType(item.url) === 'pptx'" class="file-icon" />
47
- <img src="./assets/other.svg" v-else class="file-icon" />
48
- </div>
49
- <div class="flex-column-around file-name-box" style="align-items: flex-start;">
50
- <el-tooltip effect="dark" :content="item.fileName">
51
- <div class="file-name">{{ item.fileName }}</div>
52
- </el-tooltip>
53
- <div class="file-size">{{ item.fileSize || '--' }}</div>
54
- </div>
55
- </div>
56
- <div class="flex-column-around file-list-item-right">
57
- <img src="./assets/preview.svg" alt="" class="file-preview" @click="previewFile(item, index)" />
58
-
59
- <img src="./assets/download.svg" alt="" class="file-download" @click="downloadFile(item)">
60
- </div>
61
-
62
- </div>
63
- <div class="delete-box" @click="deleteUploadItem(item, index)" v-if="props.formType != 'detail'">
64
- <div class="table-delete">
65
- <img src="../../assets/table-delete/table-delete.svg" alt="删除" width="25" height="25">
66
- </div>
67
- </div>
68
- </div>
69
- <div class="notData"
70
- v-if="props.formType == 'detail' && !(sendFileList && Array.isArray(sendFileList) && sendFileList.length > 0)">
71
- 暂无附件
72
- </div>
73
- </div>
74
- <!-- 专门用来预览的组件 -->
75
- <el-image style="display: none;" ref="previewImgRef" :src="perviewImg.url" :preview-src-list="perviewImg.srcList"
76
- preview-teleported="true" id="previewImgId" @close="handleClosePreview">
77
-
78
- </el-image>
79
- <!-- 预览mp3,mp4 -->
80
- <PreviewMp ref="previewMpRef"></PreviewMp>
81
- </div>
82
- </template>
83
-
84
- <script setup lang='ts'>
85
- import { ref, reactive, watch, onMounted, PropType,nextTick } from 'vue'
86
- import OSS from "ali-oss"
87
- import { type UploadFile, type UploadFiles, type TabsPaneContext, type UploadUserFile, type UploadProps, type ElMessageBox, ElMessage } from "element-plus";
88
- import moment from 'moment'
89
- import axios from 'axios'
90
- import { getFileType, ddWindowOpen } from "hrp-ui-base";
91
- import PreviewMp from "./modules/previewMp.vue";
92
- // getUploadFileMsg
93
- import FileUploadController from "hrp-ui-base/api/bms/file/FileUploadController"
94
- import StsTokenVO from "hrp-ui-base/api/bms/file/bo/StsTokenVO"
95
- import FileBaseInfo from "hrp-ui-base/api/bms/file/bo/FileBaseInfo"
96
- import FileUrlVO from "hrp-ui-base/api/bms/file/bo/FileUrlVO"
97
- import dd from "dingtalk-jsapi";
98
- import { downloadFile} from "hrp-ui-base";
99
- const props = defineProps({
100
- // 选择了那些审批人 具体的人名
101
- type: {
102
- type: String as PropType<'oss' | 'minio'>,
103
- default: "oss",
104
- require: true
105
- },
106
- // 页面id
107
- pageId: {
108
- type: String,
109
- default: "",
110
- require: true
111
- },
112
- // formType 页面类型
113
- formType: {
114
- type: String as PropType<'add' | 'edit' | 'detail'>,
115
- default: "add",
116
- require: true
117
- },
118
- // 默认的文件列表
119
- fileDetailList: {
120
- type: Array as PropType<any[]>,
121
- default: false,
122
- require: false
123
- },
124
- // 页面的loading,由外部控制内部的loading
125
- loading: {
126
- type: Boolean,
127
- require: true,
128
- default: false
129
- },
130
- keyForReturn: {
131
- type: Number,
132
- require: true,
133
- default: ""
134
- },
135
- limited: {
136
- type: Number,
137
- require: true,
138
- default: 9
139
- }
140
- }
141
- )
142
- const emits = defineEmits(['getUploadIds', 'getUploadInfo', 'changeLoading'])
143
- const token = localStorage.getItem("TOKEN");
144
- const uploadUrl = window.location.origin + window.location.pathname + "api/bms/file/upload";
145
- const minioHeader = ref({ 'Authorization-Token': token })
146
- const ossHeader = ref({
147
- // 指定该Object被下载时的网页缓存行为。
148
- "Cache-Control": "no-cache",
149
- // 指定该Object被下载时的名称。
150
- "Content-Disposition": "example.txt",
151
- // 指定该Object被下载时的内容编码格式。
152
- "Content-Encoding": "utf-8",
153
- // 指定过期时间,单位为毫秒。
154
- Expires: "1000",
155
- // 指定Object的存储类型。
156
- "x-oss-storage-class": "Standard",
157
- // 指定Object标签,可同时设置多个标签。
158
- "x-oss-tagging": "Tag1=1&Tag2=2",
159
- // 指定初始化分片上传时是否覆盖同名Object。此处设置为true,表示禁止覆盖同名Object。
160
- "x-oss-forbid-overwrite": "true",
161
- })
162
- const uploadFilesIds = ref<string[]>([])
163
- const fileInfoList = ref<any[]>([])
164
-
165
- const handleClosePreview = () => {
166
- perviewImg.value.url = ""
167
- perviewImg.value.srcList = []
168
- }
169
- const submitLoading = ref<boolean>(false)
170
- // 上传附件
171
- const fileList = ref<UploadUserFile[]>([])
172
- const fileName = ref<string>("")
173
- const beforeUploadOSS = async (e: any) => {
174
- changeLoadingStatus(true)
175
-
176
- const is20M = e.size / 1024 / 1024 < 20;
177
- if (!is20M) {
178
- changeLoadingStatus(false)
179
- ElMessage.error("上传文件大小不能超过 20MB!");
180
- return false;
181
- }
182
- fileName.value = e.name
183
- // if (props.type === 'oss') {
184
-
185
- // await getOSSOption(e.name)
186
- // }
187
- };
188
-
189
- /** oss 上传方法 */
190
- const uploadFileOSS = async (uploadMsg: any) => {
191
- try {
192
- console.log(uploadMsg)
193
- const fileOBJ = uploadMsg.file;
194
- FileUploadController.upload(fileOBJ, props.pageId).then((data) => {
195
- if (data.code === 200 && data.res) {
196
- sendFileList.value.push(data.res)
197
- emits("getUploadIds", sendFileList.value.map((item) => {
198
- return item.fileId
199
- }), props.keyForReturn)
200
- emits("getUploadInfo", sendFileList.value.map((item) => {
201
- return item
202
- }), props.keyForReturn)
203
- } else {
204
- ElMessage.error("数据发生错误,请重新上传!")
205
- }
206
- }).catch((err) => {
207
- ElMessage.error("数据发生错误,请重试!")
208
- }).finally(() => {
209
- changeLoadingStatus(false)
210
- })
211
- } catch (err) {
212
- console.debug(err);
213
- }
214
- }
215
- const ossClient = ref()
216
- const handleImageLoad = () => {
217
- changeLoadingStatus(false)
218
-
219
- }
220
- const handleImageError = () => {
221
- changeLoadingStatus(false)
222
-
223
- }
224
- const handleExceed = (e: any) => {
225
- ElMessage({
226
- message: `最多上传${props.limited}个文件!`,
227
- type: "error",
228
- });
229
- };
230
- const sendFileList = ref<Array<FileBaseInfo>>([])
231
- /** 删除 */
232
- const deleteUploadItem = (item: any, index: any) => {
233
- sendFileList.value.splice(index, 1)
234
- fileList.value = JSON.parse(JSON.stringify(sendFileList.value))
235
- emits("getUploadIds", sendFileList.value.map((item) => {
236
- return item.fileId
237
- }), props.keyForReturn)
238
- emits("getUploadInfo", sendFileList.value.map((item) => {
239
- return item
240
- }), props.keyForReturn)
241
- }
242
- watch(() => { return props.fileDetailList }, () => {
243
- if (props.fileDetailList && Array.isArray(props.fileDetailList)) {
244
- sendFileList.value = props.fileDetailList
245
- fileList.value = JSON.parse(JSON.stringify(sendFileList.value))
246
- }
247
- }, { deep: true, immediate: true })
248
-
249
- /** 上传中 */
250
- const handleUploadProgress = () => {
251
- emits('changeLoading', true)
252
- }
253
- /** 上传失败 */
254
- const handleUploadError = (err: any) => {
255
- ElMessage({
256
- message: "上传失败!",
257
- type: "error",
258
- });
259
- changeLoadingStatus(false)
260
- }
261
- const changeLoadingStatus = (status: boolean) => {
262
- emits('changeLoading', status)
263
- submitLoading.value = status
264
- }
265
-
266
- //清空图片列表
267
- const clearFileList = () => {
268
- sendFileList.value = []
269
- }
270
-
271
- /** 上传的方式 */
272
- onMounted(() => {
273
- // if (!props.type) {
274
- // ElMessage.error('配置错误,无法确定上传方式')
275
- // }
276
- })
277
- const ossName = ref<string>('')
278
- const stsToken = ref<StsTokenVO>(new StsTokenVO())
279
-
280
- /** 获取minio 上传地址 */
281
- const minioOption = ref<FileUrlVO>(new FileUrlVO())
282
- const getMinioUploadUrl = async (fileName: string) => {
283
- await FileUploadController.getUploadUrl(props.pageId, fileName).then((data) => {
284
- if (data.code === 200 && data.res) {
285
- minioOption.value = data.res
286
- } else {
287
- ElMessage.error('获取上传路径失败!')
288
- }
289
- })
290
- }
291
- /** minio 上传方法 */
292
- const uploadFileMinio = async (uploadMsg: any) => {
293
- console.debug(uploadMsg)
294
- if (minioOption.value) {
295
- try {
296
- const options = {
297
- mime: "json",
298
- headers: { "Content-Type": "text/plain" },
299
- };
300
- const data = uploadMsg.file;
301
- // console.error(data)
302
- let config = { 'Content-Type': uploadMsg.file.type }
303
- // // 分片上传。
304
- axiosPost("put", minioOption.value.policyUrl, uploadMsg.file, config).then(function (res) {
305
- setTimeout(() => {
306
-
307
- /** 上传成功 ,去请求接口查询上传的内容*/
308
- FileUploadController.checkFileUpload(minioOption.value.fileId ? minioOption.value.fileId : '').then((data) => {
309
- if (data.code == 200) {
310
- FileUploadController.getMinioFileUrl(minioOption.value.fileId ? minioOption.value.fileId : '').then((data) => {
311
- if (data.code === 200 && data.res) {
312
- sendFileList.value.push(data.res)
313
- ElMessage.success('上传成功!')
314
- emits("getUploadIds", sendFileList.value.map((item) => {
315
- return item.fileId
316
- }), props.keyForReturn)
317
- emits("getUploadInfo", sendFileList.value.map((item) => {
318
- return item
319
- }), props.keyForReturn)
320
- }
321
- }).finally(() => {
322
- changeLoadingStatus(false)
323
- })
324
-
325
- } else {
326
- ElMessage.error("上传失败,请重新上传!")
327
- changeLoadingStatus(false)
328
- }
329
- }).catch(() => {
330
- ElMessage.error("上传失败,请重新上传!")
331
- changeLoadingStatus(false)
332
- })
333
- }, 1000);
334
-
335
- }).catch(() => {
336
- ElMessage.error("上传失败,请重新上传!")
337
- changeLoadingStatus(false)
338
- })
339
-
340
- } catch (err) {
341
- console.debug(err);
342
- }
343
- } else {
344
- ElMessage.error("数据发生错误,请重新上传!")
345
- }
346
-
347
- }
348
- function axiosPost(method: string, url: string, data: any, config: any) {
349
- let result = axios({
350
- method: method,
351
- url: url,
352
- data: data,
353
- headers: config
354
- }).then(resp => {
355
- return resp
356
- }).catch(error => {
357
- return "exception=" + error;
358
- });
359
- return result;
360
- }
361
- /** 预览文件 */
362
- const previewFile = async (item: FileBaseInfo, index: number) => {
363
-
364
- if (
365
- getFileType(item.url) === 'jpg' || getFileType(item.url) === 'png' || getFileType(item.url) === 'bmp' || getFileType(item.url) === 'jpeg' || getFileType(item.url) === 'raw' || getFileType(item.url) === 'heif' || getFileType(item.url) === 'tiff' || getFileType(item.url) === 'gif'
366
- ) {
367
- // 图片的情况
368
- perviewImg.value.url = item.url
369
- perviewImg.value.srcList = [item.url]
370
- nextTick(()=>{
371
- previewImgRef.value?.showPreview()
372
- })
373
- } else if (getFileType(item.url) === 'mp3') {
374
- // mp3的情况
375
- previewMpRef.value?.open('mp3', item)
376
- } else if (getFileType(item.url) === 'mp4') {
377
- // mp4的情况
378
- previewMpRef.value?.open('mp4', item)
379
- } else {
380
- if (props.type === 'oss') {
381
- // 文档的情况
382
- await FileUploadController.getFilePreview(item.fileId).then((data) => {
383
- if (data.code == 200 && data.res) {
384
- ddWindowOpen(window.location.origin + window.location.pathname + 'ay-doc/index.html?url=' + data.res.webOfficeUrl + '&token=' + data.res.accessToken)
385
- } else {
386
- ElMessage.error("预览失败,请稍后再试!")
387
- }
388
- })
389
- } else if (props.type === 'minio') {
390
- // minio 的预览 需要第三方工具,暂时没有,先定义成下载
391
- FileUploadController.getMinioFilePreview(item.fileId).then((data) => {
392
- if (data.code == 200 && data.res) {
393
- window.open(window.location.origin + window.location.pathname + 'preview/onlinePreview?url=' + data.res);
394
- }
395
- })
396
- }
397
- }
398
-
399
- }
400
- // Base64编码(支持中文)
401
- function base64Encode(str: string) {
402
- return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
403
- (match, p1) => String.fromCharCode('0x' + p1))
404
- );
405
- }
406
-
407
-
408
-
409
-
410
-
411
- /** 专门用来预览的组件 */
412
- const previewImgRef = ref()
413
- const perviewImg = ref<{ url: string, srcList: string[] }>({
414
- url: "",
415
- srcList: []
416
- })
417
- /** mp3,mp4 预览 */
418
- const previewMpRef = ref()
419
- defineExpose({
420
- clearFileList, sendFileList
421
- })
422
- </script>
423
-
424
- <style lang='scss'>
425
- @use "../../styles/flex-common.scss";
426
-
427
- .file-uploader {
428
- // margin-top: 30px;
429
-
430
- .imgSize {
431
- width: 99px;
432
-
433
- >span {
434
- cursor: pointer;
435
- position: absolute;
436
- color: black;
437
- font-size: 20px;
438
- right: -69px;
439
- height: 30px;
440
- top: -12px;
441
- width: 37px;
442
- }
443
-
444
-
445
-
446
- el-image {
447
- width: 100%;
448
- }
449
- }
450
-
451
- .el-upload__tip {
452
- font-size: var(--font-size-body);
453
- font-weight: 400;
454
- text-align: left;
455
- color: var(--custom-theme-text-3);
456
- }
457
- }
458
-
459
- .upload-attachments {
460
- .notData {
461
- font-size: var(--font-size-body);
462
- }
463
-
464
-
465
-
466
- .el-upload-list {
467
- position: relative;
468
- text-align: center;
469
- display: flex;
470
- flex-wrap: wrap;
471
- width: 100%;
472
-
473
- .el-upload-list__item {
474
- margin-left: 5px;
475
- flex-direction: column;
476
- width: 17%;
477
- }
478
- }
479
-
480
-
481
-
482
- .file-uploader {
483
- // margin-top: 30px;
484
-
485
- .imgSize {
486
- width: 99px;
487
-
488
- >span {
489
- cursor: pointer;
490
- position: absolute;
491
- color: black;
492
- font-size: 20px;
493
- right: -69px;
494
- height: 30px;
495
- top: -12px;
496
- width: 37px;
497
- }
498
-
499
-
500
-
501
- el-image {
502
- width: 100%;
503
- }
504
- }
505
- }
506
- }
507
-
508
- .preview-img {
509
- img {
510
- width: 100%;
511
- }
512
- }
513
-
514
- .exceed-limit {
515
- border-color: red !important;
516
- }
517
-
518
- .error-message {
519
- color: red;
520
- }
521
-
522
-
523
- .file-list-box {
524
- margin-top: 10px;
525
- width: 100%;
526
- height: auto;
527
-
528
- .file-out-box {
529
- border: 1px solid var(--custom-theme-border-4);
530
- border-radius: 6px 6px 6px 6px;
531
- background: var(--custom-theme-fill-7);
532
- padding: 24px 8px 8px;
533
- width: 272px;
534
- height: 80px;
535
- margin-right: 16px;
536
- margin-bottom: 16px;
537
- position: relative;
538
- }
539
-
540
- .file-list-item {
541
- width: 256px;
542
- height: 48px;
543
-
544
- .file-list-item-left {
545
- width: calc(100% - 20px);
546
- height: 100%;
547
-
548
- .file-list-item-icon {
549
- width: 41px;
550
- height: 41px;
551
-
552
- .file-icon {
553
- width: 41px;
554
- }
555
- }
556
-
557
- .file-name-box {
558
- margin-left: 8px;
559
- height: 100%;
560
- max-width: calc(100% - 50px);
561
-
562
- .file-name {
563
- font-weight: 400;
564
- font-size: 12px;
565
- color: var(--custom-theme-text-1);
566
- line-height: 12x;
567
- display: -webkit-box;
568
- -webkit-box-orient: vertical;
569
- -webkit-line-clamp: 2;
570
- overflow: hidden;
571
- word-break: break-all;
572
- }
573
-
574
- .file-size {
575
-
576
- font-weight: 400;
577
- font-size: 12px;
578
- color: var(--custom-theme-text-3);
579
- line-height: 11px;
580
- }
581
- }
582
- }
583
-
584
- .file-list-item-right {
585
- height: 100%;
586
-
587
- .file-preview {
588
- width: 16px;
589
- cursor: pointer;
590
- }
591
-
592
- .file-download {
593
- width: 16px;
594
- cursor: pointer;
595
- }
596
- }
597
- }
598
-
599
- .delete-box {
600
- position: absolute;
601
- right: -7px;
602
- top: -7px;
603
- overflow: hidden;
604
- font-size: 16px;
605
- cursor: pointer;
606
- }
607
-
608
- }
609
- </style>
1
+ <!--
2
+ * @description: 附件上传组件
3
+ * @fileName: annex-upload-component.vue
4
+ * @author: huatuo
5
+ !-->
6
+ <template>
7
+ <div class="upload-attachments">
8
+
9
+ <!-- oss 上传 -->
10
+ <el-upload class="fzile-uploader" ref="upload" v-model:file-list="fileList" :auto-upload="true"
11
+ accept=".jpg,.png,.jpeg,.JPG,.PNG,.JPEG"
12
+ :before-upload="beforeUploadOSS" :action="uploadUrl" :show-file-list="false" :data="{ pageId: props.pageId }"
13
+ list-type="picture" :on-exceed="handleExceed" :limit="props.limited" v-if="props.formType != 'detail'"
14
+ :headers="ossHeader" size="large" :disabled="props.loading" :http-request="uploadFileOSS" multiple>
15
+ <el-button type="primary" text bg icon="Upload" style="font-size: var(--font-size-body);"
16
+ size="large">上传附件</el-button>
17
+ <template #tip>
18
+ <div class="el-upload__tip">
19
+ 附件上限数量{{ props.limited }}个,单次最多选择{{ props.limited }}个,单文件大小不超过20MB
20
+ 且附件上传格式仅限jpg、png、jpeg。
21
+ </div>
22
+ </template>
23
+ </el-upload>
24
+
25
+ <div class="file-list-box flex-row-start">
26
+ <div class="file-out-box" v-for="(item, index) in sendFileList" :key="index">
27
+ <div class="file-list-item flex-row-between">
28
+ <div class="flex-row-start file-list-item-left">
29
+ <el-image class="file-list-item-icon" :src="item.url" :zoom-rate="1.2" :initial-index="0" fit="cover"
30
+ :preview-src-list="[item.url]" preview-teleported="true" @error="handleImageError" @load="handleImageLoad"
31
+ v-loading="submitLoading"
32
+ v-if="getFileType(item.url) === 'jpg' || getFileType(item.url) === 'png' || getFileType(item.url) === 'bmp' || getFileType(item.url) === 'jpeg' || getFileType(item.url) === 'raw' || getFileType(item.url) === 'heif' || getFileType(item.url) === 'tiff' || getFileType(item.url) === 'gif'">
33
+ <template #error>
34
+ <img src="./assets/other.svg" class="file-icon">
35
+ </template>
36
+ </el-image>
37
+ <div v-else class="file-list-item-icon">
38
+ <img src="./assets/pdf.svg" v-if="getFileType(item.url) === 'pdf'" class="file-icon" />
39
+ <img src="./assets/word.svg"
40
+ v-else-if="getFileType(item.url) === 'docx' || getFileType(item.url) === 'doc'" class="file-icon" />
41
+ <img src="./assets/mp3.svg" v-else-if="getFileType(item.url) === 'mp3'" class="file-icon" />
42
+ <img src="./assets/mp4.svg" v-else-if="getFileType(item.url) === 'mp4'" class="file-icon" />
43
+ <img src="./assets/xls.svg"
44
+ v-else-if="getFileType(item.url) === 'xls' || getFileType(item.url) === 'xlsx'" class="file-icon" />
45
+ <img src="./assets/ppt.svg"
46
+ v-else-if="getFileType(item.url) === 'ppt' || getFileType(item.url) === 'pptx'" class="file-icon" />
47
+ <img src="./assets/other.svg" v-else class="file-icon" />
48
+ </div>
49
+ <div class="flex-column-around file-name-box" style="align-items: flex-start;">
50
+ <el-tooltip effect="dark" :content="item.fileName">
51
+ <div class="file-name">{{ item.fileName }}</div>
52
+ </el-tooltip>
53
+ <div class="file-size">{{ item.fileSize || '--' }}</div>
54
+ </div>
55
+ </div>
56
+ <div class="flex-column-around file-list-item-right">
57
+ <img src="./assets/preview.svg" alt="" class="file-preview" @click="previewFile(item, index)" />
58
+
59
+ <img src="./assets/download.svg" alt="" class="file-download" @click="downloadFile(item)">
60
+ </div>
61
+
62
+ </div>
63
+ <div class="delete-box" @click="deleteUploadItem(item, index)" v-if="props.formType != 'detail'">
64
+ <div class="table-delete">
65
+ <img src="../../assets/table-delete/table-delete.svg" alt="删除" width="25" height="25">
66
+ </div>
67
+ </div>
68
+ </div>
69
+ <div class="notData"
70
+ v-if="props.formType == 'detail' && !(sendFileList && Array.isArray(sendFileList) && sendFileList.length > 0)">
71
+ 暂无附件
72
+ </div>
73
+ </div>
74
+ <!-- 专门用来预览的组件 -->
75
+ <el-image style="display: none;" ref="previewImgRef" :src="perviewImg.url" :preview-src-list="perviewImg.srcList"
76
+ preview-teleported="true" id="previewImgId" @close="handleClosePreview">
77
+
78
+ </el-image>
79
+ <!-- 预览mp3,mp4 -->
80
+ <PreviewMp ref="previewMpRef"></PreviewMp>
81
+ </div>
82
+ </template>
83
+
84
+ <script setup lang='ts'>
85
+ import { ref, reactive, watch, onMounted, PropType,nextTick } from 'vue'
86
+ import OSS from "ali-oss"
87
+ import { type UploadFile, type UploadFiles, type TabsPaneContext, type UploadUserFile, type UploadProps, type ElMessageBox, ElMessage } from "element-plus";
88
+ import moment from 'moment'
89
+ import axios from 'axios'
90
+ import { getFileType, ddWindowOpen } from "hrp-ui-base";
91
+ import PreviewMp from "./modules/previewMp.vue";
92
+ // getUploadFileMsg
93
+ import FileUploadController from "hrp-ui-base/api/bms/file/FileUploadController"
94
+ import StsTokenVO from "hrp-ui-base/api/bms/file/bo/StsTokenVO"
95
+ import FileBaseInfo from "hrp-ui-base/api/bms/file/bo/FileBaseInfo"
96
+ import FileUrlVO from "hrp-ui-base/api/bms/file/bo/FileUrlVO"
97
+ import dd from "dingtalk-jsapi";
98
+ import { downloadFile} from "hrp-ui-base";
99
+ const props = defineProps({
100
+ // 选择了那些审批人 具体的人名
101
+ type: {
102
+ type: String as PropType<'oss' | 'minio'>,
103
+ default: "oss",
104
+ require: true
105
+ },
106
+ // 页面id
107
+ pageId: {
108
+ type: String,
109
+ default: "",
110
+ require: true
111
+ },
112
+ // formType 页面类型
113
+ formType: {
114
+ type: String as PropType<'add' | 'edit' | 'detail'>,
115
+ default: "add",
116
+ require: true
117
+ },
118
+ // 默认的文件列表
119
+ fileDetailList: {
120
+ type: Array as PropType<any[]>,
121
+ default: false,
122
+ require: false
123
+ },
124
+ // 页面的loading,由外部控制内部的loading
125
+ loading: {
126
+ type: Boolean,
127
+ require: true,
128
+ default: false
129
+ },
130
+ keyForReturn: {
131
+ type: Number,
132
+ require: true,
133
+ default: ""
134
+ },
135
+ limited: {
136
+ type: Number,
137
+ require: true,
138
+ default: 9
139
+ }
140
+ }
141
+ )
142
+ const emits = defineEmits(['getUploadIds', 'getUploadInfo', 'changeLoading'])
143
+ const token = localStorage.getItem("TOKEN");
144
+ const uploadUrl = window.location.origin + window.location.pathname + "api/bms/file/upload";
145
+ const minioHeader = ref({ 'Authorization-Token': token })
146
+ const ossHeader = ref({
147
+ // 指定该Object被下载时的网页缓存行为。
148
+ "Cache-Control": "no-cache",
149
+ // 指定该Object被下载时的名称。
150
+ "Content-Disposition": "example.txt",
151
+ // 指定该Object被下载时的内容编码格式。
152
+ "Content-Encoding": "utf-8",
153
+ // 指定过期时间,单位为毫秒。
154
+ Expires: "1000",
155
+ // 指定Object的存储类型。
156
+ "x-oss-storage-class": "Standard",
157
+ // 指定Object标签,可同时设置多个标签。
158
+ "x-oss-tagging": "Tag1=1&Tag2=2",
159
+ // 指定初始化分片上传时是否覆盖同名Object。此处设置为true,表示禁止覆盖同名Object。
160
+ "x-oss-forbid-overwrite": "true",
161
+ })
162
+ const uploadFilesIds = ref<string[]>([])
163
+ const fileInfoList = ref<any[]>([])
164
+
165
+ const handleClosePreview = () => {
166
+ perviewImg.value.url = ""
167
+ perviewImg.value.srcList = []
168
+ }
169
+ const submitLoading = ref<boolean>(false)
170
+ // 上传附件
171
+ const fileList = ref<UploadUserFile[]>([])
172
+ const fileName = ref<string>("")
173
+ const beforeUploadOSS = async (e: any) => {
174
+ changeLoadingStatus(true)
175
+
176
+ const is20M = e.size / 1024 / 1024 < 20;
177
+ if (!is20M) {
178
+ changeLoadingStatus(false)
179
+ ElMessage.error("上传文件大小不能超过 20MB!");
180
+ return false;
181
+ }
182
+ fileName.value = e.name
183
+ // if (props.type === 'oss') {
184
+
185
+ // await getOSSOption(e.name)
186
+ // }
187
+ };
188
+
189
+ /** oss 上传方法 */
190
+ const uploadFileOSS = async (uploadMsg: any) => {
191
+ try {
192
+ console.log(uploadMsg)
193
+ const fileOBJ = uploadMsg.file;
194
+ FileUploadController.upload(fileOBJ, props.pageId).then((data) => {
195
+ if (data.code === 200 && data.res) {
196
+ sendFileList.value.push(data.res)
197
+ emits("getUploadIds", sendFileList.value.map((item) => {
198
+ return item.fileId
199
+ }), props.keyForReturn)
200
+ emits("getUploadInfo", sendFileList.value.map((item) => {
201
+ return item
202
+ }), props.keyForReturn)
203
+ } else {
204
+ ElMessage.error("数据发生错误,请重新上传!")
205
+ }
206
+ }).catch((err) => {
207
+ ElMessage.error("数据发生错误,请重试!")
208
+ }).finally(() => {
209
+ changeLoadingStatus(false)
210
+ })
211
+ } catch (err) {
212
+ console.debug(err);
213
+ }
214
+ }
215
+ const ossClient = ref()
216
+ const handleImageLoad = () => {
217
+ changeLoadingStatus(false)
218
+
219
+ }
220
+ const handleImageError = () => {
221
+ changeLoadingStatus(false)
222
+
223
+ }
224
+ const handleExceed = (e: any) => {
225
+ ElMessage({
226
+ message: `最多上传${props.limited}个文件!`,
227
+ type: "error",
228
+ });
229
+ };
230
+ const sendFileList = ref<Array<FileBaseInfo>>([])
231
+ /** 删除 */
232
+ const deleteUploadItem = (item: any, index: any) => {
233
+ sendFileList.value.splice(index, 1)
234
+ fileList.value = JSON.parse(JSON.stringify(sendFileList.value))
235
+ emits("getUploadIds", sendFileList.value.map((item) => {
236
+ return item.fileId
237
+ }), props.keyForReturn)
238
+ emits("getUploadInfo", sendFileList.value.map((item) => {
239
+ return item
240
+ }), props.keyForReturn)
241
+ }
242
+ watch(() => { return props.fileDetailList }, () => {
243
+ if (props.fileDetailList && Array.isArray(props.fileDetailList)) {
244
+ sendFileList.value = props.fileDetailList
245
+ fileList.value = JSON.parse(JSON.stringify(sendFileList.value))
246
+ }
247
+ }, { deep: true, immediate: true })
248
+
249
+ /** 上传中 */
250
+ const handleUploadProgress = () => {
251
+ emits('changeLoading', true)
252
+ }
253
+ /** 上传失败 */
254
+ const handleUploadError = (err: any) => {
255
+ ElMessage({
256
+ message: "上传失败!",
257
+ type: "error",
258
+ });
259
+ changeLoadingStatus(false)
260
+ }
261
+ const changeLoadingStatus = (status: boolean) => {
262
+ emits('changeLoading', status)
263
+ submitLoading.value = status
264
+ }
265
+
266
+ //清空图片列表
267
+ const clearFileList = () => {
268
+ sendFileList.value = []
269
+ }
270
+
271
+ /** 上传的方式 */
272
+ onMounted(() => {
273
+ // if (!props.type) {
274
+ // ElMessage.error('配置错误,无法确定上传方式')
275
+ // }
276
+ })
277
+ const ossName = ref<string>('')
278
+ const stsToken = ref<StsTokenVO>(new StsTokenVO())
279
+
280
+ /** 获取minio 上传地址 */
281
+ const minioOption = ref<FileUrlVO>(new FileUrlVO())
282
+ const getMinioUploadUrl = async (fileName: string) => {
283
+ await FileUploadController.getUploadUrl(props.pageId, fileName).then((data) => {
284
+ if (data.code === 200 && data.res) {
285
+ minioOption.value = data.res
286
+ } else {
287
+ ElMessage.error('获取上传路径失败!')
288
+ }
289
+ })
290
+ }
291
+ /** minio 上传方法 */
292
+ const uploadFileMinio = async (uploadMsg: any) => {
293
+ console.debug(uploadMsg)
294
+ if (minioOption.value) {
295
+ try {
296
+ const options = {
297
+ mime: "json",
298
+ headers: { "Content-Type": "text/plain" },
299
+ };
300
+ const data = uploadMsg.file;
301
+ // console.error(data)
302
+ let config = { 'Content-Type': uploadMsg.file.type }
303
+ // // 分片上传。
304
+ axiosPost("put", minioOption.value.policyUrl, uploadMsg.file, config).then(function (res) {
305
+ setTimeout(() => {
306
+
307
+ /** 上传成功 ,去请求接口查询上传的内容*/
308
+ FileUploadController.checkFileUpload(minioOption.value.fileId ? minioOption.value.fileId : '').then((data) => {
309
+ if (data.code == 200) {
310
+ FileUploadController.getMinioFileUrl(minioOption.value.fileId ? minioOption.value.fileId : '').then((data) => {
311
+ if (data.code === 200 && data.res) {
312
+ sendFileList.value.push(data.res)
313
+ ElMessage.success('上传成功!')
314
+ emits("getUploadIds", sendFileList.value.map((item) => {
315
+ return item.fileId
316
+ }), props.keyForReturn)
317
+ emits("getUploadInfo", sendFileList.value.map((item) => {
318
+ return item
319
+ }), props.keyForReturn)
320
+ }
321
+ }).finally(() => {
322
+ changeLoadingStatus(false)
323
+ })
324
+
325
+ } else {
326
+ ElMessage.error("上传失败,请重新上传!")
327
+ changeLoadingStatus(false)
328
+ }
329
+ }).catch(() => {
330
+ ElMessage.error("上传失败,请重新上传!")
331
+ changeLoadingStatus(false)
332
+ })
333
+ }, 1000);
334
+
335
+ }).catch(() => {
336
+ ElMessage.error("上传失败,请重新上传!")
337
+ changeLoadingStatus(false)
338
+ })
339
+
340
+ } catch (err) {
341
+ console.debug(err);
342
+ }
343
+ } else {
344
+ ElMessage.error("数据发生错误,请重新上传!")
345
+ }
346
+
347
+ }
348
+ function axiosPost(method: string, url: string, data: any, config: any) {
349
+ let result = axios({
350
+ method: method,
351
+ url: url,
352
+ data: data,
353
+ headers: config
354
+ }).then(resp => {
355
+ return resp
356
+ }).catch(error => {
357
+ return "exception=" + error;
358
+ });
359
+ return result;
360
+ }
361
+ /** 预览文件 */
362
+ const previewFile = async (item: FileBaseInfo, index: number) => {
363
+
364
+ if (
365
+ getFileType(item.url) === 'jpg' || getFileType(item.url) === 'png' || getFileType(item.url) === 'bmp' || getFileType(item.url) === 'jpeg' || getFileType(item.url) === 'raw' || getFileType(item.url) === 'heif' || getFileType(item.url) === 'tiff' || getFileType(item.url) === 'gif'
366
+ ) {
367
+ // 图片的情况
368
+ perviewImg.value.url = item.url
369
+ perviewImg.value.srcList = [item.url]
370
+ nextTick(()=>{
371
+ previewImgRef.value?.showPreview()
372
+ })
373
+ } else if (getFileType(item.url) === 'mp3') {
374
+ // mp3的情况
375
+ previewMpRef.value?.open('mp3', item)
376
+ } else if (getFileType(item.url) === 'mp4') {
377
+ // mp4的情况
378
+ previewMpRef.value?.open('mp4', item)
379
+ } else {
380
+ if (props.type === 'oss') {
381
+ // 文档的情况
382
+ await FileUploadController.getFilePreview(item.fileId).then((data) => {
383
+ if (data.code == 200 && data.res) {
384
+ ddWindowOpen(window.location.origin + window.location.pathname + 'ay-doc/index.html?url=' + data.res.webOfficeUrl + '&token=' + data.res.accessToken)
385
+ } else {
386
+ ElMessage.error("预览失败,请稍后再试!")
387
+ }
388
+ })
389
+ } else if (props.type === 'minio') {
390
+ // minio 的预览 需要第三方工具,暂时没有,先定义成下载
391
+ FileUploadController.getMinioFilePreview(item.fileId).then((data) => {
392
+ if (data.code == 200 && data.res) {
393
+ window.open(window.location.origin + window.location.pathname + 'preview/onlinePreview?url=' + data.res);
394
+ }
395
+ })
396
+ }
397
+ }
398
+
399
+ }
400
+ // Base64编码(支持中文)
401
+ function base64Encode(str: string) {
402
+ return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
403
+ (match, p1) => String.fromCharCode('0x' + p1))
404
+ );
405
+ }
406
+
407
+
408
+
409
+
410
+
411
+ /** 专门用来预览的组件 */
412
+ const previewImgRef = ref()
413
+ const perviewImg = ref<{ url: string, srcList: string[] }>({
414
+ url: "",
415
+ srcList: []
416
+ })
417
+ /** mp3,mp4 预览 */
418
+ const previewMpRef = ref()
419
+ defineExpose({
420
+ clearFileList, sendFileList
421
+ })
422
+ </script>
423
+
424
+ <style lang='scss'>
425
+ @use "../../styles/flex-common.scss";
426
+
427
+ .file-uploader {
428
+ // margin-top: 30px;
429
+
430
+ .imgSize {
431
+ width: 99px;
432
+
433
+ >span {
434
+ cursor: pointer;
435
+ position: absolute;
436
+ color: black;
437
+ font-size: 20px;
438
+ right: -69px;
439
+ height: 30px;
440
+ top: -12px;
441
+ width: 37px;
442
+ }
443
+
444
+
445
+
446
+ el-image {
447
+ width: 100%;
448
+ }
449
+ }
450
+
451
+ .el-upload__tip {
452
+ font-size: var(--font-size-body);
453
+ font-weight: 400;
454
+ text-align: left;
455
+ color: var(--custom-theme-text-3);
456
+ }
457
+ }
458
+
459
+ .upload-attachments {
460
+ .notData {
461
+ font-size: var(--font-size-body);
462
+ }
463
+
464
+
465
+
466
+ .el-upload-list {
467
+ position: relative;
468
+ text-align: center;
469
+ display: flex;
470
+ flex-wrap: wrap;
471
+ width: 100%;
472
+
473
+ .el-upload-list__item {
474
+ margin-left: 5px;
475
+ flex-direction: column;
476
+ width: 17%;
477
+ }
478
+ }
479
+
480
+
481
+
482
+ .file-uploader {
483
+ // margin-top: 30px;
484
+
485
+ .imgSize {
486
+ width: 99px;
487
+
488
+ >span {
489
+ cursor: pointer;
490
+ position: absolute;
491
+ color: black;
492
+ font-size: 20px;
493
+ right: -69px;
494
+ height: 30px;
495
+ top: -12px;
496
+ width: 37px;
497
+ }
498
+
499
+
500
+
501
+ el-image {
502
+ width: 100%;
503
+ }
504
+ }
505
+ }
506
+ }
507
+
508
+ .preview-img {
509
+ img {
510
+ width: 100%;
511
+ }
512
+ }
513
+
514
+ .exceed-limit {
515
+ border-color: red !important;
516
+ }
517
+
518
+ .error-message {
519
+ color: red;
520
+ }
521
+
522
+
523
+ .file-list-box {
524
+ margin-top: 10px;
525
+ width: 100%;
526
+ height: auto;
527
+
528
+ .file-out-box {
529
+ border: 1px solid var(--custom-theme-border-4);
530
+ border-radius: 6px 6px 6px 6px;
531
+ background: var(--custom-theme-fill-7);
532
+ padding: 24px 8px 8px;
533
+ width: 272px;
534
+ height: 80px;
535
+ margin-right: 16px;
536
+ margin-bottom: 16px;
537
+ position: relative;
538
+ }
539
+
540
+ .file-list-item {
541
+ width: 256px;
542
+ height: 48px;
543
+
544
+ .file-list-item-left {
545
+ width: calc(100% - 20px);
546
+ height: 100%;
547
+
548
+ .file-list-item-icon {
549
+ width: 41px;
550
+ height: 41px;
551
+
552
+ .file-icon {
553
+ width: 41px;
554
+ }
555
+ }
556
+
557
+ .file-name-box {
558
+ margin-left: 8px;
559
+ height: 100%;
560
+ max-width: calc(100% - 50px);
561
+
562
+ .file-name {
563
+ font-weight: 400;
564
+ font-size: 12px;
565
+ color: var(--custom-theme-text-1);
566
+ line-height: 12x;
567
+ display: -webkit-box;
568
+ -webkit-box-orient: vertical;
569
+ -webkit-line-clamp: 2;
570
+ overflow: hidden;
571
+ word-break: break-all;
572
+ }
573
+
574
+ .file-size {
575
+
576
+ font-weight: 400;
577
+ font-size: 12px;
578
+ color: var(--custom-theme-text-3);
579
+ line-height: 11px;
580
+ }
581
+ }
582
+ }
583
+
584
+ .file-list-item-right {
585
+ height: 100%;
586
+
587
+ .file-preview {
588
+ width: 16px;
589
+ cursor: pointer;
590
+ }
591
+
592
+ .file-download {
593
+ width: 16px;
594
+ cursor: pointer;
595
+ }
596
+ }
597
+ }
598
+
599
+ .delete-box {
600
+ position: absolute;
601
+ right: -7px;
602
+ top: -7px;
603
+ overflow: hidden;
604
+ font-size: 16px;
605
+ cursor: pointer;
606
+ }
607
+
608
+ }
609
+ </style>