remove test

master
zhengpengju 4 years ago
parent f713f62cac
commit 8ebc45ad83

@ -96,9 +96,12 @@ $ yarn umi block add templates/blank
$ yarn umi block add https://github.com/umijs/umi-blocks/tree/master/templates/blank
$ yarn umi block add https://github.com/ant-design/pro-blocks/tree/master/EmptyPage
$ yarn umi block add http://10.10.14.176:3000/web/kwgl-web/src/branch/master/blocks/procomponents
```
```
#### 本地区块 yarn umi block add [文件夹]/[区块] --path [路由]
```bash
$ yarn umi block add ./blocks/procomponents --path Demo
```
#### umi-block-convertor
Q&A

@ -316,30 +316,6 @@ export default defineConfig({
path: '/',
redirect: '/dashboard/analysis',
},
{
name: 'hello09',
icon: 'smile',
path: '/hello09',
component: './Hello09',
},
{
name: 'hello10',
icon: 'smile',
path: '/hello10',
component: './Hello10',
},
{
name: 'hello11',
icon: 'smile',
path: '/hello11',
component: './Hello11',
},
{
name: 'hello12',
icon: 'smile',
path: '/hello12',
component: './Hello12',
},
{
component: '404',
},

@ -1,3 +0,0 @@
.container {
color: blue;
}

@ -1,7 +0,0 @@
import React from 'react';
import { Button } from 'antd';
import styles from './index.less';
export default () => {
return <Button className={styles.container}>Hello UmiJS!</Button>;
}

@ -1,177 +0,0 @@
// eslint-disable-next-line import/no-extraneous-dependencies
import type { Request, Response } from 'express';
import { parse } from 'url';
import type { TableListItem, TableListParams } from './data.d';
// mock tableListDataSource
const genList = (current: number, pageSize: number) => {
const tableListDataSource: TableListItem[] = [];
for (let i = 0; i < pageSize; i += 1) {
const index = (current - 1) * 10 + i;
tableListDataSource.push({
key: index,
disabled: i % 6 === 0,
href: 'https://ant.design',
avatar: [
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
][i % 2],
name: `TradeCode ${index}`,
owner: '曲丽丽',
desc: '这是一段描述',
callNo: Math.floor(Math.random() * 1000),
status: (Math.floor(Math.random() * 10) % 4).toString(),
updatedAt: new Date(),
createdAt: new Date(),
progress: Math.ceil(Math.random() * 100),
});
}
tableListDataSource.reverse();
return tableListDataSource;
};
let tableListDataSource = genList(1, 100);
function getRule(req: Request, res: Response, u: string) {
let realUrl = u;
if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
realUrl = req.url;
}
const { current = 1, pageSize = 10 } = req.query;
const params = parse(realUrl, true).query as unknown as TableListParams;
let dataSource = [...tableListDataSource].slice(
((current as number) - 1) * (pageSize as number),
(current as number) * (pageSize as number),
);
if (params.sorter) {
const sorter = JSON.parse(params.sorter as any);
dataSource = dataSource.sort((prev, next) => {
let sortNumber = 0;
Object.keys(sorter).forEach((key) => {
if (sorter[key] === 'descend') {
if (prev[key] - next[key] > 0) {
sortNumber += -1;
} else {
sortNumber += 1;
}
return;
}
if (prev[key] - next[key] > 0) {
sortNumber += 1;
} else {
sortNumber += -1;
}
});
return sortNumber;
});
}
if (params.filter) {
const filter = JSON.parse(params.filter as any) as Record<string, string[]>;
if (Object.keys(filter).length > 0) {
dataSource = dataSource.filter((item) => {
return Object.keys(filter).some((key) => {
if (!filter[key]) {
return true;
}
if (filter[key].includes(`${item[key]}`)) {
return true;
}
return false;
});
});
}
}
if (params.name) {
dataSource = dataSource.filter((data) => data.name.includes(params.name || ''));
}
let finalPageSize = 10;
if (params.pageSize) {
finalPageSize = parseInt(`${params.pageSize}`, 10);
}
const result = {
data: dataSource,
total: tableListDataSource.length,
success: true,
pageSize: finalPageSize,
current: parseInt(`${params.currentPage}`, 10) || 1,
};
return res.json(result);
}
function postRule(req: Request, res: Response, u: string, b: Request) {
let realUrl = u;
if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
realUrl = req.url;
}
const body = (b && b.body) || req.body;
const { name, desc, key } = body;
switch (req.method) {
/* eslint no-case-declarations:0 */
case 'DELETE':
tableListDataSource = tableListDataSource.filter((item) => key.indexOf(item.key) === -1);
break;
case 'POST':
(() => {
const i = Math.ceil(Math.random() * 10000);
const newRule = {
key: tableListDataSource.length,
href: 'https://ant.design',
avatar: [
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
][i % 2],
name,
owner: '曲丽丽',
desc,
callNo: Math.floor(Math.random() * 1000),
status: (Math.floor(Math.random() * 10) % 2).toString(),
updatedAt: new Date(),
createdAt: new Date(),
progress: Math.ceil(Math.random() * 100),
};
tableListDataSource.unshift(newRule);
return res.json(newRule);
})();
return;
case 'PUT':
(() => {
let newRule = {};
tableListDataSource = tableListDataSource.map((item) => {
if (item.key === key) {
newRule = { ...item, desc, name };
return { ...item, desc, name };
}
return item;
});
return res.json(newRule);
})();
return;
default:
break;
}
const result = {
list: tableListDataSource,
pagination: {
total: tableListDataSource.length,
},
};
res.json(result);
}
export default {
'GET /api/rule': getRule,
'POST /api/rule': postRule,
'DELETE /api/rule': postRule,
'PUT /api/rule': postRule,
};

@ -1,41 +0,0 @@
export type DataItem = {
name: string;
state: string;
};
export type TableListItem = {
key: number;
disabled?: boolean;
href: string;
avatar: string;
name: string;
owner: string;
desc: string;
callNo: number;
status: string;
updatedAt: Date;
createdAt: Date;
progress: number;
};
export type TableListPagination = {
total: number;
pageSize: number;
current: number;
};
export type TableListData = {
list: TableListItem[];
pagination: Partial<TableListPagination>;
};
export type TableListParams = {
status?: string;
name?: string;
desc?: string;
key?: number;
pageSize?: number;
currentPage?: number;
filter?: Record<string, any[]>;
sorter?: Record<string, any>;
};

@ -1,3 +0,0 @@
.container {
color: blue;
}

