commit
b2627a6b62
55 changed files with 57248 additions and 0 deletions
Split View
Diff Options
-
4.gitignore
-
2.npmrc
-
18lerna-debug.log
-
5lerna.json
-
24688package-lock.json
-
20package.json
-
19packages/bank-hooks/.fatherrc.ts
-
3packages/bank-hooks/.gitignore
-
23packages/bank-hooks/README.md
-
32packages/bank-hooks/package.json
-
4packages/bank-hooks/src/index.ts
-
8packages/bank-hooks/src/use-test.ts
-
16packages/bank-hooks/tsconfig.json
-
23packages/bizComponent/.fatherrc.ts
-
3packages/bizComponent/.gitignore
-
23packages/bizComponent/README.md
-
36packages/bizComponent/package.json
-
6packages/bizComponent/src/index.less
-
19packages/bizComponent/src/index.tsx
-
16packages/bizComponent/tsconfig.json
-
4packages/bizComponent/typings/global.d.ts
-
3project/.eslintrc.js
-
13project/.gitignore
-
17project/.lintstagedrc
-
3project/.prettierignore
-
8project/.prettierrc
-
3project/.stylelintrc.js
-
35project/.umirc.ts
-
3project/README.md
-
20project/mock/userAPI.ts
-
29project/package.json
-
10project/src/access.ts
-
16project/src/app.ts
-
0project/src/assets/.gitkeep
-
4project/src/components/Guide/Guide.less
-
23project/src/components/Guide/Guide.tsx
-
2project/src/components/Guide/index.ts
-
1project/src/constants/index.ts
-
13project/src/models/global.ts
-
21project/src/pages/Access/index.tsx
-
3project/src/pages/Home/index.less
-
18project/src/pages/Home/index.tsx
-
26project/src/pages/Table/components/CreateForm.tsx
-
138project/src/pages/Table/components/UpdateForm.tsx
-
270project/src/pages/Table/index.tsx
-
96project/src/services/demo/UserController.ts
-
7project/src/services/demo/index.ts
-
68project/src/services/demo/typings.d.ts
-
4project/src/utils/format.ts
-
3project/tsconfig.json
-
1project/typings.d.ts
-
9473project/yarn.lock
-
1readme.md
-
8448yarn-error.log
-
13496yarn.lock
@ -0,0 +1,4 @@ |
|||
node_modules/ |
|||
**/node_modules |
|||
|
|||
**/dist |
|||
@ -0,0 +1,2 @@ |
|||
registry=https://registry.npmmirror.com/ |
|||
|
|||
@ -0,0 +1,18 @@ |
|||
0 silly argv { |
|||
0 silly argv _: [ 'run' ], |
|||
0 silly argv scope: 'sgapp', |
|||
0 silly argv lernaVersion: '6.6.1', |
|||
0 silly argv '$0': 'C:\\Program Files\\nodejs\\node_modules\\lerna\\dist\\cli.js', |
|||
0 silly argv script: 'dev' |
|||
0 silly argv } |
|||
1 notice cli v6.6.1 |
|||
2 verbose rootPath E:\workspace\test |
|||
3 notice filter including "sgapp" |
|||
4 info filter [ 'sgapp' ] |
|||
5 error TypeError: Cannot read properties of undefined (reading 'split') |
|||
5 error at Minimatch.match (E:\workspace\test\node_modules\minimatch\minimatch.js:739:11) |
|||
5 error at E:\workspace\test\node_modules\minimatch\minimatch.js:717:15 |
|||
5 error at Array.filter (<anonymous>) |
|||
5 error at minimatch.match (E:\workspace\test\node_modules\minimatch\minimatch.js:716:15) |
|||
5 error at module.exports (E:\workspace\test\node_modules\multimatch\index.js:25:39) |
|||
5 error at filterPackages (E:\workspace\test\node_modules\lerna\dist\cli.js:2288:58) |
|||
@ -0,0 +1,5 @@ |
|||
{ |
|||
"$schema": "node_modules/lerna/schemas/lerna-schema.json", |
|||
"version": "0.0.3", |
|||
"useWorkspaces": true |
|||
} |
|||
24688
package-lock.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,20 @@ |
|||
{ |
|||
"name": "root", |
|||
"private": true, |
|||
"workspaces": [ |
|||
"packages/*" |
|||
], |
|||
"devDependencies": { |
|||
"@types/react": "^18.0.35", |
|||
"antd": "^5.4.2", |
|||
"babel-plugin-import": "^1.13.6", |
|||
"lerna": "^6.6.1", |
|||
"typescript": "^5.0.4" |
|||
}, |
|||
"scripts": { |
|||
"dev": "lerna exec npm run dev", |
|||
"build": "lerna exec npm run build", |
|||
"clean": "lerna exec -- rm -rf ./dist" |
|||
}, |
|||
"dependencies": {} |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
import { defineConfig } from 'father'; |
|||
|
|||
export default defineConfig({ |
|||
esm: { input: 'src', // 默认编译目录
|
|||
platform: 'browser', // 默认构建为 Browser 环境的产物
|
|||
transformer: 'babel', // 默认使用 babel 以提供更好的兼容性
|
|||
}, |
|||
|
|||
extraBabelPlugins: [ |
|||
[ |
|||
'babel-plugin-import', |
|||
{ |
|||
libraryName: 'antd', |
|||
libraryDirectory: 'es', |
|||
style: true, |
|||
}, |
|||
], |
|||
], |
|||
}); |
|||
@ -0,0 +1,3 @@ |
|||
/node_modules |
|||
/dist |
|||
.DS_Store |
|||
@ -0,0 +1,23 @@ |
|||
# @alipay/antbank-platform-ui |
|||
|
|||
[](https://npmjs.org/package/@alipay/antbank-platform-ui) |
|||
[](https://npmjs.org/package/@alipay/antbank-platform-ui) |
|||
|
|||
## Install |
|||
|
|||
```bash |
|||
$ yarn install |
|||
``` |
|||
|
|||
```bash |
|||
$ npm run dev |
|||
$ npm run build |
|||
``` |
|||
|
|||
## Options |
|||
|
|||
TODO |
|||
|
|||
## LICENSE |
|||
|
|||
MIT |
|||
@ -0,0 +1,32 @@ |
|||
{ |
|||
"name": "@lishican/antbank-platform-hooks", |
|||
"version": "0.0.4", |
|||
"description": "", |
|||
"module": "dist/esm/index.js", |
|||
"types": "dist/esm/index.d.ts", |
|||
"scripts": { |
|||
"dev": "father dev", |
|||
"build": "father build", |
|||
"build:deps": "father prebundle", |
|||
"prepublish": "npm run build" |
|||
}, |
|||
"keywords": [], |
|||
"authors": [], |
|||
"license": "MIT", |
|||
"files": [ |
|||
"dist", |
|||
"compiled" |
|||
], |
|||
"publishConfig": { |
|||
"access": "public" |
|||
}, |
|||
"devDependencies": { |
|||
"@babel/runtime": "^7.12.5", |
|||
"father": "^4.1.8" |
|||
}, |
|||
"peerDependencies": { |
|||
"antd": "^5.4.2", |
|||
"react": ">=16.9.0", |
|||
"react-dom": ">=16.9.0" |
|||
} |
|||
} |
|||
@ -0,0 +1,4 @@ |
|||
import useTask from './use-test' |
|||
export { |
|||
useTask |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
import { useEffect } from 'react'; |
|||
|
|||
const useTask = () => { |
|||
useEffect(() => { |
|||
console.log('useTask'); |
|||
}, []); |
|||
}; |
|||
export default useTask; |
|||
@ -0,0 +1,16 @@ |
|||
{ |
|||
"compilerOptions": { |
|||
"rootDir": "src", |
|||
"outDir": "dist", |
|||
"strict": true, |
|||
"jsx": "preserve", |
|||
"target": "esnext", |
|||
"module": "esnext", |
|||
"moduleResolution": "node", |
|||
"allowSyntheticDefaultImports": true, |
|||
"experimentalDecorators": true, |
|||
"resolveJsonModule": true, |
|||
"declaration": true |
|||
}, |
|||
"include": ["src/**/*", "typings/*"] |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
import { defineConfig } from 'father'; |
|||
|
|||
|
|||
|
|||
export default defineConfig({ |
|||
esm: { |
|||
input: "src", |
|||
platform: "browser", |
|||
transformer:"esbuild" |
|||
|
|||
}, |
|||
|
|||
extraBabelPlugins: [ |
|||
[ |
|||
'babel-plugin-import', |
|||
{ |
|||
libraryName: 'antd', |
|||
libraryDirectory: 'es', |
|||
style: true, |
|||
}, |
|||
], |
|||
], |
|||
}); |
|||
@ -0,0 +1,3 @@ |
|||
/node_modules |
|||
/dist |
|||
.DS_Store |
|||
@ -0,0 +1,23 @@ |
|||
# @alipay/antbank-platform-ui |
|||
|
|||
[](https://npmjs.org/package/@alipay/antbank-platform-ui) |
|||
[](https://npmjs.org/package/@alipay/antbank-platform-ui) |
|||
|
|||
## Install |
|||
|
|||
```bash |
|||
$ yarn install |
|||
``` |
|||
|
|||
```bash |
|||
$ npm run dev |
|||
$ npm run build |
|||
``` |
|||
|
|||
## Options |
|||
|
|||
TODO |
|||
|
|||
## LICENSE |
|||
|
|||
MIT |
|||
@ -0,0 +1,36 @@ |
|||
{ |
|||
"name": "@lishican/antbank-platform-ui", |
|||
"version": "0.0.4", |
|||
"description": "", |
|||
"module": "dist/esm/index.js", |
|||
"types": "dist/esm/index.d.ts", |
|||
"scripts": { |
|||
"dev": "father dev", |
|||
"build": "father build", |
|||
"build:deps": "father prebundle", |
|||
"prepublish": "npm run build" |
|||
}, |
|||
"keywords": [], |
|||
"authors": [], |
|||
"license": "MIT", |
|||
"files": [ |
|||
"dist", |
|||
"compiled" |
|||
], |
|||
"publishConfig": { |
|||
"access": "public" |
|||
}, |
|||
"devDependencies": { |
|||
"@babel/runtime": "^7.12.5", |
|||
"father": "^4.1.8" |
|||
}, |
|||
"peerDependencies": { |
|||
"antd": "^5.4.2", |
|||
"react": ">=16.9.0", |
|||
"react-dom": ">=16.9.0" |
|||
}, |
|||
"dependencies": { |
|||
"@lishican/antbank-platform-hooks": "^0.0.4", |
|||
"styled-components": "^5.3.9" |
|||
} |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
.red { |
|||
color: red; |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
import { useTask } from '@lishican/antbank-platform-hooks'; |
|||
import { Button } from 'antd'; |
|||
import React from 'react'; |
|||
import './index.less'; |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
const HelloWorld: React.FC<any> = () => { |
|||
useTask(); |
|||
return ( |
|||
<div> |
|||
<Button type="primary">3332</Button> |
|||
<h3 className='red'>2131</h3> |
|||
</div> |
|||
); |
|||
}; |
|||
export default HelloWorld; |
|||
@ -0,0 +1,16 @@ |
|||
{ |
|||
"compilerOptions": { |
|||
"rootDir": "src", |
|||
"outDir": "dist", |
|||
"strict": true, |
|||
"jsx": "preserve", |
|||
"target": "esnext", |
|||
"module": "esnext", |
|||
"moduleResolution": "node", |
|||
"allowSyntheticDefaultImports": true, |
|||
"experimentalDecorators": true, |
|||
"resolveJsonModule": true, |
|||
"declaration": true |
|||
}, |
|||
"include": ["src/**/*", "typings/*"] |
|||
} |
|||
@ -0,0 +1,4 @@ |
|||
declare module '*.less' { |
|||
const styles: { [className: string]: string }; |
|||
export default styles; |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
module.exports = { |
|||
extends: require.resolve('@umijs/max/eslint'), |
|||
}; |
|||
@ -0,0 +1,13 @@ |
|||
/node_modules |
|||
/.env.local |
|||
/.umirc.local.ts |
|||
/config/config.local.ts |
|||
/src/.umi |
|||
/src/.umi-production |
|||
/src/.umi-test |
|||
/.umi |
|||
/.umi-production |
|||
/.umi-test |
|||
/dist |
|||
/.mfsu |
|||
.swc |
|||
@ -0,0 +1,17 @@ |
|||
{ |
|||
"*.{md,json}": [ |
|||
"prettier --cache --write" |
|||
], |
|||
"*.{js,jsx}": [ |
|||
"max lint --fix --eslint-only", |
|||
"prettier --cache --write" |
|||
], |
|||
"*.{css,less}": [ |
|||
"max lint --fix --stylelint-only", |
|||
"prettier --cache --write" |
|||
], |
|||
"*.ts?(x)": [ |
|||
"max lint --fix --eslint-only", |
|||
"prettier --cache --parser=typescript --write" |
|||
] |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
node_modules |
|||
.umi |
|||
.umi-production |
|||
@ -0,0 +1,8 @@ |
|||
{ |
|||
"printWidth": 80, |
|||
"singleQuote": true, |
|||
"trailingComma": "all", |
|||
"proseWrap": "never", |
|||
"overrides": [{ "files": ".prettierrc", "options": { "parser": "json" } }], |
|||
"plugins": ["prettier-plugin-organize-imports", "prettier-plugin-packagejson"] |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
module.exports = { |
|||
extends: require.resolve('@umijs/max/stylelint'), |
|||
}; |
|||
@ -0,0 +1,35 @@ |
|||
import { defineConfig } from '@umijs/max'; |
|||
|
|||
export default defineConfig({ |
|||
antd: {}, |
|||
access: {}, |
|||
model: {}, |
|||
initialState: {}, |
|||
request: {}, |
|||
layout: { |
|||
title: '@umijs/max', |
|||
}, |
|||
routes: [ |
|||
{ |
|||
path: '/', |
|||
redirect: '/home', |
|||
}, |
|||
{ |
|||
name: '首页', |
|||
path: '/home', |
|||
component: './Home', |
|||
}, |
|||
{ |
|||
name: '权限演示', |
|||
path: '/access', |
|||
component: './Access', |
|||
}, |
|||
{ |
|||
name: ' CRUD 示例', |
|||
path: '/table', |
|||
component: './Table', |
|||
}, |
|||
], |
|||
npmClient: 'yarn', |
|||
}); |
|||
|
|||
@ -0,0 +1,3 @@ |
|||
# README |
|||
|
|||
`@umijs/max` 模板项目,更多功能参考 [Umi Max 简介](https://umijs.org/docs/max/introduce) |
|||
@ -0,0 +1,20 @@ |
|||
const users = [ |
|||
{ id: 0, name: 'Umi', nickName: 'U', gender: 'MALE' }, |
|||
{ id: 1, name: 'Fish', nickName: 'B', gender: 'FEMALE' }, |
|||
]; |
|||
|
|||
export default { |
|||
'GET /api/v1/queryUserList': (req: any, res: any) => { |
|||
res.json({ |
|||
success: true, |
|||
data: { list: users }, |
|||
errorCode: 0, |
|||
}); |
|||
}, |
|||
'PUT /api/v1/user/': (req: any, res: any) => { |
|||
res.json({ |
|||
success: true, |
|||
errorCode: 0, |
|||
}); |
|||
}, |
|||
}; |
|||
@ -0,0 +1,29 @@ |
|||
{ |
|||
"private": true, |
|||
"name": "sgapp", |
|||
"author": "lishican <1213782659@qq.com>", |
|||
"scripts": { |
|||
"build": "max build", |
|||
"dev": "max dev", |
|||
"format": "prettier --cache --write .", |
|||
"postinstall": "max setup", |
|||
"setup": "max setup", |
|||
"start": "npm run dev" |
|||
}, |
|||
"dependencies": { |
|||
"@ant-design/icons": "^5.0.1", |
|||
"@ant-design/pro-components": "2.4.4", |
|||
"@lishican/antbank-platform-ui": "*", |
|||
"@umijs/max": "^4.0.65", |
|||
"antd": "^5.4.0" |
|||
}, |
|||
"devDependencies": { |
|||
"@types/react": "^18.0.33", |
|||
"@types/react-dom": "^18.0.11", |
|||
"lint-staged": "^13.2.0", |
|||
"prettier": "^2.8.7", |
|||
"prettier-plugin-organize-imports": "^3.2.2", |
|||
"prettier-plugin-packagejson": "^2.4.3", |
|||
"typescript": "^5.0.3" |
|||
} |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
export default (initialState: API.UserInfo) => { |
|||
// 在这里按照初始化数据定义项目中的权限,统一管理
|
|||
// 参考文档 https://umijs.org/docs/max/access
|
|||
const canSeeAdmin = !!( |
|||
initialState && initialState.name !== 'dontHaveAccess' |
|||
); |
|||
return { |
|||
canSeeAdmin, |
|||
}; |
|||
}; |
|||
@ -0,0 +1,16 @@ |
|||
// 运行时配置
|
|||
|
|||
// 全局初始化数据配置,用于 Layout 用户信息和权限初始化
|
|||
// 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
|
|||
export async function getInitialState(): Promise<{ name: string }> { |
|||
return { name: '@umijs/max' }; |
|||
} |
|||
|
|||
export const layout = () => { |
|||
return { |
|||
logo: 'https://img.alicdn.com/tfs/TB1YHEpwUT1gK0jSZFhXXaAtVXa-28-27.svg', |
|||
menu: { |
|||
locale: false, |
|||
}, |
|||
}; |
|||
}; |
|||
@ -0,0 +1,4 @@ |
|||
.title { |
|||
margin: 0 auto; |
|||
font-weight: 200; |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
import { Layout, Row, Typography } from 'antd'; |
|||
import React from 'react'; |
|||
import styles from './Guide.less'; |
|||
|
|||
interface Props { |
|||
name: string; |
|||
} |
|||
|
|||
// 脚手架示例组件
|
|||
const Guide: React.FC<Props> = (props) => { |
|||
const { name } = props; |
|||
return ( |
|||
<Layout> |
|||
<Row> |
|||
<Typography.Title level={3} className={styles.title}> |
|||
欢迎使用 <strong>{name}</strong> ! |
|||
</Typography.Title> |
|||
</Row> |
|||
</Layout> |
|||
); |
|||
}; |
|||
|
|||
export default Guide; |
|||
@ -0,0 +1,2 @@ |
|||
import Guide from './Guide'; |
|||
export default Guide; |
|||
@ -0,0 +1 @@ |
|||
export const DEFAULT_NAME = 'Umi Max'; |
|||
@ -0,0 +1,13 @@ |
|||
// 全局共享数据示例
|
|||
import { DEFAULT_NAME } from '@/constants'; |
|||
import { useState } from 'react'; |
|||
|
|||
const useUser = () => { |
|||
const [name, setName] = useState<string>(DEFAULT_NAME); |
|||
return { |
|||
name, |
|||
setName, |
|||
}; |
|||
}; |
|||
|
|||
export default useUser; |
|||
@ -0,0 +1,21 @@ |
|||
import { PageContainer } from '@ant-design/pro-components'; |
|||
import { Access, useAccess } from '@umijs/max'; |
|||
import { Button } from 'antd'; |
|||
|
|||
const AccessPage: React.FC = () => { |
|||
const access = useAccess(); |
|||
return ( |
|||
<PageContainer |
|||
ghost |
|||
header={{ |
|||
title: '权限示例', |
|||
}} |
|||
> |
|||
<Access accessible={access.canSeeAdmin}> |
|||
<Button>只有 Admin 可以看到这个按钮</Button> |
|||
</Access> |
|||
</PageContainer> |
|||
); |
|||
}; |
|||
|
|||
export default AccessPage; |
|||
@ -0,0 +1,3 @@ |
|||
.container { |
|||
padding-top: 80px; |
|||
} |
|||
@ -0,0 +1,18 @@ |
|||
import Guide from '@/components/Guide'; |
|||
import { trim } from '@/utils/format'; |
|||
import { PageContainer } from '@ant-design/pro-components'; |
|||
import { useModel } from '@umijs/max'; |
|||
import styles from './index.less'; |
|||
import Test from '@lishican/antbank-platform-ui' |
|||
|
|||
const HomePage: React.FC = () => { |
|||
return ( |
|||
<PageContainer ghost> |
|||
<div className={styles.container}> |
|||
<Test/> |
|||
</div> |
|||
</PageContainer> |
|||
); |
|||
}; |
|||
|
|||
export default HomePage; |
|||
@ -0,0 +1,26 @@ |
|||
import { Modal } from 'antd'; |
|||
import React, { PropsWithChildren } from 'react'; |
|||
|
|||
interface CreateFormProps { |
|||
modalVisible: boolean; |
|||
onCancel: () => void; |
|||
} |
|||
|
|||
const CreateForm: React.FC<PropsWithChildren<CreateFormProps>> = (props) => { |
|||
const { modalVisible, onCancel } = props; |
|||
|
|||
return ( |
|||
<Modal |
|||
destroyOnClose |
|||
title="新建" |
|||
width={420} |
|||
open={modalVisible} |
|||
onCancel={() => onCancel()} |
|||
footer={null} |
|||
> |
|||
{props.children} |
|||
</Modal> |
|||
); |
|||
}; |
|||
|
|||
export default CreateForm; |
|||
@ -0,0 +1,138 @@ |
|||
import { |
|||
ProFormDateTimePicker, |
|||
ProFormRadio, |
|||
ProFormSelect, |
|||
ProFormText, |
|||
ProFormTextArea, |
|||
StepsForm, |
|||
} from '@ant-design/pro-components'; |
|||
import { Modal } from 'antd'; |
|||
import React from 'react'; |
|||
|
|||
export interface FormValueType extends Partial<API.UserInfo> { |
|||
target?: string; |
|||
template?: string; |
|||
type?: string; |
|||
time?: string; |
|||
frequency?: string; |
|||
} |
|||
|
|||
export interface UpdateFormProps { |
|||
onCancel: (flag?: boolean, formVals?: FormValueType) => void; |
|||
onSubmit: (values: FormValueType) => Promise<void>; |
|||
updateModalVisible: boolean; |
|||
values: Partial<API.UserInfo>; |
|||
} |
|||
|
|||
const UpdateForm: React.FC<UpdateFormProps> = (props) => ( |
|||
<StepsForm |
|||
stepsProps={{ |
|||
size: 'small', |
|||
}} |
|||
stepsFormRender={(dom, submitter) => { |
|||
return ( |
|||
<Modal |
|||
width={640} |
|||
bodyStyle={{ padding: '32px 40px 48px' }} |
|||
destroyOnClose |
|||
title="规则配置" |
|||
open={props.updateModalVisible} |
|||
footer={submitter} |
|||
onCancel={() => props.onCancel()} |
|||
> |
|||
{dom} |
|||
</Modal> |
|||
); |
|||
}} |
|||
onFinish={props.onSubmit} |
|||
> |
|||
<StepsForm.StepForm |
|||
initialValues={{ |
|||
name: props.values.name, |
|||
nickName: props.values.nickName, |
|||
}} |
|||
title="基本信息" |
|||
> |
|||
<ProFormText |
|||
width="md" |
|||
name="name" |
|||
label="规则名称" |
|||
rules={[{ required: true, message: '请输入规则名称!' }]} |
|||
/> |
|||
<ProFormTextArea |
|||
name="desc" |
|||
width="md" |
|||
label="规则描述" |
|||
placeholder="请输入至少五个字符" |
|||
rules={[ |
|||
{ required: true, message: '请输入至少五个字符的规则描述!', min: 5 }, |
|||
]} |
|||
/> |
|||
</StepsForm.StepForm> |
|||
<StepsForm.StepForm |
|||
initialValues={{ |
|||
target: '0', |
|||
template: '0', |
|||
}} |
|||
title="配置规则属性" |
|||
> |
|||
<ProFormSelect |
|||
width="md" |
|||
name="target" |
|||
label="监控对象" |
|||
valueEnum={{ |
|||
0: '表一', |
|||
1: '表二', |
|||
}} |
|||
/> |
|||
<ProFormSelect |
|||
width="md" |
|||
name="template" |
|||
label="规则模板" |
|||
valueEnum={{ |
|||
0: '规则模板一', |
|||
1: '规则模板二', |
|||
}} |
|||
/> |
|||
<ProFormRadio.Group |
|||
name="type" |
|||
width="md" |
|||
label="规则类型" |
|||
options={[ |
|||
{ |
|||
value: '0', |
|||
label: '强', |
|||
}, |
|||
{ |
|||
value: '1', |
|||
label: '弱', |
|||
}, |
|||
]} |
|||
/> |
|||
</StepsForm.StepForm> |
|||
<StepsForm.StepForm |
|||
initialValues={{ |
|||
type: '1', |
|||
frequency: 'month', |
|||
}} |
|||
title="设定调度周期" |
|||
> |
|||
<ProFormDateTimePicker |
|||
name="time" |
|||
label="开始时间" |
|||
rules={[{ required: true, message: '请选择开始时间!' }]} |
|||
/> |
|||
<ProFormSelect |
|||
name="frequency" |
|||
label="监控对象" |
|||
width="xs" |
|||
valueEnum={{ |
|||
month: '月', |
|||
week: '周', |
|||
}} |
|||
/> |
|||
</StepsForm.StepForm> |
|||
</StepsForm> |
|||
); |
|||
|
|||
export default UpdateForm; |
|||
@ -0,0 +1,270 @@ |
|||
import services from '@/services/demo'; |
|||
import { |
|||
ActionType, |
|||
FooterToolbar, |
|||
PageContainer, |
|||
ProDescriptions, |
|||
ProDescriptionsItemProps, |
|||
ProTable, |
|||
} from '@ant-design/pro-components'; |
|||
import { Button, Divider, Drawer, message } from 'antd'; |
|||
import React, { useRef, useState } from 'react'; |
|||
import CreateForm from './components/CreateForm'; |
|||
import UpdateForm, { FormValueType } from './components/UpdateForm'; |
|||
|
|||
const { addUser, queryUserList, deleteUser, modifyUser } = |
|||
services.UserController; |
|||
|
|||
/** |
|||
* 添加节点 |
|||
* @param fields |
|||
*/ |
|||
const handleAdd = async (fields: API.UserInfo) => { |
|||
const hide = message.loading('正在添加'); |
|||
try { |
|||
await addUser({ ...fields }); |
|||
hide(); |
|||
message.success('添加成功'); |
|||
return true; |
|||
} catch (error) { |
|||
hide(); |
|||
message.error('添加失败请重试!'); |
|||
return false; |
|||
} |
|||
}; |
|||
|
|||
/** |
|||
* 更新节点 |
|||
* @param fields |
|||
*/ |
|||
const handleUpdate = async (fields: FormValueType) => { |
|||
const hide = message.loading('正在配置'); |
|||
try { |
|||
await modifyUser( |
|||
{ |
|||
userId: fields.id || '', |
|||
}, |
|||
{ |
|||
name: fields.name || '', |
|||
nickName: fields.nickName || '', |
|||
email: fields.email || '', |
|||
}, |
|||
); |
|||
hide(); |
|||
|
|||
message.success('配置成功'); |
|||
return true; |
|||
} catch (error) { |
|||
hide(); |
|||
message.error('配置失败请重试!'); |
|||
return false; |
|||
} |
|||
}; |
|||
|
|||
/** |
|||
* 删除节点 |
|||
* @param selectedRows |
|||
*/ |
|||
const handleRemove = async (selectedRows: API.UserInfo[]) => { |
|||
const hide = message.loading('正在删除'); |
|||
if (!selectedRows) return true; |
|||
try { |
|||
await deleteUser({ |
|||
userId: selectedRows.find((row) => row.id)?.id || '', |
|||
}); |
|||
hide(); |
|||
message.success('删除成功,即将刷新'); |
|||
return true; |
|||
} catch (error) { |
|||
hide(); |
|||
message.error('删除失败,请重试'); |
|||
return false; |
|||
} |
|||
}; |
|||
|
|||
const TableList: React.FC<unknown> = () => { |
|||
const [createModalVisible, handleModalVisible] = useState<boolean>(false); |
|||
const [updateModalVisible, handleUpdateModalVisible] = |
|||
useState<boolean>(false); |
|||
const [stepFormValues, setStepFormValues] = useState({}); |
|||
const actionRef = useRef<ActionType>(); |
|||
const [row, setRow] = useState<API.UserInfo>(); |
|||
const [selectedRowsState, setSelectedRows] = useState<API.UserInfo[]>([]); |
|||
const columns: ProDescriptionsItemProps<API.UserInfo>[] = [ |
|||
{ |
|||
title: '名称', |
|||
dataIndex: 'name', |
|||
tip: '名称是唯一的 key', |
|||
formItemProps: { |
|||
rules: [ |
|||
{ |
|||
required: true, |
|||
message: '名称为必填项', |
|||
}, |
|||
], |
|||
}, |
|||
}, |
|||
{ |
|||
title: '昵称', |
|||
dataIndex: 'nickName', |
|||
valueType: 'text', |
|||
}, |
|||
{ |
|||
title: '性别', |
|||
dataIndex: 'gender', |
|||
hideInForm: true, |
|||
valueEnum: { |
|||
0: { text: '男', status: 'MALE' }, |
|||
1: { text: '女', status: 'FEMALE' }, |
|||
}, |
|||
}, |
|||
{ |
|||
title: '操作', |
|||
dataIndex: 'option', |
|||
valueType: 'option', |
|||
render: (_, record) => ( |
|||
<> |
|||
<a |
|||
onClick={() => { |
|||
handleUpdateModalVisible(true); |
|||
setStepFormValues(record); |
|||
}} |
|||
> |
|||
配置 |
|||
</a> |
|||
<Divider type="vertical" /> |
|||
<a href="">订阅警报</a> |
|||
</> |
|||
), |
|||
}, |
|||
]; |
|||
|
|||
return ( |
|||
<PageContainer |
|||
header={{ |
|||
title: 'CRUD 示例', |
|||
}} |
|||
> |
|||
<ProTable<API.UserInfo> |
|||
headerTitle="查询表格" |
|||
actionRef={actionRef} |
|||
rowKey="id" |
|||
search={{ |
|||
labelWidth: 120, |
|||
}} |
|||
toolBarRender={() => [ |
|||
<Button |
|||
key="1" |
|||
type="primary" |
|||
onClick={() => handleModalVisible(true)} |
|||
> |
|||
新建 |
|||
</Button>, |
|||
]} |
|||
request={async (params, sorter, filter) => { |
|||
const { data, success } = await queryUserList({ |
|||
...params, |
|||
// FIXME: remove @ts-ignore
|
|||
// @ts-ignore
|
|||
sorter, |
|||
filter, |
|||
}); |
|||
return { |
|||
data: data?.list || [], |
|||
success, |
|||
}; |
|||
}} |
|||
columns={columns} |
|||
rowSelection={{ |
|||
onChange: (_, selectedRows) => setSelectedRows(selectedRows), |
|||
}} |
|||
/> |
|||
{selectedRowsState?.length > 0 && ( |
|||
<FooterToolbar |
|||
extra={ |
|||
<div> |
|||
已选择{' '} |
|||
<a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '} |
|||
项 |
|||
</div> |
|||
} |
|||
> |
|||
<Button |
|||
onClick={async () => { |
|||
await handleRemove(selectedRowsState); |
|||
setSelectedRows([]); |
|||
actionRef.current?.reloadAndRest?.(); |
|||
}} |
|||
> |
|||
批量删除 |
|||
</Button> |
|||
<Button type="primary">批量审批</Button> |
|||
</FooterToolbar> |
|||
)} |
|||
<CreateForm |
|||
onCancel={() => handleModalVisible(false)} |
|||
modalVisible={createModalVisible} |
|||
> |
|||
<ProTable<API.UserInfo, API.UserInfo> |
|||
onSubmit={async (value) => { |
|||
const success = await handleAdd(value); |
|||
if (success) { |
|||
handleModalVisible(false); |
|||
if (actionRef.current) { |
|||
actionRef.current.reload(); |
|||
} |
|||
} |
|||
}} |
|||
rowKey="id" |
|||
type="form" |
|||
columns={columns} |
|||
/> |
|||
</CreateForm> |
|||
{stepFormValues && Object.keys(stepFormValues).length ? ( |
|||
<UpdateForm |
|||
onSubmit={async (value) => { |
|||
const success = await handleUpdate(value); |
|||
if (success) { |
|||
handleUpdateModalVisible(false); |
|||
setStepFormValues({}); |
|||
if (actionRef.current) { |
|||
actionRef.current.reload(); |
|||
} |
|||
} |
|||
}} |
|||
onCancel={() => { |
|||
handleUpdateModalVisible(false); |
|||
setStepFormValues({}); |
|||
}} |
|||
updateModalVisible={updateModalVisible} |
|||
values={stepFormValues} |
|||
/> |
|||
) : null} |
|||
|
|||
<Drawer |
|||
width={600} |
|||
open={!!row} |
|||
onClose={() => { |
|||
setRow(undefined); |
|||
}} |
|||
closable={false} |
|||
> |
|||
{row?.name && ( |
|||
<ProDescriptions<API.UserInfo> |
|||
column={2} |
|||
title={row?.name} |
|||
request={async () => ({ |
|||
data: row || {}, |
|||
})} |
|||
params={{ |
|||
id: row?.name, |
|||
}} |
|||
columns={columns} |
|||
/> |
|||
)} |
|||
</Drawer> |
|||
</PageContainer> |
|||
); |
|||
}; |
|||
|
|||
export default TableList; |
|||
@ -0,0 +1,96 @@ |
|||
/* eslint-disable */ |
|||
// 该文件由 OneAPI 自动生成,请勿手动修改!
|
|||
import { request } from '@umijs/max'; |
|||
|
|||
/** 此处后端没有提供注释 GET /api/v1/queryUserList */ |
|||
export async function queryUserList( |
|||
params: { |
|||
// query
|
|||
/** keyword */ |
|||
keyword?: string; |
|||
/** current */ |
|||
current?: number; |
|||
/** pageSize */ |
|||
pageSize?: number; |
|||
}, |
|||
options?: { [key: string]: any }, |
|||
) { |
|||
return request<API.Result_PageInfo_UserInfo__>('/api/v1/queryUserList', { |
|||
method: 'GET', |
|||
params: { |
|||
...params, |
|||
}, |
|||
...(options || {}), |
|||
}); |
|||
} |
|||
|
|||
/** 此处后端没有提供注释 POST /api/v1/user */ |
|||
export async function addUser( |
|||
body?: API.UserInfoVO, |
|||
options?: { [key: string]: any }, |
|||
) { |
|||
return request<API.Result_UserInfo_>('/api/v1/user', { |
|||
method: 'POST', |
|||
headers: { |
|||
'Content-Type': 'application/json', |
|||
}, |
|||
data: body, |
|||
...(options || {}), |
|||
}); |
|||
} |
|||
|
|||
/** 此处后端没有提供注释 GET /api/v1/user/${param0} */ |
|||
export async function getUserDetail( |
|||
params: { |
|||
// path
|
|||
/** userId */ |
|||
userId?: string; |
|||
}, |
|||
options?: { [key: string]: any }, |
|||
) { |
|||
const { userId: param0 } = params; |
|||
return request<API.Result_UserInfo_>(`/api/v1/user/${param0}`, { |
|||
method: 'GET', |
|||
params: { ...params }, |
|||
...(options || {}), |
|||
}); |
|||
} |
|||
|
|||
/** 此处后端没有提供注释 PUT /api/v1/user/${param0} */ |
|||
export async function modifyUser( |
|||
params: { |
|||
// path
|
|||
/** userId */ |
|||
userId?: string; |
|||
}, |
|||
body?: API.UserInfoVO, |
|||
options?: { [key: string]: any }, |
|||
) { |
|||
const { userId: param0 } = params; |
|||
return request<API.Result_UserInfo_>(`/api/v1/user/${param0}`, { |
|||
method: 'PUT', |
|||
headers: { |
|||
'Content-Type': 'application/json', |
|||
}, |
|||
params: { ...params }, |
|||
data: body, |
|||
...(options || {}), |
|||
}); |
|||
} |
|||
|
|||
/** 此处后端没有提供注释 DELETE /api/v1/user/${param0} */ |
|||
export async function deleteUser( |
|||
params: { |
|||
// path
|
|||
/** userId */ |
|||
userId?: string; |
|||
}, |
|||
options?: { [key: string]: any }, |
|||
) { |
|||
const { userId: param0 } = params; |
|||
return request<API.Result_string_>(`/api/v1/user/${param0}`, { |
|||
method: 'DELETE', |
|||
params: { ...params }, |
|||
...(options || {}), |
|||
}); |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
/* eslint-disable */ |
|||
// 该文件由 OneAPI 自动生成,请勿手动修改!
|
|||
|
|||
import * as UserController from './UserController'; |
|||
export default { |
|||
UserController, |
|||
}; |
|||
@ -0,0 +1,68 @@ |
|||
/* eslint-disable */ |
|||
// 该文件由 OneAPI 自动生成,请勿手动修改!
|
|||
|
|||
declare namespace API { |
|||
interface PageInfo { |
|||
/** |
|||
1 */ |
|||
current?: number; |
|||
pageSize?: number; |
|||
total?: number; |
|||
list?: Array<Record<string, any>>; |
|||
} |
|||
|
|||
interface PageInfo_UserInfo_ { |
|||
/** |
|||
1 */ |
|||
current?: number; |
|||
pageSize?: number; |
|||
total?: number; |
|||
list?: Array<UserInfo>; |
|||
} |
|||
|
|||
interface Result { |
|||
success?: boolean; |
|||
errorMessage?: string; |
|||
data?: Record<string, any>; |
|||
} |
|||
|
|||
interface Result_PageInfo_UserInfo__ { |
|||
success?: boolean; |
|||
errorMessage?: string; |
|||
data?: PageInfo_UserInfo_; |
|||
} |
|||
|
|||
interface Result_UserInfo_ { |
|||
success?: boolean; |
|||
errorMessage?: string; |
|||
data?: UserInfo; |
|||
} |
|||
|
|||
interface Result_string_ { |
|||
success?: boolean; |
|||
errorMessage?: string; |
|||
data?: string; |
|||
} |
|||
|
|||
type UserGenderEnum = 'MALE' | 'FEMALE'; |
|||
|
|||
interface UserInfo { |
|||
id?: string; |
|||
name?: string; |
|||
/** nick */ |
|||
nickName?: string; |
|||
/** email */ |
|||
email?: string; |
|||
gender?: UserGenderEnum; |
|||
} |
|||
|
|||
interface UserInfoVO { |
|||
name?: string; |
|||
/** nick */ |
|||
nickName?: string; |
|||
/** email */ |
|||
email?: string; |
|||
} |
|||
|
|||
type definitions_0 = null; |
|||
} |
|||
@ -0,0 +1,4 @@ |
|||
// 示例方法,没有实际意义
|
|||
export function trim(str: string) { |
|||
return str.trim(); |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"extends": "./src/.umi/tsconfig.json" |
|||
} |
|||
@ -0,0 +1 @@ |
|||
import '@umijs/max/typings'; |
|||
9473
project/yarn.lock
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
https://blog.csdn.net/luoluoyang23/article/details/129338613 |
|||
8448
yarn-error.log
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
13496
yarn.lock
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save