@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,144 @@
1
+ @import '../../default.less';
2
+
3
+ @pro-layout-header-prefix-cls: ~'@{gx-prefix-pro}-header';
4
+ @pro-layout-global-header-prefix-cls: ~'@{gx-prefix-pro}-global-header';
5
+
6
+ @pro-layout-header-bg: @component-background;
7
+ @pro-layout-header-hover-bg: @component-background;
8
+ @pro-layout-header-box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
9
+
10
+ .@{pro-layout-header-prefix-cls} {
11
+ &.light {
12
+ background-color: @component-background;
13
+ }
14
+
15
+ &.dark {
16
+ background: #001529;
17
+ }
18
+ }
19
+
20
+ .@{pro-layout-global-header-prefix-cls} {
21
+ position: relative;
22
+ display: flex;
23
+ align-items: center;
24
+ width: 100%;
25
+ height: 100%;
26
+ padding: 0 16px;
27
+ background: @pro-layout-header-bg;
28
+ box-shadow: @pro-layout-header-box-shadow;
29
+
30
+ > * {
31
+ height: 100%;
32
+ }
33
+
34
+ .@{ant-prefix}-menu {
35
+ background: transparent;
36
+ }
37
+
38
+ &.light {
39
+ background-color: @component-background;
40
+
41
+ .@{pro-layout-global-header-prefix-cls}-logo {
42
+ h1 {
43
+ color: @heading-color;
44
+ }
45
+ }
46
+ }
47
+
48
+ &.dark {
49
+ height: @pro-layout-header-height;
50
+ background: #001529;
51
+
52
+ .anticon {
53
+ color: @btn-primary-color;
54
+ }
55
+ }
56
+
57
+ &.wide {
58
+ padding: 0;
59
+
60
+ .@{pro-layout-global-header-prefix-cls} {
61
+ &-main {
62
+ margin: auto;
63
+ padding: 0;
64
+ transition: all 0.3s;
65
+ }
66
+ }
67
+ }
68
+
69
+ &-main {
70
+ display: flex;
71
+ width: 100%;
72
+ height: 100%;
73
+ padding: 0 16px;
74
+
75
+ &.wide {
76
+ padding: 0;
77
+ }
78
+
79
+ &-left {
80
+ display: flex;
81
+ min-width: 192px;
82
+ }
83
+ }
84
+
85
+ &-collapsed-button {
86
+ display: flex;
87
+ align-items: center;
88
+ margin-left: 16px;
89
+ font-size: 20px;
90
+ cursor: pointer;
91
+ }
92
+
93
+ &-logo {
94
+ position: relative;
95
+ min-width: 165px;
96
+ height: 100%;
97
+ overflow: hidden;
98
+
99
+ &.mobile {
100
+ min-width: unset;
101
+ }
102
+
103
+ a {
104
+ display: flex;
105
+ align-items: center;
106
+ height: 100%;
107
+
108
+ img,
109
+ svg {
110
+ display: inline-block;
111
+ height: 32px;
112
+ vertical-align: middle;
113
+ }
114
+
115
+ h1 {
116
+ display: inline-block;
117
+ margin: 0 0 0 12px;
118
+ font-size: 16px;
119
+ color: @btn-primary-color;
120
+ vertical-align: top;
121
+ }
122
+ }
123
+ }
124
+
125
+ &-menu {
126
+ flex: 1 1 0%;
127
+
128
+ .anticon {
129
+ margin-right: 8px;
130
+ }
131
+
132
+ .@{ant-prefix}-dropdown-menu-item {
133
+ min-width: 160px;
134
+ }
135
+ }
136
+
137
+ &-right {
138
+ display: flex;
139
+ float: right;
140
+ height: 48px;
141
+ margin-left: auto;
142
+ overflow: hidden;
143
+ }
144
+ }
@@ -0,0 +1,81 @@
1
+ import type { CSSProperties, ExtractPropTypes } from 'vue'
2
+ import { computed, defineComponent } from 'vue'
3
+ import Logo from '@/assets/logo.png'
4
+ import logoContentProps from './props'
5
+ import { useRouteContext } from '../../RouteContext'
6
+
7
+ export type LogoContentProps = Partial<ExtractPropTypes<typeof logoContentProps>>
8
+
9
+ export const defaultRenderLogo = (logo?: CustomRender, logoStyle?: CSSProperties): CustomRender => {
10
+ if (!logo) {
11
+ return null
12
+ }
13
+ if (typeof logo === 'string') {
14
+ return <img src={logo} alt="logo" style={logoStyle} />
15
+ }
16
+ if (typeof logo === 'function') {
17
+ return logo()
18
+ }
19
+ return logo
20
+ }
21
+
22
+ export const defaultRenderLogoAndTitle = (
23
+ props: LogoContentProps,
24
+ renderKey: string | undefined = 'menuHeaderRender'
25
+ ) => {
26
+ const { logo = Logo, logoStyle, title } = props
27
+ const renderFunction = (props as any)[renderKey || '']
28
+ if (renderFunction === false) {
29
+ return null
30
+ }
31
+
32
+ const logoDom = defaultRenderLogo(logo, logoStyle)
33
+ const titleDom = title && <h1>{title}</h1>
34
+
35
+ if (typeof renderFunction === 'function') {
36
+ return renderFunction(logoDom, props.collapsed ? null : titleDom, props)
37
+ }
38
+
39
+ return (
40
+ <>
41
+ {logoDom || null}
42
+ {props.collapsed ? null : titleDom}
43
+ </>
44
+ )
45
+ }
46
+
47
+ const LogoContent = defineComponent({
48
+ name: 'LogoContent',
49
+ props: logoContentProps,
50
+ setup(props) {
51
+ const context = useRouteContext()
52
+
53
+ const layoutSide = computed(() => props.layout === 'side' || props.layout === 'simple')
54
+
55
+ const baseClassName = computed(() =>
56
+ context.getPrefixCls({
57
+ suffixCls: layoutSide.value || props.drawer ? 'sider' : 'global-header',
58
+ isPor: true
59
+ })
60
+ )
61
+
62
+ const headerDom = computed(() => defaultRenderLogoAndTitle(props, props.renderKey))
63
+
64
+ return () => (
65
+ <div
66
+ id="logo"
67
+ class={{
68
+ [`${baseClassName.value}-logo`]: true,
69
+ [`${baseClassName.value}-logo-${props.logoDirection}`]: layoutSide.value
70
+ }}
71
+ onClick={props.onMenuHeaderClick}
72
+ >
73
+ <a>{headerDom.value || null}</a>
74
+ </div>
75
+ )
76
+ }
77
+ })
78
+
79
+ LogoContent.inheritAttrs = false
80
+
81
+ export default LogoContent
@@ -0,0 +1,29 @@
1
+ import type { CSSProperties } from 'vue'
2
+ import { PropTypes } from '@/utils'
3
+ import { defaultSettingProps } from '../../defaultSettings'
4
+ import type { HeaderLogoRender } from '../../RenderTypings'
5
+
6
+ export default {
7
+ renderKey: PropTypes.string.def('menuHeaderRender'),
8
+ title: defaultSettingProps.title,
9
+ layout: defaultSettingProps.layout,
10
+ logo: {
11
+ type: [ Object, String, Function ] as PropType<CustomRender>,
12
+ default: () => undefined
13
+ },
14
+ logoStyle: {
15
+ type: Object as PropType<CSSProperties>,
16
+ default: () => undefined
17
+ },
18
+ logoDirection: {
19
+ type: String as PropType<'horizontal' | 'vertical'>,
20
+ default: 'horizontal'
21
+ },
22
+ drawer: PropTypes.looseBool,
23
+ collapsed: PropTypes.looseBool,
24
+ menuHeaderRender: {
25
+ type: [ Object, Function ] as PropType<HeaderLogoRender>,
26
+ default: () => undefined
27
+ },
28
+ onMenuHeaderClick: PropTypes.func
29
+ }
@@ -0,0 +1,384 @@
1
+ import {
2
+ computed,
3
+ defineComponent,
4
+ reactive,
5
+ watch,
6
+ onMounted,
7
+ toRefs,
8
+ ExtractPropTypes
9
+ } from 'vue'
10
+ import { useStore } from '@gx-vuex'
11
+ import { useRoute, useRouter } from 'vue-router'
12
+ import { Tabs, Menu, Dropdown } from 'ant-design-vue'
13
+ import { EllipsisOutlined, ReloadOutlined, CloseOutlined } from '@ant-design/icons-vue'
14
+ import config from '/config/config'
15
+ import multiTabProps from './props'
16
+
17
+ const TabPane = Tabs.TabPane
18
+
19
+ export type MultiTabProps = Partial<ExtractPropTypes<typeof multiTabProps>>
20
+
21
+ export default defineComponent({
22
+ props: multiTabProps,
23
+ components: {
24
+ EllipsisOutlined,
25
+ ReloadOutlined,
26
+ CloseOutlined
27
+ },
28
+ setup(props) {
29
+ const { isMobile, loading, isFixedMultiTab, onReloadPage } = toRefs(props)
30
+ const $route = useRoute()
31
+ const router = useRouter()
32
+ const store = useStore()
33
+ const { routesWhiteList } = config.defaultSettings
34
+ const state = reactive({
35
+ affixTabs: [],
36
+ reloadSpin: false,
37
+ tabActive: '',
38
+ tabContextActive: ''
39
+ })
40
+ const routes = computed(() => store.routes.routes)
41
+ const visitedRoutes = computed(() => store.tabsRouter.visitedRoutes)
42
+ const needFixedMultiTab = computed(() => isFixedMultiTab.value)
43
+ const needSettingWidth = computed(() => needFixedMultiTab.value && !isMobile.value)
44
+ const width = computed(() => {
45
+ return needSettingWidth.value
46
+ ? `calc(100% - ${props.collapsed ? props.collapsedWidth : props.siderWidth}px)`
47
+ : '100%'
48
+ })
49
+ const right = computed(() => (needFixedMultiTab.value ? 0 : undefined))
50
+ /**
51
+ * @Author gx12358
52
+ * @DateTime 2021/8/6
53
+ * @lastTime 2021/8/6
54
+ * @description 初始化添加固定标签
55
+ */
56
+ const initAffixTabs = (routes) => {
57
+ routes.forEach((route) => {
58
+ if (route.meta && route.meta.tagFixed) addTabs(route)
59
+ if (route.children) initAffixTabs(route.children)
60
+ })
61
+ }
62
+ /**
63
+ * @Author gx12358
64
+ * @DateTime 2021/8/6
65
+ * @lastTime 2021/8/6
66
+ * @description 添加标签路由
67
+ */
68
+ const addTabs = async (tag) => {
69
+ if (
70
+ tag.name &&
71
+ tag.meta &&
72
+ tag.meta.tagHidden !== true &&
73
+ !routesWhiteList.includes(tag.path)
74
+ ) {
75
+ let matched = [tag.name]
76
+ if (tag.matched) matched = tag.matched.map((item) => item.name)
77
+ await store.tabsRouter.addVisitedRoute({
78
+ tagFixed: tag.meta && tag.meta.tagFixed,
79
+ path: tag.path,
80
+ fullPath: tag.fullPath || tag.path,
81
+ query: tag.query,
82
+ params: tag.params,
83
+ name: tag.name,
84
+ matched: matched,
85
+ meta: { ...tag.meta }
86
+ })
87
+ if (isActive(tag)) state.tabActive = tag.fullPath || tag.path
88
+ }
89
+ }
90
+ onMounted(() => {
91
+ initAffixTabs(routes.value)
92
+ })
93
+ watch(
94
+ () => $route,
95
+ (route) => {
96
+ addTabs(route)
97
+ },
98
+ {
99
+ deep: true,
100
+ immediate: true
101
+ }
102
+ )
103
+ /**
104
+ * @Author gx12358
105
+ * @DateTime 2021/8/6
106
+ * @lastTime 2021/8/6
107
+ * @description 是否是当前页
108
+ */
109
+ const isActive = (route) => {
110
+ return route.path === $route.path
111
+ }
112
+ /**
113
+ * @Author gx12358
114
+ * @DateTime 2021/8/6
115
+ * @lastTime 2021/8/6
116
+ * @description 当前页是否固定
117
+ */
118
+ const isFixed = (tag) => {
119
+ return tag.meta && tag.meta.tagFixed
120
+ }
121
+ /**
122
+ * @Author gx12358
123
+ * @DateTime 2021/8/6
124
+ * @lastTime 2021/8/6
125
+ * @description 标签点击
126
+ */
127
+ const handleTabClick = (tab) => {
128
+ const route = visitedRoutes.value.filter((item) => item.path === tab)[0]
129
+ if ($route.fullPath !== route.fullPath) router.push(route.fullPath)
130
+ }
131
+ /**
132
+ * @Author gx12358
133
+ * @DateTime 2021/8/6
134
+ * @lastTime 2021/8/6
135
+ * @description 标签删除
136
+ */
137
+ const handleTabRemove = async (e, fullPath) => {
138
+ e.stopPropagation()
139
+ const view = visitedRoutes.value.find((item) => {
140
+ return fullPath === item.fullPath
141
+ })
142
+ await store.tabsRouter.delVisitedRoute(view)
143
+ if (isActive(view)) toLastTag()
144
+ }
145
+ /**
146
+ * @Author gx12358
147
+ * @DateTime 2021/8/6
148
+ * @lastTime 2021/8/6
149
+ * @description 标签副操作点击
150
+ */
151
+ const handleClick = ({ key }, stateType) => {
152
+ switch (key) {
153
+ case 'closeOthersTabs':
154
+ closeOthersTabs(stateType)
155
+ break
156
+ case 'closeLeftTabs':
157
+ closeLeftTabs(stateType)
158
+ break
159
+ case 'closeRightTabs':
160
+ closeRightTabs(stateType)
161
+ break
162
+ default:
163
+ break
164
+ }
165
+ }
166
+ const dropdownVisible = (path) => {
167
+ state.tabContextActive = path
168
+ }
169
+ const tabBarExtraState = (type, path: any) => {
170
+ const currentIndex = visitedRoutes.value.findIndex((item) => item.fullPath === path)
171
+ let status = false
172
+ switch (type) {
173
+ case 1:
174
+ status =
175
+ visitedRoutes.value.length === 1 ||
176
+ (visitedRoutes.value.findIndex((item) => item.meta.tagFixed) === 0 &&
177
+ visitedRoutes.value.length === 2)
178
+ break
179
+ case 2:
180
+ status =
181
+ currentIndex === 0 ||
182
+ (currentIndex === 1 &&
183
+ visitedRoutes.value.findIndex((item) => item.meta.tagFixed) === 0)
184
+ break
185
+ case 3:
186
+ status =
187
+ currentIndex === visitedRoutes.value.length - 1 || visitedRoutes.value.length === 1
188
+ break
189
+ }
190
+ return status
191
+ }
192
+ /**
193
+ * @Author gx12358
194
+ * @DateTime 2021/8/6
195
+ * @lastTime 2021/8/6
196
+ * @description 刷新当前路由
197
+ */
198
+ const reloadPage = () => {
199
+ state.reloadSpin = true
200
+ onReloadPage.value && onReloadPage.value()
201
+ setTimeout(() => {
202
+ state.reloadSpin = false
203
+ }, 500)
204
+ }
205
+ /**
206
+ * @Author gx12358
207
+ * @DateTime 2021/8/6
208
+ * @lastTime 2021/8/6
209
+ * @description 关闭其他页
210
+ */
211
+ const closeOthersTabs = async (stateType) => {
212
+ await store.tabsRouter.delOthersVisitedRoutes(toThisTag(stateType))
213
+ toContextTag(stateType)
214
+ }
215
+ /**
216
+ * @Author gx12358
217
+ * @DateTime 2021/8/6
218
+ * @lastTime 2021/8/6
219
+ * @description 关闭左侧所有路由
220
+ */
221
+ const closeLeftTabs = async (stateType) => {
222
+ await store.tabsRouter.delLeftVisitedRoutes(toThisTag(stateType))
223
+ toContextTag(stateType)
224
+ }
225
+ /**
226
+ * @Author gx12358
227
+ * @DateTime 2021/8/6
228
+ * @lastTime 2021/8/6
229
+ * @description 关闭右侧所有路由
230
+ */
231
+ const closeRightTabs = async (stateType) => {
232
+ await store.tabsRouter.delRightVisitedRoutes(toThisTag(stateType))
233
+ toContextTag(stateType)
234
+ }
235
+ /**
236
+ * @Author gx12358
237
+ * @DateTime 2021/8/6
238
+ * @lastTime 2021/8/6
239
+ * @description 跳转上下路由
240
+ */
241
+ const toContextTag = (stateType) => {
242
+ const currentPath = stateType === 'tabActive' ? $route.fullPath : state[stateType]
243
+ if (stateType !== $route.fullPath) {
244
+ router.push(currentPath)
245
+ }
246
+ }
247
+ /**
248
+ * @Author gx12358
249
+ * @DateTime 2021/8/6
250
+ * @lastTime 2021/8/6
251
+ * @description 跳转路由:/
252
+ */
253
+ const toLastTag = () => {
254
+ const latestView = visitedRoutes.value.slice(-1)[0]
255
+ if (latestView) router.push(latestView)
256
+ else router.push('/')
257
+ }
258
+ /**
259
+ * @Author gx12358
260
+ * @DateTime 2021/8/6
261
+ * @lastTime 2021/8/6
262
+ * @description 跳转点击页
263
+ */
264
+ const toThisTag = (stateType) => {
265
+ const currentPath = stateType === 'tabActive' ? $route.fullPath : state[stateType]
266
+ const view = visitedRoutes.value.find((item) => item.fullPath === currentPath)
267
+ if (currentPath !== view?.path || '') router.push(view)
268
+ return view
269
+ }
270
+
271
+ const defaultRenderTabMenu = (record) => (
272
+ <Menu onClick={(e) => handleClick(e, 'tabContextActive')}>
273
+ <Menu.Item
274
+ disabled={tabBarExtraState(1, record.fullPath || record.path)}
275
+ key="closeOthersTabs"
276
+ >
277
+ 关闭其他
278
+ </Menu.Item>
279
+ <Menu.Item
280
+ disabled={tabBarExtraState(2, record.fullPath || record.path)}
281
+ key="closeLeftTabs"
282
+ >
283
+ 关闭左侧
284
+ </Menu.Item>
285
+ <Menu.Item
286
+ disabled={tabBarExtraState(3, record.fullPath || record.path)}
287
+ key="closeRightTabs"
288
+ >
289
+ 关闭右侧
290
+ </Menu.Item>
291
+ </Menu>
292
+ )
293
+
294
+ const defaultRenderTab = (record) => (
295
+ <Dropdown
296
+ trigger="contextmenu"
297
+ overlay={defaultRenderTabMenu(record)}
298
+ onVisibleChange={(_) => dropdownVisible(record.fullPath)}
299
+ >
300
+ <div class="gx-pro-multi-tab-content">
301
+ {record.meta.title}
302
+ {state.tabActive === (record.fullPath || record.path) && (
303
+ <ReloadOutlined
304
+ class="gx-pro-multi-tab-reload-btn"
305
+ style={{ marginRight: 0 }}
306
+ spin={state.reloadSpin}
307
+ onClick={() => {
308
+ state.reloadSpin ? null : reloadPage()
309
+ }}
310
+ />
311
+ )}
312
+ {visitedRoutes.value.length > 1 && !isFixed(record) && (
313
+ <CloseOutlined
314
+ class="gx-pro-multi-tab-close-btn"
315
+ style={{ marginRight: 0 }}
316
+ onClick={(e) => handleTabRemove(e, record.fullPath)}
317
+ />
318
+ )}
319
+ </div>
320
+ </Dropdown>
321
+ )
322
+
323
+ const defaultExtraMenu = () => (
324
+ <Menu onClick={(e) => handleClick(e, 'tabActive')}>
325
+ <Menu.Item disabled={tabBarExtraState(1, state.tabActive)} key="closeOthersTabs">
326
+ 关闭其他
327
+ </Menu.Item>
328
+ <Menu.Item disabled={tabBarExtraState(2, state.tabActive)} key="closeLeftTabs">
329
+ 关闭左侧
330
+ </Menu.Item>
331
+ <Menu.Item disabled={tabBarExtraState(3, state.tabActive)} key="closeRightTabs">
332
+ 关闭右侧
333
+ </Menu.Item>
334
+ </Menu>
335
+ )
336
+
337
+ const tabBarExtraContent = () => (
338
+ <Dropdown overlay={defaultExtraMenu()}>
339
+ <EllipsisOutlined class="gx-pro-multi-tab-dropdown-menu-btn" rotate={90} />
340
+ </Dropdown>
341
+ )
342
+
343
+ return () => (
344
+ <>
345
+ {props.isFixedMultiTab && (
346
+ <div
347
+ class={{
348
+ ['gx-pro-multi-tab-fixed']: true,
349
+ ['gx-pro-multi-tab-fixed-loading']: loading.value
350
+ }}
351
+ />
352
+ )}
353
+ <div
354
+ style={{
355
+ margin: 0,
356
+ width: width.value,
357
+ right: right.value,
358
+ zIndex: 99
359
+ }}
360
+ class={{
361
+ ['gx-pro-multi-tab']: true,
362
+ ['gx-pro-multi-tab-wrap']: props.isFixedMultiTab,
363
+ ['gx-pro-multi-tab-wrap-fixed']: props.isFixedMultiTab,
364
+ ['gx-pro-multi-tab-wrap-loading']: loading.value
365
+ }}
366
+ >
367
+ <Tabs
368
+ onTabClick={handleTabClick}
369
+ activeKey={state.tabActive}
370
+ hideAdd
371
+ type="editable-card"
372
+ v-slots={{
373
+ rightExtra: (_) => tabBarExtraContent()
374
+ }}
375
+ >
376
+ {visitedRoutes.value.map((item) => (
377
+ <TabPane key={item.fullPath} closable={false} tab={defaultRenderTab(item)} />
378
+ ))}
379
+ </Tabs>
380
+ </div>
381
+ </>
382
+ )
383
+ }
384
+ })
@@ -0,0 +1,15 @@
1
+ import { PropTypes } from '@/utils'
2
+ import { defaultSettingProps } from '../../defaultSettings'
3
+ import { baseMenuProps, siderMenuProps } from '../SiderMenu/props'
4
+
5
+ export default {
6
+ loading: PropTypes.looseBool,
7
+ isMobile: siderMenuProps.isMobile,
8
+ collapsed: baseMenuProps.collapsed,
9
+ siderWidth: siderMenuProps.siderWidth,
10
+ collapsedWidth: siderMenuProps.collapsedWidth,
11
+ isFixedMultiTab: defaultSettingProps.fixedMultiTab,
12
+ onReloadPage: {
13
+ type: Function as PropType<() => void>
14
+ }
15
+ }