@ -1,241 +0,0 @@
import React, { useEffect, useRef, useState } from 'react';
import { useRequest } from 'ahooks';
import type { ActionType } from '@ant-design/pro-table';
// import type { ProFormColumnsType } from '@ant-design/pro-form';
import { PageContainer } from '@ant-design/pro-layout';
import ProTable from '@ant-design/pro-table';
import type { ProDescriptionsItemProps } from '@ant-design/pro-descriptions';
import ProDescriptions from '@ant-design/pro-descriptions';
import { BetaSchemaForm} from '@ant-design/pro-form';
import { Button, Col, Modal, Row, Space } from 'antd';
import { MobileOutlined, PhoneOutlined, PlusOutlined } from '@ant-design/icons';
import { schemaExamination, dataExamination } from './service';
import type { DataItem } from './data';
export type TableListItem = {
id: string;
code: number;
name: string;
creator: string;
status: string;
createdAt: number;
progress: number;
money: number;
memo: string;
};
export default () => {
const [currentRow, setCurrentRow] = useState<TableListItem>();
const [showDetail, setShowDetail] = useState<boolean>(false);
const [showCreate, setShowCreate] = useState<boolean>(false);
const [showUpdate, setShowUpdate] = useState<boolean>(false);
const [columns, setColumns] = useState<any[]>([]);
const ref = useRef<ActionType>();
/** 获取数据结构体 */
const { data } = useRequest(schemaExamination);
console.log('debug1');
useEffect(() => {
const _data = data || [];
let idx = -1;
idx = _data?.findIndex((val: { dataIndex: string; })=>{ return val.dataIndex === 'publicTelephone' }) || -1;
if(idx !== -1){
_data[idx] = {..._data[idx], renderText: (val: string) => `${(val || '').replace(/(\d{2})(\d{2})(\d{4})/,"$1**$3")}`}
}
/** 渲染复合数据项 */
idx = _data?.findIndex((val: { dataIndex: string; })=>{ return val.dataIndex === 'examiner' }) || -1;
if(idx !== -1){
_data[idx] = {
..._data[idx],
render: (text: any) => (
<>
<span style={{ display: 'block' }}>{text?.realname}</span>
<small style={{ display: 'inline-block', marginRight: 5 }}><PhoneOutlined /> {text?.tel}</small>
<small style={{ display: 'inline-block', marginRight: 5 }}><MobileOutlined /> {text?.mobile}</small>
</>
)
}
}
/** 添加序号和操作列 */
setColumns(
[
{
title: '序号',
key: 'index',
valueType: 'indexBorder',
render: (text: React.ReactNode, _: any, index: number) =>{
if(ref && ref?.current && ref?.current?.pageInfo){
return `${(ref?.current?.pageInfo?.current - 1) * (ref.current.pageInfo?.pageSize) + (index + 1)}`;
}else{
return '';
}
},
width: 48,
},
..._data,
{
title: '操作',
width: 180,
key: 'option',
valueType: 'option',
render: (_dom: any, entity: React.SetStateAction<TableListItem | undefined>) => [
<a key="detail" onClick={() => {
console.log('entity', entity);
setCurrentRow(entity);
setShowDetail(true);
}} ></a>,
<a key="update" onClick={() => {
console.log('columns1', columns)
setCurrentRow(entity);
setShowUpdate(true);
console.log('columns2', columns)
}} ></a>,
<a key="delete" onClick={() => {
//
}} ></a>,
],
}
]
);
}, [data]);
/** 获取列数据初始值 */
const getInitialValues = (cols: any[], vals: any) => {
console.log('getInitialValues-columns', columns)
console.log('getInitialValues-values', vals)
const initialValues: any[] = [];
cols.forEach((column: { dataIndex: string; }) => {
const key: any = column?.dataIndex || '';
initialValues.push({...column, initialValue: key ? vals[key] : ''})
})
console.log('initialValues::',initialValues)
return initialValues || []
}
return (
<PageContainer>
<ProTable<TableListItem | any>
columns={columns}
request={dataExamination}
rowKey="id"
actionRef={ref}
pagination={{
showQuickJumper: true,
}}
search={{
layout: 'vertical',
defaultCollapsed: false,
}}
dateFormatter="string"
/*toolbar={{
title: '高级表格',
tooltip: '这是一个标题提示',
}}*/
toolBarRender={() => [
<Button type="primary" key="primary" onClick={() => {
console.log('columns::::', columns);
setShowCreate(true)
}}><PlusOutlined /> </Button>
]}
/>
<Modal
title={currentRow?.name || '详细'}
width='60%'
visible={showDetail}
onCancel={() => {
setCurrentRow(undefined); // 设置当前行
setShowDetail(false);
}}
footer={null}>
{currentRow?.name && (
<ProDescriptions<TableListItem>
column={2}
/* title={currentRow?.name} */
dataSource={currentRow}
/*
request={async () => ({
data: currentRow || {},
})}*/
params={{
id: currentRow?.id,
}}
columns={columns.slice(0, columns.length - 1) as ProDescriptionsItemProps<TableListItem>[]}
/>
)}
</Modal>
<Modal
title='新建考点'
//
width='60%'
visible={showCreate}
destroyOnClose
onCancel={() => {
setShowCreate(false);
}}
footer={null}
>
<BetaSchemaForm<DataItem>
layout = 'horizontal'
layoutType = 'Form'
labelCol = {{ span: 8 }}
wrapperCol={{ span: 12 }}
onFinish={async (values) => {
console.log(values);
}}
submitter={{
render: (props, doms) => (
<Row>
<Col span={12} offset={8}>
<Space>{doms}</Space>
</Col>
</Row>
),
}}
// action = ''
title = "新建"
columns = {columns}
/>
</Modal>
<Modal
title='编辑'
width='60%'
visible={showUpdate}
destroyOnClose
onCancel={() => {
setShowUpdate(false);
}}
footer={null}>
{currentRow?.name && (
<BetaSchemaForm<DataItem>
layout = 'horizontal'
layoutType = 'Form'
labelCol = {{ span: 8 }}
wrapperCol={{ span: 12 }}
onFinish={async (values) => {
console.log(values);
}}
submitter={{
render: (props, doms) => (
<Row>
<Col span={12} offset={8}>
<Space>{doms}</Space>
</Col>
</Row>
),
}}
// action = ''
title = "编辑"
columns = {getInitialValues(columns, currentRow)}
/>
)}
</Modal>
</PageContainer>
);
};

