refactor: restructure permission list to a tree format matching the sidebar navigation
This commit is contained in:
@ -161,6 +161,8 @@ def create_app():
|
|||||||
PermissionService.cleanup_legacy_stocktake_menus()
|
PermissionService.cleanup_legacy_stocktake_menus()
|
||||||
PermissionService.init_audit_menu()
|
PermissionService.init_audit_menu()
|
||||||
PermissionService.init_stocktake_menus()
|
PermissionService.init_stocktake_menus()
|
||||||
|
# 初始化所有菜单的层级结构
|
||||||
|
PermissionService.init_all_menus()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"⚠️ 菜单初始化跳过: {e}")
|
print(f"⚠️ 菜单初始化跳过: {e}")
|
||||||
|
|
||||||
|
|||||||
@ -388,3 +388,111 @@ class PermissionService:
|
|||||||
db.session.rollback()
|
db.session.rollback()
|
||||||
print(f"⚠️ 清理旧版菜单失败: {str(e)}")
|
print(f"⚠️ 清理旧版菜单失败: {str(e)}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def init_all_menus():
|
||||||
|
"""
|
||||||
|
初始化所有菜单的层级结构,确保权限配置页面显示正确的树形结构
|
||||||
|
按照侧边栏顺序:基础信息 -> 入库 -> 盘点 -> 出库 -> BOM -> 借库 -> 报废 -> 系统
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
role_code = 'SUPER_ADMIN'
|
||||||
|
|
||||||
|
# 定义菜单结构 (code, name, path, parent_code, sort_order)
|
||||||
|
menu_defs = [
|
||||||
|
# 顶级菜单 (按侧边栏顺序)
|
||||||
|
('material_mgmt', '基础信息管理', '/material', None, 10),
|
||||||
|
('inventory_mgmt', '入库管理', '/inventory', None, 20),
|
||||||
|
('stocktake_mgmt', '盘点管理', '/stocktake', None, 30),
|
||||||
|
('outbound_mgmt', '出库管理', '/outbound', None, 40),
|
||||||
|
('bom_mgmt', 'BOM管理', '/bom', None, 50),
|
||||||
|
('operation_mgmt', '借库管理', '/operation', None, 60),
|
||||||
|
('scrap_mgmt', '报废管理', '/scrap', None, 70),
|
||||||
|
('system_mgmt', '系统管理', '/system', None, 80),
|
||||||
|
|
||||||
|
# 基础信息子菜单
|
||||||
|
('material_base', '基础信息', '/material/index', 'material_mgmt', 1),
|
||||||
|
|
||||||
|
# 入库管理子菜单
|
||||||
|
('inbound_buy', '采购入库', '/inventory/buy', 'inventory_mgmt', 1),
|
||||||
|
('inbound_semi', '半成品入库', '/inventory/semi', 'inventory_mgmt', 2),
|
||||||
|
('inbound_product', '成品入库', '/inventory/product', 'inventory_mgmt', 3),
|
||||||
|
('inbound_service', '服务权益', '/inventory/service', 'inventory_mgmt', 4),
|
||||||
|
('inbound_summary', '入库记录', '/inventory/summary', 'inventory_mgmt', 5),
|
||||||
|
|
||||||
|
# 盘点管理子菜单
|
||||||
|
('inventory_stocktake', '盲盘作业', '/stocktake/operation', 'stocktake_mgmt', 1),
|
||||||
|
('stock_adjustment', '盈亏调整', '/stocktake/adjustment', 'stocktake_mgmt', 2),
|
||||||
|
|
||||||
|
# 出库管理子菜单
|
||||||
|
('outbound_selection', '出库选单', '/outbound/selection', 'outbound_mgmt', 1),
|
||||||
|
('outbound_create', '扫码出库', '/outbound/create', 'outbound_mgmt', 2),
|
||||||
|
('outbound_list', '出库记录', '/outbound/index', 'outbound_mgmt', 3),
|
||||||
|
|
||||||
|
# BOM管理子菜单
|
||||||
|
('bom_manage', 'BOM配方管理', '/bom/manage', 'bom_mgmt', 1),
|
||||||
|
|
||||||
|
# 借库管理子菜单
|
||||||
|
('op_borrow', '借库操作', '/operation/borrow', 'operation_mgmt', 1),
|
||||||
|
('op_return', '归还操作', '/operation/repair', 'operation_mgmt', 2),
|
||||||
|
('op_records', '借还记录', '/operation/records', 'operation_mgmt', 3),
|
||||||
|
|
||||||
|
# 报废管理子菜单
|
||||||
|
('scrap_create', '新建报废', '/scrap/create', 'scrap_mgmt', 1),
|
||||||
|
('scrap_list', '报废记录', '/scrap/index', 'scrap_mgmt', 2),
|
||||||
|
|
||||||
|
# 系统管理子菜单
|
||||||
|
('system_user', '员工账号管理', '/system/user-create', 'system_mgmt', 1),
|
||||||
|
('system_permission', '权限分配', '/system/permission', 'system_mgmt', 2),
|
||||||
|
('system_audit', '审计日志', '/system/audit', 'system_mgmt', 3),
|
||||||
|
]
|
||||||
|
|
||||||
|
# 创建或更新菜单
|
||||||
|
menu_map = {} # code -> menu obj
|
||||||
|
|
||||||
|
for code, name, path, parent_code, sort_order in menu_defs:
|
||||||
|
menu = SysMenu.query.filter_by(code=code).first()
|
||||||
|
if not menu:
|
||||||
|
menu = SysMenu(code=code, name=name, path=path, sort_order=sort_order, is_visible=True)
|
||||||
|
db.session.add(menu)
|
||||||
|
db.session.flush()
|
||||||
|
print(f"✅ 菜单已创建: {name} ({code})")
|
||||||
|
else:
|
||||||
|
# 更新已有菜单的属性
|
||||||
|
menu.name = name
|
||||||
|
menu.path = path
|
||||||
|
menu.sort_order = sort_order
|
||||||
|
|
||||||
|
menu_map[code] = menu
|
||||||
|
|
||||||
|
# 设置 parent_id
|
||||||
|
for code, name, path, parent_code, sort_order in menu_defs:
|
||||||
|
if parent_code and parent_code in menu_map:
|
||||||
|
menu = menu_map[code]
|
||||||
|
parent = menu_map[parent_code]
|
||||||
|
menu.parent_id = parent.id
|
||||||
|
|
||||||
|
# 为超级管理员分配所有菜单权限
|
||||||
|
for code, name, path, parent_code, sort_order in menu_defs:
|
||||||
|
if parent_code is None: # 只分配顶级菜单
|
||||||
|
existing_perm = SysRolePermission.query.filter_by(
|
||||||
|
role_code=role_code,
|
||||||
|
target_code=code,
|
||||||
|
type='menu'
|
||||||
|
).first()
|
||||||
|
if not existing_perm:
|
||||||
|
new_perm = SysRolePermission(
|
||||||
|
role_code=role_code,
|
||||||
|
target_code=code,
|
||||||
|
type='menu'
|
||||||
|
)
|
||||||
|
db.session.add(new_perm)
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
print(f"✅ 所有菜单初始化完成")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
db.session.rollback()
|
||||||
|
print(f"❌ 初始化菜单失败: {str(e)}")
|
||||||
|
raise e
|
||||||
|
|||||||
Reference in New Issue
Block a user