Skip to content

fix: 修复后端启动失败与前端构建失败,修正 README 许可证描述 - #17

Open
weed33834 wants to merge 2 commits into
jaychouchannel:mainfrom
weed33834:fix/missing-deps-and-build
Open

fix: 修复后端启动失败与前端构建失败,修正 README 许可证描述#17
weed33834 wants to merge 2 commits into
jaychouchannel:mainfrom
weed33834:fix/missing-deps-and-build

Conversation

@weed33834

@weed33834 weed33834 commented Aug 8, 2026

Copy link
Copy Markdown

问题概述

按 README Quick Start 从零搭建环境时,后端和前端均无法正常启动/构建,存在多个独立问题。本次 PR 同时修复了 2 个 open issues 和若干代码质量问题。

问题详情与修复

1. 后端无法启动 — 缺少 pydantic-settings 依赖

backend/app/config.py:7 使用了 from pydantic_settings import BaseSettings,但 pydantic-settings 是独立包,不被 fastapi / pydantic 传递依赖。requirements.txt 中遗漏了此项,导致按文档执行 pip install -r requirements.txt 后启动 uvicorn app.main:app 直接 ModuleNotFoundError

修复requirements.txt 新增 pydantic-settings>=2.5.0

2. 前端生产构建失败 — 缺少 vite-env.d.ts

frontend/src/ 下缺少标准的 Vite 类型声明文件 vite-env.d.tsmain.tsximport "./index.css"tsc -b 阶段报错 TS2882: Cannot find module or type declarations for side-effect import of ./index.cssnpm run build 退出码 1。

修复:新增 frontend/src/vite-env.d.ts,内容为 /// <reference types="vite/client" />

3. ModelConfig.tsx 在渲染体中调用 load()(React 反模式)

frontend/src/pages/ModelConfig.tsx:40 直接在组件函数体中执行 if (...) load()load() 内部调用 setLoading(true) 等 setState。这在 React 渲染期间触发状态更新,会导致控制台告警,且 StrictMode 双渲染会发起重复请求。其他页面(History、Templates)均正确使用 useEffect

修复:改为 useEffect(() => { load(); }, [])

4. README License 段与实际 LICENSE 文件矛盾

README.md(及 zh-CN / zh-TW 版本)的 License 段声称"未声明开源许可证,保留所有权利",但根目录 LICENSE 实为 MIT License(Copyright 2026 Jay Chou)。这一矛盾会误导用户以为项目不可自由使用。

修复:将三份 README 的 License 段改为正确的 MIT 说明,并链接到 LICENSE 文件。

5. Issue #15 — 模板切换覆盖用户自定义 system prompt

Generate.tsx 存在两个 useEffect 依赖 templateId / tpl,切换模板时无条件 setSystemOverride(tpl.system_prompt),用户手动修改的 system prompt 被清空。

修复:合并为单个 useEffect,引入 tplSystemPrompt 状态跟踪模板默认值。仅当 systemOverride 为空或仍等于上一个模板默认值时才跟随模板更新;用户自定义后切换模板不再覆盖。

6. Issue #14 — History 页面不渲染 SVG 预览

后端 GET /api/history/{id}/svg 已实现(backend/app/routes/history.py:27),但前端 api.ts 缺少对应方法,History.tsx 也未调用。

修复

  • api.ts 新增 getHistorySvg: (id) => req<{svg:string}>(\/api/history/${id}/svg`)`
  • History.tsx 点击记录时调用该 API,在右侧代码区下方新增 SVG 预览面板(复用 Generate 页的 dangerouslySetInnerHTML 方案,SVG 已过后端 sanitize_svg 消毒)

7. 死代码清理

  • 删除 frontend/src/components/SetupBanner.tsx:全仓库 grep 仅此一处定义,无任何 import 引用,且组件本身也只是静态文案,未真正检测后端 ONE_ENCRYPT_KEY 状态
  • 删除 backend/app/providers/factory.pyfrom_db_row 函数:grep 确认仅定义从未被调用,generate.py 用自建的 _load_provider 直接调 make_provider
  • templates.py 种子日志从 print 改为 logging.warning,与 main.py 的 logging 配置一致

8. 仓库卫生 — 清理被提交的构建产物

.gitignore 未忽略 *.tsbuildinfo,导致 tsconfig.tsbuildinfotsconfig.node.tsbuildinfovite.config.d.tsvite.config.js 被 git 跟踪。

修复.gitignore 补充相关规则,git rm --cached 移除已提交的构建产物。

验证

  • 后端:安装 pydantic-settingsfrom app.config import Settings 导入成功
  • 前端:npx tsc --noEmit 编译通过,无类型错误
  • 改动不涉及任何破坏性 API 变更

项目设计很完善,安全方面(Fernet 加密、SVG 消毒、沙箱执行)做得很到位。这次修复的几个问题主要是开箱即用层面和前端体验上的缺失,希望能帮到其他新入手的同学。如果有什么需要调整的地方请告知,也欢迎关注交流 🙌

- backend/requirements.txt: 补充缺失的 pydantic-settings 依赖
  (config.py 依赖 BaseSettings,但该包未被 fastapi/pydantic 传递依赖)
- frontend/src/vite-env.d.ts: 新增 Vite 类型声明文件,修复
  tsc 报错 TS2882(side-effect import of './index.css')
- frontend/src/pages/ModelConfig.tsx: 将渲染体内直接调用 load()
  改为 useEffect,消除 React 反模式(渲染期 setState)
- README.md / README.zh-CN.md / README.zh-TW.md: 修正 License 段
  描述,与实际 MIT LICENSE 文件保持一致
Issue jaychouchannel#15: Generate.tsx 两个 useEffect 在模板切换时无条件覆盖
systemOverride,用户手改的 system prompt 被清空。改为仅在内容
为空或仍为模板默认值时才跟随模板,用户自定义后不再被覆盖。

Issue jaychouchannel#14: History 页面只展示代码不渲染 SVG 预览。后端
/api/history/{id}/svg 已实现,前端 api.ts/History.tsx 未对接。
新增 getHistorySvg API,点击记录时加载 SVG 并在右侧展示。

其他清理:
- 删除从未被引用的 SetupBanner.tsx 组件
- 删除从未被调用的 factory.from_db_row 函数
- templates.py 种子日志从 print 改为 logging.warning
- .gitignore 补充 *.tsbuildinfo / vite.config.d.ts / vite.config.js
- git rm --cached 清理已提交的构建产物
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant