Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/plugin/code_generator/crud/crud_business.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ async def get_by_name(self, db: AsyncSession, name: str) -> GenBusiness | None:
:param name: 表名
:return:
"""
return await self.select_model_by_column(db, table_name_en=name)
return await self.select_model_by_column(db, table_name=name)

async def get_all(self, db: AsyncSession) -> Sequence[GenBusiness]:
"""
Expand Down
10 changes: 5 additions & 5 deletions backend/plugin/code_generator/model/business.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ class GenBusiness(Base):

id: Mapped[id_key] = mapped_column(init=False)
app_name: Mapped[str] = mapped_column(String(50), comment='应用名称(英文)')
table_name_en: Mapped[str] = mapped_column(String(255), unique=True, comment='表名称(英文)')
table_name_zh: Mapped[str] = mapped_column(String(255), comment='表名称(中文)')
table_simple_name_zh: Mapped[str] = mapped_column(String(255), comment='表名称(中文简称)')
table_name: Mapped[str] = mapped_column(String(255), unique=True, comment='表名称(英文)')
doc_comment: Mapped[str] = mapped_column(String(255), comment='文档注释(用于函数/参数文档)')
table_comment: Mapped[str | None] = mapped_column(String(255), default=None, comment='表描述')
# relate_model_fk: Mapped[int | None] = mapped_column(default=None, comment='关联表外键')
schema_name: Mapped[str | None] = mapped_column(String(255), default=None, comment='Schema 名称 (默认为英文表名称)')
filename: Mapped[str | None] = mapped_column(String(20), default=None, comment='基础文件名(默认为英文表名称)')
class_name: Mapped[str | None] = mapped_column(String(50), default=None, comment='基础类名(默认为英文表名称)')
schema_name: Mapped[str | None] = mapped_column(String(50), default=None, comment='Schema 名称 (默认为英文表名称)')
filename: Mapped[str | None] = mapped_column(String(50), default=None, comment='基础文件名(默认为英文表名称)')
default_datetime_column: Mapped[bool] = mapped_column(default=True, comment='是否存在默认时间列')
api_version: Mapped[str] = mapped_column(String(20), default='v1', comment='代码生成 api 版本,默认为 v1')
gen_path: Mapped[str | None] = mapped_column(String(255), default=None, comment='代码生成路径(默认为 app 根路径)')
Expand Down
6 changes: 3 additions & 3 deletions backend/plugin/code_generator/schema/business.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ class GenBusinessSchemaBase(SchemaBase):
"""代码生成业务基础模型"""

