# 拖拽修改权限等级功能 - 完整实现 ## 🎯 功能概述 根据您的需求,我们实现了通过拖拽方式修改部门权限等级(grade)的功能。 **核心特性:** - ✅ 拖拽节点名称旁的提示文字 `⋮⋮ 拖拽修改权限` - ✅ 弹出权限等级选择面板(90/80/70/60/50/0) - ✅ 支持6个权限等级(超级/高级/中级/一般/较低/普通) - ✅ 显示当前权限等级 - ✅ 拖拽时实时提示 - ✅ 点击面板选择新等级 - ✅ 确认后更新数据库 --- ## 🎨 界面设计 ### 1. 权限等级显示 每个部门节点显示当前权限等级: ``` 🔑 权限等级: 80 ``` - 样式:黄色背景 (#fef3c7),橙色边框 (#fcd34d) - 位置:部门代码和区域标签下方 - 图标:🔑 钥匙图标 ### 2. 拖拽提示 节点名称右侧显示拖拽提示: ``` 部门名称 ⋮⋮ 拖拽修改权限 ``` - 字体:11px,灰色 (#9ca3af) - 鼠标样式:move(可移动) - 拖拽时:半透明 + 阴影 + 旋转效果 ### 3. 权限等级选择面板 **位置:** 页面右上角 **样式:** - 白色卡片,紫色边框 (#4f46e5) - 圆角12px,大阴影 - 280px 最小宽度 **内容:** ``` ┌────────────────────────┐ │ 修改「XX部门」的权限等级 │ │ 当前等级:80,选择新等级: │ │ ┌───┐ ┌───┐ ┌───┐ │ │ │ 90│ │ 80│ │ 70│ │ │ │超级│ │高级│ │中级│ │ │ └───┘ └───┘ └───┘ │ │ ┌───┐ ┌───┐ ┌───┐ │ │ │ 60│ │ 50│ │ 0│ │ │ │一般│ │较低│ │普通│ │ │ └───┘ └───┘ └───┘ │ └────────────────────────┘ ``` **交互效果:** - 悬停:边框变蓝,背景变淡蓝,上移2px - 点击:边框和背景变蓝,白色文字,加粗 --- ## ⚙️ 技术实现 ### 后端改动 #### 1. 数据库 Schema (`licensing_repo.py`) ```sql ALTER TABLE service_departments ADD COLUMN IF NOT EXISTS grade int DEFAULT 0; CREATE INDEX IF NOT EXISTS service_departments_grade_idx ON service_departments (grade); ``` #### 2. 服务函数 (`licensing_repo.py`) **创建部门** - 支持grade参数: ```python def create_service_department( name: str, *, code: Optional[str] = None, phone: Optional[str] = None, parent_id: Optional[str] = None, region_id: Optional[str] = None, description: Optional[str] = None, grade: Optional[int] = 0, # 新增 ) -> Dict[str, Any]: ``` **更新部门** - 支持grade更新: ```python def update_service_department( department_id: str, *, name: Optional[str] = None, phone: Optional[str] = None, parent_id: Optional[str] = None, region_id: Optional[str] = None, description: Optional[str] = None, grade: Optional[int] = None, # 新增 ) -> Optional[Dict[str, Any]]: ``` **序列化** - 返回grade字段: ```python def _serialize_service_department_row(record: Dict[str, Any]) -> Dict[str, Any]: return { ... "grade": record.get("grade", 0), # 新增 ... } ``` #### 3. API 路由 (`v2.py`) **创建部门** - 处理grade: ```python POST /fs-ai-asistant/api/workflow/lawrisk/admin/service-departments { "name": "部门名称", "code": "部门账号", "grade": 80, # 新增字段 ... } ``` **更新部门** - 处理grade更新: ```python PATCH /fs-ai-asistant/api/workflow/lawrisk/admin/service-departments/{id} { "grade": 90, # 修改权限等级 ... } ``` ### 前端实现 #### 1. HTML结构 (`super_admin.html`) ```html

选择权限等级

拖拽部门到此处来修改权限

