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,542 +1,542 @@
1
- <template>
2
- <BaseLayout :isLeftMenu="isLeftMenu">
3
- <template #header>
4
- <SysHeader
5
- :userConfig="userConfigData"
6
- :menuList="systemMenuList"
7
- :currentApplication="currentApplication"
8
- :currentPath="currentPath"
9
- :showSubmenuDrawer="!isLeftMenu"
10
- :noticeCount="noticeStore.unReadCount"
11
- :approvalCount="0"
12
- :downloadActive="false"
13
- :todoActive="false"
14
- @menu-item-click="handleMenuItemClick"
15
- @parent-click="handleParentClick"
16
- @logo-click="goHomePage"
17
- @collapse-change="handleCollapseChange"
18
- @change-dark="handleChangeDark"
19
- @change-follow-system="handleChangeFollowSystem"
20
- @change-font-size="handleChangeFontSize"
21
- @change-menu-position="handleChangeMenuPosition"
22
- @download-click="handleDownloadClick"
23
- @todo-click="handleTodoClick"
24
- @message-navigate="handleMessageNavigate"
25
- @message-download="handleMessageDownload"
26
- @message-update-count="handleMessageUpdateCount"
27
- @personal-sign="handlePersonalSign"
28
- @clean-cache="handleCleanCache"
29
- @logout="handleLogout"
30
- />
31
- </template>
32
- <template #extra>
33
- <PersonalizationGuideDialog
34
- :visible="showNoviceGuide"
35
- :menuPosition="configStore.userConfig.menuPosition"
36
- :fontSize="configStore.userConfig.fontSize"
37
- :dayOrNight="configStore.userConfig.dayOrNight"
38
- :followSystem="configStore.userConfig.followSystem"
39
- @update:visible="(val: boolean) => (showNoviceGuide = val)"
40
- @preview="handleGuidePreview"
41
- @finish="handleGuideFinish"
42
- @skip="handleGuideSkip"
43
- @restore="handleGuideRestore"
44
- />
45
- </template>
46
- <template #side-menu>
47
- <SideMenu
48
- v-if="Array.isArray(leftMenuList) && leftMenuList.length > 0"
49
- :menuList="leftMenuList"
50
- menuPosition="left"
51
- :currentPath="currentPath"
52
- :navigationBar="configStore.userConfig.navigationBar"
53
- @menu-item-click="handleMenuItemClick"
54
- @parent-click="() => {}"
55
- @collapse-change="handleCollapseChange"
56
- />
57
- </template>
58
- <template #tabs>
59
- <SysHeaderTabs
60
- v-if="showTabs"
61
- :tabs="tabsMenuList"
62
- :activeTab="tabsMenuValue"
63
- :homeUrl="options?.homeUrl || '/home'"
64
- @tab-click="handleTabClick"
65
- @tab-close="handleTabClose"
66
- @tab-close-other="handleTabCloseOther"
67
- @tab-close-all="handleTabCloseAll"
68
- @tab-close-left="handleTabCloseLeft"
69
- @tab-close-right="handleTabCloseRight"
70
- />
71
- </template>
72
- <!-- 页面内容区域(默认插槽透传) -->
73
- <slot></slot>
74
- </BaseLayout>
75
-
76
- <!-- 下载中心抽屉 -->
77
- <ExportCenterDrawer v-model:visible="exportDrawerVisible" />
78
- <!-- 审批中心抽屉 -->
79
- <ApprovalCenterDrawer v-model:visible="approvalDrawerVisible" />
80
- <!-- 个人签名弹窗 -->
81
- <PersonalSignDialog ref="personalSignDialogRef" />
82
- </template>
83
-
84
- <script lang="ts" setup>
85
- import {
86
- ref,
87
- computed,
88
- inject,
89
- onMounted,
90
- onUnmounted,
91
- watch,
92
- provide,
93
- nextTick,
94
- } from "vue";
95
- import BaseLayout from "../base-layout/index.vue";
96
- import SysHeader from "./SysHeader.vue";
97
- import SysHeaderTabs from "./SysHeaderTabs.vue";
98
- import SideMenu from "./sideMenu.vue";
99
- import PersonalizationGuideDialog from "./personalization-guide-dialog.vue";
100
- import ExportCenterDrawer from "./ExportCenterDrawer.vue";
101
- import ApprovalCenterDrawer from "./ApprovalCenterDrawer.vue";
102
- import PersonalSignDialog from "./personal-sign/PersonalSignDialog.vue";
103
- import { useLayoutConfigStore } from "./stores/useLayoutConfigStore";
104
- import { useLayoutMenuStore } from "./stores/useLayoutMenuStore";
105
- import { useLayoutTabsStore } from "./stores/useLayoutTabsStore";
106
- import { useLayoutNoticeStore } from "./stores/useLayoutNoticeStore";
107
- import { LAYOUT_ROUTER_KEY, LAYOUT_OPTIONS_KEY } from "./plugin";
108
- import type { LayoutPluginOptions } from "./plugin";
109
- import type { TabsOptions } from "./stores/useLayoutTabsStore";
110
- import type HomeMenu from "../../api/bms/home/bo/HomeMenu";
111
- import type NoticeVO from "../../api/notice/bo/NoticeVO";
112
- import { ElNotification, ElMessage } from "element-plus";
113
- import { navigateByDomainRoute, navigateToPmsAuthRoute } from "./utils/redirect";
114
-
115
- defineOptions({ name: "LayoutContainer" });
116
-
117
- const props = defineProps({
118
- /** 是否显示 tabs 栏 */
119
- showTabs: { type: Boolean, default: true },
120
- });
121
-
122
- // ====== 注入 ======
123
- const router = inject<any>(LAYOUT_ROUTER_KEY);
124
- const options = inject<LayoutPluginOptions>(LAYOUT_OPTIONS_KEY);
125
-
126
- // ====== Stores ======
127
- const configStore = useLayoutConfigStore();
128
- const menuStore = useLayoutMenuStore();
129
- const tabsStore = useLayoutTabsStore();
130
- const noticeStore = useLayoutNoticeStore();
131
-
132
- // ====== Computed ======
133
- const menuPosition = computed(
134
- () => configStore.userConfig.menuPosition || "top"
135
- );
136
- const isLeftMenu = computed(() => menuPosition.value === "left");
137
-
138
- const leftMenuList = computed(() => {
139
- const currentSystem =
140
- menuStore.routerData[0]?.children?.[menuStore.currentSecondIndex] ||
141
- menuStore.routerData[0]?.children?.[0];
142
- return currentSystem?.children || [];
143
- });
144
-
145
- const systemMenuList = computed(() => {
146
- const arr: HomeMenu[] = [];
147
- for (let i = 0; i < menuStore.routerData.length; i++) {
148
- arr.push(...(menuStore.routerData[i].children || []));
149
- }
150
- return arr;
151
- });
152
-
153
- const currentApplication = computed(() => menuStore.currentApplication);
154
-
155
- const currentPath = computed(() => {
156
- return router?.currentRoute?.value?.path || "";
157
- });
158
-
159
- const tabsMenuList = computed(() => tabsStore.tabsMenuList as any[]);
160
- const tabsMenuValue = computed(() => tabsStore.tabsMenuValue);
161
-
162
- const userConfigData = computed(() => ({
163
- fontSize: configStore.userConfig.fontSize,
164
- dayOrNight: configStore.userConfig.dayOrNight,
165
- followSystem: configStore.userConfig.followSystem,
166
- menuPosition: configStore.userConfig.menuPosition,
167
- navigationBar: configStore.userConfig.navigationBar,
168
- noviceGuide: configStore.userConfig.noviceGuide,
169
- avatar: configStore.userConfig.avatar,
170
- fileUploadType: configStore.userConfig.fileUploadType,
171
- }));
172
-
173
- // ====== 状态 ======
174
- const showNoviceGuide = ref(false);
175
- const exportDrawerVisible = ref(false);
176
- const approvalDrawerVisible = ref(false);
177
- const updateNum = ref<number>(0);
178
- const notificationRefs = ref<Map<string, any>>(new Map());
179
-
180
- provide("updateNum", updateNum);
181
-
182
- // ====== 菜单同步 ======
183
- const syncSystemMenuByRoute = (path: string) => {
184
- const systemList = menuStore.routerData[0]?.children || [];
185
- for (let i = 0; i < systemList.length; i++) {
186
- if (hasMenuPath(systemList[i], path)) {
187
- if (i !== menuStore.currentSecondIndex) {
188
- menuStore.changeCurrentSecondIndex(i, false);
189
- }
190
- return;
191
- }
192
- }
193
- };
194
-
195
- const hasMenuPath = (menu: HomeMenu, path: string): boolean => {
196
- if (isSameMenuPath(menu.url, path)) return true;
197
- return !!menu.children?.some((child: HomeMenu) => hasMenuPath(child, path));
198
- };
199
-
200
- const isSameMenuPath = (menuUrl?: string, currentPath?: string) => {
201
- if (!menuUrl || !currentPath) return false;
202
- return menuUrl.split("?")[0] === currentPath.split("?")[0];
203
- };
204
-
205
- // ====== SysHeader 事件处理 ======
206
- const handleMenuItemClick = (item: HomeMenu) => {
207
- if (item.url && currentPath.value !== item.url) {
208
- router?.push({ path: item.url });
209
- }
210
- };
211
-
212
- const handleParentClick = (_item: HomeMenu, index: number) => {
213
- menuStore.changeCurrentSecondIndex(index, menuPosition.value === "left", router);
214
- };
215
-
216
- const goHomePage = () => {
217
- const subApps = [
218
- "imd",
219
- "agoal",
220
- "scm",
221
- "bms",
222
- "coc",
223
- "hws",
224
- "kbs",
225
- "fms",
226
- "hrm",
227
- "hrms",
228
- "itrms",
229
- "personalization",
230
- "projectManagement",
231
- ];
232
- const pathname = window.location.pathname;
233
- // 获取最后一个 / 之间的内容
234
- const segments = pathname.replace(/\/$/, "").split("/");
235
- const lastSegment = segments[segments.length - 1];
236
-
237
- if (subApps.includes(lastSegment)) {
238
- // 删除最后一个路径段
239
- segments.pop();
240
- const basePath = segments.join("/") || "/";
241
- const targetUrl =
242
- window.location.origin +
243
- (basePath.endsWith("/") ? basePath : basePath + "/") +
244
- "#/application-entry";
245
- window.location.replace(targetUrl);
246
- } else {
247
- router?.replace({ path: options?.entryUrl || "/application-entry" });
248
- }
249
- };
250
-
251
- const handleCollapseChange = (collapsed: boolean) => {
252
- configStore.userConfig.navigationBar = collapsed;
253
- configStore.changeUserConfig();
254
- };
255
-
256
- const handleChangeDark = (value: string, ref?: HTMLElement) => {
257
- configStore.changeDarkAnimation(
258
- value as "day" | "night",
259
- ref
260
- ? {
261
- clientX: ref.getBoundingClientRect().x,
262
- clientY: ref.getBoundingClientRect().y,
263
- }
264
- : undefined
265
- );
266
- };
267
-
268
- const handleChangeFollowSystem = (value: boolean) => {
269
- configStore.followSystemColorModel(value);
270
- };
271
-
272
- const handleChangeFontSize = (value: string) => {
273
- configStore.changeFontSize(value as "small" | "medium" | "large");
274
- };
275
-
276
- const handleChangeMenuPosition = (value: string) => {
277
- configStore.changeMenuPosition(value as "top" | "left");
278
- };
279
-
280
- const handleDownloadClick = () => {
281
- exportDrawerVisible.value = true;
282
- };
283
-
284
- const handleTodoClick = () => {
285
- approvalDrawerVisible.value = true;
286
- };
287
-
288
- const handleMessageNavigate = async (notice: NoticeVO) => {
289
- await noticeStore.readNoticeInfo(notice.noticeId);
290
- await noticeStore.getNoReadNoticeCount();
291
- updateNum.value += 1;
292
- if (notice.noticeType === "file-notice") return;
293
- if (!notice.urlRoute) return;
294
- if (notice.urlRoute.startsWith("/project/")) {
295
- navigateToPmsAuthRoute(notice.urlRoute);
296
- } else {
297
- await navigateByDomainRoute(notice.urlRoute, router);
298
- }
299
- };
300
-
301
- const handleMessageDownload = async (notice: NoticeVO) => {
302
- await noticeStore.readNoticeInfo(notice.noticeId);
303
- await noticeStore.getNoReadNoticeCount();
304
- updateNum.value += 1;
305
- if (options?.onFileDownload) {
306
- options.onFileDownload(notice);
307
- }
308
- };
309
-
310
- const handleMessageUpdateCount = async () => {
311
- await noticeStore.getNoReadNoticeCount();
312
- updateNum.value += 1;
313
- };
314
-
315
- const personalSignDialogRef = ref<InstanceType<typeof PersonalSignDialog>>();
316
- const handlePersonalSign = () => {
317
- personalSignDialogRef.value?.open();
318
- };
319
-
320
- const handleCleanCache = () => {
321
- sessionStorage.clear();
322
- ElMessage.success("缓存清理成功");
323
- };
324
-
325
- const handleLogout = () => {
326
- menuStore.doExitLogin();
327
- };
328
-
329
- // ====== Tabs 事件处理 ======
330
- const handleTabClick = (tab: any) => {
331
- if (tab.path !== currentPath.value) {
332
- router?.push({ path: tab.path, query: tab.query });
333
- }
334
- };
335
-
336
- const handleTabClose = (tab: any) => {
337
- tabsStore.removeTabs(tab.path, router);
338
- };
339
-
340
- const handleTabCloseOther = (tab: any) => {
341
- tabsStore.closeMultipleTab(tab.path);
342
- if (currentPath.value !== tab.path) {
343
- router?.push({ path: tab.path, query: tab.query });
344
- }
345
- };
346
-
347
- const handleTabCloseAll = () => {
348
- tabsStore.closeAllTabs(router);
349
- };
350
-
351
- const handleTabCloseLeft = (tab: any) => {
352
- tabsStore.closeLeftTabs(tab.path, router);
353
- };
354
-
355
- const handleTabCloseRight = (tab: any) => {
356
- tabsStore.closeRightTabs(tab.path, router);
357
- };
358
-
359
- // ====== 新手引导事件 ======
360
- const handleGuidePreview = (config: {
361
- menuPosition: string;
362
- fontSize: string;
363
- colorMode: string;
364
- followSystem: boolean;
365
- }) => {
366
- configStore.changeFontSize(config.fontSize as "small" | "medium" | "large", true);
367
- configStore.changeDark(config.colorMode as "day" | "night", true);
368
- configStore.userConfig.menuPosition = config.menuPosition as "top" | "left";
369
- };
370
-
371
- const handleGuideFinish = (config: {
372
- menuPosition: string;
373
- fontSize: string;
374
- colorMode: string;
375
- }) => {
376
- configStore.userConfig.menuPosition = config.menuPosition as "top" | "left";
377
- configStore.changeFontSize(config.fontSize as "small" | "medium" | "large", true);
378
- configStore.changeDark(config.colorMode as "day" | "night", true);
379
- configStore.changeNoviceGuide(false);
380
- showNoviceGuide.value = false;
381
- };
382
-
383
- const handleGuideSkip = () => {
384
- configStore.changeNoviceGuide(false);
385
- showNoviceGuide.value = false;
386
- };
387
-
388
- const handleGuideRestore = (config: {
389
- menuPosition: string;
390
- fontSize: string;
391
- followSystem: boolean;
392
- dayOrNight: string;
393
- }) => {
394
- configStore.userConfig.menuPosition = config.menuPosition as "top" | "left";
395
- configStore.changeFontSize(config.fontSize as "small" | "medium" | "large", true);
396
- configStore.followSystemColorModel(config.followSystem, true);
397
- };
398
-
399
- // ====== 通知弹窗 ======
400
- const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
401
-
402
- const showNoticeNotification = async (notice: NoticeVO) => {
403
- const spanId = `notice-action-${notice.noticeId}`;
404
- const noticeId = notice.noticeId;
405
-
406
- const closeNotification = () => {
407
- const inst = notificationRefs.value.get(noticeId);
408
- if (inst) {
409
- inst.close();
410
- notificationRefs.value.delete(noticeId);
411
- }
412
- };
413
-
414
- const handleClick = async () => {
415
- await noticeStore.readNoticeInfo(notice.noticeId);
416
- await noticeStore.getNoReadNoticeCount();
417
- updateNum.value += 1;
418
- if (notice.noticeType === "file-notice") {
419
- if (options?.onFileDownload) {
420
- options.onFileDownload(notice);
421
- }
422
- } else if (notice.urlRoute?.startsWith("/project/")) {
423
- navigateToPmsAuthRoute(notice.urlRoute);
424
- } else {
425
- await navigateByDomainRoute(notice.urlRoute, router);
426
- }
427
- closeNotification();
428
- };
429
-
430
- const inst = ElNotification({
431
- dangerouslyUseHTMLString: true,
432
- title: notice.noticeTitle,
433
- message: `<div>
434
- <span style="display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;line-height:1.5em;max-height:7.5em">
435
- ${notice.noticeContent}
436
- </span>
437
- </div>
438
- <div style="text-align:right">
439
- <span id="${spanId}" style="color:#409eff;border-bottom:1px solid #409eff;cursor:pointer">
440
- ${notice.noticeType === "file-notice" ? "下载" : "查看详情"}
441
- </span>
442
- </div>`,
443
- duration: 5000,
444
- customClass: "notification-group",
445
- offset: 40,
446
- onClose: () => notificationRefs.value.delete(noticeId),
447
- onClick: handleClick,
448
- });
449
-
450
- notificationRefs.value.set(noticeId, inst);
451
-
452
- nextTick(() => {
453
- const spanEl = document.getElementById(spanId);
454
- if (spanEl) {
455
- spanEl.addEventListener("click", (e) => {
456
- e.stopPropagation();
457
- handleClick();
458
- });
459
- }
460
- });
461
-
462
- await noticeStore.getNoReadNoticeCount();
463
- updateNum.value += 1;
464
- };
465
-
466
- // ====== 生命周期 ======
467
- onMounted(async () => {
468
- // 初始化用户配置
469
- configStore.initUserConfig();
470
- await configStore.getUserConfig();
471
-
472
- // 加载菜单
473
- const routePath = router?.currentRoute?.value?.path || "";
474
- await menuStore.getDomainAndHomeMenu(routePath, router);
475
-
476
- // 恢复标签页
477
- tabsStore.restoreTabsFromStorage();
478
-
479
- // 新手引导
480
- if (configStore.userConfig.noviceGuide) {
481
- showNoviceGuide.value = true;
482
- }
483
-
484
- // 启动消息轮询
485
- noticeStore.startPolling(async (notices) => {
486
- for (let i = 0; i < notices.length; i++) {
487
- showNoticeNotification(notices[i]);
488
- if (i < notices.length - 1) {
489
- await delay(100);
490
- }
491
- }
492
- });
493
- });
494
-
495
- onUnmounted(() => {
496
- noticeStore.stopPolling();
497
- });
498
-
499
- // 监听路由变化,添加标签页
500
- watch(
501
- () => router?.currentRoute?.value,
502
- (toPath: any) => {
503
- if (!toPath?.path || toPath.path === "/") return;
504
- const params: TabsOptions = {
505
- title:
506
- (toPath.meta?.title as string) ||
507
- (toPath.name as string) ||
508
- "未命名页面",
509
- path: toPath.path,
510
- query: toPath.query as Record<string, any>,
511
- name: toPath.name as string,
512
- cachedCode: toPath.meta?.cachedCode as string,
513
- };
514
- tabsStore.addTabs(params);
515
- },
516
- { immediate: true, deep: true }
517
- );
518
-
519
- // 监听路由同步顶部菜单
520
- watch(
521
- [() => currentPath.value, () => menuStore.routerData],
522
- ([routePath]) => {
523
- if (routePath) syncSystemMenuByRoute(routePath);
524
- },
525
- { immediate: true, deep: true }
526
- );
527
- </script>
528
-
529
- <style lang="scss">
530
- .notification-group {
531
- .el-notification__group {
532
- position: static;
533
- width: 100%;
534
- }
535
- .el-notification__content {
536
- word-break: break-all;
537
- }
538
- }
539
- .notification-group:hover {
540
- cursor: pointer;
541
- }
542
- </style>
1
+ <template>
2
+ <BaseLayout :isLeftMenu="isLeftMenu">
3
+ <template #header>
4
+ <SysHeader
5
+ :userConfig="userConfigData"
6
+ :menuList="systemMenuList"
7
+ :currentApplication="currentApplication"
8
+ :currentPath="currentPath"
9
+ :showSubmenuDrawer="!isLeftMenu"
10
+ :noticeCount="noticeStore.unReadCount"
11
+ :approvalCount="0"
12
+ :downloadActive="false"
13
+ :todoActive="false"
14
+ @menu-item-click="handleMenuItemClick"
15
+ @parent-click="handleParentClick"
16
+ @logo-click="goHomePage"
17
+ @collapse-change="handleCollapseChange"
18
+ @change-dark="handleChangeDark"
19
+ @change-follow-system="handleChangeFollowSystem"
20
+ @change-font-size="handleChangeFontSize"
21
+ @change-menu-position="handleChangeMenuPosition"
22
+ @download-click="handleDownloadClick"
23
+ @todo-click="handleTodoClick"
24
+ @message-navigate="handleMessageNavigate"
25
+ @message-download="handleMessageDownload"
26
+ @message-update-count="handleMessageUpdateCount"
27
+ @personal-sign="handlePersonalSign"
28
+ @clean-cache="handleCleanCache"
29
+ @logout="handleLogout"
30
+ />
31
+ </template>
32
+ <template #extra>
33
+ <PersonalizationGuideDialog
34
+ :visible="showNoviceGuide"
35
+ :menuPosition="configStore.userConfig.menuPosition"
36
+ :fontSize="configStore.userConfig.fontSize"
37
+ :dayOrNight="configStore.userConfig.dayOrNight"
38
+ :followSystem="configStore.userConfig.followSystem"
39
+ @update:visible="(val: boolean) => (showNoviceGuide = val)"
40
+ @preview="handleGuidePreview"
41
+ @finish="handleGuideFinish"
42
+ @skip="handleGuideSkip"
43
+ @restore="handleGuideRestore"
44
+ />
45
+ </template>
46
+ <template #side-menu>
47
+ <SideMenu
48
+ v-if="Array.isArray(leftMenuList) && leftMenuList.length > 0"
49
+ :menuList="leftMenuList"
50
+ menuPosition="left"
51
+ :currentPath="currentPath"
52
+ :navigationBar="configStore.userConfig.navigationBar"
53
+ @menu-item-click="handleMenuItemClick"
54
+ @parent-click="() => {}"
55
+ @collapse-change="handleCollapseChange"
56
+ />
57
+ </template>
58
+ <template #tabs>
59
+ <SysHeaderTabs
60
+ v-if="showTabs"
61
+ :tabs="tabsMenuList"
62
+ :activeTab="tabsMenuValue"
63
+ :homeUrl="options?.homeUrl || '/home'"
64
+ @tab-click="handleTabClick"
65
+ @tab-close="handleTabClose"
66
+ @tab-close-other="handleTabCloseOther"
67
+ @tab-close-all="handleTabCloseAll"
68
+ @tab-close-left="handleTabCloseLeft"
69
+ @tab-close-right="handleTabCloseRight"
70
+ />
71
+ </template>
72
+ <!-- 页面内容区域(默认插槽透传) -->
73
+ <slot></slot>
74
+ </BaseLayout>
75
+
76
+ <!-- 下载中心抽屉 -->
77
+ <ExportCenterDrawer v-model:visible="exportDrawerVisible" />
78
+ <!-- 审批中心抽屉 -->
79
+ <ApprovalCenterDrawer v-model:visible="approvalDrawerVisible" />
80
+ <!-- 个人签名弹窗 -->
81
+ <PersonalSignDialog ref="personalSignDialogRef" />
82
+ </template>
83
+
84
+ <script lang="ts" setup>
85
+ import {
86
+ ref,
87
+ computed,
88
+ inject,
89
+ onMounted,
90
+ onUnmounted,
91
+ watch,
92
+ provide,
93
+ nextTick,
94
+ } from "vue";
95
+ import BaseLayout from "../base-layout/index.vue";
96
+ import SysHeader from "./SysHeader.vue";
97
+ import SysHeaderTabs from "./SysHeaderTabs.vue";
98
+ import SideMenu from "./sideMenu.vue";
99
+ import PersonalizationGuideDialog from "./personalization-guide-dialog.vue";
100
+ import ExportCenterDrawer from "./ExportCenterDrawer.vue";
101
+ import ApprovalCenterDrawer from "./ApprovalCenterDrawer.vue";
102
+ import PersonalSignDialog from "./personal-sign/PersonalSignDialog.vue";
103
+ import { useLayoutConfigStore } from "./stores/useLayoutConfigStore";
104
+ import { useLayoutMenuStore } from "./stores/useLayoutMenuStore";
105
+ import { useLayoutTabsStore } from "./stores/useLayoutTabsStore";
106
+ import { useLayoutNoticeStore } from "./stores/useLayoutNoticeStore";
107
+ import { LAYOUT_ROUTER_KEY, LAYOUT_OPTIONS_KEY } from "./plugin";
108
+ import type { LayoutPluginOptions } from "./plugin";
109
+ import type { TabsOptions } from "./stores/useLayoutTabsStore";
110
+ import type HomeMenu from "../../api/bms/home/bo/HomeMenu";
111
+ import type NoticeVO from "../../api/notice/bo/NoticeVO";
112
+ import { ElNotification, ElMessage } from "element-plus";
113
+ import { navigateByDomainRoute, navigateToPmsAuthRoute } from "./utils/redirect";
114
+
115
+ defineOptions({ name: "LayoutContainer" });
116
+
117
+ const props = defineProps({
118
+ /** 是否显示 tabs 栏 */
119
+ showTabs: { type: Boolean, default: true },
120
+ });
121
+
122
+ // ====== 注入 ======
123
+ const router = inject<any>(LAYOUT_ROUTER_KEY);
124
+ const options = inject<LayoutPluginOptions>(LAYOUT_OPTIONS_KEY);
125
+
126
+ // ====== Stores ======
127
+ const configStore = useLayoutConfigStore();
128
+ const menuStore = useLayoutMenuStore();
129
+ const tabsStore = useLayoutTabsStore();
130
+ const noticeStore = useLayoutNoticeStore();
131
+
132
+ // ====== Computed ======
133
+ const menuPosition = computed(
134
+ () => configStore.userConfig.menuPosition || "top"
135
+ );
136
+ const isLeftMenu = computed(() => menuPosition.value === "left");
137
+
138
+ const leftMenuList = computed(() => {
139
+ const currentSystem =
140
+ menuStore.routerData[0]?.children?.[menuStore.currentSecondIndex] ||
141
+ menuStore.routerData[0]?.children?.[0];
142
+ return currentSystem?.children || [];
143
+ });
144
+
145
+ const systemMenuList = computed(() => {
146
+ const arr: HomeMenu[] = [];
147
+ for (let i = 0; i < menuStore.routerData.length; i++) {
148
+ arr.push(...(menuStore.routerData[i].children || []));
149
+ }
150
+ return arr;
151
+ });
152
+
153
+ const currentApplication = computed(() => menuStore.currentApplication);
154
+
155
+ const currentPath = computed(() => {
156
+ return router?.currentRoute?.value?.path || "";
157
+ });
158
+
159
+ const tabsMenuList = computed(() => tabsStore.tabsMenuList as any[]);
160
+ const tabsMenuValue = computed(() => tabsStore.tabsMenuValue);
161
+
162
+ const userConfigData = computed(() => ({
163
+ fontSize: configStore.userConfig.fontSize,
164
+ dayOrNight: configStore.userConfig.dayOrNight,
165
+ followSystem: configStore.userConfig.followSystem,
166
+ menuPosition: configStore.userConfig.menuPosition,
167
+ navigationBar: configStore.userConfig.navigationBar,
168
+ noviceGuide: configStore.userConfig.noviceGuide,
169
+ avatar: configStore.userConfig.avatar,
170
+ fileUploadType: configStore.userConfig.fileUploadType,
171
+ }));
172
+
173
+ // ====== 状态 ======
174
+ const showNoviceGuide = ref(false);
175
+ const exportDrawerVisible = ref(false);
176
+ const approvalDrawerVisible = ref(false);
177
+ const updateNum = ref<number>(0);
178
+ const notificationRefs = ref<Map<string, any>>(new Map());
179
+
180
+ provide("updateNum", updateNum);
181
+
182
+ // ====== 菜单同步 ======
183
+ const syncSystemMenuByRoute = (path: string) => {
184
+ const systemList = menuStore.routerData[0]?.children || [];
185
+ for (let i = 0; i < systemList.length; i++) {
186
+ if (hasMenuPath(systemList[i], path)) {
187
+ if (i !== menuStore.currentSecondIndex) {
188
+ menuStore.changeCurrentSecondIndex(i, false);
189
+ }
190
+ return;
191
+ }
192
+ }
193
+ };
194
+
195
+ const hasMenuPath = (menu: HomeMenu, path: string): boolean => {
196
+ if (isSameMenuPath(menu.url, path)) return true;
197
+ return !!menu.children?.some((child: HomeMenu) => hasMenuPath(child, path));
198
+ };
199
+
200
+ const isSameMenuPath = (menuUrl?: string, currentPath?: string) => {
201
+ if (!menuUrl || !currentPath) return false;
202
+ return menuUrl.split("?")[0] === currentPath.split("?")[0];
203
+ };
204
+
205
+ // ====== SysHeader 事件处理 ======
206
+ const handleMenuItemClick = (item: HomeMenu) => {
207
+ if (item.url && currentPath.value !== item.url) {
208
+ router?.push({ path: item.url });
209
+ }
210
+ };
211
+
212
+ const handleParentClick = (_item: HomeMenu, index: number) => {
213
+ menuStore.changeCurrentSecondIndex(index, menuPosition.value === "left", router);
214
+ };
215
+
216
+ const goHomePage = () => {
217
+ const subApps = [
218
+ "imd",
219
+ "agoal",
220
+ "scm",
221
+ "bms",
222
+ "coc",
223
+ "hws",
224
+ "kbs",
225
+ "fms",
226
+ "hrm",
227
+ "hrms",
228
+ "itrms",
229
+ "personalization",
230
+ "projectManagement",
231
+ ];
232
+ const pathname = window.location.pathname;
233
+ // 获取最后一个 / 之间的内容
234
+ const segments = pathname.replace(/\/$/, "").split("/");
235
+ const lastSegment = segments[segments.length - 1];
236
+
237
+ if (subApps.includes(lastSegment)) {
238
+ // 删除最后一个路径段
239
+ segments.pop();
240
+ const basePath = segments.join("/") || "/";
241
+ const targetUrl =
242
+ window.location.origin +
243
+ (basePath.endsWith("/") ? basePath : basePath + "/") +
244
+ "#/application-entry";
245
+ window.location.replace(targetUrl);
246
+ } else {
247
+ router?.replace({ path: options?.entryUrl || "/application-entry" });
248
+ }
249
+ };
250
+
251
+ const handleCollapseChange = (collapsed: boolean) => {
252
+ configStore.userConfig.navigationBar = collapsed;
253
+ configStore.changeUserConfig();
254
+ };
255
+
256
+ const handleChangeDark = (value: string, ref?: HTMLElement) => {
257
+ configStore.changeDarkAnimation(
258
+ value as "day" | "night",
259
+ ref
260
+ ? {
261
+ clientX: ref.getBoundingClientRect().x,
262
+ clientY: ref.getBoundingClientRect().y,
263
+ }
264
+ : undefined
265
+ );
266
+ };
267
+
268
+ const handleChangeFollowSystem = (value: boolean) => {
269
+ configStore.followSystemColorModel(value);
270
+ };
271
+
272
+ const handleChangeFontSize = (value: string) => {
273
+ configStore.changeFontSize(value as "small" | "medium" | "large");
274
+ };
275
+
276
+ const handleChangeMenuPosition = (value: string) => {
277
+ configStore.changeMenuPosition(value as "top" | "left");
278
+ };
279
+
280
+ const handleDownloadClick = () => {
281
+ exportDrawerVisible.value = true;
282
+ };
283
+
284
+ const handleTodoClick = () => {
285
+ approvalDrawerVisible.value = true;
286
+ };
287
+
288
+ const handleMessageNavigate = async (notice: NoticeVO) => {
289
+ await noticeStore.readNoticeInfo(notice.noticeId);
290
+ await noticeStore.getNoReadNoticeCount();
291
+ updateNum.value += 1;
292
+ if (notice.noticeType === "file-notice") return;
293
+ if (!notice.urlRoute) return;
294
+ if (notice.urlRoute.startsWith("/project/")) {
295
+ navigateToPmsAuthRoute(notice.urlRoute);
296
+ } else {
297
+ await navigateByDomainRoute(notice.urlRoute, router);
298
+ }
299
+ };
300
+
301
+ const handleMessageDownload = async (notice: NoticeVO) => {
302
+ await noticeStore.readNoticeInfo(notice.noticeId);
303
+ await noticeStore.getNoReadNoticeCount();
304
+ updateNum.value += 1;
305
+ if (options?.onFileDownload) {
306
+ options.onFileDownload(notice);
307
+ }
308
+ };
309
+
310
+ const handleMessageUpdateCount = async () => {
311
+ await noticeStore.getNoReadNoticeCount();
312
+ updateNum.value += 1;
313
+ };
314
+
315
+ const personalSignDialogRef = ref<InstanceType<typeof PersonalSignDialog>>();
316
+ const handlePersonalSign = () => {
317
+ personalSignDialogRef.value?.open();
318
+ };
319
+
320
+ const handleCleanCache = () => {
321
+ sessionStorage.clear();
322
+ ElMessage.success("缓存清理成功");
323
+ };
324
+
325
+ const handleLogout = () => {
326
+ menuStore.doExitLogin();
327
+ };
328
+
329
+ // ====== Tabs 事件处理 ======
330
+ const handleTabClick = (tab: any) => {
331
+ if (tab.path !== currentPath.value) {
332
+ router?.push({ path: tab.path, query: tab.query });
333
+ }
334
+ };
335
+
336
+ const handleTabClose = (tab: any) => {
337
+ tabsStore.removeTabs(tab.path, router);
338
+ };
339
+
340
+ const handleTabCloseOther = (tab: any) => {
341
+ tabsStore.closeMultipleTab(tab.path);
342
+ if (currentPath.value !== tab.path) {
343
+ router?.push({ path: tab.path, query: tab.query });
344
+ }
345
+ };
346
+
347
+ const handleTabCloseAll = () => {
348
+ tabsStore.closeAllTabs(router);
349
+ };
350
+
351
+ const handleTabCloseLeft = (tab: any) => {
352
+ tabsStore.closeLeftTabs(tab.path, router);
353
+ };
354
+
355
+ const handleTabCloseRight = (tab: any) => {
356
+ tabsStore.closeRightTabs(tab.path, router);
357
+ };
358
+
359
+ // ====== 新手引导事件 ======
360
+ const handleGuidePreview = (config: {
361
+ menuPosition: string;
362
+ fontSize: string;
363
+ colorMode: string;
364
+ followSystem: boolean;
365
+ }) => {
366
+ configStore.changeFontSize(config.fontSize as "small" | "medium" | "large", true);
367
+ configStore.changeDark(config.colorMode as "day" | "night", true);
368
+ configStore.userConfig.menuPosition = config.menuPosition as "top" | "left";
369
+ };
370
+
371
+ const handleGuideFinish = (config: {
372
+ menuPosition: string;
373
+ fontSize: string;
374
+ colorMode: string;
375
+ }) => {
376
+ configStore.userConfig.menuPosition = config.menuPosition as "top" | "left";
377
+ configStore.changeFontSize(config.fontSize as "small" | "medium" | "large", true);
378
+ configStore.changeDark(config.colorMode as "day" | "night", true);
379
+ configStore.changeNoviceGuide(false);
380
+ showNoviceGuide.value = false;
381
+ };
382
+
383
+ const handleGuideSkip = () => {
384
+ configStore.changeNoviceGuide(false);
385
+ showNoviceGuide.value = false;
386
+ };
387
+
388
+ const handleGuideRestore = (config: {
389
+ menuPosition: string;
390
+ fontSize: string;
391
+ followSystem: boolean;
392
+ dayOrNight: string;
393
+ }) => {
394
+ configStore.userConfig.menuPosition = config.menuPosition as "top" | "left";
395
+ configStore.changeFontSize(config.fontSize as "small" | "medium" | "large", true);
396
+ configStore.followSystemColorModel(config.followSystem, true);
397
+ };
398
+
399
+ // ====== 通知弹窗 ======
400
+ const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
401
+
402
+ const showNoticeNotification = async (notice: NoticeVO) => {
403
+ const spanId = `notice-action-${notice.noticeId}`;
404
+ const noticeId = notice.noticeId;
405
+
406
+ const closeNotification = () => {
407
+ const inst = notificationRefs.value.get(noticeId);
408
+ if (inst) {
409
+ inst.close();
410
+ notificationRefs.value.delete(noticeId);
411
+ }
412
+ };
413
+
414
+ const handleClick = async () => {
415
+ await noticeStore.readNoticeInfo(notice.noticeId);
416
+ await noticeStore.getNoReadNoticeCount();
417
+ updateNum.value += 1;
418
+ if (notice.noticeType === "file-notice") {
419
+ if (options?.onFileDownload) {
420
+ options.onFileDownload(notice);
421
+ }
422
+ } else if (notice.urlRoute?.startsWith("/project/")) {
423
+ navigateToPmsAuthRoute(notice.urlRoute);
424
+ } else {
425
+ await navigateByDomainRoute(notice.urlRoute, router);
426
+ }
427
+ closeNotification();
428
+ };
429
+
430
+ const inst = ElNotification({
431
+ dangerouslyUseHTMLString: true,
432
+ title: notice.noticeTitle,
433
+ message: `<div>
434
+ <span style="display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;line-height:1.5em;max-height:7.5em">
435
+ ${notice.noticeContent}
436
+ </span>
437
+ </div>
438
+ <div style="text-align:right">
439
+ <span id="${spanId}" style="color:#409eff;border-bottom:1px solid #409eff;cursor:pointer">
440
+ ${notice.noticeType === "file-notice" ? "下载" : "查看详情"}
441
+ </span>
442
+ </div>`,
443
+ duration: 5000,
444
+ customClass: "notification-group",
445
+ offset: 40,
446
+ onClose: () => notificationRefs.value.delete(noticeId),
447
+ onClick: handleClick,
448
+ });
449
+
450
+ notificationRefs.value.set(noticeId, inst);
451
+
452
+ nextTick(() => {
453
+ const spanEl = document.getElementById(spanId);
454
+ if (spanEl) {
455
+ spanEl.addEventListener("click", (e) => {
456
+ e.stopPropagation();
457
+ handleClick();
458
+ });
459
+ }
460
+ });
461
+
462
+ await noticeStore.getNoReadNoticeCount();
463
+ updateNum.value += 1;
464
+ };
465
+
466
+ // ====== 生命周期 ======
467
+ onMounted(async () => {
468
+ // 初始化用户配置
469
+ configStore.initUserConfig();
470
+ await configStore.getUserConfig();
471
+
472
+ // 加载菜单
473
+ const routePath = router?.currentRoute?.value?.path || "";
474
+ await menuStore.getDomainAndHomeMenu(routePath, router);
475
+
476
+ // 恢复标签页
477
+ tabsStore.restoreTabsFromStorage();
478
+
479
+ // 新手引导
480
+ if (configStore.userConfig.noviceGuide) {
481
+ showNoviceGuide.value = true;
482
+ }
483
+
484
+ // 启动消息轮询
485
+ noticeStore.startPolling(async (notices) => {
486
+ for (let i = 0; i < notices.length; i++) {
487
+ showNoticeNotification(notices[i]);
488
+ if (i < notices.length - 1) {
489
+ await delay(100);
490
+ }
491
+ }
492
+ });
493
+ });
494
+
495
+ onUnmounted(() => {
496
+ noticeStore.stopPolling();
497
+ });
498
+
499
+ // 监听路由变化,添加标签页
500
+ watch(
501
+ () => router?.currentRoute?.value,
502
+ (toPath: any) => {
503
+ if (!toPath?.path || toPath.path === "/") return;
504
+ const params: TabsOptions = {
505
+ title:
506
+ (toPath.meta?.title as string) ||
507
+ (toPath.name as string) ||
508
+ "未命名页面",
509
+ path: toPath.path,
510
+ query: toPath.query as Record<string, any>,
511
+ name: toPath.name as string,
512
+ cachedCode: toPath.meta?.cachedCode as string,
513
+ };
514
+ tabsStore.addTabs(params);
515
+ },
516
+ { immediate: true, deep: true }
517
+ );
518
+
519
+ // 监听路由同步顶部菜单
520
+ watch(
521
+ [() => currentPath.value, () => menuStore.routerData],
522
+ ([routePath]) => {
523
+ if (routePath) syncSystemMenuByRoute(routePath);
524
+ },
525
+ { immediate: true, deep: true }
526
+ );
527
+ </script>
528
+
529
+ <style lang="scss">
530
+ .notification-group {
531
+ .el-notification__group {
532
+ position: static;
533
+ width: 100%;
534
+ }
535
+ .el-notification__content {
536
+ word-break: break-all;
537
+ }
538
+ }
539
+ .notification-group:hover {
540
+ cursor: pointer;
541
+ }
542
+ </style>