# 系统公告功能使用说明 ## 功能概述 本次更新为项目添加了完整的系统公告弹窗功能,包括活动展示、公告通知、轮播图等。用户可以通过不同的关闭选项来控制弹窗的显示频率。 --- ## 已实现的功能 ### 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样式:在 `