@ -1,76 +0,0 @@
import { request } from 'umi';
import { TableListItem } from './data';
import type { ProFormColumnsType } from '@ant-design/pro-form';
/** 获取考点数据结构 GET /api/dataSource?key=examination&schema=true&data=false */
export async function schemaExamination(
params: {
// query
},
options?: { [key: string]: any },
) {
return request<{
data: any[];
/** 字段总数 */
total?: number;
success?: boolean;
}>('/api/dataSource?key=examination&schema=true&data=false', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 获取考点列表数据 GET /api/dataSource?key=examination&schema=false&data=true */
export async function dataExamination(
params: {
// query
/** 当前的页码 */
current?: number;
/** 页面的容量 */
pageSize?: number;
},
options?: { [key: string]: any },
) {
return request<{
data: TableListItem[];
/** 列表的内容总数 */
total?: number;
success?: boolean;
}>('/api/dataSource?key=examination&schema=false&data=true', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新建考点 PUT /api/dataSource?key=examination */
export async function updateExamination(data: { [key: string]: any }, options?: { [key: string]: any }) {
return request<TableListItem>('/api/examination', {
data,
method: 'PUT',
...(options || {}),
});
}
/** 新建考点 POST /api/dataSource?key=examination */
export async function addExamination(data: { [key: string]: any }, options?: { [key: string]: any }) {
return request<TableListItem>('/api/examination', {
data,
method: 'POST',
...(options || {}),
});
}
/** 删除考点 DELETE /api/dataSource?key=examination */
export async function removeExamination(data: { key: number[] }, options?: { [key: string]: any }) {
return request<Record<string, any>>('/api/examination', {
data,
method: 'DELETE',
...(options || {}),
});
}

@ -1,404 +0,0 @@
/**
* Mock/mock
* Mock/mock/dataSource.ts
*/
import { Request, Response } from 'express';
const getDataSource = (req: Request, res: Response) => {
const { key = '' , schema = '', data = ''} = req.query;
switch (key) {
case 'users':
res.json({
data: [
{
uid: '1',
name: 'John Brown',
age: 32,
address: 'New York No. 1 Lake Park',
idcard: '220101190101012001'
},
{
uid: '2',
name: 'Jim Green',
age: 42,
address: 'London No. 1 Lake Park',
idcard: '220101190101012002'
},
{
uid: '3',
name: 'Joe Black',
age: 32,
address: 'Sidney No. 1 Lake Park',
idcard: '220101190101012003'
}
]
})
break;
/*
*
*/
case 'examination':
let obj = {};
if( schema === 'true' ){
obj = {
data: [
/*{ title: '',
dataIndex: 'index',
valueType: 'indexBorder',
width: 48
},*/
{
key: '1', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'code', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType 参照 https://procomponents.ant.design/components/schema/
title: '考点代码', // 标题的内容,在 form 中是 label
tooltip: '参照准考证考点', // 会在 title 旁边展示一个 icon鼠标浮动之后展示
valueEnum: '', // 支持 object 和 MapMap 是支持其他基础类型作为 key
fieldProps: '', // 传给渲染的组件的 props自定义的时候也会传递
formItemProps: {
// 参照 https://ant.design/components/form-cn/#Rule
rules: [
{
required: true,
message: '此项为必填项',
},
{
max: 6,
message: '最大长度为6字符',
}
],
}, // 传递给 Form.Item 的配置
proFieldProps: '', // 设置到 ProField 上面的 props内部属性
//renderText: '', // 修改的数据是会被 valueType 定义的渲染组件消费
//render: '', // 自定义只读模式的 dom,render 方法只管理的只读模式,编辑模式需要使用 renderFormItem
//renderFormItem: '', // 自定义编辑模式,返回一个 ReactNode会自动包裹 value 和 onChange
request: null, // 从远程请求网络数据,一般用于选择类组件
params: null, // 额外传递给 request 的参数,组件不做处理,但是变化会引起request 重新请求数据
hideInDescriptions: true, // 在 descriptions 中隐藏
hideInForm: false, // 在 Form 中隐藏
hideInTable: false, // 在 Table 中隐藏
hideInSearch: false, // 在 Table 的查询表格中隐藏
columns:[], // 嵌套子项valueType 为 dependency 时,请使用(values) => ProFormColumnsType[]其他情况使用 ProFormColumnsType[]
width: 150
},
{
key: '2', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'name', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '考点名称', // 标题的内容,在 form 中是 label
tooltip: '参照准考证考点', // 会在 title 旁边展示一个 icon鼠标浮动之后展示
valueEnum: '', // 支持 object 和 MapMap 是支持其他基础类型作为 key
fieldProps: '', // 传给渲染的组件的 props自定义的时候也会传递
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
{
type: 'string',
message: '此项为文本内容',
},
{
max: 50,
message: '最大长度50',
}
],
}, // 传递给 Form.Item 的配置
proFieldProps: '', // 设置到 ProField 上面的 props内部属性
//renderText: '', // 修改的数据是会被 valueType 定义的渲染组件消费
//render: '', // 自定义只读模式的 dom,render 方法只管理的只读模式,编辑模式需要使用 renderFormItem
//renderFormItem: '', // 自定义编辑模式,返回一个 ReactNode会自动包裹 value 和 onChange
request: null, // 从远程请求网络数据,一般用于选择类组件
params: null, // 额外传递给 request 的参数,组件不做处理,但是变化会引起request 重新请求数据
hideInDescriptions: true, // 在 descriptions 中隐藏
hideInForm: false, // 在 Form 中隐藏
hideInTable: false, // 在 Table 中隐藏
hideInSearch: false, // 在 Table 的查询表格中隐藏
columns:[
{
key: '2-1', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'realname', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '姓名', // 标题的内容,在 form 中是 label
tooltip: '', // 会在 title 旁边展示一个 icon鼠标浮动之后展示
valueEnum: '', // 支持 object 和 MapMap 是支持其他基础类型作为 key
fieldProps: '', // 传给渲染的组件的 props自定义的时候也会传递
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
{
type: 'string',
message: '此项为文本内容',
},
{
max: 20,
message: '最大长度20',
}
],
}, // 传递给 Form.Item 的配置
proFieldProps: '', // 设置到 ProField 上面的 props内部属性
//renderText: '', // 修改的数据是会被 valueType 定义的渲染组件消费
//render: '', // 自定义只读模式的 dom,render 方法只管理的只读模式,编辑模式需要使用 renderFormItem
//renderFormItem: '', // 自定义编辑模式,返回一个 ReactNode会自动包裹 value 和 onChange
request: null, // 从远程请求网络数据,一般用于选择类组件
params: null, // 额外传递给 request 的参数,组件不做处理,但是变化会引起request 重新请求数据
hideInDescriptions: true, // 在 descriptions 中隐藏
hideInForm: true, // 在 Form 中隐藏
hideInTable: false, // 在 Table 中隐藏
hideInSearch: false, // 在 Table 的查询表格中隐藏
//columns:[] // 嵌套子项valueType 为 dependency 时,请使用(values) => ProFormColumnsType[]其他情况使用 ProFormColumnsType[]
}
] // 嵌套子项valueType 为 dependency 时,请使用(values) => ProFormColumnsType[]其他情况使用 ProFormColumnsType[]
},
{
key: '3', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'examiner', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '主考姓名及联系方式', // 标题的内容,在 form 中是 label
tooltip: '', // 会在 title 旁边展示一个 icon鼠标浮动之后展示
valueEnum: '', // 支持 object 和 MapMap 是支持其他基础类型作为 key
fieldProps: '', // 传给渲染的组件的 props自定义的时候也会传递
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
{
type: 'string',
message: '此项为文本内容',
},
{
max: 50,
message: '最大长度50',
}
],
}, // 传递给 Form.Item 的配置
proFieldProps: '', // 设置到 ProField 上面的 props内部属性
//renderText: '', // 修改的数据是会被 valueType 定义的渲染组件消费
//render: '', // 自定义只读模式的 dom,render 方法只管理的只读模式,编辑模式需要使用 renderFormItem
//renderFormItem: '', // 自定义编辑模式,返回一个 ReactNode会自动包裹 value 和 onChange
request: null, // 从远程请求网络数据,一般用于选择类组件
params: null, // 额外传递给 request 的参数,组件不做处理,但是变化会引起request 重新请求数据
hideInDescriptions: true, // 在 descriptions 中隐藏
hideInForm: true, // 在 Form 中隐藏
hideInTable: false, // 在 Table 中隐藏
hideInSearch: false, // 在 Table 的查询表格中隐藏
columns:[] // 嵌套子项valueType 为 dependency 时,请使用(values) => ProFormColumnsType[]其他情况使用 ProFormColumnsType[]
},
{
key: '4', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'examinationRoomTotal', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'digit', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '考场数', // 标题的内容,在 form 中是 label
hideInSearch: true, // 在 Table 的查询表格中隐藏
width: 150
},
{
key: '5', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'publicTelephone', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '公开电话', // 标题的内容,在 form 中是 label
},
{
key: '6', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'address', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '地址', // 标题的内容,在 form 中是 label
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
{
type: 'string',
message: '此项为文本内容',
},
{
max: 50,
message: '最大长度200',
}
],
}, // 传递给 Form.Item 的配置
},
{
key: '7', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'busRoute', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '乘车路线', // 标题的内容,在 form 中是 label
hideInTable: true, // 在 Table 中隐藏
hideInSearch: true, // 在 Table 的查询表格中隐藏
},
{
key: '8', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'electricLine', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '用电线路', // 标题的内容,在 form 中是 label
hideInTable: true, // 在 Table 中隐藏
}
]
}
}
if( data === 'true' ){
let _data = [];
for(let i=1; i<=30; i++){
const _str = i.toString().padStart(2, '0')
_data.push(
{
id: '000000001'+ _str,
code: '2017' + _str, // 考点代码
name: '长春高新第'+_str+'实验学校',
examiner: // 主考姓名及联系方式
{
realname: '张安开', // 姓名
tel: '819629' + _str, // 电话
mobile: '130214563' + _str // 手机
},
contact: // 考点联系人方式
{
realname: '安若昂', // 姓名
tel: '819625' + _str, // 电话
mobile: '130214567' + _str // 手机
},
secretRoom: // 保密室
{
tel: '819625' + _str // 电话
},
monitorRoom: // 监控室
{
tel: '819625' + _str // 电话
},
examinationRoomTotal: 30, // 考场数
publicTelephone: '819612' + _str, // 公开电话
address: '长春市高新区飞跃路' + _str + '号', // 地址
busRoute: _str +'225路202路', // 乘车路线
electricLine: '飞跃路线' + _str // 用电线路
}
)
}
obj = {
// DATA 数据记录
data: _data
}
}
res.json(obj)
break;
case 'notices':
res.json({
data: [
{
id: '000000001',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
title: '你收到了 14 份新周报',
datetime: '2017-08-09',
type: 'notification',
},
{
id: '000000002',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
title: '你推荐的 曲妮妮 已通过第三轮面试',
datetime: '2017-08-08',
type: 'notification',
},
{
id: '000000003',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',
title: '这种模板可以区分多种通知类型',
datetime: '2017-08-07',
read: true,
type: 'notification',
},
{
id: '000000004',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
datetime: '2017-08-07',
type: 'notification',
},
{
id: '000000005',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
title: '内容不要超过两行字,超出时自动截断',
datetime: '2017-08-07',
type: 'notification',
},
{
id: '000000006',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '曲丽丽 评论了你',
description: '描述信息描述信息描述信息',
datetime: '2017-08-07',
type: 'message',
clickClose: true,
},
{
id: '000000007',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '朱偏右 回复了你',
description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
datetime: '2017-08-07',
type: 'message',
clickClose: true,
},
{
id: '000000008',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '标题',
description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
datetime: '2017-08-07',
type: 'message',
clickClose: true,
},
{
id: '000000009',
title: '任务名称',
description: '任务需要在 2017-01-12 20:00 前启动',
extra: '未开始',
status: 'todo',
type: 'event',
},
{
id: '000000010',
title: '第三方紧急代码变更',
description: '冠霖提交于 2017-01-06需在 2017-01-07 前完成代码变更任务',
extra: '马上到期',
status: 'urgent',
type: 'event',
},
{
id: '000000011',
title: '信息安全考试',
description: '指派竹尔于 2017-01-09 前完成更新并发布',
extra: '已耗时 8 天',
status: 'doing',
type: 'event',
},
{
id: '000000012',
title: 'ABCD 版本发布',
description: '冠霖提交于 2017-01-06需在 2017-01-07 前完成代码变更任务',
extra: '进行中',
status: 'processing',
type: 'event',
},
],
});
break;
default:
res.json({data:[]})
break;
}
}
export default {
'GET /api/dataSource': getDataSource,
};

