chenpei ea9076df45 feat: 实现统一的下载错误处理系统并修复产品全案数据库Schema
- 创建统一的下载错误处理模块 (lib/download-errors.ts)
- 实现13种错误类型分类和中文错误消息
- 后端统一使用 createDownloadError 创建标准化错误响应
- 前端统一使用 parseDownloadError 解析错误并显示
- 修复正式系统数据库Schema,添加产品全案相关字段和表
- 执行数据库迁移:添加 task_no, task_status, task_fetched_at 字段
- 创建 material_assets, api_keys, api_call_logs 表
2026-01-05 17:52:42 +08:00

90 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { NextRequest, NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
import { prisma } from '@/lib/prisma';
import { isSystemAdmin } from '@/lib/department-permission';
// GET /api/admin/users - 获取用户列表
export async function GET() {
try {
const session = await getServerSession(authOptions);
if (!session || !session.user || !isSystemAdmin((session.user as any).role)) {
return NextResponse.json({ error: '无权限' }, { status: 403 });
}
const users = await prisma.user.findMany({
select: {
id: true,
email: true,
username: true,
realName: true, // 真实姓名(用于搜索)
role: true,
isActive: true, // 保留,向后兼容
status: true, // 新增:用户状态(阶段一)
canDownload: true,
department: true, // 保留,向后兼容
departmentId: true, // 新增:部门ID(阶段二)
managedDepartment: true, // 管理员负责的部门
createdAt: true,
lastLoginAt: true, // 新增:最后登录时间(阶段一)
loginCount: true, // 新增:登录次数(阶段一)
archivedAt: true, // 新增:归档时间(阶段一)
departmentRef: { // 新增:部门关联信息(阶段二)
select: {
id: true,
name: true,
}
},
_count: {
select: {
materials: {
where: {
deletedAt: null,
} as any,
},
},
},
},
orderBy: {
createdAt: 'desc',
},
});
return NextResponse.json(users);
} catch (error) {
console.error('Error fetching users:', error);
return NextResponse.json({ error: '获取用户列表失败' }, { status: 500 });
}
}
// DELETE /api/admin/users - 删除用户
export async function DELETE(request: NextRequest) {
try {
const session = await getServerSession(authOptions);
if (!session || !session.user || !isSystemAdmin((session.user as any).role)) {
return NextResponse.json({ error: '无权限' }, { status: 403 });
}
const { searchParams } = new URL(request.url);
const id = searchParams.get('id');
if (!id) {
return NextResponse.json({ error: '缺少用户ID' }, { status: 400 });
}
// 不能删除自己
if (id === (session.user as any).id) {
return NextResponse.json({ error: '不能删除自己' }, { status: 400 });
}
await prisma.user.delete({
where: { id },
});
return NextResponse.json({ message: '删除成功' });
} catch (error) {
console.error('Error deleting user:', error);
return NextResponse.json({ error: '删除失败' }, { status: 500 });
}
}