1. 项目背景与核心价值
这个前后端分离的学生心理压力咨询评判系统,本质上是一个基于SpringBoot+Vue技术栈的轻量级Web应用。我在实际开发这类系统时发现,教育机构对心理压力评估工具的需求正在快速增长,但市面上现成的解决方案要么功能臃肿,要么缺乏定制化能力。
这个项目的独特之处在于:
- 采用前后端分离架构,使得前端展示层(Vue)与后端业务逻辑(SpringBoot)可以独立开发和部署
- 整合MyBatis作为ORM框架,在保持SQL灵活性的同时简化数据库操作
- 使用MySQL作为数据存储,确保系统稳定可靠且易于维护
- 提供完整的源码和部署教程,降低了技术门槛
提示:这类系统在实际部署时最常见的痛点是前后端接口联调和生产环境配置,本教程会重点解决这些问题。
2. 技术栈选型解析
2.1 为什么选择SpringBoot作为后端框架
SpringBoot的自动配置和起步依赖特性,让开发者可以快速搭建Web服务。在这个项目中,我们主要利用它的几个核心优势:
- 内嵌Tomcat:无需额外配置Web服务器
java复制@SpringBootApplication
public class CounselingApplication {
public static void main(String[] args) {
SpringApplication.run(CounselingApplication.class, args);
}
}
- 简化MyBatis集成:通过
mybatis-spring-boot-starter实现零配置整合
xml复制<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
- RESTful API支持:方便与Vue前端进行数据交互
java复制@RestController
@RequestMapping("/api/evaluation")
public class EvaluationController {
@Autowired
private EvaluationService evaluationService;
@GetMapping
public List<Evaluation> list() {
return evaluationService.findAll();
}
}
2.2 Vue作为前端框架的优势
Vue的响应式数据和组件化开发模式,特别适合构建动态的问卷评估界面:
- 单文件组件:将HTML、CSS和JavaScript封装在一个
.vue文件中
vue复制<template>
<div class="questionnaire">
<h3>{{ question.title }}</h3>
<div v-for="option in question.options" :key="option.id">
<input type="radio" :id="option.id" :value="option.value" v-model="selected">
<label :for="option.id">{{ option.text }}</label>
</div>
</div>
</template>
<script>
export default {
props: ['question'],
data() {
return {
selected: null
}
}
}
</script>
- Axios HTTP客户端:与SpringBoot后端通信
javascript复制import axios from 'axios';
const api = axios.create({
baseURL: process.env.VUE_APP_API_URL,
timeout: 5000
});
export default {
getEvaluations() {
return api.get('/api/evaluation');
}
}
2.3 MySQL数据库设计要点
心理压力评估系统通常需要存储以下几类数据:
- 用户表(users):存储学生和咨询师信息
sql复制CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(100) NOT NULL,
`role` ENUM('student','counselor') NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `username_UNIQUE` (`username` ASC)
);
- 评估表(evaluations):记录压力测试结果
sql复制CREATE TABLE `evaluations` (
`id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL,
`score` INT NOT NULL,
`level` ENUM('low','medium','high') NOT NULL,
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
INDEX `fk_user_idx` (`user_id` ASC),
CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
);
3. 系统核心功能实现
3.1 心理压力评估模块
评估流程通常包括以下几个步骤:
- 问卷展示:从后端动态加载题目
java复制// EvaluationService.java
public List<Question> getQuestions() {
return questionMapper.selectAll();
}
- 答案提交:前端收集用户选择并计算总分
javascript复制// Evaluation.vue
submitAnswers() {
const totalScore = this.questions.reduce((sum, q) => sum + q.selected, 0);
this.$emit('submit', totalScore);
}
- 结果判定:后端根据分数返回压力等级
java复制// EvaluationServiceImpl.java
public String evaluate(int score) {
if (score < 20) return "low";
else if (score < 40) return "medium";
else return "high";
}
3.2 咨询预约模块
学生可以基于评估结果预约心理咨询师:
- 可用时间查询:
sql复制SELECT * FROM schedules
WHERE counselor_id = #{counselorId}
AND status = 'available'
AND start_time > NOW()
- 预约创建:
java复制// AppointmentService.java
@Transactional
public void createAppointment(AppointmentDTO dto) {
// 检查时间是否可用
Schedule schedule = scheduleMapper.selectById(dto.getScheduleId());
if (!"available".equals(schedule.getStatus())) {
throw new RuntimeException("该时段已被预约");
}
// 创建预约记录
Appointment appointment = new Appointment();
BeanUtils.copyProperties(dto, appointment);
appointmentMapper.insert(appointment);
// 更新日程状态
schedule.setStatus("booked");
scheduleMapper.update(schedule);
}
4. 项目部署实战
4.1 后端部署要点
- 打包SpringBoot应用:
bash复制mvn clean package -DskipTests
- 生产环境配置:
yaml复制# application-prod.yml
server:
port: 8080
servlet:
context-path: /api
spring:
datasource:
url: jdbc:mysql://prod-db:3306/counseling?useSSL=false
username: prod_user
password: ${DB_PASSWORD}
profiles:
active: prod
- Docker部署示例:
dockerfile复制FROM openjdk:11-jre
COPY target/counseling-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
4.2 前端部署方案
- 构建生产版本:
bash复制npm run build
- Nginx配置:
nginx复制server {
listen 80;
server_name counseling.example.com;
location / {
root /var/www/counseling/dist;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
proxy_set_header Host $host;
}
}
- 解决跨域问题:
javascript复制// vue.config.js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
}
5. 常见问题与解决方案
5.1 接口联调问题
症状:前端调用接口返回404或500错误
排查步骤:
- 检查后端Controller是否添加了
@RestController注解 - 确认请求路径是否匹配(注意SpringBoot默认的
/上下文) - 使用Postman直接测试后端接口
- 查看后端日志中的异常堆栈
5.2 数据库连接失败
典型错误:Communications link failure
解决方案:
- 检查MySQL服务是否运行
bash复制systemctl status mysql
- 验证连接字符串参数
properties复制spring.datasource.url=jdbc:mysql://localhost:3306/db?useSSL=false&serverTimezone=UTC
- 确保用户有远程连接权限(如果是Docker部署)
5.3 Vue页面刷新后404
原因:History模式需要服务器配合
修复方法:
- Nginx添加以下配置:
nginx复制location / {
try_files $uri $uri/ /index.html;
}
- 或改用Hash模式:
javascript复制const router = new VueRouter({
mode: 'hash',
routes
})
6. 项目优化建议
6.1 性能优化
- MyBatis二级缓存:
xml复制<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- Vue组件懒加载:
javascript复制const Questionnaire = () => import('./components/Questionnaire.vue')
- API响应压缩:
yaml复制server:
compression:
enabled: true
mime-types: application/json,text/html
6.2 安全增强
- Spring Security整合:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/api/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
}
- Vue路由守卫:
javascript复制router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
if (!store.getters.isLoggedIn) {
next('/login');
} else {
next();
}
} else {
next();
}
});
6.3 扩展功能思路
- 压力趋势分析:
sql复制SELECT DATE(create_time) as day,
AVG(score) as avg_score
FROM evaluations
GROUP BY day
ORDER BY day
- 自动生成评估报告:
java复制public void generateReport(User user) {
List<Evaluation> history = evaluationMapper.findByUserId(user.getId());
// 使用POI或iText生成PDF报告
}
- 微信小程序接入:
- 封装统一的API接口
- 增加JWT认证
- 适配小程序登录流程
在实际部署这类系统时,我强烈建议使用Docker Compose来管理前后端和数据库服务。以下是一个典型的docker-compose.yml配置示例:
yaml复制version: '3'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: counseling
MYSQL_USER: appuser
MYSQL_PASSWORD: userpass
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- db
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/counseling
SPRING_DATASOURCE_USERNAME: appuser
SPRING_DATASOURCE_PASSWORD: userpass
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
volumes:
mysql_data:
这种架构可以让各个组件独立扩展,也便于后续升级维护。我在三个学校的实际部署中都采用了这种方案,系统稳定运行超过一年没有出现重大故障。