@ -1,41 +0,0 @@
export type DataItem = {
name: string;
state: string;
};
export type TableListItem = {
key: number;
disabled?: boolean;
href: string;
avatar: string;
name: string;
owner: string;
desc: string;
callNo: number;
status: string;
updatedAt: Date;
createdAt: Date;
progress: number;
};
export type TableListPagination = {
total: number;
pageSize: number;
current: number;
};
export type TableListData = {
list: TableListItem[];
pagination: Partial<TableListPagination>;
};
export type TableListParams = {
status?: string;
name?: string;
desc?: string;
key?: number;
pageSize?: number;
currentPage?: number;
filter?: Record<string, any[]>;
sorter?: Record<string, any>;
};

@ -1,3 +0,0 @@
.container {
color: blue;
}

@ -1,241 +0,0 @@
import React, { useEffect, useRef, useState } from 'react';
import { useRequest } from 'umi';
import type { ActionType } from '@ant-design/pro-table';
// import type { ProFormColumnsType } from '@ant-design/pro-form';
import { PageContainer } from '@ant-design/pro-layout';
import ProTable from '@ant-design/pro-table';
import type { ProDescriptionsItemProps } from '@ant-design/pro-descriptions';
import ProDescriptions from '@ant-design/pro-descriptions';
import { BetaSchemaForm} from '@ant-design/pro-form';
import { Button, Col, Modal, Row, Space } from 'antd';
import { MobileOutlined, PhoneOutlined, PlusOutlined } from '@ant-design/icons';
import { schemaExamination, dataExamination } from './service';
import type { DataItem } from './data';
export type TableListItem = {
id: string;
code: number;
name: string;
creator: string;
status: string;
createdAt: number;
progress: number;
money: number;
memo: string;
};
export default () => {
const [currentRow, setCurrentRow] = useState<TableListItem>();
const [showDetail, setShowDetail] = useState<boolean>(false);
const [showCreate, setShowCreate] = useState<boolean>(false);
const [showUpdate, setShowUpdate] = useState<boolean>(false);
const [columns, setColumns] = useState<any[]>([]);
const ref = useRef<ActionType>();
/** 获取数据结构体 */
const { data } = useRequest(schemaExamination);
console.log('debug1');
useEffect(() => {
const _data = data || [];
let idx = -1;
idx = _data?.findIndex((val: { dataIndex: string; })=>{ return val.dataIndex === 'publicTelephone' }) || -1;
if(idx !== -1){
_data[idx] = {..._data[idx], renderText: (val: string) => `${(val || '').replace(/(\d{2})(\d{2})(\d{4})/,"$1**$3")}`}
}
/** 渲染复合数据项 */
idx = _data?.findIndex((val: { dataIndex: string; })=>{ return val.dataIndex === 'examiner' }) || -1;
if(idx !== -1){
_data[idx] = {
..._data[idx],
render: (text: any) => (
<>
<span style={{ display: 'block' }}>{text?.realname}</span>
<small style={{ display: 'inline-block', marginRight: 5 }}><PhoneOutlined /> {text?.tel}</small>
<small style={{ display: 'inline-block', marginRight: 5 }}><MobileOutlined /> {text?.mobile}</small>
</>
)
}
}
/** 添加序号和操作列 */
setColumns(
[
{
title: '序号',
key: 'index',
valueType: 'indexBorder',
render: (text: React.ReactNode, _: any, index: number) =>{
if(ref && ref?.current && ref?.current?.pageInfo){
return `${(ref?.current?.pageInfo?.current - 1) * (ref.current.pageInfo?.pageSize) + (index + 1)}`;
}else{
return '';
}
},
width: 48,
},
..._data,
{
title: '操作',
width: 180,
key: 'option',
valueType: 'option',
render: (_dom: any, entity: React.SetStateAction<TableListItem | undefined>) => [
<a key="detail" onClick={() => {
console.log('entity', entity);
setCurrentRow(entity);
setShowDetail(true);
}} ></a>,
<a key="update" onClick={() => {
console.log('columns1', columns)
setCurrentRow(entity);
setShowUpdate(true);
console.log('columns2', columns)
}} ></a>,
<a key="delete" onClick={() => {
//
}} ></a>,
],
}
]
);
}, [data]);
/** 获取列数据初始值 */
const getInitialValues = (cols: any[], vals: any) => {
console.log('getInitialValues-columns', columns)
console.log('getInitialValues-values', vals)
const initialValues: any[] = [];
cols.forEach((column: { dataIndex: string; }) => {
const key: any = column?.dataIndex || '';
initialValues.push({...column, initialValue: key ? vals[key] : ''})
})
console.log('initialValues::',initialValues)
return initialValues || []
}
return (
<PageContainer>
<ProTable<TableListItem | any>
columns={columns}
request={dataExamination}
rowKey="id"
actionRef={ref}
pagination={{
showQuickJumper: true,
}}
search={{
layout: 'vertical',
defaultCollapsed: false,
}}
dateFormatter="string"
/*toolbar={{
title: '高级表格',
tooltip: '这是一个标题提示',
}}*/
toolBarRender={() => [
<Button type="primary" key="primary" onClick={() => {
console.log('columns::::', columns);
setShowCreate(true)
}}><PlusOutlined /> </Button>
]}
/>
<Modal
title={currentRow?.name || '详细'}
width='60%'
visible={showDetail}
onCancel={() => {
setCurrentRow(undefined); // 设置当前行
setShowDetail(false);
}}
footer={null}>
{currentRow?.name && (
<ProDescriptions<TableListItem>
column={2}
/* title={currentRow?.name} */
dataSource={currentRow}
/*
request={async () => ({
data: currentRow || {},
})}*/
params={{
id: currentRow?.id,
}}
columns={columns.slice(0, columns.length - 1) as ProDescriptionsItemProps<TableListItem>[]}
/>
)}
</Modal>
<Modal
title='新建考点'
//
width='60%'
visible={showCreate}
destroyOnClose
onCancel={() => {
setShowCreate(false);
}}
footer={null}
>
<BetaSchemaForm<DataItem>
layout = 'horizontal'
layoutType = 'Form'
labelCol = {{ span: 8 }}
wrapperCol={{ span: 12 }}
onFinish={async (values) => {
console.log(values);
}}
submitter={{
render: (props, doms) => (
<Row>
<Col span={12} offset={8}>
<Space>{doms}</Space>
</Col>
</Row>
),
}}
// action = ''
title = "新建"
columns = {columns}
/>
</Modal>
<Modal
title='编辑'
width='60%'
visible={showUpdate}
destroyOnClose
onCancel={() => {
setShowUpdate(false);
}}
footer={null}>
{currentRow?.name && (
<BetaSchemaForm<DataItem>
layout = 'horizontal'
layoutType = 'Form'
labelCol = {{ span: 8 }}
wrapperCol={{ span: 12 }}
onFinish={async (values) => {
console.log(values);
}}
submitter={{
render: (props, doms) => (
<Row>
<Col span={12} offset={8}>
<Space>{doms}</Space>
</Col>
</Row>
),
}}
// action = ''
title = "编辑"
columns = {getInitialValues(columns, currentRow)}
/>
)}
</Modal>
</PageContainer>
);
};

