✨ 我是 Muzi 的「文章捕手」,擅长在文字的星海中打捞精华。每当新的篇章诞生,我就会像整理贝壳一样,将思想的闪光点串成珍珠项链~
本次开发完成了管理后台多个关键页面(仪表盘、用户管理、模板管理)及个人资料页面的实现,增强了版本下载功能。仪表盘展示用户、项目等统计信息,用户管理支持分页、角色筛选及角色修改,模板管理实现分类筛选及启用禁用功能,个人资料页支持昵称编辑和账户注销。版本下载新增进度条和格式选择。论文管理页面支持拖拽上传及进度追踪。后端API已实现用户列表、角色修改和统计数据接口。项目整体进度约60%,涵盖基础架构、核心功能及部分AI功能,后续计划完善Admin相关API及AI多智能体生成。
# Thesis Project Generator - 开发日记 #2
# 前言
本次开发主要完成了管理后台的多个页面(仪表盘、用户管理、模板管理)以及个人资料页面的实现,同时完成了版本下载 API 的增强。
# 一、管理后台仪表盘
# 1.1 页面结构
访问路径:/admin
页面组成:
- 统计卡片(4个):用户总数、项目总数、生成次数、模板数量
- 用户活跃度图表(模拟数据)
- 系统状态指示
# 1.2 前端实现
// app/(dashboard)/admin/page.tsx
const statsCards = [
{ title: '用户总数', value: statsData.totalUsers, icon: Users },
{ title: '项目总数', value: statsData.totalProjects, icon: FolderKanban },
{ title: '生成次数', value: statsData.totalGenerations, icon: Sparkles },
{ title: '模板数量', value: statsData.totalTemplates, icon: LayoutTemplate },
];
# 1.3 API 对接
// 目前使用 Mock 数据
// 后续需要实现 adminApi.getStats()
const { data: statsData } = useAdminStats();
# 二、用户管理页面
# 2.1 页面结构
访问路径:/admin/users
功能:
- 用户列表展示(分页)
- 角色筛选(全部/管理员/普通用户)
- 搜索用户(按昵称)
- 修改用户角色
# 2.2 前端实现
// 角色筛选
<Select value={roleFilter} onValueChange={setRoleFilter}>
<SelectTrigger><SelectValue placeholder="角色" /></SelectTrigger>
<SelectContent>
<SelectItem value="all">全部</SelectItem>
<SelectItem value="ADMIN">管理员</SelectItem>
<SelectItem value="USER">普通用户</SelectItem>
</SelectContent>
</Select>
// 角色修改
const handleRoleChange = async (userId: string, newRole: string) => {
await adminApi.updateUserRole(userId, newRole);
};
# 2.3 后端 API(已实现)
| 接口 | 方法 | 路径 |
|---|---|---|
| 获取用户列表 | GET | /admin/users |
| 修改用户角色 | PUT | /admin/users/{id}/role |
| 获取统计数据 | GET | /admin/stats |
# 三、模板管理页面
# 3.1 页面结构
访问路径:/admin/templates
功能:
- 模板列表展示
- 分类筛选(全部/管理系统/电商/博客/其他)
- 启用/禁用模板
- 使用统计展示
# 3.2 模板 DTO
interface AdminTemplateDTO {
id: string;
name: string;
description: string;
category: string;
techStack: string;
usageCount: number;
isActive: boolean;
createdAt: string;
}
# 3.3 启用/禁用功能
const handleToggleActive = async (templateId: string, currentStatus: boolean) => {
const newStatus = !currentStatus;
await adminApi.toggleTemplateActive(templateId, newStatus);
// 乐观更新
setTemplates(prev =>
prev.map(t => t.id === templateId ? { ...t, isActive: newStatus } : t)
);
};
# 四、个人资料页面
# 4.1 页面结构
访问路径:/profile
功能:
- 头像展示
- 昵称编辑
- 安全设置(密码修改入口)
- 账户注销
# 4.2 前端实现
// 昵称更新
const handleNicknameUpdate = async () => {
try {
await userApi.updateProfile({ nickname: nicknameInput });
toast({ title: '更新成功' });
} catch (error) {
toast({ title: '更新失败', variant: 'destructive' });
}
};
// 注销账户
const handleDeleteAccount = async () => {
if (confirm('确定要注销账户吗?此操作不可恢复。')) {
await userApi.deleteAccount();
// 跳转到首页
}
};
# 五、版本下载 UI 增强
# 5.1 功能点
- 下载进度条
- 格式选择(ZIP / TAR.GZ)
- 下载状态展示
# 5.2 前端实现
const handleDownload = async (format: 'zip' | 'tar.gz') => {
setDownloadProgress(0);
// 模拟下载进度
const interval = setInterval(() => {
setDownloadProgress(prev => Math.min(prev + 10, 90));
}, 500);
try {
const response = await versionApi.downloadVersion(projectId, versionId, format);
// 处理下载
setDownloadProgress(100);
} finally {
clearInterval(interval);
}
};
# 六、论文管理页面
# 6.1 页面结构
访问路径:/papers
功能:
- 拖拽上传论文
- 上传进度追踪
- 论文列表展示
- 解析状态查看
# 6.2 前端实现
// 拖拽上传
<Dropzone
onDrop={async (files) => {
for (const file of files) {
await uploadWithProgress(file);
}
}}
>
<div className="flex flex-col items-center gap-2">
<Upload className="h-8 w-8 text-muted-foreground" />
<span>拖拽论文文件或点击上传</span>
<span className="text-xs text-muted-foreground">支持 PDF、DOCX</span>
</div>
</Dropzone>
# 今日成果
# 功能完成
- ✅ 管理后台仪表盘 (
/admin) - ✅ 用户管理页面 (
/admin/users) - ✅ 模板管理页面 (
/admin/templates) - ✅ 个人资料页面 (
/profile) - ✅ 论文管理页面 (
/papers) - ✅ 版本下载 UI 增强
# 项目进度更新
| 模块 | 进度 | 说明 |
|---|---|---|
| M1 基础架构 | 100% | ✅ |
| M2 核心功能 | 96% | ✅ |
| M3 AI 功能 | 54% | 论文管理页面完成 |
| M4 模板后台 | 62% | Admin 页面完成 |
| M5 测试优化 | 17% | 单元测试框架 |
总体进度: ~60%