校园通衢公告枢纽系统

校园通衢公告枢纽系统

基于 Spring Boot + Vue 3 的校园公告管理系统的设计与实现


目录


一、开发背景与目的

1.1 开发背景

在高校日常管理中,公告通知是信息传递的重要手段。然而,传统的公告发布方式(如张贴纸质通知、微信群转发等)普遍存在以下问题:

  • 信息传递效率低:纸质公告覆盖范围有限,容易遗漏;群消息易被刷屏淹没。
  • 缺乏审核机制:公告内容未经审核直接发布,可能出现信息不准确、格式不规范等问题。
  • 无法追踪阅读情况:管理者无从得知通知是否被目标群体有效接收。
  • 信息难以归档:历史公告散落在不同平台,查找和管理困难。

随着高校信息化建设的推进,亟需一套集公告发布、分类管理、审核流程、消息推送、阅读统计于一体的数字化公告管理平台。

1.2 开发目的

本系统旨在为高校提供一个统一、高效、可追溯的公告管理平台,主要目标包括:

  1. 规范公告发布流程:建立"草稿 → 审核 → 发布"的标准化工作流,确保公告内容质量。
  2. 提升信息触达效率:公告审核通过后自动推送至全体用户,支持站内通知提醒。
  3. 实现阅读追踪:记录每位用户的阅读行为,为管理者提供数据支撑。
  4. 支持多角色协作:管理员统筹管理,教师发布公告,学生查阅信息,各司其职。
  5. 提供数据分析能力:通过统计看板直观展示公告数据趋势,辅助决策。

二、技术架构

2.1 技术选型

层次技术版本说明
后端框架Spring Boot3.4.5自动配置、内置 Tomcat,快速构建 REST 服务
持久层MyBatis-Plus3.5.7内置 CRUD、分页插件、逻辑删除,减少样板代码
安全框架Spring Security + JWTRBAC 角色权限控制,无状态 Token 认证
前端框架Vue 33.5Composition API,前后端分离
UI 组件库Element Plus2.9企业级 Vue 3 组件库
状态管理Pinia2.3Vue 3 官方推荐状态管理方案
数据可视化ECharts5.5统计图表渲染
构建工具Vite6.0极速开发构建
数据库MySQL8.0关系型数据存储
容器化Docker + Docker Compose一键部署前后端服务

2.2 系统架构图

┌───────────────────────────────────────────────────────┐
│                    用户浏览器                          │
└───────────────────────┬───────────────────────────────┘
                        │ HTTP
