[Javaweb/LayUI/上机考试作业/开源]学生/图书/课程/仓库等管理系统六合一基础功能通用模板

news2024/11/27 3:59:04

展示

考试要求

给定用户表和六张图书/教师/顾客/仓库....的表(随机给每人抽选),要求实现用户登录注册,异步更新,对物品增删改查,精确/模糊查询等。

 环境

tomcat 9

mysql 8

java 17

        

项目结构

项目类图 

写前思路

其实观察一下这六张表就会发现除了主键ID字段为int外,其他都可以为字符串,那么就可以写个通用框架,修改一下和数据库交互的表名和字段名还有一些前端显示文字即可,如下面代码所示,可以很巧妙的避免很多工作量,来实现六张表的切换。

package com.utils;

public class ExamTemp {
    public static String id, b, c, d, e;
    public static String tid, tb, tc, td, te;
    public static String indexTitle,item;
    public static String tableName = "course";
    public static void switchSys(String tableName2){
        if (tableName2.equals("course")) {
            tableName = "course";
            indexTitle = "课程管理系统";
            System.out.println("切换为:"+indexTitle);
            item = "课程";
            //sql字段
            id = "courseno";
            b = "coursename";
            c = "classhours";
            d = "tname";
            e = "precourse";
            //表头
            tid = "课程编号";
            tb = "课程名称";
            tc = "课时";
            td = "任课教师";
            te = "先修课程";
        } else if (tableName2.equals("part")) {
            indexTitle = "零件管理系统";
            System.out.println("切换为:"+indexTitle);
            tableName = "part";
            item = "零件";
            //sql字段
            id = "PNO";
            b = "PNAME";
            c = "BRAND";
            d = "MODEL";
            e = "PRICE";
            //表头
            tid = "零件编号";
            tb = "零件名称";
            tc = "品牌";
            td = "型号";
            te = "价格";
        }else if (tableName2.equals("warehouse")) {
            indexTitle= "仓库管理系统";
            System.out.println("切换为:"+indexTitle);
            item = "仓库";
            tableName = "warehouse";
            //sql字段
            id = "WNO";
            b = "WNAME";
            c = "LOCATION";
            d = "SQUARE";
            e = "MANAGER";
            //表头
            tid = "仓库编号";
            tb = "仓库名称";
            tc = "位置";
            td = "面积";
            te = "管理员";
        }else if (tableName2.equals("book")){
            indexTitle = "图书管理系统";
            tableName = "book";
            System.out.println("切换为:"+indexTitle);
            item = "图书";
            //sql字段
            id = "BNO";
            b = "BNAME";
            c = "AUTHOR";
            d = "PRICE";
            e = "PUBLISHER";
            //表头
            tid = "图书编号";
            tb = "图书名称";
            tc = "作者";
            td = "价格";
            te = "出版社";
        }else if(tableName2.equals("customer")){
            indexTitle = "顾客管理系统";
            tableName = "customer";
            System.out.println("切换为:"+indexTitle);
            item = "客户";
            //sql字段
            id = "CNO";
            b = "CNAME";
            c = "SEX";
            d = "AGE";
            e = "ADDRESS";
            //表头
            tid = "客户编号";
            tb = "客户名称";
            tc = "性别";
            td = "年龄";
            te = "地址";
        }else if(tableName2.equals("teacher")){
            indexTitle = "教师管理系统";
            tableName = "teacher";
            System.out.println("切换为:"+indexTitle);
            item = "教师";
            //sql字段
            id = "TNO";
            b = "TNAME";
            c = "PHONE";
            d = "DEPT";
            e = "COURSE";
            //表头
            tid = "教师编号";
            tb = "教师名称";
            tc = "电话";
            td = "部门";
            te = "课程";
        }
    }
}

 部分数据库相关代码

部分说明

注册用户名检测