app_name: str = Field(description='应用名称(英文)')
table_name_en: str = Field(description='表名称(英文)')
table_name_zh: str = Field(description='表名称(中文)')
table_simple_name_zh: str = Field(description='表名称(中文简称)')
table_name: str = Field(description='表名称(英文)')
doc_comment: str = Field(description='文档注释(用于函数/参数文档)')
table_comment: str | None = Field(None, description='表描述')
class_name: str | None = Field(None, description='基础类名 (默认为英文表名称)')
schema_name: str | None = Field(None, description='Schema 名称 (默认为英文表名称)')
filename: str | None = Field(None, description='基础文件名(默认为英文表名称)')
default_datetime_column: bool = Field(True, description='是否存在默认时间列')
Expand Down
2 changes: 1 addition & 1 deletion backend/plugin/code_generator/service/business_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ async def create(*, obj: CreateGenBusinessParam) -> None:
:return:
"""
async with async_db_session.begin() as db:
business = await gen_business_dao.get_by_name(db, obj.table_name_en)
business = await gen_business_dao.get_by_name(db, obj.table_name)
if business:
raise errors.ForbiddenError(msg='代码生成业务已存在')
await gen_business_dao.create(db, obj)
Expand Down
14 changes: 7 additions & 7 deletions backend/plugin/code_generator/service/gen_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ async def import_business_and_model(*, obj: ImportParam) -> None:
new_business = GenBusiness(
**CreateGenBusinessParam(
app_name=obj.app,
table_name_en=table_name,
table_name_zh=table_info[1] or ' '.join(table_name.split('_')),
table_simple_name_zh=table_info[1] or table_name.split('_')[-1],
table_name=table_name,
doc_comment=table_info[1] or table_name.split('_')[-1],
table_comment=table_info[1],
class_name=table_name,
schema_name=table_name,
filename=table_name,
).model_dump()
Expand Down Expand Up @@ -194,8 +194,8 @@ async def generate(self, *, pk: int) -> None:
if code_folder.name == 'model':
async with aiofiles.open(init_filepath, 'a', encoding='utf-8') as f:
await f.write(
f'from backend.app.{business.app_name}.model.{business.table_name_en} '
f'import {to_pascal(business.table_name_en)}\n',
f'from backend.app.{business.app_name}.model.{business.table_name} '
f'import {to_pascal(business.table_name)}\n',
)

# 写入代码文件
Expand Down Expand Up @@ -229,8 +229,8 @@ async def download(self, *, pk: int) -> io.BytesIO:
zf.writestr(
init_filepath,
f'{gen_template.init_content}'
f'from backend.app.{business.app_name}.model.{business.table_name_en} '
f'import {to_pascal(business.table_name_en)}\n',
f'from backend.app.{business.app_name}.model.{business.table_name} '
f'import {to_pascal(business.table_name)}\n',
)

# api __init__.py
Expand Down
38 changes: 19 additions & 19 deletions backend/plugin/code_generator/templates/python/api.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ from typing import Annotated

from fastapi import APIRouter, Depends, Path, Query

from backend.app.{{ app_name }}.schema.{{ table_name_en }} import Create{{ schema_name }}Param, Get{{ schema_name }}Detail, Update{{ schema_name }}Param
from backend.app.{{ app_name }}.service.{{ table_name_en }}_service import {{ table_name_en }}_service
from backend.app.{{ app_name }}.schema.{{ table_name }} import Create{{ schema_name }}Param, Get{{ schema_name }}Detail, Update{{ schema_name }}Param
from backend.app.{{ app_name }}.service.{{ table_name }}_service import {{ table_name }}_service
from backend.common.pagination import DependsPagination, PageData, paging_data
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
from backend.common.security.jwt import DependsJwtAuth
Expand All @@ -16,64 +16,64 @@ from backend.database.db import CurrentSession
router = APIRouter()


@router.get('/{pk}', summary='获取{{ table_simple_name_zh }}详情', dependencies=[DependsJwtAuth])
async def get_{{ table_name_en }}(pk: Annotated[int, Path(description='{{ table_simple_name_zh }} ID')]) -> ResponseSchemaModel[Get{{ schema_name }}Detail]:
{{ table_name_en }} = await {{ table_name_en }}_service.get(pk=pk)
return response_base.success(data={{ table_name_en }})
@router.get('/{pk}', summary='获取{{ doc_comment }}详情', dependencies=[DependsJwtAuth])
async def get_{{ table_name }}(pk: Annotated[int, Path(description='{{ doc_comment }} ID')]) -> ResponseSchemaModel[Get{{ schema_name }}Detail]:
{{ table_name }} = await {{ table_name }}_service.get(pk=pk)
return response_base.success(data={{ table_name }})


@router.get(
'',
summary='分页获取所有{{ table_simple_name_zh }}',
summary='分页获取所有{{ doc_comment }}',
dependencies=[
DependsJwtAuth,
DependsPagination,
],
)
async def get_pagination_{{ table_name_en }}s(db: CurrentSession) -> ResponseSchemaModel[PageData[Get{{ schema_name }}Detail]]:
{{ table_name_en }}_select = await {{ table_name_en }}_service.get_select()
page_data = await paging_data(db, {{ table_name_en }}_select)
async def get_pagination_{{ table_name }}s(db: CurrentSession) -> ResponseSchemaModel[PageData[Get{{ schema_name }}Detail]]:
{{ table_name }}_select = await {{ table_name }}_service.get_select()
page_data = await paging_data(db, {{ table_name }}_select)
return response_base.success(data=page_data)


@router.post(
'',
summary='创建{{ table_simple_name_zh }}',
summary='创建{{ doc_comment }}',
dependencies=[
Depends(RequestPermission('{{ permission }}:add')),
DependsRBAC,
],
)
async def create_{{ table_name_en }}(obj: Create{{ schema_name }}Param) -> ResponseModel:
await {{ table_name_en }}_service.create(obj=obj)
async def create_{{ table_name }}(obj: Create{{ schema_name }}Param) -> ResponseModel:
await {{ table_name }}_service.create(obj=obj)
return response_base.success()


@router.put(
'/{pk}',
summary='更新{{ table_simple_name_zh }}',
summary='更新{{ doc_comment }}',
dependencies=[
Depends(RequestPermission('{{ permission }}:edit')),
DependsRBAC,
],
)
async def update_{{ table_name_en }}(pk: Annotated[int, Path(description='{{ table_simple_name_zh }} ID')], obj: Update{{ schema_name }}Param) -> ResponseModel:
count = await {{ table_name_en }}_service.update(pk=pk, obj=obj)
async def update_{{ table_name }}(pk: Annotated[int, Path(description='{{ doc_comment }} ID')], obj: Update{{ schema_name }}Param) -> ResponseModel:
count = await {{ table_name }}_service.update(pk=pk, obj=obj)
if count > 0:
return response_base.success()
return response_base.fail()


@router.delete(
'',
summary='批量删除{{ table_simple_name_zh }}',
summary='批量删除{{ doc_comment }}',
dependencies=[
Depends(RequestPermission('{{ permission }}:del')),
DependsRBAC,
],
)
async def delete_{{ table_name_en }}(pk: Annotated[list[int], Query(description='{{ table_simple_name_zh }} ID 列表')]) -> ResponseModel:
count = await {{ table_name_en }}_service.delete(pk=pk)
async def delete_{{ table_name }}(pk: Annotated[list[int], Query(description='{{ doc_comment }} ID 列表')]) -> ResponseModel:
count = await {{ table_name }}_service.delete(pk=pk)
if count > 0:
return response_base.success()
return response_base.fail()
34 changes: 17 additions & 17 deletions backend/plugin/code_generator/templates/python/crud.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,28 @@ from sqlalchemy import Select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy_crud_plus import CRUDPlus

from backend.app.{{ app_name }}.model import {{ table_name_class }}
from backend.app.{{ app_name }}.schema.{{ table_name_en }} import Create{{ schema_name }}Param, Update{{ schema_name }}Param
from backend.app.{{ app_name }}.model import {{ class_name }}
from backend.app.{{ app_name }}.schema.{{ table_name }} import Create{{ schema_name }}Param, Update{{ schema_name }}Param


class CRUD{{ table_name_class }}(CRUDPlus[{{ schema_name }}]):
async def get(self, db: AsyncSession, pk: int) -> {{ table_name_class }} | None:
class CRUD{{ class_name }}(CRUDPlus[{{ schema_name }}]):
async def get(self, db: AsyncSession, pk: int) -> {{ class_name }} | None:
"""
获取{{ table_name_zh }}
获取{{ doc_comment }}