@ -1,76 +0,0 @@
import { request } from 'umi';
import { TableListItem } from './data';
import type { ProFormColumnsType } from '@ant-design/pro-form';
/** 获取考点数据结构 GET /api/dataSource?key=examination&schema=true&data=false */
export async function schemaExamination(
params: {
// query
},
options?: { [key: string]: any },
) {
return request<{
data: any[];
/** 字段总数 */
total?: number;
success?: boolean;
}>('/api/dataSource?key=examination&schema=true&data=false', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 获取考点列表数据 GET /api/dataSource?key=examination&schema=false&data=true */
export async function dataExamination(
params: {
// query
/** 当前的页码 */
current?: number;
/** 页面的容量 */
pageSize?: number;
},
options?: { [key: string]: any },
) {
return request<{
data: TableListItem[];
/** 列表的内容总数 */
total?: number;
success?: boolean;
}>('/api/dataSource?key=examination&schema=false&data=true', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新建考点 PUT /api/dataSource?key=examination */
export async function updateExamination(data: { [key: string]: any }, options?: { [key: string]: any }) {
return request<TableListItem>('/api/examination', {
data,
method: 'PUT',
...(options || {}),
});
}
/** 新建考点 POST /api/dataSource?key=examination */
export async function addExamination(data: { [key: string]: any }, options?: { [key: string]: any }) {
return request<TableListItem>('/api/examination', {
data,
method: 'POST',
...(options || {}),
});
}
/** 删除考点 DELETE /api/dataSource?key=examination */
export async function removeExamination(data: { key: number[] }, options?: { [key: string]: any }) {
return request<Record<string, any>>('/api/examination', {
data,
method: 'DELETE',
...(options || {}),
});
}

@ -1,404 +0,0 @@
/**
* Mock/mock
* Mock/mock/dataSource.ts
*/
import { Request, Response } from 'express';
const getDataSource = (req: Request, res: Response) => {
const { key = '' , schema = '', data = ''} = req.query;
switch (key) {
case 'users':
res.json({
data: [
{
uid: '1',
name: 'John Brown',
age: 32,
address: 'New York No. 1 Lake Park',
idcard: '220101190101012001'
},
{
uid: '2',
name: 'Jim Green',
age: 42,
address: 'London No. 1 Lake Park',
idcard: '220101190101012002'
},
{
uid: '3',
name: 'Joe Black',
age: 32,
address: 'Sidney No. 1 Lake Park',
idcard: '220101190101012003'
}
]
})
break;
/*
*
*/
case 'examination':
let obj = {};
if( schema === 'true' ){
obj = {
data: [
/*{ title: '',
dataIndex: 'index',
valueType: 'indexBorder',
width: 48
},*/
{
key: '1', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'code', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType 参照 https://procomponents.ant.design/components/schema/
title: '考点代码', // 标题的内容,在 form 中是 label
tooltip: '参照准考证考点', // 会在 title 旁边展示一个 icon鼠标浮动之后展示
valueEnum: '', // 支持 object 和 MapMap 是支持其他基础类型作为 key
fieldProps: '', // 传给渲染的组件的 props自定义的时候也会传递
formItemProps: {
// 参照 https://ant.design/components/form-cn/#Rule
rules: [
{
required: true,
message: '此项为必填项',
},
{
max: 6,
message: '最大长度为6字符',
}
],
}, // 传递给 Form.Item 的配置
proFieldProps: '', // 设置到 ProField 上面的 props内部属性
//renderText: '', // 修改的数据是会被 valueType 定义的渲染组件消费
//render: '', // 自定义只读模式的 dom,render 方法只管理的只读模式,编辑模式需要使用 renderFormItem
//renderFormItem: '', // 自定义编辑模式,返回一个 ReactNode会自动包裹 value 和 onChange
request: null, // 从远程请求网络数据,一般用于选择类组件
params: null, // 额外传递给 request 的参数,组件不做处理,但是变化会引起request 重新请求数据
hideInDescriptions: true, // 在 descriptions 中隐藏
hideInForm: false, // 在 Form 中隐藏
hideInTable: false, // 在 Table 中隐藏
hideInSearch: false, // 在 Table 的查询表格中隐藏
columns:[], // 嵌套子项valueType 为 dependency 时,请使用(values) => ProFormColumnsType[]其他情况使用 ProFormColumnsType[]
width: 150
},
{
key: '2', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'name', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '考点名称', // 标题的内容,在 form 中是 label
tooltip: '参照准考证考点', // 会在 title 旁边展示一个 icon鼠标浮动之后展示
valueEnum: '', // 支持 object 和 MapMap 是支持其他基础类型作为 key
fieldProps: '', // 传给渲染的组件的 props自定义的时候也会传递
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
{
type: 'string',
message: '此项为文本内容',
},
{
max: 50,
message: '最大长度50',
}
],
}, // 传递给 Form.Item 的配置
proFieldProps: '', // 设置到 ProField 上面的 props内部属性
//renderText: '', // 修改的数据是会被 valueType 定义的渲染组件消费
//render: '', // 自定义只读模式的 dom,render 方法只管理的只读模式,编辑模式需要使用 renderFormItem
//renderFormItem: '', // 自定义编辑模式,返回一个 ReactNode会自动包裹 value 和 onChange
request: null, // 从远程请求网络数据,一般用于选择类组件
params: null, // 额外传递给 request 的参数,组件不做处理,但是变化会引起request 重新请求数据
hideInDescriptions: true, // 在 descriptions 中隐藏
hideInForm: false, // 在 Form 中隐藏
hideInTable: false, // 在 Table 中隐藏
hideInSearch: false, // 在 Table 的查询表格中隐藏
columns:[
{
key: '2-1', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'realname', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '姓名', // 标题的内容,在 form 中是 label
tooltip: '', // 会在 title 旁边展示一个 icon鼠标浮动之后展示
valueEnum: '', // 支持 object 和 MapMap 是支持其他基础类型作为 key
fieldProps: '', // 传给渲染的组件的 props自定义的时候也会传递
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
{
type: 'string',
message: '此项为文本内容',
},
{
max: 20,
message: '最大长度20',
}
],
}, // 传递给 Form.Item 的配置
proFieldProps: '', // 设置到 ProField 上面的 props内部属性
//renderText: '', // 修改的数据是会被 valueType 定义的渲染组件消费
//render: '', // 自定义只读模式的 dom,render 方法只管理的只读模式,编辑模式需要使用 renderFormItem
//renderFormItem: '', // 自定义编辑模式,返回一个 ReactNode会自动包裹 value 和 onChange
request: null, // 从远程请求网络数据,一般用于选择类组件
params: null, // 额外传递给 request 的参数,组件不做处理,但是变化会引起request 重新请求数据
hideInDescriptions: true, // 在 descriptions 中隐藏
hideInForm: true, // 在 Form 中隐藏
hideInTable: false, // 在 Table 中隐藏
hideInSearch: false, // 在 Table 的查询表格中隐藏
//columns:[] // 嵌套子项valueType 为 dependency 时,请使用(values) => ProFormColumnsType[]其他情况使用 ProFormColumnsType[]
}
] // 嵌套子项valueType 为 dependency 时,请使用(values) => ProFormColumnsType[]其他情况使用 ProFormColumnsType[]
},
{
key: '3', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'examiner', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '主考姓名及联系方式', // 标题的内容,在 form 中是 label
tooltip: '', // 会在 title 旁边展示一个 icon鼠标浮动之后展示
valueEnum: '', // 支持 object 和 MapMap 是支持其他基础类型作为 key
fieldProps: '', // 传给渲染的组件的 props自定义的时候也会传递
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
{
type: 'string',
message: '此项为文本内容',
},
{
max: 50,
message: '最大长度50',
}
],
}, // 传递给 Form.Item 的配置
proFieldProps: '', // 设置到 ProField 上面的 props内部属性
//renderText: '', // 修改的数据是会被 valueType 定义的渲染组件消费
//render: '', // 自定义只读模式的 dom,render 方法只管理的只读模式,编辑模式需要使用 renderFormItem
//renderFormItem: '', // 自定义编辑模式,返回一个 ReactNode会自动包裹 value 和 onChange
request: null, // 从远程请求网络数据,一般用于选择类组件
params: null, // 额外传递给 request 的参数,组件不做处理,但是变化会引起request 重新请求数据
hideInDescriptions: true, // 在 descriptions 中隐藏
hideInForm: true, // 在 Form 中隐藏
hideInTable: false, // 在 Table 中隐藏
hideInSearch: false, // 在 Table 的查询表格中隐藏
columns:[] // 嵌套子项valueType 为 dependency 时,请使用(values) => ProFormColumnsType[]其他情况使用 ProFormColumnsType[]
},
{
key: '4', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'examinationRoomTotal', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'digit', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '考场数', // 标题的内容,在 form 中是 label
hideInSearch: true, // 在 Table 的查询表格中隐藏
width: 150
},
{
key: '5', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'publicTelephone', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '公开电话', // 标题的内容,在 form 中是 label
},
{
key: '6', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'address', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '地址', // 标题的内容,在 form 中是 label
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
{
type: 'string',
message: '此项为文本内容',
},
{
max: 50,
message: '最大长度200',
}
],
}, // 传递给 Form.Item 的配置
},
{
key: '7', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'busRoute', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '乘车路线', // 标题的内容,在 form 中是 label
hideInTable: true, // 在 Table 中隐藏
hideInSearch: true, // 在 Table 的查询表格中隐藏
},
{
key: '8', // 确定这个列的唯一值,一般用于 dataIndex 重复的情况
dataIndex: 'electricLine', // 与实体映射的 key数组会被转化 [a,b] => Entity.a.b
valueType: 'text', // 数据的渲渲染方式,我们自带了一部分,你可以可以自定义 valueType https://procomponents.ant.design/components/schema/
title: '用电线路', // 标题的内容,在 form 中是 label
hideInTable: true, // 在 Table 中隐藏
}
]
}
}
if( data === 'true' ){
let _data = [];
for(let i=1; i<=30; i++){
const _str = i.toString().padStart(2, '0')
_data.push(
{
id: '000000001'+ _str,
code: '2017' + _str, // 考点代码
name: '长春高新第'+_str+'实验学校',
examiner: // 主考姓名及联系方式
{
realname: '张安开', // 姓名
tel: '819629' + _str, // 电话
mobile: '130214563' + _str // 手机
},
contact: // 考点联系人方式
{
realname: '安若昂', // 姓名
tel: '819625' + _str, // 电话
mobile: '130214567' + _str // 手机
},
secretRoom: // 保密室
{
tel: '819625' + _str // 电话
},
monitorRoom: // 监控室
{
tel: '819625' + _str // 电话
},
examinationRoomTotal: 30, // 考场数
publicTelephone: '819612' + _str, // 公开电话
address: '长春市高新区飞跃路' + _str + '号', // 地址
busRoute: _str +'225路202路', // 乘车路线
electricLine: '飞跃路线' + _str // 用电线路
}
)
}
obj = {
// DATA 数据记录
data: _data
}
}
res.json(obj)
break;
case 'notices':
res.json({
data: [
{
id: '000000001',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
title: '你收到了 14 份新周报',
datetime: '2017-08-09',
type: 'notification',
},
{
id: '000000002',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
title: '你推荐的 曲妮妮 已通过第三轮面试',
datetime: '2017-08-08',
type: 'notification',
},
{
id: '000000003',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',
title: '这种模板可以区分多种通知类型',
datetime: '2017-08-07',
read: true,
type: 'notification',
},
{
id: '000000004',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
datetime: '2017-08-07',
type: 'notification',
},
{
id: '000000005',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
title: '内容不要超过两行字,超出时自动截断',
datetime: '2017-08-07',
type: 'notification',
},
{
id: '000000006',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '曲丽丽 评论了你',
description: '描述信息描述信息描述信息',
datetime: '2017-08-07',
type: 'message',
clickClose: true,
},
{
id: '000000007',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '朱偏右 回复了你',
description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
datetime: '2017-08-07',
type: 'message',
clickClose: true,
},
{
id: '000000008',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '标题',
description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
datetime: '2017-08-07',
type: 'message',
clickClose: true,
},
{
id: '000000009',
title: '任务名称',
description: '任务需要在 2017-01-12 20:00 前启动',
extra: '未开始',
status: 'todo',
type: 'event',
},
{
id: '000000010',
title: '第三方紧急代码变更',
description: '冠霖提交于 2017-01-06需在 2017-01-07 前完成代码变更任务',
extra: '马上到期',
status: 'urgent',
type: 'event',
},
{
id: '000000011',
title: '信息安全考试',
description: '指派竹尔于 2017-01-09 前完成更新并发布',
extra: '已耗时 8 天',
status: 'doing',
type: 'event',
},
{
id: '000000012',
title: 'ABCD 版本发布',
description: '冠霖提交于 2017-01-06需在 2017-01-07 前完成代码变更任务',
extra: '进行中',
status: 'processing',
type: 'event',
},
],
});
break;
default:
res.json({data:[]})
break;
}
}
export default {
'GET /api/dataSource': getDataSource,
};