用户名输入框失去焦点后向后端发出异步请求来验证用户名是否已存在

    var flag = false;
    $("#ruser").blur(function(){
      var uname = $("#ruser").val();
      $.ajax({
        url:"/register?action=getUserByUname",
        type:"post",
        data:{uname:uname},
        success:function(msg){//请求成功的回调函数
          if(msg == "err"){
            flag = false;
            $("#namecheck").html("此账号已被注册!!!!");
            $("#namecheck").css("color","#e51111");
          }else if(msg == "ok"){
            flag = true;
            $("#namecheck").html("您可以注册√");
            $("#namecheck").css("color","#00ff2a");
          }
        },error:function(){//请求失败的回调函数
          console.log("ajax请求失败!!!")
        }
      });
    });
if ("getUserByUname".equals(action)) {
            String uname = req.getParameter("uname");
            boolean check = userService.getUserByUname(uname);
            PrintWriter out = resp.getWriter();
            if (check) {
                out.write("err");
            } else {
                out.write("ok");
            }
        }

检测进入主界面的用户是否登录

使用过滤器,判断Session中是否存在id(登录时会将id存进去),不存在就直接跳回登录页面

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;

        HttpSession session = httpRequest.getSession(false);
        // 检查 session 中是否包含 id
        if (session == null || session.getAttribute("uid") == null) {
            httpResponse.sendRedirect("../logReg/logreg.html");
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }

系统切换

前端的表名下拉框对比当前项是否与ExamTemp类中的表明对应,相同即为当前系统,设置为默认选中状态

      <div class="layui-col-md6 layui-form layui-row layui-col-space16" style="position: absolute;top:5px;left: 45%;width: 200px">
            <select id="system">
                <option value="course" <%=("course".equals(ExamTemp.tableName)?"selected":"")%>>课程管理系统</option>
                <option value="warehouse" <%=("warehouse".equals(ExamTemp.tableName)?"selected":"")%>>仓库管理系统</option>
                <option value="part" <%=("part".equals(ExamTemp.tableName)?"selected":"")%>>零件管理系统</option>
                <option value="customer" <%=("customer".equals(ExamTemp.tableName)?"selected":"")%>>顾客管理系统</option>
                <option value="teacher" <%=("teacher".equals(ExamTemp.tableName)?"selected":"")%>>教师管理系统</option>
                <option value="book" <%=("book".equals(ExamTemp.tableName)?"selected":"")%>>图书管理系统</option>
            </select>
        </div>
        <button class="layui-btn layui-btn-sm" lay-event="switchSys" id="switchSys" style="position: absolute;left: 57%">切换</button>

layui按钮事件,异步向后端发送切换请求,成功后重载界面

        case 'switchSys':
                    var system = $("#system").val();
                    $.ajax({
                        url: '/SwitchSys',
                        dataType: 'text',
                        type: 'post',
                        data:{"system":system},
                        success: function (data) {
                            if (data == "ok") {
                                layer.msg('切换成功!');
                                location.reload();
                            } else {
                                layer.alert("切换失败!请稍后重试!", {icon: 2});
                            }
                        },
                        error: function () {
                            layer.alert("切换失败!请稍后重试!", {icon: 2});
                        }
                    });
                    break;
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String system = req.getParameter("system");
        ExamTemp.switchSys(system);
        tableConfig.init(ExamTemp.tableName,ExamTemp.id);
        System.out.println("SwitchSys:" + system);
        resp.getWriter().write("ok");
    }

表格渲染和数据获取

