# 后端重构与环境隔离规划 ## 1. 技术锐评 (Technical Review) ### 1.1 架构层面 * **环境隔离缺失**:当前主要依赖在 `app.conf` 中手动注释/取消注释代码块来切换环境(如 MySQL 配置、认证地址)。这种方式极易出错,且难以在 CI/CD 流程中自动化。 * **硬编码泛滥**: * `utils/config.go` 中直接硬编码了生产环境 URL (`https://aqai.shudaodsj.com:22000`)。 * `controllers/` 下多个文件(`shudaooss.go`, `hazard.go`, `chroma.go` 等)硬编码了 IP 地址和端口(如 `172.16.17.52:8060`, `172.16.35.50:18080`)。 * 这导致代码与特定部署环境强耦合,本地开发和测试环境极易连接到错误的服务(如本地连上了生产库)。 * **部署差异**:由于配置散落在代码中,部署到新环境(如测试环境)需要修改源码并重新编译,违反了 "Build Once, Run Anywhere" 原则。 ### 1.2 代码层面 * **配置管理混乱**:没有统一的配置加载层。有的配置在 `app.conf`,有的在 `utils`,有的直接在 `controllers` 的常量或变量中。 * **代码位置不当**: * `views/` 目录下存在 `.vue` 文件 (`liushitest.vue`) 和测试 HTML 文件,这些是前端源码或临时测试文件,不应出现在 Go 后端项目的构建目录中。 * `chat.go` 被标记为已弃用但仍存在于项目中,造成维护困扰。 * **可测试性差**:由于依赖硬编码的外部服务地址,单元测试难以在隔离环境下运行(必须有网络且对应 IP 可达)。 ### 1.3 重构难度评估 * **成本**:**中等**。主要工作量在于全局搜索硬编码字符串并替换为配置读取逻辑。 * **风险**:**低**。只要严格遵循"只读配置,不改逻辑"的原则,业务逻辑不会受影响。主要风险在于遗漏某些隐蔽的硬编码值。 --- ## 2. 重构方案 (Refactoring Strategy) ### 2.1 核心原则 1. **单一数据源**:所有可变参数必须且只能在 `conf/app.conf` 中定义。代码中严禁出现 IP、端口、URL、密钥等字面量。 2. **环境无侵入**:代码不感知当前是 "dev" 还是 "prod",它只管读取配置。环境差异由 `app.conf` 的内容决定。 3. **本地热重载**:利用 Beego 框架自带的 `bee run` 命令实现本地开发热重载。 ### 2.2 配置文件管理策略 根据您的要求,采用 **"单文件 + 模板"** 策略: 1. **`conf/app.conf`**: * **加入 `.gitignore`**。 * 这是实际生效的配置文件,由开发者/运维在部署时手动创建和维护。 2. **`conf/app.conf.example`** (新增): * **加入版本控制 (Git)**。 * 包含所有必要的配置项 Key,Value 留空或设为默认占位符。 * 包含详细的注释,说明每个配置项在不同环境(本地、测试、生产)应填写的典型值。 ### 2.3 目录结构调整建议 ```text shudao-go-backend/ ├── conf/ │ ├── app.conf (被 git 忽略,实际配置) │ └── app.conf.example (新增,配置模板,含所有环境说明) ├── utils/ │ └── config.go (增强,提供类型安全的配置读取方法) ├── controllers/ (移除硬编码,改为调用 utils.GetConfig) ├── views/ (清理 .vue 和测试 html) └── ... ``` --- ## 3. 执行批次 (Execution Batches) ### 第一批次:配置收拢与标准化 (Configuration Centralization) **目标**:消除代码中的硬编码,建立统一配置读取机制。 1. **创建配置模板 `conf/app.conf.example`**: * 整理所有散落在 `app.conf` 和代码中的配置项。 * 为 MySQL, Redis, OSS, YOLO, Chroma, DeepSeek, Qwen 等所有外部服务定义标准的 Key 命名(如 `oss_endpoint`, `yolo_base_url`)。 * 添加注释说明本地、测试、生产环境的推荐值。 2. **增强 `utils/config.go`**: * 封装 Beego 的 `AppConfig`,提供如 `GetString(key)`, `MustGetString(key)` 等方法,确保配置缺失时能快速报错(Fail Fast)。 * **修正**:修改 `GetProxyURL` 方法,不再硬编码域名,而是从配置读取 `base_url`。 3. **替换 Controller 硬编码**: * `controllers/shudaooss.go`: 替换 `ossEndpoint` 为配置读取。 * `controllers/hazard.go`: 替换 `yoloBaseURL` 为配置读取。 * `controllers/chroma.go`: 替换 `apiURL` 为配置读取。 * `controllers/chat.go`: 替换 `http://172.16.35.50:8000` 等硬编码地址。 ### 第二批次:代码清理与环境准备 (Cleanup & Environment Setup) **目标**:清理废弃代码和无关文件,确保项目纯净。 1. **清理前端残留**: * 删除 `views/liushitest.vue`。 * 移动或删除 `views/*.html` 测试文件(如果必须保留,移至 `tests/test_data/` 或类似目录,不要混在视图层)。 2. **处理弃用代码**: * 将 `controllers/chat.go` 和 `models/chat.go` 移动到 `_deprecated/` 目录(或直接删除,如果确认无用),并在文件名加 `_deprecated` 后缀,防止误引用。 * *注意:如果前端仍依赖某些接口路径,需确认微服务网关是否已接管这些路径。如果后端仍需保留接口定义但转发流量,需重写为代理模式(Proxy)。鉴于您提到"前端有用",建议先保留文件但清理内部逻辑,或确认前端调用地址已变更。* 3. **本地热重载验证**: * 确认开发环境安装了 `bee` 工具。 * 使用 `bee run` 启动项目,验证修改文件后是否自动重新编译。 ### 第三批次:验证与文档 (Verification) **目标**:确保重构后各环境功能正常。 1. **本地环境验证**: * 复制 `app.conf.example` 为 `app.conf`。 * 配置为本地参数(连接本地/开发库)。 * 启动服务,验证基础接口。 2. **测试/生产环境验证指南**: * 编写 `DEPLOY.md`,说明在新环境部署时如何准备 `app.conf`。 --- ## 4. 风险点与检查清单 (Risks & Checklist) * [ ] **风险**:`app.conf` 中的 Key 命名变更导致旧代码读取失败。 * **对策**:在 `utils/config.go` 中使用 `MustGet` 类方法,如果配置缺失直接 Panic,避免静默失败。 * [ ] **风险**:OSS 或第三方服务的 URL 拼接逻辑错误(如多加了 `/`)。 * **对策**:统一使用 `strings.TrimRight(url, "/")` 处理配置项。 * [ ] **风险**:`chat.go` 删除导致前端旧版本报错。 * **对策**:暂时保留 `chat.go` 文件,但将其内部逻辑标记为 `Deprecated`,并确认前端请求是否已路由到微服务。 ## 5. 附录:app.conf.example 预览 ```ini appname = shudao-chat-go httpport = 22001 runmode = dev # ========================================== # 基础配置 (Base Config) # ========================================== # 本地: https://127.0.0.1:22000 # 生产: https://aqai.shudaodsj.com:22000 base_url = "https://aqai.shudaodsj.com:22000" # ========================================== # 数据库配置 (Database) # ========================================== mysql_user = "root" mysql_pass = "password" mysql_urls = "127.0.0.1" mysql_port = "3306" mysql_db = "shudao" # ========================================== # 外部服务 (External Services) # ========================================== # 认证服务 auth_api_url = "http://127.0.0.1:28004/api/auth/verify" # OSS 配置 oss_endpoint = "http://172.16.17.52:8060" oss_access_key = "..." oss_secret_key = "..." oss_bucket = "gdsc-ai-aqzs" # 模型服务 deepseek_api_url = "https://api.deepseek.com" deepseek_api_key = "..." yolo_base_url = "http://172.16.35.50:18080" ```