@ -1,41 +0,0 @@
export type DataItem = {
name: string;
state: string;
};
export type TableListItem = {
key: number;
disabled?: boolean;
href: string;
avatar: string;
name: string;
owner: string;
desc: string;
callNo: number;
status: string;
updatedAt: Date;
createdAt: Date;
progress: number;
};
export type TableListPagination = {
total: number;
pageSize: number;
current: number;
};
export type TableListData = {
list: TableListItem[];
pagination: Partial<TableListPagination>;
};
export type TableListParams = {
status?: string;
name?: string;
desc?: string;
key?: number;
pageSize?: number;
currentPage?: number;
filter?: Record<string, any[]>;
sorter?: Record<string, any>;
};

@ -1,3 +0,0 @@
.container {
color: blue;
}

@ -1,241 +0,0 @@
import React, { useEffect, useRef, useState } from 'react';
import { useRequest } from 'umi';
import type { ActionType } from '@ant-design/pro-table';
// import type { ProFormColumnsType } from '@ant-design/pro-form';
import { PageContainer } from '@ant-design/pro-layout';
import ProTable from '@ant-design/pro-table';
import type { ProDescriptionsItemProps } from '@ant-design/pro-descriptions';
import ProDescriptions from '@ant-design/pro-descriptions';
import { BetaSchemaForm} from '@ant-design/pro-form';
import { Button, Col, Modal, Row, Space } from 'antd';
import { MobileOutlined, PhoneOutlined, PlusOutlined } from '@ant-design/icons';
import { schemaExamination, dataExamination } from './service';
import type { DataItem } from './data';
export type TableListItem = {
id: string;
code: number;
name: string;
creator: string;
status: string;
createdAt: number;
progress: number;
money: number;
memo: string;
};
export default () => {
const [currentRow, setCurrentRow] = useState<TableListItem>();
const [showDetail, setShowDetail] = useState<boolean>(false);
const [showCreate, setShowCreate] = useState<boolean>(false);
const [showUpdate, setShowUpdate] = useState<boolean>(false);
const [columns, setColumns] = useState<any[]>([]);
const ref = useRef<ActionType>();
/** 获取数据结构体 */
const { data } = useRequest(schemaExamination);
console.log('debug1');
useEffect(() => {
const _data = data || [];
let idx = -1;
idx = _data?.findIndex((val: { dataIndex: string; })=>{ return val.dataIndex === 'publicTelephone' }) || -1;
if(idx !== -1){
_data[idx] = {..._data[idx], renderText: (val: string) => `${(val || '').replace(/(\d{2})(\d{2})(\d{4})/,"$1**$3")}`}
}
/** 渲染复合数据项 */
idx = _data?.findIndex((val: { dataIndex: string; })=>{ return val.dataIndex === 'examiner' }) || -1;
if(idx !== -1){
_data[idx] = {
..._data[idx],
render: (text: any) => (
<>
<span style={{ display: 'block' }}>{text?.realname}</span>
<small style={{ display: 'inline-block', marginRight: 5 }}><PhoneOutlined /> {text?.tel}</small>
<small style={{ display: 'inline-block', marginRight: 5 }}><MobileOutlined /> {text?.mobile}</small>
</>
)
}
}
/** 添加序号和操作列 */
setColumns(
[
{
title: '序号',
key: 'index',
valueType: 'indexBorder',
render: (text: React.ReactNode, _: any, index: number) =>{
if(ref && ref?.current && ref?.current?.pageInfo){
return `${(ref?.current?.pageInfo?.current - 1) * (ref.current.pageInfo?.pageSize) + (index + 1)}`;
}else{
return '';
}
},
width: 48,
},
..._data,
{
title: '操作',
width: 180,
key: 'option',
valueType: 'option',
render: (_dom: any, entity: React.SetStateAction<TableListItem | undefined>) => [
<a key="detail" onClick={() => {
console.log('entity', entity);
setCurrentRow(entity);
setShowDetail(true);
}} ></a>,
<a key="update" onClick={() => {
console.log('columns1', columns)
setCurrentRow(entity);
setShowUpdate(true);
console.log('columns2', columns)
}} ></a>,
<a key="delete" onClick={() => {
//
}} ></a>,
],
}
]
);
}, [data]);
/** 获取列数据初始值 */
const getInitialValues = (cols: any[], vals: any) => {
console.log('getInitialValues-columns', columns)
console.log('getInitialValues-values', vals)
const initialValues: any[] = [];
cols.forEach((column: { dataIndex: string; }) => {
const key: any = column?.dataIndex || '';
initialValues.push({...column, initialValue: key ? vals[key] : ''})
})
console.log('initialValues::',initialValues)
return initialValues || []
}
return (
<PageContainer>
<ProTable<TableListItem | any>
columns={columns}
request={dataExamination}
rowKey="id"
actionRef={ref}
pagination={{
showQuickJumper: true,
}}
search={{
layout: 'vertical',
defaultCollapsed: false,
}}
dateFormatter="string"
/*toolbar={{
title: '高级表格',
tooltip: '这是一个标题提示',
}}*/
toolBarRender={() => [
<Button type="primary" key="primary" onClick={() => {
console.log('columns::::', columns);
setShowCreate(true)
}}><PlusOutlined /> </Button>
]}
/>
<Modal
title={currentRow?.name || '详细'}
width='60%'
visible={showDetail}
onCancel={() => {
setCurrentRow(undefined); // 设置当前行
setShowDetail(false);
}}
footer={null}>
{currentRow?.name && (
<ProDescriptions<TableListItem>
column={2}
/* title={currentRow?.name} */
dataSource={currentRow}
/*
request={async () => ({
data: currentRow || {},
})}*/
params={{
id: currentRow?.id,
}}
columns={columns.slice(0, columns.length - 1) as ProDescriptionsItemProps<TableListItem>[]}
/>
)}
</Modal>
<Modal
title='新建考点'
//
width='60%'
visible={showCreate}
destroyOnClose
onCancel={() => {
setShowCreate(false);
}}
footer={null}
>
<BetaSchemaForm<DataItem>
layout = 'horizontal'
layoutType = 'Form'
labelCol = {{ span: 8 }}
wrapperCol={{ span: 12 }}
onFinish={async (values) => {
console.log(values);
}}
submitter={{
render: (props, doms) => (
<Row>
<Col span={12} offset={8}>
<Space>{doms}</Space>
</Col>
</Row>
),
}}
// action = ''
title = "新建"
columns = {columns}
/>
</Modal>
<Modal
title='编辑'
width='60%'
visible={showUpdate}
destroyOnClose
onCancel={() => {
setShowUpdate(false);
}}
footer={null}>
{currentRow?.name && (
<BetaSchemaForm<DataItem>
layout = 'horizontal'
layoutType = 'Form'
labelCol = {{ span: 8 }}
wrapperCol={{ span: 12 }}
onFinish={async (values) => {
console.log(values);
}}
submitter={{
render: (props, doms) => (
<Row>
<Col span={12} offset={8}>
<Space>{doms}</Space>
</Col>
</Row>
),
}}
// action = ''
title = "编辑"
columns = {getInitialValues(columns, currentRow)}
/>
)}
</Modal>
</PageContainer>
);
};

