diff --git a/ruoyi-fastapi-backend/config/constant.py b/ruoyi-fastapi-backend/config/constant.py index c9e0ed7..1b124a0 100644 --- a/ruoyi-fastapi-backend/config/constant.py +++ b/ruoyi-fastapi-backend/config/constant.py @@ -1,3 +1,6 @@ +from config.env import DataBaseConfig + + class CommonConstant: """ 常用常量 @@ -155,42 +158,87 @@ class MenuConstant: class GenConstant: """ 代码生成常量 + + TPL_CRUD: 单表(增删改查 + TPL_TREE: 树表(增删改查) + TPL_SUB: 主子表(增删改查) + TREE_CODE: 树编码字段 + TREE_PARENT_CODE: 树父编码字段 + TREE_NAME: 树名称字段 + PARENT_MENU_ID: 上级菜单ID字段 + PARENT_MENU_NAME: 上级菜单名称字段 + COLUMNTYPE_STR: 数据库字符串类型 + COLUMNTYPE_TEXT: 数据库文本类型 + COLUMNTYPE_TIME: 数据库时间类型 + COLUMNTYPE_GEOMETRY: 数据库字空间类型 + COLUMNTYPE_NUMBER: 数据库数字类型 + COLUMNNAME_NOT_EDIT: 页面不需要编辑字段 + COLUMNNAME_NOT_LIST: 页面不需要显示的列表字段 + COLUMNNAME_NOT_QUERY: 页面不需要查询字段 + BASE_ENTITY: Entity基类字段 + TREE_ENTITY: Tree基类字段 + HTML_INPUT: 文本框 + HTML_TEXTAREA: 文本域 + HTML_SELECT: 下拉框 + HTML_RADIO: 单选框 + HTML_CHECKBOX: 复选框 + HTML_DATETIME: 日期控件 + HTML_IMAGE_UPLOAD: 图片上传控件 + HTML_FILE_UPLOAD: 文件上传控件 + HTML_EDITOR: 富文本控件 + TYPE_DECIMAL: 高精度计算类型 + TYPE_DATE: 时间类型 + QUERY_LIKE: 模糊查询 + QUERY_EQ: 相等查询 + REQUIRE: 需要 + DB_TO_SQLALCHEMY_TYPE_MAPPING: 数据库类型与sqlalchemy类型映射 + DB_TO_PYTHON_TYPE_MAPPING: 数据库类型与python类型映射 """ - """单表(增删改查)""" TPL_CRUD = 'crud' - - """树表(增删改查)""" TPL_TREE = 'tree' - - """主子表(增删改查)""" TPL_SUB = 'sub' - - """树编码字段""" TREE_CODE = 'treeCode' - - """树父编码字段""" TREE_PARENT_CODE = 'treeParentCode' - - """树名称字段""" TREE_NAME = 'treeName' - - """上级菜单ID字段""" PARENT_MENU_ID = 'parentMenuId' - - """上级菜单名称字段""" PARENT_MENU_NAME = 'parentMenuName' - - """数据库字符串类型""" - COLUMNTYPE_STR = ['char', 'varchar', 'nvarchar', 'varchar2'] - - """数据库文本类型""" - COLUMNTYPE_TEXT = ['tinytext', 'text', 'mediumtext', 'longtext'] - - """数据库时间类型""" - COLUMNTYPE_TIME = ['datetime', 'time', 'date', 'timestamp'] - - """数据库数字类型""" + COLUMNTYPE_STR = ( + ['character varying', 'varchar', 'character', 'char'] + if DataBaseConfig.db_type == 'postgresql' + else ['char', 'varchar', 'nvarchar', 'varchar2'] + ) + COLUMNTYPE_TEXT = ( + ['text', 'citext'] if DataBaseConfig.db_type == 'postgresql' else ['tinytext', 'text', 'mediumtext', 'longtext'] + ) + COLUMNTYPE_TIME = ( + [ + 'date', + 'time', + 'time with time zone', + 'time without time zone', + 'timestamp', + 'timestamp with time zone', + 'timestamp without time zone', + 'interval', + ] + if DataBaseConfig.db_type == 'postgresql' + else ['datetime', 'time', 'date', 'timestamp'] + ) + COLUMNTYPE_GEOMETRY = ( + ['point', 'line', 'lseg', 'box', 'path', 'polygon', 'circle'] + if DataBaseConfig.db_type == 'postgresql' + else [ + 'geometry', + 'point', + 'linestring', + 'polygon', + 'multipoint', + 'multilinestring', + 'multipolygon', + 'geometrycollection', + ] + ) COLUMNTYPE_NUMBER = [ 'tinyint', 'smallint', @@ -204,154 +252,230 @@ class GenConstant: 'double', 'decimal', ] - - """页面不需要编辑字段""" COLUMNNAME_NOT_EDIT = ['id', 'create_by', 'create_time', 'del_flag'] - - """页面不需要显示的列表字段""" COLUMNNAME_NOT_LIST = ['id', 'create_by', 'create_time', 'del_flag', 'update_by', 'update_time'] - - """页面不需要查询字段""" COLUMNNAME_NOT_QUERY = ['id', 'create_by', 'create_time', 'del_flag', 'update_by', 'update_time', 'remark'] - - """Entity基类字段""" BASE_ENTITY = ['createBy', 'createTime', 'updateBy', 'updateTime', 'remark'] - - """Tree基类字段""" TREE_ENTITY = ['parentName', 'parentId', 'orderNum', 'ancestors', 'children'] - - """文本框""" HTML_INPUT = 'input' - - """文本域""" HTML_TEXTAREA = 'textarea' - - """下拉框""" HTML_SELECT = 'select' - - """单选框""" HTML_RADIO = 'radio' - - """复选框""" HTML_CHECKBOX = 'checkbox' - - """日期控件""" HTML_DATETIME = 'datetime' - - """图片上传控件""" HTML_IMAGE_UPLOAD = 'imageUpload' - - """文件上传控件""" HTML_FILE_UPLOAD = 'fileUpload' - - """富文本控件""" HTML_EDITOR = 'editor' - - """高精度计算类型""" TYPE_DECIMAL = 'Decimal' - - """时间类型""" TYPE_DATE = ['date', 'time', 'datetime'] - - """模糊查询""" QUERY_LIKE = 'LIKE' - - """相等查询""" QUERY_EQ = 'EQ' - - """需要""" REQUIRE = '1' - - MYSQL_TO_SQLALCHEMY_TYPE_MAPPING = { - # 数值类型 - 'TINYINT': 'SmallInteger', - 'SMALLINT': 'SmallInteger', - 'MEDIUMINT': 'Integer', - 'INT': 'Integer', - 'INTEGER': 'Integer', - 'BIGINT': 'BigInteger', - 'FLOAT': 'Float', - 'DOUBLE': 'Float', - 'DECIMAL': 'DECIMAL', - 'BIT': 'Integer', - # 日期和时间类型 - 'DATE': 'Date', - 'TIME': 'Time', - 'DATETIME': 'DateTime', - 'TIMESTAMP': 'TIMESTAMP', - 'YEAR': 'Integer', - # 字符串类型 - 'CHAR': 'CHAR', - 'VARCHAR': 'String', - 'TINYTEXT': 'Text', - 'TEXT': 'Text', - 'MEDIUMTEXT': 'Text', - 'LONGTEXT': 'Text', - 'BINARY': 'BINARY', - 'VARBINARY': 'VARBINARY', - 'TINYBLOB': 'LargeBinary', - 'BLOB': 'LargeBinary', - 'MEDIUMBLOB': 'LargeBinary', - 'LONGBLOB': 'LargeBinary', - # 枚举和集合类型 - 'ENUM': 'Enum', - 'SET': 'String', - # JSON 类型 - 'JSON': 'JSON', - # 空间数据类型(需要扩展支持,如 GeoAlchemy2) - 'GEOMETRY': 'geoalchemy2.Geometry', # 需要安装 geoalchemy2 - 'POINT': 'geoalchemy2.Geometry', - 'LINESTRING': 'geoalchemy2.Geometry', - 'POLYGON': 'geoalchemy2.Geometry', - 'MULTIPOINT': 'geoalchemy2.Geometry', - 'MULTILINESTRING': 'geoalchemy2.Geometry', - 'MULTIPOLYGON': 'geoalchemy2.Geometry', - 'GEOMETRYCOLLECTION': 'geoalchemy2.Geometry', - } - - MYSQL_TO_PYTHON_TYPE_MAPPING = { - # 数值类型 - 'TINYINT': 'int', - 'SMALLINT': 'int', - 'MEDIUMINT': 'int', - 'INT': 'int', - 'INTEGER': 'int', - 'BIGINT': 'int', - 'FLOAT': 'float', - 'DOUBLE': 'float', - 'DECIMAL': 'Decimal', - 'BIT': 'int', - # 日期和时间类型 - 'DATE': 'date', - 'TIME': 'time', - 'DATETIME': 'datetime', - 'TIMESTAMP': 'datetime', - 'YEAR': 'int', - # 字符串类型 - 'CHAR': 'str', - 'VARCHAR': 'str', - 'TINYTEXT': 'str', - 'TEXT': 'str', - 'MEDIUMTEXT': 'str', - 'LONGTEXT': 'str', - 'BINARY': 'bytes', - 'VARBINARY': 'bytes', - 'TINYBLOB': 'bytes', - 'BLOB': 'bytes', - 'MEDIUMBLOB': 'bytes', - 'LONGBLOB': 'bytes', - # 枚举和集合类型 - 'ENUM': 'str', - 'SET': 'str', - # JSON 类型 - 'JSON': 'dict', - # 空间数据类型(通常需要特殊处理) - 'GEOMETRY': 'bytes', - 'POINT': 'bytes', - 'LINESTRING': 'bytes', - 'POLYGON': 'bytes', - 'MULTIPOINT': 'bytes', - 'MULTILINESTRING': 'bytes', - 'MULTIPOLYGON': 'bytes', - 'GEOMETRYCOLLECTION': 'bytes', - } + DB_TO_SQLALCHEMY_TYPE_MAPPING = ( + { + 'boolean': 'Boolean', + 'smallint': 'SmallInteger', + 'integer': 'Integer', + 'bigint': 'BigInteger', + 'real': 'Float', + 'double precision': 'Float', + 'numeric': 'Numeric', + 'character varying': 'String', + 'character': 'String', + 'text': 'Text', + 'bytea': 'LargeBinary', + 'date': 'Date', + 'time': 'Time', + 'time with time zone': 'Time', + 'time without time zone': 'Time', + 'timestamp': 'DateTime', + 'timestamp with time zone': 'DateTime', + 'timestamp without time zone': 'DateTime', + 'interval': 'Interval', + 'json': 'JSON', + 'jsonb': 'JSONB', + 'uuid': 'Uuid', + 'inet': 'INET', + 'cidr': 'CIDR', + 'macaddr': 'MACADDR', + 'point': 'Geometry', + 'line': 'Geometry', + 'lseg': 'Geometry', + 'box': 'Geometry', + 'path': 'Geometry', + 'polygon': 'Geometry', + 'circle': 'Geometry', + 'bit': 'Bit', + 'bit varying': 'Bit', + 'tsvector': 'TSVECTOR', + 'tsquery': 'TSQUERY', + 'xml': 'String', + 'array': 'ARRAY', + 'composite': 'JSON', + 'enum': 'Enum', + 'range': 'Range', + 'money': 'Numeric', + 'pg_lsn': 'BigInteger', + 'txid_snapshot': 'String', + 'oid': 'BigInteger', + 'regproc': 'String', + 'regclass': 'String', + 'regtype': 'String', + 'regrole': 'String', + 'regnamespace': 'String', + 'int2vector': 'ARRAY', + 'oidvector': 'ARRAY', + 'pg_node_tree': 'Text', + } + if DataBaseConfig.db_type == 'postgresql' + else { + # 数值类型 + 'TINYINT': 'SmallInteger', + 'SMALLINT': 'SmallInteger', + 'MEDIUMINT': 'Integer', + 'INT': 'Integer', + 'INTEGER': 'Integer', + 'BIGINT': 'BigInteger', + 'FLOAT': 'Float', + 'DOUBLE': 'Float', + 'DECIMAL': 'DECIMAL', + 'BIT': 'Integer', + # 日期和时间类型 + 'DATE': 'Date', + 'TIME': 'Time', + 'DATETIME': 'DateTime', + 'TIMESTAMP': 'TIMESTAMP', + 'YEAR': 'Integer', + # 字符串类型 + 'CHAR': 'CHAR', + 'VARCHAR': 'String', + 'TINYTEXT': 'Text', + 'TEXT': 'Text', + 'MEDIUMTEXT': 'Text', + 'LONGTEXT': 'Text', + 'BINARY': 'BINARY', + 'VARBINARY': 'VARBINARY', + 'TINYBLOB': 'LargeBinary', + 'BLOB': 'LargeBinary', + 'MEDIUMBLOB': 'LargeBinary', + 'LONGBLOB': 'LargeBinary', + # 枚举和集合类型 + 'ENUM': 'Enum', + 'SET': 'String', + # JSON 类型 + 'JSON': 'JSON', + # 空间数据类型(需要扩展支持,如 GeoAlchemy2) + 'GEOMETRY': 'Geometry', # 需要安装 geoalchemy2 + 'POINT': 'Geometry', + 'LINESTRING': 'Geometry', + 'POLYGON': 'Geometry', + 'MULTIPOINT': 'Geometry', + 'MULTILINESTRING': 'Geometry', + 'MULTIPOLYGON': 'Geometry', + 'GEOMETRYCOLLECTION': 'Geometry', + } + ) + DB_TO_PYTHON_TYPE_MAPPING = ( + { + 'boolean': 'bool', + 'smallint': 'int', + 'integer': 'int', + 'bigint': 'int', + 'real': 'float', + 'double precision': 'float', + 'numeric': 'Decimal', + 'character varying': 'str', + 'character': 'str', + 'text': 'str', + 'bytea': 'bytes', + 'date': 'date', + 'time': 'time', + 'time with time zone': 'time', + 'time without time zone': 'time', + 'timestamp': 'datetime', + 'timestamp with time zone': 'datetime', + 'timestamp without time zone': 'datetime', + 'interval': 'timedelta', + 'json': 'dict', + 'jsonb': 'dict', + 'uuid': 'str', + 'inet': 'str', + 'cidr': 'str', + 'macaddr': 'str', + 'point': 'list', + 'line': 'list', + 'lseg': 'list', + 'box': 'list', + 'path': 'list', + 'polygon': 'list', + 'circle': 'list', + 'bit': 'int', + 'bit varying': 'int', + 'tsvector': 'str', + 'tsquery': 'str', + 'xml': 'str', + 'array': 'list', + 'composite': 'dict', + 'enum': 'str', + 'range': 'list', + 'money': 'Decimal', + 'pg_lsn': 'int', + 'txid_snapshot': 'str', + 'oid': 'int', + 'regproc': 'str', + 'regclass': 'str', + 'regtype': 'str', + 'regrole': 'str', + 'regnamespace': 'str', + 'int2vector': 'list', + 'oidvector': 'list', + 'pg_node_tree': 'str', + } + if DataBaseConfig.db_type == 'postgresql' + else { + # 数值类型 + 'TINYINT': 'int', + 'SMALLINT': 'int', + 'MEDIUMINT': 'int', + 'INT': 'int', + 'INTEGER': 'int', + 'BIGINT': 'int', + 'FLOAT': 'float', + 'DOUBLE': 'float', + 'DECIMAL': 'Decimal', + 'BIT': 'int', + # 日期和时间类型 + 'DATE': 'date', + 'TIME': 'time', + 'DATETIME': 'datetime', + 'TIMESTAMP': 'datetime', + 'YEAR': 'int', + # 字符串类型 + 'CHAR': 'str', + 'VARCHAR': 'str', + 'TINYTEXT': 'str', + 'TEXT': 'str', + 'MEDIUMTEXT': 'str', + 'LONGTEXT': 'str', + 'BINARY': 'bytes', + 'VARBINARY': 'bytes', + 'TINYBLOB': 'bytes', + 'BLOB': 'bytes', + 'MEDIUMBLOB': 'bytes', + 'LONGBLOB': 'bytes', + # 枚举和集合类型 + 'ENUM': 'str', + 'SET': 'str', + # JSON 类型 + 'JSON': 'dict', + # 空间数据类型(通常需要特殊处理) + 'GEOMETRY': 'bytes', + 'POINT': 'bytes', + 'LINESTRING': 'bytes', + 'POLYGON': 'bytes', + 'MULTIPOINT': 'bytes', + 'MULTILINESTRING': 'bytes', + 'MULTIPOLYGON': 'bytes', + 'GEOMETRYCOLLECTION': 'bytes', + } + ) diff --git a/ruoyi-fastapi-backend/module_generator/dao/gen_dao.py b/ruoyi-fastapi-backend/module_generator/dao/gen_dao.py index 4e080db..d6e74e9 100644 --- a/ruoyi-fastapi-backend/module_generator/dao/gen_dao.py +++ b/ruoyi-fastapi-backend/module_generator/dao/gen_dao.py @@ -278,7 +278,13 @@ class GenTableColumnDao: :return: 需要生成的业务表字段列表信息对象 """ gen_table_column_list = ( - (await db.execute(select(GenTableColumn).where(GenTableColumn.table_id == table_id))).scalars().all() + ( + await db.execute( + select(GenTableColumn).where(GenTableColumn.table_id == table_id).order_by(GenTableColumn.sort) + ) + ) + .scalars() + .all() ) return gen_table_column_list diff --git a/ruoyi-fastapi-backend/module_generator/templates/python/controller.py.jinja2 b/ruoyi-fastapi-backend/module_generator/templates/python/controller.py.jinja2 index e1a1146..4d5a12e 100644 --- a/ruoyi-fastapi-backend/module_generator/templates/python/controller.py.jinja2 +++ b/ruoyi-fastapi-backend/module_generator/templates/python/controller.py.jinja2 @@ -12,10 +12,10 @@ from config.enums import BusinessType from config.get_db import get_db from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.service.login_service import LoginService from {{ packageName }}.service.{{ businessName }}_service import {{ BusinessName }}Service from {{ packageName }}.entity.vo.{{ businessName }}_vo import Delete{{ BusinessName }}Model, {{ BusinessName }}Model, {{ BusinessName }}PageQueryModel -from {{ packageName }}.entity.vo.user_vo import CurrentUserModel from utils.common_util import bytes2file_response from utils.log_util import logger from utils.page_util import PageResponseModel @@ -30,7 +30,7 @@ from utils.response_util import ResponseUtil ) async def get_{{ moduleName }}_{{ businessName }}_list( request: Request, - {{ businessName }}_page_query: {{ BusinessName }}PageQueryModel = Depends({{ BusinessName }}PageQueryModel.as_query), + {% if table.crud or table.sub %}{{ businessName }}_page_query{% elif table.tree %}{{ businessName }}_query{% endif %}: {{ BusinessName }}PageQueryModel = Depends({{ BusinessName }}PageQueryModel.as_query), query_db: AsyncSession = Depends(get_db), ): {% if table.crud or table.sub %} diff --git a/ruoyi-fastapi-backend/module_generator/templates/python/dao.py.jinja2 b/ruoyi-fastapi-backend/module_generator/templates/python/dao.py.jinja2 index 8ea556f..25f902a 100644 --- a/ruoyi-fastapi-backend/module_generator/templates/python/dao.py.jinja2 +++ b/ruoyi-fastapi-backend/module_generator/templates/python/dao.py.jinja2 @@ -3,7 +3,7 @@ {% set pkParentheseIndex = pkColumn.column_comment.find("(") %} {% set pk_field_comment = pkColumn.column_comment[:pkParentheseIndex] if pkParentheseIndex != -1 else pkColumn.column_comment %} {% for column in columns %} -{% if column.python_field == "createTime" %} +{% if column.query and column.query_type == 'BETWEEN' and column.python_field == "createTime" %} from datetime import datetime, time {% endif %} {% endfor %} @@ -12,8 +12,13 @@ from sqlalchemy.ext.asyncio import AsyncSession {% if table.sub %} from sqlalchemy.orm import selectinload {% endif %} +{% if table.sub %} +from {{ packageName }}.entity.do.{{ businessName }}_do import {{ ClassName }}, {{ subClassName }} +from {{ packageName }}.entity.vo.{{ businessName }}_vo import {{ BusinessName }}Model, {{ BusinessName }}PageQueryModel, {{ subTable.business_name | capitalize }}Model +{% else %} from {{ packageName }}.entity.do.{{ businessName }}_do import {{ ClassName }} from {{ packageName }}.entity.vo.{{ businessName }}_vo import {{ BusinessName }}Model, {{ BusinessName }}PageQueryModel +{% endif %} from utils.page_util import PageUtil diff --git a/ruoyi-fastapi-backend/module_generator/templates/python/service.py.jinja2 b/ruoyi-fastapi-backend/module_generator/templates/python/service.py.jinja2 index eeda5cf..e291be8 100644 --- a/ruoyi-fastapi-backend/module_generator/templates/python/service.py.jinja2 +++ b/ruoyi-fastapi-backend/module_generator/templates/python/service.py.jinja2 @@ -75,7 +75,7 @@ class {{ BusinessName }}Service: {% set parentheseIndex = column.column_comment.find("(") %} {% set comment = column.column_comment[:parentheseIndex] if parentheseIndex != -1 else column.column_comment %} {% if column.required %} - if not await cls.check_{{ column.python_field | camel_to_snake }}_unique_services(query_db, page_object) + if not await cls.check_{{ column.python_field | camel_to_snake }}_unique_services(query_db, page_object): raise ServiceException(message=f'新增{{ functionName }}{page_object.{{ column.python_field | camel_to_snake }}}失败,{{ comment }}已存在') {% endif %} {% endfor %} @@ -83,8 +83,8 @@ class {{ BusinessName }}Service: {% if table.sub %} add_{{ businessName }} = await {{ BusinessName }}Dao.add_{{ businessName }}_dao(query_db, page_object) if add_{{ businessName }}: - for sub_table in page_object.{{ subclassName }}_list: - await {{ BusinessName }}Dao.add_{{ subTable.business_name }}_dao(query_db, sub_table) + for sub_table in page_object.{{ subclassName }}_list: + await {{ BusinessName }}Dao.add_{{ subTable.business_name }}_dao(query_db, sub_table) {% else %} await {{ BusinessName }}Dao.add_{{ businessName }}_dao(query_db, page_object) {% endif %} @@ -110,7 +110,7 @@ class {{ BusinessName }}Service: {% set parentheseIndex = column.column_comment.find("(") %} {% set comment = column.column_comment[:parentheseIndex] if parentheseIndex != -1 else column.column_comment %} {% if column.required %} - if not await cls.check_{{ column.python_field | camel_to_snake }}_unique_services(query_db, page_object) + if not await cls.check_{{ column.python_field | camel_to_snake }}_unique_services(query_db, page_object): raise ServiceException(message=f'修改{{ functionName }}{page_object.{{ column.python_field | camel_to_snake }}}失败,{{ comment }}已存在') {% endif %} {% endfor %} diff --git a/ruoyi-fastapi-backend/module_generator/templates/sql/sql.jinja2 b/ruoyi-fastapi-backend/module_generator/templates/sql/sql.jinja2 index 346d5d4..dd4099f 100644 --- a/ruoyi-fastapi-backend/module_generator/templates/sql/sql.jinja2 +++ b/ruoyi-fastapi-backend/module_generator/templates/sql/sql.jinja2 @@ -1,26 +1,26 @@ {% if dbType == 'postgresql' %} -- 菜单 SQL insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', current_timestamp, '', null, '${functionName}菜单'); +values('{{ functionName }}', '{{ parentMenuId }}', '1', '{{ businessName }}', '{{ moduleName }}/{{ businessName }}/index', 1, 0, 'C', '0', '0', '{{ permissionPrefix }}:list', '#', 'admin', current_timestamp, '', null, '{{ functionName }}菜单'); -- 按钮父菜单ID select max(menu_id) from sys_menu; -- 按钮 SQL insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values('${functionName}查询', max(menu_id), '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', current_timestamp, '', null, ''); +values('{{ functionName }}查询', max(menu_id), '1', '#', '', 1, 0, 'F', '0', '0', '{{ permissionPrefix }}:query', '#', 'admin', current_timestamp, '', null, ''); insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values('${functionName}新增', max(menu_id), '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', current_timestamp, '', null, ''); +values('{{ functionName }}新增', max(menu_id), '2', '#', '', 1, 0, 'F', '0', '0', '{{ permissionPrefix }}:add', '#', 'admin', current_timestamp, '', null, ''); insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values('${functionName}修改', max(menu_id), '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', current_timestamp, '', null, ''); +values('{{ functionName }}修改', max(menu_id), '3', '#', '', 1, 0, 'F', '0', '0', '{{ permissionPrefix }}:edit', '#', 'admin', current_timestamp, '', null, ''); insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values('${functionName}删除', max(menu_id), '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', current_timestamp, '', null, ''); +values('{{ functionName }}删除', max(menu_id), '4', '#', '', 1, 0, 'F', '0', '0', '{{ permissionPrefix }}:remove', '#', 'admin', current_timestamp, '', null, ''); insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values('${functionName}导出', max(menu_id), '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', current_timestamp, '', null, ''); +values('{{ functionName }}导出', max(menu_id), '5', '#', '', 1, 0, 'F', '0', '0', '{{ permissionPrefix }}:export', '#', 'admin', current_timestamp, '', null, ''); {% else %} -- 菜单 SQL insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) diff --git a/ruoyi-fastapi-backend/module_generator/templates/vue/v3/index-tree.vue.jinja2 b/ruoyi-fastapi-backend/module_generator/templates/vue/v3/index-tree.vue.jinja2 index b33a65b..64e8c8f 100644 --- a/ruoyi-fastapi-backend/module_generator/templates/vue/v3/index-tree.vue.jinja2 +++ b/ruoyi-fastapi-backend/module_generator/templates/vue/v3/index-tree.vue.jinja2 @@ -398,7 +398,7 @@ function toggleExpandAll() { /** 修改按钮操作 */ function handleUpdate(row) { reset(); - await getTreeselect(); + getTreeselect(); if (row != null) { form.value.{{ treeParentCode }} = row.{{ treeParentCode }}; } diff --git a/ruoyi-fastapi-backend/sql/ruoyi-fastapi-pg.sql b/ruoyi-fastapi-backend/sql/ruoyi-fastapi-pg.sql index 980c31f..70ee0c1 100644 --- a/ruoyi-fastapi-backend/sql/ruoyi-fastapi-pg.sql +++ b/ruoyi-fastapi-backend/sql/ruoyi-fastapi-pg.sql @@ -976,7 +976,7 @@ $BODY$ LANGUAGE plpgsql VOLATILE COST 100; -create view list_column as +create or replace view list_column as SELECT c.relname AS table_name, a.attname AS column_name, d.description AS column_comment, @@ -1016,7 +1016,7 @@ WHERE (c.relkind = ANY (ARRAY['r'::"char", 'p'::"char"])) AND not a.attisdropped ORDER BY c.relname, a.attnum; -create view list_table as +create or replace view list_table as SELECT c.relname AS table_name, obj_description(c.oid) AS table_comment, CURRENT_TIMESTAMP AS create_time, diff --git a/ruoyi-fastapi-backend/utils/gen_util.py b/ruoyi-fastapi-backend/utils/gen_util.py index d578991..3f1e392 100644 --- a/ruoyi-fastapi-backend/utils/gen_util.py +++ b/ruoyi-fastapi-backend/utils/gen_util.py @@ -47,7 +47,7 @@ class GenUtils: column.python_field = cls.to_camel_case(column_name) # 设置默认类型 column.python_type = StringUtil.get_mapping_value_by_key_ignore_case( - GenConstant.MYSQL_TO_PYTHON_TYPE_MAPPING, data_type + GenConstant.DB_TO_PYTHON_TYPE_MAPPING, data_type ) column.query_type = GenConstant.QUERY_EQ diff --git a/ruoyi-fastapi-backend/utils/template_util.py b/ruoyi-fastapi-backend/utils/template_util.py index 2ef4e9a..3da4032 100644 --- a/ruoyi-fastapi-backend/utils/template_util.py +++ b/ruoyi-fastapi-backend/utils/template_util.py @@ -210,7 +210,7 @@ class TemplateUtils: return f'{cls.BACKEND_PROJECT_PATH}/sql/{business_name}_menu.sql' elif 'api.js.jinja2' in template: return f'{vue_path}/api/{module_name}/{business_name}.js' - elif 'index.vue.jinja2' in template or 'index-tree.vue.j2' in template: + elif 'index.vue.jinja2' in template or 'index-tree.vue.jinja2' in template: return f'{vue_path}/views/{module_name}/{business_name}/index.vue' return '' @@ -261,16 +261,18 @@ class TemplateUtils: import_list.add('from sqlalchemy import Column') for column in columns: data_type = cls.get_db_type(column.column_type) + if data_type in GenConstant.COLUMNTYPE_GEOMETRY: + import_list.add('from geoalchemy2 import Geometry') import_list.add( - f'from sqlalchemy import {StringUtil.get_mapping_value_by_key_ignore_case(GenConstant.MYSQL_TO_SQLALCHEMY_TYPE_MAPPING, data_type)}' + f'from sqlalchemy import {StringUtil.get_mapping_value_by_key_ignore_case(GenConstant.DB_TO_SQLALCHEMY_TYPE_MAPPING, data_type)}' ) if gen_table.sub: sub_columns = gen_table.sub_table.columns or [] for sub_column in sub_columns: - if sub_column.python_type in GenConstant.TYPE_DATE: - import_list.add(f'from datetime import {column.python_type}') - elif sub_column.python_type == GenConstant.TYPE_DECIMAL: - import_list.add('from decimal import Decimal') + data_type = cls.get_db_type(sub_column.column_type) + import_list.add( + f'from sqlalchemy import {StringUtil.get_mapping_value_by_key_ignore_case(GenConstant.DB_TO_SQLALCHEMY_TYPE_MAPPING, data_type)}' + ) return cls.merge_same_imports(list(import_list), 'from sqlalchemy import') @classmethod @@ -444,14 +446,14 @@ class TemplateUtils: column_type_list = column_type.split('(') sqlalchemy_type = ( StringUtil.get_mapping_value_by_key_ignore_case( - GenConstant.MYSQL_TO_SQLALCHEMY_TYPE_MAPPING, column_type_list[0] + GenConstant.DB_TO_SQLALCHEMY_TYPE_MAPPING, column_type_list[0] ) + '(' + column_type_list[1] ) else: sqlalchemy_type = StringUtil.get_mapping_value_by_key_ignore_case( - GenConstant.MYSQL_TO_SQLALCHEMY_TYPE_MAPPING, column_type + GenConstant.DB_TO_SQLALCHEMY_TYPE_MAPPING, column_type ) return sqlalchemy_type diff --git a/ruoyi-fastapi-frontend/src/views/tool/gen/editTable.vue b/ruoyi-fastapi-frontend/src/views/tool/gen/editTable.vue index 0833de8..8739e0e 100644 --- a/ruoyi-fastapi-frontend/src/views/tool/gen/editTable.vue +++ b/ruoyi-fastapi-frontend/src/views/tool/gen/editTable.vue @@ -36,6 +36,7 @@ +