xdm俺来了、详解超市订单管理系统SSM版本

演示视频

超市订单管理系统SSM版本

声名:此系统修改了一些原来的页面内容,以及修补之前项目不足的地方…

另外新添了一个 根据时间 计算 早上 中午 下午 晚上的demo 记录在右上角

在这里插入图片描述

另外优化了一个查询… 就是当查询不存在的数据时 会发生如下情况

在这里插入图片描述
我将它整成查询不存在的数据时 0记录 0条0页

创作不易:兄弟们 三连一下 可以吗? 🐕

一:数据库

用之前的数据库数据即可 这里就不再赘述 上篇SMBMS博文
数据库中的 smbms_address 表没用到 可以不使用

二:我们先创建一个普通的maven项目

如果不懂的 查看 如何建立maven项目

三:建立包结构

在这里插入图片描述

四:实体类

User类

import java.text.SimpleDateFormat;
import java.util.Date;
public class User {
    private Integer id;
    private String userCode;    //用户编码
    private String userName;
    private String userPassword;
    private Integer gender;
    private Date birthday;
    private String phone;
    private String address;
    private Integer userRole;
    private Integer createdBy;  //创建者
    private Date createDate;
    private Integer modifyBy;   //更新者
    private Date modifyDate;    //更新时间

    private Integer age;    //年龄
    private String userRoleName;    //用户角色名称
    private String birth;   //用户生日

    public Integer getAge() {
        Date date = new Date();//获取当前时间
        Integer age = date.getYear() - this.birthday.getYear();//获取当前用户多少岁
        return age;
    }
    public String getBirth(){
        return birth;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

    public String getUserRoleName() {
        return userRoleName;
    }

    public void setUserRoleName(String userRoleName) {
        this.userRoleName = userRoleName;
    }





    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserCode() {
        return userCode;
    }

    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirth(String birth) {
        this.birth = birth;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        this.setBirth(sdf.format(this.birthday));
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getUserRole() {
        return userRole;
    }

    public void setUserRole(Integer userRole) {
        this.userRole = userRole;
    }

    public Integer getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreationDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public Integer getModifyBy() {
        return modifyBy;
    }

    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }

    public Date getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userCode='" + userCode + '\'' +
                ", userName='" + userName + '\'' +
                ", userPassword='" + userPassword + '\'' +
                ", gender=" + gender +
                ", birthday=" + birthday +
                ", phone='" + phone + '\'' +
                ", address='" + address + '\'' +
                ", userRole=" + userRole +
                ", createdBy=" + createdBy +
                ", createDate=" + createDate +
                ", modifyBy=" + modifyBy +
                ", modifyDate=" + modifyDate +
                ", age=" + age +
                ", userRoleName='" + userRoleName + '\'' +
                ", birth='" + birth + '\'' +
                '}';
    }
}

Role类

import java.util.Date;
public class Role {
    private Integer id;   //id
    private String roleCode; //角色编码
    private String roleName; //角色名称
    private Integer createdBy; //创建者
    private Date creationDate; //创建时间
    private Integer modifyBy; //更新者
    private Date modifyDate;//更新时间

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getRoleCode() {
        return roleCode;
    }
    public void setRoleCode(String roleCode) {
        this.roleCode = roleCode;
    }
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
    public Integer getCreatedBy() {
        return createdBy;
    }
    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }
    public Date getCreationDate() {
        return creationDate;
    }
    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }
    public Integer getModifyBy() {
        return modifyBy;
    }
    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }
    public Date getModifyDate() {
        return modifyDate;
    }
    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }
}

Provider类

import java.util.Date;

public class Provider {
    private Integer id;   //id
    private String proCode; //供应商编码
    private String proName; //供应商名称
    private String proDesc; //供应商描述
    private String proContact; //供应商联系人
    private String proPhone; //供应商电话
    private String proAddress; //供应商地址
    private String proFax; //供应商传真
    private Integer createdBy; //创建者
    private Date creationDate; //创建时间
    private Integer modifyBy; //更新者
    private Date modifyDate;//更新时间

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getProCode() {
        return proCode;
    }
    public void setProCode(String proCode) {
        this.proCode = proCode;
    }
    public String getProName() {
        return proName;
    }
    public void setProName(String proName) {
        this.proName = proName;
    }
    public String getProDesc() {
        return proDesc;
    }
    public void setProDesc(String proDesc) {
        this.proDesc = proDesc;
    }
    public String getProContact() {
        return proContact;
    }
    public void setProContact(String proContact) {
        this.proContact = proContact;
    }
    public String getProPhone() {
        return proPhone;
    }
    public void setProPhone(String proPhone) {
        this.proPhone = proPhone;
    }
    public String getProAddress() {
        return proAddress;
    }
    public void setProAddress(String proAddress) {
        this.proAddress = proAddress;
    }
    public String getProFax() {
        return proFax;
    }
    public void setProFax(String proFax) {
        this.proFax = proFax;
    }
    public Integer getCreatedBy() {
        return createdBy;
    }
    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }
    public Date getCreationDate() {
        return creationDate;
    }
    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }
    public Integer getModifyBy() {
        return modifyBy;
    }
    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }
    public Date getModifyDate() {
        return modifyDate;
    }
    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }
}

Bill类

import java.math.BigDecimal;
import java.util.Date;

public class Bill {
    private Integer id;   //id
    private String billCode; //账单编码
    private String productName; //商品名称
    private String productDesc; //商品描述
    private String productUnit; //商品单位
    private BigDecimal productCount; //商品数量
    private BigDecimal totalPrice; //总金额
    private Integer isPayment; //是否支付
    private Integer providerId; //供应商ID
    private Integer createdBy; //创建者
    private Date creationDate; //创建时间
    private Integer modifyBy; //更新者
    private Date modifyDate;//更新时间

    private String providerName;//供应商名称


    public String getProviderName() {
        return providerName;
    }
    public void setProviderName(String providerName) {
        this.providerName = providerName;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getBillCode() {
        return billCode;
    }
    public void setBillCode(String billCode) {
        this.billCode = billCode;
    }
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public String getProductDesc() {
        return productDesc;
    }
    public void setProductDesc(String productDesc) {
        this.productDesc = productDesc;
    }
    public String getProductUnit() {
        return productUnit;
    }
    public void setProductUnit(String productUnit) {
        this.productUnit = productUnit;
    }
    public BigDecimal getProductCount() {
        return productCount;
    }
    public void setProductCount(BigDecimal productCount) {
        this.productCount = productCount;
    }
    public BigDecimal getTotalPrice() {
        return totalPrice;
    }
    public void setTotalPrice(BigDecimal totalPrice) {
        this.totalPrice = totalPrice;
    }
    public Integer getIsPayment() {
        return isPayment;
    }
    public void setIsPayment(Integer isPayment) {
        this.isPayment = isPayment;
    }

    public Integer getProviderId() {
        return providerId;
    }
    public void setProviderId(Integer providerId) {
        this.providerId = providerId;
    }
    public Integer getCreatedBy() {
        return createdBy;
    }
    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }
    public Date getCreationDate() {
        return creationDate;
    }
    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }
    public Integer getModifyBy() {
        return modifyBy;
    }
    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }
    public Date getModifyDate() {
        return modifyDate;
    }
    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }
}

五:导入资源文件

在这里插入图片描述

application-context.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
         https://www.springframework.org/schema/context/spring-context.xsd">
    <import resource="classpath:spring-dao.xml"/>
    <import resource="classpath:spring-service.xml"/>
    <import resource="classpath:spring-mvc.xml"/>

    <!--扫描util下的工具类-->
    <context:component-scan base-package="com.csnz.util"/>
</beans>

db.properties文件

jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
jdbc.username = 你的账户
jdbc.password = 你的密码

log4j.properties文件 可配可不配 我这里配置是为了查日志

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/CSNZ.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%c]%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件 整合的话 mybatis只需要负责两样东西 别名 和 mapper映射-->
<configuration>
    <!--配置日志-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!--配置数据源的事情 让spring做-->
    <typeAliases>
        <package name="com.csnz.pojo"/>
    </typeAliases>

<!--MapperRegistry:注册绑定我们的Mapper文件 因为我们spring-dao.xml 中配置了dao接口扫描包 所以此时我们这里不用重新注册 二选一即可
    <mappers>
        <mapper class="com.csnz.dao.User.UserMapper"/>
        <mapper class="com.csnz.dao.Role.RoleMapper" />
        <mapper class="com.csnz.dao.Bill.BillMapper"/>
        <mapper class="com.csnz.dao.Provider.ProviderMapper"/>
    </mappers>
    -->

</configuration>

spring-dao.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--1、关联数据库配置文件-->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--2、配置连接池
        dbcp:半自动化操作,不能自动连接
        c3p0:自动化操作(自动化的加载配置文件,并且可以自动设置到对象中)
    -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!--c3p0连接池的私有属性-->
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="10"/>
        <!--关闭连接后不自动commit-->
        <property name="autoCommitOnClose" value="false"/>
        <!--获取连接超时时间-->
        <property name="checkoutTimeout" value="10000"/>
        <!--当获取连接失败重试次数-->
        <property name="acquireRetryAttempts" value="2"/>
    </bean>

    <!--3、sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--注入数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--绑定mybatis的配置文件-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    <!--4、配置dao接口扫描包,动态的实现了dao接口可以注入到Spring容器中(tips:之前是用实现类继承support类或者 注入template模板)-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--注入 sqlSessionFactory-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--要扫描的dao包-->
        <property name="basePackage" value="com.csnz.dao"/>
    </bean>

</beans>

spring-mvc.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--1、注解驱动-->
    <mvc:annotation-driven/>
    <!--2、静态资源过滤-->
    <mvc:default-servlet-handler/>
    <!--3、扫描包:controller-->
    <context:component-scan base-package="com.csnz.controller"/>
    <!--4、视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

spring-service.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:cotext="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
         https://www.springframework.org/schema/context/spring-context.xsd">
    <!--1、扫描service下的包-->
    <cotext:component-scan base-package="com.csnz.service"/>
    <!--2、将我们所有业务类,注入到Spring,可以通过配置 或者 使用注解实现(@Service @AutoWire)-->
<!--    <bean id="userServiceImpl" class="com.csnz.service.Impl.UserServiceImpl">-->
<!--        <property name="userMapper" ref="userMapper"/>-->
<!--    </bean>-->

<!--    <bean id="roleServiceImpl" class="com.csnz.service.Impl.RoleServiceImpl">-->
<!--        <property name="roleMapper" ref="roleMapper"/>-->
<!--    </bean>-->
<!--    -->
<!--    <bean id="billServiceImpl" class="com.csnz.service.Impl.BillServiceImpl">-->
<!--        <property name="billMapper" ref="billMapper"/>-->
<!--    </bean>-->
    
<!--    <bean id="pageSupport" class="com.csnz.util.PageSupport"/>-->

    <!--3、声明式事务配置-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

在这里插入图片描述

这里别忘记配置web.xm文件!!!

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--DispatchServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:application-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--乱码过滤-->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--Session过期时间 15分钟-->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
</web-app>

六:导入依赖

 <!--依赖 : junit,数据库驱动,连接池,servlet,jsp,mybatis,mybatis-spring,spring-->
    <dependencies>
        <!--Junit单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <!--数据库连接池-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!--servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <!--jsp-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!--Mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>
        <!--spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <!--lombok 可用可不用 不用的话自己生成set、get、以及构造器-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        <!--      阿里巴巴的fastjson:用于转换json格式-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
        </dependency>
        <!-- 配置Log4j 日志处理 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

顺便配置一下静态资源导入导出问题 静态资源导入导出问题

下面开始干活啦:

一:登陆模块

从底层往上写 dao -> service -> controller

dao层

在这里插入图片描述

登陆时 从数据库中查找此 用户userCode 查得到user再判断密码是否相同
在这里插入图片描述

service层

在这里插入图片描述
service层 负责判断密码是否相同的逻辑
在这里插入图片描述

@Service
public class UserServiceImpl implements UserService {
    //业务层调用dao层
    @Autowired
    private UserMapper userMapper;

//  使用注解模式开发:对应类上加 @Service 和 @Autowired 此时就不用set方法注入了
//    public void setUserMapper(UserMapper userMapper) {
//        this.userMapper = userMapper;
//    }


    @Override
    public User login(String userCode, String password) {
        //先通过 userCode查找用户的信息 再判断用户密码是否相等 如果不相同就返回 null
        User user = userMapper.findUserByUserCode(userCode);
        boolean flag = user != null ? user.getUserPassword().equals(password) : false;
        return flag == true ? user : null;
    }
 }

controller层

在这里插入图片描述
控制层检测 如果用户不为空 将用户信息存入session

@Controller
@RequestMapping("/User")
public class UserController {
    @Autowired
    private UserService userService;

    /*
     *****************************  用户登陆 与 注销模块   *****************************
     */
    @RequestMapping("/login")
    public String findUser(String userCode, String userPassword,HttpServletRequest request){
        User user = userService.login(userCode,userPassword);
        if (user != null) { //如果用户不为空 将用户信息存入session
                request.getSession().setAttribute("userSession",user);
                return "frame";
            }
        request.getSession().setAttribute("msg","当前账号或密码错误");
        return "redirect:/index.jsp";
    }
}

最后配置一下登陆页面的 登陆请求 就大功告成啦

在这里插入图片描述

二:注销模块

直接在 controller 层写 移除用户的session 返回登录页面

controller层

在这里插入图片描述

//退出系统
    @GetMapping("/logout")
    public void logout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //移除用户的session
        req.getSession().removeAttribute("userSession");
        //返回登录页面
        req.setAttribute("msg","");
        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }

最后配置一下head页面的 注销请求 就大功告成啦

在这里插入图片描述

三:用户修改密码模块

从底层往上写 dao -> service -> controller

dao层

在这里插入图片描述

//修改密码
public abstract int updatePassword(@Param("userId") int userId ,@Param("newPassword") String newPassword);

在这里插入图片描述

service层

在这里插入图片描述
在这里插入图片描述

controller层

看这个请求 网页肯定是先去修改密码的页面 再执行修改密码的操作
在这里插入图片描述

在这里插入图片描述
此时 pwdmodify.jsp 判断你填入的密码数据 又是根据 ajax判断的 所以看 pwdmodify.js
在这里插入图片描述

在这里插入图片描述

	//验证旧密码是否正确
    @GetMapping("/verifyPwd")
    @ResponseBody
    public String verifyPwd(String oldpassword,HttpServletRequest req) {
        //依旧从session中取ID
        User user = (User) req.getSession().getAttribute("userSession");
        //System.out.println("前端传来的旧密码:"+oldpassword);
        //将结果存放在map集合中 让Ajax使用
        Map<String, String> resultMap = new HashMap<>();
        //下面开始判断 键都是用result 此处匹配js中的Ajax代码
        if(user == null){
            //说明session被移除了 或未登录|已注销
            resultMap.put("result","sessionerror");
        }else if(oldpassword == null){
            //前端输入的密码为空
            resultMap.put("result","error");
        }else {
            //如果旧密码与前端传来的密码相同
            if((user).getUserPassword().equals(oldpassword)){
                resultMap.put("result","true");
            }else{
                //前端输入的密码和真实密码不相同
                resultMap.put("result","false");
            }
        }
        //JSONArray 阿里巴巴的JSON工具类 用途就是:转换格式
        return JSONArray.toJSONString(resultMap);
    }

最后就看 pwdmodify.jsp 文件提交的action
在这里插入图片描述
最终密码在这里进行修改
在这里插入图片描述

	// 修改密码
    @RequestMapping("/pwdmodify")
    public String pwdmodify(String newpassword,HttpServletRequest req, ModelAndView model)  {
        //从Session中获取ID
        User user = (User) req.getSession().getAttribute("userSession");
        //先判断不为空 再比较密码是否相等
        if(user != null && newpassword != null){
            //修改密码并返回结果
            boolean flag = userService.updatePassword(user.getId(), newpassword);
            //如果密码修改成功 移除当前session
            if(flag){
                model.addObject("message","修改密码成功,请使用新密码登录!");
                req.getSession().removeAttribute("userSession");
            }else{
                model.addObject("message","密码修改失败 新密码不符合规范");
            }
        }else{
            model.addObject("message","新密码不能为空!");
        }
        //修改完了 重定向到此修改页面
        return "pwdmodify";
    }

修改密码模块大功告成啦

四:登陆拦截器模块

写一个拦截器类 并在 spring-mvc.xml 中进行注册绑定

LoginInterceptor类

在这里插入图片描述

除了 登陆和注销 无需经过拦截 其他请求都需要经过拦截器判断

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //用户登陆成功 : true
        if(request.getSession().getAttribute("userSession") != null) {
            return true;
        }
        // 用户请求登陆需求 : true
        if(request.getRequestURI().contains("login") || request.getRequestURI().contains("logout")){
            return true;
        }
        // 其余请求都是 error
        System.out.println("拦截到非法请求...");
        request.setAttribute("msg","请先登陆!");
        request.getRequestDispatcher("/index.jsp").forward(request,response);
        return false;
    }
}

写完 LoginInterceptor 类 记得在 spring-mvc.xml 中 配置此拦截器

在这里插入图片描述

