SpringBoot+Vue实现前后端分离的心理咨询系统

news2024/10/7 12:18:55

文末获取源码

开发语言:Java

使用框架:spring boot

前端技术:JavaScript、Vue.js 、css3

开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code

数据库:MySQL 5.7/8.0

数据库管理工具:phpstudy/Navicat

JDK版本:Java jdk8

Maven:apache-maven 3.8.1-bin

目录

一、前言介绍

二、系统功能 

三、系统前台模块

3.1系统登录页面

3.2问卷调查页面

3.3心理资讯页面

3.4咨询师信息页面

3.5咨询师详情页面 

3.6减压大本营详情页面 

四、管理员功能模块

4.1站点管理模块

4.2用户管理模块

4.3内容管理模块 

4.4更多管理模块 

五、咨询师功能模块

5.1问卷调查增加页面

5.2预约信息页面

六、普通用户功能模块

6.1预约信息页面 

七、部分核心代码 

7.1问卷调查关键代码

7.2心理咨询管理的关键代码

7.3用户登录的关键代码


一、前言介绍

心理咨询系统主要功能模块包括站点管理、用户管理、内容管理、更多管理、咨询师信息、预约信息、咨询信息、减压大本营、咨询方向等,采取本系统此次设计前端视图界面选择Visual Studio Code来完成,系统功能设计由Java面向对象编程语言实现,系统开发工具选用IDEA,后台数据库为MySQL,项目管理工具选用Navicat,总体的设计框架为最近很方便的springboot框架,实现了本系统的全部功能。本次报告,首先分析了研究的背景、作用、意义,为研究工作的合理性打下了基础。针对心理咨询系统的各项需求以及技术问题进行分析,证明了系统的必要性和技术可行性,然后对设计系统需要使用的技术软件以及设计思想做了基本的介绍,最后来实现心理咨询系统和部署运行使用它。

二、系统功能 

本心理咨询系统主要包括三大功能模块,即管理员、咨询师、用户功能模块。

(1)前台用户:首页、问卷调查、公告消息、心理资讯、咨询师信息、减压大本营、登录注册、我的(我的账户、我的收藏、个人中心、退出)。 

(2)用户后台: 首页、预约信息、咨询信息。

(3)管理员模块:系统中的核心用户是管理员,管理员登录后,通过管理员来管理后台系统。主要功能有:站点管理(轮播图、公告栏),用户管理(管理员、普通用户、咨询师),内容管理(心理资讯、资讯分类、问卷调查),更多管理(咨询师信息、预约信息、咨询信息、减压大本咨询方向)。

(4)咨询师模块:心理资讯、资讯分类、问卷调查、咨询师信息、预约信息、咨询信息、减压大本营。

三、系统前台模块

3.1系统登录页面

3.2问卷调查页面

3.3心理资讯页面

3.4咨询师信息页面

3.5咨询师详情页面 

3.6减压大本营详情页面 

四、管理员功能模块

4.1站点管理模块

4.2用户管理模块

4.3内容管理模块 

4.4更多管理模块 

五、咨询师功能模块

5.1问卷调查增加页面

5.2预约信息页面

六、普通用户功能模块

6.1预约信息页面 

七、部分核心代码 

7.1问卷调查关键代码

  @RequestMapping("/get_obj")

    public Map<String, Object> obj(HttpServletRequest request) {

        List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));

        if (resultList.size() > 0) {

            JSONObject jsonObject = new JSONObject();

            jsonObject.put("obj",resultList.get(0));

            return success(jsonObject);

        } else {

            return success(null);

        }

}

7.2心理咨询管理的关键代码

  @PostMapping("/add")

    @Transactional

    public Map<String, Object> add(HttpServletRequest request) throws IOException {

        service.insert(service.readBody(request.getReader()));

        return success(1);

    }

    @Transactional

    public Map<String, Object> addMap(Map<String,Object> map){

        service.insert(map);

        return success(1);

}

    }