@ -1,76 +0,0 @@
import { request } from 'umi';
import { TableListItem } from './data';
import type { ProFormColumnsType } from '@ant-design/pro-form';
/** 获取考点数据结构 GET /api/dataSource?key=examination&schema=true&data=false */
export async function schemaExamination(
params: {
// query
},
options?: { [key: string]: any },
) {
return request<{
data: any[];
/** 字段总数 */
total?: number;
success?: boolean;
}>('/api/dataSource?key=examination&schema=true&data=false', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 获取考点列表数据 GET /api/dataSource?key=examination&schema=false&data=true */
export async function dataExamination(
params: {
// query
/** 当前的页码 */
current?: number;
/** 页面的容量 */
pageSize?: number;
},
options?: { [key: string]: any },
) {
return request<{
data: TableListItem[];
/** 列表的内容总数 */
total?: number;
success?: boolean;
}>('/api/dataSource?key=examination&schema=false&data=true', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新建考点 PUT /api/dataSource?key=examination */
export async function updateExamination(data: { [key: string]: any }, options?: { [key: string]: any }) {
return request<TableListItem>('/api/examination', {
data,
method: 'PUT',
...(options || {}),
});
}
/** 新建考点 POST /api/dataSource?key=examination */
export async function addExamination(data: { [key: string]: any }, options?: { [key: string]: any }) {
return request<TableListItem>('/api/examination', {
data,
method: 'POST',
...(options || {}),
});
}
/** 删除考点 DELETE /api/dataSource?key=examination */
export async function removeExamination(data: { key: number[] }, options?: { [key: string]: any }) {
return request<Record<string, any>>('/api/examination', {
data,
method: 'DELETE',
...(options || {}),
});
}
Loading…
Cancel
Save