524 lines
18 KiB
Smarty
524 lines
18 KiB
Smarty
# -*- 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 [] |