| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- from flask import request, send_file
- from zipfile import ZipFile
- from io import BytesIO
- from ruoyi_common.base.model import AjaxResponse, TableResponse
- from ruoyi_common.constant import HttpStatus
- from ruoyi_common.descriptor.serializer import JsonSerializer
- from ruoyi_common.descriptor.validator import QueryValidator, BodyValidator, PathValidator
- from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize
- from ruoyi_generator.controller import gen
- from ruoyi_generator.domain.entity import GenTable
- from ruoyi_generator.domain.po import GenTablePO, GenTableColumnPO
- from ruoyi_generator.service import GenTableService
- from ruoyi_generator.service.column_service import GenTableColumnService
- gen_table_service = GenTableService()
- gen_table_column_service = GenTableColumnService()
- @gen.route('/list', methods=["GET"])
- @QueryValidator(is_page=True)
- @PreAuthorize(HasPerm('tool:gen:list'))
- @JsonSerializer()
- def gen_list(dto: GenTablePO):
- """查询代码生成列表"""
- gen_table = GenTable()
- # 转换PO到Entity对象,只复制存在的字段
- for attr in dto.model_fields.keys():
- if hasattr(gen_table, attr):
- setattr(gen_table, attr, getattr(dto, attr))
- tables, total = gen_table_service.select_gen_table_list(gen_table)
- return TableResponse(code=HttpStatus.SUCCESS, msg='查询成功', rows=tables, total=total)
- @gen.route('/db/list', methods=["GET"])
- @QueryValidator(is_page=True)
- @PreAuthorize(HasPerm('tool:gen:list'))
- @JsonSerializer()
- def db_list(dto: GenTablePO):
- """查询数据库表列表"""
- gen_table = GenTable()
- # 转换PO到Entity对象,只复制存在的字段
- for attr in dto.model_fields.keys():
- if hasattr(gen_table, attr):
- setattr(gen_table, attr, getattr(dto, attr))
- tables, total = gen_table_service.select_db_table_list(gen_table)
- return TableResponse(code=HttpStatus.SUCCESS, msg='查询成功', rows=tables, total=total)
- @gen.route('/<int:tableId>', methods=["GET"])
- @PathValidator()
- @PreAuthorize(HasPerm('tool:gen:query'))
- @JsonSerializer()
- def get_gen_table(tableId: int):
- """查询代码生成详细信息"""
- table = gen_table_service.select_gen_table_by_id(tableId)
- # 如果表存在但没有字段信息,则尝试从数据库同步
- columns, total = gen_table_column_service.select_gen_table_column_list_by_table_id(tableId)
- if not columns:
- # 尝试同步数据库结构
- gen_table_service.synch_db(table.table_name)
- # 再次查询字段信息
- columns, total = gen_table_column_service.select_gen_table_column_list_by_table_id(tableId)
- # 获取所有表名列表
- all_tables_result = gen_table_service.select_gen_table_list(GenTable())
- all_tables = []
- if all_tables_result:
- # 确保返回的是完整的表对象而不是仅表名
- all_tables = all_tables_result[0]
- return AjaxResponse.from_success(data={
- 'info': table,
- 'rows': columns,
- 'tables': all_tables
- })
- @gen.route('/', methods=['POST'])
- @BodyValidator()
- @PreAuthorize(HasPerm('tool:gen:add'))
- @JsonSerializer()
- def add_gen_table(dto: GenTablePO):
- """新增代码生成表"""
- gen_table = GenTable()
- # 转换PO到Entity对象,只复制存在的字段
- for attr in dto.model_fields.keys():
- if hasattr(gen_table, attr):
- setattr(gen_table, attr, getattr(dto, attr))
- # 实现新增逻辑
- table_id = gen_table_service.insert_gen_table(gen_table)
- if table_id > 0:
- return AjaxResponse.from_success(msg='新增成功')
- else:
- return AjaxResponse.from_error(msg='新增失败')
- @gen.route('/importTable', methods=['POST'])
- @PreAuthorize(HasPerm('tool:gen:import'))
- @JsonSerializer()
- def import_table():
- """导入表结构"""
- tables = request.args.get('tables')
- if not tables:
- return AjaxResponse.from_error(msg='参数错误')
- table_list = [table.strip() for table in tables.split(',') if table.strip()]
- if not table_list:
- return AjaxResponse.from_error(msg='参数错误')
- gen_table_service.import_gen_table(table_list)
- return AjaxResponse.from_success(msg='导入成功')
- @gen.route('/<int:tableId>', methods=['PUT'])
- @BodyValidator()
- @PreAuthorize(HasPerm('tool:gen:edit'))
- @JsonSerializer()
- def update_gen_table(dto: GenTablePO):
- print(dto)
- """修改保存代码生成信息"""
- gen_table = GenTable()
- # 设置表ID
- gen_table.table_id = dto.table_id
- # 从请求数据中设置属性
- for attr in dto.model_fields.keys():
- if hasattr(gen_table, attr):
- setattr(gen_table, attr, getattr(dto, attr))
-
- # 处理 options 字段和 parentMenuId
- import json
- options_dict = {}
-
- # 如果 options 字段存在,先解析它
- if hasattr(dto, 'options') and dto.options:
- try:
- if isinstance(dto.options, str):
- options_dict = json.loads(dto.options)
- else:
- options_dict = dto.options.copy() if hasattr(dto.options, 'copy') else dto.options
- except Exception as e:
- print(f"解析 options 字段出错: {e}")
- options_dict = {}
-
- # 检查 params 中是否有 parentMenuId(前端可能通过 params 传递)
- if hasattr(dto, 'params') and dto.params:
- if isinstance(dto.params, dict) and 'parentMenuId' in dto.params:
- options_dict['parentMenuId'] = dto.params.get('parentMenuId')
-
- # 如果 options_dict 中有 parentMenuId,更新 options 字段
- if 'parentMenuId' in options_dict:
- gen_table.options = json.dumps(options_dict, ensure_ascii=False)
- gen_table.parent_menu_id = options_dict.get('parentMenuId')
- print(f"设置 parentMenuId: {options_dict.get('parentMenuId')}, options: {gen_table.options}")
- elif options_dict:
- # 即使没有 parentMenuId,也要保存其他 options
- gen_table.options = json.dumps(options_dict, ensure_ascii=False)
- # 特别处理columns字段
- if hasattr(dto, 'columns') and dto.columns is not None:
- print(dto.columns)
- # 前端传过来的已经是正确的字符串格式,直接使用
- gen_table.columns = dto.columns
- else:
- gen_table.columns = dto.columns
- gen_table_service.update_gen_table(gen_table)
- return AjaxResponse.from_success(msg='修改成功')
- @gen.route('/<tableIds>', methods=['DELETE'])
- @PathValidator()
- @PreAuthorize(HasPerm('tool:gen:remove'))
- @JsonSerializer()
- def delete_gen_table(tableIds: str):
- """删除代码生成表"""
- try:
- table_ids = [int(id) for id in tableIds.split(',')]
- gen_table_service.delete_gen_table_by_ids(table_ids)
- return AjaxResponse.from_success(msg='删除成功')
- except Exception as e:
- return AjaxResponse.from_error(msg=f'删除失败: {str(e)}')
- @gen.route('/preview/<int:tableId>', methods=["GET"])
- @PathValidator()
- @PreAuthorize(HasPerm('tool:gen:preview'))
- @JsonSerializer()
- def preview(tableId: int):
- """预览代码"""
- try:
- data = gen_table_service.preview_code(tableId)
- return AjaxResponse.from_success(data=data)
- except Exception as e:
- return AjaxResponse.from_error(msg=f'预览失败: {str(e)}')
- @gen.route('/download/<table_name>', methods=["GET"])
- @PathValidator()
- @PreAuthorize(HasPerm('tool:gen:code'))
- @JsonSerializer()
- def download(table_name: str):
- """生成代码(下载方式)"""
- try:
- data = gen_table_service.generator_code(table_name)
- return send_file(
- BytesIO(data), # 将bytes包装成BytesIO对象
- mimetype='application/zip',
- as_attachment=True,
- download_name=f'{table_name}.zip'
- )
- except Exception as e:
- return AjaxResponse.from_error(msg=f'生成失败: {str(e)}')
- @gen.route('/genCode/<table_name>', methods=["GET"])
- @PathValidator()
- @PreAuthorize(HasPerm('tool:gen:code'))
- @JsonSerializer()
- def gen_code(table_name: str):
- """生成代码(自定义路径)"""
- try:
- data = gen_table_service.generator_code(table_name)
- return send_file(
- BytesIO(data), # 将bytes包装成BytesIO对象
- mimetype='application/zip',
- as_attachment=True,
- download_name=f'{table_name}.zip'
- )
- except Exception as e:
- return AjaxResponse.from_error(msg=f'生成失败: {str(e)}')
- @gen.route('/batchGenCode', methods=["GET"])
- @PreAuthorize(HasPerm('tool:gen:code'))
- @JsonSerializer()
- def batch_gen_code():
- """批量生成代码"""
- try:
- tables = request.args.get('tables')
- if not tables:
- return AjaxResponse.from_error(msg='参数错误')
- table_list = [table.strip() for table in tables.split(',') if table.strip()]
- if not table_list:
- return AjaxResponse.from_error(msg='参数错误')
- # 生成代码
- data = gen_table_service.batch_generator_code(table_list)
- return send_file(
- BytesIO(data), # 将bytes包装成BytesIO对象
- mimetype='application/zip',
- as_attachment=True,
- download_name='code.zip'
- )
- except Exception as e:
- return AjaxResponse.from_error(msg=f'批量生成失败: {str(e)}')
- @gen.route('/synchDb/<table_name>', methods=["GET"])
- @PreAuthorize(HasPerm('tool:gen:edit'))
- @JsonSerializer()
- def synch_db(table_name):
- """同步数据库"""
- # 检查表名是否有效
- if not table_name or table_name.lower() == 'null':
- return AjaxResponse.from_error(msg='表名不能为空')
- try:
- result = gen_table_service.synch_db(table_name)
- if result:
- return AjaxResponse.from_success(msg='同步成功')
- else:
- return AjaxResponse.from_error(msg='同步失败')
- except Exception as e:
- return AjaxResponse.from_error(msg=f'同步失败: {str(e)}')
- @gen.route('/column/list', methods=["GET"])
- @QueryValidator(is_page=True)
- @PreAuthorize(HasPerm('tool:gen:list'))
- @JsonSerializer()
- def column_list(dto: GenTableColumnPO):
- """查询数据库表字段列表"""
- table_id = request.args.get('tableId')
- if table_id:
- columns, total = gen_table_column_service.select_gen_table_column_list_by_table_id(int(table_id))
- else:
- columns, total = [], 0
- return TableResponse(code=HttpStatus.SUCCESS, msg='查询成功', rows=columns, total=total)
- @gen.route('/export', methods=["GET"])
- @PreAuthorize(HasPerm('tool:gen:export'))
- @JsonSerializer()
- def export():
- """导出代码生成表数据"""
- try:
- tables, total = gen_table_service.select_gen_table_list(GenTable())
- return AjaxResponse.from_success(data=tables, msg='导出成功')
- except Exception as e:
- return AjaxResponse.from_error(msg=f'导出失败: {str(e)}')
- @gen.route('/tableInfo/<table_name>', methods=["GET"])
- @PathValidator()
- @PreAuthorize(HasPerm('tool:gen:list'))
- @JsonSerializer()
- def get_table_info(table_name: str):
- """获取表信息"""
- try:
- if not gen_table_service.validate_table_name(table_name):
- return AjaxResponse.from_error(msg='表名格式不正确')
- table_info = gen_table_service.get_table_info(table_name)
- return AjaxResponse.from_success(data=table_info)
- except Exception as e:
- return AjaxResponse.from_error(msg=f'获取表信息失败: {str(e)}')
|