DjangoAdmin v2.8.2 重构发布:拆解 Django、Vue 3 与细粒度 RBAC 的落地方式

2026-09-18 23 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:12 分钟

DjangoAdmin v2.8.2 的重点不只是一次小版本更新,而是一次面向企业级数据中台场景的整体重构。项目继续采用前后端分离架构:后端基于 Django,前端组合 Vue 3、TypeScript、Ant Design Vue、Vite 与 Vue Router,并把 RBAC 权限控制细化到菜单、按钮乃至后端方法。

对于准备搭建运营后台、内部管理平台或数据中台的团队,这类框架的价值不在于少写几个页面,而在于提前解决用户、组织、权限、日志和基础数据等重复建设问题。不过,“全新重构”也意味着升级不能只看版本号,接口兼容性、权限标识和前端路由都需要重新核对。

重构后的技术边界更清晰

从技术栈可以看出,DjangoAdmin 将系统划分为两个相对独立的部分:

  • Django 后端负责认证、授权、业务规则、数据访问和日志记录。
  • Vue 3 + TypeScript负责管理端交互,并借助类型约束降低大型前端项目中的字段误用。
  • Ant Design Vue提供表格、表单、弹窗和布局等后台系统常用组件。
  • Vite承担开发服务器和前端构建任务。
  • Vue Router管理页面路由,并可结合权限数据动态生成可访问菜单。

这种架构适合多人并行开发,但也引入了一条必须明确的边界:前端权限只控制界面是否展示,真正的安全检查必须由 Django 后端完成。即使某个按钮被隐藏,用户仍可能绕过页面直接发送 HTTP 请求。

因此,一个可靠的权限链路通常应当是:

  1. 用户登录并获得会话或访问令牌。
  2. 后端返回当前用户拥有的菜单与操作权限标识。
  3. 前端据此生成路由、菜单并控制按钮显示。
  4. 用户发起操作请求时,后端再次校验方法级权限。
  5. 敏感操作写入系统日志,记录操作者、参数摘要、结果和时间。

企业后台不只是 CRUD 页面集合

v2.8.2 所描述的内置模块覆盖了用户管理、角色管理、权限菜单、部门管理、职级岗位、系统日志、数据字典、系统参数与行政区划等能力。这些模块可以大致归为三类。

身份、组织与权限

用户、角色、部门和岗位共同回答三个问题:谁在操作、属于哪个组织、能够执行什么动作。实际项目中,不宜直接把“部门”等同于“角色”。部门通常描述组织归属,角色则描述能力集合;同一部门中的主管和普通员工可以拥有完全不同的权限。

系统治理

系统日志、系统参数和数据字典决定了平台是否容易运维。数据字典适合存储状态、类型等可配置枚举;系统参数适合保存允许在线调整的非敏感配置。数据库密码、签名密钥等机密信息仍应进入环境变量或专门的密钥管理系统,而不是普通参数表。

通用基础数据

行政区划等数据经常被多个业务模块复用。将它们统一维护可以避免每个业务团队各自保存一套省市区数据,但需要提前确定数据版本、更新来源和历史记录处理策略。

可以这样实践按钮与方法级权限

下面是一个基于标准 Django 与 Vue 3 写法的最小示例,用来说明如何让前端按钮权限和后端方法权限使用同一个标识。它是可改造的参考实现,并不代表 DjangoAdmin v2.8.2 的实际目录或接口名称。

约定权限标识为 system:user:delete。后端始终执行强制校验,前端只负责改善交互体验。

Django:在接口入口校验权限

创建一个普通 Django 项目:

python -m venv .venv
source .venv/bin/activate
# Windows PowerShell 使用:.venv\Scripts\Activate.ps1
pip install "Django>=4.2"
django-admin startproject config .
python manage.py startapp users

新建 users/permissions.py

from functools import wraps

from django.http import JsonResponse


def require_permission(permission_code: str):
    def decorator(view_func):
        @wraps(view_func)
        def wrapped(request, *args, **kwargs):
            if not request.user.is_authenticated:
                return JsonResponse(
                    {"code": "UNAUTHENTICATED", "message": "请先登录"},
                    status=401,
                )

            # 示例直接使用 Django permission API。
            # 接入现有框架时,可替换为其 RBAC 服务或权限缓存查询。
            if not request.user.has_perm(permission_code):
                return JsonResponse(
                    {"code": "FORBIDDEN", "message": "无权执行该操作"},
                    status=403,
                )

            return view_func(request, *args, **kwargs)

        return wrapped

    return decorator

