基于Java+SpringBoot+Vue的开放实验管理系统设计与实现

news2024/11/15 12:16:18

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

🍅文末获取源码联系🍅

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

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

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

目录

一、效果演示

二、前言介绍

三、主要技术

四、系统设计

4.1、主要功能模块设计         

4.2、系统登陆流程设计

五、功能截图

5.1、首页

5.2、管理员登录

5.3、后台页面

5.4、 班级管理

5.4、新闻咨询

5.5、学生注册

5.6、用户管理

六、数据库设计(部分)

七、代码实现

八、源码获取


一、效果演示

二、前言介绍

信息技术永远是改变生活的第一种创新方式,各种行业的发展更是脱离不了科技化的支持。原本传统的行业正在被科技行业的切入悄悄的发生变化。就拿我们生活当中常见的事情举例而言,在外卖行业还没有发展的快速的时候,方便面等速食成了快速吃饱的首要选择,但当外卖行业出现而来,影响最大的缺是这些行业。更换言之,越来越多的人们正在享受着科技带来的变化。而在这种信息化大潮当中,各样各业的企业如果想提高自己的工作效率,必然需要符合自己需要的软件公办工具。对于学校而言,校园信息化一直都是社会多方位多层次被关注的一个方向。校园实验室数据管理一直是一个令管理者比较烦恼的一件事情,不能够及时有效的进行实验室数据管理的管理。如果可以利用信息化的手段进行管理的话,那将非常有效。

三、主要技术

技术名作用
SpringBoot后端框架
Vue前端框架
MySQL数据库

四、系统设计

4.1、主要功能模块设计         

4.2、系统登陆流程设计

五、功能截图

5.1、首页

网站的前台可以来说是一个门面,如何能让使用者进入网站后感受到优美的图案、整齐的布局、便捷的操作按钮,对于网站设计者来说还是有一定的难度的。本网站前台页面在设计前期,就将页面的图案设计、布局考虑进去了。首先进入前台的就是一个大的banner图,将其网站的主题风格直现到用户面前。banner图从一定程度上来说也是需要体现设计元素的,设计元素的美观程度直接体现的就是网站的美观程度。在设计前台页面的时候,我还特意的参考了几个大的网站的banner图,将其风景图进行了些比对,还请教了些美工的同学们。其页面如下图所示:

5.2、管理员登录

作为管理系统而言,那肯定是没有那些电商的绚丽前台页面儿了,那么最能体现他们管理系统的页面呢?就是管理员以及其他角色登录时候的页面,那么通过管理员。以及其他角色的区分呢,我们将主题进行一个体现。通过这个页面呢,就可以知道我们是什么系统,什么角色进行的一些登陆,需要输入什么,有什么样的功能,登陆之后大致也就明白了。

5.3、后台页面

后台管理页面是整个设计当中必不可少的一个部分,那么,后台管理页面通常都是以左边是树状形式将所有的功能菜单列出,右边是工作区域。这样一来,机可以方便管理者通过左边快速浏览到所有的功能,也可以通过右边较大的区域进行每个功能的操作。如下图所示

5.4、 班级管理

当我们系统中需要展现一些。人或物的属性信息的时候,我们就要采用列表的这种方式。这样做的好处呢,就是可以很好的将这些属性信息一一列出来,通过列举的方式呢,可以让用户清楚的可以看到。

5.4、新闻咨询

在系统的新闻资讯中我们可以看到相关系统的一些信息,这都是为了方便我们及时了解相关政策

5.5、学生注册

不论是系统也好还是网站也罢,最直接给用户感受的就是页面了,那页面的布局以及页面的功能都是要经过仔细的考虑的。本次设计呢就是在最初时进行了当下的同行业类型进行参考而做的,同时,为了能够使系统更加贴近生活,所以我们在设计元素上也有所考虑。

5.6、用户管理

系统当中用户的管理一方面可以让管理者知道系统中使用者的数量,另一方面也可以对于用户进行一个有效的管理。用户是系统的根本,用户也是系统所存在的意义。试想一下,一个系统如果没有了用户的支持可以说也没有了存在的必要了。所以说用户管理在系统当中可以说是一个必不可少的功能。

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

六、数据库设计(部分)

E-R图

