# 情绪博物馆Web端重构计划
## 1. 重构概述
### 1.1 重构目标
基于前端技术方案Augment.md,使用最新的Vue3+TypeScript技术栈重构情绪博物馆Web端,在保持所有现有功能、页面布局、样式和用户体验完全一致的前提下,提升代码质量、性能和可维护性。
### 1.2 重构原则
- **功能一致性**:确保所有现有功能完全保留
- **视觉一致性**:保持所有页面布局、样式、图片完全一致
- **用户体验一致性**:保持所有交互流程和用户体验不变
- **数据一致性**:保持所有API接口和数据流不变
- **渐进式重构**:分阶段进行,确保每个阶段都可独立测试
### 1.3 技术栈升级
- **Vue**: 2.x → 3.4.21 (最新稳定版)
- **TypeScript**: 无 → 5.4.2 (最新稳定版)
- **构建工具**: Vite 5.1.6 (更好的构建性能)
- **UI框架**: Element Plus 2.6.1 (更好的Vue3支持)
- **样式框架**: Tailwind CSS 3.4.1 + @tailwindcss/forms + @tailwindcss/typography
- **状态管理**: Pinia 2.1.7 (Vue3官方推荐)
- **路由**: Vue Router 4.3.0 (最新稳定版)
- **HTTP客户端**: Axios 1.6.8 (最新稳定版)
- **WebSocket**: @stomp/stompjs 7.1.1 (原生WebSocket,支持Token认证)
- **数据可视化**: ECharts 5.5.0 + vue-echarts 6.7.3
- **工具库**: VueUse 10.9.0 + Day.js 1.11.10 + Lodash-es 4.17.21
## 2. 重构阶段规划
### 第一阶段:项目初始化与基础架构 (1-2周)
#### 2.1 项目初始化
- [ ] 创建新的Vue3+TypeScript项目
- [ ] 配置Vite 5.1.6构建工具
- [ ] 安装和配置核心依赖包
- [ ] 设置TypeScript 5.4.2配置
- [ ] 配置ESLint 8.57.0和Prettier 3.2.5
- [ ] 配置unplugin-auto-import自动导入
- [ ] 配置unplugin-vue-components组件自动导入
- [ ] 设置Git仓库和分支策略
- [ ] 配置Husky和lint-staged
#### 2.2 基础架构搭建
- [ ] 配置路由系统 (Vue Router 4.3.0)
- [ ] 配置状态管理 (Pinia 2.1.7)
- [ ] 配置HTTP客户端 (Axios 1.6.8)
- [ ] 配置WebSocket服务 (@stomp/stompjs 7.1.1,原生WebSocket)
- [ ] 配置多环境变量管理 (local/dev/test/prod)
- [ ] 配置Tailwind CSS 3.4.1样式系统
- [ ] 配置Element Plus 2.6.1 UI组件库
- [ ] 配置ECharts 5.5.0数据可视化
- [ ] 配置VueUse 10.9.0工具库
- [ ] 配置PWA支持 (vite-plugin-pwa)
#### 2.3 工具函数和类型定义
- [ ] 创建HTTP请求工具 (utils/request.ts)
- [ ] 创建WebSocket工具类 (utils/websocket.ts,支持Token认证)
- [ ] 创建存储工具 (utils/storage.ts)
- [ ] 创建格式化工具 (utils/format.ts)
- [ ] 创建验证工具 (utils/validation.ts)
- [ ] 定义API类型 (types/api.ts)
- [ ] 定义用户类型 (types/user.ts)
- [ ] 定义聊天类型 (types/chat.ts)
- [ ] 定义日记类型 (types/diary.ts)
- [ ] 定义全局类型 (types/global.d.ts)
- [ ] 创建API接口定义 (api/auth.ts, api/chat.ts, api/diary.ts, api/user.ts)
- [ ] 创建组合式API (composables/useAuth.ts, useChat.ts, useWebSocket.ts)
- [ ] 配置全局组件注册
### 第二阶段:核心页面重构 (3-4周)
#### 2.4 认证页面重构
- [ ] **登录页面** (/login)
- 实现POST /auth/login用户登录接口
- 实现GET /auth/captcha获取验证码接口
- 实现POST /auth/oauth/login第三方登录接口
- 保持现有UI布局和样式完全一致
- 保持验证码功能和第三方登录功能
- 保持错误提示和交互逻辑
- 升级到Vue3 Composition API + TypeScript
- 使用Pinia管理认证状态
- [ ] **注册页面** (/register)
- 实现POST /auth/register用户注册接口
- 实现GET /auth/captcha获取验证码接口
- 保持现有UI布局和样式完全一致
- 保持表单验证逻辑和验证码功能
- 保持注册成功自动登录流程
- 使用@vuelidate/core进行表单验证
- [ ] **认证相关组件和状态管理**
- UserDropdown组件 (Element Plus重构)
- UserAvatar组件 (支持头像上传)
- 认证状态管理 (stores/auth.ts)
- Token自动刷新机制
- 路由守卫实现
#### 2.5 首页重构
- [ ] **首页** (/)
- 保持现有UI布局和样式完全一致
- 保持导航栏样式和交互
- 保持产品介绍内容
- 保持响应式设计
- 保持动画效果
#### 2.6 聊天功能重构
- [ ] **AI对话页面** (/chat)
- 实现WebSocket /ws/chat实时对话连接
- 实现POST /conversation创建会话接口
- 实现GET /conversation/user/{userId}获取用户会话接口
- 实现DELETE /conversation/{sessionId}删除会话接口
- 保持现有UI布局和样式完全一致
- 保持消息气泡样式和输入框交互
- 升级到原生WebSocket + STOMP (支持Token认证)
- 实现自动重连、心跳检测机制
- 使用composables/useChat.ts管理聊天逻辑
- 支持文本、图片、表情、文件消息类型
- [ ] **聊天历史页面** (/chat-history)
- 实现GET /conversation/user/{userId}获取用户会话接口
- 实现GET /message/user/page分页获取消息接口
- 实现POST /message/user/search搜索用户消息接口
- 实现POST /message/user/recent获取最近消息接口
- 保持现有UI布局和样式完全一致
- 保持历史记录展示、搜索功能、分页功能
- 使用虚拟滚动优化大量消息展示
- [ ] **聊天相关组件和状态管理**
- ChatHistoryModal组件 (Element Plus重构)
- MessageBubble消息气泡组件
- ChatInput输入框组件 (支持多媒体)
- 聊天状态管理 (stores/chat.ts)
- WebSocket连接状态管理
- 离线消息缓存和同步机制
### 第三阶段:功能页面重构 (3-4周)
#### 2.7 日记功能重构
- [ ] **情绪日记页面** (/diary)
- 实现POST /diary-post/publish发布日记接口
- 实现GET /diary-post/user/{userId}/page获取用户日记接口
- 保持现有UI布局和样式完全一致
- 保持日记发布功能和AI自动点评功能
- 保持日记列表展示和分页功能
- 使用@tiptap/vue-3实现富文本编辑
- 支持图片上传和表情插入
- 实现日记草稿保存功能
#### 2.8 个人中心重构
- [ ] **个人仪表盘** (/personal-dashboard)
- 实现GET /user/profile获取用户资料接口
- 实现GET /user/growth-stats获取成长数据接口
- 保持现有UI布局和样式完全一致
- 保持用户信息展示和成长数据展示
- 使用ECharts 5.5.0重构统计图表
- 实现情绪趋势图、雷达图等可视化
- 支持数据导出功能 (PDF、Excel)
- [ ] **个人资料页面** (/profile)
- 实现GET /user/profile获取用户资料接口
- 实现PUT /user/profile更新用户资料接口
- 实现POST /user/avatar/upload上传头像接口
- 实现PUT /user/password修改密码接口
- 实现邮箱和手机验证接口
- 保持现有UI布局和样式完全一致
- 保持信息编辑、头像上传、密码修改功能
- 使用cropperjs实现头像裁剪功能
- 使用@vuelidate/core进行表单验证
#### 2.9 分析功能重构
- [ ] **情绪分析页面** (/analysis)
- 实现情绪数据分析接口 (开发中)
- 保持现有UI布局和样式完全一致
- 使用ECharts实现情绪趋势图、雷达图
- 使用@antv/g2实现高级数据可视化
- 保持图表展示和交互功能
- 支持时间范围筛选和数据导出
### 第四阶段:其他页面重构 (2-3周)
#### 2.10 扩展功能页面
- [ ] **人生里程碑** (/life-milestones)
- 展示用户重要事件和成就
- 使用时间轴组件展示里程碑
- 支持里程碑添加、编辑、删除
- [ ] **人生轨迹** (/life-trajectory)
- 可视化用户成长轨迹
- 使用交互式图表展示成长路径
- 支持轨迹数据分析和导出
- [ ] **消息中心** (/messages)
- 系统消息和AI消息通知
- 消息分类和状态管理
- 支持消息标记和批量操作
- [ ] **设置页面** (/settings)
- 账号设置和隐私设置
- 通知设置和主题设置
- 数据导出和账号注销
#### 2.11 工具和辅助页面
- [ ] **话题追踪** (/topic-tracker)
- 追踪关注的话题和趋势
- 话题订阅和推荐功能
- [ ] **情绪管理** (/emotion)
- 情绪记录和管理工具
- 情绪调节建议和技巧
- [ ] **情绪地图** (/map)
- 情绪地理分布可视化
- 基于地理位置的情绪分析
- [ ] **社交分享** (/social)
- 分享内容到社交平台
- 社交媒体集成和管理
#### 2.12 系统页面
- [ ] **调试页面** (/debug)
- 开发调试工具和信息
- 系统状态监控
- [ ] **错误页面** (/404, /403)
- 友好的错误提示页面
- 错误日志收集和上报
### 第五阶段:优化与测试 (2-3周)
#### 2.13 性能优化
- [ ] **代码分割优化**
- 路由级别懒加载 (Vue Router动态导入)
- 组件级别懒加载 (defineAsyncComponent)
- 第三方库按需加载 (Tree-shaking)
- 使用rollup-plugin-visualizer分析包体积
- [ ] **资源优化**
- 图片懒加载 (Intersection Observer API)
- 图片格式优化 (WebP、响应式图片)
- 使用vite-plugin-compression启用Gzip压缩
- CDN资源配置和缓存策略
- [ ] **运行时优化**
- 虚拟滚动 (大量数据列表)
- 防抖和节流优化
- 内存泄漏检测和修复
- WebSocket连接池优化
#### 2.14 测试与验证
- [ ] **单元测试** (Vitest 1.4.0)
- 组件测试 (@vue/test-utils 2.4.5)
- 工具函数测试
- API接口测试
- 状态管理测试 (Pinia)
- 目标覆盖率 > 80%
- [ ] **集成测试**
- WebSocket连接测试
- 认证流程测试
- 文件上传测试
- 数据可视化测试
- [ ] **E2E测试** (Cypress 13.7.1)
- 用户注册登录流程
- AI对话功能测试
- 日记发布流程测试
- 个人资料编辑测试
- [ ] **兼容性和性能测试**
- 多浏览器兼容性测试
- 移动端响应式测试
- 性能指标监控 (Web Vitals)
- 错误监控 (Sentry 7.108.0)
#### 2.15 文档和部署
- [ ] **技术文档**
- API接口文档
- 组件使用文档
- 开发规范文档
- 故障排除文档
- [ ] **部署配置**
- Docker容器化部署
- CI/CD流程配置
- 多环境部署脚本
- 监控和日志配置
- [ ] **用户文档**
- 功能使用手册
- 常见问题解答
- 更新日志维护
## 3. 详细重构指南
### 3.1 页面重构标准流程
#### 步骤1:分析现有页面
1. **UI分析**:截图记录当前页面布局
2. **功能分析**:梳理所有交互功能
3. **API分析**:确认所有接口调用
4. **样式分析**:提取所有CSS样式
5. **图片资源**:收集所有图片和图标
#### 步骤2:创建新页面结构
```typescript
// pages/chat/index.vue
```
### 3.2 样式迁移策略
#### 3.2.1 Tailwind CSS迁移
```css
/* 原有CSS */
.chat-message {
background: #f0f0f0;
border-radius: 8px;
padding: 12px;
margin: 8px 0;
}
/* 迁移到Tailwind */
```
### 3.3 WebSocket重构
#### 3.3.1 原生WebSocket + STOMP实现
```typescript
// utils/websocket.ts
import { Client } from '@stomp/stompjs'
import { envConfig } from '@/config/env'
export class WebSocketService {
private client: Client
private connected = false
private reconnectAttempts = 0
private maxReconnectAttempts = 5
private currentToken = ''
private tokenExpiredCallback?: () => void
constructor(onTokenExpired?: () => void) {
this.tokenExpiredCallback = onTokenExpired
this.client = new Client({
// 使用原生WebSocket,支持Token认证
brokerURL: `${envConfig.wsBaseUrl}/ws`,
// 心跳检测
heartbeatIncoming: 4000,
heartbeatOutgoing: 4000,
// 重连配置
reconnectDelay: 5000,
// 调试模式
debug: envConfig.debug ? console.log : undefined,
onConnect: () => {
this.connected = true
this.reconnectAttempts = 0
console.log('WebSocket连接成功')
},
onDisconnect: () => {
this.connected = false
console.log('WebSocket连接断开')
},
onStompError: (frame) => {
console.error('STOMP错误:', frame)
this.handleStompError(frame)
},
// WebSocket连接前的配置
beforeConnect: () => {
if (this.currentToken) {
this.client.configure({
connectHeaders: {
Authorization: `Bearer ${this.currentToken}`,
'X-Requested-With': 'XMLHttpRequest'
}
})
}
}
})
}
// 连接WebSocket
connect(token: string) {
this.currentToken = token
this.client.configure({
connectHeaders: {
Authorization: `Bearer ${token}`,
'X-Requested-With': 'XMLHttpRequest'
}
})
this.client.activate()
}
// 断开连接
disconnect() {
this.client.deactivate()
}
// 更新Token(用于Token刷新场景)
updateToken(newToken: string) {
this.currentToken = newToken
if (this.connected) {
this.disconnect()
setTimeout(() => {
this.connect(newToken)
}, 1000)
}
}
// 订阅消息
subscribe(destination: string, callback: (message: any) => void) {
if (!this.connected) {
console.warn('WebSocket未连接')
return
}
return this.client.subscribe(destination, (message) => {
try {
const data = JSON.parse(message.body)
callback(data)
} catch (error) {
console.error('消息解析失败:', error)
}
})
}
// 发送消息
send(destination: string, body: any) {
if (!this.connected) {
console.warn('WebSocket未连接,消息将被缓存')
return
}
this.client.publish({
destination,
body: JSON.stringify(body)
})
}
// 处理STOMP错误
private handleStompError(frame: any) {
if (frame.headers && frame.headers.message) {
const errorMessage = frame.headers.message.toLowerCase()
if (errorMessage.includes('unauthorized') ||
errorMessage.includes('invalid token') ||
errorMessage.includes('token expired')) {
console.warn('Token认证失败,触发重新登录')
this.tokenExpiredCallback?.()
return
}
}
this.handleReconnect()
}
// 处理重连
private handleReconnect() {
if (this.reconnectAttempts < this.maxReconnectAttempts) {
this.reconnectAttempts++
setTimeout(() => {
console.log(`尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})`)
this.client.activate()
}, 5000 * this.reconnectAttempts)
}
}
}
```
#### 3.3.2 聊天组合式API
```typescript
// composables/useChat.ts
import { ref, onMounted, onUnmounted } from 'vue'
import { WebSocketService } from '@/utils/websocket'
import { useAuthStore } from '@/stores/auth'
import type { ChatMessage } from '@/types/chat'
export function useChat() {
const authStore = useAuthStore()
const wsService = new WebSocketService(() => {
// Token过期回调
authStore.logout()
router.push('/login')
})
const messages = ref([])
const isConnected = ref(false)
// 连接WebSocket
const connect = () => {
if (authStore.token) {
wsService.connect(authStore.token)
// 订阅个人消息
wsService.subscribe(`/user/${authStore.user.id}/queue/messages`, (message) => {
messages.value.push(message)
})
// 订阅聊天室消息
wsService.subscribe('/topic/chat', (message) => {
messages.value.push(message)
})
isConnected.value = true
}
}
// 发送消息
const sendMessage = (content: string, type: 'text' | 'image' = 'text') => {
const message = {
content,
type,
timestamp: Date.now(),
userId: authStore.user.id
}
wsService.send('/app/chat.send', message)
}
// 组件挂载时连接
onMounted(() => {
connect()
})
// 组件卸载时断开连接
onUnmounted(() => {
wsService.disconnect()
})
return {
messages,
isConnected,
sendMessage,
connect
}
}
```
## 4. 质量保证措施
### 4.1 功能一致性检查清单
#### 页面功能检查
- [ ] 页面布局完全一致
- [ ] 所有按钮和链接功能正常
- [ ] 表单验证逻辑一致
- [ ] 错误提示信息一致
- [ ] 加载状态显示一致
- [ ] 响应式设计一致
#### 交互功能检查
- [ ] 点击事件响应一致
- [ ] 键盘快捷键一致
- [ ] 滚动行为一致
- [ ] 动画效果一致
- [ ] 拖拽功能一致
### 4.2 视觉一致性检查清单
#### 样式检查
- [ ] 颜色方案完全一致
- [ ] 字体大小和样式一致
- [ ] 间距和布局一致
- [ ] 边框和圆角一致
- [ ] 阴影效果一致
#### 图片和图标检查
- [ ] 所有图片显示正常
- [ ] 图标样式一致
- [ ] 图片尺寸一致
- [ ] 图片加载状态一致
## 5. 测试策略
### 5.1 自动化测试
#### 单元测试
```typescript
// tests/components/ChatMessage.test.ts
import { mount } from '@vue/test-utils'
import { describe, it, expect } from 'vitest'
import ChatMessage from '@/components/ChatMessage.vue'
describe('ChatMessage', () => {
it('renders message content correctly', () => {
const message = {
id: '1',
content: 'Hello World',
senderId: 'user1',
senderType: 'USER' as const,
timestamp: Date.now()
}
const wrapper = mount(ChatMessage, {
props: { message, isOwn: true }
})
expect(wrapper.text()).toContain('Hello World')
})
})
```
### 5.2 手动测试清单
#### 功能测试
- [ ] 用户注册流程
- [ ] 用户登录流程
- [ ] AI对话功能
- [ ] 日记发布功能
- [ ] 个人资料编辑
- [ ] 设置页面功能
#### 兼容性测试
- [ ] Chrome浏览器
- [ ] Firefox浏览器
- [ ] Safari浏览器
- [ ] Edge浏览器
- [ ] 移动端浏览器
## 6. 成功标准
### 6.1 功能标准
- [ ] 所有现有功能100%保留
- [ ] 所有页面UI完全一致
- [ ] 所有交互流程正常
- [ ] 所有API接口正常工作
### 6.2 性能标准
- [ ] 首屏加载时间 < 2秒
- [ ] 页面切换时间 < 500ms
- [ ] 内存使用增长 < 50MB
- [ ] 构建时间 < 3分钟
### 6.3 质量标准
- [ ] 代码覆盖率 > 80%
- [ ] 无严重bug
- [ ] 通过所有测试用例
- [ ] 符合代码规范
## 7. 总结
本重构计划确保在升级到最新技术栈的同时,完全保持现有的功能、UI和用户体验。通过分阶段的重构策略,可以降低风险并确保每个阶段的质量。重构完成后,项目将具备更好的性能、可维护性和扩展性,为未来的功能开发奠定坚实基础。
### 7.1 关键成功因素
1. **严格的功能一致性检查**
2. **详细的UI对比验证**
3. **完善的测试覆盖**
4. **渐进式的重构策略**
5. **充分的团队协作**
### 7.2 预期收益
#### 技术层面收益
1. **技术栈现代化**:Vue3.4.21 + TypeScript5.4.2 + Vite5.1.6
2. **性能显著提升**:
- 首屏加载时间减少40% (目标<2秒)
- 运行时性能提升30% (Vue3 Proxy响应式)
- 包体积减少25% (Tree-shaking + 代码分割)
- WebSocket连接更稳定 (原生WebSocket + Token认证)
3. **开发体验提升**:
- TypeScript类型安全,减少90%的类型错误
- 自动导入和组件注册,提升开发效率50%
- 热更新速度提升3倍 (Vite vs Webpack)
- 更好的调试工具和错误提示
#### 业务层面收益
4. **功能稳定性提升**:
- WebSocket连接稳定性提升 (自动重连 + Token认证)
- 错误监控和日志收集 (Sentry集成)
- 完善的测试覆盖 (单元测试 + E2E测试)
5. **用户体验优化**:
- 响应式设计优化,移动端体验提升
- 数据可视化效果增强 (ECharts5.5.0)
- PWA支持,离线访问能力
- 国际化支持,多语言适配
6. **维护和扩展性**:
- 组件化架构,代码复用率提升60%
- 模块化设计,新功能开发效率提升40%
- 完善的文档和规范,团队协作效率提升
- CI/CD自动化,部署效率提升80%
#### 长期价值
7. **技术债务清理**:清理历史技术债务,为未来发展奠定基础
8. **团队技能提升**:掌握现代前端技术栈,提升团队竞争力
9. **可持续发展**:基于最新技术栈,保证3-5年技术先进性