# 架构规范 **状态**:已确定 **最后更新**:2026-01-28 --- ## 一、后端架构规范 ### 1.1 分层架构 ``` API层 (internal/api/) ↓ Service层 (internal/service/) ↓ Repository层 (internal/storage/repository/) ↓ Infrastructure层 (internal/dbclient/) ``` ### 1.2 职责划分 #### API层 - **职责**:暴露给前端的接口 - **约束**:只负责参数验证和调用Service - **文件命名**:`{功能}_api.go` #### Service层 - **职责**:业务逻辑处理 - **约束**:不直接访问数据库,通过Repository - **文件命名**:`{功能}_service.go` #### Repository层 - **职责**:数据访问 - **约束**:只负责CRUD操作,不包含业务逻辑 - **文件命名**:`{模型}_repo.go` #### Infrastructure层 - **职责**:基础设施(数据库客户端、连接池等) - **约束**:提供统一的接口,隐藏实现细节 --- ## 二、前端架构规范 ### 2.1 组件结构 ``` Views (views/db-cli/) ↓ Components (components/) ↓ Composables (composables/) ↓ Types (types/) ``` ### 2.2 职责划分 #### Views - **职责**:页面级组件,负责布局和状态协调 - **约束**:不包含具体业务逻辑 #### Components - **职责**:可复用组件 - **约束**:组件应该是无状态的(通过props接收数据) #### Composables - **职责**:状态管理和业务逻辑 - **约束**:可复用的逻辑封装 #### Types - **职责**:TypeScript类型定义 - **约束**:所有类型定义集中管理 --- ## 三、事件系统规范 ### 3.1 事件命名 - **格式**:`<组件>-<动作>` 或 `<功能>-<动作>` - **示例**:`connection-select`、`table-structure` ### 3.2 事件参数 - **格式**:对象格式,不使用多个参数 - **类型**:所有事件都有TypeScript类型定义 - **位置**:`types/events.ts` ### 3.3 事件处理 - **位置**:在父组件中处理 - **职责**:调用相应的composable方法 --- ## 四、架构设计美学原则 ### 4.1 参数数量约束(最高优先级) **原则**:方法参数不得超过 3 个,超过必须使用结构体/对象封装。 **违反示例**(不可接受): ```go // ❌ 9个参数,完全不可接受 func SaveDbConnection(id uint, name, dbType, host string, port int, username, password, database, options string) error ``` **正确示例**: ```go // ✅ 使用结构体封装 type SaveConnectionRequest struct { ID uint Name string Type string Host string Port int Username string Password string Database string Options string } func SaveDbConnection(req SaveConnectionRequest) error ``` **前端同理**: ```typescript // ❌ 参数过多 function saveConnection(id: number, name: string, type: string, host: string, port: number, username: string, password: string, database: string, options: string) // ✅ 使用对象封装 interface SaveConnectionRequest { id: number name: string type: string host: string port: number username: string password: string database: string options: string } function saveConnection(req: SaveConnectionRequest) ``` ### 4.2 依赖注入美学 **原则**:减少手动依赖注入,优先使用自动依赖获取。 **当前问题**: ```typescript // 需要手动注入依赖 const { executeSQL } = useSqlExecution(resultState, messageLog) ``` **优化方向**: ```typescript // 内部自动获取依赖(通过 provide/inject 或全局状态) const { executeSQL } = useSqlExecution() ``` ### 4.3 代码简洁性 **原则**:代码应该简洁、直接、易于理解。 **要求**: - 避免过度抽象 - 减少中间层 - 直接表达意图 - 移除不必要的包装 ### 4.4 一致性原则 **原则**:相同功能在不同实现中保持一致的命名和结构。 **要求**: - 统一的错误处理方式 - 统一的命名规范 - 统一的数据结构 - 统一的接口风格 ### 4.5 可组合性 **原则**:Composables 应该可以独立使用,也可以组合使用。 **要求**: - Composables 之间依赖关系清晰 - 支持按需组合 - 避免循环依赖 - 提供清晰的组合模式 --- ## 五、架构优化建议 ### 5.1 后端 API 层优化(高优先级) **问题**:API 方法参数过多,违反设计美学。 **优化方案**: 1. 所有 API 方法参数超过 3 个时,必须使用请求结构体 2. 统一请求/响应结构体命名:`{Action}Request` / `{Action}Response` 3. 结构体定义放在对应的 API 文件中 **示例**: ```go // connection_api.go type SaveConnectionRequest struct { ID uint `json:"id"` Name string `json:"name"` Type string `json:"type"` Host string `json:"host"` Port int `json:"port"` Username string `json:"username"` Password string `json:"password"` Database string `json:"database"` Options string `json:"options"` } func (api *ConnectionAPI) SaveDbConnection(req SaveConnectionRequest) error { conn := &models.DbConnection{ ID: req.ID, Name: req.Name, Type: req.Type, Host: req.Host, Port: req.Port, Username: req.Username, Password: req.Password, Database: req.Database, Options: req.Options, } return api.connService.SaveConnection(conn) } ``` ### 5.2 前端 Composables 依赖优化(中优先级) **问题**:需要手动注入依赖,使用不够优雅。 **优化方案**: 1. 使用 `provide/inject` 或全局状态管理依赖 2. Composables 内部自动获取依赖 3. 保持向后兼容,支持手动注入 **示例**: ```typescript // 使用 provide/inject const resultState = useResultState() const messageLog = useMessageLog() provide('resultState', resultState) provide('messageLog', messageLog) // useSqlExecution 内部自动获取 export function useSqlExecution() { const resultState = inject>('resultState') const messageLog = inject>('messageLog') // ... } ``` ### 5.3 Service 层验证逻辑提取(中优先级) **问题**:验证逻辑分散在 Service 方法中,代码重复。 **优化方案**: 1. 创建独立的验证器(Validator) 2. 统一验证错误格式 3. 可复用的验证规则 **示例**: ```go // validator/connection_validator.go type ConnectionValidator struct{} func (v *ConnectionValidator) ValidateSave(conn *models.DbConnection) error { if conn.Name == "" { return fmt.Errorf("连接名称不能为空") } if conn.Type == "" { return fmt.Errorf("数据库类型不能为空") } if conn.Host == "" { return fmt.Errorf("主机地址不能为空") } return nil } ``` ### 5.4 Composables 组合优化(低优先级) **问题**:`index.vue` 中 composables 较多,可以进一步抽象。 **优化方案**: 1. 创建 `useDbCli` composable 作为统一入口 2. 内部组合所有相关 composables 3. 提供简洁的 API **示例**: ```typescript // composables/useDbCli.ts export function useDbCli() { const connection = useDbConnection() const editor = useEditorState() const result = useResultState() const message = useMessageLog() const sql = useSqlExecution(result, message) const structure = useStructureState() const structureEdit = useStructureEdit() return { connection, editor, result, message, sql, structure, structureEdit } } ``` --- ## 六、架构检查清单 ### 开发优先原则检查 - [ ] 是否使用了 Vue 的响应式系统管理状态? - [ ] 是否使用了模板引用而非 DOM 查询? - [ ] 是否在正确的时机执行操作(通过 `nextTick`、`requestAnimationFrame` 等)? - [ ] 是否移除了不必要的重试循环? - [ ] 是否移除了过多的条件检查和兜底逻辑? - [ ] 代码是否简洁直接,易于理解? - [ ] 是否避免了防御性编程模式? ### 后端检查 - [ ] API 方法参数不超过 3 个,超过使用结构体封装 - [ ] 所有请求/响应结构体命名统一 - [ ] Service 层验证逻辑清晰 - [ ] 错误处理统一 ### 前端检查 - [ ] Composables 依赖关系清晰 - [ ] 减少手动依赖注入 - [ ] 代码简洁直接 - [ ] 类型定义完善 ### 设计美学检查 - [ ] 参数数量符合约束(≤3) - [ ] 代码简洁易读 - [ ] 命名一致统一 - [ ] 结构清晰优雅 --- ## 四、数据流规范 ### 4.1 数据流向 ``` 用户操作 ↓ 组件事件 ↓ Composable方法 ↓ API调用 ↓ 后端Service ↓ Repository ↓ 数据库 ``` ### 4.2 状态管理 - **原则**:使用Composables管理状态 - **位置**:`composables/` 目录 - **命名**:`use{功能}State.ts` --- ## 五、约束条件 ### 5.1 后端约束 - 方法参数不超过3个 - 不返回 `RetResult` 类型 - 使用分层架构,职责分离 ### 5.2 前端约束 - 使用Arco基础样式 - 事件参数使用对象格式 - 所有事件有类型定义 --- ## 六、检查清单 ### 架构检查 - [ ] 分层架构清晰 - [ ] 职责分离明确 - [ ] 依赖方向正确 - [ ] 符合架构规范