基于SSM框架的《超市订单管理系统》Web项目开发(第五天)供应商管理,增删改查

news2024/9/25 7:13:46

基于SSM框架的《超市订单管理系统》Web项目开发(第五天)供应商管理,增删改查

上一次我们实现了多表关联查询,还有分页显示数据的功能。还完善了用户管理这一模块。

因此今天我们需要完成的是供应商管理模块,这一模块与用户管理模块都是需要我们进行分页查询和

删除提示。(基本是跟用户管理这一模块相差不大,所以今天的进度会快速一点,不过会着重讲解一下,如何获取在前端获取后端传送的信息,并且前端如何传递信息到后端去,这一部分的话就是用户体验模块

(PS:近期有事所以没有更新,会找时间再更新的)


在这里插入图片描述

今天要完成的功能有:

  1. 实现供应商的添加功能
  2. 实现供应商的修改功能
  3. 实现供应商的查看功能,包括搜索功能
  4. 实现供应商的删除功能

可以好好回想一下,前后端数据传递的知识(view怎么通过表单把数据传给controller端,controller端怎么通过model把数据传给view端


一、实现供应商界面provider.jsp(归属于查询的一方面)

在这里插入图片描述

首先看这张需求图,那么我们就要判断出,页面中我们需要获取的参数有哪些?

可以看到,我们需要在前端往后端传的参数有:

1.供应商名(查询用的),这个我们是需要把以这个参数进行查询,希望获取到结果的集合

2.页面索引(分页使用,应该在前端页面中设置一个隐藏起来的参数,其作用是用于记录当前页码)

在这里插入图片描述

​ **代码解释一下:**因为这里我们是进行一个供应商列表查询,我们需要对结果进行分页显示。pageIndex是一个用于记录当前页码的变量,它的值会随着用户翻页操作而不断变化。因此需要从前端传回到后端,以获取对应的供应商数据。

为了将当前页码的值传递到后台,需要将pageIndex的值存储到表单中,并将表单提交到后台。而为了避免用户看到或修改页码,可以将pageIndex设置为一个隐藏的参数,这样它就不会在页面上显示出来。而后台就可以根据该参数值,正确地展示对应的供应商数据了


那么我们先放一下,就按照我们之前说的后端流程来进行开发

熟悉pojo->dao->service->controller->view的过程

①链接数据库自动创建provider数据表的pojo类

在这里插入图片描述

详细过程不展示了,可以翻看查阅我的往期文章➡使用idea链接数据库自动生成数据表的pojo类

PS:生成完一定要记得自己去检查一下pojo类!(如下图)

  • 是否导包正确,路径是否正确
  • 字段映射的变量属性是否正确?

在这里插入图片描述


②编写dao层中的ProviderMapper.xml,查询供应商列表的sql语句

1.我们需要一个根据条件查询供应商总数的sql语句:getProviderCount

2.还需要一个对供应商表分页的查询的sql语句:getProviderListByPage

<!--查询供应商总数的统计-->
<select id="getProviderCount" resultType="int">
    select  count(1) as count from provider
    <where>
        <if test="proName!=null and proName!=''">
            proName like CONCAT ('%',#{proName},'%')
        </if>
    </where>
</select>

<!--创建一个对供应商表分页的查询-->
<select id="getProviderListByPage" resultType="Provider">
    select  * from provider
    <where>
        <if test="proName!=null and proName!=''">
            proName like CONCAT ('%',#{proName},'%')
        </if>
    </where>
    order by id limit #{currentPageNo},#{pageSize}
</select>

这里我们使用了动态sql

  • 若是proName不为空,则根据proName进行模糊查询出所有相关的供应商.
  • 若是proName为空,那么直接就默认查询全部的供应商列表。

若是对动态SQL不熟悉的话,可以参考我往期的文章学习下关于动态SQL的知识

什么是动态SQL,如何应用?


③编写ProviderMapper接口,往里面加入对应sql语句,记得方法名要与Provider.xml中的sql的id一致
//获取供应商记录总数
public int getProviderCount(@Param("proName")String proName);

//根据条件查询供应商列表
public List<Provider> getProviderListByPage(@Param("proName")String proName,
                                            @Param("currentPageNo")Integer currentPageNo,
                                            @Param("pageSize")Integer pageSize);

PS:方法的参数和返回类型要与SQl语句中设置的一致,不然会出现参数报错,什么类型不符等报错

在这里插入图片描述


④编写ProviderService接口,往里面加入getProviderCount、getProviderListByPage方法

在这里插入图片描述

⑤编写ProviderServiceImpl实现类,实现getProviderCount、getProviderListByPage方法的具体细节。

在这里插入图片描述

PS:代码就不解释了,这和前面的用户模块代码相似,面向接口编程。这俩个是为了初始化供应商页面的时候能够获取到所有供应商信息和进行信息分页展示。


⑥编写Controller层,新建一个ProviderController类。一般来说,对不同的类进行操作,我们会编写不同的controller类。

前面User表的增删改查,所有的信息主体都是User表,因此我们创建UserController类进行控制。

那么现在我们对Provider表进行增删改查,因此我们也可以新建一个ProviderController类进行控制,这样分开来编写,后续新功能的拓展或者修改,都不会影响到其他的功能运行。

(这也是有点分布式的意思在里面,提前了解,可以帮助我们以后更快掌握分布式)

在这里插入图片描述

这里就不讲解了,和UserController类似。俩个参数,一个是页面当前页索引,二是需要查询的供应商名。

//获取供应商列表
@RequestMapping(value="/providerlist")
public String getProviderList(Model model,HttpSession session,
                          @RequestParam(value="queryname",required=false) String queryProviderName,
                          @RequestParam(value="pageIndex",required=false) String pageIndex) {
    logger.info("用户进入providerlist,供应商列表界面");
    if(session.getAttribute("user") == null){ //如果用户没有登录就直接来到provider就回到syserror
        return "redirect:/syserror";
    }

    List<Provider> providerList = null;
    //设置页面容量
    int pageSize = 5;
    //当前页码
    int currentPageNo = 1;

    if(queryProviderName == null){
        queryProviderName = "";
    }


    if(pageIndex != null){
        try{
            currentPageNo = Integer.valueOf(pageIndex);
        }catch(NumberFormatException e){
            return "redirect:/syserror";
        }
    }
    //总数量(表)
    int totalCount = providerService.getProviderCount(queryProviderName);
    //总页数
    PageSupport pages=new PageSupport();
    pages.setCurrentPageNo(currentPageNo);
    pages.setPageSize(pageSize);
    pages.setTotalCount(totalCount);
    int totalPageCount = pages.getTotalPageCount();

    //控制首页和尾页

    //设置分页的每一页的显示从哪里开始
    int start = ((currentPageNo-1) * pageSize);

    if(currentPageNo < 1){
        currentPageNo = 1;
    }else if(currentPageNo > totalPageCount){
        currentPageNo = totalPageCount;
    }


    //若是想要展示出其他的信息,就需要在这部分,把对应的数据或者变量添加到model中,然后去前端设置接受参数即可。
    providerList = providerService.getProviderListByPage(queryProviderName,start,pageSize);
    model.addAttribute("providerList", providerList);
    model.addAttribute("queryProviderName", queryProviderName);
    model.addAttribute("totalPageCount", totalPageCount);
    model.addAttribute("totalCount", totalCount);
    model.addAttribute("currentPageNo", currentPageNo);
    return "provider";
}

写入了一个名为providerlist的映射,所以当访问providerlist的网址时,我们会跳转到provider的视图view中,因此得去创建一下provider.jsp。


⑦编写provider.jsp,记得在自己项目设定的路径下创建嗷
<%--
  Created by IntelliJ IDEA.
  User: Stevedash
  Date: 2023/9/18
  Time: 18:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@include file="/WEB-INF/pages/common/head.jsp"%>
<div class="right">
    <div class="location">
        <strong>你现在所在的位置是:</strong>
        <span>供应商管理页面</span>
    </div>
    <div class="search">
        <form method="post" action="${pageContext.request.contextPath }/providerlist">
            <input name="method" value="query" class="input-text" type="hidden">
            <span>供应商名:</span>
            <input name="queryname" class="input-text" type="text" value="${queryProviderName }">
            <input type="hidden" name="pageIndex" value="1"/>
            <input value="查 询" type="submit" id="searchbutton">
            <a href="${pageContext.request.contextPath}/provideradd" >添加供应商</a>
        </form>
    </div>
    <!--用户-->
    <table class="providerTable" cellpadding="0" cellspacing="0">
        <tr class="firstTr">
            <th width="10%">供应商编码</th>
            <th width="20%">供应商名称</th>
            <th width="10%">联系人</th>

            <th width="10%">电话</th>
            <th width="20%">供应商地址</th>
            <th width="30%">操作</th>
        </tr>

<c:forEach var="provider" items="${providerList }" varStatus="status">

            <tr>
                <td>${provider.proCode}</td>
                <td>${provider.proName}</td>
                <td>${provider.proContact}</td>
                <td>${provider.proPhone}</td>
                <td>${provider.proAddress}</td>


                <td>
                    <span><a class="viewProvider" href="javascript:;" providerid=${provider.id} proCode=${provider.proCode } ><img src="${pageContext.request.contextPath }/statics/images/read.png" alt="查看" title="查看"/></a></span>
                    <span><a class="modifyProvider" href="javascript:;" providerid=${provider.id } proCode=${provider.proCode }><img src="${pageContext.request.contextPath }/statics/images/xiugai.png" alt="修改" title="修改"/></a></span>
                    <span><a class="deleteProvider" href="javascript:;" providerid=${provider.id } proCode=${provider.proCode }><img src="${pageContext.request.contextPath }/statics/images/schu.png" alt="删除" title="删除"/></a></span>
                </td>
            </tr>
        </c:forEach>
    </table>

    <input type="hidden" id="totalPageCount" value="${totalPageCount}"/>
    <c:import url="rollpage.jsp">
        <c:param name="totalCount" value="${totalCount}"/>
        <c:param name="currentPageNo" value="${currentPageNo}"/>
        <c:param name="totalPageCount" value="${totalPageCount}"/>
    </c:import>
</div>
</section>

<!--点击删除按钮后弹出的页面-->
<div class="zhezhao"></div>
<div class="remove" id="removeProv">
    <div class="removerChid">
        <h2>提示</h2>
        <div class="removeMain">
            <p>你确定要删除该供应商吗?</p>
            <a href="#" id="yes">确定</a>
            <a href="#" id="no">取消</a>
        </div>
    </div>
</div>

<%@include file="/WEB-INF/pages/common/foot.jsp" %>
<script type="text/javascript" src="${pageContext.request.contextPath }/statics/js/providerlist.js"></script>

基本页面的展示和用户管理页面相差不大,唯一需要讲解的就是

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

这是在JSP页面中导入JSTL(JavaServer Pages Standard Tag Library)的核心功能库。JSTL是一个非常流行的标准标签库,它为JSP页面提供了一系列的标准动作,比如迭代、条件判断、国际化支持、SQL等

因此我们遍历集合中的数据就更为简单轻松!!!


⑧运行项目进行测试,出现如下报错

在这里插入图片描述

PS:这种是编码错误,因为我们的代码中有中文注释嘛,不过呢没有影响的,我们前面也设定好了项目文件的编码,这里会提示报错,是因为编译器中的预编译设置,我们对项目文件有了修改,他检查到与项目编码不同,所以弹出的报错

​ 实际上我们只需要再点击一次项目运行即可正常部署!!!

在这里插入图片描述

在这里插入图片描述

正常部署啦,打开网页输入我们设置好的映射网址进行尝试把

在这里插入图片描述

正确显示啦,若是弹出404等,就说明还没有修改页面的指针,得去common下找到头部文件head.jsp,里面修改一下我们侧边栏指引的跳转路径,修改成我们前面设置好的providerlist映射即可。

在这里插入图片描述

下面的三个功能也是基本上一致的,需要同学们自己完成┗|`O′|┛ 嗷~~,要考虑的就是需要什么参数,是否需要返回值,也就是考虑方法设计的同时,需要想到的点。

想要跟着学习的可以去我的资源里面找对应的文件下载,我的md文件也会发上去,项目文件会上传可以自己跟着学习一下。

作者:Stevedash

发表于:2023年12月4日 23点39分

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

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

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

相关文章

SQL自学通之表达式条件语句与运算

目录 一、目标 二、表达式条件语句 1、表达式&#xff1a; 2、条件 2.1、WHERE 子句 三、运算 1、数值型运算: 1.1、加法() 1.2、减法 (-) 1.3、除法&#xff08;/&#xff09; 1.4、乘法 &#xff08;*&#xff09; 1.5、取模 &#xff08;%&#xff09; 优先级别…

第24章:Kubernetes Helm Introduction

目录 1. Helm简介2. Helm Charts文件&#xff08;.tgz&#xff09;组成3. Helm核心术语&#xff1a;4. Helm常用命令&#xff1a;5. DIY简单Helm Charts参考链接 1. Helm简介 Helm用于管理Kubernetes应用程序&#xff0c;Helm Charts可以用于定义、安装和升级最复杂的Kubernet…

西南科技大学模拟电子技术实验七(集成运算放大器的非线性应用)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) 预习计算内容根据运放的非线…

Android加载AnimatedImageDrawable播放gif动态图,Kotlin

Android加载AnimatedImageDrawable播放gif动态图&#xff0c;Kotlin import android.graphics.ImageDecoder import android.graphics.ImageDecoder.OnHeaderDecodedListener import android.graphics.drawable.AnimatedImageDrawable import android.os.Bundle import android…

SVG-椭圆弧-参数转换-计算公式-标准解读

文章目录 1.简介2.基本参数2.1.椭圆的表达2.2.参数变换2.3.注意事项 3.参考资料4.总结 1.简介 为了与其他路径段表示法保持一致&#xff0c; SVG 路径中的圆弧是根据曲线上的起点和终点定义的。椭圆弧的这种端点参数化。优点是它允许与其它路径一致的语法&#xff0c;其中所有…

Spring Security 6.x 系列(9)—— 基于过滤器链的源码分析(二)

一、前言 在本系列文章&#xff1a; Spring Security 6.x 系列&#xff08;4&#xff09;—— 基于过滤器链的源码分析&#xff08;一&#xff09;中着重分析了Spring Security在Spring Boot 的自动配置、 DefaultSecurityFilterChain 的构造流程、FilterChainProxy 的构造流…

深入学习锁--Synchronized各种使用方法

一、什么是synchronized 在Java当中synchronized通常是用来标记一个方法或者代码块。在Java当中被synchronized标记的代码或者方法在同一个时刻只能够有一个线程执行被synchronized修饰的方法或者代码块。因此被synchronized修饰的方法或者代码块不会出现数据竞争的情况&#x…

Spring Boot中使用Swagger

1. 启用Swagger 1.1 启用注解扫描和文档接口 直接在POM文件引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency>1.2 启动swagger-u…

ARM与大模型,狭路相逢

编辑&#xff1a;阿冒 设计&#xff1a;沐由 从去年底至今&#xff0c;伴随着OpenAI旗下ChatGPT的火爆&#xff0c;一波AI大模型推动着AI应用全面进入了大模型时代。与此同时&#xff0c;随着边缘算力的提升&#xff0c;AI大模型的部署也逐渐从云端涉入到边缘。 世界对AI算力的…

黑马一站制造数仓实战1

1. 项目目标 一站制造 企业中项目开发的落地&#xff1a;代码开发 代码开发&#xff1a;SQL【DSL SQL】 SparkCore SparkSQL 数仓的一些实际应用&#xff1a;分层体系、建模实现 2. 内容目标 项目业务介绍&#xff1a;背景、需求 项目技术架构&#xff1a;选型、架构 项目环境…

Selenium 自动化高级操作与解决疑难杂症,如无法连接、使用代理等

解决 Selenium 自动化中的常见疑难杂症 这里记录一些关于 Selenium的常用操作和疑难杂症。 有一些细节的知识点就不重复介绍了&#xff0c;因为之前的文章中都有&#xff01; 如果对本文中的知识点有疑问的&#xff0c;可以先阅读我以前分享的文章&#xff01; 知识点&…

1-4、调试汇编程序

语雀原文链接 文章目录 1、执行过程第一步&#xff1a;源程序第二步&#xff1a;编译连接第三步&#xff1a;执行 2、DOSBox运行程序第1步 进入EDIT.EXE第2步 编写源程序第3步 编译第4步 连接第5步 执行完整过程 3、DEBUG跟踪执行过程加载程序到内存执行程序debug和源程序数字…

【导航控制器总结-导航控制器栈 Objective-C语言】

一、导航控制器总结 1.我们接着上一堂课的内容继续 我们上节课说到哪里了,是不是就是对这个导航控制器的一个总结啊 然后,使用的注意事项 2.导航控制器使用注意事项: 1)第一点,使用导航控制器,你在创建的时候,需要给它指定一个根控制器 创建导航控制器的同时,指定…

【译】如何在调试时分析CPU和内存(Analyze CPU and Memory while Debugging)

您想了解如何使您的代码运行得更快&#xff0c;使用更少的内存&#xff0c;或者只是找出您的代码是否有CPU或内存问题?你当然会——你是一名开发人员!但是&#xff0c;内存和性能调优经常会遇到“重要但不紧急”的任务&#xff0c;因为真正紧急的事情&#xff0c;您似乎根本无…

优化 SQL 日志记录的方法

为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用&#xff0c;它涉及跟踪在数据库上执行的所有 SQL 语句&#xff0c;从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解&#xff0c;使其成为确…

Dockerfile脚本编写流程及示例

学习dockerfile指令 Dockerfile 指令 说明 FROM 指定基础镜像 MAINTAINER 声明镜像的维护者 LABEL 添加元数据标签 RUN 在容器中执行命令 CMD 容器启动后默认执行的命令 EXPOSE 暴露容器的端口 ENV 设置环境变量 ADD 将文件、目录或远程文件添加到容器中 COP…

[ 蓝桥杯Web真题 ]-外卖给好评

目录 介绍 准备 目标 效果 规定 思路 解答参考 介绍 外卖是现代生活中必备的一环。收到外卖后&#xff0c;各大平台软件常常会邀请用户在口味&#xff0c;配送速度等多个方面给与评分。在 element-ui 组件中&#xff0c;已经有相应的 Rate 组件&#xff0c;但是已有组件…

论文解读--PointPillars- Fast Encoders for Object Detection from Point Clouds

PointPillars--点云目标检测的快速编码器 摘要 点云中的物体检测是许多机器人应用(如自动驾驶)的重要方面。在本文中&#xff0c;我们考虑将点云编码为适合下游检测流程的格式的问题。最近的文献提出了两种编码器;固定编码器往往很快&#xff0c;但牺牲了准确性&#xff0c;而…

【latex笔记】双栏格式下插入单栏、双栏格式图片

双栏格式下插入单栏、双栏格式图片 1.缘起multicols2.双栏格式 插入单栏图片3.双栏格式 插入双栏图片 1.缘起multicols 插入双栏格式图片问题被困扰了有很长一段时间&#xff0c;查看网络资源也一直没找到解决方法&#xff0c;今天查看Latex官方文档&#xff0c;才发现因为mul…

spring cloud 整合Feign经行远程调用

文章目录 Feign远程调用Feign替代RestTemplate1&#xff09;引入依赖2&#xff09;添加注解3&#xff09;编写Feign的客户端4&#xff09;测试5&#xff09;总结 自定义配置配置文件方式Java代码方式 Feign使用优化 Feign远程调用 先来看我们以前利用RestTemplate发起远程调用…