@gx-design-vue/create-gx-cli 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. package/package.json +1 -1
  2. package/src/main.js +1 -0
  3. package/template-design-pro/.editorconfig +19 -0
  4. package/template-design-pro/.env +2 -0
  5. package/template-design-pro/.env.development +18 -0
  6. package/template-design-pro/.env.pro +32 -0
  7. package/template-design-pro/.env.production +32 -0
  8. package/template-design-pro/.env.test +20 -0
  9. package/template-design-pro/.eslintignore +16 -0
  10. package/template-design-pro/.eslintrc.js +64 -0
  11. package/template-design-pro/.gitpod.yml +6 -0
  12. package/template-design-pro/.husky/pre-commit +4 -0
  13. package/template-design-pro/.prettierignore +9 -0
  14. package/template-design-pro/.stylelintignore +3 -0
  15. package/template-design-pro/.yarnclean +48 -0
  16. package/template-design-pro/LICENSE +21 -0
  17. package/template-design-pro/README.md +111 -0
  18. package/template-design-pro/build/constant.ts +6 -0
  19. package/template-design-pro/build/generate/generateModifyVars.ts +18 -0
  20. package/template-design-pro/build/getConfigFileName.ts +13 -0
  21. package/template-design-pro/build/script/buildConf.ts +44 -0
  22. package/template-design-pro/build/script/postBuild.ts +25 -0
  23. package/template-design-pro/build/script/reSetRootHtml.ts +20 -0
  24. package/template-design-pro/build/utils.ts +85 -0
  25. package/template-design-pro/build/vite/cdn.ts +7 -0
  26. package/template-design-pro/build/vite/optimizer.ts +22 -0
  27. package/template-design-pro/build/vite/plugin/autoImport.ts +18 -0
  28. package/template-design-pro/build/vite/plugin/compress.ts +35 -0
  29. package/template-design-pro/build/vite/plugin/hmr.ts +25 -0
  30. package/template-design-pro/build/vite/plugin/html.ts +47 -0
  31. package/template-design-pro/build/vite/plugin/index.ts +89 -0
  32. package/template-design-pro/build/vite/plugin/mock.ts +20 -0
  33. package/template-design-pro/build/vite/plugin/pwa.ts +37 -0
  34. package/template-design-pro/build/vite/plugin/styleImport.ts +129 -0
  35. package/template-design-pro/build/vite/plugin/visualizer.ts +17 -0
  36. package/template-design-pro/build/vite/plugin/vite-plugin-antd-theme/index.ts +24 -0
  37. package/template-design-pro/build/vite/plugin/vite-plugin-mock/createMockServer.ts +303 -0
  38. package/template-design-pro/build/vite/plugin/vite-plugin-mock/createProdMockServer.ts +93 -0
  39. package/template-design-pro/build/vite/plugin/vite-plugin-mock/index.ts +68 -0
  40. package/template-design-pro/build/vite/plugin/vite-plugin-mock/types.ts +30 -0
  41. package/template-design-pro/build/vite/plugin/vite-plugin-mock/utils.ts +26 -0
  42. package/template-design-pro/commitlint.config.js +32 -0
  43. package/template-design-pro/config/config.ts +14 -0
  44. package/template-design-pro/config/default/animate.ts +30 -0
  45. package/template-design-pro/config/default/defaultSettings.ts +75 -0
  46. package/template-design-pro/config/default/network.ts +16 -0
  47. package/template-design-pro/config/default/proxy.ts +26 -0
  48. package/template-design-pro/config/default/theme.ts +43 -0
  49. package/template-design-pro/config/default/themeColor.ts +62 -0
  50. package/template-design-pro/index.html +45 -0
  51. package/template-design-pro/jest.config.mjs +36 -0
  52. package/template-design-pro/mock/_createProductionServer.ts +19 -0
  53. package/template-design-pro/mock/_util.ts +55 -0
  54. package/template-design-pro/mock/controller/menu.ts +85 -0
  55. package/template-design-pro/mock/controller/notices.ts +114 -0
  56. package/template-design-pro/mock/system/dict.ts +60 -0
  57. package/template-design-pro/mock/system/user.ts +218 -0
  58. package/template-design-pro/package.json +151 -0
  59. package/template-design-pro/pnpm-lock.yaml +9913 -0
  60. package/template-design-pro/postcss.config.js +5 -0
  61. package/template-design-pro/prettier.config.js +18 -0
  62. package/template-design-pro/public/resource/css/index.css +171 -0
  63. package/template-design-pro/public/resource/img/favicon.ico +0 -0
  64. package/template-design-pro/public/resource/img/logo.png +0 -0
  65. package/template-design-pro/public/resource/img/pro_icon.svg +5 -0
  66. package/template-design-pro/public/resource/img/pwa-192x192.png +0 -0
  67. package/template-design-pro/public/resource/img/pwa-512x512.png +0 -0
  68. package/template-design-pro/src/App.vue +47 -0
  69. package/template-design-pro/src/assets/error_images/403.png +0 -0
  70. package/template-design-pro/src/assets/error_images/404.png +0 -0
  71. package/template-design-pro/src/assets/error_images/cloud.png +0 -0
  72. package/template-design-pro/src/assets/login_images/login_background.svg +69 -0
  73. package/template-design-pro/src/assets/logo.png +0 -0
  74. package/template-design-pro/src/assets/menu_font/iconfont.css +94 -0
  75. package/template-design-pro/src/assets/menu_font/iconfont.eot +0 -0
  76. package/template-design-pro/src/assets/menu_font/iconfont.js +1 -0
  77. package/template-design-pro/src/assets/menu_font/iconfont.json +142 -0
  78. package/template-design-pro/src/assets/menu_font/iconfont.svg +57 -0
  79. package/template-design-pro/src/assets/menu_font/iconfont.ttf +0 -0
  80. package/template-design-pro/src/assets/menu_font/iconfont.woff +0 -0
  81. package/template-design-pro/src/assets/menu_font/iconfont.woff2 +0 -0
  82. package/template-design-pro/src/assets/menu_font/index.less +94 -0
  83. package/template-design-pro/src/common/global.ts +1 -0
  84. package/template-design-pro/src/components/GDesign/ProLayout/BasicLayout.less +80 -0
  85. package/template-design-pro/src/components/GDesign/ProLayout/BasicLayout.tsx +342 -0
  86. package/template-design-pro/src/components/GDesign/ProLayout/PageLoading.tsx +20 -0
  87. package/template-design-pro/src/components/GDesign/ProLayout/RenderTypings.ts +31 -0
  88. package/template-design-pro/src/components/GDesign/ProLayout/RouteContext.tsx +82 -0
  89. package/template-design-pro/src/components/GDesign/ProLayout/WrapContent.tsx +69 -0
  90. package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalFooter/index.tsx +88 -0
  91. package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/DefaultHeader.tsx +189 -0
  92. package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/Header.less +8 -0
  93. package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/index.tsx +105 -0
  94. package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/props.ts +69 -0
  95. package/template-design-pro/src/components/GDesign/ProLayout/components/GlobalHeader/style.less +144 -0
  96. package/template-design-pro/src/components/GDesign/ProLayout/components/LogoContent/index.tsx +81 -0
  97. package/template-design-pro/src/components/GDesign/ProLayout/components/LogoContent/props.ts +29 -0
  98. package/template-design-pro/src/components/GDesign/ProLayout/components/MultiTab/index.tsx +384 -0
  99. package/template-design-pro/src/components/GDesign/ProLayout/components/MultiTab/props.ts +15 -0
  100. package/template-design-pro/src/components/GDesign/ProLayout/components/MultiTab/style.less +79 -0
  101. package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/NoticeIcon.tsx +148 -0
  102. package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/NoticeList.module.less +115 -0
  103. package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/NoticeList.tsx +154 -0
  104. package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/index.less +39 -0
  105. package/template-design-pro/src/components/GDesign/ProLayout/components/NoticeIcon/index.tsx +133 -0
  106. package/template-design-pro/src/components/GDesign/ProLayout/components/PageContainer/index.tsx +190 -0
  107. package/template-design-pro/src/components/GDesign/ProLayout/components/PageContainer/props.ts +48 -0
  108. package/template-design-pro/src/components/GDesign/ProLayout/components/PageContainer/style.less +128 -0
  109. package/template-design-pro/src/components/GDesign/ProLayout/components/PageContainer/typings.ts +0 -0
  110. package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/AvatarDropdown.tsx +63 -0
  111. package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/HeaderSearch.tsx +122 -0
  112. package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/headerSearch.less +30 -0
  113. package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/index.tsx +95 -0
  114. package/template-design-pro/src/components/GDesign/ProLayout/components/RightContent/style.less +90 -0
  115. package/template-design-pro/src/components/GDesign/ProLayout/components/SettingDrawer/BlockCheckbox.tsx +70 -0
  116. package/template-design-pro/src/components/GDesign/ProLayout/components/SettingDrawer/LayoutSetting.tsx +107 -0
  117. package/template-design-pro/src/components/GDesign/ProLayout/components/SettingDrawer/ThemeColor.tsx +68 -0
  118. package/template-design-pro/src/components/GDesign/ProLayout/components/SettingDrawer/index.tsx +346 -0
  119. package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/BaseMenu.tsx +224 -0
  120. package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/SiderMenu.tsx +224 -0
  121. package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/index.tsx +43 -0
  122. package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/props.ts +112 -0
  123. package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/style.less +262 -0
  124. package/template-design-pro/src/components/GDesign/ProLayout/components/SiderMenu/typings.ts +44 -0
  125. package/template-design-pro/src/components/GDesign/ProLayout/default.less +2 -0
  126. package/template-design-pro/src/components/GDesign/ProLayout/defaultSettings.ts +121 -0
  127. package/template-design-pro/src/components/GDesign/ProLayout/hooks/context/index.ts +45 -0
  128. package/template-design-pro/src/components/GDesign/ProLayout/index.ts +43 -0
  129. package/template-design-pro/src/components/GDesign/ProLayout/props.ts +57 -0
  130. package/template-design-pro/src/components/GDesign/ProLayout/style.less +272 -0
  131. package/template-design-pro/src/components/GDesign/ProLayout/typings.ts +1 -0
  132. package/template-design-pro/src/components/GDesign/ProLayout/utils/getMenuData.ts +31 -0
  133. package/template-design-pro/src/components/GDesign/ProLayout/utils/index.ts +94 -0
  134. package/template-design-pro/src/components/GDesign/ProLayout/utils/isImg/index.ts +6 -0
  135. package/template-design-pro/src/components/GDesign/ProLayout/utils/isUrl/index.ts +5 -0
  136. package/template-design-pro/src/components/GDesign/Result/index.tsx +142 -0
  137. package/template-design-pro/src/components/GDesign/Result/style.less +140 -0
  138. package/template-design-pro/src/components/GDesign/Scrollbars/components/Bar/index.tsx +56 -0
  139. package/template-design-pro/src/components/GDesign/Scrollbars/components/Bar/props.ts +23 -0
  140. package/template-design-pro/src/components/GDesign/Scrollbars/components/Thumb/index.tsx +164 -0
  141. package/template-design-pro/src/components/GDesign/Scrollbars/components/Thumb/props.ts +11 -0
  142. package/template-design-pro/src/components/GDesign/Scrollbars/context.ts +10 -0
  143. package/template-design-pro/src/components/GDesign/Scrollbars/index.tsx +200 -0
  144. package/template-design-pro/src/components/GDesign/Scrollbars/props.ts +65 -0
  145. package/template-design-pro/src/components/GDesign/Scrollbars/style.less +85 -0
  146. package/template-design-pro/src/components/GDesign/Scrollbars/util.ts +40 -0
  147. package/template-design-pro/src/components/GDesign/utils/index.ts +7 -0
  148. package/template-design-pro/src/components/PageLoading/index.tsx +44 -0
  149. package/template-design-pro/src/components/PageTransition/index.vue +98 -0
  150. package/template-design-pro/src/components/index.ts +6 -0
  151. package/template-design-pro/src/core/ant-design/index.ts +14 -0
  152. package/template-design-pro/src/core/gx-admin-design/index.ts +7 -0
  153. package/template-design-pro/src/core/gx-admin-directives/index.ts +8 -0
  154. package/template-design-pro/src/core/gx-admin-directives/permission.ts +28 -0
  155. package/template-design-pro/src/core/gx-design/index.ts +7 -0
  156. package/template-design-pro/src/core/gx-pro-design/index.ts +10 -0
  157. package/template-design-pro/src/core/index.ts +27 -0
  158. package/template-design-pro/src/design/ant-design/index.less +4 -0
  159. package/template-design-pro/src/design/ant-design/layout.less +29 -0
  160. package/template-design-pro/src/design/ant-design/menu.less +55 -0
  161. package/template-design-pro/src/design/ant-design/table.less +67 -0
  162. package/template-design-pro/src/design/ant-design/tooltip.less +13 -0
  163. package/template-design-pro/src/design/color.less +1 -0
  164. package/template-design-pro/src/design/config.less +5 -0
  165. package/template-design-pro/src/design/index.less +41 -0
  166. package/template-design-pro/src/design/mixin.less +66 -0
  167. package/template-design-pro/src/design/normalize.less +390 -0
  168. package/template-design-pro/src/global.less +15 -0
  169. package/template-design-pro/src/hooks/core/index.ts +3 -0
  170. package/template-design-pro/src/hooks/core/useRequest/index.ts +70 -0
  171. package/template-design-pro/src/hooks/core/useRequest/typings.ts +0 -0
  172. package/template-design-pro/src/hooks/event/index.ts +3 -0
  173. package/template-design-pro/src/hooks/event/useClipboard.ts +14 -0
  174. package/template-design-pro/src/hooks/system/index.ts +5 -0
  175. package/template-design-pro/src/hooks/system/useDict.ts +62 -0
  176. package/template-design-pro/src/hooks/system/usePermissions.ts +39 -0
  177. package/template-design-pro/src/hooks/typings.ts +17 -0
  178. package/template-design-pro/src/layout/BasicLayout.vue +104 -0
  179. package/template-design-pro/src/layout/BlankLayout.vue +5 -0
  180. package/template-design-pro/src/layout/ContentView.vue +76 -0
  181. package/template-design-pro/src/layout/IframeView.vue +1 -0
  182. package/template-design-pro/src/layout/UserLayout.vue +7 -0
  183. package/template-design-pro/src/main.ts +34 -0
  184. package/template-design-pro/src/plugins/index.ts +3 -0
  185. package/template-design-pro/src/router/guard/index.ts +84 -0
  186. package/template-design-pro/src/router/guard/permissions.ts +73 -0
  187. package/template-design-pro/src/router/guard/stateGuard.ts +11 -0
  188. package/template-design-pro/src/router/helper/routeHelper.ts +244 -0
  189. package/template-design-pro/src/router/helper/utils.ts +19 -0
  190. package/template-design-pro/src/router/index.ts +30 -0
  191. package/template-design-pro/src/router/routes/index.ts +85 -0
  192. package/template-design-pro/src/router/routes/modules/workplace.ts +19 -0
  193. package/template-design-pro/src/services/common/index.ts +11 -0
  194. package/template-design-pro/src/services/controller/router.ts +10 -0
  195. package/template-design-pro/src/services/controller/user.ts +35 -0
  196. package/template-design-pro/src/services/system/dictData.ts +10 -0
  197. package/template-design-pro/src/services/system/notices.ts +9 -0
  198. package/template-design-pro/src/store/index.ts +32 -0
  199. package/template-design-pro/src/store/modules/dict.ts +27 -0
  200. package/template-design-pro/src/store/modules/permission.ts +19 -0
  201. package/template-design-pro/src/store/modules/routes.ts +110 -0
  202. package/template-design-pro/src/store/modules/settings.ts +102 -0
  203. package/template-design-pro/src/store/modules/tabsRouter.ts +73 -0
  204. package/template-design-pro/src/store/modules/user.ts +153 -0
  205. package/template-design-pro/src/utils/accessToken.ts +93 -0
  206. package/template-design-pro/src/utils/crypto.ts +39 -0
  207. package/template-design-pro/src/utils/env.ts +52 -0
  208. package/template-design-pro/src/utils/fetchFile.ts +79 -0
  209. package/template-design-pro/src/utils/index.ts +127 -0
  210. package/template-design-pro/src/utils/pageTitle.ts +17 -0
  211. package/template-design-pro/src/utils/request/XHR.ts +131 -0
  212. package/template-design-pro/src/utils/request/axiosCancel.ts +60 -0
  213. package/template-design-pro/src/utils/request/checkStatus.ts +26 -0
  214. package/template-design-pro/src/utils/request/index.ts +145 -0
  215. package/template-design-pro/src/utils/request/typings.ts +114 -0
  216. package/template-design-pro/src/utils/storage.ts +194 -0
  217. package/template-design-pro/src/utils/uploadFile.ts +26 -0
  218. package/template-design-pro/src/utils/util.ts +278 -0
  219. package/template-design-pro/src/utils/validate.ts +221 -0
  220. package/template-design-pro/src/views/Iframe/index.vue +76 -0
  221. package/template-design-pro/src/views/MenuOne/index.vue +15 -0
  222. package/template-design-pro/src/views/MenuTwo/index.vue +13 -0
  223. package/template-design-pro/src/views/exception/403/index.vue +9 -0
  224. package/template-design-pro/src/views/exception/404/index.vue +9 -0
  225. package/template-design-pro/src/views/user/login/index.vue +110 -0
  226. package/template-design-pro/src/views/user/login/style.less +38 -0
  227. package/template-design-pro/stylelint.config.js +106 -0
  228. package/template-design-pro/tests/__mocks__/fileMock.ts +1 -0
  229. package/template-design-pro/tests/__mocks__/styleMock.ts +1 -0
  230. package/template-design-pro/tests/__mocks__/workerMock.ts +5 -0
  231. package/template-design-pro/tests/server/README.md +15 -0
  232. package/template-design-pro/tests/server/controller/FileController.ts +18 -0
  233. package/template-design-pro/tests/server/controller/UserController.ts +15 -0
  234. package/template-design-pro/tests/server/ecosystem.config.js +18 -0
  235. package/template-design-pro/tests/server/index.ts +63 -0
  236. package/template-design-pro/tests/server/nodemon.json +8 -0
  237. package/template-design-pro/tests/server/package.json +36 -0
  238. package/template-design-pro/tests/server/routes.ts +23 -0
  239. package/template-design-pro/tests/server/service/FileService.ts +54 -0
  240. package/template-design-pro/tests/server/service/UserService.ts +25 -0
  241. package/template-design-pro/tests/server/tsconfig.json +15 -0
  242. package/template-design-pro/tests/server/utils.ts +9 -0
  243. package/template-design-pro/tests/server/yarn.lock +2955 -0
  244. package/template-design-pro/tests/test.spec.ts +16 -0
  245. package/template-design-pro/tsconfig.json +47 -0
  246. package/template-design-pro/types/auto-imports.d.ts +61 -0
  247. package/template-design-pro/types/config.d.ts +100 -0
  248. package/template-design-pro/types/global.d.ts +103 -0
  249. package/template-design-pro/types/gx-components.d.ts +24 -0
  250. package/template-design-pro/types/index.d.ts +13 -0
  251. package/template-design-pro/types/mock.d.ts +23 -0
  252. package/template-design-pro/types/module.d.ts +16 -0
  253. package/template-design-pro/types/response.d.ts +15 -0
  254. package/template-design-pro/types/route.d.ts +89 -0
  255. package/template-design-pro/vite.config.ts +136 -0
  256. package/template-design-pro/yarn.lock +9697 -0
