# generate_test_data.py import os import django # 设置 Django 环境 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') django.setup() from django.core.management.base import BaseCommand from django.db import transaction from django.contrib.auth.hashers import make_password from users.models import Department, Menu, Role, User class Command(BaseCommand): help = '生成有逻辑的测试数据(可重复运行,自动跳过已存在项)' def handle(self, *args, **options): self.stdout.write("🚀 开始生成测试数据(幂等模式)...") try: with transaction.atomic(): departments = self._create_departments() menus = self._create_menus() roles = self._create_roles(menus) self._create_users(departments, roles) except Exception as e: self.stderr.write(f"❌ 生成失败: {e}") return self.stdout.write( self.style.SUCCESS("✅ 测试数据生成完成!可安全重复运行。") ) self.stdout.write("\n📌 登录信息:") self.stdout.write(" - 超级管理员: admin / admin123") self.stdout.write(" - 技术经理: techmgr / tech123") self.stdout.write(" - HR专员: hr1 / hr123") def _get_or_create_dept(self, name, parent=None, order=0): """获取或创建部门(按名称+父部门唯一)""" dept, created = Department.objects.get_or_create( name=name, parent=parent, defaults={'order': order} ) if created: self.stdout.write(f" ➕ 部门: {dept.name}") return dept def _create_departments(self): self.stdout.write("🔄 同步部门结构...") company = self._get_or_create_dept("总公司", None, 0) tech = self._get_or_create_dept("技术部", company, 1) hr = self._get_or_create_dept("人力资源部", company, 2) finance = self._get_or_create_dept("财务部", company, 3) backend = self._get_or_create_dept("后端开发组", tech, 1) frontend = self._get_or_create_dept("前端开发组", tech, 2) recruitment = self._get_or_create_dept("招聘组", hr, 1) return { 'company': company, 'tech': tech, 'hr': hr, 'finance': finance, 'backend': backend, 'frontend': frontend, 'recruitment': recruitment, } def _get_or_create_menu(self, code, defaults=None): """按 code 获取或创建菜单""" menu, created = Menu.objects.get_or_create(code=code, defaults=defaults) if created: self.stdout.write(f" ➕ 菜单: {menu.name} ({menu.code})") return menu def _create_menus(self): self.stdout.write("🔄 同步菜单结构...") # ======================== # 1. 系统管理(保持不变) # ======================== system = self._get_or_create_menu("system", { "name": "系统管理", "menu_type": 0, "permission_code": "system:settings", "order_num": 1 }) user_menu = self._get_or_create_menu("user", { "name": "用户管理", "parent": system, "path": "/system/user", "component": "system/UserManage", "permission_code": "user:list", "menu_type": 1, "order_num": 1 }) role_menu = self._get_or_create_menu("role", { "name": "角色管理", "parent": system, "path": "/system/role", "component": "system/RoleManage", "permission_code": "role:list", "menu_type": 1, "order_num": 2 }) menu_menu = self._get_or_create_menu("menu", { "name": "菜单管理", "parent": system, "path": "/system/menu", "component": "system/Menu", "permission_code": "menu:list", "menu_type": 1, "order_num": 3 }) dept_menu = self._get_or_create_menu("dept", { "name": "部门管理", "parent": system, "path": "/system/dept", "component": "system/DeptManage", "permission_code": "dept:list", "menu_type": 1, "order_num": 4 }) # --- 系统管理: list 权限(关键补充!)--- self._get_or_create_menu("user_list", { "name": "查看用户列表", "parent": user_menu, "permission_code": "user:list", "menu_type": 2 }) self._get_or_create_menu("role_list", { "name": "查看角色列表", "parent": role_menu, "permission_code": "role:list", "menu_type": 2 }) self._get_or_create_menu("menu_list", { "name": "查看菜单列表", "parent": menu_menu, "permission_code": "menu:list", "menu_type": 2 }) # ================= 新增:菜单管理的按钮权限 ================= self._get_or_create_menu("menu_list", { "name": "查看菜单列表", "parent": menu_menu, "permission_code": "menu:list", "menu_type": 2 }) self._get_or_create_menu("menu_create", { "name": "新增菜单", "parent": menu_menu, "permission_code": "menu:create", "menu_type": 2 }) self._get_or_create_menu("menu_update", { "name": "编辑菜单", "parent": menu_menu, "permission_code": "menu:update", "menu_type": 2 }) self._get_or_create_menu("menu_delete", { "name": "删除菜单", "parent": menu_menu, "permission_code": "menu:delete", "menu_type": 2 }) self._get_or_create_menu("dept_list", { "name": "查看部门列表", "parent": dept_menu, "permission_code": "dept:list", "menu_type": 2 }) # ================= 新增:部门管理的按钮权限 ================= self._get_or_create_menu("dept_list", { "name": "查看部门列表", "parent": dept_menu, "permission_code": "dept:list", "menu_type": 2 }) self._get_or_create_menu("dept_create", { "name": "新增部门", "parent": dept_menu, "permission_code": "dept:create", "menu_type": 2 }) self._get_or_create_menu("dept_update", { "name": "编辑部门", "parent": dept_menu, "permission_code": "dept:update", "menu_type": 2 }) self._get_or_create_menu("dept_delete", { "name": "删除部门", "parent": dept_menu, "permission_code": "dept:delete", "menu_type": 2 }) # --- 系统管理: 其他按钮权限 --- self._get_or_create_menu("user_create", { "name": "新增用户", "parent": user_menu, "permission_code": "user:create", "menu_type": 2 }) self._get_or_create_menu("user_update", { "name": "编辑用户", "parent": user_menu, "permission_code": "user:update", "menu_type": 2 }) self._get_or_create_menu("user_delete", { "name": "删除用户", "parent": user_menu, "permission_code": "user:delete", "menu_type": 2 }) self._get_or_create_menu("user_reset_pwd", { "name": "重置密码", "parent": user_menu, "permission_code": "user:reset_password", "menu_type": 2 }) self._get_or_create_menu("role_assign", { "name": "分配角色", "parent": role_menu, "permission_code": "user:assign_roles", "menu_type": 2 }) self._get_or_create_menu("role_create", { "name": "新增角色", "parent": role_menu, "permission_code": "role:create", "menu_type": 2 }) self._get_or_create_menu("role_update", { "name": "编辑角色", "parent": role_menu, "permission_code": "role:update", "menu_type": 2 }) self._get_or_create_menu("role_delete", { "name": "删除角色", "parent": role_menu, "permission_code": "role:delete", "menu_type": 2 }) self._get_or_create_menu("role_set_perms", { "name": "设置权限", "parent": role_menu, "permission_code": "role:set_permissions", "menu_type": 2 }) # ======================== # 2. 内容管理(仅保留动态内容类) # ======================== content = self._get_or_create_menu("content", { "name": "内容管理", "menu_type": 0, "permission_code": "system:content", "order_num": 2 }) # 仅保留这些在“内容管理”下 dynamic_content_models = [ ("article", "文章管理", 1, "ArticleList"), ("carousel", "轮播图管理", 2, "CarouselList"), ("notice", "公告管理", 3, "NoticeList"), ("newssection", "新闻栏目", 4, "NewsSection"), ("news", "新闻管理", 5, "NewsList"), ] content_menus = {} for code, name, order, component in dynamic_content_models: menu = self._get_or_create_menu(code, { "name": name, "parent": content, "path": f"/content/{code}", "component": f"content/{component}", "permission_code": f"{code}:list", "menu_type": 1, "order_num": order }) content_menus[code] = menu # 添加 list + CRUD 权限 self._get_or_create_menu(f"{code}_list", { "name": f"查看{name}", "parent": menu, "permission_code": f"{code}:list", "menu_type": 2 }) self._get_or_create_menu(f"{code}_create", { "name": f"新增{name}", "parent": menu, "permission_code": f"{code}:create", "menu_type": 2 }) self._get_or_create_menu(f"{code}_update", { "name": f"编辑{name}", "parent": menu, "permission_code": f"{code}:update", "menu_type": 2 }) self._get_or_create_menu(f"{code}_delete", { "name": f"删除{name}", "parent": menu, "permission_code": f"{code}:delete", "menu_type": 2 }) # --- 公告特殊权限(保持不变)--- notice_menu = content_menus["notice"] self._get_or_create_menu("notice_mark_read", { "name": "标记公告已读", "parent": notice_menu, "permission_code": "notice:mark_as_read", "menu_type": 2 }) self._get_or_create_menu("notice_view_receipts", { "name": "查看公告回执", "parent": notice_menu, "permission_code": "notice:view_receipts", "menu_type": 2 }) # ======================== # 3. 新增:站点配置(原属于内容管理的静态配置类) # ======================== site_config = self._get_or_create_menu("site_config", { "name": "站点配置", "menu_type": 0, "order_num": 3 # 排在内容管理之后 }) site_config_models = [ ("baseinfo", "基础信息", 1, "BaseInfo"), ("mainmenu", "主导航菜单", 2, "MainMenu"), ("picturelink", "图片链接", 3, "PictureLink"), ("friendlink", "友情链接", 4, "FriendLink"), ("linkcategory", "链接分类", 5, ""), ] for code, name, order, component in site_config_models: if not component: menu = self._get_or_create_menu("friendlink") else: menu = self._get_or_create_menu(code, { "name": name, "parent": site_config, "path": f"/config/{code}", "component": f"config/{component}", # 建议组件路径也调整为 config/ "permission_code": f"{code}:list", "menu_type": 1, "order_num": order }) content_menus[code] = menu # 仍加入字典以便返回 # 添加 list + CRUD 权限 self._get_or_create_menu(f"{code}_list", { "name": f"查看{name}", "parent": menu, "permission_code": f"{code}:list", "menu_type": 2 }) self._get_or_create_menu(f"{code}_create", { "name": f"新增{name}", "parent": menu, "permission_code": f"{code}:create", "menu_type": 2 }) self._get_or_create_menu(f"{code}_update", { "name": f"编辑{name}", "parent": menu, "permission_code": f"{code}:update", "menu_type": 2 }) self._get_or_create_menu(f"{code}_delete", { "name": f"删除{name}", "parent": menu, "permission_code": f"{code}:delete", "menu_type": 2 }) return { 'system': system, 'user': user_menu, 'role': role_menu, 'menu': menu_menu, 'dept': dept_menu, 'content': content, 'site_config': site_config, # 新增返回 **content_menus, } def _get_or_create_role(self, code, name, description, status=True): """按 code 获取或创建角色""" role, created = Role.objects.get_or_create( code=code, defaults={ 'name': name, 'description': description, 'status': status } ) if created: self.stdout.write(f" ➕ 角色: {role.name}") return role def _create_roles(self, menus): self.stdout.write("🔄 同步角色权限...") admin_role = self._get_or_create_role( "admin", "超级管理员", "拥有全部权限" ) tech_manager_role = self._get_or_create_role( "tech_manager", "技术部经理", "管理技术部用户" ) hr_role = self._get_or_create_role( "hr_staff", "HR专员", "查看员工信息" ) employee_role = self._get_or_create_role( "employee", "普通员工", "无管理权限" ) # 分配菜单权限(幂等设置) all_menus = Menu.objects.all() admin_role.menus.set(all_menus) tech_manager_role.menus.set([ menus['user'], menus['role'], menus['dept'], Menu.objects.get(permission_code="user:create"), Menu.objects.get(permission_code="user:delete"), Menu.objects.get(permission_code="user:assign_roles"), ]) hr_role.menus.set([menus['user']]) employee_role.menus.set([]) return { 'admin': admin_role, 'tech_manager': tech_manager_role, 'hr': hr_role, 'employee': employee_role, } def _get_or_create_user(self, username, defaults, roles): """获取或创建用户,并设置角色""" user, created = User.objects.get_or_create( username=username, defaults=defaults ) if created: self.stdout.write(f" ➕ 用户: {user.cname} ({user.username})") # 无论是否新建,都确保角色正确(幂等) user.roles.set(roles) return user def _create_users(self, departments, roles): self.stdout.write("🔄 同步用户账号...") self._get_or_create_user( "admin", { "cname": "系统管理员", "phone": "13800000000", "password": make_password("adminadmin"), "dept": departments['company'], "is_active": True, "is_staff": True, "is_superuser": True, }, [roles['admin']] ) self._get_or_create_user( "techmgr", { "cname": "张经理", "phone": "13800000001", "password": make_password("adminadmin"), "dept": departments['tech'], "is_active": True, }, [roles['tech_manager']] ) self._get_or_create_user( "dev1", { "cname": "李开发", "phone": "13800000002", "password": make_password("adminadmin"), "dept": departments['backend'], "is_active": True, }, [roles['employee']] ) self._get_or_create_user( "hr1", { "cname": "王HR", "phone": "13800000003", "password": make_password("adminadmin"), "dept": departments['hr'], "is_active": True, }, [roles['hr']] ) self._get_or_create_user( "finance1", { "cname": "赵会计", "phone": "13800000004", "password": make_password("adminadmin"), "dept": departments['finance'], "is_active": True, }, [roles['employee']] )