kn-cli 1.0.96 → 1.0.98

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 (135) hide show
  1. package/build/package.json +1 -0
  2. package/package.json +1 -1
  3. package/readme.md +3 -0
  4. package/templates/template_admin/cli.config.js +4 -1
  5. package/templates/template_admin/package.json +7 -1
  6. package/templates/template_admin/public/favicon.png +0 -0
  7. package/templates/template_admin/public/index.html +6 -4
  8. package/templates/template_admin/public/src/_antd.less +30 -3
  9. package/templates/template_admin/public/src/_mixin.less +41 -0
  10. package/templates/template_admin/public/src/_reset.less +28 -20
  11. package/templates/template_admin/public/src/_variable.less +11 -6
  12. package/templates/template_admin/public/src/assets/iconfont/iconfont.eot +0 -0
  13. package/templates/template_admin/public/src/assets/iconfont/iconfont.less +60 -8
  14. package/templates/template_admin/public/src/assets/iconfont/iconfont.svg +57 -18
  15. package/templates/template_admin/public/src/assets/iconfont/iconfont.ttf +0 -0
  16. package/templates/template_admin/public/src/assets/iconfont/iconfont.woff +0 -0
  17. package/templates/template_admin/public/src/assets/iconfont/iconfont.woff2 +0 -0
  18. package/templates/template_admin/public/src/assets/images/arrow.png +0 -0
  19. package/templates/template_admin/public/src/assets/images/icon-notice.png +0 -0
  20. package/templates/template_admin/public/src/assets/images/icon-user.png +0 -0
  21. package/templates/template_admin/public/src/assets/images/loadFail.png +0 -0
  22. package/templates/template_admin/public/src/assets/images/login/bg.png +0 -0
  23. package/templates/template_admin/public/src/assets/images/login/logo.png +0 -0
  24. package/templates/template_admin/public/src/assets/images/login/slogan.png +0 -0
  25. package/templates/template_admin/public/src/assets/images/nav/icon-dep-active.png +0 -0
  26. package/templates/template_admin/public/src/assets/images/nav/icon-dep.png +0 -0
  27. package/templates/template_admin/public/src/assets/images/nav/icon-log-active.png +0 -0
  28. package/templates/template_admin/public/src/assets/images/nav/icon-log.png +0 -0
  29. package/templates/template_admin/public/src/assets/images/nav/icon-loginlog-active.png +0 -0
  30. package/templates/template_admin/public/src/assets/images/nav/icon-loginlog.png +0 -0
  31. package/templates/template_admin/public/src/assets/images/nav/icon-role-active.png +0 -0
  32. package/templates/template_admin/public/src/assets/images/nav/icon-role.png +0 -0
  33. package/templates/template_admin/public/src/assets/images/nav/icon-user-active.png +0 -0
  34. package/templates/template_admin/public/src/assets/images/nav/icon-user.png +0 -0
  35. package/templates/template_admin/public/src/assets/images/nav/nav-toggle.png +0 -0
  36. package/templates/template_admin/public/src/assets/images/nav/slogan.png +0 -0
  37. package/templates/template_admin/public/src/assets/images/noData.png +0 -0
  38. package/templates/template_admin/public/src/assets/images/noSelect.png +0 -0
  39. package/templates/template_admin/public/src/components/auth/index.jsx +7 -3
  40. package/templates/template_admin/public/src/components/auth/index.less +7 -0
  41. package/templates/template_admin/public/src/components/badge/index.jsx +47 -0
  42. package/templates/template_admin/public/src/components/badge/index.less +44 -0
  43. package/templates/template_admin/public/src/components/debug/index.jsx +27 -0
  44. package/templates/template_admin/public/src/components/debug/index.less +9 -0
  45. package/templates/template_admin/public/src/components/empty/index.jsx +28 -0
  46. package/templates/template_admin/public/src/components/empty/index.less +20 -0
  47. package/templates/template_admin/public/src/components/image/index.jsx +73 -0
  48. package/templates/template_admin/public/src/components/image/index.less +117 -0
  49. package/templates/template_admin/public/src/components/image/preview.jsx +85 -0
  50. package/templates/template_admin/public/src/components/layout/basic/index.jsx +24 -11
  51. package/templates/template_admin/public/src/components/layout/basic/index.less +58 -19
  52. package/templates/template_admin/public/src/components/layout/index.jsx +20 -17
  53. package/templates/template_admin/public/src/components/layout/index.less +4 -4
  54. package/templates/template_admin/public/src/components/layout/provider/index.jsx +19 -6
  55. package/templates/template_admin/public/src/components/{menu → leftMenu}/index.jsx +20 -28
  56. package/templates/template_admin/public/src/components/leftMenu/index.less +42 -0
  57. package/templates/template_admin/public/src/components/popup/index.jsx +25 -0
  58. package/templates/template_admin/public/src/components/table/column.jsx +47 -0
  59. package/templates/template_admin/public/src/components/table/column.less +12 -0
  60. package/templates/template_admin/public/src/components/table/index.jsx +22 -13
  61. package/templates/template_admin/public/src/components/table/index.less +15 -0
  62. package/templates/template_admin/public/src/components/text/index.jsx +98 -0
  63. package/templates/template_admin/public/src/components/text/index.less +13 -0
  64. package/templates/template_admin/public/src/components/topMenu/index.jsx +97 -0
  65. package/templates/template_admin/public/src/components/topMenu/index.less +80 -0
  66. package/templates/template_admin/public/src/components/topMenu/topBar/index.jsx +76 -0
  67. package/templates/template_admin/public/src/components/topMenu/topBar/index.less +88 -0
  68. package/templates/template_admin/public/src/components/video/index.jsx +96 -0
  69. package/templates/template_admin/public/src/components/video/index.less +132 -0
  70. package/templates/template_admin/public/src/components/video/preview.jsx +38 -0
  71. package/templates/template_admin/public/src/dictionary/index.js +108 -39
  72. package/templates/template_admin/public/src/enum.js +41 -0
  73. package/templates/template_admin/public/src/hooks/index.jsx +8 -6
  74. package/templates/template_admin/public/src/hooks/useDebounceFn.jsx +33 -0
  75. package/templates/template_admin/public/src/hooks/useInToView.jsx +58 -0
  76. package/templates/template_admin/public/src/hooks/useRouteMenu.jsx +37 -28
  77. package/templates/template_admin/public/src/hooks/useTimer.jsx +42 -0
  78. package/templates/template_admin/public/src/index.jsx +10 -7
  79. package/templates/template_admin/public/src/mock/auth.js +33 -0
  80. package/templates/template_admin/public/src/mock/demo.js +12 -74
  81. package/templates/template_admin/public/src/mock/index.js +1 -0
  82. package/templates/template_admin/public/src/pages/auth/user/create/index.jsx +55 -0
  83. package/templates/template_admin/public/src/pages/auth/user/create/index.less +6 -0
  84. package/templates/template_admin/public/src/pages/auth/user/dialog/index.jsx +96 -0
  85. package/templates/template_admin/public/src/pages/auth/user/index.jsx +271 -0
  86. package/templates/template_admin/public/src/pages/components/layout/index.jsx +75 -0
  87. package/templates/template_admin/public/src/pages/components/layout/index.less +78 -0
  88. package/templates/template_admin/public/src/pages/components/layout/titleBar/index.jsx +28 -0
  89. package/templates/template_admin/public/src/pages/components/layout/titleBar/index.less +44 -0
  90. package/templates/template_admin/public/src/pages/components/select/account/index.jsx +114 -0
  91. package/templates/template_admin/public/src/pages/components/select/device/index.jsx +83 -0
  92. package/templates/template_admin/public/src/pages/components/select/groupUser/index.jsx +172 -0
  93. package/templates/template_admin/public/src/pages/components/select/user/index.jsx +119 -0
  94. package/templates/template_admin/public/src/pages/home.jsx +79 -0
  95. package/templates/template_admin/public/src/pages/home.less +6 -0
  96. package/templates/template_admin/public/src/pages/login/index.jsx +90 -6
  97. package/templates/template_admin/public/src/pages/login/index.less +133 -24
  98. package/templates/template_admin/public/src/provider/app.jsx +72 -66
  99. package/templates/template_admin/public/src/provider/loading.jsx +47 -0
  100. package/templates/template_admin/public/src/provider/menu.jsx +117 -83
  101. package/templates/template_admin/public/src/provider/menu.less +35 -0
  102. package/templates/template_admin/public/src/route.jsx +41 -40
  103. package/templates/template_admin/public/src/services/auth.js +39 -0
  104. package/templates/template_admin/public/src/services/demo.js +3 -37
  105. package/templates/template_admin/public/src/services/index.js +139 -13
  106. package/templates/template_admin/public/src/services/login.js +37 -0
  107. package/templates/template_admin/public/src/services/socket/index.jsx +100 -0
  108. package/templates/template_admin/public/src/type.js +36 -19
  109. package/templates/template_admin/public/src/utils/event.js +58 -0
  110. package/templates/template_admin/public/src/utils/format.js +84 -0
  111. package/templates/template_admin/public/src/utils/index.js +214 -2
  112. package/templates/template_admin/public/src/utils/rule.js +3 -0
  113. package/templates/template_admin/public/static/kssoLogin.html +1 -1
  114. package/templates/template_admin/webpack.api.js +11 -3
  115. package/src/.DS_Store +0 -0
  116. package/templates/template_admin/.gitignore +0 -6
  117. package/templates/template_admin/public/favicon.ico +0 -0
  118. package/templates/template_admin/public/src/assets/images/avatars/1.png +0 -0
  119. package/templates/template_admin/public/src/assets/images/avatars/2.png +0 -0
  120. package/templates/template_admin/public/src/assets/images/avatars/3.png +0 -0
  121. package/templates/template_admin/public/src/components/layout/centerBody/index.jsx +0 -25
  122. package/templates/template_admin/public/src/components/layout/centerBody/index.less +0 -30
  123. package/templates/template_admin/public/src/components/menu/index.less +0 -19
  124. package/templates/template_admin/public/src/components/menu/topMenu/index.jsx +0 -132
  125. package/templates/template_admin/public/src/components/menu/topMenu/index.less +0 -105
  126. package/templates/template_admin/public/src/pages/demo/detail/index.jsx +0 -27
  127. package/templates/template_admin/public/src/pages/demo/edit/index.jsx +0 -109
  128. package/templates/template_admin/public/src/pages/demo/index.less +0 -9
  129. package/templates/template_admin/public/src/pages/demo/page1.jsx +0 -161
  130. package/templates/template_admin/public/src/pages/superAdminLogin/index.jsx +0 -64
  131. package/templates/template_admin/public/src/pages/superAdminLogin/index.less +0 -44
  132. package/templates/template_app/.gitignore +0 -6
  133. package/templates/template_oa/.gitignore +0 -6
  134. package/templates/template_oa_jwt/.gitignore +0 -6
  135. package/templates/template_offcial/.gitignore +0 -6
