kn-cli 1.0.131 → 1.0.134

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 (211) hide show
  1. package/build/shellUtil.sh +2 -2
  2. package/build/start.sh +3 -2
  3. package/build/vite.config.js +1 -1
  4. package/package.json +2 -1
  5. package/src/create.js +2 -0
  6. package/templates/template_admin_antd5/.vscode/settings.json +28 -0
  7. package/templates/template_admin_antd5/build.sh +8 -0
  8. package/templates/template_admin_antd5/cli.config.js +35 -0
  9. package/templates/template_admin_antd5/dev.sh +33 -0
  10. package/templates/template_admin_antd5/frontend_build.sh +48 -0
  11. package/templates/template_admin_antd5/init/prepare-commit-msg +5 -0
  12. package/templates/template_admin_antd5/init.sh +24 -0
  13. package/templates/template_admin_antd5/jsconfig.json +17 -0
  14. package/templates/template_admin_antd5/package.json +27 -0
  15. package/templates/template_admin_antd5/public/404.html +26 -0
  16. package/templates/template_admin_antd5/public/favicon.png +0 -0
  17. package/templates/template_admin_antd5/public/index.html +48 -0
  18. package/templates/template_admin_antd5/public/src/_antd.less +37 -0
  19. package/templates/template_admin_antd5/public/src/_mixin.module.less +79 -0
  20. package/templates/template_admin_antd5/public/src/_reset.module.less +134 -0
  21. package/templates/template_admin_antd5/public/src/_variable.module.less +85 -0
  22. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.eot +0 -0
  23. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.module.less +109 -0
  24. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.svg +75 -0
  25. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.ttf +0 -0
  26. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.woff +0 -0
  27. package/templates/template_admin_antd5/public/src/assets/iconfont/iconfont.woff2 +0 -0
  28. package/templates/template_admin_antd5/public/src/assets/images/arrow.png +0 -0
  29. package/templates/template_admin_antd5/public/src/assets/images/avatar.png +0 -0
  30. package/templates/template_admin_antd5/public/src/assets/images/icon-notice.png +0 -0
  31. package/templates/template_admin_antd5/public/src/assets/images/icon-user.png +0 -0
  32. package/templates/template_admin_antd5/public/src/assets/images/loadFail.png +0 -0
  33. package/templates/template_admin_antd5/public/src/assets/images/loading.svg +40 -0
  34. package/templates/template_admin_antd5/public/src/assets/images/login/bg.png +0 -0
  35. package/templates/template_admin_antd5/public/src/assets/images/login/logo.png +0 -0
  36. package/templates/template_admin_antd5/public/src/assets/images/login/slogan.png +0 -0
  37. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-dep-active.png +0 -0
  38. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-dep.png +0 -0
  39. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-log-active.png +0 -0
  40. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-log.png +0 -0
  41. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-loginlog-active.png +0 -0
  42. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-loginlog.png +0 -0
  43. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-role-active.png +0 -0
  44. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-role.png +0 -0
  45. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-user-active.png +0 -0
  46. package/templates/template_admin_antd5/public/src/assets/images/nav/icon-user.png +0 -0
  47. package/templates/template_admin_antd5/public/src/assets/images/nav/nav-toggle.png +0 -0
  48. package/templates/template_admin_antd5/public/src/assets/images/nav/slogan.png +0 -0
  49. package/templates/template_admin_antd5/public/src/assets/images/noData.png +0 -0
  50. package/templates/template_admin_antd5/public/src/assets/images/noSelect.png +0 -0
  51. package/templates/template_admin_antd5/public/src/assets/images/permission/403.png +0 -0
  52. package/templates/template_admin_antd5/public/src/assets/images/permission/404.png +0 -0
  53. package/templates/template_admin_antd5/public/src/assets/images/permission/503.png +0 -0
  54. package/templates/template_admin_antd5/public/src/assets/images/play.png +0 -0
  55. package/templates/template_admin_antd5/public/src/components/_table/column.jsx +47 -0
  56. package/templates/template_admin_antd5/public/src/components/_table/column.module.less +12 -0
  57. package/templates/template_admin_antd5/public/src/components/_table/index.jsx +71 -0
  58. package/templates/template_admin_antd5/public/src/components/_table/index.module.less +15 -0
  59. package/templates/template_admin_antd5/public/src/components/antd/antProvider.jsx +21 -0
  60. package/templates/template_admin_antd5/public/src/components/antd/index.jsx +146 -0
  61. package/templates/template_admin_antd5/public/src/components/antd/select/index.jsx +296 -0
  62. package/templates/template_admin_antd5/public/src/components/antd/select/index.module.less +21 -0
  63. package/templates/template_admin_antd5/public/src/components/antd/theme.js +173 -0
  64. package/templates/template_admin_antd5/public/src/components/antd/tooltip/detail/index.jsx +70 -0
  65. package/templates/template_admin_antd5/public/src/components/antd/tooltip/detail/index.module.less +12 -0
  66. package/templates/template_admin_antd5/public/src/components/antd/tooltip/index.jsx +69 -0
  67. package/templates/template_admin_antd5/public/src/components/antd/tooltip/index.module.less +28 -0
  68. package/templates/template_admin_antd5/public/src/components/auth/index.jsx +123 -0
  69. package/templates/template_admin_antd5/public/src/components/auth/index.module.less +7 -0
  70. package/templates/template_admin_antd5/public/src/components/auth/navCheck.jsx +27 -0
  71. package/templates/template_admin_antd5/public/src/components/badge/index.jsx +47 -0
  72. package/templates/template_admin_antd5/public/src/components/badge/index.module.less +44 -0
  73. package/templates/template_admin_antd5/public/src/components/button/index.jsx +17 -0
  74. package/templates/template_admin_antd5/public/src/components/debug/index.jsx +28 -0
  75. package/templates/template_admin_antd5/public/src/components/debug/index.module.less +10 -0
  76. package/templates/template_admin_antd5/public/src/components/empty/index.jsx +28 -0
  77. package/templates/template_admin_antd5/public/src/components/empty/index.module.less +20 -0
  78. package/templates/template_admin_antd5/public/src/components/error/index.jsx +39 -0
  79. package/templates/template_admin_antd5/public/src/components/icon/index.jsx +128 -0
  80. package/templates/template_admin_antd5/public/src/components/icon/playVideo/index.jsx +21 -0
  81. package/templates/template_admin_antd5/public/src/components/icon/playVideo/index.module.less +16 -0
  82. package/templates/template_admin_antd5/public/src/components/iconFont/index.jsx +20 -0
  83. package/templates/template_admin_antd5/public/src/components/iconFont/index.module.less +5 -0
  84. package/templates/template_admin_antd5/public/src/components/image/index.jsx +73 -0
  85. package/templates/template_admin_antd5/public/src/components/image/index.module.less +117 -0
  86. package/templates/template_admin_antd5/public/src/components/image/preview.jsx +85 -0
  87. package/templates/template_admin_antd5/public/src/components/layout/basic/index.jsx +49 -0
  88. package/templates/template_admin_antd5/public/src/components/layout/basic/index.module.less +76 -0
  89. package/templates/template_admin_antd5/public/src/components/layout/index.jsx +39 -0
  90. package/templates/template_admin_antd5/public/src/components/layout/index.module.less +63 -0
  91. package/templates/template_admin_antd5/public/src/components/layout/provider/index.jsx +32 -0
  92. package/templates/template_admin_antd5/public/src/components/leftMenu/index.jsx +106 -0
  93. package/templates/template_admin_antd5/public/src/components/leftMenu/index.module.less +42 -0
  94. package/templates/template_admin_antd5/public/src/components/link/index.jsx +39 -0
  95. package/templates/template_admin_antd5/public/src/components/link/index.module.less +11 -0
  96. package/templates/template_admin_antd5/public/src/components/menuIcon/index.jsx +33 -0
  97. package/templates/template_admin_antd5/public/src/components/menuIcon/index.module.less +49 -0
  98. package/templates/template_admin_antd5/public/src/components/page/pageLoading/index.jsx +51 -0
  99. package/templates/template_admin_antd5/public/src/components/page/pageLoading/index.module.less +29 -0
  100. package/templates/template_admin_antd5/public/src/components/popup/index.jsx +60 -0
  101. package/templates/template_admin_antd5/public/src/components/popup/index.module.less +18 -0
  102. package/templates/template_admin_antd5/public/src/components/react/index.jsx +13 -0
  103. package/templates/template_admin_antd5/public/src/components/resizeBox/index.jsx +144 -0
  104. package/templates/template_admin_antd5/public/src/components/resizeBox/index.module.css +90 -0
  105. package/templates/template_admin_antd5/public/src/components/select/defaultServicesSelect/index.jsx +182 -0
  106. package/templates/template_admin_antd5/public/src/components/select/dictSelect/index.jsx +84 -0
  107. package/templates/template_admin_antd5/public/src/components/select/index.jsx +7 -0
  108. package/templates/template_admin_antd5/public/src/components/select/useSelectList.jsx +217 -0
  109. package/templates/template_admin_antd5/public/src/components/table/aliTable/index.jsx +250 -0
  110. package/templates/template_admin_antd5/public/src/components/table/aliTable/index.module.less +105 -0
  111. package/templates/template_admin_antd5/public/src/components/table/column.jsx +128 -0
  112. package/templates/template_admin_antd5/public/src/components/table/column.module.less +50 -0
  113. package/templates/template_admin_antd5/public/src/components/table/imageTable/index.jsx +302 -0
  114. package/templates/template_admin_antd5/public/src/components/table/imageTable/index.module.less +196 -0
  115. package/templates/template_admin_antd5/public/src/components/table/imageTable/radio.jsx +15 -0
  116. package/templates/template_admin_antd5/public/src/components/table/imageTable/radio.module.less +18 -0
  117. package/templates/template_admin_antd5/public/src/components/table/index.jsx +475 -0
  118. package/templates/template_admin_antd5/public/src/components/table/index.module.less +133 -0
  119. package/templates/template_admin_antd5/public/src/components/text/index.jsx +98 -0
  120. package/templates/template_admin_antd5/public/src/components/text/index.module.less +13 -0
  121. package/templates/template_admin_antd5/public/src/components/toast/index.jsx +79 -0
  122. package/templates/template_admin_antd5/public/src/components/toast/index.module.less +43 -0
  123. package/templates/template_admin_antd5/public/src/components/topMenu/index.jsx +102 -0
  124. package/templates/template_admin_antd5/public/src/components/topMenu/index.module.less +89 -0
  125. package/templates/template_admin_antd5/public/src/components/topMenu/topBar/index.jsx +81 -0
  126. package/templates/template_admin_antd5/public/src/components/topMenu/topBar/index.module.less +97 -0
  127. package/templates/template_admin_antd5/public/src/components/video/index.jsx +96 -0
  128. package/templates/template_admin_antd5/public/src/components/video/index.module.less +132 -0
  129. package/templates/template_admin_antd5/public/src/components/video/preview.jsx +38 -0
  130. package/templates/template_admin_antd5/public/src/config.js +31 -0
  131. package/templates/template_admin_antd5/public/src/declarations.d.ts +1 -0
  132. package/templates/template_admin_antd5/public/src/dictionary/dictionary.js +289 -0
  133. package/templates/template_admin_antd5/public/src/dictionary/index.jsx +64 -0
  134. package/templates/template_admin_antd5/public/src/enum.js +41 -0
  135. package/templates/template_admin_antd5/public/src/hooks/index.jsx +29 -0
  136. package/templates/template_admin_antd5/public/src/hooks/useDebounceFn.jsx +33 -0
  137. package/templates/template_admin_antd5/public/src/hooks/useDelay.jsx +34 -0
  138. package/templates/template_admin_antd5/public/src/hooks/useEsc.jsx +98 -0
  139. package/templates/template_admin_antd5/public/src/hooks/useImageLoader.jsx +26 -0
  140. package/templates/template_admin_antd5/public/src/hooks/useInToView.jsx +58 -0
  141. package/templates/template_admin_antd5/public/src/hooks/useLoading.jsx +46 -0
  142. package/templates/template_admin_antd5/public/src/hooks/usePreload.jsx +67 -0
  143. package/templates/template_admin_antd5/public/src/hooks/useRouteMenu.jsx +263 -0
  144. package/templates/template_admin_antd5/public/src/hooks/useScrollTop.jsx +44 -0
  145. package/templates/template_admin_antd5/public/src/hooks/useSearch.jsx +163 -0
  146. package/templates/template_admin_antd5/public/src/hooks/useTableRowSelect.jsx +310 -0
  147. package/templates/template_admin_antd5/public/src/hooks/useThrottole.jsx +68 -0
  148. package/templates/template_admin_antd5/public/src/hooks/useTimer.jsx +42 -0
  149. package/templates/template_admin_antd5/public/src/hooks/useUpdate.jsx +16 -0
  150. package/templates/template_admin_antd5/public/src/hooks/useWatchServices.jsx +124 -0
  151. package/templates/template_admin_antd5/public/src/index.jsx +89 -0
  152. package/templates/template_admin_antd5/public/src/menuConfig/auth.jsx +92 -0
  153. package/templates/template_admin_antd5/public/src/menuConfig/dashboard.jsx +25 -0
  154. package/templates/template_admin_antd5/public/src/menuConfig/dna.jsx +76 -0
  155. package/templates/template_admin_antd5/public/src/menuConfig/index.jsx +17 -0
  156. package/templates/template_admin_antd5/public/src/mock/auth.js +33 -0
  157. package/templates/template_admin_antd5/public/src/mock/demo.js +122 -0
  158. package/templates/template_admin_antd5/public/src/mock/index.js +65 -0
  159. package/templates/template_admin_antd5/public/src/mock/utils.js +33 -0
  160. package/templates/template_admin_antd5/public/src/pages/antdComponents/index.jsx +142 -0
  161. package/templates/template_admin_antd5/public/src/pages/auth/user/create/index.jsx +47 -0
  162. package/templates/template_admin_antd5/public/src/pages/auth/user/create/index.module.less +6 -0
  163. package/templates/template_admin_antd5/public/src/pages/auth/user/dialog/index.jsx +96 -0
  164. package/templates/template_admin_antd5/public/src/pages/auth/user/index.jsx +214 -0
  165. package/templates/template_admin_antd5/public/src/pages/components/layout/index.jsx +75 -0
  166. package/templates/template_admin_antd5/public/src/pages/components/layout/index.module.less +78 -0
  167. package/templates/template_admin_antd5/public/src/pages/components/layout/titleBar/index.jsx +28 -0
  168. package/templates/template_admin_antd5/public/src/pages/components/layout/titleBar/index.module.less +44 -0
  169. package/templates/template_admin_antd5/public/src/pages/components/select/user.jsx +18 -0
  170. package/templates/template_admin_antd5/public/src/pages/demo/page1.jsx +21 -0
  171. package/templates/template_admin_antd5/public/src/pages/demo/page2.jsx +21 -0
  172. package/templates/template_admin_antd5/public/src/pages/demo/page3.jsx +21 -0
  173. package/templates/template_admin_antd5/public/src/pages/error/403.jsx +15 -0
  174. package/templates/template_admin_antd5/public/src/pages/error/404.jsx +15 -0
  175. package/templates/template_admin_antd5/public/src/pages/error/503.jsx +15 -0
  176. package/templates/template_admin_antd5/public/src/pages/error/permission.jsx +40 -0
  177. package/templates/template_admin_antd5/public/src/pages/error/permission.module.less +16 -0
  178. package/templates/template_admin_antd5/public/src/pages/home.jsx +90 -0
  179. package/templates/template_admin_antd5/public/src/pages/home.module.less +6 -0
  180. package/templates/template_admin_antd5/public/src/pages/login/index.jsx +113 -0
  181. package/templates/template_admin_antd5/public/src/pages/login/index.module.less +153 -0
  182. package/templates/template_admin_antd5/public/src/pages/pageTemplate.jsx +28 -0
  183. package/templates/template_admin_antd5/public/src/provider/app.jsx +201 -0
  184. package/templates/template_admin_antd5/public/src/provider/loading.jsx +47 -0
  185. package/templates/template_admin_antd5/public/src/provider/menu.jsx +161 -0
  186. package/templates/template_admin_antd5/public/src/provider/menu.module.less +35 -0
  187. package/templates/template_admin_antd5/public/src/route.jsx +127 -0
  188. package/templates/template_admin_antd5/public/src/services/demo.js +85 -0
  189. package/templates/template_admin_antd5/public/src/services/excel.js +43 -0
  190. package/templates/template_admin_antd5/public/src/services/http/index.js +155 -0
  191. package/templates/template_admin_antd5/public/src/services/index.js +126 -0
  192. package/templates/template_admin_antd5/public/src/services/interceptor/index.js +67 -0
  193. package/templates/template_admin_antd5/public/src/services/login.js +37 -0
  194. package/templates/template_admin_antd5/public/src/services/socket/index.jsx +99 -0
  195. package/templates/template_admin_antd5/public/src/services/token/index.js +41 -0
  196. package/templates/template_admin_antd5/public/src/type.js +67 -0
  197. package/templates/template_admin_antd5/public/src/utils/event.js +58 -0
  198. package/templates/template_admin_antd5/public/src/utils/format.js +135 -0
  199. package/templates/template_admin_antd5/public/src/utils/index.js +727 -0
  200. package/templates/template_admin_antd5/public/src/utils/menu.js +33 -0
  201. package/templates/template_admin_antd5/public/src/utils/rule.js +277 -0
  202. package/templates/template_admin_antd5/public/src/utils/storage.js +30 -0
  203. package/templates/template_admin_antd5/public/static/about.html +1 -0
  204. package/templates/template_admin_antd5/public/static/kssoLogin.html +22 -0
  205. package/templates/template_admin_antd5/readme.md +84 -0
  206. package/templates/template_admin_antd5/renamejstojsx.js +45 -0
  207. package/templates/template_admin_antd5/renameless.js +53 -0
  208. package/templates/template_admin_antd5/report.sh +25 -0
  209. package/templates/template_admin_antd5/shellUtil.sh +110 -0
  210. package/templates/template_admin_antd5/versionPublish.sh +16 -0
  211. package/templates/template_admin_antd5/webpack.api.js +105 -0
