fix: 系统公告弹窗前端

This commit is contained in:
Gsh
2025-11-05 23:12:23 +08:00
parent 09fb43ee14
commit 17337b8d78
21 changed files with 2729 additions and 17 deletions

View File

@@ -0,0 +1,337 @@
# 系统公告功能使用说明
## 功能概述
本次更新为项目添加了完整的系统公告弹窗功能,包括活动展示、公告通知、轮播图等。用户可以通过不同的关闭选项来控制弹窗的显示频率。
---
## 已实现的功能
### 1. 系统公告弹窗
- **自动弹出**: 用户进入应用时自动检测并显示公告弹窗
- **手动打开**: 右上角有公告按钮(铃铛图标),随时可以点击打开公告弹窗
- **未读提示**: 公告按钮上显示红色徽章,标识最新公告数量
- **Tab切换**: 支持"活动"和"公告"两个Tab页面
- **关闭选项**: 提供三种关闭方式
- 今日关闭24小时内不再自动弹出但仍可通过按钮手动打开
- 本周关闭7天内不再自动弹出但仍可通过按钮手动打开
- 关闭公告:永久不再自动弹出(除非清除浏览器缓存),但仍可通过按钮手动打开
### 2. 活动页面
- **轮播图**: 顶部展示活动轮播图,支持自动播放
- **活动列表**: 显示所有活动,包含标题、简介、状态标签
- **状态标识**:
- 进行中:绿色标签
- 已结束:灰色标签
- **查看详情**: 点击可跳转到活动详情页面
### 3. 公告页面
- **最新公告**: 顶部显示最新发布的公告,带蓝色边框高亮
- **重要标识**: 重要公告显示警告图标
- **历史公告**: 使用时间线形式展示历史公告
- **查看详情**: 点击可跳转到公告详情页面
### 4. 详情页面
#### 活动详情页面
- 活动标题和状态
- 浏览次数和参与人数
- 活动封面图
- 活动简介
- 活动时间信息(开始、结束、发布、更新时间)
- 完整的活动内容支持HTML格式
#### 公告详情页面
- 公告标题和类型
- 重要公告标识(带动画效果)
- 浏览次数
- 发布时间
- 完整的公告内容支持HTML格式
- 创建和更新时间
---
## 文件结构
```
Yi.Ai.Vue3/
├── src/
│ ├── api/
│ │ └── announcement/
│ │ ├── index.ts # API接口定义
│ │ └── types.ts # TypeScript类型定义
│ ├── components/
│ │ └── SystemAnnouncementDialog/
│ │ └── index.vue # 系统公告弹窗组件
│ ├── layouts/
│ │ └── components/
│ │ └── Header/
│ │ ├── components/
│ │ │ └── AnnouncementBtn.vue # 公告按钮组件(新增)
│ │ └── index.vue # Header组件已更新
│ ├── pages/
│ │ ├── activity/
│ │ │ └── detail.vue # 活动详情页面
│ │ └── announcement/
│ │ └── detail.vue # 公告详情页面
│ ├── stores/
│ │ └── modules/
│ │ └── announcement.ts # 公告状态管理
│ ├── data/
│ │ └── mockAnnouncementData.ts # 模拟数据
│ ├── routers/
│ │ └── modules/
│ │ └── staticRouter.ts # 路由配置(已更新)
│ ├── utils/
│ │ └── request.ts # HTTP请求工具已修复Pinia初始化问题
│ └── App.vue # 主应用文件(已更新)
├── 系统公告API接口文档.md # API接口文档
└── 系统公告功能使用说明.md # 本文档
```
---
## 如何使用
### 开发环境测试(使用模拟数据)
1. **导入模拟数据**
`src/App.vue` 中临时替换API调用
```typescript
// 导入模拟数据函数
import { getMockSystemAnnouncements } from '@/data/mockAnnouncementData'
// 替换 getSystemAnnouncements() 为 getMockSystemAnnouncements()
onMounted(async () => {
if (announcementStore.shouldShowDialog) {
try {
// 使用模拟数据
const res = await getMockSystemAnnouncements()
if (res.data) {
announcementStore.setAnnouncementData(res.data)
announcementStore.openDialog()
}
}
catch (error) {
console.error('获取系统公告失败:', error)
}
}
})
```
2. **同样的方式更新详情页面**
`src/pages/activity/detail.vue``src/pages/announcement/detail.vue` 中也可以使用模拟数据函数进行测试。
3. **启动开发服务器**
```bash
npm run dev
```
4. **测试功能**
- 打开浏览器访问应用
- 应该会自动弹出系统公告弹窗
- 测试不同的关闭选项
- 点击"查看详情"按钮测试跳转
### 生产环境部署使用真实API
1. **后端实现API接口**
参考 `系统公告API接口文档.md` 实现以下三个接口:
- `GET /announcement/system` - 获取系统公告数据
- `GET /announcement/activity/{id}` - 获取活动详情
- `GET /announcement/detail/{id}` - 获取公告详情
2. **确认API调用**
确保 `src/App.vue` 和详情页面使用的是真实的API函数默认配置
- `getSystemAnnouncements()`
- `getActivityDetail(id)`
- `getAnnouncementDetail(id)`
3. **构建部署**
```bash
npm run build
```
---
## 自定义配置
### 修改关闭时间
`src/stores/modules/announcement.ts` 中修改时间计算逻辑:
```typescript
const shouldShowDialog = computed(() => {
// ... 现有代码
if (closeType.value === 'today') {
// 修改为其他时间如12小时
return elapsed > 12 * 60 * 60 * 1000
}
if (closeType.value === 'week') {
// 修改为其他时间如3天
return elapsed > 3 * 24 * 60 * 60 * 1000
}
// ... 现有代码
})
```
### 修改弹窗样式
`src/components/SystemAnnouncementDialog/index.vue` 中修改样式:
- 修改弹窗宽度:`width="700px"` 改为其他值
- 修改轮播图高度:`height="250px"` 改为其他值
- 修改CSS样式`<style>` 部分进行调整
### 添加新的Tab页
1. 在弹窗组件中添加新的 `<el-tab-pane>`
2. 添加对应的数据类型定义
3. 更新API接口和store
---
## 管理功能
### 手动触发弹窗
用户可以通过以下方式打开公告弹窗:
1. **点击右上角公告按钮**(推荐)
- 位于Header右侧的铃铛图标
- 显示未读公告数量的红色徽章
- 点击即可打开公告弹窗
2. **在代码中手动调用**
在任何组件中可以手动打开公告弹窗:
```typescript
import { useAnnouncementStore } from '@/stores'
const announcementStore = useAnnouncementStore()
// 打开弹窗
announcementStore.openDialog()
```
### 重置关闭状态
如果需要重置用户的关闭状态(例如有重要公告需要强制显示):
```typescript
// 重置关闭状态
announcementStore.resetCloseStatus()
// 然后重新打开弹窗
announcementStore.openDialog()
```
### 查看当前状态
```typescript
const announcementStore = useAnnouncementStore()
// 查看是否应该显示弹窗
console.log(announcementStore.shouldShowDialog)
// 查看关闭类型
console.log(announcementStore.closeType)
// 查看关闭时间
console.log(announcementStore.closedAt)
```
---
## 注意事项
1. **XSS防护**: 公告和活动内容使用 `v-html` 渲染请确保后端返回的HTML内容是安全的建议进行内容过滤和转义。
2. **图片资源**: 轮播图和封面图需要可访问的URL地址建议使用CDN。
3. **性能优化**:
- 弹窗数据会在应用启动时加载,确保接口响应快速
- 考虑添加加载状态和错误处理
4. **响应式设计**: 当前设计主要针对PC端如需移动端适配需要调整样式和布局。
5. **浏览器兼容**: 使用了现代CSS特性建议在主流现代浏览器中使用。
6. **状态持久化**: 关闭状态存储在 localStorage 中,清除浏览器缓存会重置状态。
---
## 后续优化建议
1. **数据统计**: 添加打点统计,记录用户查看公告的行为
2. **推送通知**: 对重要公告支持浏览器推送通知
3. **多语言支持**: 支持国际化i18n
4. **个性化推荐**: 根据用户兴趣推荐相关活动
5. **评论功能**: 允许用户对活动和公告进行评论
6. **分享功能**: 支持将活动和公告分享到社交媒体
7. **搜索功能**: 添加公告和活动的搜索功能
8. **管理后台**: 开发管理后台用于创建和管理公告活动
---
## 技术栈
- **Vue 3.5.17**: 核心框架,使用 Composition API
- **TypeScript**: 类型安全
- **Element Plus**: UI组件库
- **Pinia**: 状态管理,支持持久化
- **Vue Router 4**: 路由管理
- **Vite**: 构建工具
---
## 问题排查
### 弹窗不显示
1. 检查 `announcementStore.shouldShowDialog` 的值
2. 检查API是否返回数据
3. 查看浏览器控制台是否有错误
4. 尝试调用 `announcementStore.resetCloseStatus()` 重置状态
### 详情页面404
1. 确认路由配置是否正确
2. 检查路由名称是否匹配
3. 确认ID参数是否正确传递
### 样式显示异常
1. 检查Element Plus是否正确安装
2. 确认 SCSS 预处理器是否配置
3. 清除浏览器缓存重试
---
## 联系支持
如有问题或建议,请通过以下方式联系:
- GitHub Issues
- 项目文档
- 技术支持团队
---
**祝使用愉快!**