本文引用的文件
本规范面向AI有声书生成平台的前后端团队,统一TypeScript/JavaScript编码风格、Vue3组件开发规范、命名约定与文件组织结构,并给出数据库模型规范、代码格式化工具配置建议、Git提交信息规范以及代码审查检查清单。目标是提升代码一致性、可维护性与协作效率。
构建与脚本在各自package.json中定义,类型检查与路径别名在tsconfig中配置。
graph TB
subgraph "后端"
APP["应用入口<br/>server/src/app.ts"]
ROUTER["路由注册<br/>各模块控制器"]
MWARE["中间件<br/>错误处理/安全/限流/日志"]
SRV["服务层<br/>业务逻辑封装"]
PRISMA["数据模型<br/>server/prisma/schema.prisma"]
end
subgraph "前端"
MAIN["应用入口<br/>my-uniapp-vue3/src/main.ts"]
STORE["状态管理<br/>Pinia Store"]
COMP["组件库<br/>my-uniapp-vue3/src/components/*.vue"]
PAGE["页面路由<br/>my-uniapp-vue3/src/pages/*.vue"]
end
APP --> ROUTER --> SRV --> PRISMA
APP --> MWARE
MAIN --> STORE
MAIN --> COMP
MAIN --> PAGE
图表来源
章节来源
章节来源
后端采用“中间件 -> 路由 -> 控制器 -> 服务 -> 数据库”的分层结构;前端采用“页面/组件 -> Store -> API工具”的分层结构。日志与错误处理贯穿全链路,确保可观测性与稳定性。
sequenceDiagram
participant C as "客户端"
participant R as "路由层<br/>控制器"
participant S as "服务层"
participant D as "数据库<br/>Prisma"
C->>R : "HTTP请求"
R->>R : "参数校验/权限检查"
R->>S : "调用业务逻辑"
S->>D : "查询/写入"
D-->>S : "结果集"
S-->>R : "聚合结果"
R-->>C : "统一响应结构"
图表来源
启动流程:初始化Sentry、连接数据库、测试Redis与存储、初始化WebSocket、启动队列处理器、优雅关闭。
flowchart TD
Start(["启动"]) --> InitSentry["初始化Sentry"]
InitSentry --> ConnectDB["连接数据库"]
ConnectDB --> TestRedis["测试Redis连接"]
TestRedis --> TestStorage["测试存储连接"]
TestStorage --> InitPlans["初始化订阅套餐"]
InitPlans --> InitWS["初始化WebSocket"]
InitWS --> Listen["监听端口"]
Listen --> Queue["初始化队列处理器"]
Queue --> Resume["恢复中断任务"]
Resume --> Graceful["注册优雅关闭"]
Graceful --> End(["运行中"])
图表来源
章节来源
示例:TTS控制器对文本长度、音色、配额进行严格校验,并支持异步生成与状态查询。
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "TTS控制器"
participant Svc as "TTS服务"
participant Sub as "订阅服务"
participant DB as "Prisma"
Client->>Ctrl : "POST /api/tts/generate"
Ctrl->>Ctrl : "参数校验/配额检查"
Ctrl->>Sub : "checkAudioQuota(userId, words)"
Sub-->>Ctrl : "允许/拒绝"
Ctrl->>Svc : "generateAudio(...)"
Svc->>DB : "持久化记录"
DB-->>Svc : "成功"
Svc-->>Ctrl : "{audioId}"
Ctrl-->>Client : "{code,message,data}"
图表来源
章节来源
字段约束:
时间戳、金额、枚举字符串状态、长文本字段使用合适类型与长度。
erDiagram
USER {
int id PK
string phone UK
string openid UK
string nickname
string avatar
int memberLevel
datetime memberExpireAt
int dailyUsage
string lastUsageDate
datetime createdAt
datetime updatedAt
}
BOOK {
int id PK
int userId
string title
string status
string genStage
datetime createdAt
datetime updatedAt
}
BOOKCHAPTER {
int id PK
int bookId FK
int parentId
int level
int number
string title
string status
string genStage
datetime updatedAt
}
ORDER {
int id PK
int userId FK
string orderNo UK
int planId FK
string productType
decimal amount
string status
datetime paidAt
datetime createdAt
datetime updatedAt
}
SUBSCRIPTIONPLAN {
int id PK
string name
int level
decimal priceMonthly
boolean isRecommended
int dailyGenerations
int monthlyMinutes
datetime createdAt
datetime updatedAt
}
PLAYRECORD {
int id PK
int userId FK
int chapterId FK
float progress
float duration
datetime updatedAt
}
FAVORITE {
int id PK
int userId FK
int bookId FK
datetime createdAt
}
COMMENT {
int id PK
int userId FK
int chapterId FK
string content
int rating
datetime createdAt
}
USERPREFERENCE {
int id PK
int userId UK
float playSpeed
string quality
string theme
string defaultVoiceId
int defaultVolume
boolean autoPlayNext
boolean wifiOnlyDownload
datetime createdAt
datetime updatedAt
}
AUDIORECORD {
int id PK
int userId
string audioId UK
string title
int wordCount
string voiceId
string audioUrl
int audioDuration
int audioSize
string status
datetime createdAt
datetime updatedAt
}
USER ||--o{ BOOK : "拥有"
BOOK ||--o{ BOOKCHAPTER : "包含"
USER ||--o{ ORDER : "下单"
SUBSCRIPTIONPLAN ||--o{ ORDER : "被购买"
USER ||--o{ PLAYRECORD : "播放"
BOOKCHAPTER ||--o{ PLAYRECORD : "被记录"
USER ||--o{ FAVORITE : "收藏"
BOOK ||--o{ FAVORITE : "被收藏"
USER ||--o{ COMMENT : "发表"
BOOKCHAPTER ||--o{ COMMENT : "被评论"
USER ||--o{ AUDIORECORD : "生成"
图表来源
章节来源
组件规范:Props明确、默认值合理、事件与生命周期管理清晰;组件职责单一、可复用性强。
classDiagram
class UserStore {
+token : string|null
+userInfo : UserInfo|null
+memberStatus : MemberStatus|null
+isLoggedIn : computed
+isMember : computed
+initUser()
+login(phone, code)
+sendCode(phone)
+fetchUserInfo()
+fetchMemberStatus()
+logout()
+updateUserInfo(info)
}
图表来源
章节来源
事件处理:对外暴露事件,内部通过Promise封装异步操作。
flowchart TD
Click["点击下载"] --> Check["检查下载状态"]
Check --> |已下载| End["结束"]
Check --> |未下载| RetryLoop["重试循环(最多N次)"]
RetryLoop --> Exec["执行下载"]
Exec --> Save["保存到本地"]
Save --> Success["成功提示"]
Exec --> Fail["失败处理"]
Fail --> RetryLoop
图表来源
章节来源
前端依赖:UniApp、Vue3、Pinia、类型与构建工具等。
graph LR
subgraph "后端依赖"
Koa["@koa/*"]
Prisma["@prisma/client"]
Lang["@langchain/*"]
Bull["bull"]
Redis["ioredis"]
Axios["axios"]
Winston["winston"]
Sentry["@sentry/*"]
end
subgraph "前端依赖"
UniApp["@dcloudio/uni-app*"]
Vue["vue"]
Pinia["pinia"]
Types["@dcloudio/types"]
end
图表来源
章节来源
章节来源
通过统一的编码规范、清晰的分层架构与完善的日志/错误处理体系,本项目能够在复杂业务场景下保持高可维护性与高可靠性。建议在后续迭代中持续完善代码审查与自动化质量门禁,保障交付质量。
章节来源