### 技术栈
前后端分离: **Ruoyi-Vue框架** + Spring Boot3 + Vue3 + Element-Plus + MySQL + Redis + 阿里云OSS
### 项目需求梳理
#### **1. 课程资源分享 (Course Resource Sharing)**
**概览:** 这是一个众包式的学习资料分享平台,通过积分和排行榜激励用户贡献高质量内容。
**核心功能:**
* **资源上传:** 任何登录用户可以选择特定科目,上传自己整理的关于本科目的学习资料(只能上传压缩包)。上传后必须被专业负责人审核,审核通过后方可被其他用户可见
* **资源展示:** 用户可以按科目浏览、搜索和下载资源。在一份资料(也就是一个用户上传的资料中,需要有一个介绍这个压缩包的简介,这个资源包括什么,由用户自行编写,也就是说用户在上传的时候需要提交一个表单,来阐述这份资源的相关信息,例如:选择科目名称,选择专业,填写资料简介等等)
* **精品审核:** “专业负责人”角色需要审核上传的资源,并将优质资源标记为“最佳推荐”。(专业负责人由超级管理员手动指定,不同专业只能有一个负责人)
* **积分系统:**
* 上传资源:审核通过后获得少量积分(例如:+5分)。
* 资源被评为“最佳”:获得大量积分(例如:+10分)。
* **贡献排行榜:** 根据用户的总积分进行排名,展示贡献最多的用户。
**关键技术点/建议:**
* **文件存储:** 使用阿里云OSS存储上传的资源文件。后端提供一个上传接口(依托于Ruoyi-Vue-Plus框架),接收文件后上传至OSS,并将返回的URL存入`resource`表。
* **权限控制:** 利用若依自带的RBAC (基于角色的访问控制),创建“专业负责人”角色,并为他们分配审核资源的权限。
* **积分计算:** 可以使用AOP (面向切面编程) 或在业务逻辑中直接处理。当资源上传或被标记为最佳时,更新用户的总积分并添加一条积分记录。
* **排行榜:** 对用户表的`total_points`字段进行降序排名查询即可。为了性能,可以将排行榜结果缓存到Redis中,定时更新。
---
#### **2. 通知公告 (Announcements)**
**概览:** 一个灵活的通知发布系统,支持定向推送、已读/未读跟踪和全文搜索。
**核心功能:**
* **发布通知:** 授权用户(如学生工作者)可以通过填写一个表单(需要填写通知日期,事件日期,通知内容,通知对象,附件等)创建通知(支持上传图片、附件),并选择一个或多个“用户组”作为接收对象。
* **定向接收:** 用户只能看到发给自己所在用户组的通知。
* **阅读量:** 用户点开通知详情页阅读量+1(同一用户多次查看不重复计算)。
* **主动已读 (签收):** 用户可以点击“确认已读”按钮,后台记录具体签收人。
* **发布者视图:** 本条通知的发布者可以查看通知的阅读量、具体签收人员列表和未签收人员列表。
* **未读提醒:** 导航栏“小铃铛”显示当前用户的未读通知数量。
* **全文搜索:** 用户可以根据关键词搜索通知的标题和内容。
**关键技术点/建议:**
* **用户组:** 紧密依托于若依的“角色”或“部门”功能来模拟用户组,无需额外开发。
* **未读数计算:** “小铃铛”的未读数可以通过查询计算得出:`用户所属组的通知总数 - 该用户在announcement_read_log中的记录数`。
* **已读/未读列表:** 通过`announcement_read_log`表和用户表进行关联查询即可实现。
* **全文搜索:** MySQL 5.6+ 的 `FULLTEXT` 索引可以满足基本需求。PostgreSQL也能更方便地实现全文搜索
---
#### **3. 失物招领 (Lost and Found)**
**概览:** 通知公告模块的简化和变种,用于发布和管理失物/拾物信息。
**核心功能:**
* **发布:** 用户可以发布失物招领信息(物品描述、图片、联系方式等)。
* **列表展示:** 所有用户都可以看到全部失物招领信息。
* **状态管理:** 发布者可以将自己的帖子状态修改为“已解决”。
* **搜索:** 支持按物品名称、描述等关键词搜索。
**关键技术点/建议:**
* **代码复用:** 这个模块的前后端代码结构可以大量复用通知公告模块,只需修改数据模型和部分业务逻辑(如权限控制、状态变更逻辑)。
* **图片上传:** 同样使用阿里云OSS存储用户上传的物品图片。
---
#### **4. 功能房预约 (Function Room Booking)**
**概览:** 一个可视化的功能房预约系统,包含甘特图视图、详细日志和排行榜统计。
**核心功能:**
* **可视化地图:** 以图形化界面展示楼层功能房的布局和实时状态(可用、占用、已预约)。
* **预约操作:** 用户点击功能房可进行预约、取消预约等操作。必须要提前一天进行预约!预约需要填写一个表单,内容至少包括:预约申请人,使用人(不少于包括申请人在内的三个用户),使用目的,使用时长(不超过三天)(可以设置一个总开关,来控制是否需要相关的管理员进行审核)
* **甘特图视图:** 按房间展示预约时间段,直观了解各房间的日程安排。
* **签到签退** 在使用开始时间的前后三小时内,必须提交签到图片,否则预约作废。在使用结束时间的前后三小时类,必须提交签退图片,否则预约申请人14天内不得再次预约。
* **详细日志:** 每次预约都需记录关键信息,可以按照房间,预约申请人来筛选。
* **排行榜:**
* 功能房被借用总时长排行。
* 学生借用功能房总时长排行(可由管理员控制是否显示)。
**关键技术点/建议:**
* **地图视图:** 前端可以使用 SVG 或简单的 HTML `
` 结合 CSS Grid/Flexbox 布局来绘制地图,并绑定点击事件。
* **甘特图:** Vue有很多成熟的甘特图组件库可以快速实现该功能。
* **预约冲突检测:** 这是核心逻辑。当用户提交预约时,后端必须进行数据库查询,检查该时间段内是否已有其他预约。这个操作需要是**事务性**的,以防在高并发下出现重复预约。
---
#### **5. 事件日历 (Event Calendar)**
**概览:** 个人日程管理工具,并与系统内其他模块(预约、通知)深度联动。
**核心功能:**
* **个人日程:** 用户可以查看、添加、编辑和删除自己的日历事件。
* **预约联动:** 功能房预约成功后,自动为预约人及所有使用人员的日历添加事件。
* **通知联动:** 带日期的通知可以提供一个“一键添加到日历”的按钮。
* **日程共享与预约:** 用户可以共享自己的日历忙闲状态,方便团队成员寻找共同的空闲时间来发起会议或活动预约。
**关键技术点/建议:**
* **日历前端:** 强烈推荐使用成熟的Vue日历组件,如 `FullCalendar` 或 `V-Calendar`,它们提供了丰富的视图和交互功能。
* **联动实现:**
* **预约联动:** 在预约成功的业务逻辑中,调用一个`CalendarService`,为参与预约的每个用户创建日历事件。
* **通知联动:** 前端按钮调用一个后端接口,传递通知ID和用户ID,后端根据通知信息创建日历事件。
* **查找空闲时间:** 这是该模块最复杂的功能。实现方式通常是:获取所有相关人员在指定日期范围内的所有已安排事件,将这些时间段合并成一个“忙碌”时间段列表,然后找出其中的“空闲”时间间隙。这个算法需要仔细设计以保证效率。
---
#### **6. 数字图书馆 (Digital Library)**
**概览:** 简单的电子书库,提供浏览和下载功能。
**核心功能:**
* **图书上传** 用户提交一个表单, 需要至少包括: 书名, 作者, ISBN号(根据这个来唯一去重), 文件
* **图书展示:** 列表或卡片形式展示电子书(封面、书名、作者、简介)。
* **下载功能:** 提供下载按钮,可以是oss直链下载。
* **下载统计:** 记录每本书的被下载次数。
* **排行榜:** 用户上传书本数量排行榜, 书籍下载次数排行榜
---
#### **7. 帖子 (Posts)**
**概览:** 一个类似博客或轻论坛的功能,用于用户交流。
**核心功能:**
* **发帖:** 用户可以发布带标题和内容的帖子。发布后立即对其他用户可见 (也可以设置白名单/黑名单对应可见/不可见)
* **互动:** 其他用户可以对帖子进行点赞、点踩和评论。
* **评论嵌套:** 评论可以支持多级回复(盖楼)。
**关键技术点/建议:**
* **富文本编辑器:** 前端需要集成一个富文本编辑器(如 `WangEditor` 或 `TinyMCE`)让用户可以方便地编辑帖子内容。
* **点赞/点踩逻辑:** 使用 `post_interaction` 表来记录,可以轻松实现“每个用户对每个帖子只能点赞或点踩一次”的逻辑。
* **评论展示:** 查询评论时,通过 `parent_comment_id` 字段在后端或前端构建评论树结构。
---
#### **8. 实用功能 - 投票 (Voting)**
**概览:** 一个功能完善的投票工具,支持定向、匿名、限时等特性。
**核心功能:**
* **创建投票:** 授权用户可以发起投票,设置标题、选项、时间段、权限(指定用户组)以及是否匿名。
* **参与投票:** 在有效期内,被授权的用户可以进行投票。
* **投票逻辑:**
* **实名投票:** 记录具体投票人,防止重复投票。
* **匿名投票:** 不记录投票人信息,但仍需防止同一用户重复投票。
* **结果统计与报表:** 投票发起者可以查看实时投票结果(各选项票数、百分比)。对于实名投票,还可以查看已投和未投人员名单。投票结束后可以生成最终报表。
---
#### **9. 实用功能 - 问卷 **
**概览:** 简单的问卷工具, 支持定向、匿名、限时等特性
**核心功能:**
* **创建投票:** 授权用户可以发布,设置标题、问题(包括问题是否是必填)、时间段、权限(指定用户组)以及是否匿名。
* **参与投票:** 在有效期内,被授权的用户可以进行提交问卷。
* **投票逻辑:**
* **实名投票:** 记录具体提交人,防止重复提交。
* **匿名投票:** 不记录提交人信息,但仍需防止同一用户重复提交。
* **结果统计与报表:** 对于实名问卷,可以查看已提交和未提交人员名单。结束后可以生成最终报表。
---
### 实现优先级
课程资源分享 >> 通知公告 >> 功能房预约 >>> 数字图书馆 > 失物招领 >>>>>>>> 投票 > 问卷 > 事件日历 >>>>>>>>>>>>>>>>>>>>>>> 帖子
---
### 角色
- 普通用户:
- 拥有课程资源分享, 数字图书馆的上传与下载权限
- 拥有失物招领的发布权限
- 拥有对自己发布的失物招领的修改权限
- 拥有功能房预约的预约, 取消预约,签到签退权限
- 拥有帖子的发布,点赞, 评论权限
- 拥有问卷,投票的填写提交权限
- 学生工作者:
- 拥有所有的普通用户权限
- 拥有发布公告的权限
- 拥有删除公告的权限 (仅限自己发布的)
- 图书管理员:
- 拥有所有的普通用户的权限
- 拥有数字图书馆完整的增删改查权限
- 专业负责人:
- 拥有所有的普通用户的权限
- 一共十个, 对应十个不同的专业
- 负责本专业提交的课程资料的审批
- 拥有本专业的, 完整的课程资料的增删改查权限
- 管理员:
- 拥有所有的普通用户的权限
- 拥有对所有模块进行增删改查的全年
- 超级管理员:
- 拥有整个系统完整的权限
- 包括模块的开启关闭, 用户停用删除更改等等