# 🔐 按钮权限分类清单 ## 📋 按钮分类 ### 一、增删改类按钮(写操作) #### 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) && ( )} {permissions.canDeleteTree(role) && ( )} // 方式2: 禁用状态 ``` ### 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 (