SpringBoot3+Vue3|AI心理健康咨询平台(源码)
2026/7/23 4:55:04 网站建设 项目流程

目录

一、项目背景

二、技术介绍

三、功能介绍

四、代码设计

五、系统实现


一、项目背景

在当今快节奏、高压力的社会环境下,心理健康问题日益凸显,成为影响国民生活质量与社会和谐稳定的重要因素。据《中国国民心理健康发展报告》显示,超过30%的成年人存在不同程度的焦虑或抑郁倾向,而其中主动寻求专业心理咨询服务的比例不足10%。传统线下心理咨询面临资源分布不均、费用高昂、隐私顾虑强、预约周期长等现实瓶颈,难以满足日益增长的多元化心理健康服务需求。

与此同时,人工智能技术的迅猛发展为心理健康服务模式变革提供了新的技术路径。以ChatGPT为代表的大语言模型(LLM)展现出强大的自然语言理解与多轮对话能力,能够模拟共情式倾听与认知引导,在情绪疏导、心理评估、日常陪伴等轻量级心理干预场景中具有天然的应用契合度。然而,现有通用型AI对话产品缺乏心理学专业框架的约束与引导,难以提供结构化、科学化的心理支持服务。

基于上述背景,本课题拟设计并实现一套基于SpringBoot3+Vue3的AI心理健康咨询平台。系统采用前后端分离架构,后端依托SpringBoot3框架与JDK17构建高并发、低延迟的服务底座,结合MySQL与Redis实现数据持久化与缓存加速;前端采用Vue3组合式API与TypeScript构建响应式、高交互性的用户界面。平台核心功能包括:基于大语言模型的AI智能对话咨询,提供7×24小时即时情绪陪伴与认知行为疏导;心理健康测评体系,内置标准化心理量表(如PHQ-9、GAD-7)进行初步风险评估;咨询记录与趋势分析,辅助用户追踪心理状态变化轨迹。

本项目的研发,旨在探索AI技术在心理健康服务领域的规范化、产品化落地路径,为缓解公共心理健康服务资源供需矛盾提供一套低成本、高可及性的数字化解决方案,让科技温度惠及更多有心理健康服务需求的群体。

二、技术介绍


系统架构:B/S 模式;前后端分离,管理员与咨询师共用管理端、来访者使用用户端
跨平台支持:Windows / macOS
开发环境:JDK 17 + IntelliJ IDEA + MySQL 8.0 + VS Code
技术栈:Spring Boot 3 + MyBatis + MySQL + Vue 3 + Element Plus + Pinia + Axios;鉴权采用 JWT,角色划分为 系统管理员 / 咨询师 / 来访者;咨询会话基于 WebSocket 实时通信;AI对接讯飞星火大模型

本系统采用B/S架构前后端完全分离的设计模式,支持Windows与macOS跨平台运行。后端统一提供RESTful API接口,前端根据用户角色动态渲染不同视图——管理员与咨询师共用管理端(包含用户管理、咨询记录审核、会话监控等后台功能),来访者使用用户端(包含AI对话、心理测评、预约咨询等前台功能),实现多端协同与职能隔离。

开发环境方面,后端基于JDK 17与IntelliJ IDEA,前端使用VS Code,数据库采用MySQL 8.0。技术栈上,后端以Spring Boot 3为核心框架,整合MyBatis作为持久层、MySQL存储业务数据、Redis缓存高频访问信息;前端采用Vue 3组合式API配合Element Plus组件库构建界面,Pinia管理全局状态,Axios处理HTTP请求。安全与通信层面,使用JWT实现身份认证与角色权限控制(划分为系统管理员、咨询师、来访者三类角色),咨询会话基于WebSocket实现实时双向通信,AI对话模块对接讯飞星火大模型API,提供智能心理疏导服务。该技术选型保障了系统的高性能、可扩展性与良好的用户体验。

三、功能介绍

1. 系统管理员功能
用户管理:平台注册用户的查询与维护,保障账号体系可控
咨询师管理:咨询师档案与资质相关信息的管理与审核支撑
内容运营:心理测评量管理、文章管理、平台公告管理、轮播图等内容的管理
预约与订单:预约申请审核、订单与支付流水等业务侧管理
咨询与风控:咨询会话记录查询;AI 风险监控——汇总会话风险告警,便于运营与安全响应
权限与菜单:基于角色的菜单与功能访问控制
2. 咨询师功能
个人资料:维护对外展示信息,与来访者端咨询师详情一致
排班管理:可预约时段配置,支撑来访者创建预约
预约处理:查看与处理预约,进入对应 咨询会话
咨询会话:基于 WebSocket 的实时文字沟通;结合平台的 风险告警 能力,便于在会话中关注高危信号
评价查看:查看来访者评价,形成服务闭环
3. 用户功能
首页与发现:浏览推荐与运营内容,进入测评、文章、公告等模块
咨询师:列表检索、详情查看;首页/列表侧提供 按评分等综合维度的咨询师推荐;可结合 AI 灵犀推荐按主诉智能匹配咨询师
心理测评:在线作答、查看结果;支持 AI 测评报告解读
心灵驿站:阅读与浏览科普文章
预约与订单:创建预约、管理预约状态;订单查询与详情
咨询会话:支付/流程满足条件后进入 实时咨询
个人中心:资料与密码、我的测评、我的评价、我的收藏等
三、创新功能
1. AI 测评报告解读
在完成量表后,由后端异步调用大模型生成结构化解读报告,前端通过轮询获取结果;避免同步 HTTP 超时,旧数据可触发重新生成,提升可用性与体验
2. AI 灵犀咨询师匹配
来访者可在咨询师列表页输入主诉、偏好与限制条件,由大模型结合平台咨询师公开信息输出 Top 推荐与匹配理由,辅助“选对咨询师”,与单纯按评分排序形成互补
3. 会话智能风险识别与多端告警
在咨询消息流中嵌入 AI 风险检测,对疑似高危内容进行分级;向管理端风险监控、咨询师工作台风险列表 推送告警,便于人工跟进,强调“辅助决策、不替代专业判断”
4. 大模型统一接入
平台将讯飞星火 API封装为统一服务,便于在测评解读、匹配、风控、会话增强等场景扩展

