不知道大家有没有这种感受:前面搭骨架、做权限、写登录页的时候,觉得自己已经会了。但真要做"普通员工只能看自己的数据"“删了的记录还能查回来”"菜单改了所有人立刻生效"这些真实业务需求的时候,才发现之前的东西全是半成品。这是这个系列的最后一篇。前两篇我们搭了工程化骨架、组织架构、RBAC权限、登录认证和动态菜单。这篇先汇报一下项目最终长什么样,再讲这一阶段啃下来的几个硬骨头,最后聊聊自己的收获。一、项目最终长什么样1.1 功能清单整套系统分三大块:系统管理:用户管理(增删改查、数据范围校验、独立改密页)、部门管理(树形结构、删除前校验子部门和在册用户)、岗位管理(全局岗位枚举、一人多岗)、菜单管理(目录/页面/按钮三类节点组成授权树)、角色管理(菜单授权+数据范围+关联用户)。系统监控:操作日志(增删改全记录、按用户和时间过滤)、请求日志(路径/方法/状态码/耗时/IP)。系统工具:字典管理(性别等枚举键值对,模板标签供下拉框消费)、配置管理(系统参数键值对)、仪表盘(按身份分流:管理员看全局KPI和趋势图,普通用户只看自己的数据)。技术栈:Django 6.0 + MySQL 8.0 + Bootstrap 5,全程服务端渲染。最终成果:9个模型、约1300行视图、7个ModelForm、23个模板。manage.py check零告警。1.2 目录结构admin-system/ ├── config/ # 项目配置 │ ├── settings/ # base.py / dev.py / prod.py 三层拆分 │ └── urls.py # 总路由 ├── apps/system/ # 唯一业务应用 │ ├── models.py # User/Menu/Role/Dept/Post/DictType/DictItem/Config/OperationLog │ ├── views.py # 列表/表单/逻辑删除/角色授权/仪表盘 │ ├── forms.py # BootstrapFormMixin + 各模块ModelForm │ ├── signals.py # 审计追踪 + 菜单缓存版本号失效 │ └── templatetags/ # 分页/Toast/字典取值/菜单渲染标签 ├── templates/ # base.html骨架 + 各模块list/form ├── static/ # bootstrap/echarts本地化静态资源 ├── utils/data_scope.py # 数据范围裁剪(视图和表单共用) └── manage.py1.3 业务流转整个系统的数据流:用户登录后,上下文处理器根据角色算出他能看到哪些菜单;点进某个页面,视图层先校验菜单访问权,再校验按钮权限码,最后按数据范围裁剪数据;所有增删改操作被审计信号自动记录;菜单变更后版本号+1,所有人的缓存自动重建。二、这一阶段啃下来的硬骨头2.1 数据范围:进了页面能看哪些行前面RBAC解决的是"能不能进页面、能不能点按钮"。但真实业务还有一层:经理进了用户列表能看全公司的人,普通员工进同一个页面只能看到自己。这就是数据范围。数据范围分三档:全部(ALL)、本部门(DEPT)、仅本人(SELF)。关键是它必须在四个出口同时生效,缺一处就是越权口子:列表按范围裁剪、编辑删除凭id直达URL也必须拦下、表单下拉按范围裁剪并锁定、仪表盘普通用户换成"我的"口径。defget_user_queryset(user):"""按当前用户角色的 data_scope 裁剪用户数据"""scopes=list(user.roles.filter(is_deleted=False).values_list("data_scope",flat=True))ifuser.is_superuserorRole.DataScope.ALLinscopes:returnUser.objects.all()# 全部数据ifRole.DataScope.DEPTinscopes: