controller.py.vm 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. {%- set is_tree = table.tpl_category == 'tree' %}
  2. from typing import List
  3. from flask import g
  4. from flask_login import login_required
  5. from pydantic import BeforeValidator
  6. from typing_extensions import Annotated
  7. from werkzeug.datastructures import FileStorage
  8. from ruoyi_common.base.model import AjaxResponse, TableResponse
  9. from ruoyi_common.constant import HttpStatus
  10. from ruoyi_common.descriptor.serializer import BaseSerializer, JsonSerializer
  11. from ruoyi_common.descriptor.validator import QueryValidator, BodyValidator, PathValidator, FileDownloadValidator, FileUploadValidator
  12. from ruoyi_common.domain.enum import BusinessType
  13. from ruoyi_common.utils.base import ExcelUtil
  14. from ruoyi_framework.descriptor.log import Log
  15. from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize
  16. from {{ get_import_path(table.package_name, table.module_name, 'controller') }} import {{ underscore(table.class_name) }} as {{ underscore(table.class_name) }}_bp
  17. from {{ get_import_path(table.package_name, table.module_name, 'domain') }} import {{ class_name_pascal }}
  18. from {{ get_import_path(table.package_name, table.module_name, 'service') }}.{{ underscore(table.class_name) }}_service import {{ class_name_pascal }}Service
  19. # 使用 controller/__init__.py 中定义的蓝图
  20. gen = {{ underscore(table.class_name) }}_bp
  21. {{ underscore(table.class_name) }}_service = {{ class_name_pascal }}Service()
  22. def _clear_page_context():
  23. if hasattr(g, "criterian_meta"):
  24. g.criterian_meta.page = None
  25. @gen.route('/list', methods=["GET"])
  26. {%- if is_tree %}
  27. @QueryValidator()
  28. {%- else %}
  29. @QueryValidator(is_page=True)
  30. {%- endif %}
  31. @PreAuthorize(HasPerm('{{ table.module_name }}:{{ table.business_name }}:list'))
  32. @JsonSerializer()
  33. def {{ underscore(table.business_name) }}_list(dto: {{ class_name_pascal }}):
  34. """查询{{ table.function_name }}列表"""
  35. {{ underscore(table.class_name) }}_entity = {{ class_name_pascal }}()
  36. # 转换PO到Entity对象
  37. for attr in dto.model_fields.keys():
  38. if hasattr({{ underscore(table.class_name) }}_entity, attr):
  39. setattr({{ underscore(table.class_name) }}_entity, attr, getattr(dto, attr))
  40. {%- if is_tree %}
  41. {{ underscore(table.class_name) }}_entity.page_num = None
  42. {{ underscore(table.class_name) }}_entity.page_size = None
  43. _clear_page_context()
  44. {%- endif %}
  45. {{ underscore(table.business_name) }}s = {{ underscore(table.class_name) }}_service.select_{{ underscore(table.class_name) }}_list({{ underscore(table.class_name) }}_entity)
  46. return TableResponse(code=HttpStatus.SUCCESS, msg='查询成功', rows={{ underscore(table.business_name) }}s)
  47. {% if table.pk_column %}
  48. @gen.route('/<int:{{ table.pk_column.java_field }}>', methods=['GET'])
  49. @PathValidator()
  50. @PreAuthorize(HasPerm('{{ table.module_name }}:{{ table.business_name }}:query'))
  51. @JsonSerializer()
  52. def get_{{ underscore(table.business_name) }}({{ underscore(table.pk_column.java_field) }}: int):
  53. """获取{{ table.function_name }}详细信息"""
  54. {{ underscore(table.class_name) }}_entity = {{ underscore(table.class_name) }}_service.select_{{ underscore(table.class_name) }}_by_id({{ underscore(table.pk_column.java_field) }})
  55. return AjaxResponse.from_success(data={{ underscore(table.class_name) }}_entity)
  56. {% endif %}
  57. @gen.route('', methods=['POST'])
  58. @BodyValidator()
  59. @PreAuthorize(HasPerm('{{ table.module_name }}:{{ table.business_name }}:add'))
  60. @Log(title='{{ table.function_name }}管理', business_type=BusinessType.INSERT)
  61. @JsonSerializer()
  62. def add_{{ underscore(table.business_name) }}(dto: {{ class_name_pascal }}):
  63. """新增{{ table.function_name }}"""
  64. {{ underscore(table.class_name) }}_entity = {{ class_name_pascal }}()
  65. # 转换PO到Entity对象
  66. for attr in dto.model_fields.keys():
  67. if hasattr({{ underscore(table.class_name) }}_entity, attr):
  68. setattr({{ underscore(table.class_name) }}_entity, attr, getattr(dto, attr))
  69. result = {{ underscore(table.class_name) }}_service.insert_{{ underscore(table.class_name) }}({{ underscore(table.class_name) }}_entity)
  70. if result > 0:
  71. return AjaxResponse.from_success(msg='新增成功')
  72. return AjaxResponse.from_error(code=HttpStatus.ERROR, msg='新增失败')
  73. {% if table.pk_column %}
  74. @gen.route('', methods=['PUT'])
  75. @BodyValidator()
  76. @PreAuthorize(HasPerm('{{ table.module_name }}:{{ table.business_name }}:edit'))
  77. @Log(title='{{ table.function_name }}管理', business_type=BusinessType.UPDATE)
  78. @JsonSerializer()
  79. def update_{{ underscore(table.business_name) }}(dto: {{ class_name_pascal }}):
  80. """修改{{ table.function_name }}"""
  81. {{ underscore(table.class_name) }}_entity = {{ class_name_pascal }}()
  82. # 转换PO到Entity对象
  83. for attr in dto.model_fields.keys():
  84. if hasattr({{ underscore(table.class_name) }}_entity, attr):
  85. setattr({{ underscore(table.class_name) }}_entity, attr, getattr(dto, attr))
  86. result = {{ underscore(table.class_name) }}_service.update_{{ underscore(table.class_name) }}({{ underscore(table.class_name) }}_entity)
  87. if result > 0:
  88. return AjaxResponse.from_success(msg='修改成功')
  89. return AjaxResponse.from_error(code=HttpStatus.ERROR, msg='修改失败')
  90. {% endif %}
  91. {% if table.pk_column %}
  92. @gen.route('/<ids>', methods=['DELETE'])
  93. @PathValidator()
  94. @PreAuthorize(HasPerm('{{ table.module_name }}:{{ table.business_name }}:remove'))
  95. @Log(title='{{ table.function_name }}管理', business_type=BusinessType.DELETE)
  96. @JsonSerializer()
  97. def delete_{{ underscore(table.business_name) }}(ids: str):
  98. """删除{{ table.function_name }}"""
  99. try:
  100. id_list = [int(id) for id in ids.split(',')]
  101. result = {{ underscore(table.class_name) }}_service.delete_{{ underscore(table.class_name) }}_by_ids(id_list)
  102. if result > 0:
  103. return AjaxResponse.from_success(msg='删除成功')
  104. return AjaxResponse.from_error(code=HttpStatus.ERROR, msg='删除失败')
  105. except Exception as e:
  106. return AjaxResponse.from_error(msg=f'删除失败: {str(e)}')
  107. {% endif %}
  108. @gen.route('/export', methods=['POST'])
  109. @FileDownloadValidator()
  110. @PreAuthorize(HasPerm('{{ table.module_name }}:{{ table.business_name }}:export'))
  111. @Log(title='{{ table.function_name }}管理', business_type=BusinessType.EXPORT)
  112. @BaseSerializer()
  113. def export_{{ underscore(table.business_name) }}(dto: {{ class_name_pascal }}):
  114. """导出{{ table.function_name }}列表"""
  115. {{ underscore(table.class_name) }}_entity = {{ class_name_pascal }}()
  116. # 转换PO到Entity对象
  117. for attr in dto.model_fields.keys():
  118. if hasattr({{ underscore(table.class_name) }}_entity, attr):
  119. setattr({{ underscore(table.class_name) }}_entity, attr, getattr(dto, attr))
  120. _clear_page_context()
  121. {{ underscore(table.class_name) }}_entity.page_num = None
  122. {{ underscore(table.class_name) }}_entity.page_size = None
  123. {{ underscore(table.business_name) }}s = {{ underscore(table.class_name) }}_service.select_{{ underscore(table.class_name) }}_list({{ underscore(table.class_name) }}_entity)
  124. # 使用ExcelUtil导出Excel文件
  125. excel_util = ExcelUtil({{ class_name_pascal }})
  126. return excel_util.export_response({{ underscore(table.business_name) }}s, "{{ table.function_name }}数据")
  127. @gen.route('/importTemplate', methods=['POST'])
  128. @login_required
  129. @BaseSerializer()
  130. def import_template():
  131. """下载{{ table.function_name }}导入模板"""
  132. excel_util = ExcelUtil({{ class_name_pascal }})
  133. return excel_util.import_template_response(sheetname="{{ table.function_name }}数据")
  134. @gen.route('/importData', methods=['POST'])
  135. @FileUploadValidator()
  136. @PreAuthorize(HasPerm('{{ table.module_name }}:{{ table.business_name }}:import'))
  137. @Log(title='{{ table.function_name }}管理', business_type=BusinessType.IMPORT)
  138. @JsonSerializer()
  139. def import_data(
  140. file: List[FileStorage],
  141. update_support: Annotated[bool, BeforeValidator(lambda x: x != "0")]
  142. ):
  143. """导入{{ table.function_name }}数据"""
  144. file = file[0]
  145. excel_util = ExcelUtil({{ class_name_pascal }})
  146. {{ underscore(table.business_name) }}_list = excel_util.import_file(file, sheetname="{{ table.function_name }}数据")
  147. msg = {{ underscore(table.class_name) }}_service.import_{{ underscore(table.class_name) }}({{ underscore(table.business_name) }}_list, update_support)
  148. return AjaxResponse.from_success(msg=msg)