@@ -0,0 +1,79 @@
1
+ @import '../../default.less';
2
+
3
+ @pro-layout-multi-tab-prefix-cls: ~'@{gx-prefix-pro}-multi-tab';
4
+
5
+ .@{pro-layout-multi-tab-prefix-cls} {
6
+ .ant-tabs {
7
+ margin: 0;
8
+ width: 100%;
9
+ padding-bottom: 6px;
10
+ background: @white;
11
+
12
+ .ant-tabs-nav {
13
+ padding-left: 16px;
14
+ margin: 0;
15
+ }
16
+ }
17
+
18
+ .ant-tabs-bar {
19
+ padding-left: 16px;
20
+ margin: 0;
21
+ }
22
+
23
+ &-wrap {
24
+ background-color: @white;
25
+
26
+ &-fixed {
27
+ position: fixed;
28
+ top: 48px;
29
+ right: 0;
30
+ z-index: 9;
31
+ width: 100%;
32
+ height: 62px;
33
+ transition: width 0.2s;
34
+ }
35
+
36
+ &-loading {
37
+ height: 48px;
38
+ }
39
+ }
40
+
41
+ &-fixed {
42
+ width: 100%;
43
+ height: 62px;
44
+ background: transparent;
45
+
46
+ &-loading {
47
+ height: 48px;
48
+ }
49
+ }
50
+
51
+ &-dropdown-menu-btn {
52
+ padding: 12px;
53
+ margin-right: 8px;
54
+ font-size: 16px;
55
+ cursor: pointer;
56
+ }
57
+
58
+ &-content {
59
+ display: flex;
60
+ align-items: center;
61
+ }
62
+
63
+ &-reload-btn {
64
+ margin-right: 0;
65
+ margin-left: 8px;
66
+ font-size: 12px;
67
+ color: rgba(0, 0, 0, 0.45);
68
+
69
+ &:hover {
70
+ color: var(--ant-primary-color);
71
+ }
72
+ }
73
+
74
+ &-close-btn {
75
+ margin-left: 8px;
76
+ font-size: 12px;
77
+ color: rgba(0, 0, 0, 0.45);
78
+ }
79
+ }
@@ -0,0 +1,148 @@
1
+ import type { CSSProperties, ExtractPropTypes } from 'vue'
2
+ import { computed, defineComponent, ref } from 'vue'
3
+ import { Tabs, Badge, Dropdown, Spin } from 'ant-design-vue'
4
+ import { BellOutlined } from '@ant-design/icons-vue'
5
+ import { getPrefixCls } from '@gx-design-vue/pro-utils'
6
+ import { PropTypes } from '@/utils'
7
+ import NoticeList, { NoticeIconItem, NoticeIconTabProps } from './NoticeList'
8
+
9
+ import './index.less'
10
+
11
+ const TabPane = Tabs.TabPane
12
+
13
+ export const noticeIconProps = {
14
+ class: PropTypes.string,
15
+ count: PropTypes.number,
16
+ loading: PropTypes.looseBool,
17
+ onClear: Function as PropType<(tabName: string, tabKey: string) => void>,
18
+ onItemClick: Function as PropType<(item: NoticeIconItem, tabProps: NoticeIconTabProps) => void>,
19
+ onViewMore: Function as PropType<(tabProps: NoticeIconTabProps, e: MouseEvent) => void>,
20
+ onTabChange: Function as PropType<(tabTile: string) => void>,
21
+ style: {
22
+ type: Object as PropType<CSSProperties>,
23
+ default: () => undefined
24
+ },
25
+ onPopupVisibleChange: Function as PropType<(visible: boolean) => void>,
26
+ popupVisible: PropTypes.looseBool,
27
+ clearText: PropTypes.string,
28
+ viewMoreText: PropTypes.string,
29
+ clearClose: PropTypes.looseBool,
30
+ emptyImage: PropTypes.string
31
+ }
32
+
33
+ export type NoticeIconProps = Partial<ExtractPropTypes<typeof noticeIconProps>>
34
+
35
+ const NoticeIcon = defineComponent({
36
+ props: noticeIconProps,
37
+ Tab: NoticeList,
38
+ emits: ['onClear', 'onTabChange', 'onItemClick', 'onViewMore', 'onPopupVisibleChange'],
39
+ setup(props, { emit, slots }) {
40
+ const prefixCls = getPrefixCls({
41
+ suffixCls: 'notice',
42
+ isPor: true
43
+ })
44
+
45
+ const visible = ref(props.popupVisible || false)
46
+
47
+ const activeKey = ref('notification')
48
+
49
+ const getChildrenSlots: any = computed(() =>
50
+ slots.default?.().length === 1 &&
51
+ (String(slots.default?.()[0].type) === String(Symbol('Fragment')) ||
52
+ String(slots.default?.()[0].type) === String(Symbol()))
53
+ ? slots.default?.()[0].children || []
54
+ : slots.default?.() || []
55
+ )
56
+
57
+ const onChange = (value: boolean) => {
58
+ visible.value = value
59
+ emit('onPopupVisibleChange', value)
60
+ }
61
+
62
+ const onTabChange = (key) => {
63
+ activeKey.value = key
64
+ props.onTabChange && props.onTabChange(key)
65
+ }
66
+
67
+ const NoticeBellIcon = <BellOutlined class={`${prefixCls}-icon`} />
68
+
69
+ const trigger = computed(() => (
70
+ <span
71
+ class={{
72
+ [`${prefixCls}-button`]: true,
73
+ [`${props.class}`]: props.class,
74
+ [`opened`]: visible.value
75
+ }}
76
+ onClick={() => onChange(true)}
77
+ >
78
+ <Badge count={props.count} style={{ boxShadow: 'none' }} class={`${prefixCls}-badge`}>
79
+ {NoticeBellIcon}
80
+ </Badge>
81
+ </span>
82
+ ))
83
+
84
+ const notificationBoxRender = () => {
85
+ const { loading, onClear, onItemClick, onViewMore, clearText, viewMoreText } = props
86
+
87
+ return (
88
+ <Spin spinning={loading} delay={300}>
89
+ <Tabs class={`${prefixCls}-tabs`} activeKey={activeKey.value} onChange={onTabChange}>
90
+ {getChildrenSlots.value.map((item: any) => {
91
+ if (!item) {
92
+ return null
93
+ }
94
+
95
+ const { list, title, count, tabKey, showClear, showViewMore, emptyText } = item.props
96
+ const len = list && list.length ? list.length : 0
97
+ const msgCount = count || count === 0 ? count : len
98
+ const tabTitle: string = msgCount > 0 ? `${title} (${msgCount})` : title
99
+ return (
100
+ <TabPane tab={tabTitle} key={tabKey}>
101
+ <NoticeList
102
+ clearText={clearText}
103
+ viewMoreText={viewMoreText}
104
+ list={list}
105
+ tabKey={tabKey}
106
+ onClear={(): void => onClear && onClear(title, tabKey)}
107
+ onClick={(el): void => onItemClick && onItemClick(el, item.props)}
108
+ onViewMore={(event): void => onViewMore && onViewMore(item.props, event)}
109
+ emptyText={emptyText}
110
+ showClear={showClear}
111
+ showViewMore={showViewMore}
112
+ title={title}
113
+ />
114
+ </TabPane>
115
+ )
116
+ })}
117
+ </Tabs>
118
+ </Spin>
119
+ )
120
+ }
121
+
122
+ return () => {
123
+ return (
124
+ <>
125
+ {getChildrenSlots.value.length > 0 ? (
126
+ <Dropdown
127
+ placement="bottomRight"
128
+ trigger={['click']}
129
+ overlay={notificationBoxRender()}
130
+ overlayClassName={`gx-pro-dropdown-container ${prefixCls}-popover`}
131
+ onVisibleChange={() => onChange}
132
+ >
133
+ {trigger.value}
134
+ </Dropdown>
135
+ ) : (
136
+ trigger.value
137
+ )}
138
+ </>
139
+ )
140
+ }
141
+ }
142
+ })
143
+
144
+ NoticeIcon.defaultProps = {
145
+ emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg'
146
+ }
147
+
148
+ export default NoticeIcon
@@ -0,0 +1,115 @@
1
+ .list {
2
+ max-height: 400px;
3
+ overflow: auto;
4
+
5
+ &::-webkit-scrollbar {
6
+ display: none;
7
+ }
8
+
9
+ .item {
10
+ padding-right: 24px;
11
+ padding-left: 24px;
12
+ overflow: hidden;
13
+ cursor: pointer;
14
+ transition: all 0.3s;
15
+
16
+ .meta {
17
+ width: 100%;
18
+ }
19
+
20
+ .avatar {
21
+ margin-top: 4px;
22
+ background: @component-background;
23
+ }
24
+
25
+ .iconElement {
26
+ font-size: 32px;
27
+ }
28
+
29
+ &.read {
30
+ opacity: 0.4;
31
+ }
32
+
33
+ &:last-child {
34
+ border-bottom: 0;
35
+ }
36
+
37
+ &:hover {
38
+ background: @primary-1;
39
+ }
40
+
41
+ .title {
42
+ margin-bottom: 8px;
43
+ font-weight: normal;
44
+ }
45
+
46
+ .description {
47
+ font-size: 12px;
48
+ line-height: @line-height-base;
49
+ }
50
+
51
+ .datetime {
52
+ margin-top: 4px;
53
+ font-size: 12px;
54
+ line-height: @line-height-base;
55
+ }
56
+
57
+ .extra {
58
+ float: right;
59
+ margin-top: -1.5px;
60
+ margin-right: 0;
61
+ font-weight: normal;
62
+ color: @text-color-secondary;
63
+ }
64
+ }
65
+
66
+ .loadMore {
67
+ padding: 8px 0;
68
+ color: @primary-6;
69
+ text-align: center;
70
+ cursor: pointer;
71
+
72
+ &.loadedAll {
73
+ color: rgba(0, 0, 0, 0.25);
74
+ cursor: unset;
75
+ }
76
+ }
77
+ }
78
+
79
+ .notFound {
80
+ padding: 73px 0 88px;
81
+ color: @text-color-secondary;
82
+ text-align: center;
83
+
84
+ img {
85
+ display: inline-block;
86
+ height: 76px;
87
+ margin-bottom: 16px;
88
+ }
89
+ }
90
+
91
+ .bottomBar {
92
+ height: 46px;
93
+ line-height: 46px;
94
+ color: @text-color;
95
+ text-align: center;
96
+ border-top: 1px solid @border-color-split;
97
+ border-radius: 0 0 @border-radius-base @border-radius-base;
98
+ transition: all 0.3s;
99
+
100
+ div {
101
+ display: inline-block;
102
+ width: 50%;
103
+ cursor: pointer;
104
+ user-select: none;
105
+ transition: all 0.3s;
106
+
107
+ &:only-child {
108
+ width: 100%;
109
+ }
110
+
111
+ &:not(:only-child):last-child {
112
+ border-left: 1px solid @border-color-split;
113
+ }
114
+ }
115
+ }
@@ -0,0 +1,154 @@
1
+ import type { FunctionalComponent as FC, CSSProperties } from 'vue'
2
+ import { Tag, List, Avatar } from 'ant-design-vue'
3
+
4
+ import styles from './NoticeList.module.less'
5
+
6
+ export type NoticeIconItemType = 'notification' | 'message' | 'event'
7
+
8
+ export type NoticeIconItem = {
9
+ props?: any
10
+ id?: string
11
+ extra?: string
12
+ key?: string
13
+ read?: boolean
14
+ avatar?: string
15
+ title?: string
16
+ status?: string
17
+ datetime?: string
18
+ description?: string
19
+ type?: NoticeIconItemType
20
+ }
21
+
22
+ export type NoticeIconTabProps = {
23
+ count?: number
24
+ showClear?: boolean
25
+ showViewMore?: boolean
26
+ style?: CSSProperties
27
+ title: string
28
+ tabKey: NoticeIconItemType
29
+ onClick?: (item: NoticeIconItem) => void
30
+ onClear?: () => void
31
+ emptyText?: string
32
+ clearText?: string
33
+ viewMoreText?: string
34
+ list: NoticeIconItem[]
35
+ onViewMore?: (e: any) => void
36
+ }
37
+
38
+ const NoticeListExtra = (extra, status) => {
39
+ const color = {
40
+ todo: '',
41
+ processing: 'blue',
42
+ urgent: 'red',
43
+ doing: 'gold'
44
+ }[status]
45
+
46
+ return (
47
+ extra && (
48
+ <Tag
49
+ color={color}
50
+ style={{
51
+ marginRight: 0
52
+ }}
53
+ >
54
+ {extra}
55
+ </Tag>
56
+ )
57
+ )
58
+ }
59
+
60
+ const NoticeList: FC<NoticeIconTabProps> = ({
61
+ list = [],
62
+ onClick,
63
+ onClear,
64
+ title,
65
+ onViewMore,
66
+ emptyText,
67
+ showClear = true,
68
+ clearText,
69
+ viewMoreText,
70
+ showViewMore = false
71
+ }) => {
72
+ if (!list || list.length === 0) {
73
+ return (
74
+ <div class={styles['notFound']}>
75
+ <img
76
+ src="https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg"
77
+ alt="not found"
78
+ />
79
+ <div>{emptyText}</div>
80
+ </div>
81
+ )
82
+ }
83
+
84
+ return (
85
+ <div>
86
+ <List
87
+ class={styles['list']}
88
+ dataSource={list}
89
+ renderItem={({ item, index }) => {
90
+ const itemCls = {
91
+ [`${styles['item']}`]: true,
92
+ [`${styles['read']}`]: item.read
93
+ }
94
+ const leftIcon = item.avatar ? (
95
+ typeof item.avatar === 'string' ? (
96
+ <Avatar class={styles['avatar']} src={item.avatar} />
97
+ ) : (
98
+ <span class={styles['iconElement']}>{item.avatar}</span>
99
+ )
100
+ ) : null
101
+
102
+ return (
103
+ <List.Item
104
+ class={itemCls}
105
+ key={item.key || index}
106
+ onClick={() => {
107
+ onClick?.(item)
108
+ }}
109
+ >
110
+ <List.Item.Meta
111
+ class={styles['meta']}
112
+ avatar={leftIcon}
113
+ title={
114
+ <div class={styles['title']}>
115
+ {item.title}
116
+ {item.extra && (
117
+ <div class={styles.extra}>{NoticeListExtra(item.extra, item.status)}</div>
118
+ )}
119
+ </div>
120
+ }
121
+ description={
122
+ <div>
123
+ <div class={styles['description']}>{item.description}</div>
124
+ <div class={styles['datetime']}>{item.datetime}</div>
125
+ </div>
126
+ }
127
+ />
128
+ </List.Item>
129
+ )
130
+ }}
131
+ />
132
+ <div class={styles['bottomBar']}>
133
+ {showClear ? (
134
+ <div onClick={onClear}>
135
+ {clearText} {title}
136
+ </div>
137
+ ) : null}
138
+ {showViewMore ? (
139
+ <div
140
+ onClick={(e) => {
141
+ if (onViewMore) {
142
+ onViewMore(e)
143
+ }
144
+ }}
145
+ >
146
+ {viewMoreText}
147
+ </div>
148
+ ) : null}
149
+ </div>
150
+ </div>
151
+ )
152
+ }
153
+
154
+ export default NoticeList
@@ -0,0 +1,39 @@
1
+ @pro-notice: ~'@{gx-prefix}-pro-notice';
2
+
3
+ body {
4
+ .@{pro-notice} {
5
+ &-popover {
6
+ position: relative;
7
+ width: 336px;
8
+ }
9
+
10
+ &-button {
11
+ display: inline-block;
12
+ cursor: pointer;
13
+ transition: all 0.3s;
14
+ }
15
+
16
+ &-icon {
17
+ padding: 4px;
18
+ vertical-align: middle;
19
+ }
20
+
21
+ &-badge {
22
+ font-size: 16px;
23
+ }
24
+
25
+ &-tabs {
26
+ .ant-tabs-nav-list {
27
+ margin: auto;
28
+ }
29
+
30
+ .ant-tabs-nav-scroll {
31
+ text-align: center;
32
+ }
33
+
34
+ .ant-tabs-bar {
35
+ margin-bottom: 0;
36
+ }
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,133 @@
1
+ import { computed, defineComponent, onMounted, reactive } from 'vue'
2
+ import dayjs from 'dayjs'
3
+ import { groupBy } from 'lodash-es'
4
+ import { message } from 'ant-design-vue'
5
+ import { getNotices } from '@/services/system/notices'
6
+ import type { NoticeIconItem } from './NoticeList'
7
+ import NoticeIcon from './NoticeIcon'
8
+
9
+ const getNoticeData = (notices: NoticeIconItem[]): Record<string, NoticeIconItem[]> => {
10
+ if (!notices || notices.length === 0 || !Array.isArray(notices)) {
11
+ return {}
12
+ }
13
+
14
+ const newNotices = notices.map((notice) => {
15
+ const newNotice = { ...notice }
16
+
17
+ if (newNotice.datetime) {
18
+ newNotice.datetime = dayjs(notice.datetime as string).fromNow()
19
+ }
20
+
21
+ if (newNotice.id) {
22
+ newNotice.key = newNotice.id
23
+ }
24
+
25
+ return newNotice
26
+ })
27
+ return groupBy(newNotices, 'type')
28
+ }
29
+
30
+ const getUnreadData = (noticeData: Record<string, NoticeIconItem[]>) => {
31
+ const unreadMsg: Record<string, number> = {}
32
+ Object.keys(noticeData).forEach((key) => {
33
+ const value = noticeData[key]
34
+
35
+ if (!unreadMsg[key]) {
36
+ unreadMsg[key] = 0
37
+ }
38
+
39
+ if (Array.isArray(value)) {
40
+ unreadMsg[key] = value.filter((item) => !item.read).length
41
+ }
42
+ })
43
+ return unreadMsg
44
+ }
45
+
46
+ const NoticeIconView = defineComponent({
47
+ setup() {
48
+ const state = reactive({
49
+ notices: [] as NoticeIconItem[]
50
+ })
51
+
52
+ onMounted(async () => {
53
+ const response = await getNotices()
54
+ if (response) {
55
+ state.notices = response.data || []
56
+ }
57
+ })
58
+
59
+ const noticeData = computed(() => getNoticeData(state.notices))
60
+
61
+ const unreadMsg = computed(() => getUnreadData(noticeData.value) || {})
62
+
63
+ const changeReadState = (id: string) => {
64
+ state.notices = state.notices.map((item) => {
65
+ const notice = { ...item }
66
+ if (notice.id === id) {
67
+ notice.read = true
68
+ }
69
+ return notice
70
+ })
71
+ }
72
+
73
+ const clearReadState = (title: string, key: string) => {
74
+ state.notices = state.notices.map((item) => {
75
+ const notice = { ...item }
76
+ if (notice.type === key) {
77
+ notice.read = true
78
+ }
79
+ return notice
80
+ })
81
+ message.success(`${'清空了'} ${title}`)
82
+ }
83
+
84
+ return () => {
85
+ return (
86
+ <NoticeIcon
87
+ class="gx-pro-right-content-action"
88
+ count={
89
+ unreadMsg.value && unreadMsg.value.notification
90
+ ? unreadMsg.value.notification + unreadMsg.value.message + unreadMsg.value.event
91
+ : 0
92
+ }
93
+ onItemClick={(item) => {
94
+ changeReadState(item.id!)
95
+ }}
96
+ onClear={(title: string, key: string) => clearReadState(title, key)}
97
+ loading={false}
98
+ clearText="清空"
99
+ viewMoreText="查看更多"
100
+ onViewMore={() => message.info('Click on view more')}
101
+ clearClose
102
+ >
103
+ <NoticeIcon.Tab
104
+ tabKey="notification"
105
+ count={unreadMsg.value.notification}
106
+ list={noticeData.value.notification}
107
+ title="通知"
108
+ emptyText="你已查看所有通知"
109
+ showViewMore
110
+ />
111
+ <NoticeIcon.Tab
112
+ tabKey="message"
113
+ count={unreadMsg.value.message}
114
+ list={noticeData.value.message}
115
+ title="消息"
116
+ emptyText="您已读完所有消息"
117
+ showViewMore
118
+ />
119
+ <NoticeIcon.Tab
120
+ tabKey="event"
121
+ title="待办"
122
+ emptyText="你已完成所有待办"
123
+ count={unreadMsg.value.event}
124
+ list={noticeData.value.event}
125
+ showViewMore
126
+ />
127
+ </NoticeIcon>
128
+ )
129
+ }
130
+ }
131
+ })
132
+
133
+ export default NoticeIconView