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.
Files changed (43) hide show
  1. package/package.json +1 -1
  2. package/templates/template_admin/public/index.html +5 -2
  3. package/templates/template_admin/public/src/_antd.less +7 -1
  4. package/templates/template_admin/public/src/assets/images/avatars/1.png +0 -0
  5. package/templates/template_admin/public/src/assets/images/avatars/2.png +0 -0
  6. package/templates/template_admin/public/src/assets/images/avatars/3.png +0 -0
  7. package/templates/template_admin/public/src/components/layout/basic/index.less +3 -3
  8. package/templates/template_admin/public/src/components/menu/index.jsx +47 -100
  9. package/templates/template_admin/public/src/components/menu/topMenu/index.jsx +129 -0
  10. package/templates/template_admin/public/src/components/table/index.jsx +62 -0
  11. package/templates/template_admin/public/src/dictionary/index.js +49 -4
  12. package/templates/template_admin/public/src/hooks/index.jsx +4 -1
  13. package/templates/template_admin/public/src/hooks/useRouteMenu.jsx +232 -0
  14. package/templates/template_admin/public/src/mock/demo.js +177 -0
  15. package/templates/template_admin/public/src/mock/index.js +5 -2
  16. package/templates/template_admin/public/src/pages/demo/detail/index.jsx +27 -0
  17. package/templates/template_admin/public/src/pages/demo/edit/index.jsx +109 -0
  18. package/templates/template_admin/public/src/pages/demo/index.less +9 -0
  19. package/templates/template_admin/public/src/pages/demo/page1.jsx +161 -0
  20. package/templates/template_admin/public/src/pages/login/index.jsx +5 -4
  21. package/templates/template_admin/public/src/pages/superAdminLogin/index.jsx +9 -2
  22. package/templates/template_admin/public/src/provider/app.jsx +18 -8
  23. package/templates/template_admin/public/src/provider/menu.jsx +146 -10
  24. package/templates/template_admin/public/src/route.jsx +21 -18
  25. package/templates/template_admin/public/src/services/demo.js +54 -0
  26. package/templates/template_admin/public/src/services/index.js +9 -0
  27. package/templates/template_admin/public/src/utils/format.js +51 -0
  28. package/templates/template_admin/public/src/utils/rule.js +274 -0
  29. package/templates/template_admin/readme.md +4 -0
  30. package/templates/template_admin/public/src/components/topMenu/index.jsx +0 -267
  31. package/templates/template_admin/public/src/mock/auth.js +0 -91
  32. package/templates/template_admin/public/src/mock/user.js +0 -70
  33. package/templates/template_admin/public/src/pages/material/index.jsx +0 -84
  34. package/templates/template_admin/public/src/pages/order/index.jsx +0 -12
  35. package/templates/template_admin/public/src/pages/permission/index.jsx +0 -12
  36. package/templates/template_admin/public/src/pages/suggest/index.jsx +0 -12
  37. package/templates/template_admin/public/src/pages/user/index.jsx +0 -18
  38. package/templates/template_admin/public/src/pages/userData/index.jsx +0 -12
  39. package/templates/template_admin/public/src/pages/video/index.jsx +0 -65
  40. package/templates/template_admin/public/src/services/auth.js +0 -28
  41. package/templates/template_admin/public/src/services/user.js +0 -26
  42. package/templates/template_admin/public/src/services/video.js +0 -33
  43. /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
- import { useParams, useSearchParams,useNavigate } from 'react-router-dom';
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
- import ProviderApp from '@/provider/app';
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 {KSSO_LOGIN,LOGIN,LOGOUT} from '@/services/auth';
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 KSSO_LOGIN({code,redirectUri})
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 LOGIN({username,password});
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 {GET_MENU} from '@/services/auth';
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 reload= async ()=>{
12
- await GET_MENU();
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 action=useMemo(()=>{
15
- return {
16
- menus,setMenus
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
- },[menus,setMenus]);
19
- return action
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 Video = React.lazy(()=>import('@/pages/video'));
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="/video"></Navigate> } />
58
- <Route path='/video' element={<Video />} />
59
- <Route path='/suggest' element={<Suggest />} />
60
- <Route path='/order' element={<Order />} />
61
- <Route path='/permission' element={<Permission />} />
62
- <Route path='/material' element={<Material />} />
63
- <Route path='/user' element={<User />} />
64
- <Route path='/userData' element={<UserData />} />
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
+