feat: 新增刷新缓存功能并优化系统初始化

refactor: 重构模型加载选项和CRUD预加载逻辑

fix: 修复日期范围查询格式问题

style: 优化前端组件样式和布局

perf: 提升字典数据更新性能

docs: 更新注释和文档说明

chore: 清理无用文件和代码

test: 更新测试用例

build: 添加vue-json-pretty依赖

ci: 优化初始化脚本和事务处理
This commit is contained in:
zhangtao
2025-10-27 02:33:50 +08:00
parent ab90f86623
commit 780e02b9de
89 changed files with 1549 additions and 914 deletions
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from typing import Dict, List, Optional, Sequence
from typing import Dict, List, Optional, Sequence, Union, Any
from app.core.base_crud import CRUDBase
from app.api.v1.module_system.auth.schema import AuthSchema
@@ -21,42 +21,45 @@ class McpCRUD(CRUDBase[McpModel, McpCreateSchema, McpUpdateSchema]):
self.auth = auth
super().__init__(model=McpModel, auth=auth)
async def get_by_id_crud(self, id: int) -> Optional[McpModel]:
async def get_by_id_crud(self, id: int, preload: Optional[List[Union[str, Any]]] = None) -> Optional[McpModel]:
"""
获取MCP服务器详情
参数:
- id (int): MCP服务器ID
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
返回:
- Optional[McpModel]: MCP服务器模型实例(如果存在)
"""
return await self.get(id=id)
return await self.get(id=id, preload=preload)
async def get_by_name_crud(self, name: str) -> Optional[McpModel]:
async def get_by_name_crud(self, name: str, preload: Optional[List[Union[str, Any]]] = None) -> Optional[McpModel]:
"""
通过名称获取MCP服务器
参数:
- name (str): MCP服务器名称
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
返回:
- Optional[McpModel]: MCP服务器模型实例(如果存在)
"""
return await self.get(name=name)
return await self.get(name=name, preload=preload)
async def get_list_crud(self, search: Optional[Dict] = None, order_by: Optional[List[Dict[str, str]]] = None) -> Sequence[McpModel]:
async def get_list_crud(self, search: Optional[Dict] = None, order_by: Optional[List[Dict[str, str]]] = None, preload: Optional[List[Union[str, Any]]] = None) -> Sequence[McpModel]:
"""
列表查询MCP服务器
参数:
- search (Optional[Dict]): 查询参数字典
- order_by (Optional[List[Dict[str, str]]]): 排序参数列表
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
返回:
- Sequence[McpModel]: MCP服务器模型实例序列
"""
return await self.list(search=search or {}, order_by=order_by or [{'id': 'asc'}])
return await self.list(search=search or {}, order_by=order_by or [{'id': 'asc'}], preload=preload)
async def create_crud(self, data: McpCreateSchema) -> Optional[McpModel]:
"""
@@ -93,4 +96,4 @@ class McpCRUD(CRUDBase[McpModel, McpCreateSchema, McpUpdateSchema]):
返回:
- None
"""
return await self.delete(ids=ids)
return await self.delete(ids=ids)
@@ -14,6 +14,7 @@ class McpModel(CreatorMixin):
__tablename__ = 'app_ai_mcp'
__table_args__ = ({'comment': 'MCP 服务器表'})
__loader_options__ = ["creator"]
name: Mapped[str] = mapped_column(String(50), unique=True, comment='MCP 名称')
type: Mapped[int] = mapped_column(Integer, default=0, comment='MCP 类型(0:stdio 1:sse')
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from typing import Dict, List, Optional, Sequence
from typing import Dict, List, Optional, Sequence, Union, Any
from app.core.base_crud import CRUDBase
from app.api.v1.module_system.auth.schema import AuthSchema
@@ -21,30 +21,32 @@ class JobCRUD(CRUDBase[JobModel, JobCreateSchema, JobUpdateSchema]):
self.auth = auth
super().__init__(model=JobModel, auth=auth)
async def get_obj_by_id_crud(self, id: int) -> Optional[JobModel]:
async def get_obj_by_id_crud(self, id: int, preload: Optional[List[Union[str, Any]]] = None) -> Optional[JobModel]:
"""
获取定时任务详情
参数:
- id (int): 定时任务ID
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
返回:
- Optional[JobModel]: 定时任务模型,如果不存在则为None
"""
return await self.get(id=id)
return await self.get(id=id, preload=preload)
async def get_obj_list_crud(self, search: Optional[Dict] = None, order_by: Optional[List[Dict[str, str]]] = None) -> Sequence[JobModel]:
async def get_obj_list_crud(self, search: Optional[Dict] = None, order_by: Optional[List[Dict[str, str]]] = None, preload: Optional[List[Union[str, Any]]] = None) -> Sequence[JobModel]:
"""
获取定时任务列表
参数:
- search (Optional[Dict]): 查询参数字典
- order_by (Optional[List[Dict[str, str]]]): 排序参数列表
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
返回:
- Sequence[JobModel]: 定时任务模型序列
"""
return await self.list(search=search, order_by=order_by)
return await self.list(search=search, order_by=order_by, preload=preload)
async def create_obj_crud(self, data: JobCreateSchema) -> Optional[JobModel]:
"""
@@ -113,30 +115,32 @@ class JobLogCRUD(CRUDBase[JobLogModel, JobLogCreateSchema, JobLogUpdateSchema]):
self.auth = auth
super().__init__(model=JobLogModel, auth=auth)
async def get_obj_log_by_id_crud(self, id: int) -> Optional[JobLogModel]:
async def get_obj_log_by_id_crud(self, id: int, preload: Optional[List[Union[str, Any]]] = None) -> Optional[JobLogModel]:
"""
获取定时任务日志详情
参数:
- id (int): 定时任务日志ID
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
返回:
- Optional[JobLogModel]: 定时任务日志模型,如果不存在则为None
"""
return await self.get(id=id)
return await self.get(id=id, preload=preload)
async def get_obj_log_list_crud(self, search: Optional[Dict] = None, order_by: Optional[List[Dict[str, str]]] = None) -> Sequence[JobLogModel]:
async def get_obj_log_list_crud(self, search: Optional[Dict] = None, order_by: Optional[List[Dict[str, str]]] = None, preload: Optional[List[Union[str, Any]]] = None) -> Sequence[JobLogModel]:
"""
获取定时任务日志列表
参数:
- search (Optional[Dict]): 查询参数字典
- order_by (Optional[List[Dict[str, str]]]): 排序参数列表
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
返回:
- Sequence[JobLogModel]: 定时任务日志模型序列
"""
return await self.list(search=search, order_by=order_by)
return await self.list(search=search, order_by=order_by, preload=preload)
async def delete_obj_log_crud(self, ids: List[int]) -> None:
"""
@@ -14,6 +14,7 @@ class JobModel(CreatorMixin):
"""
__tablename__ = 'app_job'
__table_args__ = ({'comment': '定时任务调度表'})
__loader_options__ = ["job_logs", "creator"]
name: Mapped[Optional[str]] = mapped_column(String(64), nullable=True, default='', comment='任务名称')
jobstore: Mapped[Optional[str]] = mapped_column(String(64), nullable=True, default='default', comment='存储器')
@@ -37,6 +38,7 @@ class JobLogModel(MappedBase):
"""
__tablename__ = 'app_job_log'
__table_args__ = ({'comment': '定时任务调度日志表'})
__loader_options__ = ["job"]
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment='主键ID')
job_name: Mapped[str] = mapped_column(String(64),nullable=False,comment='任务名称')
@@ -52,4 +54,4 @@ class JobLogModel(MappedBase):
status: Mapped[bool] = mapped_column(Boolean(), default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
create_time: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True, default=datetime.now, comment='创建时间')
# 任务关联关系
job: Mapped[Optional["JobModel"]] = relationship(back_populates="job_logs", lazy="selectin")
job: Mapped[Optional["JobModel"]] = relationship(back_populates="job_logs", lazy="selectin")
@@ -60,10 +60,10 @@ class JobLogCreateSchema(BaseModel):
class JobLogUpdateSchema(JobLogCreateSchema):
"""定时任务调度日志表更新模型"""
...
job_log_id: Optional[int] = Field(default=None, description='任务日志ID')
id: Optional[int] = Field(default=None, description='任务日志ID')
class JobLogOutSchema(JobLogCreateSchema):
class JobLogOutSchema(JobLogUpdateSchema):
"""定时任务调度日志表响应模型"""
model_config = ConfigDict(from_attributes=True)
...
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from typing import Dict, List, Optional, Sequence
from typing import Dict, List, Optional, Sequence, Union, Any
from app.core.base_crud import CRUDBase
from app.api.v1.module_system.auth.schema import AuthSchema
@@ -21,30 +21,32 @@ class ApplicationCRUD(CRUDBase[ApplicationModel, ApplicationCreateSchema, Applic
self.auth = auth
super().__init__(model=ApplicationModel, auth=auth)
async def get_by_id_crud(self, id: int) -> Optional[ApplicationModel]:
async def get_by_id_crud(self, id: int, preload: Optional[List[Union[str, Any]]] = None) -> Optional[ApplicationModel]:
"""
根据id获取应用详情
参数:
- id (int): 应用ID
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
返回:
- Optional[ApplicationModel]: 应用详情,如果不存在则为None
"""
return await self.get(id=id)
return await self.get(id=id, preload=preload)
async def list_crud(self, search: Optional[Dict] = None, order_by: Optional[List[Dict[str, str]]] = None) -> Sequence[ApplicationModel]:
async def list_crud(self, search: Optional[Dict] = None, order_by: Optional[List[Dict[str, str]]] = None, preload: Optional[List[Union[str, Any]]] = None) -> Sequence[ApplicationModel]:
"""
列表查询应用
参数:
- search (Optional[Dict]): 查询参数,默认None
- order_by (Optional[List[Dict[str, str]]]): 排序参数,默认None
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
返回:
- Sequence[ApplicationModel]: 应用列表
"""
return await self.list(search=search, order_by=order_by)
return await self.list(search=search, order_by=order_by, preload=preload)
async def create_crud(self, data: ApplicationCreateSchema) -> Optional[ApplicationModel]:
"""
@@ -13,6 +13,7 @@ class ApplicationModel(CreatorMixin):
__tablename__ = 'app_myapp'
__table_args__ = ({'comment': '应用系统表'})
__loader_options__ = ["creator"]
# 基本信息(必备字段)
name: Mapped[str] = mapped_column(String(64), nullable=False, comment='应用名称', unique=True)
@@ -24,5 +25,4 @@ class ApplicationModel(CreatorMixin):
access_url: Mapped[str] = mapped_column(String(500), nullable=False, comment='访问地址')
# 外观展示
icon_url: Mapped[str] = mapped_column(String(300), nullable=True, comment='应用图标URL')
icon_url: Mapped[str] = mapped_column(String(300), nullable=True, comment='应用图标URL')