┌───────────────────────▼───────────────────────────────┐
│                 Nginx (前端服务)                       │
│         Vue 3 + Element Plus + ECharts                │
│    ┌──────────┬──────────┬──────────┬──────────┐      │
│    │ 路由守卫  │ Pinia    │ Axios    │ 页面组件  │      │
│    └──────────┴──────────┴──────────┴──────────┘      │
└───────────────────────┬───────────────────────────────┘
                        │ /api/* 反向代理
┌───────────────────────▼───────────────────────────────┐
│              Spring Boot (后端服务)                    │
│  ┌─────────────────────────────────────────────────┐  │
│  │ Security Filter Chain → JWT 认证 → 角色鉴权      │  │
│  ├─────────────────────────────────────────────────┤  │
│  │            Controller(表现层)                   │  │
│  ├─────────────────────────────────────────────────┤  │
│  │             Service(业务逻辑层)                 │  │
│  ├─────────────────────────────────────────────────┤  │
│  │         MyBatis-Plus Mapper(数据访问层)         │  │
│  └──────────────────────┬──────────────────────────┘  │
└─────────────────────────┼─────────────────────────────┘
                          │ JDBC
┌─────────────────────────▼─────────────────────────────┐
│                   MySQL 数据库                         │
│   tb_user / tb_role / tb_announcement / tb_category   │
│   tb_attachment / tb_push_record / ...                 │
└───────────────────────────────────────────────────────┘

2.3 项目目录结构

gonggao/
├── src/main/java/com/xiaoa/gonggao/
│   ├── controller/          # REST 接口(7个控制器 + 健康检查)
│   ├── service/             # 业务接口
│   │   └── impl/            # 业务实现
│   ├── mapper/              # MyBatis-Plus 数据访问(8个 Mapper)
│   ├── entity/              # 数据库实体类(8个实体)
│   ├── dto/                 # 请求数据传输对象
│   ├── vo/                  # 响应视图对象
│   ├── config/              # 配置类(Security、CORS、MyBatis-Plus)
│   ├── security/            # JWT 过滤器、认证用户封装
│   └── utils/               # 工具类(JWT 工具)
├── src/main/resources/
│   ├── application.yaml     # 应用配置
│   └── sql/                 # 数据库脚本
├── frontend/                # Vue 3 前端工程
│   ├── src/views/           # 页面组件(10个视图)
│   ├── src/api/             # 接口请求模块(6个模块)
│   ├── src/router/          # 路由配置(含权限守卫)
│   ├── src/stores/          # Pinia 状态管理
│   └── src/utils/           # Axios 封装
├── Dockerfile               # 后端多阶段构建
├── frontend/Dockerfile      # 前端多阶段构建
└── docker-compose.yml       # 容器编排

三、数据库设计

3.1 E-R 关系图

┌──────────┐    N:N     ┌──────────┐
│  tb_user │◄──────────►│  tb_role  │
└────┬─────┘            └──────────┘
     │                   通过 tb_user_role 关联
     │
     │ 1:N (发布)
     ▼
┌──────────────────┐    N:1    ┌──────────────┐
│ tb_announcement  │◄─────────►│ tb_category   │
└───┬──────┬───────┘           └──────────────┘
    │      │
    │      │ 1:N
    │      ▼
    │  ┌──────────────┐
    │  │ tb_attachment │
    │  └──────────────┘
    │
    │ 1:N              1:N
    ├───────────────┐
    ▼               ▼
┌────────────────┐ ┌────────────────┐
│ tb_announce-   │ │ tb_push_record │
│ ment_read      │ └────────────────┘
└────────────────┘

3.2 核心表说明

表名说明关键字段
tb_user用户表username, password(BCrypt), realName, status
tb_role角色表roleName, roleKey(ADMIN/TEACHER/STUDENT)
tb_user_role用户角色关联userId, roleId(多对多)
tb_category公告分类categoryName, sortOrder
tb_announcement公告表title, content, status(0~3), publisherId, reviewerId
tb_announcement_read阅读记录announcementId, userId, readTime
tb_attachment附件表announcementId, fileName, filePath, fileSize
tb_push_record推送记录announcementId, targetUserId, isRead

所有业务表均支持逻辑删除(deleted 字段)和自动时间戳(createTime, updateTime)。


四、业务逻辑

4.1 角色权限体系

系统采用 RBAC(基于角色的访问控制)模型,定义三类角色:

功能模块管理员(ADMIN)教师(TEACHER)学生(STUDENT)
查看公告列表与详情
创建/编辑公告
提交公告审核
审核公告(通过/驳回)
用户管理(增删改查)
分类管理
统计分析
上传附件
接收通知

4.2 认证与鉴权流程

用户登录
  │
  ▼
POST /api/auth/login(用户名 + 密码)
  │
  ▼
后端校验密码(BCrypt)
  │
  ├─ 失败 → 返回 401
  │
  ▼ 成功
生成 JWT Token(含 userId, username, roleKey)
  │
  ▼
前端存储 Token 至 localStorage
  │
  ▼
后续请求携带 Authorization: Bearer <token>
  │
  ▼
JwtAuthenticationFilter 拦截 → 解析 Token → 注入 SecurityContext
  │
  ▼
@PreAuthorize 注解校验角色权限

4.3 公告生命周期

公告从创建到展示经历完整的状态流转:

  ┌─────────┐     提交审核      ┌─────────┐
  │  草稿(0) │ ───────────────► │ 待审核(1) │
  └─────────┘                   └────┬────┘
       ▲                             │
       │                    管理员审核 │
       │              ┌──────────────┼──────────────┐
       │              ▼                             ▼
       │        ┌──────────┐                 ┌──────────┐
       │        │ 已发布(2) │                 │ 已驳回(3) │
       │        └────┬─────┘                 └────┬─────┘
       │             │                            │
       │             │ 自动推送通知                 │ 可修改后
       │             ▼ 至全体用户                   │ 重新提交
       │        ┌──────────┐                      │
       │        │ 用户查阅  │                      │
       │        │ 记录阅读  │                      │
       │        └──────────┘                      │
       └──────────────────────────────────────────┘

关键业务规则:

  1. 创建公告:教师或管理员填写标题、正文、分类、过期时间等信息,初始状态为草稿。
  2. 提交审核:将草稿状态(0)变更为待审核(1),等待管理员处理。
  3. 审核公告:管理员对待审核公告进行审批:
    • 通过:状态变为已发布(2),记录发布时间和审核人,自动触发全员推送。
    • 驳回:状态变为已驳回(3),填写驳回原因,发布者可修改后重新提交。
  4. 阅读追踪:用户首次查看公告时记录阅读记录,同一用户同一公告不重复记录。
  5. 推送通知:审核通过后,系统自动为除发布者外的所有启用状态用户创建推送记录。

4.4 推送通知机制

公告审核通过
  │
  ▼
查询所有 status=1 的用户(排除发布者)
  │
  ▼
为每位用户创建 PushRecord(isRead=0)
  │
  ▼
前端轮询未读通知数量 → 显示在顶部导航栏徽标
  │
  ▼
用户点击通知 → 标记为已读(isRead=1, 记录 readTime)

4.5 统计分析

系统提供以下统计维度:

  • 总览数据:公告总数、用户总数、总阅读量、今日新增公告数
  • 分类分布:各分类下公告数量(饼图/柱状图展示)
  • 发布趋势:近 N 天每日公告发布数量(折线图展示)

五、主要页面说明

5.1 登录页

用户输入用户名和密码进行身份认证,登录成功后根据角色跳转至首页。默认管理员账号:admin / admin123。
在这里插入图片描述

5.2 公告列表(首页)

所有角色可见。展示已发布公告的分页列表,支持按分类筛选和关键词搜索。置顶公告优先展示。
在这里插入图片描述

5.3 公告详情页

展示公告完整内容,包括标题、正文、发布人、发布时间、分类、附件下载链接。进入详情页时自动记录阅读并累加阅读计数。
在这里插入图片描述

5.4 公告编辑页

教师和管理员可用。提供富文本编辑器编写公告正文,设置分类、过期时间、是否置顶,支持上传附件。可保存为草稿或直接提交审核。
在这里插入图片描述

5.5 公告审核页

仅管理员可见。展示所有待审核公告列表,管理员可查看详情后选择通过或驳回(驳回需填写原因)。
在这里插入图片描述

5.6 统计分析页

管理员和教师可见。通过 ECharts 图表展示公告总览数据、分类分布、发布趋势。
在这里插入图片描述

5.7 用户管理页

仅管理员可见。支持用户的增删改查、角色分配、账号启用/禁用。
在这里插入图片描述

5.8 分类管理页

仅管理员可见。管理公告分类的增删改查和排序。
在这里插入图片描述

5.9 个人中心

所有角色可见。展示当前用户信息,查看站内通知消息列表,支持标记已读。
在这里插入图片描述


六、接口设计

系统采用 RESTful 风格 API,统一响应格式:

{
  "code": 200,
  "message": "操作成功",
  "data": { }
}

主要接口列表

模块方法路径说明权限
健康检查GET/api/health服务健康状态公开
认证POST/api/auth/login用户登录公开
认证POST/api/auth/logout用户登出登录用户
认证GET/api/auth/info获取当前用户信息登录用户
公告GET/api/announcements公告分页列表登录用户
公告GET/api/announcements/{id}公告详情登录用户
公告POST/api/announcements创建公告管理员/教师
公告PUT/api/announcements/{id}更新公告管理员/教师
公告DELETE/api/announcements/{id}删除公告管理员/教师
公告PUT/api/announcements/{id}/submit提交审核管理员/教师
公告PUT/api/announcements/{id}/review审核公告管理员
分类GET/api/categories分类列表登录用户
分类POST/api/categories创建分类管理员
分类PUT/api/categories/{id}更新分类管理员
分类DELETE/api/categories/{id}删除分类管理员
用户GET/api/users用户分页列表管理员
用户POST/api/users创建用户管理员
用户PUT/api/users/{id}更新用户管理员
用户DELETE/api/users/{id}删除用户管理员
附件POST/api/attachments/upload上传附件管理员/教师
附件GET/api/attachments/{id}下载附件登录用户
推送GET/api/push/notifications我的通知列表登录用户
推送PUT/api/push/{id}/read标记通知已读登录用户
推送GET/api/push/unread-count未读通知数登录用户
统计GET/api/statistics/overview统计总览管理员/教师
统计GET/api/statistics/trend发布趋势管理员/教师

七、部署方案

7.1 Docker 容器化部署

项目采用 Docker Compose 编排,前后端均使用多阶段构建:

┌──────────────────────────────────────────┐
│            Docker Compose                │
│                                          │
│  ┌────────────────┐  ┌────────────────┐  │
│  │   gonggao       │  │  gonggao-ui    │  │
│  │   (backend)     │  │  (frontend)    │  │
│  │   :8088         │  │  Nginx :80     │  │
│  └───────┬────────┘  └───────┬────────┘  │
│          │                   │            │
│          │ 端口 3004 映射     │            │
└──────────┼───────────────────┼────────────┘
           │                   │
    ┌──────▼──────┐            │
    │   MySQL      │◄───────────┘
    │ 8.146.211.92 │  /api/* 反向代理至 backend
    └─────────────┘

7.2 一键启动

# 构建并启动
docker compose up -d --build

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f

启动后访问:http://<服务器IP>:3004


八、总结与展望

8.1 项目总结

本系统实现了校园公告管理的核心功能闭环:

  • 完整的公告生命周期管理:从草稿创建、提交审核、管理员审批到正式发布,建立了规范化的公告发布流程。
  • 基于角色的权限控制:通过 Spring Security + JWT 实现了管理员、教师、学生三级角色体系,各角色权责分明。
  • 消息推送与阅读追踪:公告发布后自动推送通知,并精确记录每位用户的阅读行为,为管理决策提供数据支撑。
  • 数据可视化统计:通过 ECharts 图表直观展示公告运营数据,辅助管理者掌握信息传播效果。
  • 容器化部署:采用 Docker 多阶段构建 + Docker Compose 编排,实现一键部署。

8.2 未来展望

  1. 移动端适配:开发小程序或移动端 H5 页面,方便师生随时随地查看公告。
  2. 精准推送:支持按学院、班级、年级等维度精准推送,而非全员推送。
  3. 富媒体内容:支持公告内嵌视频、音频等多媒体内容。
  4. 全文检索:接入 Elasticsearch,实现公告内容的全文搜索。
  5. 邮件/短信通知:对接邮件和短信服务,实现多渠道通知触达。
  6. 公告模板:提供常用公告模板,提高发布效率。
  7. 数据导出:支持公告数据和统计报表导出为 Excel/PDF。
  8. WebSocket 实时推送:替换前端轮询方案,实现通知的实时推送。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值