90 超级
80 高级
70 中级
60 一般
50 较低
0 普通
``` #### 2. CSS样式 (`super_admin.html`) ```css /* 权限等级显示 */ .node-grade { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; background: #fef3c7; border-radius: 6px; font-size: 12px; color: #92400e; border: 1px solid #fcd34d; } /* 权限等级选择面板 */ .grade-drop-panel { position: fixed; background: white; border: 2px solid #4f46e5; border-radius: 12px; padding: 16px; box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25); z-index: 2000; min-width: 280px; } /* 权限等级选项 */ .grade-option { border: 2px solid #e5e7eb; border-radius: 8px; padding: 12px 8px; text-align: center; cursor: pointer; transition: all 0.2s ease; background: #f9fafb; } .grade-option:hover { border-color: #4f46e5; background: #eef2ff; transform: translateY(-2px); } ``` #### 3. JavaScript逻辑 (`super_admin.html`) ```javascript function initDragAndDrop() { const nameSpans = document.querySelectorAll('.node-name'); const gradePanel = document.getElementById('gradeDropPanel'); nameSpans.forEach(span => { const nodeDiv = span.closest('.org-node'); const nodeId = nodeDiv.getAttribute('data-node-id'); span.setAttribute('draggable', 'true'); span.addEventListener('dragstart', (evt) => { currentDraggedNode = nodeId; nodeDiv.classList.add('dragging'); const sourceNode = orgChartData.nodeMap[nodeId]; gradePanel.querySelector('h4').textContent = `修改「${sourceNode.name}」的权限等级`; gradePanel.querySelector('p').textContent = '当前等级:' + (sourceNode.grade || 0) + ',选择新等级:'; gradePanel.classList.add('show'); }); span.addEventListener('dragend', () => { nodeDiv.classList.remove('dragging'); gradePanel.classList.remove('show'); currentDraggedNode = null; }); }); // 点击权限等级选项 gradePanel.querySelectorAll('.grade-option').forEach(option => { option.addEventListener('click', async () => { const newGrade = parseInt(option.dataset.grade); const sourceNode = orgChartData.nodeMap[currentDraggedNode]; const currentGrade = sourceNode.grade || 0; if (confirm(`确定要将「${sourceNode.name}」的权限等级从 ${currentGrade} 修改为 ${newGrade} 吗?`)) { await fetchJSON(`${API_BASE}/admin/service-departments/${sourceNode.id}`, { method: 'PATCH', body: JSON.stringify({ grade: newGrade }) }); showMessage(`权限等级已更新为 ${newGrade}`, 'success'); gradePanel.classList.remove('show'); await loadOrgChart(); } }); }); } ``` --- ## 🎬 使用步骤 ### 1. 访问界面 ``` http://127.0.0.1:8000/static/super_admin.html ``` ### 2. 切换到组织架构标签页 点击「组织架构」标签 ### 3. 查看权限等级 每个部门节点下方显示: ``` 🔑 权限等级: 80 ``` ### 4. 拖拽修改权限 1. **开始拖拽**:拖拽节点名称右侧的 `⋮⋮ 拖拽修改权限` 2. **显示面板**:权限等级选择面板自动弹出 3. **选择等级**:点击面板中的权限等级(90/80/70/60/50/0) 4. **确认操作**:弹出确认对话框 5. **完成更新**:数据库更新,界面刷新 ### 5. 新增部门时设置权限 1. 点击 `➕ 新增` 按钮 2. 填写部门信息 3. **选择权限等级**:下拉菜单选择 90-0 4. 点击「确定」创建 ### 6. 编辑部门权限 1. 点击 `✏️ 编辑` 按钮 2. 修改「权限等级」下拉菜单 3. 点击「确定」保存 --- ## 📊 权限等级说明 | 等级 | 名称 | 用途 | |------|------|------| | 90 | 超级 | 最高管理权限,系统级操作 | | 80 | 高级 | 部门级管理权限,默认等级 | | 70 | 中级 | 一般管理权限 | | 60 | 一般 | 标准操作权限 | | 50 | 较低 | 受限操作权限 | | 0 | 普通 | 基础查看权限 | **默认等级:** 80(高级) --- ## ✨ 功能特点 ### 1. 直观的拖拽体验 - ✅ 清晰的拖拽提示文字 - ✅ 拖拽时的视觉反馈(半透明+旋转) - ✅ 实时显示当前权限等级 - ✅ 友好的确认对话框 ### 2. 清晰的视觉设计 - ✅ 权限等级标签使用醒目颜色(黄色背景) - ✅ 权限等级面板使用紫色主题 - ✅ 悬停效果提升交互感 - ✅ 图标+文字的组合设计 ### 3. 完善的功能支持 - ✅ 新增部门时可设置权限等级 - ✅ 编辑部门时可修改权限等级 - ✅ 拖拽快速调整权限等级 - ✅ 显示所有部门当前权限 ### 4. 数据安全 - ✅ 拖拽前显示当前权限 - ✅ 修改前弹出确认对话框 - ✅ 修改后显示成功消息 - ✅ 数据库实时更新 --- ## 🧪 测试用例 ### 测试用例 1:查看权限等级显示 **步骤:** 1. 访问组织架构页面 2. 查看部门节点信息 **预期:** - 每个节点显示 `🔑 权限等级: XX` - 颜色为黄色背景,橙色边框 ### 测试用例 2:拖拽修改权限 **步骤:** 1. 拖拽节点名称旁的 `⋮⋮ 拖拽修改权限` 2. 权限面板弹出,显示当前等级 3. 点击新的权限等级(如从 80 改为 90) 4. 确认对话框出现 5. 点击「确定」 **预期:** - 权限面板显示部门名称和当前等级 - 点击后弹出确认对话框 - 确认后权限等级更新 - 界面显示成功消息 - 页面刷新,新权限生效 ### 测试用例 3:新增部门设置权限 **步骤:** 1. 点击 `➕ 新增` 按钮 2. 填写部门信息 3. 选择权限等级(如选择 70) 4. 点击「确定」 **预期:** - 表单中有「权限等级」下拉菜单 - 默认选中 80(高级) - 创建成功后显示默认密码 - 新部门显示选中的权限等级 ### 测试用例 4:编辑部门权限 **步骤:** 1. 点击 `✏️ 编辑` 按钮 2. 修改权限等级下拉菜单 3. 点击「确定」 **预期:** - 表单预填充当前权限等级 - 可以修改权限等级 - 保存后权限更新成功 --- ## 🎉 总结 拖拽修改权限等级功能已经完全实现! **主要文件:** - ✅ `lawrisk/services/licensing_repo.py` - 数据库Schema和操作函数 - ✅ `lawrisk/api/v2.py` - API路由和业务逻辑 - ✅ `static/super_admin.html` - 前端界面和交互 **核心功能:** - ✅ 拖拽修改权限等级(6个等级:90/80/70/60/50/0) - ✅ 权限等级显示(黄色标签) - ✅ 权限等级面板(紫色主题) - ✅ 新增时设置权限 - ✅ 编辑时修改权限 **用户体验:** - ✅ 清晰的拖拽提示 - ✅ 实时权限显示 - ✅ 友好的确认对话框 - ✅ 操作成功反馈 完全满足您的需求!🎯