:param db: 数据库会话
:param pk: {{ table_simple_name_zh }} ID
:param pk: {{ doc_comment }} ID
:return:
"""
return await self.select_model(db, pk)

async def get_list(self) -> Select:
"""获取{{ table_name_zh }}列表"""
"""获取{{ doc_comment }}列表"""
return await self.select_order('created_time', 'desc')

async def get_all(self, db: AsyncSession) -> Sequence[{{ table_name_class }}]:
async def get_all(self, db: AsyncSession) -> Sequence[{{ class_name }}]:
"""
获取所有{{ table_name_zh }}
获取所有{{ doc_comment }}

:param db: 数据库会话
:return:
Expand All @@ -36,34 +36,34 @@ class CRUD{{ table_name_class }}(CRUDPlus[{{ schema_name }}]):

async def create(self, db: AsyncSession, obj: Create{{ schema_name }}Param) -> None:
"""
创建{{ table_name_zh }}
创建{{ doc_comment }}

:param db: 数据库会话
:param obj: 创建{{ table_simple_name_zh }} 参数
:param obj: 创建{{ doc_comment }}参数
:return:
"""
await self.create_model(db, obj)

async def update(self, db: AsyncSession, pk: int, obj: Update{{ schema_name }}Param) -> int:
"""
更新{{ table_name_zh }}
更新{{ doc_comment }}

:param db: 数据库会话
:param pk: {{ table_simple_name_zh }} ID
:param obj: 更新 {{ table_simple_name_zh }} 参数
:param pk: {{ doc_comment }} ID
:param obj: 更新 {{ doc_comment }}参数
:return:
"""
return await self.update_model(db, pk, obj)

