# -*- 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 []