| 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,  | 
| };  |