import os import django import random from datetime import datetime import sys def setup_django(): """设置Django环境""" # project_path = "D:/Document/code/vue/greater_wms" project_path = "D:/code/vue/greater_wms" sys.path.append(project_path) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greaterwms.settings') django.setup() print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Django环境已设置") # 定义系统中的页面和组件 PAGES = [ # 角色管理 {"primary_page": "staff", "path": "/permission/roles", "components": ["add_role", "edit_role", "delete_role"]}, # 库存管理 {"primary_page": "stock","path": "/stock/management", "components": ["create_stock", "adjust_stock", "delete_stock"]}, {"primary_page": "stock","path": "/stock/stocklist", "components": ["view_stock", "export_stock"]}, {"primary_page": "stock","path": "/stock/stockbinlist", "components": ["view_bin", "edit_bin"]}, {"primary_page": "stock","path": "/stock/emptybin", "components": ["view_empty", "mark_empty"]}, {"primary_page": "stock","path": "/stock/occupiedbin", "components": ["view_occupied", "release_bin"]}, {"primary_page": "stock","path": "/stock/binset", "components": ["add_bin", "edit_bin", "delete_bin"]}, {"primary_page": "stock","path": "/stock/handcount", "components": ["start_count", "record_count", "finish_count"]}, # ERP管理 {"primary_page": "erp","path": "/erp/erpasn", "components": ["create_asn", "edit_asn", "delete_asn"]}, {"primary_page": "erp","path": "/erp/erpasnmaterial", "components": ["add_material", "edit_material", "delete_material"]}, {"primary_page": "erp","path": "/erp/erpdnmaterial", "components": ["add_dn_material", "edit_dn_material", "delete_dn_material"]}, {"primary_page": "erp","path": "/erp/erpasnaudit", "components": ["approve_asn", "reject_asn"]}, {"primary_page": "erp","path": "/erp/erpdn", "components": ["create_dn", "edit_dn", "delete_dn"]}, {"primary_page": "erp","path": "/erp/erpsortstock", "components": ["view_sorted", "export_sorted"]}, # 入库管理 {"primary_page": "inbound","path": "/inbound/asn", "components": ["create_asn", "edit_asn", "delete_asn"]}, {"primary_page": "inbound","path": "/inbound/predeliverystock", "components": ["view_pre_delivery", "confirm_delivery"]}, {"primary_page": "inbound","path": "/inbound/preloadstock", "components": ["view_pre_load", "confirm_load"]}, {"primary_page": "inbound","path": "/inbound/presortstock", "components": ["view_pre_sort", "confirm_sort"]}, {"primary_page": "inbound","path": "/inbound/sortstock", "components": ["view_sorted", "export_sorted"]}, {"primary_page": "inbound","path": "/inbound/shortage", "components": ["report_shortage", "resolve_shortage"]}, {"primary_page": "inbound","path": "/inbound/more", "components": ["view_additional", "add_additional"]}, {"primary_page": "inbound","path": "/inbound/asnfinish", "components": ["confirm_finish", "export_finish"]}, # 容器管理 {"primary_page":"container","path": "/container/containerlist", "components": ["view_container", "add_container"]}, {"primary_page":"container","path": "/container/containerdetail", "components": ["view_detail", "edit_detail"]}, {"primary_page":"container","path": "/container/containercategory", "components": ["view_category", "add_category"]}, {"primary_page":"container","path": "/container/containeroperate", "components": ["operate_container", "confirm_operation"]}, # 仪表盘 {"primary_page": "dashboard","path": "/dashboard/inboundAndOutbound", "components": ["view_chart", "export_data"]}, {"primary_page": "dashboard","path": "/dashboard/flows_statements", "components": ["view_flow", "filter_flow"]}, {"primary_page": "dashboard","path": "/dashboard/flows", "components": ["view_flow_detail", "export_flow"]}, {"primary_page": "dashboard","path": "/dashboard/flows_complex", "components": ["view_complex_flow", "analyze_flow"]}, {"primary_page": "dashboard","path": "/dashboard/batchlog", "components": ["view_log", "search_log"]}, {"primary_page": "dashboard","path": "/dashboard/ContainerDetailLogModel", "components": ["view_container_log", "export_log"]}, {"primary_page": "dashboard","path": "/dashboard/MaterialChangeHistory", "components": ["view_history", "compare_history"]}, # 统计管理 {"primary_page":"count","path": "/count/detaillog", "components": ["view_log", "search_log"]}, {"primary_page":"count","path": "/count/batchoperatelog", "components": ["view_batch_log", "export_log"]}, {"primary_page":"count","path": "/count/countbatchlog", "components": ["view_count_log", "analyze_log"]}, {"primary_page":"count","path": "/count/presortstock", "components": ["view_pre_sort", "export_pre_sort"]}, {"primary_page":"count","path": "/count/sortstock", "components": ["view_sorted", "export_sorted"]}, {"primary_page":"count","path": "/count/shortage", "components": ["view_shortage", "resolve_shortage"]}, {"primary_page":"count","path": "/count/containerDetail", "components": ["view_container", "export_container"]}, {"primary_page":"count","path": "/count/batch", "components": ["view_batch", "manage_batch"]}, {"primary_page":"count","path": "/count/asnfinish", "components": ["view_finish", "export_finish"]}, # 出库管理 {"primary_page":"outbound","path": "/outbound/dn", "components": ["create_dn", "edit_dn", "delete_dn"]}, {"primary_page":"outbound","path": "/outbound/freshorder", "components": ["view_fresh", "process_fresh"]}, {"primary_page":"outbound","path": "/outbound/neworder", "components": ["view_new", "process_new"]}, {"primary_page":"outbound","path": "/outbound/pickstock", "components": ["view_pick", "confirm_pick"]}, {"primary_page":"outbound","path": "/outbound/pickedstock", "components": ["view_picked", "confirm_picked"]}, {"primary_page":"outbound","path": "/outbound/pickinglist", "components": ["view_list", "export_list"]}, {"primary_page":"outbound","path": "/outbound/shippedstock", "components": ["view_shipped", "confirm_shipped"]}, {"primary_page":"outbound","path": "/outbound/backorder", "components": ["view_backorder", "process_backorder"]}, {"primary_page":"outbound","path": "/outbound/pod", "components": ["view_pod", "confirm_pod"]}, {"primary_page":"outbound","path": "/outbound/container_check", "components": ["check_container", "confirm_check"]}, # 商品管理 {"primary_page":"goods","path": "/goods/goodslist", "components": ["view_goods", "add_goods"]}, {"primary_page":"goods","path": "/goods/goodsunit", "components": ["view_unit", "add_unit"]}, {"primary_page":"goods","path": "/goods/goodsclass", "components": ["view_class", "add_class"]}, {"primary_page":"goods","path": "/goods/goodsbrand", "components": ["view_brand", "add_brand"]}, {"primary_page":"goods","path": "/goods/goodscolor", "components": ["view_color", "add_color"]}, {"primary_page":"goods","path": "/goods/goodsspecs", "components": ["view_specs", "add_specs"]}, {"primary_page":"goods","path": "/goods/goodsshape", "components": ["view_shape", "add_shape"]}, {"primary_page":"goods","path": "/goods/goodsorigin", "components": ["view_origin", "add_origin"]}, # 任务管理 {"primary_page":"taskpage","path": "/taskpage/task", "components": ["view_task", "create_task", "assign_task"]}, # 仓库管理 {"primary_page":"warehouse","path": "/warehouse/warehouseset", "components": ["view_setting", "edit_setting"]}, {"primary_page":"warehouse","path": "/warehouse/department", "components": ["view_department", "add_department"]}, {"primary_page":"warehouse","path": "/warehouse/boundcodetype", "components": ["view_code_type", "add_code_type"]}, {"primary_page":"warehouse","path": "/warehouse/boundtype", "components": ["view_bound_type", "add_bound_type"]}, {"primary_page":"warehouse","path": "/warehouse/boundbusiness", "components": ["view_business", "add_business"]}, {"primary_page":"warehouse","path": "/warehouse/status", "components": ["view_status", "edit_status"]}, {"primary_page":"warehouse","path": "/warehouse/product", "components": ["view_product", "add_product"]}, # 员工管理 {"primary_page":"staff","path": "/staff/stafflist", "components": ["view_staff", "add_staff"]}, {"primary_page":"staff","path": "/staff/stafflist_check_code", "components": ["check_code", "reset_code"]}, {"primary_page":"staff","path": "/staff/stafftype", "components": ["view_type", "add_type"]}, # 上传中心 {"primary_page":"uploadcenter","path": "/uploadcenter/initializeupload", "components": ["init_upload", "process_init"]}, {"primary_page":"uploadcenter","path": "/uploadcenter/addupload", "components": ["add_upload", "process_add"]}, # 下载中心 {"primary_page":"downloadcenter","path": "/downloadcenter/downloadinbound", "components": ["download_inbound"]}, {"primary_page":"downloadcenter","path": "/downloadcenter/downloadoutbound", "components": ["download_outbound"]}, {"primary_page":"downloadcenter","path": "/downloadcenter/downloadstocklist", "components": ["download_stock"]}, {"primary_page":"downloadcenter","path": "/downloadcenter/downloadgoodslist", "components": ["download_goods"]}, {"primary_page":"downloadcenter","path": "/downloadcenter/downloadbinlist", "components": ["download_bin"]}, ] # 定义角色及其权限配置 ROLES = { "管理员": { "description": "系统管理员,拥有所有权限", "page_access": "all", # 所有页面 "component_access": "all" # 所有组件 }, "经理": { "description": "部门经理,拥有大部分管理权限", "page_access": [ "/dashboard", "/stock", "/inbound", "/outbound", "/count", "/container", "/goods", "/warehouse", "/staff" ], "component_access": "all" # 所有组件 }, "主管": { "description": "仓库主管,负责日常运营管理", "page_access": [ "/stock", "/inbound", "/outbound", "/count", "/container" ], "component_access": [ "view", "edit", "add", "delete", "export", "confirm" ] }, "操作员": { "description": "仓库操作员,负责具体操作", "page_access": [ "/stock/stocklist", "/stock/stockbinlist", "/inbound/asn", "/outbound/pickstock", "/outbound/pickedstock" ], "component_access": [ "view", "confirm", "process" ] }, "查看员": { "description": "数据查看员,只能查看数据", "page_access": [ "/dashboard", "/stock/stocklist", "/count/detaillog", "/count","/erp" ], "component_access": ["view"] } } def create_permissions(): """创建所有页面和组件的权限""" from staff.models import Permission print("🚀 开始创建权限...") created_count = 0 for page_info in PAGES: primary_page = page_info.get("primary_page") page_path = page_info["path"] components = page_info["components"] # 创建页面访问权限 page_permission, created = Permission.objects.get_or_create( primary_page=primary_page, page=page_path, component=None, defaults={ "name": f"{page_path} 页面访问", "description": f"访问 {page_path} 页面的权限", "enabled": True } ) if created: created_count += 1 print(f"✅ 创建页面权限: {page_path}") # 创建组件权限 for component in components: comp_permission, created = Permission.objects.get_or_create( primary_page=primary_page, page=page_path, component=component, defaults={ "name": f"{page_path} - {component} 组件", "description": f"在 {page_path} 页面使用 {component} 组件的权限", "enabled": True } ) if created: created_count += 1 print(f" ✅ 创建组件权限: {page_path} - {component}") print(f"📊 权限创建完成! 共创建 {created_count} 个权限") return created_count def create_roles_and_assign_permissions(): """创建角色并分配权限""" from staff.models import ListModel, Permission, Role print("\n🚀 开始创建角色并分配权限...") role_count = 0 permission_count = 0 # 获取所有权限 all_permissions = Permission.objects.all() for role_name, role_config in ROLES.items(): # 创建角色 role, created = Role.objects.get_or_create( name=role_name, defaults={ "description": role_config["description"] } ) if role: role_count += 1 print(f"✅ 创建角色: {role_name}") # 分配权限 if role_config["page_access"] == "all": # 分配所有权限 role.permissions.set(all_permissions) permission_count += all_permissions.count() print(f" 🔄 分配所有权限 ({all_permissions.count()} 个)") else: # 分配特定权限 assigned_permissions = [] # 处理页面访问权限 for page_path in role_config["page_access"]: # 获取匹配该路径的所有页面权限 page_perms = all_permissions.filter( page__startswith=page_path, component=None ) assigned_permissions.extend(page_perms) # 获取匹配该路径的组件权限 comp_perms = all_permissions.filter( page__startswith=page_path, component__isnull=False ) # 根据组件访问规则过滤 if role_config["component_access"] == "all": assigned_permissions.extend(comp_perms) else: for perm in comp_perms: # 检查组件权限是否在允许的列表中 if any(access in perm.component for access in role_config["component_access"]): assigned_permissions.append(perm) # 分配权限 role.permissions.set(assigned_permissions) permission_count += len(assigned_permissions) print(f" 🔄 分配 {len(assigned_permissions)} 个权限") print(f"📊 角色创建完成! 共创建 {role_count} 个角色,分配 {permission_count} 个权限") return role_count, permission_count def main(): setup_django() print("=" * 50) print("🔐 权限与角色批量创建工具") print("=" * 50) print("此脚本将根据预定义的页面和角色配置批量创建:") print("1. 所有页面的访问权限") print("2. 所有组件的操作权限") print("3. 不同角色的权限配置") print("=" * 50) confirm = input("是否开始批量创建? (y/n): ").lower() if confirm == 'y': start_time = datetime.now() # 创建权限 perm_count = create_permissions() # 创建角色并分配权限 role_count, perm_assigned_count = create_roles_and_assign_permissions() end_time = datetime.now() duration = (end_time - start_time).total_seconds() print("\n" + "=" * 50) print("🎉 批量创建完成!") print(f"⏱️ 耗时: {duration:.2f} 秒") print(f"✅ 创建权限: {perm_count} 个") print(f"👥 创建角色: {role_count} 个") print(f"🔗 分配权限: {perm_assigned_count} 次") print("=" * 50) else: print("操作已取消") if __name__ == "__main__": main()