From 830361073b24ad98a51fbfc20900f19f9be26729 Mon Sep 17 00:00:00 2001 From: Admin Date: Thu, 29 Jan 2026 17:45:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=81=A2=E5=A4=8D=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9A=84=E9=85=8D=E7=BD=AE=E9=A1=B9=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 定时任务提交(104487f)误删了应用 config_schema 相关代码,现恢复: - backend/app/models/app.py: 恢复 config_schema 数据库字段 - backend/app/routers/apps.py: 恢复 ConfigSchemaItem、API 路由、格式化函数 - frontend/src/views/apps/index.vue: 恢复配置项编辑 UI --- backend/app/models/app.py | 5 + backend/app/routers/apps.py | 38 ++++++ frontend/src/views/apps/index.vue | 191 +++++++++++++++++++++++++++++- 3 files changed, 230 insertions(+), 4 deletions(-) diff --git a/backend/app/models/app.py b/backend/app/models/app.py index f388851..caade74 100644 --- a/backend/app/models/app.py +++ b/backend/app/models/app.py @@ -18,6 +18,11 @@ class App(Base): # [{"code": "brainstorm", "name": "头脑风暴", "path": "/brainstorm"}, ...] tools = Column(Text) + # 配置项定义(JSON 数组)- 定义租户可配置的参数 + # [{"key": "industry", "label": "行业类型", "type": "radio", "options": [...], "default": "...", "required": false}, ...] + # type: text(文本) | radio(单选) | select(下拉多选) | switch(开关) + config_schema = Column(Text) + # 是否需要企微JS-SDK require_jssdk = Column(SmallInteger, default=0) # 0-不需要 1-需要 diff --git a/backend/app/routers/apps.py b/backend/app/routers/apps.py index 871d809..b1c6dd0 100644 --- a/backend/app/routers/apps.py +++ b/backend/app/routers/apps.py @@ -23,6 +23,18 @@ class ToolItem(BaseModel): path: str +class ConfigSchemaItem(BaseModel): + """配置项定义""" + key: str # 配置键 + label: str # 显示标签 + type: str # text | radio | select | switch + options: Optional[List[str]] = None # radio/select 的选项值 + option_labels: Optional[dict] = None # 选项显示名称 {"value": "显示名"} + default: Optional[str] = None # 默认值 + placeholder: Optional[str] = None # 输入提示(text类型) + required: bool = False # 是否必填 + + class AppCreate(BaseModel): """创建应用""" app_code: str @@ -30,6 +42,7 @@ class AppCreate(BaseModel): base_url: Optional[str] = None description: Optional[str] = None tools: Optional[List[ToolItem]] = None + config_schema: Optional[List[ConfigSchemaItem]] = None require_jssdk: bool = False @@ -39,6 +52,7 @@ class AppUpdate(BaseModel): base_url: Optional[str] = None description: Optional[str] = None tools: Optional[List[ToolItem]] = None + config_schema: Optional[List[ConfigSchemaItem]] = None require_jssdk: Optional[bool] = None status: Optional[int] = None @@ -119,6 +133,7 @@ async def create_app( base_url=data.base_url, description=data.description, tools=json.dumps([t.model_dump() for t in data.tools], ensure_ascii=False) if data.tools else None, + config_schema=json.dumps([c.model_dump() for c in data.config_schema], ensure_ascii=False) if data.config_schema else None, require_jssdk=1 if data.require_jssdk else 0, status=1 ) @@ -150,6 +165,13 @@ async def update_app( else: update_data['tools'] = None + # 处理 config_schema JSON + if 'config_schema' in update_data: + if update_data['config_schema']: + update_data['config_schema'] = json.dumps([c.model_dump() if hasattr(c, 'model_dump') else c for c in update_data['config_schema']], ensure_ascii=False) + else: + update_data['config_schema'] = None + # 处理 require_jssdk if 'require_jssdk' in update_data: update_data['require_jssdk'] = 1 if update_data['require_jssdk'] else 0 @@ -259,6 +281,21 @@ async def get_app_tools( return tools +@router.get("/{app_code}/config-schema") +async def get_app_config_schema( + app_code: str, + user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """获取应用的配置项定义(用于租户订阅时渲染表单)""" + app = db.query(App).filter(App.app_code == app_code).first() + if not app: + raise HTTPException(status_code=404, detail="应用不存在") + + config_schema = json.loads(app.config_schema) if app.config_schema else [] + return config_schema + + def format_app(app: App) -> dict: """格式化应用数据""" return { @@ -268,6 +305,7 @@ def format_app(app: App) -> dict: "base_url": app.base_url, "description": app.description, "tools": json.loads(app.tools) if app.tools else [], + "config_schema": json.loads(app.config_schema) if app.config_schema else [], "require_jssdk": bool(app.require_jssdk), "status": app.status, "created_at": app.created_at, diff --git a/frontend/src/views/apps/index.vue b/frontend/src/views/apps/index.vue index 91c6a14..92b11d7 100644 --- a/frontend/src/views/apps/index.vue +++ b/frontend/src/views/apps/index.vue @@ -1,6 +1,7 @@