基于Java+SpringBoot+Vue的计算机类考研交流平台设计与实现

news2024/9/21 10:53:34

 博主介绍:擅长Java、微信小程序、Python、Android等,专注于Java技术领域和毕业项目实战

🍅文末获取源码联系🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

Java项目精品实战案例(300套)
Java微信小程序项目实战(200套)

Python项目精品实战案例(100套)

一、效果演示

二、前言介绍

高校的大学生考研是继高校的高等教育更上一层的表现形式,教育的发展是我们社会的根本,那么信息技术的发展又是改变我们生活的重要因素,生活当中各种各样的场景都存在着信息技术的发展。信息技术发展WEB信息化的到来让人们的生活感受到了科技带来的便利,不认识的地方导航就可以找到,没去过的旅游景点线上就可以看到等等;数字化技术的发展给各种各样的企业带来了福音,智能制造、数字化转型给企业的发展提供技术型的力量。这些仅仅是平常接触到的场景,更有些更深入的算法场景更是改变人们的生活,就拿出行最多使用到的导航算法而言,不同时刻所需要的时间及路况也是大不相同的,没有强大的算法功能支持这些都是很难做到的。教育发展始终是我们社会各界关注的一个重要因素,高校信息化的建设也随着互联网的大潮正在不断的进行创新,就高校信息化建设当中以计算机考研最受学生、老师的关注,而传统的考研交流方式还要比较麻烦的即要考虑学生多,又要考虑考研交流地点选择等等,非常麻烦。所以说开发一款计算机类考研交流平台来说非常重要。

三、主要技术

3.1、JS语言

在计算机类考研交流平台开发的过程当中免不了使用我们的前端开发语言,而且前端技术的开发已经变得功能非常强大,早已不再是使用JSP来进行页面构建的时代了,对于JS技术而言,学过Java开发或者是前端技术开发的同学们并不陌生,它是应用系统构建页面的一个重要组成部分。

3.2、B/S架构

     B/S架构(Browser/Server Architecture)它是一种常见的软件开发架构。其主要由手机客户端浏览器和服务器构成。手机客户端浏览器负责操作界面的展现和互动,服务器负责业务逻辑的处理方法和文件存储。B与传统C/S架构对比,/S架构具有更高的扩展性、便于日常维护布署等特点,因而在当代软件开发中得到广泛应用

     在B/S架构下,手机客户端浏览器应用HTML、CSS、JavaScript等Web科研开发网页页面积极与服务器的数据交换实现业务作用。服务器应用Java等各种编程语言、Python等完成业务逻辑,根据数据存储数据信息。全部体系结构清楚,完成了静态页面,大大提升了软件开发的效率和效果。

3.3、Spring Boot框架

   Spring Boot是一个根据Spring框架的轻量快速开发框架,能够帮助开发者迅速搭建靠谱高效率应用程序。根据自动部署和协议书好于配备,优化了Spring的研发流程,使开发者可以更加致力于业务逻辑。

    Spring Boot有许多特性,其中最重要的是它提供了内置的Tomcat、Jetty、Undertow等Web服务器,可以轻松构建Web应用程序。另外,它还提供了自动配置、无需编写XML文件、等功能。这些特性使得开发人员可以快速创建和部署应用程序,而无需处理复杂的配置文件和其他繁琐的任务。
 

 

四、系统设计

4.1、主要功能模块设计         

4.2、系统流程设计

五、功能截图

5.1、首页

涉及任何一个系统的首页,不仅仅是为了美观。主要的功能还是能够让用户一眼获得系统的。主题以及系统是做什么的。所以说系统的首页是非常关键的一个部分,能够将系统首页体现淋漓尽致,才是能够让我们用户喜爱系统的一个关键。那么此次设计呢?我们把系统的首页作为一个关键的设计,像还请教了许多同学,那么计算机类考研交流平台首页如下图所示:

5.2、学校信息