Django 自带权限的标准格式通常是 应用标签.权限代号。如果项目要保留三段式业务标识,可以在用户模型、RBAC 服务或映射层中实现转换。下面为了突出调用方式,假设 has_perm 已能识别该标识。

新建 users/views.py

from django.http import JsonResponse
from django.views.decorators.http import require_http_methods

from .permissions import require_permission


@require_http_methods(["DELETE"])
@require_permission("system:user:delete")
def delete_user(request, user_id: int):
    # 实际项目应在这里查询用户、检查数据范围并执行软删除或硬删除。
    return JsonResponse({"success": True, "deleted_user_id": user_id})

新建 users/urls.py

from django.urls import path

from .views import delete_user

urlpatterns = [
    path("<int:user_id>/", delete_user, name="delete-user"),
]

再把应用路由加入 config/urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/users/", include("users.urls")),
]

Vue 3:根据相同标识控制按钮

前端可以把登录后获得的权限标识放入集合中,再封装为组合式函数。以下示例假设项目已经安装并配置 Vue 3 与 Ant Design Vue:

// src/composables/usePermission.ts
import { computed, type Ref } from 'vue'

export function usePermission(permissionCodes: Ref<string[]>) {
  const permissionSet = computed(() => new Set(permissionCodes.value))

  function can(code: string): boolean {
    return permissionSet.value.has(code)
  }

  return { can }
}

组件中使用同一个权限标识:

<script setup lang="ts">
import { ref } from 'vue'
import { usePermission } from '@/composables/usePermission'

const permissionCodes = ref<string[]>([
  'system:user:list',
  'system:user:delete',
])

const { can } = usePermission(permissionCodes)

async function removeUser(userId: number) {
  const response = await fetch(`/api/users/${userId}/`, {
    method: 'DELETE',
    credentials: 'include',
  })

  if (!response.ok) {
    throw new Error(`删除失败:HTTP ${response.status}`)
  }
}
</script>

<template>
  <a-button
    v-if="can('system:user:delete')"
    danger
    @click="removeUser(42)"
  >
    删除用户
  </a-button>
</template>

这套写法有三个值得保留的原则:权限标识前后端一致、界面隐藏不能替代接口鉴权、后端返回 401 与 403 时应使用不同处理逻辑。

从旧版本升级时要重点核对什么

因为发布信息明确提到“大版本全新重构”,不建议直接覆盖生产环境。更稳妥的方式是建立平行测试环境,并按以下顺序检查:

  • 数据库结构:备份数据库,检查迁移文件、字段默认值、唯一约束和数据字典编码。
  • 接口契约:对比 URL、HTTP 方法、请求字段、分页格式和错误响应结构。
  • 权限标识:确认菜单、按钮与方法权限是否改名,排查角色授权后仍返回 403 的情况。
  • 动态路由:检查后端菜单数据能否正确映射到 Vue Router 组件,尤其关注重定向、隐藏菜单和外链。
  • 组织数据:验证部门、岗位和用户关系是否保留,避免迁移后出现孤立记录。
  • 日志与审计:确认登录、增删改、权限变更等关键动作仍能被记录。
  • 前端构建:锁定 Node.js 与包管理器版本,在 CI 中重新执行类型检查和生产构建。

可以把最低限度的验证命令放进 CI:

set -e

python manage.py check
python manage.py makemigrations --check --dry-run
python manage.py test

npm ci
npm run build

具体脚本名称需要根据项目的 package.json 调整。如果仓库提供类型检查或测试命令,也应一并加入流水线。

采用建议:先验证权限闭环,再迁移业务

评估 DjangoAdmin v2.8.2 时,不要只浏览仪表盘和表格页面。建议先挑选一个包含列表、创建、编辑、删除和数据范围限制的小型模块做试点,完整验证登录、菜单加载、按钮显示、接口鉴权和操作日志。

上线前至少确认以下事项:

  • 权限检查发生在后端,而不只是 Vue 条件渲染。
  • 超级管理员拥有可审计、可收回的授权机制。
  • 系统参数与敏感密钥分开保存。
  • 删除、导出、批量修改等高风险操作具备日志或二次确认。
  • 重构升级通过数据库备份、回滚演练和自动化测试验证。

DjangoAdmin v2.8.2 提供的是一套企业后台基础能力的组合。真正决定系统能否长期维护的,不是预置模块数量,而是团队能否建立稳定的接口契约、统一的权限编码,以及可重复执行的升级流程。


相关推荐