日期:2026-04-29
需求来源:运营端权限体系升级(用户确认版)
super_admin(超级管理员),可查看所有菜单、所有区域数据。admin 账号统一迁移为 super_admin。admin)改为“多区域权限”模型。web-admin 保持“前端静态菜单模式”,后端仅返回授权菜单 code 列表。menu_code 建立关系并存库。super_admin 始终全菜单可见,不受 code 授权限制。用户管理 中:
询价报价管理、订单列表、商家结算管理、客户结算管理、配送列表、时效预警、用户管理。订单列表、配送列表、时效预警 参考 商家结算管理 顶部区域 Tab 模式,仅展示有权限区域 Tab。role == "admin" 为主,尚无 super_admin 角色常量与判断分支。GET /web/menu/list 按 sys_menu 全量返回,尚未提供“当前用户授权菜单 code 列表”能力。sys_user 只有单值 region_id,不支持多区域。admin 模块已存在“管理员按区域过滤”基础逻辑,但依赖“单区域绑定”语义。用户管理 页面弹窗中“所属区域”为单选。结论:需要同时改造 角色模型 + 菜单授权模型 + 区域权限模型 + 前后端展示交互。
sys_user_region_scope(用户-区域多对多)sys_user_menu_scope(用户-菜单 code 多对多)sys_user.role 保留字符串角色,新增 super_admin 枚举值。优点:
menu_type=button 过滤)但本期不实现。缺点:
role 字段转为兼容冗余字段或废弃。优点:
缺点:
优点:
缺点:
采用 方案 A,以“后端强约束 + 前端按授权展示”为原则落地。
super_admin:全菜单、全区域、全数据。admin(运营管理人员):仅可见授权菜单,且仅可见授权区域数据。supplier/client/deliver)保持原语义。sys_user_region_scope 绑定多个区域。super_admin:不过滤区域。admin:仅允许 region_id in 可见区域集合。sys_user_menu_scope 绑定可见菜单 menu_code。web-admin 本地默认菜单树(静态)。allowedMenuCodes:
super_admin:返回标识 all=true(或空集 + isSuperAdmin=true),前端不过滤。admin:返回授权 code 集合。menu_code 鉴权;sys_user(增量)role 增加可选值:super_admin。sys_user_region_scope(新增)id VARCHAR(32) PKuser_id VARCHAR(32) 非空region_id VARCHAR(32) 非空is_del TINYINT 默认 0create_at DATETIMEcreate_by VARCHAR(32)create_name VARCHAR(100)update_at DATETIMEupdate_by VARCHAR(32)(user_id, region_id, is_del)。sys_user_region_scope_his(新增历史表)is_del,id 不做唯一限制,不建索引。sys_user_menu_scope(新增)id VARCHAR(32) PKuser_id VARCHAR(32) 非空menu_code VARCHAR(100) 非空is_del TINYINT 默认 0create_at DATETIMEcreate_by VARCHAR(32)create_name VARCHAR(100)update_at DATETIMEupdate_by VARCHAR(32)(user_id, menu_code, is_del)。sys_user_menu_scope_his(新增历史表)is_del,id 不做唯一限制,不建索引。userInfo.role 支持 super_admin。current-user 返回新增:
regionIds: string[](运营管理人员可见区域)isSuperAdmin: booleanGET /web/menu/list 仅用于管理端菜单维护场景(非登录态菜单渲染依赖)。GET /web/auth/menu-codes:返回当前登录用户授权菜单 code 集合与 isSuperAdmin。GET /web/admin/menus/assignable-codes:可授权菜单 code 列表(含层级信息,来源于 sys_menu.code)。GET /web/admin/users/{id}/menu-scopes:查询用户菜单授权 code 列表。PUT /web/admin/users/{id}/menu-scopes:更新用户菜单授权(按 code 全量覆盖)。menu_code 鉴权,避免接口粒度过细带来的测试复杂度。GET /web/admin/users:
POST /web/admin/users / PUT /web/admin/users/{id}:
admin 角色支持 regionIds 多选写入。super_admin 不要求区域绑定。GET /web/admin/roles 增加 super_admin。allowed_region_ids。regionId 时必须校验是否属于授权范围,否则返回 403。allowedMenuCodes,再过滤前端默认静态菜单树。super_admin 不做菜单过滤,直接展示前端默认全菜单。admin 菜单按 code 过滤,且仅自动补齐顶级父菜单。web-admin 本地静态路由中的 name/code。sys_menu.code,并要求与前端静态路由 code 一致。sys_menu.code 与约定 code 字典是否存在差异,差异写日志告警。sys_menu.code,否则视为变更不完整。运营管理人员、区域用户super_admin + adminadmin 编辑弹窗中“所属区域”改为多选client/supplier/deliverregionId 查询。super_admin 默认可见全部区域 Tab。sys_user.role='admin' 批量更新为 super_admin。admin)。admin -> super_adminsuper_admin -> admin(仅紧急回滚使用)sys_user_region_scope*、sys_user_menu_scope*)与兼容代码(不切主流程)。admin -> super_admin 迁移 SQL(维护窗口内执行)。super_admin 全菜单可见;-- 1) 角色迁移:admin -> super_admin
UPDATE sys_user
SET role = 'super_admin', update_at = NOW()
WHERE is_del = 0 AND role = 'admin';
-- 2) 插入测试运营管理员(admin)
-- 注意:password_hash 需替换为项目实际哈希算法生成值(示例占位)
INSERT INTO sys_user (
id, username, password_hash, real_name, phone, role, region_id, is_active, is_del,
create_at, create_by, create_name, update_at, update_by
) VALUES
('op_admin_001_32char_id_xxxxxx01', 'op_admin_a', 'REPLACE_WITH_HASH', '运营A', '13800000001', 'admin', NULL, 1, 0, NOW(), 'seed', 'seed', NOW(), 'seed'),
('op_admin_002_32char_id_xxxxxx02', 'op_admin_b', 'REPLACE_WITH_HASH', '运营B', '13800000002', 'admin', NULL, 1, 0, NOW(), 'seed', 'seed', NOW(), 'seed');
-- 3) 绑定测试运营管理员多区域(示例)
INSERT INTO sys_user_region_scope (
id, user_id, region_id, is_del, create_at, create_by, create_name, update_at, update_by
) VALUES
('urs_001_32char_id_xxxxxxxxxx01', 'op_admin_001_32char_id_xxxxxx01', 'region_id_east', 0, NOW(), 'seed', 'seed', NOW(), 'seed'),
('urs_002_32char_id_xxxxxxxxxx02', 'op_admin_001_32char_id_xxxxxx01', 'region_id_west', 0, NOW(), 'seed', 'seed', NOW(), 'seed'),
('urs_003_32char_id_xxxxxxxxxx03', 'op_admin_002_32char_id_xxxxxx02', 'region_id_south', 0, NOW(), 'seed', 'seed', NOW(), 'seed');
-- 4) 绑定测试运营管理员菜单权限(示例,menu_code 需替换为 sys_menu.code)
INSERT INTO sys_user_menu_scope (
id, user_id, menu_code, is_del, create_at, create_by, create_name, update_at, update_by
) VALUES
('ums_001_32char_id_xxxxxxxxxx01', 'op_admin_001_32char_id_xxxxxx01', 'Order', 0, NOW(), 'seed', 'seed', NOW(), 'seed'),
('ums_002_32char_id_xxxxxxxxxx02', 'op_admin_001_32char_id_xxxxxx01', 'OrderList', 0, NOW(), 'seed', 'seed', NOW(), 'seed'),
('ums_003_32char_id_xxxxxxxxxx03', 'op_admin_002_32char_id_xxxxxx02', 'Delivery', 0, NOW(), 'seed', 'seed', NOW(), 'seed');
allowed_region_ids 过滤函数,在模块接口层强制调用。admin 全量迁移后短期无人可用。本期按“超级管理员全权限 + 前端静态菜单(code 过滤) + 运营管理人员多区域数据权限”落地;菜单权限仅作用于前端可见性,接口侧保持角色与区域权限校验。