学生最关心的就是考研的信息查询了,学校信息是我们系统当中的一个特色功能,可以通过学校信息找到关于此专题的所有信息都进行展示嘛,不管是用户还是管理者,都可以通过新闻信息获得到我们所需要的信息。当然设计方面呢,我们还是使用列表的形式,为了能够展现更多的信息。如下图所示:

5.3、登录页面

登录的信息也是我们经过设计的,别看只有几个字段,它的意义是大不相同的。管理员登录页面需要输入一些必要信息。如下图所示:

5.4、后台管理页面

在考研交流平台当中,其实和其它的信息系统没什么区别。说实话后台管理页面的风格,每种应用都有自己不同的风格,而大多数的风格也都是按照菜单功能树、操作区域等这种布局进行区分的。在菜单功能树当中有后台管理应用的全部功能,而且这些菜单树的入口也仅仅只是改变右边操作区域的内容,这样一来多个模块可以使用同一个菜单树,既保证了风格统一的美观程度,又能让开发在代码工作量上减少很多。在操作区域还是以上、中、下之样的方式来进行的,每块区域都有它自己的位置功能。如下图所示:

这里功能太多,就不一一展示啦

六、数据库设计(部分)

在数据库实现的前一步呢,最关键的一个操作就是E-R图,我们通过E-R图就是能够为了让更清楚地理解出数据库表与表之间的关系,以及每个表之间的属性,那么E-R图也是数据库设计的一个重要环节。如下图所示: 

 

 

七、代码参考

package com.example.controller;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.example.common.Result;
import com.example.common.ResultCode;
import com.example.entity.*;
import com.example.exception.CustomException;

import com.example.service.AdminInfoService;
import com.example.service.YonghuxinxiInfoService;


import org.springframework.web.bind.annotation.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import cn.hutool.json.JSONUtil;

import java.util.*;
import java.util.stream.Collectors;

@RestController
public class AccountController {

    @Value("${authority.info}")
    private String authorityStr;

    @Resource
    private AdminInfoService adminInfoService;
	@Resource
private YonghuxinxiInfoService yonghuxinxiInfoService;

	






    @PostMapping("/login")
    public Result<Account> login(@RequestBody Account account,  HttpServletRequest request) {
        if (StrUtil.isBlank(account.getUsername()) || StrUtil.isBlank(account.getMima()) || account.getLevel() == null) {
            throw new CustomException(ResultCode.PARAM_LOST_ERROR);
        }
        String level = account.getLevel();
        Account login = new Account();
        if (level.equals("管理员")) {
            login = adminInfoService.login(account.getUsername(), account.getMima());
        }
		
if (level.equals("注册用户")) {
            login = yonghuxinxiInfoService.login(account.getUsername(), account.getMima());
            //yoxusxhenhe if(login.getStatus().equals("否")){return Result.error("500","帐号未审核通过,请联系管理员");}
        }

		


        request.getSession().setAttribute("user", login);
        return Result.success(login);
    }

  

    @GetMapping("/logout")
    public Result logout(HttpServletRequest request) {
        request.getSession().setAttribute("user", null);
        return Result.success();
    }

    @GetMapping("/auth")
    public Result getAuth(HttpServletRequest request) {
        Object user = request.getSession().getAttribute("user");
        if(user == null) {
            return Result.error("401", "未登录");
        }
        return Result.success(user);
    }

    @GetMapping("/getAccountInfo")
    public Result<Object> getAccountInfo(HttpServletRequest request) {
        Account account = (Account) request.getSession().getAttribute("user");
        if (account == null) {
            return Result.success(new Object());
        }
        String level = account.getLevel();
        if (level.equals("管理员")) {
            return Result.success(adminInfoService.findById(account.getId()));
        }
		if (level.equals("注册用户")) { return Result.success(yonghuxinxiInfoService.findById(account.getId())); }




        return Result.success(new Object());
    }

    @GetMapping("/getSession")
    public Result<Map<String, String>> getSession(HttpServletRequest request) {
        Account account = (Account) request.getSession().getAttribute("user");
        if (account == null) {
            return Result.success(new HashMap<>(1));
        }
        Map<String, String> map = new HashMap<>(1);
        map.put("username", account.getUsername());
        return Result.success(map);
    }

