gen.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. from flask import request, send_file
  2. from zipfile import ZipFile
  3. from io import BytesIO
  4. from ruoyi_common.base.model import AjaxResponse, TableResponse
  5. from ruoyi_common.constant import HttpStatus
  6. from ruoyi_common.descriptor.serializer import JsonSerializer
  7. from ruoyi_common.descriptor.validator import QueryValidator, BodyValidator, PathValidator
  8. from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize
  9. from ruoyi_generator.controller import gen
  10. from ruoyi_generator.domain.entity import GenTable
  11. from ruoyi_generator.domain.po import GenTablePO, GenTableColumnPO
  12. from ruoyi_generator.service import GenTableService
  13. from ruoyi_generator.service.column_service import GenTableColumnService
  14. gen_table_service = GenTableService()
  15. gen_table_column_service = GenTableColumnService()
  16. @gen.route('/list', methods=["GET"])
  17. @QueryValidator(is_page=True)
  18. @PreAuthorize(HasPerm('tool:gen:list'))
  19. @JsonSerializer()
  20. def gen_list(dto: GenTablePO):
  21. """查询代码生成列表"""
  22. gen_table = GenTable()
  23. # 转换PO到Entity对象,只复制存在的字段
  24. for attr in dto.model_fields.keys():
  25. if hasattr(gen_table, attr):
  26. setattr(gen_table, attr, getattr(dto, attr))
  27. tables, total = gen_table_service.select_gen_table_list(gen_table)
  28. return TableResponse(code=HttpStatus.SUCCESS, msg='查询成功', rows=tables, total=total)
  29. @gen.route('/db/list', methods=["GET"])
  30. @QueryValidator(is_page=True)
  31. @PreAuthorize(HasPerm('tool:gen:list'))
  32. @JsonSerializer()
  33. def db_list(dto: GenTablePO):
  34. """查询数据库表列表"""
  35. gen_table = GenTable()
  36. # 转换PO到Entity对象,只复制存在的字段
  37. for attr in dto.model_fields.keys():
  38. if hasattr(gen_table, attr):
  39. setattr(gen_table, attr, getattr(dto, attr))
  40. tables, total = gen_table_service.select_db_table_list(gen_table)
  41. return TableResponse(code=HttpStatus.SUCCESS, msg='查询成功', rows=tables, total=total)
  42. @gen.route('/<int:tableId>', methods=["GET"])
  43. @PathValidator()
  44. @PreAuthorize(HasPerm('tool:gen:query'))
  45. @JsonSerializer()
  46. def get_gen_table(tableId: int):
  47. """查询代码生成详细信息"""
  48. table = gen_table_service.select_gen_table_by_id(tableId)
  49. # 如果表存在但没有字段信息,则尝试从数据库同步
  50. columns, total = gen_table_column_service.select_gen_table_column_list_by_table_id(tableId)
  51. if not columns:
  52. # 尝试同步数据库结构
  53. gen_table_service.synch_db(table.table_name)
  54. # 再次查询字段信息
  55. columns, total = gen_table_column_service.select_gen_table_column_list_by_table_id(tableId)
  56. # 获取所有表名列表
  57. all_tables_result = gen_table_service.select_gen_table_list(GenTable())
  58. all_tables = []
  59. if all_tables_result:
  60. # 确保返回的是完整的表对象而不是仅表名
  61. all_tables = all_tables_result[0]
  62. return AjaxResponse.from_success(data={
  63. 'info': table,
  64. 'rows': columns,
  65. 'tables': all_tables
  66. })
  67. @gen.route('/', methods=['POST'])
  68. @BodyValidator()
  69. @PreAuthorize(HasPerm('tool:gen:add'))
  70. @JsonSerializer()
  71. def add_gen_table(dto: GenTablePO):
  72. """新增代码生成表"""
  73. gen_table = GenTable()
  74. # 转换PO到Entity对象,只复制存在的字段
  75. for attr in dto.model_fields.keys():
  76. if hasattr(gen_table, attr):
  77. setattr(gen_table, attr, getattr(dto, attr))
  78. # 实现新增逻辑
  79. table_id = gen_table_service.insert_gen_table(gen_table)
  80. if table_id > 0:
  81. return AjaxResponse.from_success(msg='新增成功')
  82. else:
  83. return AjaxResponse.from_error(msg='新增失败')
  84. @gen.route('/importTable', methods=['POST'])
  85. @PreAuthorize(HasPerm('tool:gen:import'))
  86. @JsonSerializer()
  87. def import_table():
  88. """导入表结构"""
  89. tables = request.args.get('tables')
  90. if not tables:
  91. return AjaxResponse.from_error(msg='参数错误')
  92. table_list = [table.strip() for table in tables.split(',') if table.strip()]
  93. if not table_list:
  94. return AjaxResponse.from_error(msg='参数错误')
  95. gen_table_service.import_gen_table(table_list)
  96. return AjaxResponse.from_success(msg='导入成功')
  97. @gen.route('/<int:tableId>', methods=['PUT'])
  98. @BodyValidator()
  99. @PreAuthorize(HasPerm('tool:gen:edit'))
  100. @JsonSerializer()
  101. def update_gen_table(dto: GenTablePO):
  102. print(dto)
  103. """修改保存代码生成信息"""
  104. gen_table = GenTable()
  105. # 设置表ID
  106. gen_table.table_id = dto.table_id
  107. # 从请求数据中设置属性
  108. for attr in dto.model_fields.keys():
  109. if hasattr(gen_table, attr):
  110. setattr(gen_table, attr, getattr(dto, attr))
  111. # 特别处理columns字段
  112. if hasattr(dto, 'columns') and dto.columns is not None:
  113. print(dto.columns)
  114. # 前端传过来的已经是正确的字符串格式,直接使用
  115. gen_table.columns = dto.columns
  116. else:
  117. gen_table.columns = dto.columns
  118. gen_table_service.update_gen_table(gen_table)
  119. return AjaxResponse.from_success(msg='修改成功')
  120. @gen.route('/<tableIds>', methods=['DELETE'])
  121. @PathValidator()
  122. @PreAuthorize(HasPerm('tool:gen:remove'))
  123. @JsonSerializer()
  124. def delete_gen_table(tableIds: str):
  125. """删除代码生成表"""
  126. try:
  127. table_ids = [int(id) for id in tableIds.split(',')]
  128. gen_table_service.delete_gen_table_by_ids(table_ids)
  129. return AjaxResponse.from_success(msg='删除成功')
  130. except Exception as e:
  131. return AjaxResponse.from_error(msg=f'删除失败: {str(e)}')
  132. @gen.route('/preview/<int:tableId>', methods=["GET"])
  133. @PathValidator()
  134. @PreAuthorize(HasPerm('tool:gen:preview'))
  135. @JsonSerializer()
  136. def preview(tableId: int):
  137. """预览代码"""
  138. try:
  139. data = gen_table_service.preview_code(tableId)
  140. return AjaxResponse.from_success(data=data)
  141. except Exception as e:
  142. return AjaxResponse.from_error(msg=f'预览失败: {str(e)}')
  143. @gen.route('/download/<table_name>', methods=["GET"])
  144. @PathValidator()
  145. @PreAuthorize(HasPerm('tool:gen:code'))
  146. @JsonSerializer()
  147. def download(table_name: str):
  148. """生成代码(下载方式)"""
  149. try:
  150. data = gen_table_service.generator_code(table_name)
  151. return send_file(
  152. BytesIO(data), # 将bytes包装成BytesIO对象
  153. mimetype='application/zip',
  154. as_attachment=True,
  155. download_name=f'{table_name}.zip'
  156. )
  157. except Exception as e:
  158. return AjaxResponse.from_error(msg=f'生成失败: {str(e)}')
  159. @gen.route('/genCode/<table_name>', methods=["GET"])
  160. @PathValidator()
  161. @PreAuthorize(HasPerm('tool:gen:code'))
  162. @JsonSerializer()
  163. def gen_code(table_name: str):
  164. """生成代码(自定义路径)"""
  165. try:
  166. data = gen_table_service.generator_code(table_name)
  167. return send_file(
  168. BytesIO(data), # 将bytes包装成BytesIO对象
  169. mimetype='application/zip',
  170. as_attachment=True,
  171. download_name=f'{table_name}.zip'
  172. )
  173. except Exception as e:
  174. return AjaxResponse.from_error(msg=f'生成失败: {str(e)}')
  175. @gen.route('/batchGenCode', methods=["GET"])
  176. @PreAuthorize(HasPerm('tool:gen:code'))
  177. @JsonSerializer()
  178. def batch_gen_code():
  179. """批量生成代码"""
  180. try:
  181. tables = request.args.get('tables')
  182. if not tables:
  183. return AjaxResponse.from_error(msg='参数错误')
  184. table_list = [table.strip() for table in tables.split(',') if table.strip()]
  185. if not table_list:
  186. return AjaxResponse.from_error(msg='参数错误')
  187. # 生成代码
  188. data = gen_table_service.batch_generator_code(table_list)
  189. return send_file(
  190. BytesIO(data), # 将bytes包装成BytesIO对象
  191. mimetype='application/zip',
  192. as_attachment=True,
  193. download_name='code.zip'
  194. )
  195. except Exception as e:
  196. return AjaxResponse.from_error(msg=f'批量生成失败: {str(e)}')
  197. @gen.route('/synchDb/<table_name>', methods=["GET"])
  198. @PreAuthorize(HasPerm('tool:gen:edit'))
  199. @JsonSerializer()
  200. def synch_db(table_name):
  201. """同步数据库"""
  202. # 检查表名是否有效
  203. if not table_name or table_name.lower() == 'null':
  204. return AjaxResponse.from_error(msg='表名不能为空')
  205. try:
  206. result = gen_table_service.synch_db(table_name)
  207. if result:
  208. return AjaxResponse.from_success(msg='同步成功')
  209. else:
  210. return AjaxResponse.from_error(msg='同步失败')
  211. except Exception as e:
  212. return AjaxResponse.from_error(msg=f'同步失败: {str(e)}')
  213. @gen.route('/column/list', methods=["GET"])
  214. @QueryValidator(is_page=True)
  215. @PreAuthorize(HasPerm('tool:gen:list'))
  216. @JsonSerializer()
  217. def column_list(dto: GenTableColumnPO):
  218. """查询数据库表字段列表"""
  219. table_id = request.args.get('tableId')
  220. if table_id:
  221. columns, total = gen_table_column_service.select_gen_table_column_list_by_table_id(int(table_id))
  222. else:
  223. columns, total = [], 0
  224. return TableResponse(code=HttpStatus.SUCCESS, msg='查询成功', rows=columns, total=total)
  225. @gen.route('/export', methods=["GET"])
  226. @PreAuthorize(HasPerm('tool:gen:export'))
  227. @JsonSerializer()
  228. def export():
  229. """导出代码生成表数据"""
  230. try:
  231. tables, total = gen_table_service.select_gen_table_list(GenTable())
  232. return AjaxResponse.from_success(data=tables, msg='导出成功')
  233. except Exception as e:
  234. return AjaxResponse.from_error(msg=f'导出失败: {str(e)}')
  235. @gen.route('/tableInfo/<table_name>', methods=["GET"])
  236. @PathValidator()
  237. @PreAuthorize(HasPerm('tool:gen:list'))
  238. @JsonSerializer()
  239. def get_table_info(table_name: str):
  240. """获取表信息"""
  241. try:
  242. if not gen_table_service.validate_table_name(table_name):
  243. return AjaxResponse.from_error(msg='表名格式不正确')
  244. table_info = gen_table_service.get_table_info(table_name)
  245. return AjaxResponse.from_success(data=table_info)
  246. except Exception as e:
  247. return AjaxResponse.from_error(msg=f'获取表信息失败: {str(e)}')