3.7 KiB
3.7 KiB
成员历史版本功能
概述
添加成员历史版本记录功能,实现:
- 记录每次成员信息的修改
- 显示详细的变更对比
- 支持版本回溯(未来功能)
数据库变更
1. 新增 MemberHistory 表
model MemberHistory {
id String @id @default(cuid())
memberId String
treeId String
version Int // 版本号
// 保存成员的完整快照
snapshot Json // 成员的所有字段
// 变更信息
changedBy String // 修改者ID
changedAt DateTime @default(now())
changeType Action // CREATE, UPDATE, DELETE
changes Json? // 具体变更的字段 { field: { old: ..., new: ... } }
@@index([memberId])
@@index([treeId])
@@index([changedAt])
@@unique([memberId, version])
}
2. 运行迁移
# 生成迁移文件
npx prisma migrate dev --name add_member_history
# 生成 Prisma Client
npx prisma generate
实现步骤
1. 创建辅助函数 (lib/member-history.ts)
recordMemberHistory(): 记录成员历史版本getMemberHistory(): 获取成员的历史版本列表compareVersions(): 比较两个版本的差异
2. 修改成员更新 API
在 app/api/trees/[treeId]/members/[memberId]/route.ts 中:
// 更新前获取旧数据
const existingMember = await prisma.familyMember.findFirst({
where: { id: memberId, treeId }
})
// 执行更新
const member = await prisma.familyMember.update({
where: { id: memberId },
data: body
})
// 记录历史版本
await recordMemberHistory({
memberId: member.id,
treeId,
changedBy: session.user.id,
changeType: 'UPDATE',
oldData: existingMember,
newData: member
})
3. 修改成员创建 API
// 创建成员
const member = await prisma.familyMember.create({
data: { ... }
})
// 记录初始版本
await recordMemberHistory({
memberId: member.id,
treeId,
changedBy: session.user.id,
changeType: 'CREATE',
newData: member
})
4. 更新 ActivityLog
修改 ActivityLog 的 changes 字段格式:
// 之前:保存整个 body
changes: body
// 现在:从 MemberHistory 获取实际变更
const history = await getMemberHistory(memberId)
const latestHistory = history[0]
changes: latestHistory?.changes || null
前端显示
1. 变更详情格式化 (components/settings/activity-log-viewer.tsx)
// 现在 changes 格式为:
{
fullName: { old: "虞雨涵", new: "虞雨欣" },
birthDate: { old: "1991-09-05", new: "1991-09-06" },
photoIds: { old: [], new: ["id1", "id2"] }
}
// 显示为:
• 修改了姓名:从 "虞雨涵" → "虞雨欣"
• 修改了出生日期:从 "1991-09-05" → "1991-09-06"
• 添加了照片:新增 2 张
2. 版本历史页面(未来功能)
在成员详情页添加"版本历史"标签:
- 显示所有历史版本
- 点击查看每个版本的详细信息
- 支持版本对比
- 支持回滚到历史版本
优势
- 完整记录:保存每次修改的完整快照
- 精确对比:只显示实际变更的字段
- 可追溯:可以查看任意时间点的成员信息
- 可回滚:支持恢复到历史版本(未来功能)
- 审计友好:满足数据审计需求
注意事项
- 存储空间:每次修改都保存完整快照,会占用较多存储空间
- 性能影响:每次更新需要额外写入历史表
- 数据清理:可能需要定期清理过旧的历史版本
下一步
- ✅ 设计数据库表结构
- ✅ 创建辅助函数
- ⏳ 运行数据库迁移
- ⏳ 修改 API 集成历史记录
- ⏳ 更新前端显示
- ⏳ 测试功能
- 🔮 实现版本历史页面(未来)
- 🔮 实现版本回滚功能(未来)