async def delete(self, db: AsyncSession, pk: list[int]) -> int:
"""
删除{{ table_name_zh }}
删除{{ doc_comment }}

:param db: 数据库会话
:param pk: {{ table_simple_name_zh }} ID
:param pk: {{ doc_comment }} ID
:return:
"""
return await self.delete_model_by_column(db, allow_multiple=True, id__in=pk)


{{ table_name_en }}_dao: CRUD{{ table_name_class }} = CRUD{{ table_name_class }}({{ table_name_class }})
{{ instance_name }}_dao: CRUD{{ class_name }} = CRUD{{ class_name }}({{ class_name }})
6 changes: 3 additions & 3 deletions backend/plugin/code_generator/templates/python/model.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ from sqlalchemy.orm import Mapped, mapped_column
from backend.common.model import {% if default_datetime_column %}Base{% else %}MappedBase{% endif %}, id_key


class {{ table_name_class }}({% if default_datetime_column %}Base{% else %}MappedBase{% endif %}):
"""{{ table_name_zh }}"""
class {{ class_name }}({% if default_datetime_column %}Base{% else %}MappedBase{% endif %}):
"""{{ table_comment }}"""

__tablename__ = '{{ table_name_en }}'
__tablename__ = '{{ table_name }}'

id: Mapped[id_key] = mapped_column(init=False)
{% for model in models %}
Expand Down
8 changes: 4 additions & 4 deletions backend/plugin/code_generator/templates/python/schema.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,23 @@ from backend.common.schema import SchemaBase


class {{ schema_name }}SchemaBase(SchemaBase):
"""{{ table_simple_name_zh }}基础模型"""
"""{{ doc_comment }}基础模型"""
{% for model in models %}
{{ model.name }}: {% if model.nullable %}{{ model.pd_type }} | None = Field(None, description='{{ model.comment }}'){% else %}{{ model.pd_type }} = Field(description='{{ model.comment }}'){% endif %}

{% endfor %}


class Create{{ schema_name }}Param({{ schema_name }}SchemaBase):
"""创建{{ table_simple_name_zh }}参数"""
"""创建{{ doc_comment }}参数"""


class Update{{ schema_name }}Param({{ schema_name }}SchemaBase):
"""更新{{ table_simple_name_zh }}参数"""
"""更新{{ doc_comment }}参数"""


class Get{{ schema_name }}Detail({{ schema_name }}SchemaBase):
"""{{ table_simple_name_zh }}详情"""
"""{{ doc_comment }}详情"""

model_config = ConfigDict(from_attributes=True)

Expand Down
Loading