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": "stock","path": "/stock/management", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "stock","path": "/stock/stocklist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "stock","path": "/stock/stockbinlist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "stock","path": "/stock/emptybin", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "stock","path": "/stock/occupiedbin", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "stock","path": "/stock/binset", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "stock","path": "/stock/handcount", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # ERP管理 {"primary_page": "erp","path": "/erp/erpasn", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "erp","path": "/erp/erpasnmaterial", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "erp","path": "/erp/erpdnmaterial", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "erp","path": "/erp/erpasnaudit", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "erp","path": "/erp/erpdn", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "erp","path": "/erp/erpsortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 入库管理 {"primary_page": "inbound","path": "/inbound/asn", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "inbound","path": "/inbound/predeliverystock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "inbound","path": "/inbound/preloadstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "inbound","path": "/inbound/presortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "inbound","path": "/inbound/sortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "inbound","path": "/inbound/shortage", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "inbound","path": "/inbound/more", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "inbound","path": "/inbound/asnfinish", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 托盘管理 {"primary_page":"container","path": "/container/containerlist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"container","path": "/container/containerdetail", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"container","path": "/container/containercategory", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"container","path": "/container/containeroperate", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 仪表盘 {"primary_page": "dashboard","path": "/dashboard/inboundAndOutbound", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "dashboard","path": "/dashboard/flows_statements", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "dashboard","path": "/dashboard/flows", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "dashboard","path": "/dashboard/flows_complex", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "dashboard","path": "/dashboard/batchlog", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "dashboard","path": "/dashboard/ContainerDetailLogModel", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page": "dashboard","path": "/dashboard/MaterialChangeHistory", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 统计管理 {"primary_page":"count","path": "/count/detaillog", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"count","path": "/count/batchoperatelog", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"count","path": "/count/countbatchlog", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"count","path": "/count/presortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"count","path": "/count/sortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"count","path": "/count/shortage", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"count","path": "/count/containerDetail", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"count","path": "/count/batch", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"count","path": "/count/asnfinish", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 出库管理 {"primary_page":"outbound","path": "/outbound/dn", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"outbound","path": "/outbound/freshorder", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"outbound","path": "/outbound/neworder", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"outbound","path": "/outbound/pickstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"outbound","path": "/outbound/pickedstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"outbound","path": "/outbound/pickinglist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"outbound","path": "/outbound/shippedstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"outbound","path": "/outbound/backorder", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"outbound","path": "/outbound/pod", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"outbound","path": "/outbound/container_check", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 商品管理 {"primary_page":"goods","path": "/goods/goodslist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"goods","path": "/goods/goodsunit", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"goods","path": "/goods/goodsclass", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"goods","path": "/goods/goodsbrand", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"goods","path": "/goods/goodscolor", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"goods","path": "/goods/goodsspecs", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"goods","path": "/goods/goodsshape", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"goods","path": "/goods/goodsorigin", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 任务管理 {"primary_page":"taskpage","path": "/taskpage/task", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 仓库管理 {"primary_page":"warehouse","path": "/warehouse/warehouseset", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"warehouse","path": "/warehouse/department", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"warehouse","path": "/warehouse/boundcodetype", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"warehouse","path": "/warehouse/boundtype", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"warehouse","path": "/warehouse/boundbusiness", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"warehouse","path": "/warehouse/status", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"warehouse","path": "/warehouse/product", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 员工管理 {"primary_page": "staff", "path": "/staff/roles", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"staff","path": "/staff/stafflist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"staff","path": "/staff/stafflist_check_code", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"staff","path": "/staff/stafftype", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 上传中心 {"primary_page":"uploadcenter","path": "/uploadcenter/initializeupload", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"uploadcenter","path": "/uploadcenter/addupload", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, # 下载中心 {"primary_page":"downloadcenter","path": "/downloadcenter/downloadinbound", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"downloadcenter","path": "/downloadcenter/downloadoutbound", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"downloadcenter","path": "/downloadcenter/downloadstocklist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"downloadcenter","path": "/downloadcenter/downloadgoodslist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, {"primary_page":"downloadcenter","path": "/downloadcenter/downloadbinlist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]}, ] # 定义角色及其权限配置 ROLES = { "管理员": { "description": "系统管理员,拥有所有权限", "page_access": "all", # 所有页面 "component_access": "all" # 所有组件 }, "经理": { "description": "部门经理,拥有大部分管理权限", "page_access": [ "/stock/management","/stock/stockbinlist","/stock/stocklist", "/erp/erpasn","/erp/erpasnmaterial","/erp/erpdnmaterial","/erp/erpdn","/erp/erpsortstock", "/inbound/asn","/inbound/predeliverystock","/inbound/sortstock", "/container/containerlist","/container/containerdetail","/container/containercategory","/container/containeroperate", "/outbound/dn","/outbound/backorder","/outbound/container_check", "/taskpage/task", "/count/batch","/count/countbatchlog","/count/detaillog","/count/batchoperatelog", "/dashboard/flows_statements","/dashboard/flows","/dashboard/MaterialChangeHistory","/dashboard/batchlog","/dashboard/ContainerDetailLogModel", "/warehouse/department","/warehouse/boundcodetype","/warehouse/boundtype","/warehouse/boundbusiness","/warehouse/status","/warehouse/product", "/staff/stafflist","/staff/stafflist_check_code","/staff/stafftype" ], "component_access": "all" # 所有组件 }, "主管": { "description": "仓库主管,负责日常运营管理", "page_access": [ "/stock/management","/stock/stockbinlist","/stock/stocklist", "/erp/erpasn","/erp/erpasnmaterial","/erp/erpdnmaterial","/erp/erpdn","/erp/erpsortstock", "/inbound/asn","/inbound/predeliverystock","/inbound/sortstock", "/container/containerlist","/container/containerdetail","/container/containercategory", "/outbound/dn","/outbound/backorder","/outbound/container_check", "/taskpage/task", "/count/batch","/count/countbatchlog","/count/detaillog","/count/batchoperatelog", "/dashboard/flows_statements","/dashboard/flows","/dashboard/MaterialChangeHistory","/dashboard/batchlog","/dashboard/ContainerDetailLogModel", # "/warehouse/department","/warehouse/boundcodetype","/warehouse/boundtype","/warehouse/boundbusiness","/warehouse/status","/warehouse/product", "/staff/stafflist","/staff/stafftype" ], "component_access": [ "view", "edit", "add", "delete", "export", "confirm","adjust","download" ] }, "操作员": { "description": "仓库操作员,负责具体操作", "page_access": [ "/stock/management","/stock/stockbinlist","/stock/stocklist", "/erp/erpasn","/erp/erpasnmaterial","/erp/erpdnmaterial","/erp/erpdn","/erp/erpsortstock", "/inbound/asn","/inbound/predeliverystock","/inbound/sortstock", "/container/containerlist","/container/containercategory", "/outbound/dn","/outbound/backorder","/outbound/container_check", "/taskpage/task", "/count/batch","/count/countbatchlog","/count/detaillog","/count/batchoperatelog", "/dashboard/flows_statements","/dashboard/flows" # "/warehouse/department","/warehouse/boundcodetype","/warehouse/boundtype","/warehouse/boundbusiness","/warehouse/status","/warehouse/product", # "/staff/stafflist","/staff/stafftype" ], "component_access": [ "view", "edit", "add","download","confirm" ] }, "查看员": { "description": "数据查看员,只能查看数据", "page_access": [ "/stock/management","/stock/stockbinlist", "/erp/erpasn","/erp/erpasnmaterial","/erp/erpdnmaterial","/erp/erpdn","/erp/erpsortstock", "/inbound/asn","/inbound/predeliverystock","/inbound/sortstock", "/container/containerlist","/container/containercategory", "/outbound/dn","/outbound/backorder","/outbound/container_check", "/taskpage/task", "/count/batch","/count/countbatchlog","/count/detaillog","/count/batchoperatelog", "/dashboard/flows_statements","/dashboard/flows" # "/warehouse/department","/warehouse/boundcodetype","/warehouse/boundtype","/warehouse/boundbusiness","/warehouse/status","/warehouse/product", # "/staff/stafflist","/staff/stafftype" ], "component_access": ["view","download"] } } 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=page_path, # 使用精确匹配 component=None ) assigned_permissions.extend(page_perms) # 获取精确匹配该路径的组件权限 comp_perms = all_permissions.filter( page=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()