做全栈开发这些年,见过不少类似的毕业设计项目,但“情绪宣泄平台”这个选题我第一次看到时还是多停留了几秒。原因很简单:它看起来是个常规的JAVA全栈项目,业务逻辑也不算复杂,但它的核心价值不在技术上,而是在“需求侧”——心理健康、情绪疏导、匿名倾诉,这些都是当下的高频话题。换句话说,这项目做出来,答辩好讲、演示效果好、后续扩展空间也大,属于那种投入产出比很高的选题。
这个系统本质上是做一个Web平台,让用户能够记录情绪、获取疏导建议、通过匿名社区互相倾诉,配合后台做内容管理和数据统计。技术上就是Spring Boot + Vue这套经典组合,前端一套管理后台和用户端,后端一套RESTful接口,再加一个MySQL数据库存数据。整套下来就是一个非常标准的前后端分离项目,既有业务深度,又有技术看点。
这篇文章我会把整个项目从需求拆解、表结构、后端实现、前端页面到部署细节全部捋一遍,把我实际做这类项目时的思路和踩过的坑一并写出来,给准备做类似选题或者想学好Spring Boot + Vue全套流程的朋友一份直接能抄的作业。
1. 项目到底做什么,为什么值得做
1.1 情绪宣泄平台的真实需求
先说需求。很多人听到“情绪宣泄”第一反应是“砸东西”“大喊大叫”这类物理宣泄方式,但实际做系统的时候,咱们要解决的是更温和、更可持续的日常情绪管理需求。
从用户侧看,情绪问题有几个典型场景:一天工作下来心情烦躁但没人可说;考试/答辩前焦虑到失眠,想找个出口;和身边的人发生矛盾,不想在熟人面前暴露脆弱,但憋着又难受。这些场景共同指向一个核心诉求——安全、匿名、低门槛的情绪出口。
从产品侧看,这类平台通常会包含三类功能:情绪记录(帮用户看见自己的情绪变化,本身就有疏导作用)、疏导内容(文章、建议、引导性内容)、匿名社区(同类人互相倾诉、回应,形成支持感)。这就是这个项目的“魂”,后续所有的模块设计、页面规划、数据表设计,都围绕这三条线展开。
1.2 系统功能模块拆解
根据上面的需求分析,整个系统可以拆成两个端加四块核心业务。
两个端指的是用户端和管理端。用户端面向普通用户,提供注册登录、情绪日记、安抚内容浏览、匿名社区发帖回帖等功能。管理端面向运营人员或管理员,提供用户管理、内容审核、社区帖子管理、情绪数据统计等功能。
四块核心业务分别是:
- 用户模块:注册、登录、个人信息维护、密码修改,这是所有业务的基础。
- 情绪记录模块:用户可以记录每天的情绪状态(比如用1到5分表示情绪指数)、写下触发事件或当时的想法,系统自动生成情绪曲线,让用户看到自己的情绪波动趋势。
- 内容疏导模块:后台维护一批情绪安抚类的文章或建议(比如焦虑缓解方法、呼吸练习指引等),前端分类展示,用户可以阅读和收藏。
- 匿名社区模块:用户可以匿名发帖倾诉,其他用户可浏览、评论、点赞。这里的关键是匿名机制和敏感词过滤,既要让用户敢说,又不能让平台内容失控。
把四个模块做完,这个项目在功能层面就已经很完整了。如果还想加亮点,可以再扩展“心理测试”(做几套简单的量表,用户答完生成分析报告)和“咨询预约”(展示咨询师列表,用户按时段预约),这两个功能对答辩加分很有帮助,但对编码量的要求也更高,属于选做项。
1.3 适合谁参考与学习
这个项目我比较推荐两类人拿来研究。
第一类是正在做毕业设计或课程设计的在校同学。Spring Boot + Vue是目前高校里最主流的全栈组合之一,用到的东西都是面试和工作中常见的:RESTful接口、JWT鉴权、MyBatis Plus操作数据库、Vue Router管理前端路由、Axios收发请求。把这个项目吃透,不仅答辩有底气,写在简历上也拿得出手。
第二类是自学Java全栈想找练手项目的开发者。这个项目业务边界清晰,不像电商系统那样涉及大量订单状态和支付逻辑,也不像管理后台那样纯CRUD毫无亮点。情绪记录的数据可视化、匿名社区的敏感词过滤、情绪曲线的统计实现,都是既有技术含量又能在面试时讲清楚的点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型:为什么是Spring Boot + Vue
2.1 前后端分离架构的核心优势
这个项目采用前后端分离架构,不是一个随大流的选择,而是这类业务场景下的最优解。
我见过不少同学做类似的系统时选Spring Boot + Thymeleaf这种服务端渲染方案,就是后端直接返回HTML页面。这种方案确实写起来快,但有几个明显问题:前后端代码耦合在一起,改一个按钮样式可能要动后端模板;接口没法给其他端复用;项目结构看起来也不清晰,答辩时很难展示出“工程化”的素养。
换成Spring Boot + Vue分离架构后,前端只负责页面渲染和交互,通过Ajax调用后端接口拿JSON数据;后端只负责业务逻辑和数据处理,通过统一的接口规范对外提供服务。前后端可以并行开发,后期也方便扩展小程序端或移动端。而且Vue本身的组件化开发模式,让页面代码的复用性和可维护性都远超传统的HTML模板拼接。
2.2 版本选择与依赖配置
版本选择上,我建议直接用目前社区里最稳的组合:Spring Boot 2.7.x + Vue 2.x + Element UI。
可能有人会问,Vue 3都出这么久了,为什么还用Vue 2?原因很现实:Vue 2 + Element UI这套组合的生态最成熟,网上资料最多,遇到问题搜索一下几乎都能找到答案。比如Element UI的表单校验、表格分页组件,开箱即用,基本不需要二次封装。Vue 3的Element Plus也已经很完善了,但很多资料和模板还是Vue 2的,对于做毕设的同学来说,用Vue 2能省下大量查资料的时间。
后端这边,核心依赖是Spring Boot Web、MyBatis Plus、MySQL驱动、JWT(用jjwt库就行)。MyBatis Plus强烈推荐,它内置了通用的增删改查方法,单表操作一行代码都不用写SQL,能把开发时间压缩一大半,让你把精力集中在业务逻辑上。
2.3 认证方案:JWT vs Session
用户登录后的状态管理,我选了JWT(JSON Web Token)而不是传统的Session。原因有两点。
一是前后端分离架构下,后端接口是跨域的,服务端不直接渲染页面,Session机制处理跨域场景会有点别扭——你要配置跨域携带Cookie、处理Session共享问题,分布式部署时还得引入Redis做Session共享。JWT的方案简单粗暴:用户登录成功后,后端签发一个带过期时间的令牌返回给前端,前端存在本地存储里,之后每次请求在请求头带上这个令牌,后端拦截器校验令牌有效性即可。
二是JWT天然适合这种无状态接口设计。后端不保存登录态,减少内存开销,接口也变得幂等,后续想加新的服务节点也不需要额外配置。当然JWT也有它的弱点,比如令牌在过期前无法主动失效,对安全要求极高的场景要谨慎。但一个课程设计级别的项目,JWT完全够用,而且面试官问到这块时你反而能讲出对比和取舍,这是加分项。
3. 数据库设计与核心表结构
3.1 核心数据表一览
数据库是这类项目里最见功底的部分,表设计的好不好,直接决定后端代码能少写多少。我这版项目一共设计了9张表,覆盖了前面说的全部业务模块。
用户表(sys_user):存放用户基本信息,包括用户名、加密后的密码、昵称、头像、手机号、角色标识(区分普通用户和管理员)、创建时间等。密码加密用BCrypt,不要用MD5——MD5已经被撞库撞烂了,而且BCrypt在Spring Security里就是默认的PasswordEncoder实现,引入即用。
情绪记录表(emotion_record):核心字段包括用户ID、情绪等级(1到5的整数)、情绪标签(如开心、焦虑、疲惫、愤怒等)、描述文本、记录日期。这是情绪曲线的数据来源。
内容表(emotion_article):存放疏导类文章,字段包括标题、分类、封面图、正文内容、浏览量、发布状态。分类可以设置成“焦虑缓解”“压力疏解”“情绪认知”等。
帖子表(community_post):匿名社区的核心表,字段包括作者ID(关联用户表)、帖子内容、图片、点赞数、评论数、发布时间、是否删除。因为要做匿名展示,前端展示时只显示用户昵称,不显示真实用户名,后端查询时也不返回用户真实ID,这是隐私保护的基本做法。
评论表(community_comment):关联帖子和用户,一条评论属于一个帖子,支持嵌套楼层逻辑或平铺展示。这版我做了平铺逻辑,实现起来简单,页面效果也够用。
收藏表(user_favorite):记录用户收藏的文章,关联用户ID和文章ID,联合唯一索引防止重复收藏。
心理测试模块我没做主版本,但如果扩展的话需要测试题目表、用户答案表和测试结果表,这里就不展开设计了。
3.2 情绪记录与统计设计
情绪记录表的逻辑看着简单,但有几个细节值得说一下。
情绪等级我用1到5分,而不是简单的“好/坏”二元判断。因为5级量表在心理学领域是成熟的做法,能更细腻地反映情绪状态,也让后续的情绪曲线可视化更平滑。用户在表单里选择等级,再选一个标签(比如“加班”“考试”“失眠”),最后填一段文字描述。这个设计能支撑起“近期哪类事件最容易影响情绪”的统计,这个统计是答辩时的亮点功能。
日期字段建议用日期类型(DATE)而不是时间戳,因为做情绪曲线时是按天聚合的。如果同一天有多条记录,可以取当天平均值作为该日的情绪指数。统计接口里写一个按日期分组查平均值的SQL,再用前端图表库画成折线图,用户就能直观看到最近30天的情绪波动。
3.3 匿名社区模块的表设计
匿名社区是技术上要注意最多的模块,核心在两点:匿名展示和内容安全。
匿名展示这块,表设计上和普通社区没有什么不同,帖子表存用户ID,查询时联表把用户昵称拿出来。关键在“不暴露用户身份”:后端接口不要返回用户ID,前端只展示昵称和头像,而且头像不要用真实上传的头像,用系统默认的匿名头像。这样即使前端代码被扒开看,也看不到发帖人是谁。
内容安全方面,需要一张敏感词表(sensitive_word),维护一批需要过滤的关键词。发帖和评论时,后端对文本进行扫描,命中的词用星号替换。注意不要直接报错提示“包含敏感词”,那样反而会引导用户猜到词表内容,改成自动替换效果更好。
4. 后端核心实现解析
4.1 项目骨架与分层
Spring Boot项目的包结构,我建议按功能模块分包,而不是按技术层分包。
简单来说,不要建controller包、service包、mapper包这种按技术职责划分的方式,而是建user包、emotion包、community包、article包,每个包里面放对应的Controller、Service、Mapper。这样做的最大好处是业务内聚,找一个功能相关的代码时不用在三个大包之间来回跳。项目大了之后,这种模块化的组织方式比按技术层划分要清晰得多。
每个业务模块内部再按Controller(接收请求、参数校验)→ Service(业务逻辑、事务管理)→ Mapper(数据访问)三层展开。Controller层只做参数接收和结果返回,不要在Controller里写业务判断;Service层承载核心逻辑,比如情绪指数的计算、敏感词过滤;Mapper层用MyBatis Plus的BaseMapper接口,复杂查询才手写SQL。
4.2 安全认证与拦截器实现
JWT认证的实现链路是这样的:登录接口校验用户名密码成功后,生成一个包含用户ID和角色信息的令牌返回给前端。前端把令牌存到localStorage里,每次请求通过Axios拦截器自动在请求头加上Authorization: Bearer <token>。
后端这边写一个拦截器,对所有路径进行拦截(放行登录、注册、文章列表这些公开接口),校验请求头里的令牌是否有效,有效就从令牌里解析出用户ID放入请求上下文,无效就直接返回401状态码。
这里有几个实现细节需要注意:
- 不要把密码明文存到数据库。用BCrypt加密,每次登录校验时用
BCryptPasswordEncoder.matches(rawPassword, encodedPassword)做比对,数据库泄露了也不影响用户账号安全。 - 拦截器里放行名单要维护好,用
PathMatcher做路径匹配,避免出现路径冲突——比如你放行了/api/login,结果接口实际路径是/api/user/login,拦截器就会拦下登录请求导致死循环,这类问题我在项目里测试时踩过。 - 令牌有效期我设置成2小时,前端在请求拦截器里判断令牌是否过期,过期就跳转登录页。如果想做“七天免登录”,可以把有效期延长,但需要做好刷新令牌机制,这个属于进阶内容,基础版本不用强求。
4.3 情绪分析的核心逻辑
情绪记录模块最核心的接口有两个:保存情绪记录接口和获取情绪曲线接口。
保存情绪记录的逻辑比较直接:接收用户ID、情绪等级、标签、描述,把数据插入emotion_record表。这里我额外做了一个小加分项——相同标签的情绪等级做平均值统计,这样能得出“不同标签事件的平均情绪影响程度”。比如用户给“加班”打了1分、“考试”打了2分,系统可以汇总出“加班对你的情绪影响较大”,这条数据在个人中心以卡片形式展示,效果很好。
获取情绪曲线的接口稍微复杂一点。前端传一个时间范围(默认为最近30天),后端按天分组查询平均数。SQL大概是这样:
sql复制SELECT DATE(record_date) AS day, AVG(emotion_level) AS level
FROM emotion_record
WHERE user_id = #{userId}
AND record_date BETWEEN #{startDate} AND #{endDate}
GROUP BY DATE(record_date)
ORDER BY day
这里要注意两个问题:一是用户可能某天没有记录,图表上会形成断点,前端处理时可以用null值填充,让图表工具自动连接曲线;二是日期参数建议用LocalDate类型接收,避免时区问题导致的日期偏移。
5. 前端页面与交互体验
5.1 Vue路由与页面规划
前端这块我按用户端和管理端分成两套页面,在Vue Router里通过路由前缀区分。
用户端页面包括:首页(平台介绍和入口)、登录页、注册页、情绪记录页(表单+历史列表)、情绪趋势页(图表)、文章列表页、文章详情页、匿名社区页、发帖页、帖子详情页、个人中心页。
管理端页面包括:数据看板(总用户数、今日发帖数、内容总数等)、用户管理(列表搜索、禁用账号)、文章管理(增删改查)、帖子管理(删除违规帖)、评论管理。权限控制在路由守卫里做:登录后从用户信息里取角色字段,管理员可以访问/admin下的路由,普通用户访问时直接重定向回首页。
页面规划上我踩过一个坑:一开始把情绪记录页和情绪趋势页分开两个路由,结果用户记录完情绪还要再点一次才能看到图表,体验很割裂。后来改成在一页内用Tab切换“记录”和“趋势”两个视图,记录完成后自动刷新趋势图,用户能立刻看到自己的情绪变化,反馈更即时。
5.2 数据可视化展示
情绪趋势可视化我用的ECharts,这是前端图表库里的老牌选择,文档齐全、社区活跃,折线图、饼图、雷达图都有现成示例。
具体实现流程不复杂:后端返回情绪曲线数据(日期+情绪均值的数组),前端在mounted里发起请求,拿到数据后填入ECharts配置项,调用setOption渲染图表。
我做的图表主要有三个:情绪趋势折线图(看整体波动)、情绪标签分布饼图(看哪类负面事件最多)、情绪等级分布柱状图(看不同严重程度的占比)。
这里给个实用建议:图表区域要等数据显示出来再渲染,否则会遇到图表没撑开或者宽度为0导致的渲染异常。建议用nextTick或者在拿到数据后再执行图表初始化,不要在mounted一进来就初始化。
5.3 接口对接与状态管理
前端请求后端接口,统一封装在一个request.js文件里。核心逻辑是创建一个Axios实例,设置baseURL为后端的公共前缀,配置请求拦截器和响应拦截器。
请求拦截器做的事很简单:从localStorage里取出令牌,设置到请求头的Authorization字段。响应拦截器做的事就是统一处理错误状态码:401跳转登录页、500弹出错误提示、业务异常显示后端返回的message。
跨域问题也要提前处理。前端开发服务器默认跑在8080端口(Vue项目的默认端口),后端跑在8081端口,这就是跨域。最省事的方案是在后端的CORS配置里允许跨域请求,用Spring Boot的@CrossOrigin注解或者全局CorsFilter。生产环境部署时,一般用Nginx把前后端配成同域名,跨域问题自然就消失了。
状态管理我用了Vuex,主要存三类数据:用户登录状态、用户基本信息、全局配置(如网站标题)。对于这类规模的系统,Vuex不需要拆module,直接一个store文件管完状态就够了。等业务再大再拆,别一上来就过度设计。
6. 部署流程与常见问题排查
6.1 本地环境准备
要把这个项目跑起来,本地需要准备的环境有四个:JDK(1.8或11)、Maven(3.6+)、MySQL(5.7或8.0)、Node.js(14+)。
JDK版本这里提醒一下:Spring Boot 2.7.x官方默认支持到Java 8和Java 11,如果用JDK 17跑也没有大问题,但个别依赖可能有不兼容的情况,建议直接装JDK 8,避免折腾。
MySQL建库时需要注意字符集设置,否则中文容易乱码。创建的数据库名用emotion_platform,字符集选utf8mb4,排序规则选utf8mb4_general_ci。导入我提供的数据库脚本文件时,可以先在命令行或数据库管理工具里执行CREATE DATABASE,再选择导入SQL文件。导入后检查一下表是否都建立成功了,常见的情况是SQL脚本里有分号分隔问题导致后面部分语句执行失败,所以导入后一定要挨个表确认。
6.2 项目启动步骤
后端启动流程非常标准:用IDE打开后端项目,等待Maven把依赖下载完毕,在配置文件application.yml里修改数据库连接的用户名和密码,确保和本地MySQL一致,然后运行主类启动。
前端启动流程:打开命令行进入前端项目目录,执行npm install安装依赖,这个步骤根据网络情况可能需要几分钟到十几分钟。安装完成后执行npm run serve,看到Compiled successfully的输出就代表启动成功了。浏览器访问http://localhost:8080就能进入系统首页。
首次登录时,先注册一个用户账号,然后到数据库的sys_user表里把该用户的role字段改成admin,重新登录后就能看到管理端的入口。这个操作比直接往数据库插管理员更不容易出错。
6.3 高频踩坑与解决方案
我在实际调试过程中遇到过不少问题,挑几个有代表性的记录在这里,给后来者避坑。
端口被占用。这是最频繁遇到的问题,Vue默认用8080端口,后端我用的是8081,但8080经常被其他程序占用。解决方式有两种:改前端启动脚本里的端口配置,或者在命令行里查占用进程把它结束掉。Windows下用netstat -ano | findstr 8080查到PID再结束进程,macOS/Linux用lsof -i :8080。
数据库连接报错。后端起不来,报错信息里带Communications link failure或者Access denied for user,基本都是数据库配置问题。前者是连接地址填错了或者端口不对,后者是用户名密码不对。注意MySQL 8.0以上的驱动类名和配置项和5.7版本不一样,需要确认配置文件的连接串写法与本地版本匹配。
npm install卡住或失败。国内网络环境下载npm包偶尔会卡住,解决方案是配置国内镜像源:执行npm config set registry https://registry.npmmirror.com,然后重新安装。如果node_modules已经下载了一半,要先删除再重新安装,避免残留文件导致依赖冲突。
跨域报错。前端页面能打开但接口全部报错,浏览器控制台提示CORS相关错误,那就是跨域没配置好。在Spring Boot里加一个全局CORS配置类,允许来源、请求头和方法,一劳永逸。
刷新页面404。前端部署到服务器后,访问首页没问题,但刷新子页面时出现404。这是因为Vue Router用了history模式,Nginx没有配置try_files,需要配置成所有路径都指向index.html。本地开发不会遇到这个问题,只有部署到服务器才会触发。
MyBatis Plus实体类和表字段映射不上。如果查询出来的数据某些字段是null,先检查表里的字段是不是下划线命名(比如create_time),实体类属性是不是驼峰命名(createTime),然后在配置文件里确认开启了驼峰映射,默认是开启的,但如果没开会导致字段全部对不上。
排查这些问题的通用思路就是看日志。Spring Boot的日志会输出完整的异常栈,前端浏览器控制台也会打印具体报错,两个日志对照着看,问题基本都能定位到。
我自己做这类全栈项目最深的一点体会是:需求永远比技术重要。很多人拿到“情绪宣泄平台”这个题目,第一反应是先去想用什么框架、写什么接口,但我建议反过来——先把用户会怎么用这个产品想明白,再倒推技术方案。你越清楚用户要什么,表结构就越清晰,接口设计就越顺畅,写代码的效率反而越高。
还有一个经验想分享给正在做项目的读者:一定要留出时间做端到端联调。我见过太多人把精力花在单模块开发上,后端接口自己测得好好的,前端页面也调得没问题,结果一对接就是一堆跨域、字段对不上、状态码处理缺失的问题。提前把前后端联调纳入计划,项目收尾会顺利得多。
这个项目做完后,还可以继续扩展的方向我列几个:接入即时通讯做在线倾诉室、增加AI情绪分析(基于规则匹配或简单算法即可)、做情绪报告PDF导出、部署到云服务器并配置域名访问。每一条都是简历上能写的好素材,也都能让这个系统从“课程设计”更进一步,变成真正有实用价值的作品。
如果这篇分享对你有帮助,动手写代码,把项目跑起来,遇到卡住的地方再回头看看这篇文章,很多答案其实都在里面了。