7.3用户登录的关键代码

  /**

     * 登录

     * @param data

     * @param httpServletRequest

     * @return

     */

    @PostMapping("login")

    public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {

        log.info("[执行登录接口]");

        String username = data.get("username");

        String email = data.get("email");

        String phone = data.get("phone");

        String password = data.get("password");

        List resultList = null;

        QueryWrapper wrapper = new QueryWrapper<User>();

        Map<String, String> map = new HashMap<>();

        if(username != null && "".equals(username) == false){

            map.put("username", username);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }

        else if(email != null && "".equals(email) == false){

            map.put("email", email);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }

        else if(phone != null && "".equals(phone) == false){

            map.put("phone", phone);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }else{

            return error(30000, "账号或密码不能为空");

        }

        if (resultList == null || password == null) {

            return error(30000, "账号或密码不能为空");

        }

        //判断是否有这个用户

        if (resultList.size()<=0){

            return error(30000,"用户不存在");

        }

        User byUsername = (User) resultList.get(0);

        Map<String, String> groupMap = new HashMap<>();

        groupMap.put("name",byUsername.getUserGroup());

        List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));

        if (groupList.size()<1){

            return error(30000,"用户组不存在");

        }

        UserGroup userGroup = (UserGroup) groupList.get(0);

        //查询用户审核状态

        if (!StringUtils.isEmpty(userGroup.getSourceTable())){

            String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());

            if (res==null){

                return error(30000,"用户不存在");

            }

            if (!res.equals("已通过")){

                return error(30000,"该用户审核未通过");

            }

        }

        //查询用户状态

        if (byUsername.getState()!=1){

            return error(30000,"用户非可用状态,不能登录");

        }

        String md5password = service.encryption(password);

        if (byUsername.getPassword().equals(md5password)) {

            // 存储Token到数据库

            AccessToken accessToken = new AccessToken();

            accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));

            accessToken.setUser_id(byUsername.getUserId());

            tokenService.save(accessToken);

            // 返回用户信息

            JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));

            user.put("token", accessToken.getToken());

            JSONObject ret = new JSONObject();

            ret.put("obj",user);

            return success(ret);

        } else {

            return error(30000, "账号或密码不正确");

        }

}

    public String select(Map<String,String> query,Map<String,String> config){

        StringBuffer sql = new StringBuffer("select ");

        sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");

        sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));

        if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){

            sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");

        }

        if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){

            sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");

        }

        if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){

            int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;

            int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;

            sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);

        }

        log.info("[{}] - 查询操作,sql: {}",table,sql);

        return sql.toString();

}

    public List selectBaseList(String select) {

        List<Map<String,Object>> mapList = baseMapper.selectBaseList(select);

        List<E> list = new ArrayList<>();

        for (Map<String,Object> map:mapList) {

            list.add(JSON.parseObject(JSON.toJSONString(map),eClass));

        }

        return list;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录刷题记录 day38 最后一块石头的重量+目标和+1和0

代码随想录刷题记录 day38 最后一块石头的重量目标和1和0 参考&#xff1a;代码随想录 1049. 最后一块石头的重量 II 思想 把数组的石头尽可能地分成大小相等地两个集合 即sum/2&#xff1b; 容量为sum/2地背包尽可能地装满石头。 代码 class Solution {public int last…

C/C++入门002-C语言组成

文章目录1. C工程创建1.1 基于Code::Blocks创建工程1.2 Code::Blocks界面设置2. C语言程序组成2.1函数2.1.1 主函数2.1.2 其它函数2.1.3 如何执行定义好的函数2.2 输出函数printf2.2.1 编译输出为exe可执行文件2.3 C语言要求2.3.1 注释2.4 C语言程序练习2.4.1 输出三角形代码1&…

【MySQL基础】数据库定义语言DDL相关操作有那些?

目录 一、什么是DDL? 二、对数据库的常用操作 三、对表结构的常见操作 四、修改表结构格式 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、什么是DDL? DDL(Data Definition Language) 被称为数据库定义语言&#xff0c;该…

如何基于企业微信通讯录,同步生成对外的LDAP服务?

不少企业使用企业微信作为办公协同的工具&#xff0c;并通过企业微信的组织架构&#xff08;即通讯录&#xff09;来管理员工身份。那么如何利用当前企业微信的组织架构和用户身份&#xff0c;同步生成对外的 LDAP 服务呢&#xff1f; 为什么要同步创建 LDAP 服务&#xff1f; …

【超级详细步骤】pyinstaller 打包 exe 其实特别简单

文章目录为什么要打包&#xff1f;安装pyinstaller技术提升pyinstaller 打包单个.py文件步骤1&#xff1a;单击以下区域输入 cmd 切换到目标文件目录2&#xff1a;输入 pyinstaller -F -w Analog_clock.py 回车即可3&#xff1a;打包成功会在.py文件同级目录下出现以下文件&…

VM——http协议及json解析

1、http协议实现参考&#xff1a;(180条消息) C# Http通讯协议的整理_C#Code- Sheep的博客-CSDN博客_c# http协议 2、Json解析参考&#xff1a;c#解析json字符串处理&#xff08;最清晰易懂的方法&#xff09; - 轩辕箭 - 博客园 (cnblogs.com) 3、VM中http实现步骤&#xff…

WordPress 主题模板QUX9.1.4开心版无授权限制 DUX二开增强主题

源码测评&#xff1a;WordPress主题QUX9.1.4开心版&#xff0c;我安装测试了下&#xff0c;看来没什么问题&#xff0c;想学习参考的网友可以试下。 更新日志&#xff1a; 2020/3/19更新 V9.1.4 推荐&#xff1a;★★★★★ 新增 新增夜间模式&#xff08;主题设置 – 客服 –…

基于Python+Django+Vue+MYSQL的社团管理系统

项目介绍 随着近年来大学教育的改革&#xff0c;大部分高校普遍开始实行学分制、弹性学制改革&#xff0c;这样学校在学生的学习和生活中所起的作用慢慢减小&#xff0c;不再是一种直接由学校决定学生的大学生活。学生对自己的学习和生活有了更大的自主权&#xff0c;在课余也…

虹科分享 | 盘点世界杯有趣小知识!带你感受体育赛事可视化的快乐!

卡塔尔世界杯 2022年卡塔尔世界杯是第二十二届世界杯足球赛&#xff0c;是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。 今年卡塔尔世界杯可谓精彩纷呈&#xff0c;花2000个亿在沙漠里打造出的空调球场、洗脑又魔性的“母鸡生蛋”主题曲《Tu…

【Linux】进程创建、退出和等待(fork、exit和_exit、waitpid和wait、阻塞和非阻塞)

文章目录1、进程创建1.1 理解fork函数1.2 fork函数的细节2、进程退出2.1 退出码2.2 exit函数和_exit系统调用3、进程等待3.1 wait和waitpid3.2 阻塞和非阻塞1、进程创建 进程的创建主要依靠系统接口fork函数。 fork函数从已存在的一个进程中&#xff0c;创建一个子进程&#…

刚接触测试如何编写测试用例?看看摸鱼5年的老点工是怎么写的

给你个需求&#xff0c;你要怎么转变成最终的用例&#xff1f; 直接把需求文档翻译一下就完事了。 老点工拿到需求后的标准操作&#xff1a; 第一步&#xff1a;解析需求 先解析需求-找出所有需求中的动词&#xff0c;再列出所有测试点。测试点过程不断发散&#xff0c;对于…

第十四章: ReentrantLock、ReentrantReadWriteLock、StampedLock

相关面试题锁的演变ReentrantReadWriteLock锁降级案例演示一案例演示二总结为什么要有锁降级邮戳锁 StampedLock邮戳锁的特点案例演示一案例演示二StampedLock 缺点相关面试题 你说你用过读写锁&#xff0c;锁饥饿问题是什么&#xff1f;有没有比读写锁更快的锁&#xff1f;St…

域名解析函数 gethostbyname

在实现TCP/UDP编程的时候&#xff0c;服务端绑定的IP地址是点分十进制的&#xff0c;如124.222.215.205&#xff0c;如果提供的是域名&#xff0c;此时我们需要将域名转换成点分十进制的IP地址&#xff0c;这个过程就是 “ 域名解析 ”&#xff0c;实现域名转换的函数就是 geth…

Python Aws Ubuntu20 配置多IP

1. 业务场景&#xff1a; 高频次交易需要多次访问接口&#xff0c;配置单服务器多IP绕过币安单个IP频率限制 2. AWS实例选择&#xff1a; t3系列&#xff0c;东京A区&#xff0c;ubuntu20 这是我测试的币安延迟最低的配置&#xff08;平均6ms&#xff09; 换一个区域、一个系…

【王道计算机网络笔记】数据链路层-数据链路层设备

文章目录物理层扩展以太网链路层扩展以太网网桥透明网桥源路由网桥以太网交换机直通式交换机存储转发式交换机冲突域和广播域物理层扩展以太网 主机和集线器不能超过100m&#xff0c;超过100m会失真严重&#xff0c;无法恢复&#xff0c;扩展以太网的方法&#xff1a; 通过光纤…

欢迎报名Rust China Hackathon 2022 达坦科技组

12月4日下午&#xff0c;DatenLord就2022Rust China Hackathon大赛活动企业组&#xff08;达坦科技组&#xff09;的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解&#xff0c;同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节&#xff0c;细…

目标检测算法——图像分割数据集汇总(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批图像分割数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&am…

给visCode编辑器添加背景图

看见很多大牛的visCode编辑器上有个背景图&#xff0c;感觉挺有逼格的&#xff0c;要想跟大牛一样有逼格&#xff0c;那先把编辑器设置的跟大牛的逼格一样高 话不多说&#xff0c;开始 第一步&#xff1a;先安装背景扩展 第二步&#xff1a;点击选择扩展设置 第三步&#xff1…

原码、反码、补码的互相转换

原码、反码、补码的互相转换 简介&#xff1a;本文是为了计算机组成原理复习&#xff0c;本文以具体题目的方式来对原码、反码、补码的互相转换进行讲解。 概述 原码 &#xff1a;最高位是符号位&#xff0c;0代表正数&#xff0c;1代表负数&#xff0c;非符号位为该数字绝对…

实战web漏洞挖掘小技巧

几个月前看到国外的bug bounty tips在传Host攻击技巧&#xff0c;前阵子又看到国内有不少文章总结&#xff0c;冷渗透就不再复述了&#xff0c;直接介绍实际业务场景中碰到的案例。 0x01 自定义Host—窃取Token 1. 找到重置密码处&#xff0c;填写任意一个受害者邮箱帐号&#…