Files
DjangoAdmin_Django_NaiveVue/public/templates/services.py.tpl
T
2026-09-12 12:07:15 +08:00

524 lines
18 KiB
Smarty
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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 []