开发指南
开发环境搭建
系统要求
- 操作系统: 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 |
| 工作流引擎 | 自研流程引擎 |
| AI 能力 | OpenAI / 自研模型 |
| 服务端 | Node.js / Java |
| 数据库 | MySQL / Redis / Elasticsearch |
| 消息队列 | RabbitMQ / Kafka |
目录结构
aisolv/
├── apps/ # 应用层
│ ├── admin/ # 管理后台
│ ├── mobile/ # 移动端(UniApp)
│ ├── miniapp/ # 小程序
│ └── web/ # Web 端
├── packages/ # 共享包
│ ├── sdk/ # 工单 SDK
│ ├── ui/ # UI 组件库
│ ├── workflow/ # 工作流引擎
│ ├── shared/ # 共享工具
│ └── types/ # 类型定义
├── server/ # 服务端
│ ├── gateway/ # API 网关
│ ├── ticket/ # 工单服务
│ ├── workflow/ # 工作流服务
│ ├── ai/ # AI 服务
│ └── notify/ # 通知服务
├── docs/ # 文档
└── scripts/ # 脚本工具开发规范
代码规范
- 使用 ESLint + Prettier 进行代码格式化
- 遵循 Vue 3 组合式 API 风格
- TypeScript 严格模式启用
- 组件命名使用 PascalCase
- 函数命名使用 camelCase
Git 规范
类型(scope): 简短描述
详细描述(可选)
Footer(可选)类型说明:
feat: 新功能fix: 修复docs: 文档style: 格式refactor: 重构perf: 性能优化test: 测试chore: 构建/工具
示例:
feat(ticket): 添加 AI 智能建单功能
- 支持自然语言描述创建工单
- AI 自动提取关键信息
- 支持语音描述建单
Closes #123分支管理
main: 主分支,稳定版本develop: 开发分支feature/*: 功能分支hotfix/*: 紧急修复release/*: 发布分支
模块开发
SDK 开发
typescript
// packages/sdk/src/core/client.ts
export class AiSolvClient {
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 createTicketByAI(description: string): Promise<Ticket> {
const response = await this.http.post('/api/tickets/ai-create', {
description
})
return response.data
}
onTicketCreated(handler: TicketHandler): void {
this.eventEmitter.on('ticket:created', handler)
}
}工作流引擎开发
typescript
// packages/workflow/src/engine.ts
export class WorkflowEngine {
private nodes: Map<string, WorkflowNode>
private context: WorkflowContext
async execute(workflowId: string, ticket: Ticket): Promise<void> {
const workflow = await this.loadWorkflow(workflowId)
const startNode = workflow.getStartNode()
await this.executeNode(startNode, ticket)
}
private async executeNode(node: WorkflowNode, ticket: Ticket): Promise<void> {
switch (node.type) {
case 'approval':
await this.executeApprovalNode(node, ticket)
break
case 'condition':
await this.executeConditionNode(node, ticket)
break
case 'notification':
await this.executeNotificationNode(node, ticket)
break
}
}
}UI 组件开发
vue
<!-- packages/ui/src/components/TicketCard.vue -->
<template>
<div class="ticket-card" :class="`priority-${ticket.priority}`">
<div class="header">
<span class="id">#{{ ticket.id }}</span>
<Tag :color="statusColor">{{ ticket.status }}</Tag>
</div>
<div class="title">{{ ticket.title }}</div>
<div class="meta">
<span>{{ ticket.assignee }}</span>
<span>{{ formatTime(ticket.createdAt) }}</span>
</div>
</div>
</template>
<script setup lang="ts">
interface Props {
ticket: Ticket
}
defineProps<Props>()
const statusColor = computed(() => {
const map: Record<string, string> = {
open: 'blue',
in_progress: 'orange',
pending_review: 'purple',
completed: 'green',
closed: 'default'
}
return map[props.ticket.status] || 'default'
})
</script>页面开发
vue
<!-- apps/admin/src/pages/ticket/list.vue -->
<template>
<div class="ticket-list-page">
<PageHeader title="工单管理">
<template #extra>
<a-button type="primary" @click="showAICreate = true">
🤖 AI 建单
</a-button>
<a-button @click="showTemplateCreate = true">
📋 模板建单
</a-button>
</template>
</PageHeader>
<TicketFilter @change="handleFilterChange" />
<TicketTable
:tickets="tickets"
:loading="loading"
@row-click="handleRowClick"
/>
<AICreateModal v-model:visible="showAICreate" @created="refresh" />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useTicketStore } from '@/stores/ticket'
const ticketStore = useTicketStore()
const tickets = ref<Ticket[]>([])
const loading = ref(false)
const showAICreate = ref(false)
const showTemplateCreate = ref(false)
onMounted(async () => {
await ticketStore.loadTickets()
tickets.value = ticketStore.tickets
})
const refresh = async () => {
loading.value = true
await ticketStore.loadTickets()
tickets.value = ticketStore.tickets
loading.value = false
}
</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 test
# 运行指定模块测试
npm run test -- packages/sdk
# 覆盖率报告
npm run test:coverageE2E 测试
bash
# 运行 E2E 测试
npm run test:e2e
# headed 模式
npm run test:e2e -- --headed性能优化
前端优化
- 虚拟列表: 长工单列表使用虚拟滚动
- 按需加载: 工作流设计器等大组件按需加载
- 数据分页: 工单列表分页加载
- 缓存策略: 工单详情数据本地缓存
服务端优化
- 连接池: 数据库连接池管理
- 缓存策略: Redis 缓存热点数据
- 消息队列: 通知推送异步处理
- 索引优化: 工单查询索引优化
部署
Docker 部署
bash
# 构建镜像
docker build -t aisolv:latest .
# 运行容器
docker run -d -p 8080:8080 aisolv:latestKubernetes 部署
bash
# 应用配置
kubectl apply -f k8s/
# 查看状态
kubectl get pods -n aisolv常见问题
Q: AI 建单不准确?
A: 检查:
- AI 模型配置是否正确
- 描述信息是否足够清晰
- 工单模板字段映射是否正确
Q: 工作流执行异常?
A: 检查:
- 流程节点配置是否完整
- 条件分支表达式是否正确
- 审批人/处理人是否已配置
Q: 通知推送失败?
A: 检查:
- 通知渠道配置是否正确
- 通知模板是否已设置
- 用户通知偏好是否开启