- 🔥 完全重写 .cursor/cursorrules-mobile.md (940行) * 基于实际mobile工程Vue 3.4.21+uniapp+uview-plus架构 * 移除所有JeeSite相关内容,精准匹配实际项目 * 新增11个完整章节:技术栈、项目结构、页面开发、组件规范等 - 📚 创建完整规范文档 docs/开发文档/移动端开发规范总结.md (800+行) * 涵盖从项目架构到部署的全流程指导 * 提供可直接使用的页面和组件模板 * 包含现代CSS变量设计系统和用户体验优化 - 🔄 同步更新主配置文件 .cursorrules * 更新移动端技术栈描述 * 调整为Vue 3.4.21+uniapp+uview-plus 3.4.45架构 - 📝 完善变更记录 * 详细记录规范更新背景和技术价值 * 为后续维护提供完整历史记录 核心价值:解决规范与实际项目不匹配问题,为Cursor AI提供准确的移动端开发上下文,确保生成代码完全符合实际项目架构。
9.6 KiB
9.6 KiB
📋 sys_menu 菜单配置规范
版本: v1.0 | 创建: 2025-07-01 | 维护: 系统管理员
🚨 核心原则
⭐ 重复节点检查规则(强制要求)
🔴 在新增任何菜单节点前,必须先检查是否存在同名节点
-- 新增菜单前的强制检查
SELECT menu_id, menu_name, parent_id, path, menu_type
FROM sys_menu
WHERE menu_name = '要新增的菜单名称'
AND parent_id = 目标父级ID;
-- 处理原则:
-- 1. 存在同名同父级节点 → 直接使用现有节点,不新增
-- 2. 存在同名不同父级 → 评估是否需要合并或重命名
-- 3. 完全不存在 → 可以安全新增
应用场景:
- ✅ 存在"场地预约"目录 → 直接使用,不重复创建
- ✅ 存在"后勤管理"根目录 → 在其下创建子模块
- ❌ 避免创建重复的业务模块导致菜单混乱
🏗️ 菜单类型配置规范
1. 📁 目录菜单 (menu_type = 'M')
用途:菜单分组和导航组织
-- 配置要点
component = NULL -- 目录无组件
perms = NULL -- 目录无权限标识
path = '英文路径' -- 使用英文路径
icon = '图标名' -- 统一图标库
2. 🖥️ 功能菜单 (menu_type = 'C')
用途:具体功能页面,对应前端组件
-- 配置要点
component = '组件路径' -- 指向前端组件
perms = 'module:func:op' -- 权限格式:模块:功能:操作
path = '功能路径' -- 对应前端路由
parent_id = 目录ID -- 必须有父级目录
3. 🔘 权限按钮 (menu_type = 'F')
用途:页面内操作权限控制
-- 配置要点
path = '' -- 空字符串
component = NULL -- 无组件
perms = '具体权限' -- 必须配置权限标识
parent_id = 功能菜单ID -- 指向对应功能菜单
🎨 ID 分配规范
ID 规划原则
根目录(业务模块): 1xxx... (雪花ID) 或 1000-1999
二级目录: 2000-2999
功能页面: 业务范围(2100-2199 物业,2200-2299 场地)
权限按钮: 功能页面ID + 1-9 递增
实际分配示例
1937078443615322113 -- 后勤管理(根目录)
├── 2100 -- 物业管理(子目录)
├── 2140 -- 场地预约(子目录)
├── 2210 -- 场地管理(功能页面)
│ ├── 2211 -- 场地查询(权限)
│ ├── 2212 -- 场地新增(权限)
│ └── 2213 -- 场地修改(权限)
└── 2220 -- 场地预约(功能页面)
├── 2221 -- 预约查询(权限)
└── 2222 -- 预约新增(权限)
🔐 权限命名规范
标准格式
格式:{模块}:{功能}:{操作}
标准操作类型:
- query : 查询 - add : 新增
- edit : 修改 - remove : 删除
- export : 导出 - import : 导入
- list : 列表 - approve: 审批
权限配置示例
-- 场地管理模块权限
'hq:venue:list' -- 场地列表权限
'hq:venue:query' -- 场地查询权限
'hq:venue:add' -- 场地新增权限
'hq:venue:edit' -- 场地修改权限
'hq:venue:remove' -- 场地删除权限
-- 场地预约模块权限
'hq:reservation:list' -- 预约列表
'hq:reservation:add' -- 预约申请
'hq:reservation:approve' -- 预约审批
📋 标准操作流程
新增业务模块完整流程
第 1 步:重复检查(🔴 强制执行)
-- 检查是否存在同名根目录
SELECT menu_id, menu_name, parent_id
FROM sys_menu
WHERE menu_name = '新业务模块名' AND parent_id = 0;
-- 检查是否存在同名子目录
SELECT menu_id, menu_name, parent_id
FROM sys_menu
WHERE menu_name = '新子模块名' AND parent_id = 目标父级ID;
第 2 步:创建目录(如不存在)
-- 根目录
INSERT INTO sys_menu (...) VALUES (
雪花ID, '业务模块名', 0, 排序, '英文路径', NULL, 'M', '0', '0',
NULL, '图标', 1, NOW(), '模块说明'
);
-- 子目录
INSERT INTO sys_menu (...) VALUES (
2xxx, '子模块名', 父ID, 排序, '英文路径', NULL, 'M', '0', '0',
NULL, '图标', 1, NOW(), '子模块说明'
);
第 3 步:创建功能菜单
INSERT INTO sys_menu (...) VALUES (
2xx0, '功能名称', 父ID, 排序, '功能路径', '组件路径', 'C', '0', '0',
'权限标识', '图标', 1, NOW(), '功能说明'
);
第 4 步:创建权限按钮(批量)
INSERT INTO sys_menu (...) VALUES
(2xx1, '查询', 功能ID, 1, '', NULL, 'F', '0', '0', 'module:func:query', '#', 1, NOW(), '查询权限'),
(2xx2, '新增', 功能ID, 2, '', NULL, 'F', '0', '0', 'module:func:add', '#', 1, NOW(), '新增权限'),
(2xx3, '修改', 功能ID, 3, '', NULL, 'F', '0', '0', 'module:func:edit', '#', 1, NOW(), '修改权限'),
(2xx4, '删除', 功能ID, 4, '', NULL, 'F', '0', '0', 'module:func:remove', '#', 1, NOW(), '删除权限');
第 5 步:验证结果
-- 验证菜单层级结构
SELECT
CASE
WHEN parent_id = 0 THEN CONCAT('└── ', menu_name, ' (', menu_id, ')')
WHEN parent_id = 根ID THEN CONCAT(' ├── ', menu_name, ' (', menu_id, ')')
ELSE CONCAT(' ├── ', menu_name, ' (', menu_id, ')')
END AS menu_structure
FROM sys_menu
WHERE menu_id = 根ID OR parent_id = 根ID OR parent_id IN (
SELECT menu_id FROM sys_menu WHERE parent_id = 根ID
)
ORDER BY parent_id, order_num;
⚠️ 配置注意事项
🚨 强制要求
- 重复检查:任何菜单新增前必须检查重复,优先使用现有节点
- ID 唯一性:确保 menu_id 全局唯一,建议使用雪花 ID
- 层级正确:parent_id 必须指向已存在的父级菜单
- 权限格式:权限标识必须遵循{模块}:{功能}:{操作}格式
- 路径规范:使用英文路径,避免中文和特殊字符
✅ 最佳实践
- 分批创建:先创建目录,再创建功能,最后创建权限
- 合理排序:使用 order_num 控制菜单显示顺序
- 重复利用:充分利用现有菜单目录,避免重复创建
- 图标统一:使用 Element Plus 或项目统一的图标库
- 备注完整:remark 字段记录菜单用途和创建原因
🔄 维护流程
- 变更前备份:
CREATE TABLE sys_menu_backup_YYYYMMDD AS SELECT * FROM sys_menu; - 重复性检查:执行标准重复检查 SQL
- 分步验证:每步操作后检查结果
- 权限同步:菜单变更后及时更新角色权限
- 文档同步:菜单结构变更必须同步更新 API 文档
🛠️ 常用检查 SQL
重复菜单检查
-- 检查重复菜单名称
SELECT menu_name, COUNT(*) as count, GROUP_CONCAT(menu_id) as ids
FROM sys_menu
GROUP BY menu_name
HAVING count > 1;
-- 检查孤儿菜单(父菜单不存在)
SELECT m1.menu_id, m1.menu_name, m1.parent_id
FROM sys_menu m1
LEFT JOIN sys_menu m2 ON m1.parent_id = m2.menu_id
WHERE m1.parent_id != 0 AND m2.menu_id IS NULL;
-- ID冲突检查
SELECT COUNT(*) as count FROM sys_menu WHERE menu_id = 要使用的ID;
-- count = 0 才可以使用该ID
菜单结构查看
-- 查看指定模块的完整菜单树
SELECT
CASE
WHEN parent_id = 0 THEN CONCAT('└── ', menu_name)
WHEN parent_id = 根ID THEN CONCAT(' ├── ', menu_name)
ELSE CONCAT(' ├── ', menu_name)
END AS menu_structure,
menu_id, path, menu_type
FROM sys_menu
WHERE menu_id = 根ID OR parent_id = 根ID OR parent_id IN (
SELECT menu_id FROM sys_menu WHERE parent_id = 根ID
)
ORDER BY parent_id, order_num;
📊 成功案例参考
场地预约模块配置实例
-- 成功案例:基于重复检查规则的正确配置流程
-- 1. 检查发现现有"后勤管理"根目录(ID: 1937078443615322113)
-- 2. 直接使用现有根目录,不重复创建
-- 3. 在现有根目录下创建"场地预约"子目录(ID: 2140)
-- 4. 在子目录下创建具体功能菜单
-- 最终形成清晰层级结构:
-- └── 后勤管理 (1937078443615322113) [使用现有]
-- └── 场地预约 (2140) [新增子目录]
-- ├── 场地管理 (2210)
-- ├── 场地预约 (2220)
-- └── 使用统计 (2230)
-- 避免的问题:重复创建"后勤管理"导致菜单混乱
🎯 路由配置规范
路径命名标准
-- 目录路径:英文小写,简洁明了
path = 'hq' -- 后勤管理
path = 'venue' -- 场地预约
path = 'pm' -- 物业管理
-- 功能路径:功能英文名
path = 'info' -- 信息管理
path = 'reservation' -- 预约管理
path = 'statistics' -- 统计分析
组件路径规范
-- 格式:{模块}/{子模块}/{页面}
component = 'hq/venue/index' -- 场地管理页面
component = 'hq/venue/reservation' -- 场地预约页面
component = 'hq/pm/repairOrder' -- 报修订单页面
📝 变更记录
| 版本 | 日期 | 变更内容 | 变更人 |
|---|---|---|---|
| v1.0 | 2025-07-01 | 初始版本,基于场地预约模块实践总结 | 系统管理员 |
| v1.0 | 2025-07-01 | 新增重复节点检查规则 | 系统管理员 |
🎯 使用说明:本规范适用于所有新增菜单配置,严格遵循重复检查规则,优先使用现有节点,确保系统菜单结构的一致性和可维护性。遇到问题请参考本文档或联系系统管理员。