    @GetMapping("/getAuthority")
    public Result<List<AuthorityInfo>> getAuthorityInfo() {
        List<AuthorityInfo> authorityInfoList = JSONUtil.toList(JSONUtil.parseArray(authorityStr), AuthorityInfo.class);
        return Result.success(authorityInfoList);
    }

    /**
     * 获取当前用户所能看到的模块信息
     * @param request
     * @return
     */
    @GetMapping("/authority")
    public Result<List<Integer>> getAuthorityInfo(HttpServletRequest request) {
        Account user = (Account) request.getSession().getAttribute("user");
        if (user == null) {
            return Result.success(new ArrayList<>());
        }
        JSONArray objects = JSONUtil.parseArray(authorityStr);
        for (Object object : objects) {
            JSONObject jsonObject = (JSONObject) object;
            if (user.getLevel().equals(jsonObject.getStr("level"))) {
                JSONArray array = JSONUtil.parseArray(jsonObject.getStr("models"));
                List<Integer> modelIdList = array.stream().map((o -> {
                    JSONObject obj = (JSONObject) o;
                    return obj.getInt("modelId");
                })).collect(Collectors.toList());
                return Result.success(modelIdList);
            }
        }
        return Result.success(new ArrayList<>());
    }

    @GetMapping("/permission/{modelId}")
    public Result<List<Integer>> getPermission(@PathVariable Integer modelId, HttpServletRequest request) {
        List<AuthorityInfo> authorityInfoList = JSONUtil.toList(JSONUtil.parseArray(authorityStr), AuthorityInfo.class);
        Account user = (Account) request.getSession().getAttribute("user");
        if (user == null) {
            return Result.success(new ArrayList<>());
        }
        Optional<AuthorityInfo> optional = authorityInfoList.stream().filter(x -> x.getLevel().equals(user.getLevel())).findFirst();
        if (optional.isPresent()) {
            Optional<AuthorityInfo.Model> firstOption = optional.get().getModels().stream().filter(x -> x.getModelId().equals(modelId)).findFirst();
            if (firstOption.isPresent()) {
                List<Integer> info = firstOption.get().getOperation();
                return Result.success(info);
            }
        }
        return Result.success(new ArrayList<>());
    }

    @PutMapping("/updateMima")
    public Result updateMima(@RequestBody Account info, HttpServletRequest request) {
        Account account = (Account) request.getSession().getAttribute("user");
        if (account == null) {
            return Result.error(ResultCode.USER_NOT_EXIST_ERROR.code, ResultCode.USER_NOT_EXIST_ERROR.msg);
        }
        String oldMima = SecureUtil.md5(info.getMima());
        if (!oldMima.equals(account.getMima())) {
            return Result.error(ResultCode.PARAM_PASSWORD_ERROR.code, ResultCode.PARAM_PASSWORD_ERROR.msg);
        }
        info.setMima(SecureUtil.md5(info.getNewMima()));
        String level = account.getLevel();
        if (level.equals("管理员")) {
            AdminInfo adminInfo = new AdminInfo();
            BeanUtils.copyProperties(info, adminInfo);
            adminInfoService.update(adminInfo);
        }
		
if (level.equals("注册用户")) {
            YonghuxinxiInfo yonghuxinxiInfo = new YonghuxinxiInfo();
            BeanUtils.copyProperties(info, yonghuxinxiInfo);
            yonghuxinxiInfoService.update(yonghuxinxiInfo);
        }



        info.setLevel(level);
        info.setUsername(account.getUsername());
        // 清空session,让用户重新登录
        request.getSession().setAttribute("user", null);
        return Result.success();
    }
    @PostMapping("/resetMima")
    public Result resetMima(@RequestBody Account account) {
        String level = account.getLevel();
        if (level.equals("管理员")) {
            AdminInfo info = adminInfoService.findByUserName(account.getUsername());
            if (info == null) {
                return Result.error(ResultCode.USER_NOT_EXIST_ERROR.code, ResultCode.USER_NOT_EXIST_ERROR.msg);
            }
            info.setMima(SecureUtil.md5("123456"));
            adminInfoService.update(info);
        }


        return Result.success();
    }
}

 八、源码获取

