6.5 KiB
6.5 KiB
View层规范
概述
View 层负责处理 HTTP 请求和返回响应,使用 Django 类视图(Class-Based Views)。每个视图类对应一个 API 端点,通过装饰器实现登录验证、权限检查和操作日志记录。
:::tip 设计原则
- 使用类视图(继承
View) - 通过
@method_decorator(check_login)验证登录 - 通过
PermissionRequiredmixin 检查权限 - 通过
@operation_log记录操作日志 - 写操作检查
DJANGO_DEMO演示模式 :::
完整示例
以案例模块为例,application/example/views.py:
from django.utils.decorators import method_decorator
from django.views import View
from application.example import services
from config.env import DJANGO_DEMO
from middleware.login_middleware import check_login
from middleware.permission_middleware import PermissionRequired
from utils import R
from application.operation_log.constants import LogType
from application.operation_log.decorators import operation_log
# =============================================================
# 分页查询视图
# =============================================================
@method_decorator(check_login, name="get")
class ExamplePageView(PermissionRequired, View):
"""案例分页数据查询视图"""
permission_required = ("sys:example:page",)
@operation_log(title="案例管理-查询分页列表", log_type=LogType.QUERY)
def get(self, request):
result = services.get_example_page(request)
return result
# =============================================================
# 详情查询视图
# =============================================================
@method_decorator(check_login, name="get")
class ExampleDetailView(PermissionRequired, View):
"""案例详情查询视图"""
permission_required = ("sys:example:detail",)
@operation_log(title="案例管理-查询记录详情", log_type=LogType.QUERY)
def get(self, request, id):
data = services.get_example_detail(id)
return R.ok(data=data)
# =============================================================
# 添加视图
# =============================================================
@method_decorator(check_login, name="post")
class ExampleAddView(PermissionRequired, View):
"""添加案例视图"""
permission_required = ("sys:example:add",)
@operation_log(title="案例管理-添加记录", log_type=LogType.ADD)
def post(self, request):
# 演示环境禁止操作
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
result = services.add_example(request)
return result
# =============================================================
# 更新视图
# =============================================================
@method_decorator(check_login, name="put")
class ExampleUpdateView(PermissionRequired, View):
"""更新案例视图"""
permission_required = ('sys:example:update',)
@operation_log(title="案例管理-更新记录", log_type=LogType.UPDATE)
def put(self, request):
# 演示环境禁止操作
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
result = services.update_example(request)
return result
# =============================================================
# 删除视图(支持批量)
# =============================================================
@method_decorator(check_login, name="delete")
class ExampleDeleteView(PermissionRequired, View):
"""删除案例视图"""
permission_required = ('sys:example:delete',)
@operation_log(title="案例管理-删除记录", log_type=LogType.DELETE)
def delete(self, request, id):
# 演示环境禁止操作
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
result = services.delete_examples(id)
return result
# =============================================================
# 状态更新视图
# =============================================================
@method_decorator(check_login, name="put")
class ExampleStatusView(PermissionRequired, View):
"""设置案例状态视图"""
permission_required = ('sys:example:status',)
def put(self, request):
# 演示环境禁止操作
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
result = services.update_example_status(request)
return result
装饰器说明
@method_decorator(check_login)
验证 JWT 登录状态,从 Authorization: Bearer <token> 头解析用户信息。未登录返回 401。
@method_decorator(check_login, name="get") # 验证 GET 请求
@method_decorator(check_login, name="post") # 验证 POST 请求
@method_decorator(check_login, name="put") # 验证 PUT 请求
@method_decorator(check_login, name="delete") # 验证 DELETE 请求
PermissionRequired
权限检查 mixin,用户 ID 为 1 的超级管理员自动跳过权限检查。
class ExamplePageView(PermissionRequired, View):
permission_required = ("sys:example:page",) # 权限标识
@operation_log
操作日志记录装饰器,自动记录请求参数、响应结果、执行时间等。
@operation_log(title="案例管理-添加记录", log_type=LogType.ADD)
日志类型:
| 类型 | 说明 |
|---|---|
LogType.QUERY |
查询操作 |
LogType.ADD |
添加操作 |
LogType.UPDATE |
更新操作 |
LogType.DELETE |
删除操作 |
演示模式检查
写操作(add/update/delete/status)需检查 DJANGO_DEMO 配置:
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
权限标识规范
| 操作 | 权限标识 | 说明 |
|---|---|---|
| 分页查询 | sys:{module}:page |
查询分页数据 |
| 列表查询 | sys:{module}:list |
查询列表数据 |
| 详情查询 | sys:{module}:detail |
查询单条详情 |
| 添加 | sys:{module}:add |
添加记录 |
| 更新 | sys:{module}:update |
更新记录 |
| 删除 | sys:{module}:delete |
删除记录 |
| 状态 | sys:{module}:status |
更新状态 |
View 层职责
View 层只负责:
- 接收 HTTP 请求
- 调用 Service 层函数
- 返回 R 响应
禁止在 View 层直接操作数据库或编写业务逻辑。
总结
View 层使用 Django 类视图,通过装饰器实现登录验证(check_login)、权限检查(PermissionRequired)和操作日志记录(operation_log)。写操作检查 DJANGO_DEMO 演示模式。View 层只负责请求分发和响应返回,业务逻辑集中在 Service 层。