@@ -1,8 +1,17 @@
1
+ @import '~@/_mixin.less';
2
+
3
+ @keyframes rotate {
4
+ from {
5
+ transform: rotate(0deg);
6
+ }
7
+ to {
8
+ transform: rotate(360deg);
9
+ }
10
+ }
1
11
 
2
12
  .link{
3
13
  display: block;
4
14
  }
5
-
6
15
  .body{
7
16
  width: 100%;
8
17
  height:100%;
@@ -10,35 +19,135 @@
10
19
  justify-content: center;
11
20
  align-items: center;
12
21
  flex-direction: column;
22
+ background-image: url('~@/assets/images/login/bg.png');
23
+ background-size: cover;
13
24
 
14
25
  }
15
- .wrap{
16
- padding:26px 32px;
17
- background-color: #ccc;
26
+ .bg2{
27
+ width: 100%;
28
+ height:100%;
29
+ display: flex;
30
+ justify-content: center;
31
+ align-items: center;
32
+ flex-direction: column;
33
+ background-image: url('~@/assets/images/login/bg.png');
34
+ background-size: auto 100%;
35
+ background-repeat: no-repeat;
36
+ }
37
+
38
+
39
+
40
+ .loginWrap{
41
+ position: fixed;
42
+ right:0;
43
+ top:0;
44
+ height: 100%;
45
+ max-width: 560px;
46
+ min-width: 384px;
47
+ width:29%;
48
+ background-size: cover;
49
+ background-repeat: no-repeat;
50
+ background-position-x: right;
51
+ background-position-y: top;
52
+ display: flex;
53
+ flex-direction: column;
54
+ align-items: center;
55
+ justify-content: center;
56
+ row-gap: 14px;
57
+ background-color: white;
58
+ padding:24px;
59
+
60
+ .centerWrap{
61
+ margin-top:-124px;
62
+ width: 336px;
63
+ display: flex;
64
+ flex-direction: column;
65
+
66
+ .phoneLogin,
67
+ .kssoLogin{
68
+ width: 100%;
69
+ margin-top: 24px;
70
+ min-height: 240px;
71
+
72
+ .codeGroup{
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: space-between;
76
+ width: 100%;
77
+ .sendCode{
78
+ font-size: 14px;
79
+ color:#0974F2;
80
+ cursor: pointer;
81
+ .no-select;
82
+ }
83
+ }
84
+ .inputLabel{
85
+ font-weight: bold;
86
+ color:#000;
87
+ font-size: 14px;
88
+ .no-select;
89
+ .required{
90
+ color:#FF1111;
91
+ font-size: 14px;
92
+ margin-left:6px;
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ .logining{
99
+ font-size: 18px;
100
+ font-weight: bold;
101
+ display: flex;
102
+ align-items: center;
103
+ }
18
104
  .title{
105
+ color:#1F2329;
19
106
  font-size: 24px;
20
- font-weight: var(--weight-Medium);
21
- margin-bottom: 24px;
22
- }
23
-
24
- hgroup{
25
- margin-bottom: 16px;
26
- display: block;
27
- .inputLabel{
28
- display: block;
29
- font-size: 13px;
30
- font-weight: var(--weight-Medium);
31
- color: #86909C;
32
- line-height: 22px;
33
- }
107
+ margin-bottom:12px;
108
+ margin-top:32px;
109
+ .no-select;
34
110
  }
35
- .input{
36
- width: 336px;
37
- border-radius: 4px;
38
- border: 1px solid #E5E6EB;
111
+ .logo{
112
+ width: 64px;
113
+
114
+ &[data-run='true']{
115
+ animation: rotate 2s linear infinite;
116
+ }
39
117
  }
40
118
  .btn{
41
- width: 336px;
42
- margin-top: 18px;
119
+ width: 208px;
120
+ height: 56px;
121
+ span{
122
+ font-size: 20px;
123
+ }
124
+ }
125
+ .errorText{
126
+ color:#FF1111;
127
+ font-size: 14px;
128
+ }
129
+ .footer{
130
+ position: absolute;
131
+ bottom: 24px;
132
+ width: 100%;
133
+ display: flex;
134
+ flex-direction: column;
135
+ justify-content: center;
136
+ align-items: center;
137
+ row-gap: 4px;
138
+ p{
139
+ margin-bottom: 0;
140
+ color:#0974F2;
141
+ font-size: 14px;
142
+ }
43
143
  }
144
+ }
145
+
146
+ .sloganWrap{
147
+ position: fixed;
148
+ left:24px;
149
+ top:24px;
150
+ display: flex;
151
+ align-items: center;
152
+ .slogan{width:73px;}
44
153
  }
@@ -1,15 +1,20 @@
1
1
  // @ts-ignore
2
- import { useState,useMemo, useEffect } from 'react';
2
+ import { useState,useMemo, useRef } from 'react';
3
3
  // @ts-ignore
4
4
  import { useSearchParams,useNavigate } from 'react-router-dom';
5
5
  // @ts-ignore
6
6
  import { createContainer } from "unstated-next";
7
+
7
8
  // @ts-ignore
8
- import {useDelay} from '@/hooks/index';
9
+ import { message } from "antd";
10
+
9
11
  import {setJwt,setLogout} from '@/services';
10
- import {GET_USER_INFO,Login,KssoLogin} from '@/services/demo';
12
+
11
13
  import {jumpUrl} from '@/utils';
14
+ import { KSSO_LOGIN,Logout } from '@/services/login';
15
+
12
16
 
17
+ const MODULE_NAME='ProviderApp';
13
18
 
14
19
  /**
15
20
  * @typedef AppContaniner
@@ -17,13 +22,14 @@ import {jumpUrl} from '@/utils';
17
22
  * @property {(open:boolean)=>void} setLoading - 设置加载状态
18
23
  * @property {()=>Promise<boolean>} isLogin - 检查是否已登录状态
19
24
  * @property {(username:string,password:string)=>Promise<boolean>} login - 触发登录
20
- * @property {object} nav - 导航栏配置
21
- * @property {(option:object)=>void} setNav - 设置导航栏配置
22
25
  * @property {()=>Promise} logout - 注销病退回登录界面
23
26
  * @property {(user:object)=>void} setUser - 注销病退回登录界面
27
+ * @property {(auths:string[])=>void} setAuths - 设置权限
24
28
  * @property {object} user - 注销病退回登录界面
25
29
  * @property {()=>Promise<boolean>} kssoLogin - 触发ksso登录
26
- * @property {()=>Promise} updateUserInfo - 更新用户信息
30
+ * @property {string[]} auths - 用户的权限列表
31
+ * @property {()=>void} clearLoginInfo - 清理用户登录信息
32
+ *
27
33
  */
28
34
 
29
35
 
@@ -35,116 +41,116 @@ const useApp=() =>{
35
41
  const [search] = useSearchParams();
36
42
  const navigate= useNavigate();
37
43
  const [loading,setLoading] = useState(true);
38
- const [nav,setNavConfig] = useState({visible:true,syncDocumentTitle:false});
39
44
  const [user,setUser] = useState(null);
40
-
41
- const delay = useDelay();
42
-
45
+ /**
46
+ * @type {[string[],React.Dispatch<React.SetStateAction<string[]>>]}
47
+ */
48
+ const [auths,setAuths]= useState(null);
49
+
50
+ /**
51
+ * @type {React.MutableRefObject<object>}
52
+ */
53
+ const refSelf = useRef();
54
+ const LocalStorageName='zeus-user';
55
+
56
+
43
57
  const isLogin=async ()=>{
44
- await delay.wait(10);
45
58
  if(!user){
46
59
  try{
47
- let userData = localStorage.getItem('user');
60
+ let userData = localStorage.getItem(LocalStorageName);
48
61
  if(userData){
49
62
  userData= JSON.parse(userData);
50
63
  if(userData){
51
64
  setUser(userData);
52
65
  // @ts-ignore
53
66
  setJwt(userData.token);
67
+ if(!auths){
68
+ await updateAuth();
69
+ }
54
70
  return true;
55
71
  }
72
+ }else{
73
+ navigate('/login');
56
74
  }
57
75
  }catch(ex){
58
- return false;
76
+ navigate('/login');
59
77
  }
60
78
  }else{
79
+ if(!auths){
80
+ await updateAuth();
81
+ }
61
82
  return true;
62
83
  }
63
84
  }
64
-
85
+ const updateAuth=async ()=>{
86
+ setAuths(['auth1','auth2','auth3','auth4'])
87
+ return true;
88
+ }
89
+
65
90
  const kssoLogin=async ()=>{
66
91
  let code = search.get('code');
67
92
  if(code){
68
- var redirectUri = location.protocol + '//' + location.host + '/#/login';
69
- //ksso auth登录
70
- const req = await KssoLogin({code,redirectUri})
93
+ var redirect_uri = location.protocol + '//' + location.host + '/#/login';
94
+ const req = await KSSO_LOGIN({code,redirect_uri})
71
95
  if(req?.code==0){
72
96
  const userData = req?.data;
97
+ const {token}= userData;
73
98
  setUser(userData);
74
- setJwt(userData.token);
75
- localStorage.setItem('user',JSON.stringify(userData));
76
-
77
- let redirect = search.get('redirect');
78
- if(redirect){
79
- jumpUrl(redirect,{replace:true});
80
- return true;
99
+ setJwt(token);
100
+ const authReq = await updateAuth();
101
+ if(authReq){
102
+ localStorage.setItem(LocalStorageName,JSON.stringify(userData));
103
+ let redirect = search.get('redirect');
104
+ message.success('登录成功');
105
+ if(redirect){
106
+ jumpUrl(redirect,{replace:true});
107
+ return true;
108
+ }
109
+ navigate('/');
110
+ }else{
111
+ return false;
81
112
  }
82
- navigate('/');
83
113
  }else{
114
+ navigate('/login');
115
+ setTimeout(() => {
116
+ jumpUrl('',{reload:true});
117
+ }, 1000);
84
118
  return false;
85
119
  }
86
120
  }else{
87
- jumpUrl(`${location.protocol}//${location.host}/static/kssoLogin.html`,{replace:true})
88
- }
89
- return true;
90
- }
91
- const login=async (username,password)=>{
92
- const req = await Login({username,password});
93
- if(req?.code==0){
94
- const userData = req?.data;
95
- setUser(userData);
96
- setJwt(userData.token);
97
- localStorage.setItem('user',JSON.stringify(userData));
98
- let redirect = search.get('redirect');
99
- if(redirect){
100
- jumpUrl(redirect,{replace:true});
101
- return true;
102
- }
103
- navigate('/');
104
- }else{
105
- return false;
121
+ jumpUrl(`${location.protocol}//${location.host}/#/login`,{replace:true})
106
122
  }
107
123
  return true;
108
124
  }
109
- const updateUserInfo= async ()=>{
110
- const req= await GET_USER_INFO();
111
- if(req?.code==0){
112
- const userData = req.data;
113
- setUser(userData);
114
- localStorage.setItem('user',JSON.stringify(userData));
115
- }
125
+ const logout=async ()=>{
126
+ const req = await Logout();
127
+ navigate('/login');
116
128
  }
129
+ const clearLoginInfo=()=>{
117
130
 
118
- const logout=async ()=>{
131
+ localStorage.removeItem(LocalStorageName);
119
132
  setUser(null);
133
+ setAuths(null);
120
134
  setJwt('');
121
- localStorage.removeItem('user');
122
- navigate('/superAdminLogin');
123
135
  }
136
+
124
137
  setLogout(logout);
125
138
 
126
- useEffect(()=>{
127
- console.warn('[user]',user)
128
- },[user])
129
139
 
130
- const setNav=(config)=>{
131
- setNavConfig({...nav,...config});
132
- }
140
+
133
141
  const action=useMemo(()=>{
134
142
  return {
135
143
  loading,
136
144
  setLoading,
137
145
  isLogin,
138
- login,
139
- nav,
140
- setNav,
141
146
  logout,
142
- setUser,
143
147
  user,
144
148
  kssoLogin,
145
- updateUserInfo
149
+ auths,
150
+ setAuths,
151
+ clearLoginInfo
146
152
  }
147
- },[loading,nav,setNav,user,setUser,isLogin,kssoLogin,login,updateUserInfo]);
153
+ },[clearLoginInfo,loading,user,isLogin,kssoLogin,auths]);
148
154
 
149
155
  return action
150
156
  }
@@ -0,0 +1,47 @@
1
+
2
+ // @ts-ignore
3
+ import { useState } from 'react'
4
+
5
+ // @ts-ignore
6
+ import { createContainer } from "unstated-next"
7
+
8
+ const useProviderLoading=() =>{
9
+
10
+ const [count,setCount]= useState(0);
11
+
12
+ const open=()=>{
13
+ setCount(v=>v+1)
14
+ }
15
+ const close=()=>{
16
+ setCount(v=>v-1)
17
+ }
18
+
19
+ return {
20
+ loading:count>0,
21
+ open,
22
+ close,
23
+ count
24
+ }
25
+ }
26
+
27
+ /**
28
+ * @typedef LoadingProviderContaniner
29
+ * @property {()=>void} open - 打开Loading
30
+ * @property {()=>void} close - 关闭Loading
31
+ * @property {boolean} loading - 当前loading状态
32
+ * @property {number} count - 当前loading计数器
33
+ */
34
+
35
+
36
+ /**
37
+ * @typedef {object} LoadingProvider
38
+ * @property {function():LoadingProviderContaniner} useContainer
39
+ * @property {React.ComponentType<any>} Provider
40
+ */
41
+
42
+
43
+ /**
44
+ * @type {LoadingProvider}
45
+ */
46
+ const App = createContainer(useProviderLoading);
47
+ export default App;
@@ -6,116 +6,142 @@ import { useLocation } from 'react-router-dom';
6
6
  import { createContainer } from "unstated-next"
7
7
 
8
8
  import useRouteMenu from '@/hooks/useRouteMenu';
9
-
9
+ import ProviderApp from '@/provider/app';
10
10
 
11
11
  // @ts-ignore
12
- import { AppstoreOutlined, MailOutlined } from '@ant-design/icons';
12
+ import styles from './menu.less';
13
+
14
+
15
+ const MenuIcon=(props)=>{
16
+
17
+ const [icon,setIcon]= useState('');
18
+ const [iconActive,setIconActive]= useState('');
19
+
20
+ const getIcon= async (iconName)=>{
21
+ const req = await new Promise(resolve=>{
22
+ let iconActive =import(`@/assets/images/nav/${iconName}-active.png`);
23
+ let icon = import(`@/assets/images/nav/${iconName}.png`);
24
+ Promise.all([icon,iconActive]).then(values=>{
25
+ setIcon(values[0].default);
26
+ setIconActive(values[1].default)
27
+ })
28
+ })
29
+ }
30
+ useEffect(()=>{
31
+ getIcon(props.name);
32
+ },[])
33
+
34
+ return (
35
+ <div className={styles.iconGroup}>
36
+ <img className={styles.icon} src={icon} />
37
+ <img className={styles.iconActive} src={iconActive} />
38
+ </div>
39
+ )
40
+
41
+ }
13
42
 
14
43
  const MenuRoute=[
15
44
  {
16
- name:'普通管理',
45
+ name:'仪表盘',
17
46
  url:'/',
47
+ children:[
48
+ ],
49
+
50
+ },
51
+ {
52
+ name:'发射场',
53
+ url:'/jet',
54
+ children:[],
55
+ },
56
+ {
57
+ name:'弹药库',
58
+ url:'/store',
59
+ children:[],
60
+ },
61
+ {
62
+ name:'配件仓',
63
+ url:'/parts',
64
+ children:[],
65
+ },
66
+ {
67
+ name:'基因库',
68
+ url:'/dna',
69
+ children:[],
70
+ },
71
+ {
72
+ name:'控制室',
73
+ url:'/auth',
74
+ msgCount:12,
75
+ primaryId:'auth',
18
76
  children:[
19
77
  {
20
- name:'内容管理',
21
- icon:<AppstoreOutlined />,
22
- url:'/demo',
78
+ name: '用户',
79
+ icon:<MenuIcon name='icon-user'/>,
80
+ url: '/auth/user',
81
+ auth:true,
82
+ primaryId:'authUser',
83
+ msgCount:0,
23
84
  children:[
24
85
  {
25
- name:'内容管理1',
26
- url:'/demo/page1',
27
- children:[
28
- {hideMenu:true,name:'内容管理1详情',routeTemplate:'/demo/page1/detail/:id'},
29
- ]
30
- },
31
- {
32
- name:'内容管理2',
33
- url:'/demo/page2',
34
- msgCount:5,
35
- children:[
36
- {hideMenu:true,name:'内容管理2详情',routeTemplate:'/demo/page2/detail/:id'},
37
- ]
38
- },
86
+ name:'新建用户',
87
+ url:'/auth/user/create',
88
+ hideMenu:true
89
+ }
39
90
  ]
40
91
  },
41
92
  {
42
- name:'数据管理',
43
- icon:<AppstoreOutlined />,
44
- url:'/demo/data',
45
- children:[
46
- {
47
- name:'数据管理1',
48
- url:'/demo/data/page1',
49
- children:[
50
- {hideMenu:true,name:'数据管理1详情',routeTemplate:'/demo/data/page1/detail/:id'},
51
- ]
52
- },
53
- {
54
- name:'数据管理2',
55
- url:'/demo/data/page2',
56
- msgCount:5,
57
- children:[
58
- {hideMenu:true,name:'数据管理1详情',routeTemplate:'/demo/data/page2/detail/:id'},
59
- ]
60
- },
61
- ]
93
+ name: '部门',
94
+ icon:<MenuIcon name='icon-dep'/>,
95
+ url: '/auth/dep',
62
96
  },
63
-
64
- ]
65
- },
66
- {
67
- name:'高级管理',
68
- url:'/demo/admin',
69
- auth:['admin'],
70
- children:[
71
97
  {
72
- name:'高级管理',
73
- icon:<AppstoreOutlined />,
74
- url:'/demo/admin',
75
- children:[
76
- {
77
- name:'权限管理1',
78
- url:'/demo/admin/page1',
79
- children:[
80
- {hideMenu:true,name:'权限管理1-详情',routeTemplate:'/demo/admin/page1/detail/:id'},
81
- ]
82
- },
83
- {
84
- name:'权限管理2',
85
- url:'/demo/admin/page2',
86
- msgCount:5,
87
- children:[
88
- {hideMenu:true,name:'权限管理2-详情',routeTemplate:'/demo/admin/page2/detail/:id'},
89
- ]
90
- },
91
- ]
98
+ name: '角色',
99
+ icon:<MenuIcon name='icon-role'/>,
100
+ url: '/auth/role',
101
+ },
102
+ {
103
+ name: '操作记录',
104
+ icon:<MenuIcon name='icon-log'/>,
105
+ url: '/auth/log',
106
+ msgCount:12,
107
+ },
108
+ {
109
+ name: '登录日志',
110
+ icon:<MenuIcon name='icon-loginlog'/>,
111
+ url: '/auth/loginLog',
92
112
  },
93
- ]
113
+ ],
94
114
  }
95
115
  ]
96
116
 
97
117
 
118
+ /**
119
+ * @typedef MenuContaniner
120
+ * @property {RouteMenuItem[]} topMenu - 顶部导航栏的菜单列表
121
+ * @property {RouteMenuItem[]} leftMenu - 侧边导航栏的菜单列表
122
+ * @property {{menu:RouteMenuItem[],keys:string[]}} selectMenus - 当前被选中的菜单路径
123
+ * @property {(key:string)=>RouteMenuItem} findMenuData - 通过key查找菜单数据
124
+ * @property {(params:MenuConfig[])=>void} setMenuConfig - 设置菜单属性
125
+ * @property {()=>Promise<void>} reload - 重新加载渲染菜单
126
+ */
127
+
98
128
  const useProvider=() =>{
99
129
 
130
+ const app = ProviderApp.useContainer();
100
131
  const routeMenu = useRouteMenu();
101
-
102
132
  const curLocation =useLocation();
103
-
104
- const [userAuth,setUserAuth]= useState([]);
105
133
  const [topMenu,setTopMenu]=useState([]);
106
134
  const [leftMenu,setLeftMenu]=useState([]);
107
-
108
135
  const [selectMenus,setSelectMenus] = useState({menus:[],keys:[]});
109
136
 
110
-
111
137
  const reload = async ()=>{
112
138
  routeMenu.setSourceMap([...MenuRoute]);
113
139
  }
114
- const getTopMenu=()=>{
140
+ const getTopMenu=(userAuth=[])=>{
115
141
  const list = routeMenu.getMenu(routeMenu.source,userAuth);
116
142
  setTopMenu(list||[]);
117
143
  }
118
- const getLeftMenu=()=>{
144
+ const getLeftMenu=(userAuth=[])=>{
119
145
  const list = routeMenu.getMenu(routeMenu.source,userAuth);
120
146
  let menus= routeMenu.getOpenMenus(curLocation.pathname);
121
147
 
@@ -129,7 +155,6 @@ const useProvider=() =>{
129
155
  }
130
156
  setLeftMenu(subs);
131
157
  }
132
-
133
158
  const findMenuData=(menuKey)=>{
134
159
  return routeMenu.findMenuData(menuKey);
135
160
 
@@ -138,7 +163,6 @@ const useProvider=() =>{
138
163
  routeMenu.setMenuConfig(params);
139
164
  }
140
165
 
141
-
142
166
  useEffect(()=>{
143
167
  let menus= routeMenu.getOpenMenus(curLocation.pathname);
144
168
  let keys=menus.map(item=>item.key);
@@ -146,14 +170,24 @@ const useProvider=() =>{
146
170
  },[curLocation,routeMenu.source]);
147
171
 
148
172
  useEffect(()=>{
149
- getTopMenu();
150
- getLeftMenu();
151
- },[routeMenu.source,curLocation,userAuth])
173
+ getTopMenu(app.auths);
174
+ getLeftMenu(app.auths);
175
+ },[routeMenu.source,curLocation,app.auths])
176
+
177
+ return {leftMenu,topMenu,reload,selectMenus,findMenuData,setMenuConfig}
178
+ }
152
179
 
180
+ /**
181
+ * @typedef {object} MenuProvider
182
+ * @property {function():MenuContaniner} useContainer
183
+ * @property {React.ComponentType<any>} Provider
184
+ */
153
185
 
154
186
 
155
- return {leftMenu,topMenu,reload,selectMenus,findMenuData,setMenuConfig,setUserAuth}
156
- }
187
+ /**
188
+ * @type {MenuProvider}
189
+ */
190
+ // @ts-ignore
157
191
  const App = createContainer(useProvider);
158
192
 
159
193
  export default App;