大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻

Java项目精品实战案例(300套)

Java微信小程序项目实战(200套)

Python项目精品实战案例(100套)

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

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

相关文章

React-View-UI组件库封装Loading加载中源码

目录 组件介绍Loading API能力组件源码组件测试源码组件库线上地址 组件介绍 Loading组件是日常开发用的很多的组件&#xff0c;这次封装主要包含两种状态的Loading&#xff0c;旋转、省略号&#xff0c;话不多说先看一下组件的文档页面吧&#xff1a; 正在上传…重新上传取…

掌握imgproc组件:opencv-图像变换

图像变换 1. 基于OpenCV的边缘检测1.1 边缘检测的一般步骤1.2 canny算子1.2.1 Canny边缘检测步骤&#xff1a;1.2.2 Canny边缘检测&#xff1a;Canny()函数1.2.3 Canny边缘检测案例 1.3 sobel算子1.3.1 sobel算子的计算过程1.3.2 使用Sobel算子&#xff1a;Sobel()函数1.3.3 示…

模拟高并发下RabbitMQ的削峰作用

在并发量很高的时候&#xff0c;服务端处理不过来客户端发的请求&#xff0c;这个时候可以使用消息队列&#xff0c;实现削峰。原理就是请求先打到队列上&#xff0c;服务端从队列里取出消息进行处理&#xff0c;处理不过来的消息就堆积在消息队列里等待。 可以模拟一下这个过…

生态+公链:中创面向未来的区块链建设!

未来的区块链市场&#xff0c;一定属于能够将区块链技术与应用完美结合在一起的产品。从互联网的发展历程来看&#xff0c;最后的竞争往往会集中到生态与兼容性。 如何将区块链的落地和应用更加有机地结合在一起&#xff0c;从而让区块链的功能和作用得到最大程度的发挥&#…

机器学习8:特征组合-Feature Crosses

特征组合也称特征交叉&#xff08;Feature Crosses&#xff09;&#xff0c;即不同类型或者不同维度特征之间的交叉组合&#xff0c;其主要目的是提高对复杂关系的拟合能力。在特征工程中&#xff0c;通常会把一阶离散特征两两组合&#xff0c;构成高阶组合特征。可以进行组合的…

css:去除input和textarea默认边框样式并美化

input input默认样式和focus样式 参考element-ui的css&#xff0c;可以实现如下效果 实现代码 <style>/* 去除默认样式 */input {border: none;outline: none;padding: 0;margin: 0;-webkit-appearance: none;-moz-appearance: none;appearance: none;background-im…

ElasticSearch 8.0+ 版本Windows系统启动

下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases/winlogbeat-8-8-1 解压\elasticsearch\elasticsearch-8.5.1 进入bin目录&#xff0c;启动elasticsearch.bat 问题1&#xff1a; warning: ignoring JAVA_HOMED:\jdk1.8.0_271; using bundled JDK J…

使用凌鲨连接SSH服务器

SSH&#xff08;Secure Shell&#xff09;是一种加密的网络协议&#xff0c;用于安全地连接远程服务器。它提供了一种安全的通信方式&#xff0c;使得用户可以在不受干扰的情况下远程访问服务器。SSH协议的加密技术可以保护用户的登录信息和数据传输过程中的安全性。 SSH对于服…

伦敦银同业拆借利率查询

伦敦银同业拆借利率&#xff08;London InterBank Offered rate&#xff09;简称Libor&#xff0c;它是伦敦银业之间在货币市场的无担保借贷利率&#xff0c;主要报价有五种币别&#xff1a;美元、欧元、英镑、日圆、瑞士法郎&#xff0c;分别有隔夜、一周、一个月、两个月、三…

