签入版本

This commit is contained in:
2026-09-11 11:39:07 +08:00
commit c381201858
928 changed files with 116443 additions and 0 deletions
+524
View File
@@ -0,0 +1,524 @@
# -*- coding: utf-8 -*-
"""
{{ module_comment }}管理服务模块模板
=============================================================
该模板用于生成{{ module_comment }}管理相关的所有业务逻辑。
包括{{ module_comment }}的分页查询、详情查询、添加、更新、删除等功能。
{{ business_description_detail }}
模板变量说明:
- module_comment: 模块注释,如"文章管理"
- app_name: 应用名称,如"article"
- model_class_name: 模型类名,如"Article"
- primary_key: 主键字段名,如"id"
- filter_fields: 筛选字段列表
- fields: 所有字段列表
- form_fields: 表单字段列表
- list_fields: 列表展示字段列表
- has_status: 是否包含状态字段
- has_sort: 是否包含排序字段
"""
import json
import logging
from django.core.paginator import Paginator, PageNotAnInteger, InvalidPage, EmptyPage
from application.{{ app_name }} import forms
from application.{{ app_name }}.models import {{ model_class_name }}
from config.env import DJANGO_FILE_URL
from constant.constants import PAGE_SIZE
from utils import R, regular
from utils.common import get_file_url, format_datetime, parse_request_body, save_file, save_edit_content
from utils.security import get_username
# =============================================================
# 分页查询服务
# =============================================================
def get_{{ app_name }}_page(request):
"""
查询{{ module_comment }}分页数据
Args:
request: HttpRequest对象,包含查询参数
- pageNo: 当前页码(可选,默认为1)
- pageSize: 每页记录数(可选,默认为PAGE_SIZE)
{% for filter_field in filter_fields %}
- {{ filter_field.name }}: {{ filter_field.comment }}(可选,{{ filter_field.filter_type }})
{% endfor %}
Returns:
R: 包含分页数据的JSON响应
"""
try:
# 获取分页参数
page_no = int(request.GET.get('pageNo', 1))
page_size = int(request.GET.get('pageSize', PAGE_SIZE))
# 构建基础查询(只查询未删除的记录)
query = {{ model_class_name }}.objects.filter(is_delete=False)
# 应用筛选条件
query = _apply_filters(query, request)
# 按排序字段排列
query = query.order_by({% if has_sort %}"sort"{% else %}"-create_time"{% endif %})
# 执行分页查询
paginator = Paginator(query, page_size)
try:
page_list = paginator.page(page_no)
except (PageNotAnInteger, InvalidPage, EmptyPage):
# 页码无效时默认返回第一页
page_list = paginator.page(1)
page_no = 1
# 构建并返回分页数据
page_data = _build_page_data(page_list, paginator, page_no, page_size)
return R.ok(data=page_data)
except Exception as e:
logging.error(f"查询{{ module_comment }}分页数据异常: {str(e)}")
return R.failed(msg="查询失败,请稍后重试")
def _apply_filters(queryset, request):
"""
应用查询筛选条件(私有辅助函数)
Args:
queryset: 初始查询集
request: HttpRequest对象,包含筛选参数
Returns:
QuerySet: 应用筛选后的查询集
"""
{% for filter_field in filter_fields %}
# {{ filter_field.comment }}筛选
{{ filter_field.name }} = request.GET.get('{{ filter_field.name }}')
if {{ filter_field.name }}:
{% if filter_field.filter_type == '模糊查询' %}
queryset = queryset.filter({{ filter_field.name }}__contains={{ filter_field.name }})
{% else %}
queryset = queryset.filter({{ filter_field.name }}={{ filter_field.name }})
{% endif %}
{% endfor %}
return queryset
def _build_page_data(page_list, paginator, page_no, page_size):
"""
构建分页返回数据(私有辅助函数)
Args:
page_list: 当前页数据列表(Page对象)
paginator: 分页器对象
page_no: 当前页码
page_size: 每页大小
Returns:
dict: 标准格式的分页数据
"""
records = []
for item in page_list:
record = {
'id': item.id,
{% for field in list_fields %}
'{{ field.camel_name }}': {% if field.is_image %}get_file_url(item.{{ field.name }}) if item.{{ field.name }} else ""{% else %}item.{{ field.name }}{% endif %},
{% endfor %}
'createUser': item.create_user,
'createTime': format_datetime(item.create_time),
'updateUser': item.update_user,
'updateTime': format_datetime(item.update_time),
}
records.append(record)
return {
'records': records,
'total': paginator.count, # 总记录数
'size': page_size, # 每页大小
'current': page_no, # 当前页码
'pages': paginator.num_pages # 总页数
}
# =============================================================
# 列表查询服务(不分页)
# =============================================================
def get_{{ app_name }}_list(request):
"""
获取{{ module_comment }}列表(不分页,支持筛选条件)
与分页查询的区别:返回所有符合条件的记录,不分页。
通常用于导出数据或内部调用。
Args:
request: HttpRequest对象,包含查询参数
{% for filter_field in filter_fields %}
- {{ filter_field.name }}: {{ filter_field.comment }}(可选,{{ filter_field.filter_type }})
{% endfor %}
Returns:
list: {{ module_comment }}列表,每个元素为{{ module_comment }}模型字典
查询失败时返回空列表
"""
try:
# 构建基础查询
query = {{ model_class_name }}.objects.filter(is_delete=False)
# 应用筛选条件(复用 _apply_filters 方法)
query = _apply_filters(query, request)
# 按排序字段排列
query = query.order_by({% if has_sort %}"sort"{% else %}"-create_time"{% endif %})
# 构建返回数据
records = []
for item in query:
record = {
'id': item.id,
{% for field in list_fields %}
'{{ field.camel_name }}': {% if field.is_image %}get_file_url(item.{{ field.name }}) if item.{{ field.name }} else ""{% else %}item.{{ field.name }}{% endif %},
{% endfor %}
'createUser': item.create_user,
'createTime': format_datetime(item.create_time),
'updateUser': item.update_user,
'updateTime': format_datetime(item.update_time),
}
records.append(record)
return records
except Exception as e:
logging.error(f"查询{{ module_comment }}列表异常: {str(e)}")
return []
# =============================================================
# 详情查询服务
# =============================================================
def get_{{ app_name }}_detail({{ primary_key }}):
"""
根据ID查询{{ module_comment }}详情
Args:
{{ primary_key }}: {{ module_comment }}ID
Returns:
dict/None: {{ module_comment }}详情字典,不存在时返回None
"""
try:
# 查询未删除的{{ module_comment }}记录
instance = {{ model_class_name }}.objects.filter(is_delete=False, id={{ primary_key }}).first()
if not instance:
return None
# 处理富文本字段
{% for field in fields %}
{% if field.is_rich_text %}
{{ field.name }} = instance.{{ field.name }}
if {{ field.name }}:
{{ field.name }} = {{ field.name }}.replace("[IMG_URL]", DJANGO_FILE_URL)
{% endif %}
{% endfor %}
# 返回详情数据
return {
'id': instance.id,
{% for field in fields %}
'{{ field.camel_name }}': {% if field.is_image %}get_file_url(instance.{{ field.name }}) if instance.{{ field.name }} else ""{% elif field.is_rich_text %}{{ field.name }}{% else %}instance.{{ field.name }}{% endif %},
{% endfor %}
}
except Exception as e:
logging.error(f"查询{{ module_comment }}详情异常,ID: { {{ primary_key }} }, 错误: {str(e)}")
return None
# =============================================================
# 添加服务
# =============================================================
def add_{{ app_name }}(request):
"""
添加{{ module_comment }}
处理流程:
1. 解析请求体中的JSON数据
2. 表单验证
{% for field in form_fields %}{% if field.is_image %}3. 处理{{ field.comment }}(保存到 {{ app_name }} 目录){% endif %}{% endfor %}
{% for field in form_fields %}{% if field.is_rich_text %}4. 处理{{ field.comment }}(保存富文本内容){% endif %}{% endfor %}
5. 创建数据库记录
Args:
request: HttpRequest对象,包含{{ module_comment }}信息的JSON数据
Returns:
R: 操作结果(成功/失败)
"""
# 解析请求参数
data, error = parse_request_body(request)
if error:
return R.failed(msg=error)
# 表单验证
form = forms.{{ model_class_name }}Form(data)
if not form.is_valid():
return R.failed(msg=regular.get_err(form))
try:
cleaned_data = form.cleaned_data
# 处理图片字段
{% for field in form_fields %}
{% if field.is_image %}
{{ field.camel_name }} = cleaned_data.get('{{ field.camel_name }}')
if {{ field.camel_name }}:
{{ field.camel_name }} = save_file({{ field.camel_name }}, "{{ app_name }}")
{% endif %}
{% endfor %}
# 处理富文本字段
{% for field in form_fields %}
{% if field.is_rich_text %}
{{ field.camel_name }} = cleaned_data.get('{{ field.camel_name }}')
if {{ field.camel_name }}:
{{ field.camel_name }} = save_edit_content({{ field.camel_name }}, None, "{{ app_name }}")
{% endif %}
{% endfor %}
# 创建{{ module_comment }}记录
{{ model_class_name }}.objects.create(
{% for field in form_fields %}
{{ field.name }}={% if field.is_image %}{{ field.camel_name }}{% elif field.is_rich_text %}{{ field.camel_name }}{% else %}cleaned_data.get('{{ field.camel_name }}'){% endif %},
{% endfor %}
create_user=get_username(request),
update_user=get_username(request)
)
return R.ok(msg="创建成功")
except Exception as e:
logging.error(f"添加{{ module_comment }}异常: {str(e)}")
return R.failed(msg="添加失败,请稍后重试")
# =============================================================
# 更新服务
# =============================================================
def update_{{ app_name }}(request):
"""
更新{{ module_comment }}
处理流程:
1. 解析请求体中的JSON数据
2. 验证{{ module_comment }}ID
3. 表单验证
4. 查询现有记录
5. 处理图片字段(如有新图片则保存)
6. 处理富文本字段
7. 更新各字段
8. 保存更新
Args:
request: HttpRequest对象,包含{{ module_comment }}ID和更新信息的JSON数据
Returns:
R: 操作结果(成功/失败)
"""
# 解析请求参数
data, error = parse_request_body(request)
if error:
return R.failed(msg=error)
# 验证{{ module_comment }}ID
instance_id = data.get('id')
if not instance_id or not str(instance_id).isdigit() or int(instance_id) <= 0:
return R.failed("{{ module_comment }}ID无效")
instance_id = int(instance_id)
# 表单验证
form = forms.{{ model_class_name }}Form(data)
if not form.is_valid():
return R.failed(msg=regular.get_err(form))
try:
# 查询{{ module_comment }}记录
instance = {{ model_class_name }}.objects.filter(id=instance_id, is_delete=False).first()
if not instance:
return R.failed("{{ module_comment }}不存在")
cleaned_data = form.cleaned_data
# 处理图片字段(仅当有新图片且与当前不同时保存)
{% for field in form_fields %}
{% if field.is_image %}
{{ field.camel_name }} = cleaned_data.get('{{ field.camel_name }}')
if {{ field.camel_name }} and {{ field.camel_name }} != instance.{{ field.name }}:
{{ field.camel_name }} = save_file({{ field.camel_name }}, "{{ app_name }}")
else:
{{ field.camel_name }} = instance.{{ field.name }}
{% endif %}
{% endfor %}
# 处理富文本字段
{% for field in form_fields %}
{% if field.is_rich_text %}
{{ field.camel_name }} = cleaned_data.get('{{ field.camel_name }}')
if {{ field.camel_name }}:
{{ field.camel_name }} = save_edit_content({{ field.camel_name }}, None, "{{ app_name }}")
else:
{{ field.camel_name }} = instance.{{ field.name }}
{% endif %}
{% endfor %}
# 更新各字段
{% for field in form_fields %}
{% if field.is_image %}
instance.{{ field.name }} = {{ field.camel_name }}
{% elif field.is_rich_text %}
instance.{{ field.name }} = {{ field.camel_name }}
{% else %}
instance.{{ field.name }} = cleaned_data.get('{{ field.camel_name }}')
{% endif %}
{% endfor %}
instance.update_user = get_username(request)
instance.save()
return R.ok(msg="更新成功")
except Exception as e:
logging.error(f"更新{{ module_comment }}异常,ID: {instance_id}, 错误: {str(e)}")
return R.failed(msg="更新失败,请稍后重试")
# =============================================================
# 删除服务(支持批量)
# =============================================================
def delete_{{ app_name }}s(instance_ids):
"""
删除{{ module_comment }}(批量删除)
采用逻辑删除方式(is_delete=True),而非物理删除。
支持逗号分隔的多个ID。
Args:
instance_ids: {{ module_comment }}ID字符串,多个ID用逗号分隔
例如: "1" 或 "1,2,3"
Returns:
R: 操作结果,包含删除数量
"""
if not instance_ids:
return R.failed("记录ID不存在")
try:
# 解析ID列表
id_list = [int(id_str.strip()) for id_str in instance_ids.split(',') if id_str.strip()]
if not id_list:
return R.failed("无效的记录ID")
# 批量更新删除标识(逻辑删除)
updated_count = {{ model_class_name }}.objects.filter(
id__in=id_list,
is_delete=False
).update(is_delete=True)
return R.ok(msg=f"本次共删除{updated_count}条数据")
except ValueError:
return R.failed("记录ID格式错误")
except Exception as e:
logging.error(f"删除{{ module_comment }}异常,IDs: {instance_ids}, 错误: {str(e)}")
return R.failed(msg="删除失败,请稍后重试")
{% if has_status %}
# =============================================================
# 状态更新服务
# =============================================================
def update_{{ app_name }}_status(request):
"""
更新{{ module_comment }}状态
单独更新{{ module_comment }}的启用/禁用状态,不涉及其他字段。
Args:
request: HttpRequest对象
- id: {{ module_comment }}ID
- status: 目标状态值(1=启用, 2=禁用)
Returns:
R: 操作结果(成功/失败)
"""
# 解析请求参数
data, error = parse_request_body(request)
if error:
return R.failed(msg=error)
# 验证{{ module_comment }}ID
instance_id = data.get('id')
if not instance_id or not str(instance_id).isdigit() or int(instance_id) <= 0:
return R.failed("{{ module_comment }}ID无效")
instance_id = int(instance_id)
# 验证状态值(1=启用, 2=禁用)
status = data.get('status')
if status is None:
return R.failed("状态值不能为空")
try:
status = int(status)
if status not in [1, 2]:
return R.failed("状态值无效")
except ValueError:
return R.failed("状态值格式错误")
try:
# 查询{{ module_comment }}记录
instance = {{ model_class_name }}.objects.filter(id=instance_id, is_delete=False).first()
if not instance:
return R.failed("{{ module_comment }}不存在")
# 更新状态
instance.status = status
instance.update_user = get_username(request)
instance.save()
return R.ok(msg="状态更新成功")
except Exception as e:
logging.error(f"更新{{ module_comment }}状态异常,ID: {instance_id}, 错误: {str(e)}")
return R.failed(msg="状态更新失败,请稍后重试")
{% endif %}
# =============================================================
# 数据下拉列表服务
# =============================================================
def get_{{ app_name }}_data():
"""
获取所有启用的{{ module_comment }}列表
通常用于前端下拉选择框等场景。
只返回 status=1(启用)且未删除的记录。
Returns:
list: {{ module_comment }}列表,每个元素为{{ module_comment }}模型字典
查询失败时返回空列表
"""
try:
# 查询启用的{{ module_comment }}数据列表
# status=1 表示启用,is_delete=False 表示未删除
queryset = {{ model_class_name }}.objects.filter(
is_delete=False,
status=1
).order_by({% if has_sort %}"sort"{% else %}"-create_time"{% endif %}).values()
return list(queryset)
except Exception as e:
logging.error(f"获取{{ module_comment }}列表异常: {str(e)}")
return []