178 lines
5.3 KiB
TypeScript
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 });
|
|
},
|
|
};
|