[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 中是否包含 idif (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", // 页码的参数名称,默认:pagelimitName: "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){ // 双击 toolDoublevar 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.mzph.cn/news/596922.shtml

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

相关文章

Java amr格式转mp3格式

1.问题描述 微信返回的语音是amr格式的&#xff0c;浏览器不能直接使用&#xff0c;所以需要转为mp3 注意&#xff1a;不能直接使用IO流转为mp3&#xff0c;不然H5还是用不了。转换之后的语音只能在播放器上播放&#xff0c;内里的文件格式其实还是amr 2.使用以下方式转换 音…

自制c++题目《抽象类与虚函数》

1.题目要求&#xff1a;构建一个抽象类car&#xff0c;由两个基类track和bike 继承&#xff0c;而它们共同的继承者是people类&#xff0c;要求构建上述类并撰写可辨别的语句 2.题解《抽象类与虚函数》的答案 王赫辰/c语言 - Gitee.com

tmux用法

tmux 安装 tmux sudo apt install tmux 运行 tmux tmux 退出 tmux exit 分离 tmux ctrl b, d 查看 tmux tmux ls 恢复 tmux tmux at -t <ID> 配置 tmux 在 ~/ 下面建一个 .tmux.conf 文件 set -g history-limit 9999 # 设置历史缓存长度 查看历史输出 …

Python学习笔记(五)函数、异常处理

目录 函数 函数的参数与传递方式 异常处理 函数 函数是将代码封装起来&#xff0c;实现代码复用的目的 函数的命名规则——同变量命名规则&#xff1a; 不能中文、数字不能开头、不能使用空格、不能使用关键字 #最简单的定义函数 user_list[] def fun(): #定义一个函数&…

Python正则表达式急速入门~正则居然这么容易掌握!

正则表达式在程序开发中会经常用到&#xff0c;比如数据&#xff08;格式&#xff09;验证、替换字符内容以及提取字符串内容等等情况都会用到&#xff0c;但是目前许多开发人员对于正则表达式只是处于了解或者是基本会用的阶段。一旦遇到大批量使用正则表达式的情况&#xff0…

Python初探:从零开始的编程奇妙之旅

一、Python是什么 Python是一门多用途的高级编程语言&#xff0c;以其简洁、易读的语法而脱颖而出。在深度学习领域&#xff0c;Python扮演着至关重要的角色。其丰富的科学计算库&#xff08;如NumPy、Pandas、Matplotlib&#xff09;和强大的深度学习框架&#xff08;如Tenso…

xshell设置终端类型为xterm-256color (解决oh-my-tmux颜色失真问题)

文章目录 问题描述解法效果检验 问题描述 在xshell远程连接服务器时&#xff0c;tmux色彩有问题&#xff08;tmux配置为Oh my tmux&#xff09;&#xff0c;如下&#xff1a; 这色彩明显是8位的色彩。 现在终端的标配就是类型为 xterm-256color&#xff0c;其支持256位的真彩…

CSU计算机学院2021年C语言期末题目思路分享(后两道题)

文章目录 E: 实数相加——大数加法的拓展原题题目描述输入输出样例输入样例输出 题目思路实现步骤代码和注释 F: 谍影寻踪——链表的思想和运用原题题目描述输入输出样例输入样例输出 题目思路 一点感想 E: 实数相加——大数加法的拓展 原题 题目描述 C语言就要期末考试了&a…

【操作系统习题】存储器与虚拟存储器

存储器 一、单选题 每次分配时总是从低地址到高地址顺序查找空闲区表&#xff0c;找到第一个能满足作业长度要求的空闲区&#xff0c;此种分配算法称为&#xff08;&#xff09; D A、最坏适应分配算法 B、随机适应分配算法 C、最优适应分配算法 D、首次适应分配算法一台计算…

深入探究:使用大型AI模型的实战指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在今天的技术领域&#xff0c;大型AI模型已成为…

2下载Spring,第一个Spring程序+引用Log4j2

https://www.yuque.com/dujubin/ltckqu/kipzgd#&#xff0c;注意的是&#xff0c;现在&#xff08;202401&#xff09;SpringFramework从release搬到了snapshot下&#xff0c;在这下面找到6.0.2下载. 下载后解压到文件夹&#xff0c;整个框架包含非常多jar包。 然后就可以在p…

C++:类和对象(2)

目录 1.strcut和class的区别 2.将成员属性设置为私有 3.对象的初始化和清理 3.1 构造函数和析构函数 3.1.1 构造函数语法 3.1.2 析构函数语法 3.1.3 检验 3.2 构造函数的分类和调用 3.3 拷贝构造函数调用 1.strcut和class的区别 struct和class的唯一区别在于默认的访问…

3个.NET开源简单易用的任务调度框架

前言 今天分享3个.NET开源、简单、易用的任务调度框架&#xff0c;帮助大家在做定时任务调度框架技术选型的时候有一个参考。 Quartz.Net Quartz.NET是一个功能齐全的开源作业调度系统&#xff0c;可用于从最小的应用程序到大规模企业系统。 Quartz.NetUI Quartz.NetUI是一…

leetcode03-简单的数组模拟

题目链接&#xff1a; https://leetcode.cn/problems/plus-one/description/?envTypestudy-plan-v2&envIdprogramming-skills 思路&#xff1a; 因为题目1是从后面加&#xff0c;所以考虑从后往前遍历数组。 在遍历过程中&#xff1a; 如果当前位为9&#xff1a; 则将该位…

2023年兔飞猛进,2024年龙码精神,龙举云兴

一、2023年回顾 从中华传统文化的角度来看&#xff0c;2023年&#xff0c;是一个比较特别的年份。 2023年是癸卯年&#xff0c;这是根据“天干地支”排列而来。2023年是黑兔年&#xff0c;这是一是根据十天支与五行的对应关系&#xff1a;壬癸属水、代表黑色&#xff0c;二是…

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

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

Python最基础的对字符串的操作1

1&#xff0c;字符串的查找&#xff1a; find()&#xff1a;查询某个子串是否包含在这个字符串中&#xff0c;如果在返回这个子串开始的位置下标&#xff0c;否则则返回-1 index()&#xff1a;查询某个子串是否包含在这个字符串中&#xff0c;如果在返回这个子串开始的位置下标…

猜数字游戏(python,C++), 同一个类中的方法相互调用(两种办法)

# random.randint(a, b)&#xff0c;使用randint()函数&#xff0c;我们可以在一个指定的整数范围内生成一个随机整数。在使用该函数时&#xff0c;我们需要指定整数范围的上限和下限。该函数返回一个随机整数&#xff0c;其取值范围是[a,b]&#xff0c;即包括a和b本身# input接…

从vue小白到高手,从一个内容管理网站开始实战开发第六天,登录功能后台功能设计--API项目中的登录实现(一)

从vue小白到高手,从一个内容管理网站开始实战开发第五天,登录功能后台功能设计--数据库与API项目-CSDN博客文章浏览阅读348次,点赞9次,收藏7次。本次文章主要讲了开发后台API项目给前台vue调用的话,需要使用的数据库并新建数据库和表、安装开发工具、如何创建API项目以及A…

IOC解决程序耦合

1.什么是IOC IOC (Inverse of Control)即控制反转&#xff1a;由ioc容器来创建依赖对象&#xff0c;程序只需要从IOC容器获取创建好的对象。 我们在获取对象时&#xff0c;都是采用new的方式。是主动的。 我们获取对象时&#xff0c;同时跟工厂要&#xff0c;有工厂为我们查找…