@@ -0,0 +1,161 @@
1
+ // @ts-ignore
2
+ import React,{ useState,useMemo, useEffect } from 'react';
3
+ // @ts-ignore
4
+ import { useLocation } from 'react-router-dom';
5
+ // @ts-ignore
6
+ import { createContainer } from "unstated-next"
7
+
8
+ import useRouteMenu from '@/hooks/useRouteMenu';
9
+ import ProviderApp from '@/provider/app';
10
+
11
+ import MenuConfig from '@/menuConfig';
12
+ import { AUTH_ROUTE_DEBUG_OPEN } from '@/config';
13
+
14
+
15
+ /**
16
+ * @typedef MenuContaniner
17
+ * @property {RouteMenuItem[]} topMenu - 顶部导航栏的菜单列表
18
+ * @property {RouteMenuItem[]} leftMenu - 侧边导航栏的菜单列表
19
+ * @property {{menu:RouteMenuItem[],keys:string[]}} selectMenus - 当前被选中的菜单路径
20
+ * @property {(key:string)=>RouteMenuItem} findMenuData - 通过key查找菜单数据
21
+ * @property {(params:MenuConfig[])=>void} setMenuConfig - 设置菜单属性
22
+ * @property {()=>Promise<void>} reload - 重新加载渲染菜单
23
+ * @property {(pathname:string,auths:string[])=>any} getMenuNavigateTo - 获取菜单跳转匹配结果
24
+ * @property {(menu:RouteMenuItem,userAuth:string[])=>RouteMenuItem} findHasAuthMenu - 寻找有权限的菜单
25
+ *
26
+ */
27
+
28
+ const useProvider=() =>{
29
+ const MenuRoute=MenuConfig;
30
+ const app = ProviderApp.useContainer();
31
+ const routeMenu = useRouteMenu({source:[...MenuRoute.map(menu=>{menu.key=menu.name;return menu})]});
32
+ const curLocation =useLocation();
33
+ const [topMenu,setTopMenu]=useState([]);
34
+ const [leftMenu,setLeftMenu]=useState([]);
35
+ const [selectMenus,setSelectMenus] = useState({menus:[],keys:[]});
36
+
37
+ const reload = async ()=>{
38
+ routeMenu.setSourceMap([...MenuRoute]);
39
+ }
40
+ const getTopMenu=(userAuth=[])=>{
41
+ const list = routeMenu.getMenu(routeMenu.source,userAuth);
42
+ setTopMenu(list||[]);
43
+ }
44
+ const getLeftMenu=(userAuth=[])=>{
45
+ const list = routeMenu.getMenu(routeMenu.source,userAuth);
46
+ let menus= routeMenu.getOpenMenus(curLocation.pathname);
47
+
48
+ const req= list.filter(menu=>{
49
+ return menus.some(openMenu=>openMenu.key==menu.key)
50
+ })
51
+
52
+ let subs=[];
53
+ if(req && req[0]){
54
+ subs=req[0].children||[];
55
+ }
56
+ setLeftMenu(subs);
57
+ }
58
+ const findMenuData=(menuKey)=>{
59
+ return routeMenu.findMenuData(menuKey);
60
+
61
+ }
62
+ const setMenuConfig=(params)=>{
63
+ routeMenu.setMenuConfig(params);
64
+ }
65
+
66
+ const checkAuthMenu=(menu,userAuth=[])=>{
67
+ if(AUTH_ROUTE_DEBUG_OPEN)return true;
68
+ let auth=true;
69
+ if(menu.auth && Array.isArray(menu.auth)){
70
+ if(menu.auth.some(menuAuthName=>userAuth?.includes(menuAuthName)) == false){
71
+ auth=false;
72
+ }
73
+ }else{
74
+ return menu.auth;
75
+ }
76
+ return auth;
77
+ }
78
+ const findHasAuthMenu=(menu,userAuth=[])=>{
79
+ let req;
80
+ req = checkAuthMenu(menu,userAuth);
81
+ if(req){return menu;}
82
+ if(!menu.parent)return null;
83
+ let {children} = menu.parent;
84
+ for(let i=0;i<children.length;i++){
85
+ let _menu = children[i];
86
+ req = checkAuthMenu(_menu,userAuth);
87
+ if(req)return _menu;
88
+ }
89
+ if(menu.parent.noPage)return null;
90
+ req = findHasAuthMenu(menu.parent,userAuth);
91
+ return req;
92
+ }
93
+ const getHasAuthMenu=(menus,userAuth=[])=>{
94
+ for(let i=0;i<menus.length;i++){
95
+ const menu = menus[i];
96
+
97
+ if(!menu.noPage){
98
+ let req = checkAuthMenu(menu,userAuth);
99
+ if(req)return menu;
100
+ }else{
101
+ if(checkAuthMenu(menu,userAuth)){
102
+ if(menu.children){
103
+ let req = getHasAuthMenu(menu.children,userAuth);
104
+ if(req)return req;
105
+ }
106
+ }
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+
112
+ /**
113
+ * 检查当前路由是否有权限访问,没有权限则匹配有权限访问的页面进行跳转
114
+ */
115
+ const getMenuNavigateTo= (pathname,userAuths=[])=>{
116
+ // if(pathname=='/401'||pathname=='/404'||pathname=='/')return;
117
+ let curMenu = routeMenu.getMatchMenu(pathname)
118
+ // 找不到页面
119
+ if(!curMenu){
120
+ console.error('匹配不到路由,跳转404:',pathname)
121
+ return 404;
122
+ }
123
+ let req = checkAuthMenu(curMenu,userAuths);
124
+ // 有权限,不做任何处理
125
+ if(req)return curMenu;
126
+ let findMenu = findHasAuthMenu(curMenu,userAuths)
127
+ if(!findMenu){
128
+ return 403;
129
+ }else{
130
+ return findMenu;
131
+ }
132
+ }
133
+
134
+ useEffect(()=>{
135
+ let menus= routeMenu.getOpenMenus(curLocation.pathname);
136
+ let keys=menus.map(item=>item.key);
137
+ setSelectMenus({menus,keys});
138
+ },[curLocation,routeMenu.source]);
139
+
140
+ useEffect(()=>{
141
+ getTopMenu(app.auths);
142
+ getLeftMenu(app.auths);
143
+ },[routeMenu.source,curLocation,app.auths])
144
+
145
+ return {leftMenu,topMenu,reload,selectMenus,findMenuData,setMenuConfig,getMenuNavigateTo,findHasAuthMenu}
146
+ }
147
+
148
+ /**
149
+ * @typedef {object} MenuProvider
150
+ * @property {function():MenuContaniner} useContainer
151
+ * @property {React.ComponentType<any>} Provider
152
+ */
153
+
154
+
155
+ /**
156
+ * @type {MenuProvider}
157
+ */
158
+ // @ts-ignore
159
+ const App = createContainer(useProvider);
160
+
161
+ export default App;
@@ -0,0 +1,35 @@
1
+
2
+
3
+
4
+ .iconGroup{
5
+ width: 17px;
6
+ height: 100%;
7
+ margin-right: 12px;
8
+ display: inline-flex;
9
+ align-items: center;
10
+
11
+ img{width: 100%;}
12
+ .icon{
13
+ display: inline-block;
14
+ }
15
+ .iconActive{
16
+ display: none;
17
+ }
18
+ }
19
+
20
+ :global(.ant-menu-title-content){
21
+ font-size: 14px;
22
+ }
23
+ :global(.ant-menu-item-selected),
24
+ :global(.ant-menu-item-active){
25
+ .iconGroup .iconActive{
26
+ display: inline-block;
27
+ }
28
+ .iconGroup .icon{
29
+ display: none;
30
+ }
31
+ :global(.ant-menu-title-content){
32
+ font-weight: bold;
33
+ }
34
+
35
+ }
@@ -0,0 +1,127 @@
1
+ import React,{Suspense, useEffect} from 'react';
2
+ // @ts-ignore
3
+ import { HashRouter, Routes, Route, Navigate, useNavigate } from 'react-router-dom';
4
+ // @ts-ignore
5
+ import { LayoutBasic, AbsoluteLayout } from '@/components/layout';
6
+ import ErrorBoundary from '@/components/error';
7
+
8
+
9
+ import PageLoading from '@/components/page/pageLoading';
10
+ import { AuthLogin } from '@/components/auth';
11
+ import NavCheck from '@/components/auth/navCheck';
12
+
13
+
14
+ import LeftMenu from '@/components/leftMenu';
15
+ import TopMenu from '@/components/topMenu';
16
+ import ProviderMenu from '@/provider/menu';
17
+ import Login from '@/pages/login';
18
+ import menuConfig from './menuConfig';
19
+ import ProviderApp from '@/provider/app';
20
+
21
+
22
+
23
+ const Page403 = React.lazy(() => import('@/pages/error/403'));
24
+ const Page404 = React.lazy(() => import('@/pages/error/404'));
25
+ const Page503 = React.lazy(() => import('@/pages/error/503'));
26
+
27
+ const AntdComponents = React.lazy(() => import('@/pages/antdComponents'));
28
+
29
+
30
+
31
+ const GetIndexRoute=()=>{
32
+ const app = ProviderApp.useContainer();
33
+ const menu = ProviderMenu.useContainer();
34
+ const nav = useNavigate();
35
+
36
+
37
+ const findRoute=()=>{
38
+ for(let _menu of menu.topMenu){
39
+ let req = menu.findHasAuthMenu(_menu,app.auths);
40
+ if(req){
41
+ debugger;
42
+ nav(req.url);
43
+ return;
44
+ }
45
+ }
46
+ }
47
+ useEffect(()=>{
48
+ findRoute();
49
+ },[])
50
+ return <></>
51
+ }
52
+
53
+
54
+ const renderMenuConfig=(menu)=>{
55
+ let req=[];
56
+ if(!menu.noAutoMatch){
57
+ if(menu.component){
58
+ console.log(`${menu.routeTemplate||menu.url}->component`)
59
+ req.push(
60
+ <Route path={menu.routeTemplate||menu.url} element={menu.component} />
61
+ )
62
+ }else{
63
+ if(menu.children && menu.children[0]){
64
+ const childMenu = menu.children[0];
65
+ console.log(`${menu.routeTemplate||menu.url}->${childMenu.url}`)
66
+ if(!childMenu.url){
67
+ console.error('无法自动匹配下一个可跳转路由菜单:',menu)
68
+ }
69
+ req.push(
70
+ <Route path={menu.routeTemplate||menu.url} element={<NavCheck to={childMenu.url} />} />
71
+ )
72
+ }
73
+ }
74
+ }
75
+ if(menu.children){
76
+ menu.children.forEach(child=>{
77
+ let menus = renderMenuConfig(child);
78
+ req = [...req,...menus];
79
+ })
80
+ }
81
+ return req;
82
+ }
83
+ export const RouteList = (
84
+ <Routes>
85
+ <Route path='/' element={
86
+ <Suspense fallback={<PageLoading />}>
87
+ <AbsoluteLayout />
88
+ </Suspense>}
89
+ >
90
+ <Route path='login' element={<Login />} />
91
+
92
+ <Route
93
+ path='/'
94
+ element={
95
+ <ProviderMenu.Provider>
96
+ <AuthLogin><LayoutBasic nav={<LeftMenu />} topMenu={<TopMenu />} /></AuthLogin>
97
+ </ProviderMenu.Provider>
98
+ }
99
+ >
100
+
101
+ {/* 首页 */}
102
+ <Route path='/' element={<GetIndexRoute />} />
103
+
104
+ {
105
+ menuConfig.map(menu=>renderMenuConfig(menu))
106
+ }
107
+
108
+ <Route path='/antd' element={<AntdComponents/>} />
109
+ s <Route path='/403' element={<Page403/>} />
110
+ <Route path='/404' element={<Page404/>} />
111
+ <Route path='/503' element={<Page503/>} />
112
+ <Route path='*' element={<Navigate to='/404' />} />
113
+ </Route>
114
+ </Route>
115
+ </Routes>
116
+ );
117
+
118
+
119
+
120
+
121
+ export default ()=>(
122
+ <HashRouter>
123
+ <ErrorBoundary>
124
+ {RouteList}
125
+ </ErrorBoundary>
126
+ </HashRouter>
127
+ )
@@ -0,0 +1,85 @@
1
+
2
+
3
+ import moment from 'moment';
4
+ import {GET_DEFAULT,POST_DEFAULT,API_ROOT} from './index';
5
+
6
+ const MAX_TOTAL=100;
7
+ let UPDATE_COUNT=0;
8
+ let CREATE_COUNT=0;
9
+ let LIST=null;
10
+
11
+ const createData=(id)=>{
12
+ const selectValue=['1','2','3','4','5','6']
13
+ return {
14
+ id:`${id}`,
15
+ img:'https://image.knscq.com/216376107732045824-%E5%B0%8F%E7%A8%8B%E5%BA%8F1024.png',
16
+ updateCount:UPDATE_COUNT,
17
+ name: `名称`+ `${id}`.padStart(2,'0'),
18
+ phone: `1370000`+ `${id}`.padStart(4,'0'),
19
+ date: moment().add(id,'minute').unix()*1000,//format('YYYY-MM-DD HH:mm:ss'),
20
+ dateText:'2024-01-01 12:12:12',
21
+ dateRange: [moment().add(id,'minute').unix()*1000,moment().add(id,'day').unix()*1000],
22
+ select: selectValue[id%selectValue.length],
23
+ longName: `这是一个很长的名称`+ `${id}`.padStart(2,'0'),
24
+ imgName: 'https://nebula-api.oss-cn-shanghai.aliyuncs.com/20240329/24163932-85ea-4372-9ff7-ee7c71748bcb/1711691401353-95387929.jpeg',
25
+ previewSrcs:[
26
+ 'http://callcneter.oss-cn-shanghai.aliyuncs.com/140_zhangfan31711522544778-46413274',
27
+ 'http://callcneter.oss-cn-shanghai.aliyuncs.com/140_zhangfan31711522539477-71557179',
28
+ 'http://callcneter.oss-cn-shanghai.aliyuncs.com/140_zhangfan31711522552637-65222632',
29
+ 'http://callcneter.oss-cn-shanghai.aliyuncs.com/140_zhangfan31711522549224-81138313',
30
+ ],
31
+ videoName:'https://nebula-api.oss-cn-shanghai.aliyuncs.com/20240329/fc172bf8-1f61-4464-8d48-29b98a42fb4a/1711701991414-12827489.mp4',
32
+ disabled:id%2?true:false,
33
+ state:id%2?1:2
34
+ }
35
+ };
36
+
37
+ function updateListData(){
38
+ let list=[];
39
+
40
+ for(let i=0;i<MAX_TOTAL;i++){
41
+ list.push(createData(i))
42
+ }
43
+ for(let i=0;i<CREATE_COUNT;i++){
44
+ list.push(createData(300+i))
45
+ }
46
+ LIST=list;
47
+ }
48
+
49
+
50
+
51
+ export function GET_LIST(params) {
52
+ const {current,pageSize,...querys}= params;
53
+ if(!LIST)updateListData();
54
+ const strQuerys=JSON.stringify(querys);
55
+ let data=[];
56
+ let idx=(current-1)*pageSize;
57
+ for(let i=0;i<pageSize;i++){
58
+ if(idx>=MAX_TOTAL+CREATE_COUNT)break;
59
+ data.push({...LIST[idx],query:strQuerys});
60
+ idx++;
61
+ }
62
+ let req={
63
+ code:0,
64
+ data:{
65
+ records:data,
66
+ current,
67
+ pages:Math.floor(MAX_TOTAL/pageSize),
68
+ size:pageSize,
69
+ total:MAX_TOTAL
70
+ }
71
+ };
72
+ return Promise.resolve(req);
73
+ }
74
+
75
+ export function GET_DETAIL(params) {
76
+ return GET_DEFAULT(`${API_ROOT}/api/demo/detail`,params);
77
+ }
78
+ export function CREATE(params) {
79
+ return POST_DEFAULT(`${API_ROOT}/api/demo/create`,params)
80
+ }
81
+
82
+ export function UPDATE(params) {
83
+ return POST_DEFAULT(`${API_ROOT}/api/demo/update`,params)
84
+ }
85
+
@@ -0,0 +1,43 @@
1
+ // @ts-ignore
2
+ import Axios from 'axios';
3
+ // @ts-ignore
4
+ import qs from 'qs';
5
+
6
+ import {DefaultRequest} from './interceptor'
7
+
8
+ const axiosExport = Axios.create();
9
+ axiosExport.interceptors.request.use(DefaultRequest);
10
+
11
+ export async function EXPORT_EXCEL(url, param, options) {
12
+ if (param) param = qs.stringify(param, { arrayFormat: 'indices' });
13
+
14
+ let response = await axiosExport({
15
+ method: 'GET',
16
+ url: param ? `${url}?${param}` : url,
17
+ responseType: 'blob',
18
+ getResponse: true,
19
+ ...options,
20
+ });
21
+ // @ts-ignore
22
+ let fileType = response.headers.get('content-type');
23
+ // @ts-ignore
24
+ const disposition = response.headers.get('content-disposition');
25
+
26
+ const blob = new Blob([response.data], { type: `${fileType},charset=UTF-8` });
27
+ const fileName = decodeURI(
28
+ disposition ? disposition.split(';')[1].split('filename=')[1] : 'download.xlsx',
29
+ );
30
+ let blobUrl = window.URL.createObjectURL(blob);
31
+
32
+ const link = document.createElement('a');
33
+ link.href = blobUrl;
34
+ link.download = fileName.replace(/"/g, '');
35
+ document.body.appendChild(link);
36
+ link.style.display='none';
37
+ link.click();
38
+ link.remove();
39
+ setTimeout(() => window.URL.revokeObjectURL(blobUrl), 1000);
40
+
41
+ return null;
42
+ }
43
+
@@ -0,0 +1,155 @@
1
+
2
+ // @ts-ignore
3
+ import qs from 'qs';
4
+
5
+
6
+ export const CreateHttpTools=(axios)=>{
7
+ let buffer = {};
8
+
9
+ /**
10
+ * GET请求
11
+ * @param {string} url - 接口地址
12
+ * @param {Object} [param] - 接口参数
13
+ * @param {Object} [options] - 扩展参数
14
+ * @returns Promise<ServicesResponse>
15
+ */
16
+ const GET_DEFAULT= async (url, param, options) => {
17
+ if (param) param = qs.stringify(param, { arrayFormat: 'indices' });
18
+ let now = Date.now();
19
+
20
+ let bufferItem;
21
+ if (options?.ttl) {
22
+ if (buffer[url]) {
23
+ bufferItem = buffer[url];
24
+ if (bufferItem.param == param && now <= bufferItem.endTime) {
25
+ return bufferItem?.response?.data || null;
26
+ }
27
+ }
28
+ }
29
+ let response = await axios({
30
+ method: 'GET',
31
+ url: param ? `${url}?${param}` : url,
32
+ ...options,
33
+ });
34
+
35
+ if (options?.ttl) {
36
+ if (!buffer[url]) {
37
+ buffer[url] = {};
38
+ }
39
+ buffer[url].param = param;
40
+ let ttl = options.ttl === true ? 1000 * 2 : options.ttl;
41
+ buffer[url].endTime = Date.now() + ttl;
42
+ buffer[url].response = response;
43
+ }
44
+
45
+ return response && response.data ? response.data : null;
46
+ }
47
+
48
+ /**
49
+ * GET请求
50
+ * @param {string} url - 接口地址
51
+ * @param {Object} [param] - 接口参数
52
+ * @returns Promise<ServicesResponse>
53
+ */
54
+ const GET_DEFAULT_CROSS = async (url, param) => {
55
+ if (param) param = qs.stringify(param, { arrayFormat: 'indices' });
56
+
57
+ let response = await axios({
58
+ method: 'GET',
59
+ xsrfCookieName: '',
60
+ xsrfHeaderName: '',
61
+ withCredentials: true,
62
+ url: param ? `${url}?${param}` : url,
63
+ });
64
+ return response && response.data ? response.data : null;
65
+ }
66
+
67
+ /**
68
+ * POST请求
69
+ * @param {string} url - 接口地址
70
+ * @param {Object} [params] - 接口参数
71
+ * @param {Object} [options] - 特殊参数
72
+ *
73
+ * @returns Promise<ServicesResponse>
74
+ */
75
+ const POST_DEFAULT= async (url, params, options) => {
76
+ let data = params;
77
+ // if (params) params = qs.stringify(params, { arrayFormat: 'indices' });
78
+ // if (typeof params === 'string') {
79
+ // data = params;
80
+ // } else {
81
+ // data = { ...params };
82
+ // }
83
+ let response = await axios({
84
+ method: 'POST',
85
+ url: url,
86
+ data,
87
+ ...options,
88
+ // headers: { 'content-type': 'application/x-www-form-urlencoded' },
89
+ });
90
+ return response && response.data ? response.data : null;
91
+ }
92
+
93
+
94
+ /**
95
+ * POST请求
96
+ * @param {string} url - 接口地址
97
+ * @param {Object} [params] - 接口参数
98
+ *
99
+ * @returns Promise<ServicesResponse>
100
+ */
101
+ const POST_DEFAULT_CROSS= async (url, params) => {
102
+ let data = {};
103
+ // if (params) params = qs.stringify(params, { arrayFormat: 'indices' });
104
+
105
+ if (typeof params === 'string') {
106
+ data = params;
107
+ } else {
108
+ data = { ...params };
109
+ }
110
+ let response = await axios({
111
+ method: 'POST',
112
+ url: url,
113
+ xsrfCookieName: '',
114
+ xsrfHeaderName: '',
115
+ withCredentials: true,
116
+ data,
117
+ });
118
+
119
+ return response && response.data ? response.data : null;
120
+ }
121
+
122
+ const PUT_DEFAULT= async (url,params,options)=> {
123
+ let data=params;
124
+
125
+ let response=await axios({
126
+ method: 'PUT',
127
+ url: url,
128
+ data,
129
+ ...options,
130
+ });
131
+ return response&&response.data? response.data:null;
132
+ }
133
+
134
+ const DELETE_DEFAULT = async (url,params,options) => {
135
+ let data=params;
136
+
137
+ let response=await axios({
138
+ method: 'DELETE',
139
+ url: url,
140
+ data,
141
+ ...options,
142
+ });
143
+ return response&&response.data? response.data:null;
144
+ }
145
+
146
+ return {
147
+ GET_DEFAULT,
148
+ GET_DEFAULT_CROSS,
149
+ POST_DEFAULT,
150
+ POST_DEFAULT_CROSS,
151
+ PUT_DEFAULT,
152
+ DELETE_DEFAULT
153
+ }
154
+
155
+ }