开发指南
开发环境搭建
系统要求
- 操作系统: macOS / Windows / Linux
- Node.js: >= 18.0.0
- 包管理器: npm >= 9.0.0 或 pnpm >= 8.0.0
- Git: >= 2.30.0
推荐工具
- IDE: VSCode / WebStorm
- 浏览器: Chrome / Edge / Safari(最新版)
- 移动端调试: Chrome DevTools / Safari DevTools
项目架构
技术栈
| 层级 | 技术 |
|---|---|
| 前端框架 | Vue 3 + TypeScript |
| 状态管理 | Pinia |
| 路由 | Vue Router |
| UI 组件 | Ant Design Vue + 自研组件库 |
| 构建工具 | Vite |
| 移动端 | UniApp / Taro |
| 桌面端 | Electron |
| 服务端 | Java / Spring Boot |
| 数据库 | MySQL / Redis / MongoDB |
| 消息队列 | RabbitMQ / Kafka |
| AI 服务 | DreamingAI |
| IM 服务 | ImSky 天信IM |
目录结构
timioa/
├── apps/ # 应用层
│ ├── mobile/ # 移动端(UniApp)
│ ├── desktop/ # 桌面端(Electron)
│ ├── web/ # Web 端
│ └── miniapp/ # 小程序
├── packages/ # 共享包
│ ├── sdk/ # OA SDK
│ ├── ui/ # UI 组件库
│ ├── shared/ # 共享工具
│ └── types/ # 类型定义
├── server/ # 服务端
│ ├── gateway/ # API 网关
│ ├── workflow/ # 工作流服务
│ ├── im/ # IM 服务
│ ├── ai/ # AI 服务
│ └── user/ # 用户服务
├── docs/ # 文档
└── scripts/ # 脚本工具开发规范
代码规范
- 使用 ESLint + Prettier 进行代码格式化
- 遵循 Vue 3 组合式 API 风格
- TypeScript 严格模式启用
- 组件命名使用 PascalCase
- 函数命名使用 camelCase
Git 规范
类型(scope): 简短描述
详细描述(可选)
Footer(可选)类型说明:
feat: 新功能fix: 修复docs: 文档style: 格式refactor: 重构perf: 性能优化test: 测试chore: 构建/工具
示例:
feat(approval): 添加 AI 审批建议功能
- 支持审批内容智能识别
- 支持审批意见智能推荐
- 添加风险评估提示
Closes #123分支管理
main: 主分支,稳定版本develop: 开发分支feature/*: 功能分支hotfix/*: 紧急修复release/*: 发布分支
模块开发
SDK 开发
typescript
// packages/sdk/src/core/client.ts
export class TimiClient {
private ws: WebSocket
private options: ClientOptions
private eventEmitter: EventEmitter
constructor(options: ClientOptions) {
this.options = options
this.eventEmitter = new EventEmitter()
}
async connect(): Promise<void> {
this.ws = new WebSocket(this.options.wsUrl)
this.ws.onopen = () => this.eventEmitter.emit('connect')
this.ws.onmessage = (e) => this.handleMessage(e.data)
this.ws.onclose = () => this.eventEmitter.emit('disconnect')
}
async submitApproval(approval: Approval): Promise<void> {
return this.post('/api/approval/submit', approval)
}
async aiChat(message: string): Promise<AIResponse> {
return this.post('/api/ai/chat', { message })
}
}UI 组件开发
vue
<!-- packages/ui/src/components/ApprovalCard.vue -->
<template>
<div class="approval-card" :class="statusClass">
<div class="header">
<Avatar :src="applicant.avatar" />
<div class="info">
<div class="name">{{ applicant.name }}</div>
<div class="type">{{ approvalType }}</div>
</div>
<Tag :status="status" />
</div>
<div class="content">
<slot />
</div>
<div class="footer">
<slot name="actions" />
</div>
</div>
</template>
<script setup lang="ts">
interface Props {
applicant: User
approvalType: string
status: ApprovalStatus
}
const props = defineProps<Props>()
const statusClass = computed(() => `status-${props.status}`)
</script>页面开发
vue
<!-- apps/web/src/pages/approval/pending.vue -->
<template>
<div class="approval-pending-page">
<PageHeader title="待审批" />
<ApprovalList
:approvals="pendingApprovals"
@approve="handleApprove"
@reject="handleReject"
/>
<AISuggestion
v-if="currentApproval"
:approval="currentApproval"
@apply="applySuggestion"
/>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useApprovalStore } from '@/stores/approval'
const approvalStore = useApprovalStore()
const pendingApprovals = ref<Approval[]>([])
const currentApproval = ref<Approval | null>(null)
onMounted(async () => {
await approvalStore.loadPending()
pendingApprovals.value = approvalStore.pendingList
})
const handleApprove = async (id: string) => {
await approvalStore.approve(id)
}
const handleReject = async (id: string, reason: string) => {
await approvalStore.reject(id, reason)
}
const applySuggestion = (suggestion: AISuggestion) => {
console.log('Apply AI suggestion:', suggestion)
}
</script>调试技巧
Web 端调试
- Vue DevTools: 安装浏览器扩展
- Network: 查看 API 请求与 WebSocket 连接状态
- Console: 查看 SDK 日志输出
移动端调试
bash
# H5 调试
npm run dev:h5
# 微信小程序调试
npm run dev:mp-weixin
# APP 调试
npm run dev:app桌面端调试
bash
# 开发模式
npm run dev:desktop
# 调试主进程
npm run debug:main
# 调试渲染进程
npm run debug:renderer测试
单元测试
bash
# 运行所有测试
npm run test
# 运行指定模块测试
npm run test -- packages/sdk
# 覆盖率报告
npm run test:coverageE2E 测试
bash
# 运行 E2E 测试
npm run test:e2e
# headed 模式
npm run test:e2e -- --headed性能优化
前端优化
- 虚拟列表: 长审批列表使用虚拟滚动
- 懒加载: 路由级别代码分割与懒加载
- 缓存策略: 审批数据本地缓存,减少请求
- WebWorker: AI 数据分析放后台线程
服务端优化
- 连接池: 数据库连接池管理
- 缓存策略: Redis 缓存热点数据
- 消息队列: 审批通知异步处理
- 分库分表: 大数据量水平拆分
部署
Docker 部署
bash
# 构建镜像
docker build -t timioa:latest .
# 运行容器
docker run -d -p 8080:8080 timioa:latestKubernetes 部署
bash
# 应用配置
kubectl apply -f k8s/
# 查看状态
kubectl get pods -n timioa常见问题
Q: WebSocket 连接失败?
A: 检查:
- 服务端是否启动
- 防火墙是否放行端口
- Nginx 代理配置是否正确
Q: AI 服务调用失败?
A: 检查:
- AI 服务是否正常启动
- API Key 是否配置正确
- 网络连接是否正常
Q: 审批流程配置异常?
A: 检查:
- 流程设计是否完整
- 审批节点是否配置审批人
- 条件分支是否设置正确