数据库是计算机信息系统的基础。目前,电脑系统的关键与核心部分就是数据库。数据库开发的优劣对整个系统的质量和速度有着直接影响。

数据库概念结构设计采用实体-关系(E-R)模型设计方法。 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.JiaoshiInfoService;
import com.example.service.XueshengInfoService;


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 JiaoshiInfoService jiaoshiInfoService;
@Resource
private XueshengInfoService xueshengInfoService;

	






    @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 = jiaoshiInfoService.login(account.getUsername(), account.getMima());
            //yoxusxhenhe if(login.getStatus().equals("否")){return Result.error("500","帐号未审核通过,请联系管理员");}
        }
if (level.equals("学生")) {
            login = xueshengInfoService.login(account.getUsername(), account.getMima());
            //yoxusxhenhe if(login.getStatus().equals("否")){return Result.error("500","帐号未审核通过,请联系管理员");}
        }

		
//        if (2 == level) {
//            login = sellerInfoService.login(account.getUsername(), account.getMima());
//        }
//        if (level.equals("用户")) {
//            login = userInfoService.login(account.getUsername(), account.getMima());
//            if(login.getStatus().equals("否")){
//                return Result.error("500","状态异常,请联系管理员");
//            }
//        }
//        if (level.equals("员工")) {
//            login = yuangongxinxiInfoService.login(account.getUsername(), account.getMima());
//            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(jiaoshiInfoService.findById(account.getId())); }
if (level.equals("学生")) { return Result.success(xueshengInfoService.findById(account.getId())); }

//          if (level.equals("管理员")) {
//            return Result.success(sellerInfoService.findById(account.getId()));
//        }
//        if (level.equals("用户")) {
//            return Result.success(userInfoService.findById(account.getId()));
//        }
//
//        if (level.equals("医生")) {
//            return Result.success(yishengxinxiInfoService.findById(account.getId()));
//        }
//        if (level.equals("员工")) {
//            return Result.success(yuangongxinxiInfoService.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("教师")) {
            JiaoshiInfo jiaoshiInfo = new JiaoshiInfo();
            BeanUtils.copyProperties(info, jiaoshiInfo);
            jiaoshiInfoService.update(jiaoshiInfo);
        }
if (level.equals("学生")) {
            XueshengInfo xueshengInfo = new XueshengInfo();
            BeanUtils.copyProperties(info, xueshengInfo);
            xueshengInfoService.update(xueshengInfo);
        }

//          if (level.equals("管理员")) {
//            SellerInfo sellerInfo = new SellerInfo();
//            BeanUtils.copyProperties(info, sellerInfo);
//            sellerInfoService.update(sellerInfo);
//        }
//        if (level.equals("用户")) {
//            UserInfo userInfo = new UserInfo();
//            BeanUtils.copyProperties(info, userInfo);
//            userInfoService.update(userInfo);
//        }
//
//        if (level.equals("医生")) {
//            YishengxinxiInfo yishengxinxiInfo = new YishengxinxiInfo();
//            BeanUtils.copyProperties(info, yishengxinxiInfo);
//            yishengxinxiInfoService.update(yishengxinxiInfo);
//        }
//        if (level.equals("员工")) {
//            YuangongxinxiInfo yuangongxinxiInfo = new YuangongxinxiInfo();
//            BeanUtils.copyProperties(info, yuangongxinxiInfo);
//            yuangongxinxiInfoService.update(yuangongxinxiInfo);
//        }

        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);
        }
//         if (level.equals("管理员")) {
//            SellerInfo info = sellerInfoService.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"));
//            sellerInfoService.update(info);
//        }
//        if (level.equals("用户")) {
//            UserInfo info = userInfoService.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"));
//            userInfoService.update(info);
//        }

//         if (level.equals("医生")) {
//            YishengxinxiInfo info = yishengxinxiInfoService.findByUserName(account.getXingming());
//            if (info == null) {
//                return Result.error(ResultCode.USER_NOT_EXIST_ERROR.code, ResultCode.USER_NOT_EXIST_ERROR.msg);
//            }
//            info.setPassword(SecureUtil.md5("123456"));
//            yishengxinxiInfoService.update(info);
//
//        }

