You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
5.0 KiB
176 lines
5.0 KiB
import { Request, Response } from 'express'; |
|
import moment from 'moment'; |
|
import { parse } from 'url'; |
|
|
|
// mock tableListDataSource |
|
const genList = (current: number, pageSize: number) => { |
|
const tableListDataSource: API.RuleListItem[] = []; |
|
|
|
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, |
|
updatedAt: moment().format('YYYY-MM-DD'), |
|
createdAt: moment().format('YYYY-MM-DD'), |
|
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 API.PageParams & |
|
API.RuleListItem & { |
|
sorter: any; |
|
filter: any; |
|
}; |
|
|
|
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); |
|
dataSource = dataSource.sort((prev, next) => { |
|
let sortNumber = 0; |
|
(Object.keys(sorter) as Array<keyof API.RuleListItem>).forEach((key) => { |
|
let nextSort = next?.[key] as number; |
|
let preSort = prev?.[key] as number; |
|
if (sorter[key] === 'descend') { |
|
if (preSort - nextSort > 0) { |
|
sortNumber += -1; |
|
} else { |
|
sortNumber += 1; |
|
} |
|
return; |
|
} |
|
if (preSort - nextSort > 0) { |
|
sortNumber += 1; |
|
} else { |
|
sortNumber += -1; |
|
} |
|
}); |
|
return sortNumber; |
|
}); |
|
} |
|
if (params.filter) { |
|
const filter = JSON.parse(params.filter as any) as { |
|
[key: string]: string[]; |
|
}; |
|
if (Object.keys(filter).length > 0) { |
|
dataSource = dataSource.filter((item) => { |
|
return (Object.keys(filter) as Array<keyof API.RuleListItem>).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 || '')); |
|
} |
|
const result = { |
|
data: dataSource, |
|
total: tableListDataSource.length, |
|
success: true, |
|
pageSize, |
|
current: parseInt(`${params.current}`, 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 { method, name, desc, key } = body; |
|
|
|
switch (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: API.RuleListItem = { |
|
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, |
|
updatedAt: moment().format('YYYY-MM-DD'), |
|
createdAt: moment().format('YYYY-MM-DD'), |
|
progress: Math.ceil(Math.random() * 100), |
|
}; |
|
tableListDataSource.unshift(newRule); |
|
return res.json(newRule); |
|
})(); |
|
return; |
|
|
|
case 'update': |
|
(() => { |
|
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, |
|
};
|
|
|