四、代码设计

package com.psyche.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.psyche.config.SparkConfig; import com.psyche.service.AIChatService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.springframework.stereotype.Service; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.net.URL; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.*; /** * 讯飞星火大模型服务实现 * 支持流式对话与心理疏导场景 */ @Slf4j @Service @RequiredArgsConstructor public class SparkAIChatServiceImpl implements AIChatService { private final SparkConfig sparkConfig; private final OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); /** * 流式对话(SSE) * @param sessionId 会话ID,用于上下文管理 * @param userMessage 用户消息 * @param emitter SSE发射器 */ @Override public void chatStream(String sessionId, String userMessage, SseEmitter emitter) { try { // 1. 构建认证URL String authUrl = buildAuthUrl(); // 2. 构建请求体(含心理疏导系统提示词) JSONObject requestBody = buildRequestBody(sessionId, userMessage); // 3. 创建WebSocket连接(讯飞星火采用WS协议) Request request = new Request.Builder() .url(authUrl) .addHeader("Content-Type", "application/json") .post(RequestBody.create( MediaType.parse("application/json; charset=utf-8"), requestBody.toJSONString() )) .build(); // 4. 发送请求并处理流式响应 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { log.error("AI对话失败", e); emitter.completeWithError(e); } @Override public void onResponse(Call call, Response response) throws IOException { try (ResponseBody body = response.body()) { if (body == null) return; String content = body.string(); // 解析流式响应并逐块发送 processStreamResponse(content, emitter); emitter.complete(); } catch (Exception e) { emitter.completeWithError(e); } } }); } catch (Exception e) { log.error("AI对话异常", e); emitter.completeWithError(e); } } /** * 构建认证URL(HMAC-SHA256签名) */ private String buildAuthUrl() throws Exception { String host = "spark-api.xf-yun.com"; String path = "/v3.5/chat"; String apiKey = sparkConfig.getApiKey(); String apiSecret = sparkConfig.getApiSecret(); SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); String date = sdf.format(new Date()); // 构建签名原文 String signOrigin = "host: " + host + "\n" + "date: " + date + "\n" + "GET " + path + " HTTP/1.1"; // HMAC-SHA256加密 Mac mac = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKey = new SecretKeySpec( apiSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); mac.init(secretKey); byte[] signBytes = mac.doFinal(signOrigin.getBytes(StandardCharsets.UTF_8)); String signature = Base64.getEncoder().encodeToString(signBytes); // 构建Authorization头 String authorization = "api_key=\"" + apiKey + "\", " + "algorithm=\"hmac-sha256\", " + "headers=\"host date request-line\", " + "signature=\"" + signature + "\""; return "wss://" + host + path + "?" + "authorization=" + Base64.getEncoder().encodeToString( authorization.getBytes(StandardCharsets.UTF_8)) + "&date=" + URLEncoder.encode(date, "UTF-8") + "&host=" + host; } /** * 构建请求体,包含心理疏导专属系统提示词 */ private JSONObject buildRequestBody(String sessionId, String userMessage) { JSONObject request = new JSONObject(); // 系统提示词:限定角色为心理咨询助手 String systemPrompt = "你是一位专业的心理咨询助手,名叫"心聆"。你的职责是:\n" + "1. 以共情、温暖、非评判的态度倾听来访者的倾诉\n" + "2. 运用认知行为疗法(CBT)的基本技巧引导来访者觉察情绪\n" + "3. 不提供医学诊断,不替代专业心理治疗\n" + "4. 当来访者表达自伤、自杀意念时,必须明确建议其寻求紧急专业帮助\n" + "5. 回答简洁温暖,每次回复控制在150字以内"; JSONObject message = new JSONObject(); message.put("role", "user"); message.put("content", userMessage); JSONObject payload = new JSONObject(); payload.put("message", new JSONObject() {{ put("text", new JSONArray() {{ add(new JSONObject() {{ put("role", "system"); put("content", systemPrompt); }}); add(new JSONObject() {{ put("role", "user"); put("content", userMessage); }}); }}); }}); request.put("header", new JSONObject() {{ put("app_id", sparkConfig.getAppId()); put("uid", sessionId); }}); request.put("parameter", new JSONObject() {{ put("chat", new JSONObject() {{ put("domain", "generalv3.5"); put("temperature", 0.7); put("max_tokens", 2048); put("top_k", 4); }}); }}); request.put("payload", payload); return request; } /** * 处理流式响应 */ private void processStreamResponse(String content, SseEmitter emitter) throws IOException { // 解析SSE格式数据 String[] lines = content.split("\n"); for (String line : lines) { if (line.startsWith("data: ")) { String jsonData = line.substring(6); if ("[DONE]".equals(jsonData)) continue; try { JSONObject data = JSON.parseObject(jsonData); JSONArray textArray = data.getJSONObject("payload") .getJSONObject("choices") .getJSONArray("text"); if (textArray != null && !textArray.isEmpty()) { String text = textArray.getJSONObject(0).getString("content"); emitter.send(SseEmitter.event() .name("message") .data(text)); } } catch (Exception e) { log.warn("解析流式数据失败: {}", e.getMessage()); } } } } }

五、系统实现

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询