kn-cli 1.0.92 → 1.0.94
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.
- package/package.json +1 -1
- package/templates/template_admin/public/index.html +5 -2
- package/templates/template_admin/public/src/_antd.less +7 -1
- package/templates/template_admin/public/src/assets/images/avatars/1.png +0 -0
- package/templates/template_admin/public/src/assets/images/avatars/2.png +0 -0
- package/templates/template_admin/public/src/assets/images/avatars/3.png +0 -0
- package/templates/template_admin/public/src/components/layout/basic/index.less +3 -3
- package/templates/template_admin/public/src/components/menu/index.jsx +47 -100
- package/templates/template_admin/public/src/components/menu/topMenu/index.jsx +129 -0
- package/templates/template_admin/public/src/components/table/index.jsx +62 -0
- package/templates/template_admin/public/src/dictionary/index.js +49 -4
- package/templates/template_admin/public/src/hooks/index.jsx +4 -1
- package/templates/template_admin/public/src/hooks/useRouteMenu.jsx +232 -0
- package/templates/template_admin/public/src/mock/demo.js +177 -0
- package/templates/template_admin/public/src/mock/index.js +5 -2
- package/templates/template_admin/public/src/pages/demo/detail/index.jsx +27 -0
- package/templates/template_admin/public/src/pages/demo/edit/index.jsx +109 -0
- package/templates/template_admin/public/src/pages/demo/index.less +9 -0
- package/templates/template_admin/public/src/pages/demo/page1.jsx +161 -0
- package/templates/template_admin/public/src/pages/login/index.jsx +5 -4
- package/templates/template_admin/public/src/pages/superAdminLogin/index.jsx +9 -2
- package/templates/template_admin/public/src/provider/app.jsx +18 -8
- package/templates/template_admin/public/src/provider/menu.jsx +146 -10
- package/templates/template_admin/public/src/route.jsx +21 -18
- package/templates/template_admin/public/src/services/demo.js +54 -0
- package/templates/template_admin/public/src/services/index.js +9 -0
- package/templates/template_admin/public/src/utils/format.js +51 -0
- package/templates/template_admin/public/src/utils/rule.js +274 -0
- package/templates/template_admin/readme.md +4 -0
- package/templates/template_admin/public/src/components/topMenu/index.jsx +0 -267
- package/templates/template_admin/public/src/mock/auth.js +0 -91
- package/templates/template_admin/public/src/mock/user.js +0 -70
- package/templates/template_admin/public/src/pages/material/index.jsx +0 -84
- package/templates/template_admin/public/src/pages/order/index.jsx +0 -12
- package/templates/template_admin/public/src/pages/permission/index.jsx +0 -12
- package/templates/template_admin/public/src/pages/suggest/index.jsx +0 -12
- package/templates/template_admin/public/src/pages/user/index.jsx +0 -18
- package/templates/template_admin/public/src/pages/userData/index.jsx +0 -12
- package/templates/template_admin/public/src/pages/video/index.jsx +0 -65
- package/templates/template_admin/public/src/services/auth.js +0 -28
- package/templates/template_admin/public/src/services/user.js +0 -26
- package/templates/template_admin/public/src/services/video.js +0 -33
- /package/templates/template_admin/public/src/components/{topMenu → menu/topMenu}/index.less +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import React, { useEffect, useState, useRef } from 'react';
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
import {Input,Button,Form,Badge,Space,Popconfirm} from 'antd';
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
import { useNavigate } from 'react-router-dom';
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
import moment from 'moment';
|
|
8
|
+
|
|
9
|
+
import Table from '@/components/table';
|
|
10
|
+
import Link from '@/components/link';
|
|
11
|
+
import {usePaginationWithForm} from '@/hooks';
|
|
12
|
+
import {GET_LIST,FormatTableService} from '@/services/demo';
|
|
13
|
+
import {formatText,formatPhone} from '@/utils/format';
|
|
14
|
+
import {useHealthy} from '@/dictionary';
|
|
15
|
+
|
|
16
|
+
import ShowEdit from './edit';
|
|
17
|
+
|
|
18
|
+
// @ts-ignore
|
|
19
|
+
import styles from './index.less';
|
|
20
|
+
|
|
21
|
+
const Page = (props) => {
|
|
22
|
+
const {label=''}= props;
|
|
23
|
+
const [form] = Form.useForm();
|
|
24
|
+
const emHealthy = useHealthy();
|
|
25
|
+
const navigate = useNavigate();
|
|
26
|
+
|
|
27
|
+
const page = usePaginationWithForm({
|
|
28
|
+
service:GET_LIST,
|
|
29
|
+
pagination:{pageSize:10},
|
|
30
|
+
form,
|
|
31
|
+
afterService: [FormatTableService],
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
const columns=[
|
|
35
|
+
{
|
|
36
|
+
dataIndex:'id',
|
|
37
|
+
title:'id',
|
|
38
|
+
width:30,
|
|
39
|
+
render:(text)=>formatText(text)
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
dataIndex:'query',
|
|
43
|
+
title:'查询内容',
|
|
44
|
+
width:90,
|
|
45
|
+
render:(text)=>formatText(text)
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
dataIndex:'name',
|
|
49
|
+
title:'名称',
|
|
50
|
+
width:90,
|
|
51
|
+
render:(text)=>formatText(text)
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
dataIndex:'date',
|
|
55
|
+
title:'时间',
|
|
56
|
+
width:90,
|
|
57
|
+
render:(date)=>date?moment(date).format('YYYY-MM-DD'):'-'
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
title: '手机号码',
|
|
61
|
+
dataIndex: 'phone',
|
|
62
|
+
width:100,
|
|
63
|
+
align:'center',
|
|
64
|
+
render:(phone)=>formatPhone(phone)
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
title: '状态',
|
|
68
|
+
dataIndex: 'select',
|
|
69
|
+
width:90,
|
|
70
|
+
align:'center',
|
|
71
|
+
render:(state,record,idx)=>{
|
|
72
|
+
state=['normal','abnormal','disabled'][idx%3];
|
|
73
|
+
const colors={
|
|
74
|
+
normal:'green',
|
|
75
|
+
abnormal:'#FAAD14',
|
|
76
|
+
disabled:'red'
|
|
77
|
+
}
|
|
78
|
+
return <Badge
|
|
79
|
+
color={colors[state]}
|
|
80
|
+
text={emHealthy.getLabel(state)}
|
|
81
|
+
/>
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
title: '操作',
|
|
86
|
+
key: 'option',
|
|
87
|
+
width:80,
|
|
88
|
+
fixed:'right',
|
|
89
|
+
align:'center',
|
|
90
|
+
render: (_, record) => (
|
|
91
|
+
<Space>
|
|
92
|
+
<Link onClick={onDetail.bind(this,record)}>详情</Link>
|
|
93
|
+
<Link onClick={onEdit.bind(this,record)}>编辑</Link>
|
|
94
|
+
<Popconfirm
|
|
95
|
+
title={`确定要${'禁用'}此用户吗?`}
|
|
96
|
+
onConfirm={onDel.bind(this,record)}
|
|
97
|
+
>
|
|
98
|
+
<Link>删除</Link>
|
|
99
|
+
</Popconfirm>
|
|
100
|
+
</Space>
|
|
101
|
+
),
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
const onEdit= async (record)=>{
|
|
106
|
+
const req= await ShowEdit({id:record.id});
|
|
107
|
+
if(req){
|
|
108
|
+
onSearch();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const onDetail= async (record)=>{
|
|
112
|
+
|
|
113
|
+
navigate(`detail/${record.id}`)
|
|
114
|
+
}
|
|
115
|
+
const onDel=()=>{}
|
|
116
|
+
|
|
117
|
+
// 搜索
|
|
118
|
+
const onSearch = () => {
|
|
119
|
+
page.update({ pagination: { current: 1 }, clear: true });
|
|
120
|
+
};
|
|
121
|
+
// 重置
|
|
122
|
+
const onReset = () => {
|
|
123
|
+
page.reset();
|
|
124
|
+
};
|
|
125
|
+
const onPageChange = (current, pageSize) => {
|
|
126
|
+
page.update({ pagination: { current, pageSize }, clear: true });
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
useEffect(() => {
|
|
130
|
+
onSearch();
|
|
131
|
+
}, []);
|
|
132
|
+
|
|
133
|
+
return (
|
|
134
|
+
<section className={styles.contentWrap}>
|
|
135
|
+
<p>页面名称:{label}</p>
|
|
136
|
+
<Form form={form} layout="inline">
|
|
137
|
+
<Form.Item label="关键字" name={'key1'}>
|
|
138
|
+
<Input placeholder="请输入用户组/描述" allowClear />
|
|
139
|
+
</Form.Item>
|
|
140
|
+
<Form.Item label="用户" name={'key2'}>
|
|
141
|
+
<Input placeholder="请输入用户全名" allowClear />
|
|
142
|
+
</Form.Item>
|
|
143
|
+
<Space>
|
|
144
|
+
<Button onClick={onSearch} type="primary">
|
|
145
|
+
搜索
|
|
146
|
+
</Button>
|
|
147
|
+
<Button onClick={onReset}>重置</Button>
|
|
148
|
+
</Space>
|
|
149
|
+
</Form>
|
|
150
|
+
<Table
|
|
151
|
+
columns={columns}
|
|
152
|
+
pagination={{
|
|
153
|
+
onChange: onPageChange,
|
|
154
|
+
}}
|
|
155
|
+
page={page}
|
|
156
|
+
/>
|
|
157
|
+
</section>
|
|
158
|
+
)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export default Page;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import React, { useEffect, useState, useRef } from 'react';
|
|
2
|
-
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
import { useSearchParams } from 'react-router-dom';
|
|
3
4
|
import ProviderApp from '@/provider/app';
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
// @ts-ignore
|
|
6
7
|
import styles from './index.less';
|
|
7
8
|
|
|
8
9
|
const Page = () => {
|
|
@@ -15,11 +16,11 @@ const Page = () => {
|
|
|
15
16
|
return;
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
|
-
useEffect(kssoLogin,[])
|
|
19
|
+
useEffect(()=>{kssoLogin()},[])
|
|
19
20
|
|
|
20
21
|
return (
|
|
21
22
|
<section className={styles.body}>
|
|
22
|
-
登录跳转中...
|
|
23
|
+
ksso登录跳转中...
|
|
23
24
|
</section>
|
|
24
25
|
)
|
|
25
26
|
}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import React, { useState, useRef } from 'react';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
// @ts-ignore
|
|
4
3
|
import {Input,Button} from 'antd';
|
|
5
4
|
|
|
5
|
+
import ProviderApp from '@/provider/app';
|
|
6
|
+
|
|
7
|
+
// @ts-ignore
|
|
6
8
|
import styles from './index.less';
|
|
7
9
|
|
|
10
|
+
/**
|
|
11
|
+
* 本地模拟账号密码登录的页面
|
|
12
|
+
* @returns
|
|
13
|
+
*/
|
|
8
14
|
const Page = () => {
|
|
9
15
|
const providerApp = ProviderApp.useContainer();
|
|
10
16
|
const [username,setUsername]=useState('');
|
|
@@ -28,6 +34,7 @@ const Page = () => {
|
|
|
28
34
|
const {key:code}= e;
|
|
29
35
|
if(code.toLocaleLowerCase()=='enter'){
|
|
30
36
|
if(type=='id'){
|
|
37
|
+
// @ts-ignore
|
|
31
38
|
refPassword.current.focus();
|
|
32
39
|
}else{
|
|
33
40
|
onAccountLogin();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @ts-ignore
|
|
2
|
-
import { useState,useMemo } from 'react';
|
|
2
|
+
import { useState,useMemo, useEffect } from 'react';
|
|
3
3
|
// @ts-ignore
|
|
4
4
|
import { useSearchParams,useNavigate } from 'react-router-dom';
|
|
5
5
|
// @ts-ignore
|
|
@@ -7,7 +7,7 @@ import { createContainer } from "unstated-next";
|
|
|
7
7
|
// @ts-ignore
|
|
8
8
|
import {useDelay} from '@/hooks/index';
|
|
9
9
|
import {setJwt,setLogout} from '@/services';
|
|
10
|
-
import {
|
|
10
|
+
import {GET_USER_INFO,Login,KssoLogin} from '@/services/demo';
|
|
11
11
|
import {jumpUrl} from '@/utils';
|
|
12
12
|
|
|
13
13
|
|
|
@@ -67,7 +67,7 @@ const useApp=() =>{
|
|
|
67
67
|
if(code){
|
|
68
68
|
var redirectUri = location.protocol + '//' + location.host + '/#/login';
|
|
69
69
|
//ksso auth登录
|
|
70
|
-
const req = await
|
|
70
|
+
const req = await KssoLogin({code,redirectUri})
|
|
71
71
|
if(req?.code==0){
|
|
72
72
|
const userData = req?.data;
|
|
73
73
|
setUser(userData);
|
|
@@ -89,13 +89,12 @@ const useApp=() =>{
|
|
|
89
89
|
return true;
|
|
90
90
|
}
|
|
91
91
|
const login=async (username,password)=>{
|
|
92
|
-
const req = await
|
|
92
|
+
const req = await Login({username,password});
|
|
93
93
|
if(req?.code==0){
|
|
94
94
|
const userData = req?.data;
|
|
95
95
|
setUser(userData);
|
|
96
96
|
setJwt(userData.token);
|
|
97
97
|
localStorage.setItem('user',JSON.stringify(userData));
|
|
98
|
-
|
|
99
98
|
let redirect = search.get('redirect');
|
|
100
99
|
if(redirect){
|
|
101
100
|
jumpUrl(redirect,{replace:true});
|
|
@@ -107,8 +106,16 @@ const useApp=() =>{
|
|
|
107
106
|
}
|
|
108
107
|
return true;
|
|
109
108
|
}
|
|
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
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
110
118
|
const logout=async ()=>{
|
|
111
|
-
LOGOUT();
|
|
112
119
|
setUser(null);
|
|
113
120
|
setJwt('');
|
|
114
121
|
localStorage.removeItem('user');
|
|
@@ -116,7 +123,9 @@ const useApp=() =>{
|
|
|
116
123
|
}
|
|
117
124
|
setLogout(logout);
|
|
118
125
|
|
|
119
|
-
|
|
126
|
+
useEffect(()=>{
|
|
127
|
+
console.warn('[user]',user)
|
|
128
|
+
},[user])
|
|
120
129
|
|
|
121
130
|
const setNav=(config)=>{
|
|
122
131
|
setNavConfig({...nav,...config});
|
|
@@ -132,7 +141,8 @@ const useApp=() =>{
|
|
|
132
141
|
logout,
|
|
133
142
|
setUser,
|
|
134
143
|
user,
|
|
135
|
-
kssoLogin
|
|
144
|
+
kssoLogin,
|
|
145
|
+
updateUserInfo
|
|
136
146
|
}
|
|
137
147
|
},[loading,nav,setNav,user,setUser,isLogin,kssoLogin,login]);
|
|
138
148
|
|
|
@@ -1,22 +1,158 @@
|
|
|
1
1
|
// @ts-ignore
|
|
2
|
-
import React,{ useState,useMemo } from 'react';
|
|
2
|
+
import React,{ useState,useMemo, useEffect } from 'react';
|
|
3
|
+
// @ts-ignore
|
|
4
|
+
import { useLocation } from 'react-router-dom';
|
|
3
5
|
// @ts-ignore
|
|
4
6
|
import { createContainer } from "unstated-next"
|
|
5
7
|
|
|
6
|
-
import
|
|
8
|
+
import useRouteMenu from '@/hooks/useRouteMenu';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
import { AppstoreOutlined, MailOutlined } from '@ant-design/icons';
|
|
13
|
+
|
|
14
|
+
const MenuRoute=[
|
|
15
|
+
{
|
|
16
|
+
name:'普通管理',
|
|
17
|
+
url:'/',
|
|
18
|
+
children:[
|
|
19
|
+
{
|
|
20
|
+
name:'内容管理',
|
|
21
|
+
icon:<AppstoreOutlined />,
|
|
22
|
+
url:'/demo',
|
|
23
|
+
children:[
|
|
24
|
+
{
|
|
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
|
+
},
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
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
|
+
]
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name:'高级管理',
|
|
68
|
+
url:'/demo/admin',
|
|
69
|
+
auth:['admin'],
|
|
70
|
+
children:[
|
|
71
|
+
{
|
|
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
|
+
]
|
|
92
|
+
},
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
|
|
7
97
|
|
|
8
98
|
const useProvider=() =>{
|
|
9
|
-
const [menus,setMenus]= useState([]);
|
|
10
99
|
|
|
11
|
-
const
|
|
12
|
-
|
|
100
|
+
const routeMenu = useRouteMenu();
|
|
101
|
+
|
|
102
|
+
const curLocation =useLocation();
|
|
103
|
+
|
|
104
|
+
const [userAuth,setUserAuth]= useState([]);
|
|
105
|
+
const [topMenu,setTopMenu]=useState([]);
|
|
106
|
+
const [leftMenu,setLeftMenu]=useState([]);
|
|
107
|
+
|
|
108
|
+
const [selectMenus,setSelectMenus] = useState({menus:[],keys:[]});
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
const reload = async ()=>{
|
|
112
|
+
routeMenu.setSourceMap([...MenuRoute]);
|
|
113
|
+
}
|
|
114
|
+
const getTopMenu=()=>{
|
|
115
|
+
const list = routeMenu.getMenu(routeMenu.source,userAuth);
|
|
116
|
+
setTopMenu(list||[]);
|
|
13
117
|
}
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
118
|
+
const getLeftMenu=()=>{
|
|
119
|
+
const list = routeMenu.getMenu(routeMenu.source,userAuth);
|
|
120
|
+
let menus= routeMenu.getOpenMenus(curLocation.pathname);
|
|
121
|
+
|
|
122
|
+
const req= list.filter(menu=>{
|
|
123
|
+
return menus.some(openMenu=>openMenu.key==menu.key)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
let subs=[];
|
|
127
|
+
if(req && req[0]){
|
|
128
|
+
subs=req[0].children||[];
|
|
17
129
|
}
|
|
18
|
-
|
|
19
|
-
|
|
130
|
+
setLeftMenu(subs);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const findMenuData=(menuKey)=>{
|
|
134
|
+
return routeMenu.findMenuData(menuKey);
|
|
135
|
+
|
|
136
|
+
}
|
|
137
|
+
const setMenuConfig=(params)=>{
|
|
138
|
+
routeMenu.setMenuConfig(params);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
useEffect(()=>{
|
|
143
|
+
let menus= routeMenu.getOpenMenus(curLocation.pathname);
|
|
144
|
+
let keys=menus.map(item=>item.key);
|
|
145
|
+
setSelectMenus({menus,keys});
|
|
146
|
+
},[curLocation,routeMenu.source]);
|
|
147
|
+
|
|
148
|
+
useEffect(()=>{
|
|
149
|
+
getTopMenu();
|
|
150
|
+
getLeftMenu();
|
|
151
|
+
},[routeMenu.source,curLocation,userAuth])
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
return {leftMenu,topMenu,reload,selectMenus,findMenuData,setMenuConfig,setUserAuth}
|
|
20
156
|
}
|
|
21
157
|
const App = createContainer(useProvider);
|
|
22
158
|
|
|
@@ -10,7 +10,7 @@ import PageLoading from '@/components/page/pageLoading';
|
|
|
10
10
|
import Login from '@/pages/login';
|
|
11
11
|
import {AuthLogin} from '@/components/auth';
|
|
12
12
|
import LeftMenu from '@/components/menu';
|
|
13
|
-
import TopMenu from '@/components/topMenu';
|
|
13
|
+
import TopMenu from '@/components/menu/topMenu';
|
|
14
14
|
|
|
15
15
|
import ProviderMenu from '@/provider/menu';
|
|
16
16
|
|
|
@@ -25,15 +25,8 @@ const delayLoader=(loader)=>{
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
const Suggest = React.lazy(()=>import('@/pages/suggest'));
|
|
31
|
-
const Order = React.lazy(()=>import('@/pages/order'));
|
|
32
|
-
const Permission = React.lazy(()=>import('@/pages/permission'));
|
|
33
|
-
const Material = React.lazy(()=>import('@/pages/material'));
|
|
34
|
-
|
|
35
|
-
const User = React.lazy(()=>import('@/pages/user'));
|
|
36
|
-
const UserData = React.lazy(()=>import('@/pages/userData'));
|
|
28
|
+
const Page1 = React.lazy(()=>import('@/pages/demo/page1'));
|
|
29
|
+
const Page1Detail = React.lazy(()=>import('@/pages/demo/detail'));
|
|
37
30
|
|
|
38
31
|
import SuperAdminLogin from '@/pages/superAdminLogin';
|
|
39
32
|
|
|
@@ -54,14 +47,24 @@ export const RouteList = (
|
|
|
54
47
|
</ProviderMenu.Provider>
|
|
55
48
|
}
|
|
56
49
|
>
|
|
57
|
-
<Route path='/' element={<Navigate to="/
|
|
58
|
-
<Route path='/
|
|
59
|
-
<Route path='/
|
|
60
|
-
<Route path='/
|
|
61
|
-
<Route path='/
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
<Route path='/
|
|
50
|
+
<Route path='/' element={<Navigate to="/demo/page1"></Navigate> } />
|
|
51
|
+
<Route path='/demo/page1' element={<Page1 label='内容管理1' />} />
|
|
52
|
+
<Route path='/demo/page2' element={<Page1 label='内容管理2' />} />
|
|
53
|
+
<Route path='/demo/page1/detail/:id' element={<Page1Detail />} />
|
|
54
|
+
<Route path='/demo/page2/detail/:id' element={<Page1Detail />} />
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
<Route path='/demo/data/page1' element={<Page1 label='数据管理1' />} />
|
|
58
|
+
<Route path='/demo/data/page2' element={<Page1 label='数据管理2' />} />
|
|
59
|
+
<Route path='/demo/data/page1/detail/:id' element={<Page1Detail />} />
|
|
60
|
+
<Route path='/demo/data/page2/detail/:id' element={<Page1Detail />} />
|
|
61
|
+
|
|
62
|
+
<Route path='/demo/admin' element={<Navigate to="/demo/admin/page1"></Navigate> } />
|
|
63
|
+
<Route path='/demo/admin/page1' element={<Page1 label='权限管理1' />} />
|
|
64
|
+
<Route path='/demo/admin/page2' element={<Page1 label='权限管理2' />} />
|
|
65
|
+
<Route path='/demo/admin/page1/detail/:id' element={<Page1Detail />} />
|
|
66
|
+
<Route path='/demo/admin/page2/detail/:id' element={<Page1Detail />} />
|
|
67
|
+
|
|
65
68
|
|
|
66
69
|
</Route>
|
|
67
70
|
</Route>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import {GET_DEFAULT,POST_DEFAULT,API_ROOT,RESPONSE_STRUCT} from './index.js';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export function GET_LIST(params) {
|
|
8
|
+
return GET_DEFAULT(`${API_ROOT}/api/demo/list`,params);
|
|
9
|
+
}
|
|
10
|
+
export function GET_DETAIL(params) {
|
|
11
|
+
return GET_DEFAULT(`${API_ROOT}/api/demo/detail`,params);
|
|
12
|
+
}
|
|
13
|
+
export function CREATE(params) {
|
|
14
|
+
return POST_DEFAULT(`${API_ROOT}/api/demo/create`,params)
|
|
15
|
+
}
|
|
16
|
+
export function UPDATE(params) {
|
|
17
|
+
return POST_DEFAULT(`${API_ROOT}/api/demo/update`,params)
|
|
18
|
+
}
|
|
19
|
+
export function GET_USER_INFO(){
|
|
20
|
+
return GET_DEFAULT(`${API_ROOT}/api/demo/userInfo`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function GET_ENUM_TYPE(){
|
|
24
|
+
return GET_DEFAULT(`${API_ROOT}/api/demo/enumType`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const FormatTableService = (response)=>{
|
|
28
|
+
let req={
|
|
29
|
+
code:response[RESPONSE_STRUCT.CODE]||0,
|
|
30
|
+
data:response[RESPONSE_STRUCT.DATA]||null,
|
|
31
|
+
msg:response[RESPONSE_STRUCT.MSG]||''
|
|
32
|
+
};
|
|
33
|
+
if(response[RESPONSE_STRUCT.PAGINATION]){
|
|
34
|
+
req.page = response[RESPONSE_STRUCT.PAGINATION]
|
|
35
|
+
}
|
|
36
|
+
return req;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
export function Login(params={
|
|
41
|
+
username:'',
|
|
42
|
+
password:'',
|
|
43
|
+
}){
|
|
44
|
+
return POST_DEFAULT(`${API_ROOT}/api/demo/login`,params)
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function KssoLogin(params={
|
|
49
|
+
code:'',
|
|
50
|
+
redirectUri:'',
|
|
51
|
+
}){
|
|
52
|
+
return POST_DEFAULT(`${API_ROOT}/api/demo/ksso/auth`,params)
|
|
53
|
+
|
|
54
|
+
}
|
|
@@ -13,6 +13,15 @@ export const API_ROOT = API_HOST;
|
|
|
13
13
|
const tokenMode='header';//header,cookie
|
|
14
14
|
const tokenName='Authorization';
|
|
15
15
|
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
export const RESPONSE_STRUCT={
|
|
19
|
+
CODE:'code',
|
|
20
|
+
MSG:'msg',
|
|
21
|
+
DATA:'data',
|
|
22
|
+
PAGINATION:'pagination'
|
|
23
|
+
}
|
|
24
|
+
|
|
16
25
|
let Modal = {
|
|
17
26
|
error: (options) => {
|
|
18
27
|
message.error(options.content);
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* 格式化为货币格式
|
|
4
|
+
* @param {string|number} value - 数值
|
|
5
|
+
* @param {number} decimal=2 - 格式化到小数点后几位
|
|
6
|
+
* @param {object} extra - 扩展参数
|
|
7
|
+
* @returns {string} 格式化后的字符串
|
|
8
|
+
*/
|
|
9
|
+
export const formatMoney=(value,decimal=2,extra={noValue:'-',carry:false})=>{
|
|
10
|
+
const {noValue='-',carry=false}=extra;
|
|
11
|
+
try{
|
|
12
|
+
value = parseFloat(`${value}`);
|
|
13
|
+
if(Number.isNaN(value)){
|
|
14
|
+
value='';
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if(carry){
|
|
18
|
+
value = value.toFixed(decimal);
|
|
19
|
+
}else{
|
|
20
|
+
value = value.toFixed(decimal+1);
|
|
21
|
+
value = value.slice(0,-1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch(ex){
|
|
25
|
+
value='';
|
|
26
|
+
}finally{
|
|
27
|
+
if(value===''){
|
|
28
|
+
return noValue||'';
|
|
29
|
+
}
|
|
30
|
+
return `${value}`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const formatText=(value,extra={noValue:'-'})=>{
|
|
35
|
+
const {noValue='-'}= extra;
|
|
36
|
+
if(!value){
|
|
37
|
+
if(noValue)return noValue;
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
export const formatPhone=(value,extra={noValue:'-'})=>{
|
|
44
|
+
const {noValue='-'}= extra;
|
|
45
|
+
if(!value){
|
|
46
|
+
if(noValue)return noValue;
|
|
47
|
+
}
|
|
48
|
+
return value.replace(/(\d)(?=(\d{4})+$)/g, '$1-');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|