前端可参考layui官方文档

       // 创建渲染实例
        table.render({
            elem: '#test',
            url: '/GetAllTemp',
            method: 'post',
            request: {
                pageName: "page", // 页码的参数名称,默认:page
                limitName: "limit", // 每页数据量的参数名,默认:limit
            },
            toolbar: '#toolbarDemo',
            defaultToolbar: ['filter', 'exports', 'print', {
                title: '提示',
                layEvent: 'LAYTABLE_TIPS',
                icon: 'layui-icon-tips'
            }],
            height: 'full-35', // 最大高度减去其他容器已占有的高度差
            css: [ // 重设当前表格样式
                '.layui-table-tool-temp{padding-right: 145px;}'
            ].join(''),
            cellMinWidth: 80,
            totalRow: true, // 开启合计行
            page: true,
            cols: [[
                {type: 'checkbox', fixed: 'left'},
                {field:'id', fixed: 'left', width:100, title: '<%=ExamTemp.tid%>'},
                {field:'b', width:300, title: '<%=ExamTemp.tb%>'},
                {field:'c', width:250, title: '<%=ExamTemp.tc%>'},
                {field:'d', title:'<%=ExamTemp.td%>', width: 300},
                {field:'e', title:'<%=ExamTemp.te%>', width: 300},
                {fixed: 'right', title:'操作', width: 134, minWidth: 125, toolbar: '#barDemo'}
            ]],

后端将从数据库中读取表单,并封装成Json发给前端 

            int uid = Integer.parseInt(req.getSession().getAttribute("uid").toString());
            System.out.println("uid: "+uid);
            List<AllTemplate> allTemplates = ats.getAllTemp();
            JsonMassage<AllTemplate> JSM = new JsonMassage("0", "", allTemplates);
            String json = JSM.toJSONString();
            System.out.println(json);
            resp.getWriter().write(json);

搜索id或name

前端监听搜索框的回车事件,使用table,reload进行表格重载,并携带type和搜索文本和获取全部文档区分开,可参考我的另一篇博文。

    function EnterKey(event){
        event = event || window.event;
        if (event.keyCode == 13) {
            var value = $("#searchtext").val();
            if(!value){
                layer.msg('请输入搜索内容');
                return elem.focus()
            };
            // 搜索跳转
            layui.table.reload('test', {
                where: {
                    type : '1',
                    Str : value
                },
            });
            $("#searchtext").focus();
        }
    }

 后端判断是否为纯数字来区分按照id查询还是name查询

            String Str = req.getParameter("Str");
            List<AllTemplate> allTemplates = null;
            if (Tools.isNumer(Str)) {
                allTemplates = ats.getTempsByid(Integer.parseInt(Str));
            } else {
                allTemplates = ats.getTempByStr(Str);
            }
            JsonMassage<AllTemplate> JSM = new JsonMassage("0", "", allTemplates);
            String json = JSM.toJSONString();
            System.out.println(json);
            resp.getWriter().write(json);

弹出层编辑界面

layer.open的内容异步请求编辑界面文件‘’editTemp.jsp'返回html,并附带原表格数据。

        // 触发单元格工具事件
        table.on('tool(test)', function(obj){ // 双击 toolDouble
            var data = obj.data; // 获得当前行数据
            // console.log(obj)
            if(obj.event === 'edit'){ // 编辑数据
                layer.open({
                    type: 1,
                    area: ['500px', '400px'],
                    title: '编辑信息',
                    shade: 0.6,
                    shadeClose: true,
                    maxmin: true,
                    anim: 0,
                    success: function (layero, index) {
                        // 使用AJAX加载另一个页面的内容
                        $.ajax({
                            url: 'editTemp.jsp',
                            data:{
                                "id":data.id,
                                "b":data.b,
                                "c":data.c,
                                "d":data.d,
                                "e":data.e,
                            },
                            dataType: 'html',
                            success: function (data) {
                                // 将加载的另一个页面的内容插入到弹层中
                                layero.find('.layui-layer-content').html(data);
                            },
                            error: function () {
                                layer.msg('加载注册页面失败');
                            }
                        });
                    }
                });

 编辑界面获取异步请求传回的数据,并且显示在页面里

    <div class="layui-form-item">
        <label class="layui-form-label"><%=ExamTemp.tb%></label>
        <div class="layui-input-block">
            <input type="text" name="b" autocomplete="off" placeholder="请输入" value='<%=request.getParameter("b")%>' lay-verify="required" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label"><%=ExamTemp.tc%></label>
        <div class="layui-input-block">
            <input type="text" name="c" autocomplete="off" placeholder="请输入" value='<%=request.getParameter("c")%>' lay-verify="required" class="layui-input">
        </div>
    </div>

 表单提交事件,将修改的数据交给后端处理

<script>
    layui.use(['form'], function(){
        var form = layui.form;
        var layer = layui.layer;
        // 提交事件
        form.on('submit(demo2)', function(data){
            var field = data.field; // 获取表单字段值
            console.log(field);

            $.ajax({
                url: '/EditTemp',
                dataType: 'text',
                type:"POST",
                data:{
                    "id":field.id,
                    "b":field.b,
                    "c":field.c,
                    "d":field.d,
                    "e":field.e,
                },
                success: function (data) {
                    layer.msg("编辑成功!请刷新表单");
                },
                error: function () {
                    layer.msg('编辑失败');
                }
            });
            return false; // 阻止默认 form 跳转
        });
    });

开源地址

https://github.com/0x3fffff/javaweb-exam

有用的话可以点个star 

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

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

相关文章

分布式【zookeeper面试题23连问】

1. ZooKeeper是什么&#xff1f; ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#x…

Prometheus二进制安装包部署

Prometheus安装部署 一&#xff0c;下载安装包并解压 **下载地址&#xff1a;**https://github.com/prometheus/prometheus/releases 因为服务器上下载速度太慢&#xff0c;所以可以提前在物理机上下载上传到服务器&#xff0c;本次安装使用的版本为&#xff1a;prometheus-…

深度神经网络中的混合精度训练

Mixed-Precision Training of Deep Neural Networks | NVIDIA Technical Blog 目录 混合精度成功训练的技术 FP32 累加 损失缩放 loss scaling FP32 Master Copy of Weights 混合精度训练迭代过程 AMP混合精度训练介绍 FP16和FP32的区别 FP16的优势 FP16的问题 解决P…

shell sshpass 主机交互 在另外一台主机上执行某个命令 批量管理主机 以及一些案例

目录 作用安装 sshpasssshpass 用法在远程主机执行某个命令 案例批量传输密匙批量拷贝文件批量修改密码 作用 就是用一台主机 控制另外一台主机免交互任务管理工具方便批量管理主机使用方法就是在ssh 前边加一个 sshpass 安装 sshpass # 安装 sshpass yum -y install sshpas…

MongoDB快速实战与基本原理

MongoDB 介绍 什么是 MongoDB MongoDB 是一个文档数据库&#xff08;以 JSON 为数据模型&#xff09;&#xff0c;由 C 语言编写&#xff0c;旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。文档来自于“JSON Document”&#xff0c;并非我们一般理解的 PDF、WORD 文档…

【K8S 云原生】Pod资源限制、Pod容器健康检查(探针)

目录 一、docker的重启方式和K8S重启方式 1、Pod的重启方式&#xff1a; 2、docker的重启策略&#xff1a; 二、yaml文件快速生成&#xff1a; 三、pod的状态&#xff1a; 四、Pod的资源限制 1、限制的方式和种类 2、CPU的限制的格式&#xff1a; 五、K8S拉取镜像的策…

电源板设计方案怎么写 (评审文件)

1. 首先是大致的图形模块化说明。 1. 大致的框图 2. 统计项目需要的功率和需求 此表格数据是假的&#xff0c;只是为了展示 电源种类是&#xff1a; 板子需要供电需要的电压和对应电压最大的电流。 电源时序是&#xff1a; 板子…

智能穿戴时代 | 米客方德SD NAND的崭新优势

SD NAND在智能穿戴上的优势 SD NAND是一种可以直接焊接在智能穿戴设备主板上的存储芯片&#xff0c;其小型化设计有助于紧凑设备尺寸&#xff0c;同时提供可靠的嵌入式存储解决方案。 这种集成设计减少了空间占用&#xff0c;同时确保设备在高度活动的环境中更为稳定。SD NAND…

【C#】知识点实践序列之UrlEncode在线URL网址编码、解码

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是2024年第8篇文章&#xff0c;此篇文章是C#知识点实践序列文章&#xff0c; 博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 地址编码大家应该比较经常遇到和使用到&…

rk3566 armbian修复usb2.0并挂载U盘

文章目录 usb接口修复一 执行命令二 修改rk3566-panther-x2.dts⽂件三 查看是否识别 U盘格式化、挂载一 U盘格式化1.1 查看U盘1.2 查看U盘文件系统类型1.3 格式化为ext4系统 二 挂载U盘2.1 手动挂载2.2 自动挂载&#xff08;可选&#xff09; usb接口修复 一 执行命令 将位于…

【数据库系统概论】数据库恢复机制

系统文章目录 数据库的四个基本概念&#xff1a;数据、数据库、数据库管理系统和数据库系统 数据库系统的三级模式和二级映射 数据库系统外部的体系结构 数据模型 关系数据库中的关系操作 SQL是什么&#xff1f;它有什么特点&#xff1f; 数据定义之基本表的定义/创建、修改和…

泽攸科技完全自主研制的电子束光刻机取得阶段性成果

国产电子束光刻机实现自主可控&#xff0c;是实现我国集成电路产业链自主可控的重要一环。近日&#xff0c;泽攸科技联合松山湖材料实验室开展的全自主电子束光刻机整机的开发与产业化项目取得重大进展&#xff0c;成功研制出电子束光刻系统&#xff0c;实现了电子束光刻机整机…

FreeRTOS——互斥信号量知识总结及其实战

1互斥信号量的概念 1&#xff09;互斥信号量&#xff1a;是一个拥有优先级继承的二值信号量&#xff0c;在同步的应用中二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中&#xff01; 2&#xff09;优先级继承&#xff1a;当一个互斥信号量正在被一个低优先级的…

MySQL 8.0 开关 Redo Logging

一 前言 前几天有客户测试使用云数据库的时候提出 要禁止mydumper 关闭redo log的操作 (说白了就是导入数据时保持MySQL 实例的redo logging功能)&#xff0c; 这才想起 在 MySQL 8.0.21 版本中&#xff0c;开启了一个新特性 “Redo Logging 动态开关”。 在新实例导数据的场…

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行模式-CSDN博客 1、 Hadoop 是什么 &#xff08;1&#xff09;Hadoop是一个由Apache基…

第二百四十六回

我们在上一章回中介绍了"修改页面导航中遇到的问题"沉浸式状态样相关的内容&#xff0c;本章回中将介绍如何修改Avatar的大小.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在正常使用CirCleAvatar组件时可以通过该组件的radius属性来修改它的…

ssm基于web的素材网的设计与实现+vue论文

基于web的素材网站的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的素材信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理…

C语言中关于strcpy函数的理解

strcpy的功能是将源指向的字符串复制到另外一个字符串中 目标指向的数组的大小应该要足够长&#xff0c;避免让源字符串中的数据溢出 关于这个函数的具体用法&#xff0c;我们可以看看下面这个程序 注意&#xff1a;strcpy函数的头文件是<string.h>&#xff0c;我们在用…

rollup 插件输出生成钩子

✨专栏介绍 Rollup专栏是一个专门介绍Rollup打包工具的系列文章。Rollup是一个现代化的JavaScript模块打包工具&#xff0c;它可以将多个模块打包成一个或多个文件&#xff0c;以提高应用程序的性能和加载速度。 在Rollup专栏中&#xff0c;您将学习到如何安装和配置Rollup&a…

面向对象的三大特征之一多态

多态 概念 多态是同一个对象&#xff0c;在不同时刻表现出来不同的形态&#xff0c;称之为多态。 例如&#xff1a;水&#xff0c;我们把水理解成为一个对象&#xff0c;而水会有不同的形态&#xff0c;比如 液态水、冰块、水蒸气 多态的前提 有继承/实现关系&#xff08;继承…