//        if (level.equals("员工")) {
//            YuangongxinxiInfo info = yuangongxinxiInfoService.findByGonghao(account.getGonghao());
//            if (info == null) {
//                return Result.error(ResultCode.USER_NOT_EXIST_ERROR.code, ResultCode.USER_NOT_EXIST_ERROR.msg);
//            }
//            info.setMima(SecureUtil.md5("123456"));
//            yuangongxinxiInfoService.update(info);
//
//        }


        return Result.success();
    }
}

八、源码获取

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

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

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

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

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

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

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

相关文章

找回存储在DBeaver连接中的数据库密码

一、拿到 credentials-config.json 文件 1、打开 Dbeaver 后&#xff0c;点击 “窗口 — 首选项” 2、找到worksapce path 3、进入 workspace path 的文件夹&#xff0c;再进入到 \General.dbeaver 文件夹&#xff0c;找到文件 credentials-config.json &#xff08;可以备…

数据结构初阶--排序1

目录 前言冒泡排序思路代码实现 选择排序思路代码实现 插入排序思路代码实现 希尔排序思路代码实现 堆排序思路向上调整建堆向下调整建堆 代码实现 前言 排序在我们的日常生活中无处不在&#xff0c;比如对若干个学生的期末成绩&#xff0c;可以依据姓氏&#xff0c;学号&…

交易成本模型与Python技术共同促进高频交易的发展走向

高频交易是一种在金融市场中越来越受到关注的交易方式&#xff0c;其具有快速、高效、低风险的特点&#xff0c;可以为投资者带来丰厚的利润。然而&#xff0c;在高频交易中&#xff0c;交易成本往往占据了很大的比例&#xff0c;可以说是一个非常重要的因素。因此&#xff0c;…

辅助驾驶功能开发-功能规范篇(22)-1-L2级辅助驾驶方案功能规范

1. 系统概览 System Overview 1.1 系统架构 各模块描述如下: ADSADS控制器,包括5R1V感知融合算法模块、level0-level2相关功能、控制决策模块、响应执行模块。EPBi制动执行机构,包括主制动和冗余制动,可实现行车和驻车控制。EPS转向执行机构,TJP包含冗余转向,L-TJP不包含…

DynaSLAM代码详解(3) — MaskNet.cc加载Mask R-CNN网络部分

目录 3.1 Mask R-CNN运行 3.2 SegmentDynObject::SegmentDynObject() 3.3 SegmentDynObject::GetSegmentation() 3.1 Mask R-CNN运行 在Examples/RGB-D/rgbd_tum.cc文件开始运行Mask R-CNN网络&#xff0c;首先进入MaskNet->GetSegmentation函数。 // Segment out the i…

使用Dockerfile创建nginx+php镜像,采用分层

什么是Dockerfile Dockerfile是一种能被Docker程序解释的脚本&#xff0c;它是由一条条的命令所组成&#xff0c;每条命令对应Linux下面的一条命令&#xff0c;Docker程序将这些Dockerfile命令翻译成真正的Linux命令 Dockerfile命令 Dockerfile通常会包含如下命令&#xff1a…

【AGC】认证服务HarmonyOS(api9)实现手机号码认证登录

【问题背景】 近期AGC上线了HarmonyOS(api9)平台的SDK&#xff0c;这样api9的设备也能使用认证服务进行快速认证登录了。下面为大家带来如何使用auth SDK&#xff08;api9&#xff09;实现手机号码认证登录。 【开通服务】 1.登录AppGallery Connect&#xff0c;点击“我的项…

lc202306

785. 判断二分图 对于单个连通图&#xff1a;一个dfs判断图中所有节点符合二分。 遍历节点列表>遍历所有连通图。 133. clone graph 994. rotting oranges 力扣 维护一个time表&#xff0c;表示所有orange rot的最快时间。对每一个 t0 就 rot 的 orange dfs&#xff0c;遇…

无法从gcr.io获取distroless镜像问题

当我们能够访问外网&#xff0c;且能够ping通gcr.io网站后&#xff0c;依旧无法拉取distroless镜像时&#xff0c;可以通过以下网站作为中转获取。 rootacoinfo-Vostro-3667:/home/xxx/xx# docker pull gcr.io/distroless/base-debian11 Using default tag: latest Error resp…

快速制作优惠券信息展示小程序教程

