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

展示

考试要求

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

 环境

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.mfbz.cn/a/292426.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DBA技术栈(二):MySQL 存储引擎

2.1 MySQL存储引擎概述 上个业余的图&#xff1a; MyISAM 存储引擎是 MySQL 默认的存储引擎&#xff0c;也是目前 MySQL 使用最为广泛的存储引擎之一。他的前身就是我们在 MySQL 发展历程中所提到的 ISAM&#xff0c;是 ISAM 的升级版本。在 MySQL最开始发行的时候是 ISAM 存…

大模型应用实践:AIGC探索之旅

随着OpenAI推出ChatGPT&#xff0c;AIGC迎来了前所未有的发展机遇。大模型技术已经不仅仅是技术趋势&#xff0c;而是深刻地塑造着我们交流、工作和思考的方式。 本文介绍了笔者理解的大模型和AIGC的密切联系&#xff0c;从历史沿革到实际应用案例&#xff0c;再到面临的技术挑…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-4 拉普拉斯变换(Laplace)传递函数、微分方程

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-4 拉普拉斯变换&#xff08;Laplace&#xff09;传递函数、微分方程 1. Laplace Transform 拉式变换2. 收敛域&#xff08;ROC&#xff09;与逆变换&#xff08;ILT&…

初学者SkyWalking详细使用文档

SkyWalking使用文档 下载地址&#xff1a;https://skywalking.apache.org/downloads/ 主要下载&#xff1a;skywalking apm&#xff08;tar&#xff09; 、agents(tar) 解压&#xff1a; &#xff08;可选操作&#xff09;&#xff1a; ​ apache-skywalking-apm-bin --&g…

【鸿蒙】安装DevEco Studio运行HarmonyOS第一个APP(小白必看)

文章目录 前言一、DevEco Studio是什么&#xff1f;二、DevEco Studio安装运行1. 下载DevEco Studio2. 安装DevEco Studio3. 启动DevEco Studio4. 运行APP5. 修改代码 三、DevEco Studio调试注意事项总结 前言 鸿蒙OS是华为公司开发的一款基于微内核、耗时10年、4000多名研发人…

Lazada商品详情API(lazada.item_get)进行商品的实时更新

一、引言 在数字时代&#xff0c;电商平台如Lazada成为了商品交易的重要场所。为了保持竞争力&#xff0c;实时更新商品信息变得至关重要。Lazada提供的商品详情API&#xff08;lazada.item_get&#xff09;为开发者提供了一个高效的方式来获取并更新商品数据。本文将深入探讨…

“华为杯”杭州电子科技大学2023新生编程大赛---树

题目链接 Problem Description 给定一棵包含 n 个节点的带边权的树&#xff0c;树是一个无环的无向联通图。定义 xordist(u,v) 为节点 u 到 v 的简单路径上所有边权值的异或和。 有 q 次询问&#xff0c;每次给出 l r x&#xff0c;求 ∑rilxordist(i,x) 的值。 Input 测试…

vue保姆级教程----深入了解 Vue3路由守卫

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

XCode Build报错

XCode Build时报以下错误 B/BL out of range 143266484 (max /-128MB) 错误提示表明生成的机器代码太大&#xff0c;超出了限制 需要在XCode工程中添加宏定义&#xff0c;使得生成的可执行文件超过限制 步骤&#xff1a; 在项目设置页面中&#xff0c;选择 “Build Settings…

Microsoft Word去除页面多余的换行符

大家写论文的时候或者排版的时候可能遇到换行符多出来了导致页面的不美观。像下面这张图一样&#xff0c;虽然latex不会出现这种问题。 处理方式 点击插入然后点击分页 结果展示

自然语言转SQL,一个微调ChatGPT3.5的实例(下)--模型微调及模型性能

提交训练集进行微调 一旦我们创建了JSONL文件&#xff08;可以在这里或ipfs_here找到一个小样本&#xff09;&#xff0c;下一步是使用以下命令将创建的文件上传到OpenAI&#xff1a; openai.api_key os.getenv("OPENAI_API_KEY") print(openai.File.create(fileo…

人工智能大模型:定义、发展和应用

⭐简单说两句⭐ ✨ 正在努力的小新~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &…

MySQL之基于代价的慢查询优化建议

1.背景 慢查询是指数据库中查询时间超过指定阈值&#xff08;美团设置为 100ms&#xff09;的 SQL&#xff0c;它是数据库的性能杀手&#xff0c;也是业务优化数据库访问的重要抓手。 如何优化慢查询呢&#xff1f;最直接有效的方法就是选用一个查询效率高的索引。关于高效率…

C++之条件编译

在C中&#xff0c;条件编译是一种特殊的编译方式&#xff0c;允许在编译时根据特定条件决定是否编译某段代码。条件编译通常用于在编译时根据不同的平台、编译器或配置选项选择性地包含或排除代码。 C中的条件编译可以通过预处理器指令来实现。预处理器是C编译器的一部分&…

Windows中磁盘未知没有初始化怎么办?

当我们尝试在Windows11/10/8/7上使用外部硬盘驱动器时&#xff0c;在小概率情况下可能会遇到磁盘未知没有初始化情况&#xff0c;此时如果您进入磁盘管理工具中查看&#xff0c;将会发现您的外部硬盘驱动器显示为未知、未初始化、没有磁盘空间&#xff0c;或者在某些情况下它还…

VS Code 如何调试Python文件

VS Code中有1,2,3处跟Run and Debug相关的按钮&#xff0c; 1 处&#xff1a;调试和运行就不多说了&#xff0c;Open Configurations就是打开workspace/.vscode下的lauch.json文件&#xff0c;而Add Configuration就是在lauch.json文件中添加当前运行Python文件的Configuratio…

十二.视图

视图 1.常见数据库对象2.视图概述2.1为什么使用视图2.2视图的理解 3.创建视图3.1创建单表视图3.2创建多表联合试图3.3基于试图创建视图 4.查看视图5.更新视图的数据5.1一般情况5.2不可更新的视图 6.修改、删除视图6.1修改视图6.2删除视图 7.总结7.1视图优点7.2视图不足 1.常见数…

能翻页的电子图册怎么做

​随着科技的进步&#xff0c;电子图册已经成为了越来越多企业宣传和展示产品的重要工具。相比于传统的纸质图册&#xff0c;电子图册具有更多的优点&#xff0c;如方便携带、易于分享、可交互性强等。那么&#xff0c;如何制作一款能翻页的电子图册呢&#xff1f; 一、确定主题…

为什么我不建议大学生接公司单?

大家好&#xff0c;我是鱼皮。前两天&#xff0c;我 编程导航 的鱼友提了个问&#xff1a;大学生怎么接公司的单赚点零花钱&#xff1f; 然后我很认真地评论了一句&#xff1a;我不建议大学生接公司单。 这位小伙伴很认真&#xff0c;又通过微信单独问我&#xff1a; 想了想&am…

右键添加 idea 打开功能

1.开始运行regedit 2.找到: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell _3.开始设置 一、右键shell目录新建项Idea二、右键Idea新建command三、选择Idea 右侧空白出新建字符串 名字为Icon 值填入idea的运行程序地址 四、选择command 默认项填入idea的运行程序地址…