kn-cli 1.0.93 → 1.0.95
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/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/topMenu/index.jsx +28 -15
- package/templates/template_admin/public/src/components/table/index.jsx +62 -0
- package/templates/template_admin/public/src/dictionary/index.js +45 -3
- package/templates/template_admin/public/src/mock/demo.js +184 -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 +20 -10
- package/templates/template_admin/public/src/provider/menu.jsx +58 -173
- package/templates/template_admin/public/src/route.jsx +19 -25
- 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/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/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -42,6 +42,7 @@ const TopMenu=()=>{
|
|
|
42
42
|
return req;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
|
|
45
46
|
const reload= async ()=>{
|
|
46
47
|
providerMenu.reload();
|
|
47
48
|
}
|
|
@@ -53,15 +54,24 @@ const TopMenu=()=>{
|
|
|
53
54
|
setMenus(menuList);
|
|
54
55
|
},[providerMenu.topMenu]);
|
|
55
56
|
|
|
57
|
+
useEffect(()=>{
|
|
58
|
+
providerMenu.setUserAuth(app.user.authorities||[]);
|
|
59
|
+
},[app.user])
|
|
60
|
+
|
|
56
61
|
useEffect(()=>{
|
|
57
62
|
reload();
|
|
58
63
|
},[])
|
|
59
64
|
|
|
60
65
|
|
|
61
66
|
// 推出登录
|
|
62
|
-
const onAvatarClick = (
|
|
63
|
-
if
|
|
67
|
+
const onAvatarClick = (key)=>{
|
|
68
|
+
if(key==='user'){
|
|
69
|
+
app.updateUserInfo();
|
|
70
|
+
}
|
|
71
|
+
else if (key === 'logout') {
|
|
64
72
|
app.logout();
|
|
73
|
+
}else if(key=='relogin'){
|
|
74
|
+
navigate('/superAdminLogin')
|
|
65
75
|
}
|
|
66
76
|
}
|
|
67
77
|
const onHome=()=>{
|
|
@@ -73,6 +83,7 @@ const TopMenu=()=>{
|
|
|
73
83
|
navigate(menu.url);
|
|
74
84
|
}
|
|
75
85
|
|
|
86
|
+
|
|
76
87
|
return (
|
|
77
88
|
<section className={styles.topMenu}>
|
|
78
89
|
<div className={styles.left}>
|
|
@@ -81,7 +92,7 @@ const TopMenu=()=>{
|
|
|
81
92
|
|
|
82
93
|
<div className={styles.center}>
|
|
83
94
|
{
|
|
84
|
-
menus&&menus.length
|
|
95
|
+
menus&&menus.length>=1&&
|
|
85
96
|
<Menu
|
|
86
97
|
items={menus}
|
|
87
98
|
mode="horizontal"
|
|
@@ -94,19 +105,21 @@ const TopMenu=()=>{
|
|
|
94
105
|
<div className={styles.right}>
|
|
95
106
|
|
|
96
107
|
<span className={styles.username}>Hi,{app?.user?.username||''}!</span>
|
|
97
|
-
<Dropdown menu={
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
108
|
+
<Dropdown menu={{items:[
|
|
109
|
+
{
|
|
110
|
+
key:'user',
|
|
111
|
+
label:<span onClick={onAvatarClick.bind(this,'user')}><UserOutlined />刷新用户权限</span>
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
key:'relogin',
|
|
115
|
+
label:<span onClick={onAvatarClick.bind(this,'relogin')}><UserOutlined />重新登录</span>
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
key:'logout',
|
|
119
|
+
label:<span onClick={onAvatarClick.bind(this,'logout')}><LogoutOutlined />退出登录</span>
|
|
120
|
+
}
|
|
103
121
|
|
|
104
|
-
|
|
105
|
-
<LogoutOutlined />
|
|
106
|
-
退出登录
|
|
107
|
-
</Menu.Item>
|
|
108
|
-
</Menu>
|
|
109
|
-
)}>
|
|
122
|
+
]}}>
|
|
110
123
|
<img className={styles.avatar} src={imgAvatar}/>
|
|
111
124
|
</Dropdown>
|
|
112
125
|
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React,{useCallback} from 'react';
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
import { Table } from 'antd';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 页面公共Table组件
|
|
7
|
+
* @param {object} [props]
|
|
8
|
+
* @param {string} [props.rowKey] - Table主键
|
|
9
|
+
* @param {boolean} [props.loading] - 是否加载中
|
|
10
|
+
* @param {Array} [props.columns] - 表格列
|
|
11
|
+
* @param {Array} [props.dataSource] - 数据数组
|
|
12
|
+
* @param {object} [props.pagination] - 分页器,参考配置项或 pagination 文档,设为 false 时不展示和进行分页
|
|
13
|
+
* @param {object} [props.scroll] - 表格是否可滚动
|
|
14
|
+
* @param {object} [props.page] - 表格数据,包括数据数组、分页参数、loading等
|
|
15
|
+
*
|
|
16
|
+
* @returns {JSX.Element}
|
|
17
|
+
*/
|
|
18
|
+
const PageTable = (props) => {
|
|
19
|
+
const {
|
|
20
|
+
rowKey,
|
|
21
|
+
loading,
|
|
22
|
+
columns,
|
|
23
|
+
dataSource,
|
|
24
|
+
pagination,
|
|
25
|
+
scroll,
|
|
26
|
+
page,
|
|
27
|
+
...others
|
|
28
|
+
} = props;
|
|
29
|
+
|
|
30
|
+
const paginationFn = useCallback(() => {
|
|
31
|
+
// pagination=false时不分页
|
|
32
|
+
if (typeof pagination === 'boolean') {
|
|
33
|
+
return pagination;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
pageSizeOptions: [10, 15, 20, 50, 100],
|
|
37
|
+
current: page?.pagination?.current,
|
|
38
|
+
pageSize: page?.pagination?.pageSize,
|
|
39
|
+
total: page?.pagination?.total,
|
|
40
|
+
showTotal: (total) => `总计${total}条`,
|
|
41
|
+
...pagination,
|
|
42
|
+
};
|
|
43
|
+
}, [pagination, page]);
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<Table
|
|
47
|
+
rowKey={rowKey ?? 'id'}
|
|
48
|
+
bordered
|
|
49
|
+
size="small"
|
|
50
|
+
loading={loading ?? page?.loading?.state}
|
|
51
|
+
columns={columns}
|
|
52
|
+
dataSource={
|
|
53
|
+
dataSource ?? (page?.data?.[page?.pagination?.current - 1] || [])
|
|
54
|
+
}
|
|
55
|
+
pagination={paginationFn()}
|
|
56
|
+
scroll={scroll ?? { y: 500 }}
|
|
57
|
+
{...others}
|
|
58
|
+
/>
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export default PageTable;
|
|
@@ -6,10 +6,40 @@ import {useDictionary} from 'kn-hooks';
|
|
|
6
6
|
// @ts-ignore
|
|
7
7
|
import {Select,Radio} from 'antd';
|
|
8
8
|
|
|
9
|
-
import {
|
|
9
|
+
import {GET_ENUM_TYPE} from '@/services/demo'
|
|
10
|
+
|
|
10
11
|
import ShowToast from '@/components/toast';
|
|
11
12
|
|
|
12
13
|
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @typedef DictionaryItem
|
|
17
|
+
* 字典数据的结构
|
|
18
|
+
* @property {string} id - 数据唯一ID
|
|
19
|
+
* @property {string} name - 数据唯一id对应的别名
|
|
20
|
+
* @property {string} label - 展示给用户看的文字
|
|
21
|
+
*
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @typedef UseDictionaryResult
|
|
26
|
+
* @property {DictionaryItem[]} types - 字典数据列表
|
|
27
|
+
* @property {ReactDOM[]} selectOptions - 供Antd渲染\<Select\>的列表
|
|
28
|
+
* @property {ReactDOM[]} radioOptions - 供Antd渲染\<Radio\>的列表
|
|
29
|
+
* @property {function} getId - (labelOrName:string)=>string,搜索字典项中,label或name匹配labelOrName的项目,返回其id的值
|
|
30
|
+
* @property {function} getName - (id:string)=>string,搜索字典项中,id匹配id的项目,返回其name的值
|
|
31
|
+
* @property {function} getLabel - (id:string)=>string,搜索字典项中,id匹配id的项目,返回其label的值
|
|
32
|
+
* @property {function} reload - ()=>void,重新调用字典接口刷新字典列表
|
|
33
|
+
*
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @callback UseDictionary
|
|
38
|
+
* @returns {UseDictionaryResult}
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
13
43
|
export const SelectOption=(props)=>{
|
|
14
44
|
const {value}=props;
|
|
15
45
|
const name = props['data-keyname'];
|
|
@@ -24,8 +54,8 @@ export const SelectOption=(props)=>{
|
|
|
24
54
|
useDictionary.SetConfig({SelectOption:Select.Option, RadioOption: Radio })
|
|
25
55
|
|
|
26
56
|
|
|
27
|
-
export const
|
|
28
|
-
api:
|
|
57
|
+
export const useDemoType = useDictionary.createDictionary({
|
|
58
|
+
api:GET_ENUM_TYPE,
|
|
29
59
|
afterApi:(response)=>{
|
|
30
60
|
if(response?.code==0){
|
|
31
61
|
let req= response.data.map(item=>{
|
|
@@ -45,3 +75,15 @@ export const useTaskState= useDictionary.createDictionary({
|
|
|
45
75
|
]
|
|
46
76
|
});
|
|
47
77
|
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* 健康状态
|
|
81
|
+
* @type UseDictionary
|
|
82
|
+
*/
|
|
83
|
+
export const useHealthy= useDictionary.createDictionary({
|
|
84
|
+
defaultTypes:[
|
|
85
|
+
{label:'正常',id:'normal',name:'normal'},
|
|
86
|
+
{label:'异常',id:'abnormal',name:'abnormal'},
|
|
87
|
+
{label:'禁用',id:'disabled',name:'disabled'},
|
|
88
|
+
]
|
|
89
|
+
});
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import {GET_REQUEST,waitTime} from './utils';
|
|
2
|
+
import {RESPONSE_STRUCT} from '@/services';
|
|
3
|
+
// @ts-ignore
|
|
4
|
+
import moment from 'moment';
|
|
5
|
+
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
import avatar1 from '@/assets/images/avatars/1.png';
|
|
8
|
+
|
|
9
|
+
const MAX_TOTAL=98;
|
|
10
|
+
let UPDATE_COUNT=0;
|
|
11
|
+
let CREATE_COUNT=0;
|
|
12
|
+
let LIST=null;
|
|
13
|
+
|
|
14
|
+
function updateListData(){
|
|
15
|
+
let list=[];
|
|
16
|
+
const selectValue=['1','2','3','4','5','6']
|
|
17
|
+
|
|
18
|
+
const createData=(id)=>{
|
|
19
|
+
return {
|
|
20
|
+
id:`${id}`,
|
|
21
|
+
updateCount:UPDATE_COUNT,
|
|
22
|
+
name: `名称`+ `${id}`.padStart(2,'0'),
|
|
23
|
+
phone: `1370000`+ `${id}`.padStart(4,'0'),
|
|
24
|
+
date: moment().add(id,'minute').unix()*1000,//format('YYYY-MM-DD HH:mm:ss'),
|
|
25
|
+
select: selectValue[id%selectValue.length],
|
|
26
|
+
longName: `这是一个很长的名称`+ `${id}`.padStart(2,'0'),
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
for(let i=0;i<MAX_TOTAL;i++){
|
|
31
|
+
list.push(createData(i))
|
|
32
|
+
}
|
|
33
|
+
for(let i=0;i<CREATE_COUNT;i++){
|
|
34
|
+
list.push(createData(300+i))
|
|
35
|
+
}
|
|
36
|
+
LIST=list;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async function CREATE(req,res){
|
|
41
|
+
CREATE_COUNT++;
|
|
42
|
+
updateListData();
|
|
43
|
+
const query = JSON.parse(req.body);
|
|
44
|
+
await waitTime();
|
|
45
|
+
return {
|
|
46
|
+
[RESPONSE_STRUCT.CODE]:0,
|
|
47
|
+
[RESPONSE_STRUCT.DATA]:query,
|
|
48
|
+
[RESPONSE_STRUCT.MSG]:''
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function UPDATE(req,res){
|
|
53
|
+
UPDATE_COUNT++;
|
|
54
|
+
updateListData();
|
|
55
|
+
const query = JSON.parse(req.body);
|
|
56
|
+
await waitTime();
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
[RESPONSE_STRUCT.CODE]:0,
|
|
60
|
+
[RESPONSE_STRUCT.DATA]:query,
|
|
61
|
+
[RESPONSE_STRUCT.MSG]:''
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function GET_LIST(req){
|
|
66
|
+
const params = GET_REQUEST(req);
|
|
67
|
+
const {current,pageSize,...querys}= params;
|
|
68
|
+
if(!LIST)updateListData();
|
|
69
|
+
const strQuerys=JSON.stringify(querys);
|
|
70
|
+
let data=[];
|
|
71
|
+
let idx=(current-1)*pageSize;
|
|
72
|
+
for(let i=0;i<pageSize;i++){
|
|
73
|
+
if(idx>=MAX_TOTAL+CREATE_COUNT)break;
|
|
74
|
+
data.push({...LIST[idx],query:strQuerys});
|
|
75
|
+
idx++;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
[RESPONSE_STRUCT.CODE]:0,
|
|
79
|
+
[RESPONSE_STRUCT.DATA]:data,
|
|
80
|
+
[RESPONSE_STRUCT.PAGINATION]:{
|
|
81
|
+
current:current,
|
|
82
|
+
pageSize:pageSize,
|
|
83
|
+
total:MAX_TOTAL
|
|
84
|
+
},
|
|
85
|
+
[RESPONSE_STRUCT.MSG]:''
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function GET_DETAIL(req){
|
|
90
|
+
const params = GET_REQUEST(req);
|
|
91
|
+
const {id}= params;
|
|
92
|
+
if(!LIST)updateListData();
|
|
93
|
+
for(let item of LIST){
|
|
94
|
+
if(item.id == id){
|
|
95
|
+
return {
|
|
96
|
+
[RESPONSE_STRUCT.CODE]:0,
|
|
97
|
+
[RESPONSE_STRUCT.DATA]:item,
|
|
98
|
+
[RESPONSE_STRUCT.MSG]:''
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
[RESPONSE_STRUCT.CODE]:0,
|
|
104
|
+
[RESPONSE_STRUCT.DATA]:null,
|
|
105
|
+
[RESPONSE_STRUCT.MSG]:''
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
let GET_USER_INFO_COUNT=0;
|
|
112
|
+
let USER_INFO={
|
|
113
|
+
authorities:['leader','admin'],
|
|
114
|
+
realName:'cx',
|
|
115
|
+
name:'cx',
|
|
116
|
+
avater:avatar1,
|
|
117
|
+
unreadMsg:5,
|
|
118
|
+
token:'token',
|
|
119
|
+
username:'fanta',
|
|
120
|
+
};
|
|
121
|
+
function _GET_USER_INFO(){
|
|
122
|
+
let req = {...USER_INFO};
|
|
123
|
+
req.authorities = GET_USER_INFO_COUNT%2==0?['leader']:['leader','admin'];
|
|
124
|
+
GET_USER_INFO_COUNT++;
|
|
125
|
+
return req;
|
|
126
|
+
}
|
|
127
|
+
async function GET_USER_INFO(req){
|
|
128
|
+
await waitTime();
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
[RESPONSE_STRUCT.CODE]:0,
|
|
132
|
+
[RESPONSE_STRUCT.DATA]:_GET_USER_INFO(),
|
|
133
|
+
[RESPONSE_STRUCT.MSG]:''
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
async function Login(req,res){
|
|
139
|
+
const query = JSON.parse(req.body);
|
|
140
|
+
await waitTime();
|
|
141
|
+
return {
|
|
142
|
+
[RESPONSE_STRUCT.CODE]:0,
|
|
143
|
+
[RESPONSE_STRUCT.DATA]:_GET_USER_INFO(),
|
|
144
|
+
[RESPONSE_STRUCT.MSG]:''
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function KssoLogin(req,res){
|
|
149
|
+
await waitTime();
|
|
150
|
+
return {
|
|
151
|
+
[RESPONSE_STRUCT.CODE]:0,
|
|
152
|
+
[RESPONSE_STRUCT.DATA]:_GET_USER_INFO(),
|
|
153
|
+
[RESPONSE_STRUCT.MSG]:''
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
async function GET_ENUM_TYPE(req){
|
|
159
|
+
await waitTime();
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
[RESPONSE_STRUCT.CODE]:0,
|
|
163
|
+
[RESPONSE_STRUCT.DATA]:[
|
|
164
|
+
{label:'类型1',key:'type1',value:'value1'},
|
|
165
|
+
{label:'类型2',key:'type2',value:'value2'},
|
|
166
|
+
{label:'类型3',key:'type3',value:'value3'},
|
|
167
|
+
],
|
|
168
|
+
[RESPONSE_STRUCT.MSG]:''
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
export default {
|
|
174
|
+
'/demo/list':{get:GET_LIST},
|
|
175
|
+
'/demo/create':{post:CREATE},
|
|
176
|
+
'/demo/update':{post:UPDATE},
|
|
177
|
+
'/demo/detail':{get:GET_DETAIL},
|
|
178
|
+
'/demo/userInfo':{get:GET_USER_INFO},
|
|
179
|
+
'/demo/login':{post:Login},
|
|
180
|
+
'/demo/ksso/auth':{post:KssoLogin},
|
|
181
|
+
'/demo/enumType':{get:GET_ENUM_TYPE},
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
// @ts-ignore
|
|
1
2
|
import mock from 'mockjs-async';
|
|
2
3
|
|
|
3
|
-
import
|
|
4
|
+
import demo from './demo.js';
|
|
5
|
+
|
|
4
6
|
function regMock(list){
|
|
5
7
|
if(list){
|
|
6
8
|
let keys = Object.keys(list)
|
|
@@ -49,9 +51,10 @@ function regMock(list){
|
|
|
49
51
|
}
|
|
50
52
|
}
|
|
51
53
|
/* eslint-disable */
|
|
54
|
+
// @ts-ignore
|
|
52
55
|
if(MOCK){
|
|
53
56
|
console.log(`=========MOCK OPEN=======`)
|
|
54
|
-
regMock(
|
|
57
|
+
regMock(demo);
|
|
55
58
|
}else{
|
|
56
59
|
console.log(`=========MOCK CLOSE=======`)
|
|
57
60
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React, { useEffect, useState, useRef } from 'react';
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
import { useParams,useNavigate } from 'react-router-dom';
|
|
4
|
+
|
|
5
|
+
// @ts-ignore
|
|
6
|
+
import {Button} from 'antd';
|
|
7
|
+
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
import styles from '@/pages/demo/index.less';
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
const Detail=()=>{
|
|
14
|
+
const {id} = useParams();
|
|
15
|
+
const navigate= useNavigate();
|
|
16
|
+
const onBack=()=>{
|
|
17
|
+
window.history.back();
|
|
18
|
+
}
|
|
19
|
+
return (
|
|
20
|
+
<section className={styles.contentWrap}>
|
|
21
|
+
<p>id:{id}</p>
|
|
22
|
+
<Button type='primary' onClick={onBack}>返回</Button>
|
|
23
|
+
</section>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default Detail;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import ReactDom from 'react-dom';
|
|
3
|
+
// @ts-ignore
|
|
4
|
+
import moment from 'moment';
|
|
5
|
+
// @ts-ignore
|
|
6
|
+
import { Modal, Form, Input, Select, message, DatePicker,Spin } from 'antd';
|
|
7
|
+
import Popup from '@/components/popup';
|
|
8
|
+
import { GET_DETAIL,CREATE,UPDATE } from '@/services/demo';
|
|
9
|
+
import rule from '@/utils/rule';
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
const DialogEdit = (props) => {
|
|
14
|
+
const { destory, id=null } = props;
|
|
15
|
+
const [form] = Form.useForm();
|
|
16
|
+
const [record,setRecord]=useState(null)
|
|
17
|
+
|
|
18
|
+
const init=async ()=>{
|
|
19
|
+
if(id){
|
|
20
|
+
const req= await GET_DETAIL({id})
|
|
21
|
+
if(req?.code==0 && req?.data){
|
|
22
|
+
let item= req.data;
|
|
23
|
+
item.date = moment(item.date);
|
|
24
|
+
setRecord(item);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
setRecord({
|
|
29
|
+
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
const onOk = async () => {
|
|
33
|
+
try {
|
|
34
|
+
const values = await form.validateFields();
|
|
35
|
+
const params = {
|
|
36
|
+
...values,
|
|
37
|
+
};
|
|
38
|
+
let res = null;
|
|
39
|
+
if (id) {
|
|
40
|
+
res = await UPDATE({id,...params});
|
|
41
|
+
} else {
|
|
42
|
+
res = await CREATE(params);
|
|
43
|
+
}
|
|
44
|
+
if (res?.code === 0) {
|
|
45
|
+
message.success('成功');
|
|
46
|
+
destory && destory(true);
|
|
47
|
+
}
|
|
48
|
+
} catch (errorInfo) {
|
|
49
|
+
console.log('Failed:', errorInfo);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const onCancel = () => {
|
|
54
|
+
form.resetFields();
|
|
55
|
+
destory && destory(false);
|
|
56
|
+
};
|
|
57
|
+
useEffect(()=>{
|
|
58
|
+
init();
|
|
59
|
+
},[])
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<Modal
|
|
63
|
+
title={id? '编辑用户' : '新增用户'}
|
|
64
|
+
width={600}
|
|
65
|
+
open={true}
|
|
66
|
+
onOk={onOk}
|
|
67
|
+
onCancel={onCancel}
|
|
68
|
+
>
|
|
69
|
+
{
|
|
70
|
+
!record?
|
|
71
|
+
<Spin/>:
|
|
72
|
+
<Form labelCol={{ span: 5 }} wrapperCol={{ span: 19 }} form={form} initialValues={record||{}}>
|
|
73
|
+
<Form.Item label="姓名" name="name">
|
|
74
|
+
<Input placeholder="请输入" />
|
|
75
|
+
</Form.Item>
|
|
76
|
+
<Form.Item label="创建时间" name="date" rules={rule.SELECT} required>
|
|
77
|
+
<DatePicker style={{width:'100%'}}/>
|
|
78
|
+
</Form.Item>
|
|
79
|
+
|
|
80
|
+
<Form.Item
|
|
81
|
+
label="手机号码"
|
|
82
|
+
name="phone"
|
|
83
|
+
>
|
|
84
|
+
<Input />
|
|
85
|
+
</Form.Item>
|
|
86
|
+
|
|
87
|
+
<Form.Item label="绑定号码" name="select" required rules={rule.SELECT}>
|
|
88
|
+
<Select>
|
|
89
|
+
<Select.Option value={1}>1</Select.Option>
|
|
90
|
+
<Select.Option value={2}>2</Select.Option>
|
|
91
|
+
</Select>
|
|
92
|
+
</Form.Item>
|
|
93
|
+
</Form>
|
|
94
|
+
}
|
|
95
|
+
</Modal>
|
|
96
|
+
|
|
97
|
+
);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const ShowEdit = (props = {}) => {
|
|
101
|
+
return new Promise((resolve) => {
|
|
102
|
+
let popup = Popup(resolve);
|
|
103
|
+
ReactDom.render(
|
|
104
|
+
<DialogEdit destory={popup.destory} {...props} />,
|
|
105
|
+
popup.dom
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
export default ShowEdit;
|