要想拥有一个拥有优惠券功能的小程序商城&#xff0c;首先我们需要搭建一个小程序。以乔拓云第三方平台为例&#xff0c;我们可以通过以下步骤来完成。 首先&#xff0c;登录乔拓云平台&#xff0c;进入【乔拓云】后台管理页面。乔拓云功能强大&#xff0c;不仅可以搭建小程序…

运维开发面试题第五期(华电天益)

1、一个目录(没有子目录)有很多文件&#xff0c;想最快速度查看到最近更新的文件你有几种方式实现?请写出一种或几种 ls -lrt 目录 R 逆序 l 长格式 t 按更新时间排序2、使用 tar 命令打包/etc 目录下的所有文件(包括子文件夹) tar -cvf 打包路径加名字 /etc/ 仅打包…

[gtp]购物车案例参考

react hooks,购物车案例. 在列表上点击或者-更新数量,调用接口更新单个价格. 点击table的checkbox勾选后,计算总价? 对于React Hooks和购物车案例&#xff0c;您可以使用useState来管理列表中商品的数量和总价。当点击"“或”-"按钮时&#xff0c;可以更新相应商品…

网络营销的定义、实现方式、关键要素和应用案例

网络营销是通过互联网及相关技术手段来实现企业品牌推广、产品销售、客户维护等目标的营销方式。近年来&#xff0c;随着互联网技术的飞速发展&#xff0c;网络营销已成为企业推广、销售和宣传的重要手段。本文将从网络营销的定义、实现方式、关键要素和应用案例等方面&#xf…

【ECharts系列】ECharts 图表渲染问题解决方案

1 问题描述 echats 渲染&#xff0c;第一次的时候只出现Y轴数值&#xff0c;不出现X轴数值&#xff0c;切换下页面&#xff0c;X轴数值就能出现。 2 原因分析 如果在使用ECharts渲染时&#xff0c;X轴数值只在切换页面后才出现&#xff0c;可能是因为ECharts在初始化时没有正确…

Mac上提取应用APP的LOGO

1、找到想提取LOGO的应用&#xff0c;右键「显示包内容」 2、 双击【Contents】文件夹&#xff0c;再双击【Resources】文件夹 3、双击图标打开&#xff0c;选择最清晰的一帧&#xff0c;右键【导出为】 4、选择保存位置&#xff0c;格式注意选择常见格式&#xff0c;如png

【Ajax】Express 服务端框架

因为Ajax需要向服务端发送请求。Express框架比较简单&#xff0c;内容使用起来比较少&#xff0c;借助一个基本功能就可以了。 Express 基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架 所以需要安装一下node.js 检查命名&#xff1a;node -v 安装 打开项目最外…

多线程面试题详解

总体概览 线程的基础知识 线程和进程的区别&#xff1f; 并行和并发有什么区别&#xff1f; 创建线程的方式有哪些&#xff1f; runable和callable有什么区别 run()和start()有什么区别 线程包括了那些状态&#xff1f;这些状态之间如何变化 新建T1,T2,T3三个线程&#xff0c;如…

C#内存不够解决方法

今天在使用C#程序的时候&#xff0c;出现了下图的问题&#xff1a; 注意下图中我用红框标出的位置&#xff0c;实际是一个三维数组。 但是出现这个问题和三维数组没有关系。 他是提示内存不足。 百度了一下&#xff0c;C#在生成的过程中如果是生成对应的32位系统&#xff0c…

VMware15.5版本虚拟机安装Linux Centos 7系统详细步骤

1.首先准备好Centos7.6安装文件&#xff0c;安装文件可百度搜索或在阿里镜像站中下载。 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 2.新建虚拟机. 1选择自定义&#xff0c;点下一步。 2硬件兼容性选择15.x&#xff0c;&#xff0c;点下一步。 3选择稍后安装操作系统&…

自定义seg_decoder组件并创建Nios系统(一)

前面进行了数码管的显示 对Avalon总线协议进行了大概的学习 那么就可以 将数码管译码器模块封装成符合Avalon-MM接口的组件创建一个基于Nios Ⅱ处理器的系统 将数码管译码器组件添加至该系统中 通过用户应用程序控制数码管显示字符0~F 本文同数码管显示一样并不是完整项目&a…