Files
agent/mock/project.mock.ts
2026-02-16 12:46:37 +08:00

178 lines
5.3 KiB
TypeScript

import { Request, Response } from 'express';
const appTypeList: string[] = ['pc', 'h5', 'miniapp', 'webapp'];
const statusList: string[] = ['developing', 'online', 'offline', 'maintenance'];
const genAppList = () => {
const appData = [
{
name: '企业官网',
icon: '🏢',
type: 'pc',
desc: '企业官方网站,展示品牌形象',
},
{ name: '管理后台', icon: '⚙️', type: 'pc', desc: '企业内部管理系统' },
{ name: '移动端官网', icon: '📱', type: 'h5', desc: '移动端展示网站' },
{ name: '微信小程序', icon: '💬', type: 'miniapp', desc: '微信生态小程序' },
{
name: '员工Portal',
icon: '👥',
type: 'webapp',
desc: '员工工作入口平台',
},
{ name: '客户管理系统', icon: '🤝', type: 'pc', desc: 'CRM客户关系管理' },
{ name: '微商城', icon: '🛒', type: 'miniapp', desc: '微信小程序商城' },
{
name: '数据分析平台',
icon: '📊',
type: 'pc',
desc: '企业数据可视化平台',
},
{ name: '移动OA', icon: '📋', type: 'h5', desc: '移动办公应用' },
{ name: '知识库', icon: '📚', type: 'webapp', desc: '企业知识管理平台' },
{ name: '招聘系统', icon: '👔', type: 'pc', desc: '在线招聘管理平台' },
{ name: '会议系统', icon: '🎥', type: 'webapp', desc: '视频会议管理' },
];
return appData.map((item, index) => ({
id: `app-${index + 1}`,
appName: item.name,
appDesc: item.desc,
appIcon: item.icon,
appType: item.type,
status: statusList[index % 4],
version: `v${Math.floor(Math.random() * 3) + 1}.${Math.floor(
Math.random() * 10,
)}.${Math.floor(Math.random() * 20)}`,
owner: ['张三', '李四', '王五', '赵六', '钱七'][index % 5],
url: `https://app${index + 1}.example.com`,
tags: [
['企业', '重要'],
['内部', '核心'],
['移动端', '新项目'],
['微信生态'],
][index % 4],
createdAt: new Date(
Date.now() - Math.random() * 90 * 24 * 60 * 60 * 1000,
).toISOString(),
updatedAt: new Date(
Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000,
).toISOString(),
}));
};
let appDataSource = genAppList();
// 计算统计数据
const calculateStats = () => {
const stats = {
total: appDataSource.length,
online: 0,
developing: 0,
offline: 0,
maintenance: 0,
};
appDataSource.forEach((app: { status: string }) => {
if (app.status === 'online') stats.online++;
else if (app.status === 'developing') stats.developing++;
else if (app.status === 'offline') stats.offline++;
else if (app.status === 'maintenance') stats.maintenance++;
});
return stats;
};
export default {
'GET /api/projects': (req: Request, res: Response) => {
const current = Number(req.query.current) || 1;
const pageSize = Number(req.query.pageSize) || 12;
const appName = req.query.appName as string | undefined;
const owner = req.query.owner as string | undefined;
const appType = req.query.appType as string | undefined;
const status = req.query.status as string | undefined;
let filtered = [...appDataSource];
// 关键词搜索
if (appName) {
filtered = filtered.filter((p) => p.appName.includes(appName));
}
if (owner) {
filtered = filtered.filter((p) => p.owner.includes(owner));
}
if (appType) {
filtered = filtered.filter((p) => p.appType === appType);
}
if (status) {
filtered = filtered.filter((p) => p.status === status);
}
// 分页
const start = (current - 1) * pageSize;
const data = filtered.slice(start, start + pageSize);
res.json({
data,
total: filtered.length,
success: true,
current,
pageSize,
});
},
'GET /api/projects/stats': (_req: Request, res: Response) => {
const stats = calculateStats();
res.json({
stats,
success: true,
});
},
'POST /api/projects': (req: Request, res: Response) => {
const newApp = {
...req.body,
id: `app-${Date.now()}`,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
};
appDataSource.unshift(newApp);
res.json(newApp);
},
'PUT /api/projects/:id': (req: Request, res: Response) => {
const { id } = req.params;
const index = appDataSource.findIndex((p) => p.id === id);
if (index !== -1) {
appDataSource[index] = {
...appDataSource[index],
...req.body,
updatedAt: new Date().toISOString(),
};
res.json(appDataSource[index]);
} else {
res.status(404).json({ success: false, message: '应用不存在' });
}
},
'PUT /api/projects/:id/status': (req: Request, res: Response) => {
const { id } = req.params;
const { status } = req.body;
const index = appDataSource.findIndex((p) => p.id === id);
if (index !== -1) {
appDataSource[index] = {
...appDataSource[index],
status,
updatedAt: new Date().toISOString(),
};
res.json(appDataSource[index]);
} else {
res.status(404).json({ success: false, message: '应用不存在' });
}
},
'DELETE /api/projects/:id': (req: Request, res: Response) => {
const { id } = req.params;
appDataSource = appDataSource.filter((p) => p.id !== id);
res.json({ success: true });
},
};