<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/css/**"/>
            <mvc:exclude-mapping path="/calendar/**"/>
            <mvc:exclude-mapping path="/images/**"/>
            <mvc:exclude-mapping path="/js/**"/>
            <bean class="com.csnz.Interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

五:用户管理模块

小插曲:分页工具类 PageSupport
@Component
public class PageSupport {
    //当前页面 来自于用户输入
    private int currentPageNo = 1;
    //总数量(表)
    private int totalCount = 0;
    //页面容量
    private int pageSize = 0;
    //总共显示的页数 为总表数量/单页容量 +1
    private int totalPageCount =1;

    public int getCurrentPageNo() {
        return currentPageNo;
    }

    public void setCurrentPageNo(int currentPageNo) {
        if(currentPageNo>0){
            this.currentPageNo = currentPageNo;
        }
    }


    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        if(totalCount>0){
            this.totalCount = totalCount;
            this.setTotalPageCountByRs();
        }
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        if(pageSize>0){
            this.pageSize = pageSize;
        }
    }

    public int getTotalPageCount() {
        return totalPageCount;
    }

    public void setTotalPageCount(int totalPageCount) {
        this.totalPageCount = totalPageCount;
    }
    public void setTotalPageCountByRs(){
        if(this.totalCount % this.pageSize == 0){
            this.totalPageCount = this.totalCount / this.pageSize;
        }else if(this.totalCount % this.pageSize > 0){
            this.totalPageCount = this.totalCount / this.pageSize +1;
        }else{
            this.totalPageCount = 0;
        }
    }
}

5.1:用户列表查询模块

从底层往上写 dao -> service -> controller

dao层

查询用户列表 需要 用户总数 因为 分页要用到
在这里插入图片描述

//根据用户名 或 角色 查询用户总数
public abstract int getUserCounts(@Param("username") String username,@Param("userRole") int userRole);
//根据条件 查询 获取用户列表 userlist
public abstract List<User> getUserList(@Param("username") String username, @Param("userRole") int userRole,@Param("currentPageNo") int currentPageNo,@Param("pageSize") int pageSize);

在这里插入图片描述

<!--根据 用户名 或 角色 查找 用户总数-->
    <select id="getUserCounts" resultType="Integer" >
        select count(1)  from smbms_user u , smbms_role r
        <where>
            u.userRole = r.id
            <if test="username != null">
                and u.userName like CONCAT(CONCAT('%',#{ username }),'%')
            </if>
            <if test="userRole != 0">
                and u.userRole = #{ userRole }
            </if>
        </where>
    </select>

    <!--根据条件 查询 获取用户列表 userlist-->
    <select id="getUserList" resultType="User">
        select u.*,r.roleName as userRoleName
        from smbms_user u, smbms_role r
        <where>
            u.userRole = r.id
            <if test="username != null and !username.trim().equals('')">
                and u.username like CONCAT('%',#{ username },'%')
            </if>
            <if test="userRole != 0">
                and u.userRole = #{ userRole }
            </if>
        </where>
        order by u.creationDate DESC limit #{ currentPageNo },#{ pageSize }
    </select>
service层

在这里插入图片描述

//用户管理——查询记录数
public abstract int getUserCounts(String username, int userRole);
//根据条件 查询用户列表
public abstract List<User> getUserList(String QueryUserName, int QueryUserRole, int currentPageNo, int pageSize);

在这里插入图片描述

	@Override
    public int getUserCounts(String username, int userRole) {
        return userMapper.getUserCounts(username,userRole);
    }

    @Override
    public List<User> getUserList(String QueryUserName, int QueryUserRole, int currentPageNo, int pageSize) {
        return userMapper.getUserList(QueryUserName,QueryUserRole,currentPageNo,pageSize);
    }
controller层

前端head 页面 根据这个请求 跳转到 用户管理页面 查看用户列表 一开始不带参数 查全表
在这里插入图片描述
在这里插入图片描述

@Controller
@RequestMapping("/UserManager")
public class UserManagerController {
    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private PageSupport pageSupport;


    /*
     *************************      查询用户列表模块   *********************************
     */

    /**
     * @Des 去用户管理页面时 也需要查询用户信息
     * @Author zzj
     * @Date 2021/11/7/0007 14:09
     **/
    @GetMapping("/toUserManagerPage")
    public String toUserManagerPage(String queryName, String queryUserRole, String pageIndex, HttpServletRequest request) {
        //这里需要设置分页参数
        //1、下面是默认要返回的分页信息 还没根据前端传来的做转化
        int userRole = 0;       // 用户角色 默认 为 0
        int pageSize = 5;       // 一页显式的数据量 默认为 5
        int currentPageNo = 1;  // 当前页码
        int totalCount = 0;     // 根据条件查询出来的记录总数量 默认为0
        int totalPageCount = 0; // 全部数据量 算出 总共显示的页数

        //2、根据前端传来的信息做转化 替换默认分页信息
        if (queryUserRole != null && !queryUserRole.trim().equals("")) {
            try {
                userRole = Integer.parseInt(queryUserRole);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (pageIndex != null && !pageIndex.trim().equals("")) {
            try {
                currentPageNo = Integer.parseInt(pageIndex);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //3、根据条件(用户名、用户角色)查询出来的记录总数量
        totalCount = userService.getUserCounts(queryName, userRole);

        //4、设置pageSupport的参数
        pageSupport.setPageSize(pageSize);              // 设置 页面容量
        pageSupport.setTotalCount(totalCount);          // 设置 总数量(表)
        pageSupport.setCurrentPageNo(currentPageNo);    // 设置 当前页码 来自于用户输入
        //总共显示的页数
        totalPageCount = pageSupport.getTotalPageCount();

        //5、如果页数小于1,就显示第一页  页数大于 最后一页就 显示最后一页
        if (currentPageNo < 1) {
            currentPageNo = 1;
        } else if (currentPageNo > totalPageCount) {
            currentPageNo = totalPageCount;
        }

        //6、根据条件 查询用户列表
        List<User> userList = userService.getUserList(queryName, userRole, (currentPageNo - 1) * pageSize, pageSize);
        //将信息返回至前端页面
        request.setAttribute("userList", userList);

        //潮汕奴仔_优化: 这里加一步 判断此 列表是否为空 是则 清零页码信息 并返回
        if(userList.size() == 0){
            System.out.println("\n潮汕奴仔_优化\n");
            request.setAttribute("queryUserName", queryName);
            request.setAttribute("queryUserRole", queryUserRole);
            request.setAttribute("totalPageCount",0);
            request.setAttribute("totalCount",0);
            request.setAttribute("currentPageNo",0);
            return "userlist";
        }
        //7、查询用户角色列表
        List<Role> roleList = roleService.getRoleList();
        //将信息返回至前端页面
        request.setAttribute("roleList", roleList);

        //8、将所有信息返回至前端展示
        request.setAttribute("queryUserName", queryName);
        request.setAttribute("queryUserRole", queryUserRole);
        request.setAttribute("totalPageCount", totalPageCount);
        request.setAttribute("totalCount", totalCount);
        request.setAttribute("currentPageNo", currentPageNo);
        return "userlist";
    }
}

相应的,userlist.jsp 页面的查询请求也要改变 这个请求可以带参数进行模糊查询在这里插入图片描述

5.2:用户列表 查询指定用户信息 模块

从底层往上写 dao -> service -> controller

dao层

根据 用户id 去查询 用户的信息
在这里插入图片描述
在这里插入图片描述

<!--根据用户id 查询用户信息-->
    <select id="findById" resultType="User">
        select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.id = #{ id } and u.userRole = r.id
    </select>
service层

在这里插入图片描述

在这里插入图片描述

controller层

可以看到前端页面 调用js 并将 userid 传递进去
在这里插入图片描述

js文件中 请求如下 跳转到 用户信息视图页面
在这里插入图片描述

那我们就开始在控制层写吧…
在这里插入图片描述

5.3:用户列表 修改用户详情模块

从底层往上写 dao -> service -> controller

dao层

根据 用户id 和 用户整体信息 进行修改
在这里插入图片描述
在这里插入图片描述

 <!--用户管理模块中的子模块 —— 更改用户信息-->
    <update id="modify">
        update smbms_user set userName = #{ user.userName },gender = #{ user.gender },birthday =#{ user.birthday },phone = #{ user.phone },address = #{ user.address },userRole = #{ user.userRole },modifyBy = #{ user.modifyBy },modifyDate = #{ user.modifyDate } where id = #{ id }
    </update>
service层

在这里插入图片描述
在这里插入图片描述

controller层

前端页面请求 将userid传给js文件
在这里插入图片描述

可以看到页面 调用js 并将 userid 传递进去

在这里插入图片描述
先去往 用户信息修改页面 然后根据用户id 查询用户原来的信息 并展示在用户修改页面
在这里插入图片描述
可以看到 usermodify.jsp 页面 收集数据后 执行请求
在这里插入图片描述
这才是最终修改用户信息的功能
在这里插入图片描述

	// 修改用户
    @PostMapping("/modifyUser")
    public String modifyUser(String uid, String userName, String gender, String birthday, String phone, String address, String userRole, HttpServletRequest request) throws ParseException {
        int id = 0;
        try {
            id = Integer.parseInt(uid);
        } catch (Exception e) {
            e.printStackTrace();
        }
        User user = new User();
        user.setUserName(userName);
        user.setGender(Integer.parseInt(gender));
        user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
        user.setPhone(phone);
        user.setAddress(address);
        user.setUserRole(Integer.parseInt(userRole));
        //注意这两个参数不在表单的填写范围内
        user.setModifyBy(((User) request.getSession().getAttribute("userSession")).getId());
        user.setModifyDate(new Date());
        //要插入数据
        boolean flag = userService.modify(id, user);
        //如果执行成功了 到 用户管理页面(即 查询全部用户列表)
        if (flag) {
            return "redirect:/UserManager/toUserManagerPage";
        }
        return "redirect:/UserManager/toModifyUserPage/" + id;
    }

5.4:用户列表 删除用户模块 模块

从底层往上写 dao -> service -> controller

dao层

根据 用户的id 去删除用户
在这里插入图片描述
在这里插入图片描述

service层

在这里插入图片描述
在这里插入图片描述

controller层

**前端页面请求 去往js文件 传入userid **
在这里插入图片描述
我们可以看到这个 ajax 请求 deleteUser/ 传入一个userid
在这里插入图片描述
删除用户模块代码
在这里插入图片描述

5.5:用户列表 添加用户模块

从底层往上写 dao -> service -> controller

dao层

将一整个User类型的对象存进数据库中
在这里插入图片描述
在这里插入图片描述

	<!--用户管理模块中的 子模块 —— 添加用户-->
    <insert id="addUser">
        insert into smbms_user
        (`userCode`,`userName`,`userPassword`,`gender`,`birthday`,`phone`,`address`,`userRole`,`createdBy`,`creationDate`)
        values
        (#{ userCode } , #{ userName } , #{ userPassword } , #{ gender } , #{ birthday } , #{ phone } ,  #{ address } ,  #{ userRole } ,  #{ createdBy } ,  #{ creationDate }  )
    </insert>
service层

在这里插入图片描述
在这里插入图片描述

controller层

**前端页面请求 **
在这里插入图片描述
去往 添加用户信息的页面
在这里插入图片描述
可以看到useradd.jsp 页面收集数据后 发送 添加请求
在这里插入图片描述
最终的添加代码
在这里插入图片描述

@PostMapping("/addUser")
    public String addUser(String userCode, String userName, String userPassword, String gender, String birthday, String phone, String address, String userRole,  HttpServletRequest request) throws ParseException {
        //转换格式后 调用service层 添加用户
        int resGender = 0;
        int resUserRole = 0;
        try {
            resGender = Integer.parseInt(gender);
            resUserRole = Integer.parseInt(userRole);
        } catch (Exception e) {
            e.printStackTrace();
        }
        User user = new User();
        user.setUserCode(userCode);
        user.setUserName(userName);
        user.setUserPassword(userPassword);
        user.setGender(resGender);
        user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
        user.setPhone(phone);
        user.setAddress(address);
        user.setUserRole(resUserRole);
        //注意这两个参数不在表单的填写范围内
        user.setCreatedBy(((User) request.getSession().getAttribute("userSession")).getId());
        user.setCreateDate(new Date());

        boolean flag = userService.addUser(user);
        if (flag) {
            //说明执行成功 到 用户管理页面(即 查询全部用户列表)
            return "redirect:/UserManager/toUserManagerPage";
        } else {
            //说明 添加失败 回到 添加页面
            return "useradd";
        }
    }

5.6:用户列表 用户通用模块

从底层往上写 dao -> service -> controller

	//验证是否存在 此userCode
    @GetMapping(value = "/ifExistUserCode/{uCode}",produces = "application/json;charset=utf-8")
    @ResponseBody
    public String ifExistUserCode(@PathVariable("uCode") String userCode){
        System.out.println("进入ifExistUserCode");
        //根据此 userCode 查询是否有这个用户
        boolean flag = userService.ifExistUserCode(userCode);
        HashMap<String, String> map = new HashMap<>();

        if(userCode==null || userCode.trim().equals("")){
            map.put("userCode","NoWrite");
        }else if(flag){
            map.put("userCode","exist");
        }
        return JSONArray.toJSONString(map);
    }


    //用户管理模块中 子模块(表单中的用户角色下拉框)
    @GetMapping(value = "/getRoleList", produces = "application/json;charset=utf-8")
    @ResponseBody
    public String getRoleList() {
        List<Role> roleList = roleService.getRoleList();
        //JSONArray 阿里巴巴的JSON工具类 用途就是:转换格式
        return JSONArray.toJSONString(roleList);
    }

至此 用户管理模块功能完成

六:供应商管理模块

6.1:供应商信息列表查询 模块

从底层往上写 dao -> service -> controller

dao层

在这里插入图片描述
需要 根据供应商编码 或 供应商名称 查询供应商总数 因为分页会用到

@Repository
public interface ProviderMapper {
    // 根据供应商编码 或 供应商名称 查询供应商总数
    public abstract int getProviderCounts(@Param("proCode") String queryProCode,@Param("proName") String queryProName);
    
    // 根据 供应商编码 和 供应商名称 和 当前页码 页码size 查询供应商数据列表
    public abstract List<Provider> getProviderList(@Param("proCode") String queryProCode,@Param("proName") String queryProName,@Param("currentPageNo") int currentPageNo,@Param("pageSize") int pageSize);![在这里插入图片描述](https://img-blog.csdnimg.cn/39d3fadb60c44b53bfa3115603508fff.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASGFpYmFyYSAtIEFp,size_20,color_FFFFFF,t_70,g_se,x_16)
}

在这里插入图片描述

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--一个mapper对应一个接口-->
<mapper namespace="com.csnz.dao.Provider.ProviderMapper">

<!--根据供应商编码 或 供应商名称 查询供应商总数-->
    <select id="getProviderCounts" resultType="int">
        select count(1) from smbms_provider
        <where>
            <if test="proCode != null and !proCode.trim().equals('')">
                and proCode = #{ proCode }
            </if>
            <if test="proName != null and !proName.trim().equals('')">
                and proName like concat('%', #{ proName } , '%')
            </if>
        </where>
    </select>

<!--根据 供应商编码 和 供应商名称 和 当前页码、页码size 查询供应商数据列表-->
    <select id="getProviderList" resultType="Provider">
        select * from smbms_provider
        <where>
            <if test="proCode != null and !proCode.trim().equals('')">
                and proCode = #{ proCode }
            </if>
            <if test="proName != null and !proName.trim().equals('')">
                and proName like concat('%', #{ proName } , '%')
            </if>
        </where>
        order by creationDate DESC limit #{ currentPageNo }, #{ pageSize }
    </select>
</mapper>
service层

在这里插入图片描述
在这里插入图片描述

import java.util.List;
@Service
public class ProviderServiceImpl implements ProviderService {
    //service层调用dao层
    @Autowired
    private ProviderMapper providerMapper;

//  使用注解模式开发:对应类上加 @Service 和 @Autowired 此时就不用set方法注入了
//    public void setProviderMapper(ProviderMapper providerMapper) {
//        this.providerMapper = providerMapper;
//    }

    @Override
    public int getProviderCounts(String queryProCode, String queryProName) {
        return providerMapper.getProviderCounts(queryProCode,queryProName);
    }

    @Override
    public List<Provider> getProviderList(String queryProCode, String queryProName, int currentPageNo, int pageSize) {
        return providerMapper.getProviderList(queryProCode,queryProName,(currentPageNo-1)*pageSize,pageSize);
    }
 }
controller层

前端请求 跳转至 供应商管理页面 此时不带参数进行查询 也就是全表查询
在这里插入图片描述
在这里插入图片描述

@Controller
@RequestMapping("/Provider")
public class ProviderManagerController {
    @Autowired
    private ProviderService providerService;
    @Autowired
    private PageSupport pageSupport;
    /*
     *************************      查看供应商列表模块   *********************************
     */
    /**
     * @Des 供应商编码、供应商名称、pageIndex
     * @Author zzj
     * @Date 2021/11/8/0008 23:18
     **/
    @GetMapping("/toProviderPage")
    public String toProviderPage(String queryProCode , String queryProName , String pageIndex , HttpServletRequest request){
        //这里需要设置分页参数

        //1、下面是默认要返回的分页信息 还没根据前端传来的做转化
        int pageSize = 5;           // 一页显式的数据量 默认为 5
        int currentPageNo = 1;      // 当前页码
        int totalCount = 0;         // 根据条件查询出来的记录总数量 默认为0
        int totalPageCount = 0;     // 全部数据量 算出 总共显示的页数

        if(pageIndex != null && !pageIndex.trim().equals("")){
            try {
                currentPageNo = Integer.parseInt(pageIndex);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        // 根据供应商编码 或 供应商名称 查询供应商总数
        totalCount = providerService.getProviderCounts(queryProCode,queryProName);

        //4、设置pageSupport的参数
        pageSupport.setPageSize(pageSize);              // 设置 页面容量
        pageSupport.setTotalCount(totalCount);          // 设置 总数量(表)
        pageSupport.setCurrentPageNo(currentPageNo);    // 设置 当前页码 来自于用户输入
        //总共显示的页数
        totalPageCount = pageSupport.getTotalPageCount();

        //5、如果页数小于1,就显示第一页  页数大于 最后一页就 显示最后一页
        if(currentPageNo<1){
            currentPageNo =1;
        }else if(currentPageNo>totalPageCount){
            currentPageNo = totalPageCount;
        }


        //6、根据条件 查询供应商列表
        List<Provider> providerList = providerService.getProviderList(queryProCode, queryProName, currentPageNo, pageSize);
        //将信息返回至前端页面
        request.setAttribute("providerList",providerList);

        //潮汕奴仔_优化: 这里加一步 判断此 列表是否为空 是则 清零页码信息 并返回
        if(providerList.size() == 0){
            System.out.println("\n潮汕奴仔_优化\n");
            request.setAttribute("queryProCode",queryProCode);
            request.setAttribute("queryProName",queryProName);
            request.setAttribute("totalPageCount",0);
            request.setAttribute("totalCount",0);
            request.setAttribute("currentPageNo",0);
            return "providerlist";
        }

        //8、将所有信息返回至前端展示
        request.setAttribute("queryProCode",queryProCode);
        request.setAttribute("queryProName",queryProName);

        request.setAttribute("totalPageCount",totalPageCount);
        request.setAttribute("totalCount",totalCount);
        request.setAttribute("currentPageNo",currentPageNo);

        return "providerlist";
    }
}

6.2:新添供应商模块

从底层往上写 dao -> service -> controller

dao层

将一个Provider类型的对象存入数据库
在这里插入图片描述
在这里插入图片描述

service层

在这里插入图片描述
在这里插入图片描述

controller层

看一下 前端请求 跳转至 添加供应商页面 进行信息填写
在这里插入图片描述
请求控制层跳转
在这里插入图片描述
provideradd.jsp页面收集信息 并发送请求进行提交
在这里插入图片描述
最终的供应商添加代码
在这里插入图片描述

6.3:查看供应商信息模块

从底层往上写 dao -> service -> controller

dao层

根据id 查询供应商信息
在这里插入图片描述
在这里插入图片描述

service层

在这里插入图片描述
在这里插入图片描述

controller层

先看看前端的请求 发现走的 js 并且带了providerId

在这里插入图片描述
在这里插入图片描述
请求地址 去往 供应商查看页面
在这里插入图片描述

6.4:修改供应商信息模块

从底层往上写 dao -> service -> controller

dao层

根据供应商 id 和 供应商对象 对 指定id的供应商进行修改
在这里插入图片描述
在这里插入图片描述

service层

在这里插入图片描述

在这里插入图片描述

controller层

先看看前端的请求 发现走的 js 并且带了providerId

在这里插入图片描述
在这里插入图片描述
发现这个请求 去到修改供应商的页面 它会根据此供应商id 先查询 供应商原有的信息 进行展示
在这里插入图片描述
去到这个页面后 搜集数据 并发送修改请求

在这里插入图片描述
最终的供应商修改代码
在这里插入图片描述

6.5:删除供应商模块

从底层往上写 dao -> service -> controller

dao层

根据供应商id 删除指定的供应商
在这里插入图片描述
在这里插入图片描述

service层

在这里插入图片描述
在这里插入图片描述

controller层

先看看前端的请求 发现走的 js 并且带了providerId
在这里插入图片描述
我们可以看看 ajax 的请求
在这里插入图片描述
最终的删除指定供应商 的代码
在这里插入图片描述

至此 供应商模块功能完成

七:订单管理模块

7.1:订单查询列表 模块

从底层往上写 dao -> service -> controller

dao层

需要 根据商品名称、供应商id、是否付款 查询订单总数 因为分页需要
在这里插入图片描述

@Repository
public interface BillMapper {
    // 根据商品名称、供应商id、是否付款 查询订单总数
    public abstract int getBillCount(@Param("productName") String queryProductName,@Param("providerId") int queryProviderId,@Param("isPayment") int queryIsPayment);
    // 根据商品名称、供应商id、是否付款 查询订单列表
    public abstract List<Bill> getBillList(@Param("productName") String queryProductName,@Param("providerId")int queryProviderId,@Param("isPayment")int queryIsPayment,@Param("currentPageNo") int currentPageNo,@Param("pageSize") int pageSize);
}

在这里插入图片描述

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--一个mapper对应一个接口-->
<mapper namespace="com.csnz.dao.Bill.BillMapper">
    <!--根据商品名称、供应商id、是否付款 查询订单总数-->
    <select id="getBillCount" resultType="int">
        select count(1) from smbms_bill b , smbms_provider p
        <where>
            b.providerId = p.id
            <if test= "productName != null and !productName.trim().equals('')">
                and b.productName like concat('%', #{ productName},'%')
            </if>
            <if test= "providerId != 0">
                and b.providerId = #{ providerId }
            </if>
            <if test= "isPayment != 0">
                and b.isPayment = #{ isPayment }
            </if>
        </where>
    </select>
    <!--根据商品名称、供应商id、是否付款、当前页码、总页数 查询订单列表-->
    <select id = "getBillList" resultType="Bill">
        select b.* , p.proName as providerName from smbms_bill b,smbms_provider p
        <where>
            b.providerId = p.id
            <if test= "productName != null and !productName.trim().equals('')">
                and b.productName like concat('%', #{ productName} , '%')
            </if>
            <if test= "providerId != 0">
                and b.providerId = #{ providerId }
            </if>
            <if test= "isPayment != 0">
                and b.isPayment = #{ isPayment }
            </if>
        </where>
        order by b.creationDate desc limit #{ currentPageNo } , #{ pageSize }
    </select>
</mapper>
service层

在这里插入图片描述

public interface BillService {
    //根据商品名称、供应商id、是否付款 查询订单总数
    public abstract int getBillCount(String queryProductName,int queryProviderId,int queryIsPayment);

    //根据商品名称、供应商id、是否付款 查询订单列表
    public abstract List<Bill> getBillList(String queryProductName, int queryProviderId, int queryIsPayment, int currentPageNo, int pageSize);
}

在这里插入图片描述

@Service
public class BillServiceImpl implements BillService {
    //service层调用dao层
    @Autowired
    private BillMapper billMapper;

    //  使用注解模式开发:对应类上加 @Service 和 @Autowired 此时就不用set方法注入了
//    public void setBillMapper(BillMapper billMapper) {
//        this.billMapper = billMapper;
//    }

    @Override
    public int getBillCount(String queryProductName, int queryProviderId, int queryIsPayment) {
        return billMapper.getBillCount(queryProductName,queryProviderId,queryIsPayment);
    }

    @Override
    public List<Bill> getBillList(String queryProductName, int queryProviderId, int queryIsPayment, int currentPageNo, int pageSize) {
        return billMapper.getBillList(queryProductName,queryProviderId,queryIsPayment,(currentPageNo-1)*pageSize,pageSize);
    }
}
controller层

前端页面请求 去往订单管理页面 此时不带参数 进行全表查询
在这里插入图片描述
在这里插入图片描述

 //进入订单管理页面
    @GetMapping("/toBillManagerPage")
    public String toBillManagerPage(String queryProductName, String queryProviderId, String queryIsPayment,String pageIndex, HttpServletRequest request){
        //这里需要设置分页参数

        //1、下面是默认要返回的分页信息 还没根据前端传来的做转化
        int     resProviderId       =  0;
        int      resIsPayment       =  0;

        int pageSize = 5;           // 一页显式的数据量 默认为 5
        int currentPageNo = 1;      // 当前页码
        int totalCount = 0;         // 根据条件查询出来的记录总数量 默认为0
        int totalPageCount = 0;     // 全部数据量 算出 总共显示的页数

        //2、根据前端传来的信息做转化 替换默认分页信息
        if(queryProductName == null){
            queryProductName = "";
        }
        if(queryProviderId != null && !queryProviderId.trim().equals("")){
            try {
                resProviderId = Integer.parseInt(queryProviderId);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        if(queryIsPayment != null && !queryIsPayment.trim().equals("")){
            try {
                resIsPayment = Integer.parseInt(queryIsPayment);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        if(pageIndex != null && !pageIndex.trim().equals("")){
            try {
                currentPageNo = Integer.parseInt(pageIndex);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        //3、根据商品名称、供应商id、是否付款 查询订单总数
        totalCount = billService.getBillCount(queryProductName, resProviderId, resIsPayment);
        //4、设置pageSupport的参数
        pageSupport.setPageSize(pageSize);              // 设置 页面容量
        pageSupport.setTotalCount(totalCount);          // 设置 总数量(表)
        pageSupport.setCurrentPageNo(currentPageNo);    // 设置 当前页码 来自于用户输入
        //总共显示的页数
        totalPageCount = pageSupport.getTotalPageCount();

        //5、如果页数小于1,就显示第一页  页数大于 最后一页就 显示最后一页
        if(currentPageNo<1){
            currentPageNo =1;
        }else if(currentPageNo>totalPageCount){
            currentPageNo = totalPageCount;
        }

        //6、根据条件 查询订单列表
        List<Bill> billList = billService.getBillList(queryProductName, resProviderId, resIsPayment, currentPageNo, pageSize);
        //将信息返回至前端页面
        request.setAttribute("billList",billList);

        //7、查询供应商列表
        int providerCounts = providerService.getProviderCounts("", "");
        List<Provider> providerList = providerService.getProviderList("", "", 1, providerCounts);
        //将信息返回至前端页面
        request.setAttribute("providerList",providerList);

        //潮汕奴仔_优化: 这里加一步 判断此 列表是否为空 是则 清零页码信息 并返回
        if(billList.size() == 0){
            System.out.println("\n潮汕奴仔_优化\n");
            request.setAttribute("queryProductName",queryProductName);
            request.setAttribute("queryProviderId",queryProviderId);
            request.setAttribute("queryIsPayment",queryIsPayment);
            request.setAttribute("totalPageCount",0);
            request.setAttribute("totalCount",0);
            request.setAttribute("currentPageNo",0);
            return "billlist";
        }

        //8、将所有信息返回至前端展示
        request.setAttribute("queryProductName",queryProductName);
        request.setAttribute("queryProviderId",queryProviderId);
        request.setAttribute("queryIsPayment",queryIsPayment);

        request.setAttribute("totalPageCount",totalPageCount);
        request.setAttribute("totalCount",totalCount);
        request.setAttribute("currentPageNo",currentPageNo);
        return "billlist";
    }

然后跳转到 billlist页面 同时 billlist页面的搜索请求也是一样的 只是这个请求可以带参数进行具体查询
在这里插入图片描述

7.2:新添订单模块

从底层往上写 dao -> service -> controller

dao层

将一个Bill 类型的对象存入数据库
在这里插入图片描述
在这里插入图片描述

 <!--新添订单-->
    <insert id="addBill">
        insert into smbms_bill
        (`billCode`,`productName`,`productDesc`,`productUnit`,`productCount`,`totalPrice`,`isPayment`,`createdBy`,`creationDate`,`providerId`)
        values
        ( #{ bill.billCode } ,  #{ bill.productName } ,  #{ bill.productDesc } ,  #{ bill.productUnit } ,  #{ bill.productCount } ,  #{ bill.totalPrice } ,  #{ bill.isPayment } ,  #{ bill.createdBy } ,  #{ bill.creationDate } ,  #{ bill.providerId })
    </insert>
service层

在这里插入图片描述
在这里插入图片描述

controller层

前端页面请求 先跳转至 添加订单页面 进行信息的填报
在这里插入图片描述
在这里插入图片描述
跳转到新添订单页面
在这里插入图片描述
收集信息后 执行 addBill 请求 完成添加功能
在这里插入图片描述

7.3:查看具体订单信息模块

从底层往上写 dao -> service -> controller

dao层

根据订单id 查询具体订单信息
在这里插入图片描述
在这里插入图片描述

service层

在这里插入图片描述
在这里插入图片描述

controller层

前端页面请求
可以看到页面 调用js 并将 billid 传递进去
在这里插入图片描述
有一个去往订单信息展示页的请求
在这里插入图片描述
在这里插入图片描述
查询信息后 跳转到 订单信息查看页面 进行展示

7.4:修改订单模块

从底层往上写 dao -> service -> controller

dao层

根据 订单id 和 订单类型的对象 对指定id 的订单进行修改
在这里插入图片描述
在这里插入图片描述

<!--修改 订单信息-->
<update id="updateBill">
    update smbms_bill set `billCode` = #{ bill.billCode }, `productName` = #{ bill.productName},`productDesc` = #{ bill.productDesc},`productUnit` = #{ bill.productUnit},`productCount` = #{ bill.productCount },`totalPrice` = #{ bill.totalPrice },`isPayment` = #{ bill.isPayment},`modifyBy` = #{ bill.modifyBy },`modifyDate` = #{ bill.modifyDate} where id = #{ billId }
</update>
service层

在这里插入图片描述
在这里插入图片描述

controller层

前端页面请求 携带订单id
在这里插入图片描述
在这里插入图片描述
去往 订单修改页面(顺带查询指定id订单信息)
在这里插入图片描述
在这里插入图片描述
收集信息后 跳转至修改请求 进行订单修改
在这里插入图片描述

	 //修改订单信息
    @PostMapping("/modifyBill")
    public String modifyBill(String billid ,Bill bill,HttpServletRequest request){
        int id = Integer.parseInt(billid);
        bill.setModifyBy(((User)request.getSession().getAttribute("userSession")).getId());
        bill.setModifyDate(new Date());

        boolean flag = billService.updateBill(id, bill);
        if (flag) {
            return "redirect:/Bill/toBillManagerPage";
        }else{
            return "billmodify";
        }
    }

7.5:删除订单模块

从底层往上写 dao -> service -> controller

dao层

根据订单id 对指定订单进行删除操作
在这里插入图片描述
在这里插入图片描述

service层

在这里插入图片描述
在这里插入图片描述

controller层

前端页面请求 携带订单id 进行删除
在这里插入图片描述
可以看到页面 调用js 并将 billid 传递进去
在这里插入图片描述
最终删除指定订单的代码
在这里插入图片描述

至此 订单管理模块 功能完成

八:角色管理模块

获取用户角色列表

从底层往上写 dao -> service -> controller

dao层

在这里插入图片描述

/*
@Repository作用:把资源让Spring来管理,相当于在xml中配置了一个bean
value属性指定bean的id,如果不指定,默认id为当前类的类名(首字母小写) roleMapper
 */
@Repository
public interface RoleMapper {
    // 获取用户角色列表
    public abstract List<Role> getRoleList();
}

在这里插入图片描述

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--    一个mapper对应一个接口  -->
<mapper namespace="com.csnz.dao.Role.RoleMapper">

<!--获取用户角色列表-->
    <select id="getRoleList" resultType="Role">
        select * from smbms_role
    </select>
</mapper>
service层

在这里插入图片描述

public interface RoleService {
    // 获取用户角色列表
    public abstract List<Role> getRoleList();
}

在这里插入图片描述

@Service
public class RoleServiceImpl implements RoleService {
    //业务层调用dao层
    @Autowired
    private RoleMapper roleMapper;

//  使用注解模式开发:对应类上加 @Service 和 @Autowired 此时就不用set方法注入了
//    public void setRoleMapper(RoleMapper roleMapper) {
//        this.roleMapper = roleMapper;
//    }

    @Override
    public List<Role> getRoleList() {
        return roleMapper.getRoleList();
    }
}
它在用户管理模块就用到了

在这里插入图片描述

至此 项目整体搭建完毕 这不赶紧启动玩它一波?

项目整体结构:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值