密码学—Vigenere破解Python程序

文章目录 概要预备知识点学习整体流程技术名词解释技术细节小结代码 概要 破解Vigenere需要Kasiski测试法与重合指数法的理论基础 具体知识点细节看下面这两篇文章 预备知识点学习 下面两个是结合起来使用猜测密钥长度的&#xff0c;只有确认了密钥长度之后才可以进行破解。 …

Jupyter Notebook左侧大纲目录设置

在 Jupyter Notebook 中&#xff0c;可以通过安装jupyter_contrib_nbextensions插件来实现在页面左边显示大纲的功能。 1. 安装插件 pip install jupyter_contrib_nbextensions 1.1 如何安装 windows cmd小黑裙窗口&#xff1b; 1.查看目前安装了哪些库 conda list 2. 使用…

【Oracle】springboot连接Oracle写入blob类型图片数据

目录 一、表结构二、mapper 接口和sql三、实体类四、controller五、插入成功后的效果 springboot连接Oracle写入blob类型图片数据 一、表结构 -- 创建表: student_info 属主: scott (默认当前用户) create table scott.student_info (sno number(10) constraint pk_si…

Vue3 完整项目搭建 Vue3+Pinia+Vant3/ElementPlus+typerscript

❤ Vue3 项目 1、Vue3+Pinia+Vant3/ElementPlus+typerscript环境搭建 1、安装 Vue-cli 3.0 脚手架工具 npm install -g @vue/cli2、安装vite环境 npm init @vitejs/app报错 使用: yarn create @vitejs/app依然报错 转而使用推荐的: npm c

Redisson分布式锁原理

1、Redisson简介 一个基于Redis实现的分布式工具&#xff0c;有基本分布式对象和高级又抽象的分布式服务&#xff0c;为每个试图再造分布式轮子的程序员带来了大部分分布式问题的解决办法。 2、使用方法 引入依赖 <dependency><groupId>org.springframework.bo…

基于Python所写的Word助手设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87959100?spm1001.2014.3001.5503 《Word助手》程序使用说明 在PyCharm中运行《Word助手》即可进入如图1所示的系统主界面。在该界面中&#xff0c;通过顶部的工具栏可以选择所要进行的…

阿里云顺利通过云原生中间件成熟度评估

前言&#xff1a; 2023 年 6 月 6 日&#xff0c;由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;承办的“ICT中国2023 高层论坛-云原生产业发展论坛”在北京召开&#xff0c;会上正式发布了一系列云原生领域评估结果。阿里云计算有限公司&#xff08;以…

图解红黑树

gitee仓库&#xff1a;https://gitee.com/WangZihao64/data-structure-and-algorithm/tree/master/RBTree 目录 概念红黑树的性质红黑树的调整规则 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Bl…

Redis设计与实现笔记之字典

1.字典的实现 Redis中字典使用的哈希表结构 typedef struct dictht {// 哈希表数组dictEntry **table;// 哈希表大小unsigned long size;// 哈希表大小掩码&#xff0c;用于计算索引值// 总是等于 size - 1unsigned long sizemask;// 该哈希表已有节点的数量unsigned long use…

3D web可视化工具HOOPS Communicator与Autodesk的对比分析

越来越多的开发人员转向基于Web的2D和3D可视化和交互服务。这些使您只需使用网络浏览器即可快速向同事、客户或其他任何人展示设计。该领域的工具提供了大量功能&#xff0c;这些功能可能适合也可能不适合您的特定开发需求。 HOOPS Communicator的原始开发人员之一分享了对该市…

chatgpt赋能python:Python输出NaN的原因及解决方法

Python输出NaN的原因及解决方法 NaN&#xff08;Not a Number&#xff09;是一种特殊的数值类型&#xff0c;表示不是一个数字。在Python中&#xff0c;当某种计算结果无法表示为有限数字时&#xff0c;就会输出NaN。本文将介绍Python中输出NaN的原因&#xff0c;并提供一些解…