controller.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. # -*- coding: utf-8 -*-
  2. from fastapi import APIRouter, Body, Depends, Path, UploadFile
  3. from fastapi.responses import JSONResponse, StreamingResponse
  4. import urllib.parse
  5. from app.common.response import StreamResponse, SuccessResponse
  6. from app.core.router_class import OperationLogRoute
  7. from app.utils.common_util import bytes2file_response
  8. from app.core.base_params import PaginationQueryParam
  9. from app.core.dependencies import AuthPermission
  10. from app.core.base_schema import BatchSetAvailable
  11. from app.core.logger import log
  12. from app.api.v1.module_system.auth.schema import AuthSchema
  13. from .service import DemoService
  14. from .schema import (
  15. DemoCreateSchema,
  16. DemoUpdateSchema,
  17. DemoQueryParam
  18. )
  19. DemoRouter = APIRouter(route_class=OperationLogRoute, prefix="/demo", tags=["示例模块"])
  20. @DemoRouter.get("/detail/{id}", summary="获取示例详情", description="获取示例详情")
  21. async def get_obj_detail_controller(
  22. id: int = Path(..., description="示例ID"),
  23. auth: AuthSchema = Depends(AuthPermission(["module_gencode:demo:query"]))
  24. ) -> JSONResponse:
  25. """
  26. 获取示例详情
  27. 参数:
  28. - id (int): 示例ID
  29. - auth (AuthSchema): 认证信息模型
  30. 返回:
  31. - JSONResponse: 包含示例详情的JSON响应
  32. """
  33. result_dict = await DemoService.detail_service(id=id, auth=auth)
  34. log.info(f"获取示例详情成功 {id}")
  35. return SuccessResponse(data=result_dict, msg="获取示例详情成功")
  36. @DemoRouter.get("/list", summary="查询示例列表", description="查询示例列表")
  37. async def get_obj_list_controller(
  38. page: PaginationQueryParam = Depends(),
  39. search: DemoQueryParam = Depends(),
  40. auth: AuthSchema = Depends(AuthPermission(["module_gencode:demo:query"]))
  41. ) -> JSONResponse:
  42. """
  43. 查询示例列表
  44. 参数:
  45. - page (PaginationQueryParam): 分页查询参数
  46. - search (DemoQueryParam): 查询参数
  47. - auth (AuthSchema): 认证信息模型
  48. 返回:
  49. - JSONResponse: 包含示例列表分页信息的JSON响应
  50. """
  51. # 使用数据库分页而不是应用层分页
  52. result_dict = await DemoService.page_service(
  53. auth=auth,
  54. page_no=page.page_no,
  55. page_size=page.page_size,
  56. search=search,
  57. order_by=page.order_by
  58. )
  59. log.info("查询示例列表成功")
  60. return SuccessResponse(data=result_dict, msg="查询示例列表成功")
  61. @DemoRouter.post("/create", summary="创建示例", description="创建示例")
  62. async def create_obj_controller(
  63. data: DemoCreateSchema,
  64. auth: AuthSchema = Depends(AuthPermission(["module_gencode:demo:create"]))
  65. ) -> JSONResponse:
  66. """
  67. 创建示例
  68. 参数:
  69. - data (DemoCreateSchema): 示例创建模型
  70. - auth (AuthSchema): 认证信息模型
  71. 返回:
  72. - JSONResponse: 包含创建示例详情的JSON响应
  73. """
  74. result_dict = await DemoService.create_service(auth=auth, data=data)
  75. log.info(f"创建示例成功: {result_dict.get('name')}")
  76. return SuccessResponse(data=result_dict, msg="创建示例成功")
  77. @DemoRouter.put("/update/{id}", summary="修改示例", description="修改示例")
  78. async def update_obj_controller(
  79. data: DemoUpdateSchema,
  80. id: int = Path(..., description="示例ID"),
  81. auth: AuthSchema = Depends(AuthPermission(["module_gencode:demo:update"]))
  82. ) -> JSONResponse:
  83. """
  84. 修改示例
  85. 参数:
  86. - data (DemoUpdateSchema): 示例更新模型
  87. - id (int): 示例ID
  88. - auth (AuthSchema): 认证信息模型
  89. 返回:
  90. - JSONResponse: 包含修改示例详情的JSON响应
  91. """
  92. result_dict = await DemoService.update_service(auth=auth, id=id, data=data)
  93. log.info(f"修改示例成功: {result_dict.get('name')}")
  94. return SuccessResponse(data=result_dict, msg="修改示例成功")
  95. @DemoRouter.delete("/delete", summary="删除示例", description="删除示例")
  96. async def delete_obj_controller(
  97. ids: list[int] = Body(..., description="ID列表"),
  98. auth: AuthSchema = Depends(AuthPermission(["module_gencode:demo:delete"]))
  99. ) -> JSONResponse:
  100. """
  101. 删除示例
  102. 参数:
  103. - ids (list[int]): 示例ID列表
  104. - auth (AuthSchema): 认证信息模型
  105. 返回:
  106. - JSONResponse: 包含删除示例详情的JSON响应
  107. """
  108. await DemoService.delete_service(auth=auth, ids=ids)
  109. log.info(f"删除示例成功: {ids}")
  110. return SuccessResponse(msg="删除示例成功")
  111. @DemoRouter.patch("/available/setting", summary="批量修改示例状态", description="批量修改示例状态")
  112. async def batch_set_available_obj_controller(
  113. data: BatchSetAvailable,
  114. auth: AuthSchema = Depends(AuthPermission(["module_gencode:demo:patch"]))
  115. ) -> JSONResponse:
  116. """
  117. 批量修改示例状态
  118. 参数:
  119. - data (BatchSetAvailable): 批量修改示例状态模型
  120. - auth (AuthSchema): 认证信息模型
  121. 返回:
  122. - JSONResponse: 包含批量修改示例状态详情的JSON响应
  123. """
  124. await DemoService.set_available_service(auth=auth, data=data)
  125. log.info(f"批量修改示例状态成功: {data.ids}")
  126. return SuccessResponse(msg="批量修改示例状态成功")
  127. @DemoRouter.post('/export', summary="导出示例", description="导出示例")
  128. async def export_obj_list_controller(
  129. search: DemoQueryParam = Depends(),
  130. auth: AuthSchema = Depends(AuthPermission(["module_gencode:demo:export"]))
  131. ) -> StreamingResponse:
  132. """
  133. 导出示例
  134. 参数:
  135. - search (DemoQueryParam): 查询参数
  136. - auth (AuthSchema): 认证信息模型
  137. 返回:
  138. - StreamingResponse: 包含示例列表的Excel文件流响应
  139. """
  140. result_dict_list = await DemoService.list_service(search=search, auth=auth)
  141. export_result = await DemoService.batch_export_service(obj_list=result_dict_list)
  142. log.info('导出示例成功')
  143. return StreamResponse(
  144. data=bytes2file_response(export_result),
  145. media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  146. headers={
  147. 'Content-Disposition': 'attachment; filename=demo.xlsx'
  148. }
  149. )
  150. @DemoRouter.post('/import', summary="导入示例", description="导入示例")
  151. async def import_obj_list_controller(
  152. file: UploadFile,
  153. auth: AuthSchema = Depends(AuthPermission(["module_gencode:demo:import"]))
  154. ) -> JSONResponse:
  155. """
  156. 导入示例
  157. 参数:
  158. - file (UploadFile): 导入的Excel文件
  159. - auth (AuthSchema): 认证信息模型
  160. 返回:
  161. - JSONResponse: 包含导入示例详情的JSON响应
  162. """
  163. batch_import_result = await DemoService.batch_import_service(file=file, auth=auth, update_support=True)
  164. log.info(f"导入示例成功: {batch_import_result}")
  165. return SuccessResponse(data=batch_import_result, msg="导入示例成功")
  166. @DemoRouter.post('/download/template', summary="获取示例导入模板", description="获取示例导入模板", dependencies=[Depends(AuthPermission(["module_gencode:demo:download"]))])
  167. async def export_obj_template_controller() -> StreamingResponse:
  168. """
  169. 获取示例导入模板
  170. 返回:
  171. - StreamingResponse: 包含示例导入模板的Excel文件流响应
  172. """
  173. import_template_result = await DemoService.import_template_download_service()
  174. log.info('获取示例导入模板成功')
  175. return StreamResponse(
  176. data=bytes2file_response(import_template_result),
  177. media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  178. headers={
  179. 'Content-Disposition': f'attachment; filename={urllib.parse.quote("示例导入模板.xlsx")}',
  180. 'Access-Control-Expose-Headers': 'Content-Disposition'
  181. }
  182. )