博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌
项目名称
基于SpringBoot的高校心理咨询预约系统
视频演示
基于SpringBoot的高校心理咨询预约系统_哔哩哔哩_bilibili
系统介绍
在互联网迅猛发展的当下,各行各业纷纷利用软件系统为客户提供便利的资源共享平台。心理测试服务同样需求一个出色的系统,以提升服务专业性,优化预约咨询的便利性。虽然当前已有的心理健康预约系统普遍附着于各医院的网络预约系统,但并无专门适用于在线测试的系统,这对高校学生来说存在一定不便。
高校心理咨询预约系统不仅面向在校学生,对初步步入社会的实习生也同样开放,以协助他们面对工作和就业压力等问题。通过在线咨询和预约咨询,心理咨询过程大大简化,提升了咨询效率,有助于解决学生的心理问题。在线心理咨询是心理健康领域的未来发展方向。基于web项目的在线心理咨询预约系统,设置了用户、咨询师和管理员三种角色,并包含心理知识、知识查询、新闻咨询、预约咨询、在线咨询、心理测试等主要功能模块。
技术实现方面,该系统使用Java的SpringBoot框架和MySQL数据库构建开发环境。遵循Boot体系架构和软件工程原则的开发过程,通过需求分析、整体设计、详细设计、编码和测试,确保了系统的高质量完成。在安全性方面,系统实现了便捷的权限管理以及细致的访问控制。同时,该系统的可扩展性和并发访问能力也得到了深入讨论。
关键词:心理健康测试,心理咨询,SpringBoot,MySQL
3.5 用例图
首先用例图指的是一种简单表达形式,主要为了让人们通过图例的方式来快速了解到用户和与他相关的功能或者关系的一种表现方式。
3.5.1 用户用例
用户为系统前台的主要角色可进行如下活动:
(1)心理知识查询:用户可以查询各类心理问题的相关信息,了解心理健康方面的知识。
(2)查看新闻咨询:用户可以查看关于校园心理健康的活动,通过学校组织的心理活动,加强对心理知识的学习。
(3)心理测试:用户可以做心理健康测试题目,了解自己的心理健康状况,以便采取相应的措施改善。
(4)在线咨询:用户可以通过私信留言的形式向心理咨询师提问,或在咨询师的在线就诊时间内进行实时咨询。
(5)预约咨询:用户可以预约指定的咨询师进行电话沟通,也可以预约线下咨询,与咨询师面对面交流。
通过上述这些活动,可以创建学生用例图,如图3.1所示。
图3.1 学生用例图
3.5.2 咨询师用例
咨询师作为为学生提供心理咨询服务角色可进行如下活动:
(1)新闻动态管理:咨询师可以对新闻动态和知识库中的信息进行增加、修改、删除,确保内容的准确性和时效性。
(2)心理知识分类管理:咨询师可以对心理知识分类进行增加、修改、删除,以便学生更容易地找到所需的信息。
(3)心理知识内容管理:咨询师可以把页面的心理知识的内容进行修改、删除等操作,确保提供给学生的知识是准确、可靠的。
(4)在线测试内容管理:咨询师可以对在线测试的内容进行增加、修改、删除,以保证测试的科学性和有效性。
(5)回答在线留言:咨询师可以接收咨询者的留言信息,并进行回答,以解答学生的心理健康问题。
(6)接收预约信息:咨询师可以接收到用户的预约信息,可以选择同意预约和拒绝预约,并通过查看学生通讯信息,进行电话回访。
通过上述这些活动,可以创建咨询师用例图,如图3.2所示。
图3.2 咨询师用例图
3.5.3 管理员用例
管理员为系统后台的角色可进行如下活动:
(2)咨询师信息管理:管理员可以对咨询师的信息进行增加、修改、删除,方便管理咨询师的信息。
(3)用户信息管理:管理员可以对注册的学生用户信息进行增加、修改、删除,方便管理学生用户信息。
通过上述这些活动,可以创建管理员用例图,如图3.3所示。
图3.3 管理员用例图
第4章 系统总体设计
4.1 系统实现的重要功能
通过系统,学生可以方便地进行预约,同时还可以在线咨询、提交评价,提高心理健康服务的效果和质量。系统还具备智能推荐和匹配功能,利用大数据和人工智能技术为学生推荐合适的心理咨询师,提高咨询效果。此外,系统还注重数据安全和隐私保护,保证学生个人信息的安全和隐私。
4.2 类图
基于SpringBoot的高校心理咨询预约系统涉及到多个类对象以及它们之间的关系。首先,有测试结果类,它用于存储学生完成心理测试后的分数和结果描述,与测试项目和学生类相关联。接着,测试题目类包含了各种心理测试的具体问题和选项,与测试项目类关联。测试项目类代表整个心理测试,包括测试名称、描述等,与测试题目和测试结果类相关联。
新闻分类则用于对新闻进行分类,例如心理健康、活动通知等。管理员类负责系统后台管理,如对其他类进行增删改查操作。健康知识类包含了各种心理健康知识,如心理问题的识别和处理方法,与新闻分类关联。留言类则用于存储学生与咨询师之间的留言信息。
新闻类存储了关于心理健康方面的新闻、通知和活动等信息,与新闻分类类关联。学生类则代表系统中的学生学生,包括个人信息、登录信息等,与测试结果、留言类相关联。这些类对象之间的关系共同构成了一个完整的高校心理咨询预约系统。创建完整的类图如图4.1所示。
图4.1 系统类图
4.3 序列图
在基于SpringBoot的高校心理咨询预约系统中,序列图可以用于表示学生、咨询师和系统之间的交互流程,如预约、在线咨询等。序列图可以清晰地展示系统中对象之间的消息传递、状态转换和操作调用等细节,帮助系统设计者更好地了解系统交互流程,优化系统设计和性能。
4.3.1 用户预约序列图
用户预约咨询用例的工作流程如下:
(1)用户正确登陆后,进行身份验证,成功后显示登录成功。
(2)用户进入预约页面后,可以查看医生的信息。
(3)用户预约界面页面把用户预约的医生的信息传递到控制器,控制器将预约信息与的医生反馈信息进行比较,判断能否进行预约。
(4)如果同意预约,则进行预约的操作,将预约的信息保存到数据库中。
(5)控制器把预约成功信息反回到预约页面
(6)用户可以从预约页面看到预约成功的提示。
根据基本流程,用户预约的序列图如图4.3所示。
图4.3 用户预约序列图
4.3.2 咨询师修改心理知识序列图
咨询师修改心理知识用例的工作流程如下:
(1)咨询师登陆成功后,显示登录成功,进入咨询师页面。
(2)咨询师在咨询师页面后,选择心理知识模块后,可以查看心理知识信息。
(3)选择需要修改的心理知识内容,进行内容修改。
(4)控制器修改并保存修改后的内容。
(5)数据库把修改成功的信息反回到咨询师页面
其根据基本流程,咨询师修改心理知识序列图如下:
图4.3 咨询师修改心理知识序列图
4.4 活动图
活动图是UML用于对系统的动态行为建模的另一种常用工具,它描述活动的顺序,展现从一个活动到另一个活动的控制流。活动图在本质上是一种流程图,着重表现从一个活动到另一个活动的控制流。由于下面列出用户预约和咨询师修改心理知识的活动图。
4.4.1 用户预约活动图
在用户预约的活动图中,分为三个主要部分,即用户、业务逻辑控制器以及数据库。
(1)首先,用户需要输入正确的登录信息进行身份验证。一旦身份验证成功,用户将成功登录系统。
(2)登录成功后,用户可以进入在线预约界面,然后输入他们想要预约的服务或人员的信息。
(3)此时,预约界面将信息传递给业务逻辑控制器。控制器接收这些信息,并对预约信息进行核查。核查通过后,控制器将向数据库发送查询请求,以确认用户想要预约的服务或人员是否可用。
(4)业务逻辑控制器会根据数据库的查询结果来判断用户预约的服务或人员是否可以预约。如果可预约,控制器将把预约信息添加到数据库中。如果无法预约,控制器将生成一条提示信息,并将其发送回预约界面以供显示。
(5)最后,根据预约结果,业务逻辑控制器会判断预约是否成功。如果预约成功,预约界面将显示预约成功的信息。如果预约未能成功,预约界面将显示预约失败的信息。
总的来说,用户预约活动图描述了从用户登录,输入预约信息,到业务逻辑控制器的验证,数据库的查询,以及最终预约结果的反馈的整个过程。
4.4.2 咨询师修改心理知识活动图
在咨询师修改心理知识的活动图中,我们创建了三个泳道,分别是咨询师对象、业务逻辑控制对象和数据库对象。具体的活动过程如下:
(1)首先,咨询师需要输入正确的用户名和密码。一旦身份验证成功,咨询师便能成功登录系统。
(2)登录成功后,咨询师可以进入修改心理知识的界面,在此界面中输入他们想要修改的心理知识信息。
(3)修改心理知识的界面将信息传递给业务逻辑控制对象。控制对象接收到信息后,会对心理知识信息进行验证,并向数据库查询该心理知识信息是否已经存在。
(4)业务逻辑控制对象会根据数据库的查询结果来判断要修改的心理知识信息是否存在。如果不存在,控制对象会生成一条提示信息,并将其发送回修改心理知识的界面以供显示。如果存在,控制对象则会修改原心理知识信息,并保存到数据库中。
(5)最后,根据修改心理知识信息的结果,业务逻辑控制对象会判断修改信息是否成功。如果成功,修改心理知识的界面将显示修改成功的信息。如果未能成功,修改心理知识的界面将显示修改失败的信息。
总的来说,咨询师修改心理知识的活动图描述了从咨询师登录系统,输入修改信息,通过业务逻辑控制对象的验证和数据库的查询,到最终修改结果反馈的整个过程。。
适用场景:
技术栈
1. 后端:Spring+SpringMVC+Mybatis
2. 前端:JSP+CSS+JavaScript+jQuery
使用说明
1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;
2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;
若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;
3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;
4. 运行项目,在浏览器中输入http://localhost:8080/ 登录
运行截图
用户管理控制层:
package com.houserss.controller;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.houserss.common.Const;
import com.houserss.common.Const.Role;
import com.houserss.common.ServerResponse;
import com.houserss.pojo.User;
import com.houserss.service.IUserService;
import com.houserss.service.impl.UserServiceImpl;
import com.houserss.util.MD5Util;
import com.houserss.util.TimeUtils;
import com.houserss.vo.DeleteHouseVo;
import com.houserss.vo.PageInfoVo;
/**
* Created by admin
*/
@Controller
@RequestMapping("/user/")
public class UserController {
@Autowired
private IUserService iUserService;
/**
* 用户登录
* @param username
* @param password
* @param session
* @return
*/
@RequestMapping(value = "login.do",method = RequestMethod.POST)
@ResponseBody
public ServerResponse<User> login(User user,String uvcode, HttpSession session){
String code = (String)session.getAttribute("validationCode");
if(StringUtils.isNotBlank(code)) {
if(!code.equalsIgnoreCase(uvcode)) {
return ServerResponse.createByErrorMessage("验证码不正确");
}
}
ServerResponse<User> response = iUserService.login(user.getUsername(),user.getPassword());
if(response.isSuccess()){
session.setAttribute(Const.CURRENT_USER,response.getData());
}
return response;
}
}
管理员管理控制层:
package com.sxl.controller.admin;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.sxl.controller.MyController;
@Controller("adminController")
@RequestMapping(value = "/admin")
public class AdminController extends MyController {
@RequestMapping(value = "/index")
public String frame(Model model, HttpServletRequest request)throws Exception {
return "/admin/index";
}
@RequestMapping(value = "/main")
public String main(Model model, HttpServletRequest request)throws Exception {
return "/admin/main";
}
@RequestMapping(value = "/tj1")
public String tj1(Model model, HttpServletRequest request)throws Exception {
String sql="select DATE_FORMAT(insertDate,'%Y-%m-%d') dates,sum(allPrice) price from t_order order by DATE_FORMAT(insertDate,'%Y-%m-%d') desc";
List<Map> list = db.queryForList(sql);
model.addAttribute("list", list);
System.out.println(list);
return "/admin/tj/tj1";
}
@RequestMapping(value = "/password")
public String password(Model model, HttpServletRequest request)throws Exception {
return "/admin/password";
}
@RequestMapping(value = "/changePassword")
public ResponseEntity<String> loginSave(Model model,HttpServletRequest request,String oldPassword,String newPassword) throws Exception {
Map admin = getAdmin(request);
if(oldPassword.equals(admin.get("password").toString())){
String sql="update t_admin set password=? where id=?";
db.update(sql, new Object[]{newPassword,admin.get("id")});
return renderData(true,"1",null);
}else{
return renderData(false,"1",null);
}
}
}
修改密码业务逻辑:
package com.sxl.controller.admin;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.sxl.controller.MyController;
@Controller("userController")
@RequestMapping(value = "/user")
public class UserController extends MyController {
@RequestMapping(value = "/index")
public String frame(Model model, HttpServletRequest request)throws Exception {
return "/user/index";
}
@RequestMapping(value = "/main")
public String main(Model model, HttpServletRequest request)throws Exception {
return "/user/main";
}
@RequestMapping(value = "/password")
public String password(Model model, HttpServletRequest request)throws Exception {
return "/user/password";
}
@RequestMapping(value = "/changePassword")
public ResponseEntity<String> loginSave(Model model,HttpServletRequest request,String oldPassword,String newPassword) throws Exception {
Map user = getUser(request);
if(oldPassword.equals(user.get("password").toString())){
String sql="update t_user set password=? where id=?";
db.update(sql, new Object[]{newPassword,user.get("id")});
return renderData(true,"1",null);
}else{
return renderData(false,"1",null);
}
}
@RequestMapping(value = "/mine")
public String mine(Model model, HttpServletRequest request)throws Exception {
Map user =getUser(request);Map map = db.queryForMap("select * from t_user where id=?",new Object[]{user.get("id")});model.addAttribute("map", map); return "/user/mine";
}
@RequestMapping(value = "/mineSave")
public ResponseEntity<String> mineSave(Model model,HttpServletRequest request,Long id
,String username,String password,String name,String gh,String mobile) throws Exception{
int result = 0;
String sql="update t_user set name=?,gh=?,mobile=? where id=?";
result = db.update(sql, new Object[]{name,gh,mobile,id});
if(result==1){
return renderData(true,"操作成功",null);
}else{
return renderData(false,"操作失败",null);
}
}
}
通用管理模块:
package com.sxl.controller;
import java.nio.charset.Charset;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import com.sxl.util.JacksonJsonUtil;
import com.sxl.util.StringUtil;
import com.sxl.util.SystemProperties;
public class BaseController {
public static final Long EXPIRES_IN = 1000 * 3600 * 24 * 1L;// 1天
@Autowired
private SystemProperties systemProperties;
/**
* 获得配置文件内容
*/
public String getConfig(String key) {
return systemProperties.getProperties(key);
}
/**
* 返回服务器地址 like http://192.168.1.1:8441/UUBean/
*/
public String getHostUrl(HttpServletRequest request) {
String hostName = request.getServerName();
Integer hostPort = request.getServerPort();
String path = request.getContextPath();
if (hostPort == 80) {
return "http://" + hostName + path + "/";
} else {
return "http://" + hostName + ":" + hostPort + path + "/";
}
}
/***
* 获取当前的website路径 String
*/
public static String getWebSite(HttpServletRequest request) {
String returnUrl = request.getScheme() + "://"
+ request.getServerName();
if (request.getServerPort() != 80) {
returnUrl += ":" + request.getServerPort();
}
returnUrl += request.getContextPath();
return returnUrl;
}
/**
* 初始化HTTP头.
*
* @return HttpHeaders
*/
public HttpHeaders initHttpHeaders() {
HttpHeaders headers = new HttpHeaders();
MediaType mediaType = new MediaType("text", "html",
Charset.forName("utf-8"));
headers.setContentType(mediaType);
return headers;
}
/**
* 返回 信息数据
*
* @param status
* @param msg
* @return
*/
public ResponseEntity<String> renderMsg(Boolean status, String msg) {
if (StringUtils.isEmpty(msg)) {
msg = "";
}
String str = "{\"status\":\"" + status + "\",\"msg\":\"" + msg + "\"}";
ResponseEntity<String> responseEntity = new ResponseEntity<String>(str,
initHttpHeaders(), HttpStatus.OK);
return responseEntity;
}
/**
* 返回obj数据
*
* @param status
* @param msg
* @param obj
* @return
*/
public ResponseEntity<String> renderData(Boolean status, String msg,
Object obj) {
if (StringUtils.isEmpty(msg)) {
msg = "";
}
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"status\":\"" + status + "\",\"msg\":\"" + msg + "\",");
sb.append("\"data\":" + JacksonJsonUtil.toJson(obj) + "");
sb.append("}");
ResponseEntity<String> responseEntity = new ResponseEntity<String>(
sb.toString(), initHttpHeaders(), HttpStatus.OK);
return responseEntity;
}
/***
* 获取IP(如果是多级代理,则得到的是一串IP值)
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if (ip != null && ip.length() > 0) {
String[] ips = ip.split(",");
for (int i = 0; i < ips.length; i++) {
if (!"unknown".equalsIgnoreCase(ips[i])) {
ip = ips[i];
break;
}
}
}
return ip;
}
/**
* 国际化获得语言内容
*
* @param key
* 语言key
* @param args
* @param argsSplit
* @param defaultMessage
* @param locale
* @return
*/
public static String getLanguage(String key, String args, String argsSplit,
String defaultMessage, String locale) {
String language = "zh";
String contry = "cn";
String returnValue = defaultMessage;
if (!StringUtil.isEmpty(locale)) {
try {
String[] localeArray = locale.split("_");
language = localeArray[0];
contry = localeArray[1];
} catch (Exception e) {
}
}
try {
ResourceBundle resource = ResourceBundle.getBundle("lang.resource",
new Locale(language, contry));
returnValue = resource.getString(key);
if (!StringUtil.isEmpty(args)) {
String[] argsArray = args.split(argsSplit);
for (int i = 0; i < argsArray.length; i++) {
returnValue = returnValue.replace("{" + i + "}",
argsArray[i]);
}
}
} catch (Exception e) {
}
return returnValue;
}
}