0.0.8.0
This commit is contained in:
@@ -0,0 +1,326 @@
|
||||
# 🔐 按钮权限分类清单
|
||||
|
||||
## 📋 按钮分类
|
||||
|
||||
### 一、增删改类按钮(写操作)
|
||||
|
||||
#### 1. 增加类(Create)
|
||||
| 按钮名称 | 位置 | OWNER | EDITOR | VIEWER |
|
||||
|---------|------|-------|--------|--------|
|
||||
| **添加成员** | 首页、成员列表 | ✅ | ✅ | ❌ |
|
||||
| **新增成员** | 成员列表 | ✅ | ✅ | ❌ |
|
||||
| **添加父亲** | 成员详情 | ✅ | ✅ | ❌ |
|
||||
| **添加母亲** | 成员详情 | ✅ | ✅ | ❌ |
|
||||
| **添加子女** | 成员详情 | ✅ | ✅ | ❌ |
|
||||
| **添加配偶** | 成员详情 | ✅ | ✅ | ❌ |
|
||||
| **创建家族树** | 导航、创建页 | ✅ | ✅ | ❌ |
|
||||
| **邀请协作者** | 设置 | ✅ | ❌ | ❌ |
|
||||
|
||||
#### 2. 修改类(Update)
|
||||
| 按钮名称 | 位置 | OWNER | EDITOR | VIEWER |
|
||||
|---------|------|-------|--------|--------|
|
||||
| **编辑** | 成员详情 | ✅ | ✅ | ❌ |
|
||||
| **保存** | 编辑页面 | ✅ | ✅ | ❌ |
|
||||
| **修改密码** | 设置 | ✅ | ✅ | ✅ |
|
||||
| **导入数据** | 设置 | ✅ | ✅ | ❌ |
|
||||
| **导入GEDCOM** | 设置 | ✅ | ✅ | ❌ |
|
||||
|
||||
#### 3. 删除类(Delete)
|
||||
| 按钮名称 | 位置 | OWNER | EDITOR | VIEWER |
|
||||
|---------|------|-------|--------|--------|
|
||||
| **删除成员** | 成员详情 | ✅ | ✅ | ❌ |
|
||||
| **删除家族树** | 导航 | ✅ | ❌ | ❌ |
|
||||
| **移除协作者** | 设置 | ✅ | ❌ | ❌ |
|
||||
| **清空数据** | 设置 | ✅ | ❌ | ❌ |
|
||||
| **清空日志** | 设置 | ✅ | ❌ | ❌ |
|
||||
|
||||
---
|
||||
|
||||
### 二、查类按钮(读操作)
|
||||
|
||||
#### 1. 查看类(View)
|
||||
| 按钮名称 | 位置 | OWNER | EDITOR | VIEWER |
|
||||
|---------|------|-------|--------|--------|
|
||||
| **查看详情** | 所有列表 | ✅ | ✅ | ✅ |
|
||||
| **查看全部** | 首页 | ✅ | ✅ | ✅ |
|
||||
| **查看族谱图** | 首页、导航 | ✅ | ✅ | ✅ |
|
||||
| **查看大事记** | 导航 | ✅ | ✅ | ✅ |
|
||||
| **查看时间线** | 大事记 | ✅ | ✅ | ✅ |
|
||||
| **查看迁徙记录** | 大事记 | ✅ | ✅ | ✅ |
|
||||
|
||||
#### 2. 搜索查询类(Search/Query)
|
||||
| 按钮名称 | 位置 | OWNER | EDITOR | VIEWER |
|
||||
|---------|------|-------|--------|--------|
|
||||
| **搜索** | 导航、成员列表 | ✅ | ✅ | ✅ |
|
||||
| **筛选** | 成员列表 | ✅ | ✅ | ✅ |
|
||||
| **关系查询** | 族谱图 | ✅ | ✅ | ✅ |
|
||||
| **计算关系** | 关系计算 | ✅ | ✅ | ✅ |
|
||||
| **在族谱图中定位** | 成员列表 | ✅ | ✅ | ✅ |
|
||||
|
||||
#### 3. 导出类(Export)
|
||||
| 按钮名称 | 位置 | OWNER | EDITOR | VIEWER |
|
||||
|---------|------|-------|--------|--------|
|
||||
| **导出数据** | 设置 | ✅ | ✅ | ✅ |
|
||||
| **导出GEDCOM** | 设置 | ✅ | ✅ | ✅ |
|
||||
| **导出图片** | 族谱图 | ✅ | ✅ | ✅ |
|
||||
| **打印** | 成员详情 | ✅ | ✅ | ✅ |
|
||||
|
||||
#### 4. 视图控制类(View Control)
|
||||
| 按钮名称 | 位置 | OWNER | EDITOR | VIEWER |
|
||||
|---------|------|-------|--------|--------|
|
||||
| **放大** | 族谱图 | ✅ | ✅ | ✅ |
|
||||
| **缩小** | 族谱图 | ✅ | ✅ | ✅ |
|
||||
| **重置** | 族谱图 | ✅ | ✅ | ✅ |
|
||||
| **切换视图** | 族谱图 | ✅ | ✅ | ✅ |
|
||||
| **切换标签** | 大事记 | ✅ | ✅ | ✅ |
|
||||
|
||||
#### 5. 导航类(Navigation)
|
||||
| 按钮名称 | 位置 | OWNER | EDITOR | VIEWER |
|
||||
|---------|------|-------|--------|--------|
|
||||
| **返回** | 所有页面 | ✅ | ✅ | ✅ |
|
||||
| **取消** | 编辑页面 | ✅ | ✅ | ✅ |
|
||||
| **关闭** | 对话框 | ✅ | ✅ | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 权限总结
|
||||
|
||||
### OWNER(创建者)- 全部权限
|
||||
**可用按钮**: 80+ 个
|
||||
|
||||
#### 独有权限(只有 OWNER 可以)
|
||||
- ❌ 删除家族树
|
||||
- ❌ 邀请协作者
|
||||
- ❌ 移除协作者
|
||||
- ❌ 清空数据
|
||||
- ❌ 清空日志
|
||||
|
||||
#### 完整权限列表
|
||||
- ✅ 所有增加操作
|
||||
- ✅ 所有修改操作
|
||||
- ✅ 所有删除操作
|
||||
- ✅ 所有查看操作
|
||||
- ✅ 所有管理操作
|
||||
|
||||
---
|
||||
|
||||
### EDITOR(编辑者)- 编辑权限
|
||||
**可用按钮**: 60+ 个
|
||||
|
||||
#### 可以执行的操作
|
||||
- ✅ 添加成员(所有类型)
|
||||
- ✅ 编辑成员信息
|
||||
- ✅ 删除成员
|
||||
- ✅ 导入数据
|
||||
- ✅ 所有查看操作
|
||||
- ✅ 所有查询操作
|
||||
- ✅ 所有导出操作
|
||||
|
||||
#### 不能执行的操作
|
||||
- ❌ 删除家族树
|
||||
- ❌ 邀请协作者
|
||||
- ❌ 移除协作者
|
||||
- ❌ 清空数据
|
||||
- ❌ 清空日志
|
||||
|
||||
---
|
||||
|
||||
### VIEWER(查看者)- 只读权限
|
||||
**可用按钮**: 30+ 个
|
||||
|
||||
#### 可以执行的操作
|
||||
- ✅ 查看所有信息
|
||||
- ✅ 搜索和筛选
|
||||
- ✅ 关系查询
|
||||
- ✅ 导出数据
|
||||
- ✅ 打印
|
||||
- ✅ 视图控制(放大、缩小等)
|
||||
- ✅ 修改自己的密码
|
||||
|
||||
#### 不能执行的操作
|
||||
- ❌ 添加成员
|
||||
- ❌ 编辑成员
|
||||
- ❌ 删除成员
|
||||
- ❌ 导入数据
|
||||
- ❌ 删除家族树
|
||||
- ❌ 管理协作者
|
||||
- ❌ 清空数据
|
||||
|
||||
---
|
||||
|
||||
## 💻 代码实现
|
||||
|
||||
### 1. 权限检查函数
|
||||
|
||||
```typescript
|
||||
// lib/permissions.ts
|
||||
export type Role = "OWNER" | "EDITOR" | "VIEWER"
|
||||
|
||||
export const permissions = {
|
||||
// 增加权限
|
||||
canCreate: (role: Role) => role === "OWNER" || role === "EDITOR",
|
||||
|
||||
// 修改权限
|
||||
canUpdate: (role: Role) => role === "OWNER" || role === "EDITOR",
|
||||
|
||||
// 删除成员权限
|
||||
canDeleteMember: (role: Role) => role === "OWNER" || role === "EDITOR",
|
||||
|
||||
// 删除家族树权限(仅 OWNER)
|
||||
canDeleteTree: (role: Role) => role === "OWNER",
|
||||
|
||||
// 管理协作者权限(仅 OWNER)
|
||||
canManageCollaborators: (role: Role) => role === "OWNER",
|
||||
|
||||
// 清空数据权限(仅 OWNER)
|
||||
canClearData: (role: Role) => role === "OWNER",
|
||||
|
||||
// 查看权限(所有人)
|
||||
canView: (role: Role) => true,
|
||||
|
||||
// 导出权限(所有人)
|
||||
canExport: (role: Role) => true,
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 按钮权限控制
|
||||
|
||||
```tsx
|
||||
// 方式1: 条件渲染(推荐)
|
||||
import { permissions } from "@/lib/permissions"
|
||||
|
||||
{permissions.canCreate(role) && (
|
||||
<Button onClick={handleAdd}>
|
||||
<Plus className="h-4 w-4 mr-2" />
|
||||
添加成员
|
||||
</Button>
|
||||
)}
|
||||
|
||||
{permissions.canDeleteTree(role) && (
|
||||
<Button variant="destructive" onClick={handleDeleteTree}>
|
||||
删除家族树
|
||||
</Button>
|
||||
)}
|
||||
|
||||
// 方式2: 禁用状态
|
||||
<Button
|
||||
disabled={!permissions.canUpdate(role)}
|
||||
onClick={handleEdit}
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
```
|
||||
|
||||
### 3. 完整示例
|
||||
|
||||
```tsx
|
||||
// components/member-actions.tsx
|
||||
import { permissions } from "@/lib/permissions"
|
||||
import { useFamily } from "@/context/family-context"
|
||||
|
||||
export function MemberActions({ memberId }: { memberId: string }) {
|
||||
const { currentTree } = useFamily()
|
||||
const role = currentTree?.currentUserRole
|
||||
|
||||
if (!role) return null
|
||||
|
||||
return (
|
||||
<div className="flex gap-2">
|
||||
{/* 查看按钮 - 所有人可见 */}
|
||||
<Button variant="outline" onClick={handleView}>
|
||||
查看详情
|
||||
</Button>
|
||||
|
||||
{/* 编辑按钮 - OWNER 和 EDITOR 可见 */}
|
||||
{permissions.canUpdate(role) && (
|
||||
<Button variant="outline" onClick={handleEdit}>
|
||||
<Edit className="h-4 w-4 mr-2" />
|
||||
编辑
|
||||
</Button>
|
||||
)}
|
||||
|
||||
{/* 删除按钮 - OWNER 和 EDITOR 可见 */}
|
||||
{permissions.canDeleteMember(role) && (
|
||||
<Button variant="destructive" onClick={handleDelete}>
|
||||
<Trash className="h-4 w-4 mr-2" />
|
||||
删除
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 权限对比表
|
||||
|
||||
| 操作类型 | OWNER | EDITOR | VIEWER | 说明 |
|
||||
|---------|-------|--------|--------|------|
|
||||
| **查看信息** | ✅ | ✅ | ✅ | 所有人可查看 |
|
||||
| **搜索查询** | ✅ | ✅ | ✅ | 所有人可查询 |
|
||||
| **导出数据** | ✅ | ✅ | ✅ | 所有人可导出 |
|
||||
| **添加成员** | ✅ | ✅ | ❌ | 编辑权限 |
|
||||
| **编辑成员** | ✅ | ✅ | ❌ | 编辑权限 |
|
||||
| **删除成员** | ✅ | ✅ | ❌ | 编辑权限 |
|
||||
| **导入数据** | ✅ | ✅ | ❌ | 编辑权限 |
|
||||
| **邀请协作者** | ✅ | ❌ | ❌ | 仅创建者 |
|
||||
| **删除家族树** | ✅ | ❌ | ❌ | 仅创建者 |
|
||||
| **清空数据** | ✅ | ❌ | ❌ | 仅创建者 |
|
||||
|
||||
---
|
||||
|
||||
## 🔍 快速查找
|
||||
|
||||
### 需要 OWNER 权限的按钮(5个)
|
||||
1. 删除家族树
|
||||
2. 邀请协作者
|
||||
3. 移除协作者
|
||||
4. 清空数据
|
||||
5. 清空日志
|
||||
|
||||
### 需要 EDITOR 权限的按钮(25个)
|
||||
1. 所有"添加"按钮(8个)
|
||||
2. 所有"编辑"按钮(5个)
|
||||
3. 删除成员(1个)
|
||||
4. 导入相关(2个)
|
||||
5. 其他编辑操作(9个)
|
||||
|
||||
### VIEWER 可用的按钮(30个)
|
||||
1. 所有"查看"按钮(6个)
|
||||
2. 所有"搜索"按钮(5个)
|
||||
3. 所有"导出"按钮(4个)
|
||||
4. 所有"视图控制"按钮(5个)
|
||||
5. 所有"导航"按钮(10个)
|
||||
|
||||
---
|
||||
|
||||
## 📝 实施检查清单
|
||||
|
||||
### 代码实施
|
||||
- [ ] 创建权限检查函数 (`lib/permissions.ts`)
|
||||
- [ ] 更新所有按钮组件,添加权限检查
|
||||
- [ ] 测试 OWNER 权限
|
||||
- [ ] 测试 EDITOR 权限
|
||||
- [ ] 测试 VIEWER 权限
|
||||
|
||||
### API 层面
|
||||
- [ ] API 路由添加权限验证
|
||||
- [ ] 数据库操作添加权限检查
|
||||
- [ ] 返回适当的错误信息
|
||||
|
||||
### 用户界面
|
||||
- [ ] 无权限的按钮隐藏或禁用
|
||||
- [ ] 添加权限提示信息
|
||||
- [ ] 测试所有页面的权限显示
|
||||
|
||||
### 文档更新
|
||||
- [ ] 更新用户手册
|
||||
- [ ] 更新 API 文档
|
||||
- [ ] 更新开发文档
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0
|
||||
**最后更新**: 2025-11-23
|
||||
**维护人员**: System
|
||||
Reference in New Issue
Block a user