smbms(超市管理系统)源码 + 分析

2023-11-12

在项目开始之前,我们首先要对项目的整体架构分析一下,该项目一共分为四个模块,登录注销、用户管理、订单管理、供应商管理,其中用户管理、订单管理以及供应商管理都是需要对数据库进行crud的。项目的整体架构图如下:

1.前期准备

1.项目架构

2.Maven配置

项目的架构分析完成之后,我们首先就需要进行一些前期准备,创建项目。首先创建一个Maven项目:

img

在Maven项目创建完毕之后,我们需要对配置文件进行修改

对web.xml的修改如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
</web-app>

对pom.xml进行配置,导入相关的依赖如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>smbms</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>10.0.16</version>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.79</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jsp-api</artifactId>
            <version>10.0.16</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
            <version>2.0.0</version>
        </dependency>


  </dependencies>
</project>

3.Tomcat配置

将Maven配置完成后,我们需要对Tomcat进行配置:

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

Tomcat配置完成之后,我们需要连接数据库

4.连接数据库

5.编写实体类

实体类中的四个类是与数据库当中的四个表相对应的。


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;
    }
}



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;
    }


}


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 long 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;
    }


}


public class User {
    private Integer id;     //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 creationDate;  //创建时间
    private Integer modifyBy;   //更新者
    private Date modifyDate;    //更新时间

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

    public Integer getAge(){
        Date date = new Date();
        Integer age = date.getYear() - birthday.getYear();
        return age;
    }


    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 setBirthday(Date birthday) {
        this.birthday = 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 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;
    }


    public void setAge(Integer age) {
        this.age = age;
    }

    public String getUserRoleName() {
        return userRoleName;
    }

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

    public User(){

    }

    public void setUserName(Object userName) {
    }
}

6.编写公共类

因为我们每一个模块都会涉及到对数据库的crud,以及对数据库的资源的连接和关闭。是一个有着大量重复性的操作,所以我们需要编写一个公共类来实现这些操作,这样在编写每一个模块的时候就可以直接调用。


public class BaseDao {
    private static String url;
    private static String driver;
    private static String username;
    private static String password;
	//静态代码块,类加载的时候就初始化了
    static {
        //通过类加载器读取响应的资源
        Properties properties = new Properties();
        InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("database.properties");

        try {
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        url = properties.getProperty("url");
        driver = properties.getProperty("driver");
        username = properties.getProperty("username");
        password = properties.getProperty("password");
    }
    //获得数据库的链接
    public static Connection getConnection() {
        Connection connection = null;
        try {
            Class.forName(driver);
            connection = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }
    
    //执行sql查询语句
    public static ResultSet execute(Connection connection, String sql, Object[] params, ResultSet resultSet, PreparedStatement preparedStatement) throws SQLException {
        preparedStatement = connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i + 1, params[i]);
        }
        resultSet = preparedStatement.executeQuery();
        return resultSet;
    }


    //对数据库进行crud
    public static int execute(Connection connection, String sql, Object[] params, PreparedStatement preparedStatement) throws SQLException {
        preparedStatement = connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i + 1, params[i]);
        }
        int updateRows = preparedStatement.executeUpdate();
        System.out.println(updateRows);
        return updateRows;
    }

    //关闭数据库资源
    public static boolean close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
        boolean flag = true;
        if (resultSet != null) {
            try {
                resultSet.close();
                resultSet = null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
                preparedStatement = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
                connection = null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        return flag;
    }
}

xmldriver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=123456

7.编写字符编码过滤器


public class CharacterEncodingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");

        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {
    }
}

编写了过滤器之后,我们还需要到web.xml中去注册才能实现过滤功能

<!--过滤器-->
<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.zhou.filter.CharacterEncodingFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

8.导入静态资源

关于前期的工作我们已经完成,我们现在就需要分析每一个模块了

2.登录注销

分析可以得知,我们进入登录界面之后,会通过login.do来判断是否登录成功,在我们发起登录请求的时候,就会将请求转发到后台,然后后台去查看数据库,将账号和密码进行判断,如果登录成功就会跳转到后台首页,否则依然停留在登录页面,并提示用户账号或密码错误

1.设置默认首页

在导入静态资源后,有一个login.jsp文件,毫无疑问就是我们的登录页面了,我们需要做的是在服务器启动的时候默认访问该文件,那么我们就应该在配置文件中修改首页。

我们在web.xml文件下加入下列代码就能使服务器启动的时候默认访问login.jsp


<welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
</welcome-file-list>

2.实现用户的登录

登录页面解决了,我们现在需要解决的就是首先就是账号和密码验证的问题了,由于浏览器发送请求给web端之后,web服务器会调用servlet来接受这个请求,所以我们就需要通过servlet来接受请求,处理完请求之后再反馈给浏览器。

因此我们需要一个底层来操作数据库(Dao),一层业务层来进行数据库数据和请求数据的比对来进行判断,判断完成后在返回给servlet.因此我们要实现三层的代码;

首先我们先对数据库进行操作,也就是dao层,在我们获得了数据库的数据后以及后台接受的数据,我们要进行比对,就在业务层完成。完成后我们我们将得到的用户返回给servlet层,如果该用户不为空,则证明登录成功,否则登录失败。并将结果反馈给浏览器。

2.1 user.dao层实现

public User getLoginUser(Connection connection,String userCode,String password) throws SQLException;
    @Override
    public User getLoginUser(Connection connection, String userCode, String password) throws SQLException {
        ResultSet rs = null;
        User user = null;
        PreparedStatement pstm = null;
        if(connection != null){
            String sql = "select * from smbms_user where userCode = ? and userPassword = ?";
            Object[] params = {userCode,password};

            rs = BaseDao.execute(connection,sql,params,rs,pstm);
            if (rs.next()) {
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUserCode(rs.getString("userCode"));
                user.setUserName(rs.getString("userName"));
                user.setUserPassword(rs.getString("userPassword"));
                user.setGender(rs.getInt("gender"));
                user.setBirthday(rs.getTimestamp("birthday"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                user.setUserRole(rs.getInt("userRole"));
                user.setCreatedBy(rs.getInt("createdBy"));
                user.setCreationDate(rs.getTimestamp("creationDate"));
                user.setModifyBy(rs.getInt("modifyBy"));
                user.setModifyDate(rs.getTimestamp("modifyDate"));
            }
            BaseDao.close(connection,pstm,rs);
        }
        return user;
    }

2.2 user.service层实现

public User getLoginUser(String userCode, String password);
 public User getLoginUser(String userCode, String password) {
        Connection connection = null;
        User user = null;
        try {
            //获取与数据库的连接
            connection = BaseDao.getConnection();
            //获取用户
            user = userdao.getLoginUser(connection,userCode,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            //关闭连接
            BaseDao.close(connection,null,null);
        }
        return user;
    }

2.3 user.servlet层实现

public class LoginServlet extends HttpServlet {
    //Servlet:控制层,调用业务层代码
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("LoginServlet start...");
        //获取用户名和密码
        String userCode = req.getParameter("userCode");
        String userPassword = req.getParameter("userPassword");
        //和数据库中的密码进行比对,调用业务层
        UserServiceImp userService = new UserServiceImp();
        User user = userService.getLoginUser(userCode, userPassword);      //这里已经把登录的人查出来了
        if(user != null){//如果词人存在,可以登录
            //将用户的信息放入Session中
            req.getSession().setAttribute(USER_SESSION,user);
            //跳转到主页
            resp.sendRedirect("/jsp/frame.jsp");
        }else{//查无此人,无法登陆
            //转发回登录界面,顺带提示,用户名和密码错误
            req.setAttribute("error","用户名或密码不正确");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);

        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2.4实现servlet映射

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.zhou.servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login.do</url-pattern>
</servlet-mapping>

3.实现用户注销

注销我们在接受请求后,重定向到登录界面即可。为了防止没有登录直接输入链接进入后台界面,我们同样需要一个过滤器来阻挡这些请求.

3.1过滤器实现


public class SysFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);
        //用户信息已经被移除或者注销,或者未登录
        if(user == null){
            resp.sendRedirect("error.jsp");
        }else{

            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    @Override
    public void destroy() {
    }
}

配置文件

<filter>
    <filter-name>SysFilter</filter-name>
    <filter-class>com.zhou.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SysFilter</filter-name>
    <url-pattern>/jsp/*</url-pattern>
</filter-mapping>

3.2 user.servlet层实现

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //移除用户的Session
        req.getSession().removeAttribute(Constants.USER_SESSION);
        resp.sendRedirect(req.getContextPath() + "/login.jsp");//返回登录界面
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3.3 servlet映射


<servlet>
    <servlet-name>LogoutServlet</servlet-name>
    <servlet-class>com.zhou.servlet.user.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/jsp/logout.do</url-pattern>
</servlet-mapping>

3.用户管理

用户列表显示

通过查看fram.jsp可以发现我们如果进入用户管理,就会链接到query方法

我们通过查看所有的user相关的jsp文件就会发现query指向的是userlist.jsp的界面

通过查看我们可以知道要显示如下信息:

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

因此我们首先需要获得RoleList也就是角色列表,通过下面一张图片我们可以判断出来queryUserName 和RoleList都是查询的条件,我们需要点击按钮来进行查询,所以我们需要在底层首先写一个获得角色列表的类,在用户点击查询按钮之后,我们还要获得queryUserName,并且根据这两个属性去进行查询。
在这里插入图片描述

在这张图片中我们可以看到页面所显示的还有关于页码以及页数的信息,所以我们所做出来的查询需要将页数相关的信息也传到前端去

在这里插入图片描述

工具类

package com.zhou.util;


public class PageSupport {

    //当前页码-来自于用户输入
    private int currentPageNo = 1;

    //总数量(表)
    private int totalCount = 0;

    //页面容量
    private int pageSize = 0;

    //总页数-totalCount/pageSize(+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;
        }
    }

}

dao层实现

public List<User> getUserList(Connection connection,String username,int userRole,int currentPageNo,int pageSize) throws SQLException;
public int getUserNums(Connection connection,String username,int userRole) throws SQLException;
public List<User> getUserList(Connection connection, String username, int userRole,int currentPageNo,int pageSize) throws SQLException {
    PreparedStatement pstm = null;
    ResultSet rs = null;
    List<User> userList = new ArrayList<>();
    if(connection != null){
        StringBuffer sql = new StringBuffer();
        List<Object> list = new ArrayList<>();
        sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");
        if(!StringUtils.isNullOrEmpty(username)){
            sql.append(" and u.username like ?");
            list.add("%" + username + "%");
        }
        if(userRole > 0){
            sql.append(" and u.userRole = ?");
            list.add(userRole);
        }


        //对数据进行分组,按照创建日期进行排序
        sql.append(" order by creationDate DESC limit ?,?");
        list.add((currentPageNo - 1) * pageSize);
        list.add(pageSize);

        Object[] objects = list.toArray();

        rs = BaseDao.execute(connection,sql.toString(),objects,rs,pstm);
        while(rs.next()){
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setUserCode(rs.getString("userCode"));
            user.setUserName(rs.getString("userName"));
            user.setUserPassword(rs.getString("userPassword"));
            user.setGender(rs.getInt("gender"));
            user.setBirthday(rs.getTimestamp("birthday"));
            user.setPhone(rs.getString("phone"));
            user.setAddress(rs.getString("address"));
            user.setUserRole(rs.getInt("userRole"));
            user.setCreatedBy(rs.getInt("createdBy"));
            user.setCreationDate(rs.getTimestamp("creationDate"));
            user.setModifyBy(rs.getInt("modifyBy"));
            user.setModifyDate(rs.getTimestamp("modifyDate"));
            userList.add(user);
        }
        BaseDao.close(connection,pstm,rs);
    }
    return userList;
}
public int getUserNums(Connection connection, String username, int userRole) throws SQLException {
    PreparedStatement pstm = null;
    ResultSet rs = null;
    int count = 0;
    if(connection != null){
        StringBuffer sql = new StringBuffer();
        List<Object> list = new ArrayList<>();
        sql.append("select count(1) as count from smbms_user u ,smbms_role r where userRole = r.id");
        if(!StringUtils.isNullOrEmpty(username)){
            sql.append(" and u.username like ?");
            list.add("%" + username + "%");
        }
        if(userRole > 0){
            sql.append(" and u.userRole = ?");
            list.add(userRole);
        }
        Object[] objects = list.toArray();
        rs = BaseDao.execute(connection,sql.toString(),objects,rs,pstm);
        if(rs.next()){
            count = rs.getInt("count");     //sql已经把字段名重命名为count
        }
        BaseDao.close(connection,pstm,null);
    }
    return count;
}


service层实现

public List<User> getUserList(String username,int userRole,int currentPageNo,int pageSize);
public int getUserNums(String username,int userRole);
public List<User> getUserList(String username, int userRole, int currentPageNo, int pageSize) {
    Connection connection = null;
    List<User> userList = null;
    connection = BaseDao.getConnection();
    if(connection != null){
        try {
            userList = userdao.getUserList(connection,username,userRole,currentPageNo,pageSize);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);
        }
    }
    return userList;
}

public int getUserNums(String username, int userRole) {
    Connection connection = null;
    int count = 0;
    connection = BaseDao.getConnection();
    if(connection != null){
        try {
            count = userdao.getUserNums(connection,username,userRole);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);
        }
    }
    return count;
}

servlet层实现

public void getRoleList(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        List<Role> roleList = null;
        RoleServiceImpl roleService = new RoleServiceImpl();
        roleList = roleService.getRoleList();
        //把RoleList转换成json对象输出
        resp.setContentType("application/json");
        PrintWriter writer = resp.getWriter();
        writer.write(JSONArray.toJSONString(roleList));
        writer.flush();
        writer.close();
    }
public void query(HttpServletRequest req, HttpServletResponse resp){
    //从前端获取数据
    String queryUserName = req.getParameter("queryUserName");
    String temp = req.getParameter("queryUserRole");
    String pageIndex = req.getParameter("pageIndex");
    int queryUserRole = 0;

    //获取用户列表
    UserServiceImp userServiceImp = new UserServiceImp();

    //第一次走请求肯定是第一页,页面大小固定
    int pageSize = 5;   //可以把属性写到配置文件当中,方便修改
    int currentPageNo = 1;

    if(queryUserName == null){
        queryUserName = "";
    }
    if(temp != null && !temp.equals("")){
        queryUserRole = Integer.parseInt(temp);     //给查询赋值1,2,3
    }
    if(pageIndex != null){
        currentPageNo = Integer.parseInt(pageIndex);
    }

    //获取用户的总数
    int totalCount = userServiceImp.getUserNums(queryUserName,queryUserRole);
    //总页数
    PageSupport pageSupport = new PageSupport();
    pageSupport.setCurrentPageNo(currentPageNo);        //设置当前页数
    pageSupport.setPageSize(pageSize);                  //设置页数记录数
    pageSupport.setTotalCount(totalCount);              //设置所有记录数目

    int totalPageCount = ((int) (totalCount / pageSize)) + 1;
    //控制尾页和首页
    if(currentPageNo < 1){
        currentPageNo = 1;
    }else if (currentPageNo > totalPageCount){    //控制尾页
        currentPageNo = totalPageCount;
    }

    //获取用户列表显示
    List<User> userList = userServiceImp.getUserList(queryUserName,queryUserRole,currentPageNo,pageSize);
    req.setAttribute("userList",userList);

    RoleServiceImpl roleService = new RoleServiceImpl();
    List<Role> roleList = roleService.getRoleList();
    req.setAttribute("roleList",roleList);
    req.setAttribute("totalCount",totalCount);
    req.setAttribute("currentPageNo",currentPageNo);
    req.setAttribute("queryUserName",queryUserName);
    req.setAttribute("queryUserRole",queryUserRole);
    req.setAttribute("totalPageCount",totalPageCount);
    //返回前端
    try {
        req.getRequestDispatcher("userlist.jsp").forward(req,resp);
    } catch (ServletException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

效果

添加用户

分析

我们将图中的信息取出来进行添加即可

在useradd的js代码中我们可以看到此处使用ajax对填写usercode的时候已经在判定是否存在,所以我们还需要对用户的编码进行判定是否已经存在该用户

dao层

public boolean add(Connection connection,User user) throws SQLException;
public boolean add(Connection connection,User user) throws SQLException {
    boolean flag = false;
    PreparedStatement pstm = null;
    int execute = 0;
    if(connection != null){
        System.out.println("add start");
        String sql = "insert into smbms_user(userCode,userName,userPassword,gender,birthday,phone,address,userRole,creationDate,createdBy) " +
            "values(?,?,?,?,?,?,?,?,?,?)";
        System.out.println("1.1");
        Object[] params = {user.getUserCode(),user.getUserName(),user.getUserPassword(),user.getGender(),
                           user.getBirthday(), user.getPhone(),user.getAddress(),user.getUserRole(),user.getCreationDate(),user.getCreatedBy()};
        System.out.println(1.2);
        execute = BaseDao.execute(connection,sql,params,pstm);
        System.out.println(execute);
        if(execute > 0){
            flag = true;
        }
    }
    BaseDao.close(connection,pstm,null);
    System.out.println("Dao层: " + flag);
    return flag;
}

service层

 public boolean add(User user);

public boolean add(User user) {
    boolean flag = false;
    Connection connection = null;
    try {

        connection = BaseDao.getConnection();
        //开启jdbc的事务管理,同时设置自动提交为false
        System.out.println("1");
        connection.setAutoCommit(false);
        System.out.println("2");
        flag = userdao.add(connection,user);
        System.out.println("3");
        connection.commit();
        System.out.println("4");
        if(flag){
            System.out.println("add success!");
        }else{
            System.out.println("add failed!");
        }
    } catch (SQLException e) {
        System.out.println("rollback------------");
        try {
            connection.rollback();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        e.printStackTrace();
    } finally {
        BaseDao.close(connection,null,null);
    }
    return flag;
}

servlet层

public void add(HttpServletRequest req, HttpServletResponse resp){
    String userCode = req.getParameter("userCode");
    String userName = req.getParameter("userName");
    String userPassword = req.getParameter("userPassword");
    String gender = req.getParameter("gender");
    String birthday = req.getParameter("birthday");
    String userRole = req.getParameter("userRole");
    String address = req.getParameter("address");
    String phone = req.getParameter("phone");

    boolean flag = false;
    User user = new User();
    user.setUserCode(userCode);
    user.setUserName(userName);
    user.setUserPassword(userPassword);
    user.setGender(Integer.parseInt(gender));
    try {
        user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    user.setUserRole(Integer.parseInt(userRole));
    user.setAddress(address);
    user.setPhone(phone);
    user.setCreationDate(new Date());
    user.setCreatedBy(((User)(req.getSession().getAttribute(Constants.USER_SESSION))).getId());

    UserServiceImp userServiceImp = new UserServiceImp();
    flag = userServiceImp.add(user);
    if(flag){
        try {
            resp.sendRedirect(req.getContextPath() + "/jsp/user.do?method=query");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }else{
        try {
            req.getRequestDispatcher("useradd.jsp").forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
public void isUserCodeExist(HttpServletRequest req, HttpServletResponse resp) {
    String userCode = req.getParameter("userCode");
    Map<String,String> resultMap = new HashMap<>();
    if(StringUtils.isNullOrEmpty(userCode)){
        resultMap.put("userCode","exist");
    }else{
        UserService userService = new UserServiceImp();
        User user = userService.getLoginUser(userCode);
        if(user != null){
            resultMap.put("userCode","exist");
        }else{
            resultMap.put("userCode","notexist");
        }
    }
    //将resultMap转换成json对象输出
    resp.setContentType("application/json");
    try {
        PrintWriter writer = resp.getWriter();
        writer.write(JSONArray.toJSONString(resultMap));
        writer.flush();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在这里插入图片描述

删除用户与添加用户同理,获得用户之后进行删除

dao层

public boolean delUser(Connection connection,int id) throws SQLException;
public boolean delUser(Connection connection, int id) throws SQLException {
    boolean flag = false;
    PreparedStatement pstm = null;
    if(connection != null){
        String sql = "delete from smbms_user where id = ?";
        Object[] params = {id};
        int execute = BaseDao.execute(connection, sql, params, pstm);
        if(execute > 0){
            flag = true;
        }
    }
    BaseDao.close(connection,pstm,null);

    return flag;
}

service层

public boolean delUser(int id);
public boolean delUser(int id) {
    boolean flag = false;
    Connection connection = BaseDao.getConnection();
    if(connection != null){
        try {
            flag = userdao.delUser(connection, id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    BaseDao.close(connection,null,null);

    return flag;
}

servlet层

public void delUser(HttpServletRequest req, HttpServletResponse resp){
    String id = req.getParameter("uid");
    int delId;
    if(!StringUtils.isNullOrEmpty(id)){
        delId = Integer.parseInt(id);
    }else{
        delId = 0;
    }
    Map<String,String> resultMap = new HashMap<>();
    if(delId <= 0){
        resultMap.put("delResult","notexist");
    }else {
        UserService userService = new UserServiceImp();
        if(userService.delUser(delId)){
            resultMap.put("delResult","true");
        }else{
            resultMap.put("delResult","false");
        }
    }
    //把resultMap转换成json对象输出
    resp.setContentType("application/json");
    PrintWriter writer = null;
    try {
        writer = resp.getWriter();
        writer.write(JSONArray.toJSONString(resultMap));
        writer.flush();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    }

修改用户信息

分析

我们可以看到,一个修改功能实际上需要两个实现,我们不难想到,在我们进入修改界面的时候,我们首先获取的是该用户的已有信息,因此我们会先获取对应的用户,在我们点击确认按钮之后,会调用另一个功能,获取我们所填写的信息。因此我们需要在servlet层编写两个函数

dao层

public boolean modify(Connection connection,User user) throws SQLException;
public boolean modify(Connection connection, User user) throws SQLException {
    boolean flag = false;
    PreparedStatement pstm = null;
    if(connection != null){
        String sql = "update smbms_user as s set s.userName=?,s.gender=?," +
            "s.birthday=?,s.phone=?,s.address=?,s.userRole=? where s.id =? ";
        Object[] params = {user.getUserName(),user.getGender(),user.getBirthday(),user.getPhone(),
                           user.getAddress(),user.getUserRole(),user.getId()};
        int execute = BaseDao.execute(connection, sql, params, pstm);
        if(execute > 0){
            flag = true;
        }
        BaseDao.close(connection,pstm,null);
    }
    return flag;
}

service层

public boolean modify(User user);
public boolean modify(User user) {
    boolean flag = false;
    Connection connection = null;
    if(user != null){
        connection = BaseDao.getConnection();
        try {
            flag = userdao.modify(connection, user);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);
        }
    }
    return flag;
}

servlet层

public void modify(HttpServletRequest req, HttpServletResponse resp){
    String id = req.getParameter("uid");
    String userName = req.getParameter("userName");
    String gender = req.getParameter("gender");
    String birthday = req.getParameter("birthday");
    String phone = req.getParameter("phone");
    String address = req.getParameter("address");
    String userRole = req.getParameter("userRole");

    User user = new User();
    user.setId(Integer.valueOf(id));
    user.setUserName(userName);
    user.setGender(Integer.valueOf(gender));
    try {
        user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    user.setPhone(phone);
    user.setAddress(address);
    user.setUserRole(Integer.valueOf(userRole));
    user.setCreationDate(new Date());
    user.setModifyBy(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId());

    UserService userService = new UserServiceImp();
    if(userService.modify(user)){
        try {
            resp.sendRedirect(req.getContextPath() + "/jsp/user.do?method=query");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }else{
        try {
            req.getRequestDispatcher("usermodify.jsp").forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public void getUserById(HttpServletRequest req, HttpServletResponse resp,String url){
    String  id = req.getParameter("uid");
    if(!StringUtils.isNullOrEmpty(id)){
        UserService userService = new UserServiceImp();
        User user = userService.getUserById(id);
        req.setAttribute("user",user);
        try {
            req.getRequestDispatcher(url).forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

效果

查看

获得该用户信息后跳转到对应界面即可

dao层

public User getUserById(Connection connection,String id) throws SQLException;
@Override
public User getUserById(Connection connection, String id) throws SQLException {
    User user = null;
    PreparedStatement pstm = null;
    ResultSet rs = null;
    if(connection != null && id != null){
        String sql = "select u.*,r.roleName userRoleName from smbms_user u,smbms_role r where u.id = ? ";
        Object[] params = {id};
        rs = BaseDao.execute(connection, sql, params, rs,pstm);
        if(rs.next()){
            user = new User();
            user.setId(rs.getInt("id"));
            user.setUserCode(rs.getString("userCode"));
            user.setUserName(rs.getString("userName"));
            user.setUserPassword(rs.getString("userPassword"));
            user.setGender(rs.getInt("gender"));
            user.setBirthday(rs.getTimestamp("birthday"));
            user.setPhone(rs.getString("phone"));
            user.setAddress(rs.getString("address"));
            user.setUserRole(rs.getInt("userRole"));
            user.setUserRoleName(rs.getString("userRoleName"));
            user.setCreatedBy(rs.getInt("createdBy"));
            user.setCreationDate(rs.getTimestamp("creationDate"));
            user.setModifyBy(rs.getInt("modifyBy"));
            user.setModifyDate(rs.getTimestamp("modifyDate"));
        }
        BaseDao.close(connection,pstm,null);
    }
    return user;
}

service层

public User getUserById(String id);
public User getUserById(String id) {
    User user = null;
    Connection connection = null;
    connection = BaseDao.getConnection();
    if(connection != null){
        try {
            user = userdao.getUserById(connection, id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    BaseDao.close(connection,null,null);
    return user;
}

servlet层

public void getUserById(HttpServletRequest req, HttpServletResponse resp,String url){
    String  id = req.getParameter("uid");
    if(!StringUtils.isNullOrEmpty(id)){
        UserService userService = new UserServiceImp();
        User user = userService.getUserById(id);
        req.setAttribute("user",user);
        try {
            req.getRequestDispatcher(url).forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

修改密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ofRnWyiG-1647172563121)(C:\Users\周畅\AppData\Roaming\Typora\typora-user-images\image-20220313182227017.png)]

修改密码同样也是需要来两个函数来实现

dao层

public boolean updatePwd(Connection connection,int id,String pwd) throws SQLException;
public boolean updatePwd(Connection connection, int id, String pwd) throws SQLException {
    boolean flag = false;
    PreparedStatement pstm = null;
    int execute = 0;
    if (connection != null) {
        String sql = "update smbms_user set userPassword = ? where id = ? ";
        Object[] params = {pwd,id};
        execute = BaseDao.execute(connection, sql, params, pstm);
        if (execute > 0) {
            flag = true;
        }
        BaseDao.close(connection,pstm,null);
    }
    return flag;
}

service层

public boolean updatePwd(int id,String pwd);
public boolean updatePwd(int id, String pwd) {
    Connection connection = null;
    boolean flag = false;
    try {
        connection = BaseDao.getConnection();
        flag = userdao.updatePwd(connection,id,pwd);
    } catch (SQLException e) {
        e.printStackTrace();
    }finally{
        BaseDao.close(connection,null,null);
    }
    return flag;
}

servlet层

public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
    //从Session中拿Id
    Object id = req.getSession().getAttribute(Constants.USER_SESSION);
    String npwd = req.getParameter("newpassword");
    boolean flag = false;
    if(id != null && !StringUtils.isNullOrEmpty(npwd)){
        UserService userService = new UserServiceImp();
        flag = userService.updatePwd(((User)id).getId(), npwd);
        if(flag){
            req.setAttribute("message","密码修改成功,请退出,使用新密码登录");
            //密码修改成功,移除Session
            req.getSession().removeAttribute(Constants.USER_SESSION);
        }else{
            req.setAttribute("message","密码修改失败");
        }
    }else{
        req.setAttribute("message","新密码有问题");
    }
    try {
        req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);
    } catch (ServletException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void pwdModify(HttpServletRequest req, HttpServletResponse resp){
    //从Session里面拿Id
    Object o = req.getSession().getAttribute(Constants.USER_SESSION);
    String oldpassword = req.getParameter("oldpassword");

    Map<String,String> resultMap = new HashMap<>();

    if(o != null){  // Session失效
        resultMap.put("result","sessionerror");
    }if(StringUtils.isNullOrEmpty(oldpassword)){
        resultMap.put("result","error");
    }else{
        String userpassword = ((User)o).getUserPassword();      //获取Session中用户的密码
        if(userpassword.equals(oldpassword)){
            resultMap.put("result","true");
        }else{
            resultMap.put("result","false");
        }
    }

    try {
        resp.setContentType("application/json");
        PrintWriter writer = resp.getWriter();
        writer.write(JSONArray.toJSONString(resultMap));
        writer.flush();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

全部代码

dao

package com.zhou.dao.user;

import com.zhou.polo.User;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public interface UserDao {
    //获得登录用户
    public User getLoginUser(Connection connection, String userCode) throws SQLException;
    //对getLoginUser函数进行重载
    public User getLoginUser(Connection connection,String userCode,String password) throws SQLException;

    //修改用户密码
    public boolean updatePwd(Connection connection,int id,String pwd) throws SQLException;

    //获取用户数量
    public int getUserNums(Connection connection,String username,int userRole) throws SQLException;

    //获取用户集
    public List<User> getUserList(Connection connection,String username,int userRole,int currentPageNo,int pageSize) throws SQLException;

    //添加用户
    public boolean add(Connection connection,User user) throws SQLException;

    //修改用户
    public boolean modify(Connection connection,User user) throws SQLException;

    //获得用户Id
    public User getUserById(Connection connection,String id) throws SQLException;

    //删除用户
    public boolean delUser(Connection connection,int id) throws SQLException;

}

package com.zhou.dao.user;

import com.mysql.cj.util.StringUtils;
import com.zhou.dao.BaseDao;
import com.zhou.polo.User;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImp implements UserDao {
    @Override
    public User getLoginUser(Connection connection, String userCode, String password) throws SQLException {
        ResultSet rs = null;
        User user = null;
        PreparedStatement pstm = null;
        if(connection != null){
            String sql = "select * from smbms_user where userCode = ? and userPassword = ?";
            Object[] params = {userCode,password};

            rs = BaseDao.execute(connection,sql,params,rs,pstm);
            if (rs.next()) {
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUserCode(rs.getString("userCode"));
                user.setUserName(rs.getString("userName"));
                user.setUserPassword(rs.getString("userPassword"));
                user.setGender(rs.getInt("gender"));
                user.setBirthday(rs.getTimestamp("birthday"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                user.setUserRole(rs.getInt("userRole"));
                user.setCreatedBy(rs.getInt("createdBy"));
                user.setCreationDate(rs.getTimestamp("creationDate"));
                user.setModifyBy(rs.getInt("modifyBy"));
                user.setModifyDate(rs.getTimestamp("modifyDate"));
            }
            BaseDao.close(connection,pstm,rs);
        }
        return user;
    }

    public User getLoginUser(Connection connection, String userCode) throws SQLException {
        ResultSet rs = null;
        User user  = null;
        PreparedStatement pstm = null;
        if(connection != null) {
            String sql = "select * from smbms_user where userCode = ?";

            Object[] params = {userCode};

            rs = BaseDao.execute(connection, sql, params, rs, pstm);

            if (rs.next()) {
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUserCode(rs.getString("userCode"));
                user.setUserName(rs.getString("userName"));
                user.setUserPassword(rs.getString("userPassword"));
                user.setGender(rs.getInt("gender"));
                user.setBirthday(rs.getTimestamp("birthday"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                user.setUserRole(rs.getInt("userRole"));
                user.setCreatedBy(rs.getInt("createdBy"));
                user.setCreationDate(rs.getTimestamp("creationDate"));
                user.setModifyBy(rs.getInt("modifyBy"));
                user.setModifyDate(rs.getTimestamp("modifyDate"));
            }
            BaseDao.close(connection,pstm,rs);
        }
        return user;
    }

    public boolean updatePwd(Connection connection, int id, String pwd) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        int execute = 0;
        if (connection != null) {
            String sql = "update smbms_user set userPassword = ? where id = ? ";
            Object[] params = {pwd,id};
            execute = BaseDao.execute(connection, sql, params, pstm);
            if (execute > 0) {
                flag = true;
            }
            BaseDao.close(connection,pstm,null);
        }
        return flag;
    }

    public int getUserNums(Connection connection, String username, int userRole) throws SQLException {
        PreparedStatement pstm = null;
        ResultSet rs = null;
        int count = 0;
        if(connection != null){
            StringBuffer sql = new StringBuffer();
            List<Object> list = new ArrayList<>();
            sql.append("select count(1) as count from smbms_user u ,smbms_role r where userRole = r.id");
            if(!StringUtils.isNullOrEmpty(username)){
                sql.append(" and u.username like ?");
                list.add("%" + username + "%");
            }
            if(userRole > 0){
                sql.append(" and u.userRole = ?");
                list.add(userRole);
            }
            Object[] objects = list.toArray();
            rs = BaseDao.execute(connection,sql.toString(),objects,rs,pstm);
            if(rs.next()){
                count = rs.getInt("count");     //sql已经把字段名重命名为count
            }
            BaseDao.close(connection,pstm,null);
        }
        return count;
    }

    @Override
    public List<User> getUserList(Connection connection, String username, int userRole,int currentPageNo,int pageSize) throws SQLException {
        PreparedStatement pstm = null;
        ResultSet rs = null;
        List<User> userList = new ArrayList<>();
        if(connection != null){
            StringBuffer sql = new StringBuffer();
            List<Object> list = new ArrayList<>();
            sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");
            if(!StringUtils.isNullOrEmpty(username)){
                sql.append(" and u.username like ?");
                list.add("%" + username + "%");
            }
            if(userRole > 0){
                sql.append(" and u.userRole = ?");
                list.add(userRole);
            }


            //对数据进行分组,按照创建日期进行排序
            sql.append(" order by creationDate DESC limit ?,?");
            list.add((currentPageNo - 1) * pageSize);
            list.add(pageSize);

            Object[] objects = list.toArray();

            rs = BaseDao.execute(connection,sql.toString(),objects,rs,pstm);
            while(rs.next()){
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setUserCode(rs.getString("userCode"));
                user.setUserName(rs.getString("userName"));
                user.setUserPassword(rs.getString("userPassword"));
                user.setGender(rs.getInt("gender"));
                user.setBirthday(rs.getTimestamp("birthday"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                user.setUserRole(rs.getInt("userRole"));
                user.setCreatedBy(rs.getInt("createdBy"));
                user.setCreationDate(rs.getTimestamp("creationDate"));
                user.setModifyBy(rs.getInt("modifyBy"));
                user.setModifyDate(rs.getTimestamp("modifyDate"));
                userList.add(user);
            }
            BaseDao.close(connection,pstm,rs);
        }
        return userList;
    }

    @Override
    public boolean add(Connection connection,User user) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        int execute = 0;
        if(connection != null){
            System.out.println("add start");
            String sql = "insert into smbms_user(userCode,userName,userPassword,gender,birthday,phone,address,userRole,creationDate,createdBy) " +
                    "values(?,?,?,?,?,?,?,?,?,?)";
            System.out.println("1.1");
            Object[] params = {user.getUserCode(),user.getUserName(),user.getUserPassword(),user.getGender(),
                    user.getBirthday(), user.getPhone(),user.getAddress(),user.getUserRole(),user.getCreationDate(),user.getCreatedBy()};
            System.out.println(1.2);
            execute = BaseDao.execute(connection,sql,params,pstm);
            System.out.println(execute);
            if(execute > 0){
                flag = true;
            }
        }
        BaseDao.close(connection,pstm,null);
        System.out.println("Dao层: " + flag);
        return flag;
    }

    @Override
    public boolean modify(Connection connection, User user) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        if(connection != null){
            String sql = "update smbms_user as s set s.userName=?,s.gender=?," +
                    "s.birthday=?,s.phone=?,s.address=?,s.userRole=? where s.id =? ";
            Object[] params = {user.getUserName(),user.getGender(),user.getBirthday(),user.getPhone(),
                    user.getAddress(),user.getUserRole(),user.getId()};
            int execute = BaseDao.execute(connection, sql, params, pstm);
            if(execute > 0){
                flag = true;
            }
            BaseDao.close(connection,pstm,null);
        }
        return flag;
    }

    @Override
    public User getUserById(Connection connection, String id) throws SQLException {
        User user = null;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        if(connection != null && id != null){
            String sql = "select u.*,r.roleName userRoleName from smbms_user u,smbms_role r where u.id = ? ";
            Object[] params = {id};
            rs = BaseDao.execute(connection, sql, params, rs,pstm);
            if(rs.next()){
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUserCode(rs.getString("userCode"));
                user.setUserName(rs.getString("userName"));
                user.setUserPassword(rs.getString("userPassword"));
                user.setGender(rs.getInt("gender"));
                user.setBirthday(rs.getTimestamp("birthday"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                user.setUserRole(rs.getInt("userRole"));
                user.setUserRoleName(rs.getString("userRoleName"));
                user.setCreatedBy(rs.getInt("createdBy"));
                user.setCreationDate(rs.getTimestamp("creationDate"));
                user.setModifyBy(rs.getInt("modifyBy"));
                user.setModifyDate(rs.getTimestamp("modifyDate"));
            }
            BaseDao.close(connection,pstm,null);
        }
        return user;
    }

    @Override
    public boolean delUser(Connection connection, int id) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        if(connection != null){
            String sql = "delete from smbms_user where id = ?";
            Object[] params = {id};
            int execute = BaseDao.execute(connection, sql, params, pstm);
            if(execute > 0){
                flag = true;
            }
        }
        BaseDao.close(connection,pstm,null);

        return flag;
    }
}

service层

package com.zhou.service.user;

import com.zhou.polo.User;

import java.util.List;

public interface UserService {
    /**
     * 获取登录用户
     * @param userCode
     * @param password
     * @return
     */
    public User getLoginUser(String userCode, String password);
    /**
     * 获取登录用户(重载)
     * @param userCode
     * @return
     */
    public User getLoginUser(String userCode);

    /**
     * 更新用户密码
     * @param id
     * @param pwd
     * @return
     */
    public boolean updatePwd(int id,String pwd);

    /**获取用户数量
     *
     * @param username
     * @param userRole
     * @return
     */
    public int getUserNums(String username,int userRole);

    /**
     * 根据条件查询用户列表
     * @param username
     * @param userRole
     * @param currentPageNo
     * @param pageSize
     * @return
     */
    public List<User> getUserList(String username,int userRole,int currentPageNo,int pageSize);

    /**
     * 添加用户
     * @param user
     * @return
     */
    public boolean add(User user);

    /**
     * 修改用户信息
     * @param user
     * @return
     */
    public boolean modify(User user);

    /**
     * 通过用户Id获得用户信息
     * @param id
     * @return
     */
    public User getUserById(String id);

    /**
     * 通过用户Id删除用户
     * @param id
     * @return
     */
    public boolean delUser(int id);

}

package com.zhou.service.user;

import com.zhou.dao.BaseDao;
import com.zhou.dao.user.UserDao;
import com.zhou.dao.user.UserDaoImp;
import com.zhou.polo.User;

import java.awt.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class UserServiceImp implements UserService{
    private UserDao userdao;
    public UserServiceImp(){
        userdao = new UserDaoImp();
    }
    public User getLoginUser(String userCode, String password) {
        Connection connection = null;
        User user = null;
        try {
            //获取与数据库的连接
            connection = BaseDao.getConnection();
            //获取用户
            user = userdao.getLoginUser(connection,userCode,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            //关闭连接
            BaseDao.close(connection,null,null);
        }
        return user;
    }

    @Override
    public User getLoginUser(String userCode) {
        Connection connection = null;
        User user = null;
        try {
            //获取与数据库的连接
            connection = BaseDao.getConnection();
            //获取用户
            user = userdao.getLoginUser(connection,userCode);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            //关闭连接
            BaseDao.close(connection,null,null);
        }
        return user;
    }

    public boolean updatePwd(int id, String pwd) {
        Connection connection = null;
        boolean flag = false;
        try {
            connection = BaseDao.getConnection();
            flag = userdao.updatePwd(connection,id,pwd);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);
        }
        return flag;
    }

    @Override
    public int getUserNums(String username, int userRole) {
        Connection connection = null;
        int count = 0;
        connection = BaseDao.getConnection();
        if(connection != null){
            try {
                count = userdao.getUserNums(connection,username,userRole);
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                BaseDao.close(connection,null,null);
            }
        }
        return count;
    }

    @Override
    public List<User> getUserList(String username, int userRole, int currentPageNo, int pageSize) {
        Connection connection = null;
        List<User> userList = null;
        connection = BaseDao.getConnection();
        if(connection != null){
            try {
                userList = userdao.getUserList(connection,username,userRole,currentPageNo,pageSize);
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                BaseDao.close(connection,null,null);
            }
        }
        return userList;
    }

    @Override
    public boolean add(User user) {
        boolean flag = false;
        Connection connection = null;
        try {

            connection = BaseDao.getConnection();
            //开启jdbc的事务管理,同时设置自动提交为false
            System.out.println("1");
            connection.setAutoCommit(false);
            System.out.println("2");
            flag = userdao.add(connection,user);
            System.out.println("3");
            connection.commit();
            System.out.println("4");
            if(flag){
                System.out.println("add success!");
            }else{
                System.out.println("add failed!");
            }
        } catch (SQLException e) {
            System.out.println("rollback------------");
            try {
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            BaseDao.close(connection,null,null);
        }
        return flag;
    }

    @Override
    public boolean modify(User user) {
        boolean flag = false;
        Connection connection = null;
        if(user != null){
            connection = BaseDao.getConnection();
            try {
                flag = userdao.modify(connection, user);
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                BaseDao.close(connection,null,null);
            }
        }
        return flag;
    }

    @Override
    public User getUserById(String id) {
        User user = null;
        Connection connection = null;
        connection = BaseDao.getConnection();
        if(connection != null){
            try {
                user = userdao.getUserById(connection, id);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        BaseDao.close(connection,null,null);
        return user;
    }

    @Override
    public boolean delUser(int id) {
        boolean flag = false;
        Connection connection = BaseDao.getConnection();
        if(connection != null){
            try {
                flag = userdao.delUser(connection, id);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        BaseDao.close(connection,null,null);

        return flag;
    }

}

servlet

package com.zhou.servlet.user;

import com.alibaba.fastjson.JSONArray;
import com.mysql.cj.util.StringUtils;
import com.zhou.polo.Role;
import com.zhou.polo.User;
import com.zhou.service.role.RoleServiceImpl;
import com.zhou.service.user.UserService;
import com.zhou.service.user.UserServiceImp;
import com.zhou.util.Constants;
import com.zhou.util.PageSupport;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;


public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得前端的method信息实现对应的功能
        String method = req.getParameter("method");
        System.out.println("Usermethod --> " + method);
        if(method != null && method.equals("savepwd")){
            this.updatePwd(req,resp);
        }else if(method != null && method.equals("pwdmodify")){
            this.pwdModify(req,resp);
        }else if(method != null && method.equals("query")){
            this.query(req,resp);
        }else if(method != null && method.equals("add")){
            this.add(req,resp);
        }else if(method != null && method.equals("getrolelist")){
            this.getRoleList(req,resp);
        }else if(method != null && method.equals("modifyexe")){
            this.modify(req,resp);
        }else if(method != null && method.equals("modify")){
            this.getUserById(req,resp,"usermodify.jsp");
        }else if(method != null && method.equals("view")){
            this.getUserById(req,resp,"userview.jsp");
        }else if(method != null && method.equals("deluser")){
            this.delUser(req,resp);
        }else if(method != null && method.equals("ucexist")){
            this.isUserCodeExist(req,resp);
        }
    }

    public void isUserCodeExist(HttpServletRequest req, HttpServletResponse resp) {
        String userCode = req.getParameter("userCode");
        Map<String,String> resultMap = new HashMap<>();
        if(StringUtils.isNullOrEmpty(userCode)){
            resultMap.put("userCode","exist");
        }else{
            UserService userService = new UserServiceImp();
            User user = userService.getLoginUser(userCode);
            if(user != null){
                resultMap.put("userCode","exist");
            }else{
                resultMap.put("userCode","notexist");
            }
        }
        //将resultMap转换成json对象输出
        resp.setContentType("application/json");
        try {
            PrintWriter writer = resp.getWriter();
            writer.write(JSONArray.toJSONString(resultMap));
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void delUser(HttpServletRequest req, HttpServletResponse resp){
        String id = req.getParameter("uid");
        int delId;
        if(!StringUtils.isNullOrEmpty(id)){
            delId = Integer.parseInt(id);
        }else{
            delId = 0;
        }
        Map<String,String> resultMap = new HashMap<>();
        if(delId <= 0){
            resultMap.put("delResult","notexist");
        }else {
            UserService userService = new UserServiceImp();
            if(userService.delUser(delId)){
                resultMap.put("delResult","true");
            }else{
                resultMap.put("delResult","false");
            }
        }
        //把resultMap转换成json对象输出
        resp.setContentType("application/json");
        PrintWriter writer = null;
        try {
            writer = resp.getWriter();
            writer.write(JSONArray.toJSONString(resultMap));
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void modify(HttpServletRequest req, HttpServletResponse resp){
        String id = req.getParameter("uid");
        String userName = req.getParameter("userName");
        String gender = req.getParameter("gender");
        String birthday = req.getParameter("birthday");
        String phone = req.getParameter("phone");
        String address = req.getParameter("address");
        String userRole = req.getParameter("userRole");

        User user = new User();
        user.setId(Integer.valueOf(id));
        user.setUserName(userName);
        user.setGender(Integer.valueOf(gender));
        try {
            user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        user.setPhone(phone);
        user.setAddress(address);
        user.setUserRole(Integer.valueOf(userRole));
        user.setCreationDate(new Date());
        user.setModifyBy(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId());

        UserService userService = new UserServiceImp();
        if(userService.modify(user)){
            try {
                resp.sendRedirect(req.getContextPath() + "/jsp/user.do?method=query");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            try {
                req.getRequestDispatcher("usermodify.jsp").forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //获取用户id
    public void getUserById(HttpServletRequest req, HttpServletResponse resp,String url){
        String  id = req.getParameter("uid");
        if(!StringUtils.isNullOrEmpty(id)){
            UserService userService = new UserServiceImp();
            User user = userService.getUserById(id);
            req.setAttribute("user",user);
            try {
                req.getRequestDispatcher(url).forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public void getRoleList(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        List<Role> roleList = null;
        RoleServiceImpl roleService = new RoleServiceImpl();
        roleList = roleService.getRoleList();
        //把RoleList转换成json对象输出
        resp.setContentType("application/json");
        PrintWriter writer = resp.getWriter();
        writer.write(JSONArray.toJSONString(roleList));
        writer.flush();
        writer.close();
    }

    //修改密码
    public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
        //从Session中拿Id
        Object id = req.getSession().getAttribute(Constants.USER_SESSION);
        String npwd = req.getParameter("newpassword");
        boolean flag = false;
        if(id != null && !StringUtils.isNullOrEmpty(npwd)){
            UserService userService = new UserServiceImp();
            flag = userService.updatePwd(((User)id).getId(), npwd);
            if(flag){
                req.setAttribute("message","密码修改成功,请退出,使用新密码登录");
                //密码修改成功,移除Session
                req.getSession().removeAttribute(Constants.USER_SESSION);
            }else{
                req.setAttribute("message","密码修改失败");
            }
        }else{
            req.setAttribute("message","新密码有问题");
        }
        try {
            req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void pwdModify(HttpServletRequest req, HttpServletResponse resp){
        //从Session里面拿Id
        Object o = req.getSession().getAttribute(Constants.USER_SESSION);
        String oldpassword = req.getParameter("oldpassword");

        Map<String,String> resultMap = new HashMap<>();

        if(o != null){  // Session失效
            resultMap.put("result","sessionerror");
        }if(StringUtils.isNullOrEmpty(oldpassword)){
            resultMap.put("result","error");
        }else{
            String userpassword = ((User)o).getUserPassword();      //获取Session中用户的密码
            if(userpassword.equals(oldpassword)){
                resultMap.put("result","true");
            }else{
                resultMap.put("result","false");
            }
        }

        try {
            resp.setContentType("application/json");
            PrintWriter writer = resp.getWriter();
            writer.write(JSONArray.toJSONString(resultMap));
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //查询对应的用户信息
    public void query(HttpServletRequest req, HttpServletResponse resp){
        //从前端获取数据
        String queryUserName = req.getParameter("queryUserName");
        String temp = req.getParameter("queryUserRole");
        String pageIndex = req.getParameter("pageIndex");
        int queryUserRole = 0;

        //获取用户列表
        UserServiceImp userServiceImp = new UserServiceImp();

        //第一次走请求肯定是第一页,页面大小固定
        int pageSize = 5;   //可以把属性写到配置文件当中,方便修改
        int currentPageNo = 1;

        if(queryUserName == null){
            queryUserName = "";
        }
        if(temp != null && !temp.equals("")){
            queryUserRole = Integer.parseInt(temp);     //给查询赋值1,2,3
        }
        if(pageIndex != null){
            currentPageNo = Integer.parseInt(pageIndex);
        }

        //获取用户的总数
        int totalCount = userServiceImp.getUserNums(queryUserName,queryUserRole);
        //总页数
        PageSupport pageSupport = new PageSupport();
        pageSupport.setCurrentPageNo(currentPageNo);        //设置当前页数
        pageSupport.setPageSize(pageSize);                  //设置页数记录数
        pageSupport.setTotalCount(totalCount);              //设置所有记录数目

        int totalPageCount = ((int) (totalCount / pageSize)) + 1;
        //控制尾页和首页
        if(currentPageNo < 1){
            currentPageNo = 1;
        }else if (currentPageNo > totalPageCount){    //控制尾页
            currentPageNo = totalPageCount;
        }

        //获取用户列表显示
        List<User> userList = userServiceImp.getUserList(queryUserName,queryUserRole,currentPageNo,pageSize);
        req.setAttribute("userList",userList);

        RoleServiceImpl roleService = new RoleServiceImpl();
        List<Role> roleList = roleService.getRoleList();
        req.setAttribute("roleList",roleList);
        req.setAttribute("totalCount",totalCount);
        req.setAttribute("currentPageNo",currentPageNo);
        req.setAttribute("queryUserName",queryUserName);
        req.setAttribute("queryUserRole",queryUserRole);
        req.setAttribute("totalPageCount",totalPageCount);
        //返回前端
        try {
            req.getRequestDispatcher("userlist.jsp").forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //用户添加
    public void add(HttpServletRequest req, HttpServletResponse resp){
        String userCode = req.getParameter("userCode");
        String userName = req.getParameter("userName");
        String userPassword = req.getParameter("userPassword");
        String gender = req.getParameter("gender");
        String birthday = req.getParameter("birthday");
        String userRole = req.getParameter("userRole");
        String address = req.getParameter("address");
        String phone = req.getParameter("phone");

        boolean flag = false;
        User user = new User();
        user.setUserCode(userCode);
        user.setUserName(userName);
        user.setUserPassword(userPassword);
        user.setGender(Integer.parseInt(gender));
        try {
            user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        user.setUserRole(Integer.parseInt(userRole));
        user.setAddress(address);
        user.setPhone(phone);
        user.setCreationDate(new Date());
        user.setCreatedBy(((User)(req.getSession().getAttribute(Constants.USER_SESSION))).getId());

        UserServiceImp userServiceImp = new UserServiceImp();
        flag = userServiceImp.add(user);
        if(flag){
            try {
                resp.sendRedirect(req.getContextPath() + "/jsp/user.do?method=query");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            try {
                req.getRequestDispatcher("useradd.jsp").forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

4.供应商管理

与用户管理的功能一样,因此直接展示代码

dao

package com.zhou.dao.provider;

import com.zhou.polo.Provider;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;


public interface ProviderDao {
    /**
     * 通过providerCode,providerName获得对应的Provider记录
     * @param connection
     * @param providerCode
     * @param providerName
     * @return
     * @throws SQLException
     */
    public List<Provider> getProviderList(Connection connection,String providerCode,String providerName) throws SQLException;

    /**
     * 增加Provider记录
     * @param connection
     * @param provider
     * @return
     * @throws SQLException
     */
    public boolean add(Connection connection,Provider provider) throws SQLException;
    /**
     * 通过ProviderId删除对应的Provider记录
     * @param connection
     * @param id
     * @return
     * @throws SQLException
     */
    public boolean delProvider(Connection connection,int id ) throws SQLException;
    /**
     * 通过ProviderId获得对应的Provider记录
     * @param connection
     * @param id
     * @return
     * @throws SQLException
     */
    public Provider getProviderById(Connection connection,String id) throws SQLException;

    /**
     * 修改指定的provider信息
     * @param connection
     * @param provider
     * @return
     * @throws SQLException
     */
    public boolean modify(Connection connection,Provider provider) throws SQLException;
}

package com.zhou.dao.provider;

import com.mysql.cj.util.StringUtils;
import com.zhou.dao.BaseDao;
import com.zhou.polo.Provider;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


public class ProviderDaoImpl implements ProviderDao{

    @Override
    public List<Provider> getProviderList(Connection connection, String providerCode, String providerName) throws SQLException {
        List<Provider> providerList = null;
        ResultSet rs = null;
        PreparedStatement pstm = null;
        if(connection != null){
            StringBuffer sql = new StringBuffer();
            providerList = new ArrayList<>();
            List<Object> list = new ArrayList<>();
            sql.append("select * from smbms_provider where 1=1");
            if(!StringUtils.isNullOrEmpty(providerCode)){
                sql.append(" and proCode like ?");
                list.add("%" + providerCode + "%");
            }
            if(!StringUtils.isNullOrEmpty(providerName)){
                sql.append(" and proName like ?");
                list.add("%" + providerName + "%");
            }
            Object[] params = list.toArray();
            rs = BaseDao.execute(connection,sql.toString(),params,rs,pstm);
            while(rs.next()){
                Provider provider = new Provider();
                provider.setId(rs.getInt("id"));
                provider.setProCode(rs.getString("proCode"));
                provider.setProName(rs.getString("proName"));
                provider.setProDesc(rs.getString("proDesc"));
                provider.setProContact(rs.getString("proContact"));
                provider.setProPhone(rs.getString("proPhone"));
                provider.setProAddress(rs.getString("proAddress"));
                provider.setProFax(rs.getString("proFax"));
                provider.setCreatedBy(rs.getInt("createdBy"));
                provider.setCreationDate(rs.getTimestamp("creationDate"));
                provider.setModifyDate(rs.getTimestamp("modifyDate"));
                provider.setModifyBy(rs.getInt("modifyBy"));
                providerList.add(provider);
            }
            BaseDao.close(connection,pstm,rs);
        }
        return providerList;
    }

    @Override
    public boolean add(Connection connection, Provider provider) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        if(connection != null){
            String sql = "insert into smbms_provider(id,proCode,proName,proDesc,proContact,proPhone,proAddress,proFax," +
                    "createdBy,creationDate,modifyDate,modifyBy)" + "values(?,?,?,?,?,?,?,?,?,?,?,?)";
            Object[] params = {provider.getId(),provider.getProCode(),provider.getProName(),provider.getProDesc(),
                    provider.getProContact(),provider.getProPhone(),provider.getProAddress(),provider.getProFax(),
                    provider.getCreatedBy(),provider.getCreationDate(),provider.getModifyDate(),provider.getModifyBy()};
            int execute = BaseDao.execute(connection, sql, params, pstm);
            if(execute > 0){
                flag = true;
            }
            BaseDao.close(connection,pstm,null);
        }
        return flag;
    }

    @Override
    public boolean delProvider(Connection connection, int id ) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        if(connection != null){
            String sql = "delete from smbms_provider where id = ?";
            Object[] params = {id};
            int execute = BaseDao.execute(connection, sql, params, pstm);
            if(execute > 0){
                flag = true;
            }
            BaseDao.close(connection,pstm,null);
        }

        return flag;
    }

    @Override
    public Provider getProviderById(Connection connection, String id) throws SQLException {
        Provider provider = null;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        if(connection != null){
            String sql = "select * from smbms_provider where id = ?";
            Object[] params = {id};
            rs = BaseDao.execute(connection, sql, params, rs,pstm);
            if(rs.next()){
                provider = new Provider();
                provider.setId(rs.getInt("id"));
                provider.setProCode(rs.getString("proCode"));
                provider.setProName(rs.getString("proName"));
                provider.setProDesc(rs.getString("proDesc"));
                provider.setProContact(rs.getString("proContact"));
                provider.setProPhone(rs.getString("proPhone"));
                provider.setProAddress(rs.getString("proAddress"));
                provider.setProFax(rs.getString("proFax"));
                provider.setCreatedBy(rs.getInt("createdBy"));
                provider.setCreationDate(rs.getTimestamp("creationDate"));
                provider.setModifyDate(rs.getTimestamp("modifyDate"));
                provider.setModifyBy(rs.getInt("modifyBy"));
            }
        }
        BaseDao.close(connection,pstm,null);
        return provider;
    }

    @Override
    public boolean modify(Connection connection, Provider provider) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        if(connection != null){
            String sql = "update smbms_provider p set p.proCode = ?,p.proName= ?," +
                    "p.proContact = ?,p.proPhone = ? ,p.proAddress = ?,p.proFax = ?," +
                    "p.proDesc = ? where id = ?";
            Object[] params = {provider.getProCode(),provider.getProName(),provider.getProContact(),provider.getProPhone(),
                provider.getProAddress(),provider.getProFax(),provider.getProDesc(),provider.getId()};
            int execute = BaseDao.execute(connection, sql, params, pstm);
            if(execute > 0){
                flag = true;
            }
        }
        BaseDao.close(connection,pstm,null);
        return flag;
    }
}

service

package com.zhou.service.provider;

import com.zhou.polo.Bill;
import com.zhou.polo.Provider;

import java.sql.SQLException;
import java.util.List;

public interface ProviderService {

    /**
     * 通过providerCode,providerName获得对应的Provider记录
     * @param providerCode
     * @param providerName
     * @return
     * @throws SQLException
     */
    public List<Provider> getProviderList(String providerCode,String providerName);

    /**
     * 增加Provider记录
     * @param provider
     * @return
     * @throws SQLException
     */
    public boolean add(Provider provider);

    /**
     * 通过ProviderId删除对应的Provider记录
     * @param id
     * @return
     * @throws SQLException
     */
    public int delProvider(int id);
    /**
     * 通过ProviderId获得对应的Provider记录
     * @param id
     * @return
     * @throws SQLException
     */
    public Provider getProviderById(String id);

    /**
     * 修改指定的provider信息
     * @param provider
     * @return
     * @throws SQLException
     */
    public boolean modify(Provider provider);


}

package com.zhou.service.provider;

import com.zhou.dao.BaseDao;
import com.zhou.dao.bill.BillDao;
import com.zhou.dao.bill.BillDaoImpl;
import com.zhou.dao.provider.ProviderDao;
import com.zhou.dao.provider.ProviderDaoImpl;
import com.zhou.polo.Provider;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class ProviderServiceImpl implements ProviderService {
    private ProviderDao providerDao;
    private BillDao billDao;
    public ProviderServiceImpl(){
        providerDao = new ProviderDaoImpl();
        billDao = new BillDaoImpl();
    }
    @Override
    public List<Provider> getProviderList(String providerCode, String providerName) {
        List<Provider> providerList = null;
        Connection connection = null;
        try {
            connection = BaseDao.getConnection();
            providerList = providerDao.getProviderList(connection,providerCode,providerName);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);

        }
        return providerList;
    }

    @Override
    public boolean add(Provider provider) {
        boolean flag = false;
        Connection connection = null;
        try {
            connection = BaseDao.getConnection();
            connection.setAutoCommit(false);
            flag = providerDao.add(connection,provider);
            if(flag){
                connection.commit();
            }
        } catch (SQLException e) {
            try {
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);
        }
        return flag;
    }

    /**
     * 业务: 根据ID删除供应商的数据之前,需要先去订单表看有没有与该Id相关的订单
     *若有订单与Id相关,则无法删除
     *若订单表中没有订单与该Id相关,则可以删除
     *返回值billCount
     * 1) billCount == 0 -->删除成功(1) 删除失败(-1)
     * 2) billCount > 0 -->表示有订单与该Id相关,无法删除   查询成功(1) 查询失败(-1)
     * @param id
     * @return
     */
    @Override
    public int delProvider(int id) {
        int billCount = -1;
        Connection connection = null;
        try {
            connection = BaseDao.getConnection();
            connection.setAutoCommit(false);
            billCount = billDao.getBillCountByProviderId(connection,id);
            if(billCount == 0){
                providerDao.delProvider(connection,id);
            }
            connection.commit();
        } catch (SQLException e) {
            billCount = -1;
            try {
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            BaseDao.close(connection,null,null);
        }
        return billCount;
    }

    @Override
    public Provider getProviderById(String id) {
        Provider provider = null;
        Connection connection = null;
        try {
            connection = BaseDao.getConnection();
            provider = providerDao.getProviderById(connection,id);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);
        }
        return provider;
    }

    @Override
    public boolean modify(Provider provider) {
        boolean flag = false;
        Connection connection = null;
        try {
            connection = BaseDao.getConnection();
            flag = providerDao.modify(connection,provider);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return flag;
    }


}

servlet

package com.zhou.servlet.provider;

import com.alibaba.fastjson.JSONArray;
import com.mysql.cj.util.StringUtils;
import com.mysql.cj.xdevapi.JsonArray;
import com.oracle.wls.shaded.org.apache.xalan.xsltc.compiler.util.ResultTreeType;
import com.zhou.polo.Provider;
import com.zhou.polo.User;
import com.zhou.service.provider.ProviderService;
import com.zhou.service.provider.ProviderServiceImpl;
import com.zhou.util.Constants;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.PortUnreachableException;
import java.sql.Connection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Descripition
 * @Author Zhouchang
 * @Date 2022/3/12 14:53
 * @Version 1.0
 */
public class ProviderServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");
        System.out.println("Providermethod --> " + method);
        if(method != null && method.equals("query")){
            this.query(req,resp);
        }else if(method != null && method.equals("add")){
            this.add(req,resp);
        } else if (method != null && method.equals("delprovider")) {
            this.del(req,resp);
        }else if(method != null && method.equals("view")){
            this.getProviderById(req,resp,"providerview.jsp");
        }else if(method != null && method.equals("modify")){
            this.getProviderById(req,resp,"providermodify.jsp");
        }else if(method != null && method.equals("modifysave")){
            this.modify(req,resp);
        }
    }
    public void modify(HttpServletRequest req, HttpServletResponse resp){
        String id = req.getParameter("proid");
        String proCode = req.getParameter("proCode");
        String proName = req.getParameter("proName");
        String proContact = req.getParameter("proContact");
        String proPhone = req.getParameter("proPhone");
        String proFax = req.getParameter("proFax");
        String proAddress = req.getParameter("proAddress");
        String proDesc = req.getParameter("proDesc");
        Provider provider = new Provider();
        provider.setId(Integer.valueOf(id));
        provider.setProCode(proCode);
        provider.setProName(proName);
        provider.setProContact(proContact);
        provider.setProPhone(proPhone);
        provider.setProFax(proFax);
        provider.setProAddress(proAddress);
        provider.setProDesc(proDesc);
        provider.setModifyDate(new Date());
        provider.setModifyBy(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId());

        ProviderService providerService = new ProviderServiceImpl();
        if(providerService.modify(provider)){
            try {
                resp.sendRedirect(req.getContextPath() + "/jsp/provider.do?method=query");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            try {
                req.getRequestDispatcher("providermodidy.jsp").forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public void getProviderById(HttpServletRequest req, HttpServletResponse resp,String url){
        String id = req.getParameter("proid");
        if(!StringUtils.isNullOrEmpty(id)){
            ProviderService providerService = new ProviderServiceImpl();
            Provider provider = null;
            provider = providerService.getProviderById(id);
            req.setAttribute("provider",provider);
            try {
                req.getRequestDispatcher(url).forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void del(HttpServletRequest req, HttpServletResponse resp) {
        String id = req.getParameter("proid");
        Map<String,String> resultMap = new HashMap<>();
        if(!StringUtils.isNullOrEmpty(id)){
            ProviderService providerService = new ProviderServiceImpl();
            int flag = providerService.delProvider(Integer.parseInt(id));
            if(flag == 0){//删除成功
                resultMap.put("delResult","true");
            }else if(flag == -1){
                resultMap.put("delResult","false");
            }else if(flag == 1){
                resultMap.put("delResult",String.valueOf(flag));//有相订单,不能删除返回订单数
            }
        }else{
            resultMap.put("delResult","notexist");
        }
        resp.setContentType("application/json");
        PrintWriter writer = null;
        try {
            writer = resp.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.write(JSONArray.toJSONString(resultMap));
        writer.flush();
        writer.close();
    }

    private void add(HttpServletRequest req, HttpServletResponse resp) {
        String proCode = req.getParameter("proCode");
        String proName = req.getParameter("proName");
        String proContact = req.getParameter("proContact");
        String proPhone = req.getParameter("proPhone");
        String proAddress = req.getParameter("proAddress");
        String proFax = req.getParameter("proFax");
        String proDesc = req.getParameter("proDesc");
        Provider provider = new Provider();
        provider.setProCode(proCode);
        provider.setProName(proName);
        provider.setProAddress(proAddress);
        provider.setProContact(proContact);
        provider.setProPhone(proPhone);
        provider.setProDesc(proDesc);
        provider.setProFax(proFax);
        provider.setCreationDate(new Date());

        ProviderService providerService = new ProviderServiceImpl();
        boolean flag = false;
        flag = providerService.add(provider);
        if(flag){
            try {
                resp.sendRedirect(req.getContextPath() + "/jsp/providerlist.jsp");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            try {
                req.getRequestDispatcher("provideradd.jsp").forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    public void query(HttpServletRequest req, HttpServletResponse resp){
        String queryProCode = req.getParameter("queryProCode");
        String queryProName = req.getParameter("queryProName");
        List<Provider> providerList = null;
        if(StringUtils.isNullOrEmpty(queryProName)){
            queryProName="";
        }
        if(StringUtils.isNullOrEmpty(queryProCode)){
            queryProCode="";
        }
        ProviderService providerService = new ProviderServiceImpl();
        providerList = providerService.getProviderList(queryProCode, queryProName);
        req.setAttribute("providerList",providerList);
        req.setAttribute("queryProCode",queryProCode);
        req.setAttribute("queryProName",queryProName);
        try {
            req.getRequestDispatcher("providerlist.jsp").forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

效果

在这里插入图片描述

5.订单管理

订单管理跟之前也没有太大的出入,直接展示代码

dao

package com.zhou.dao.bill;

import com.mysql.cj.conf.ConnectionPropertiesTransform;
import com.zhou.polo.Bill;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public interface BillDao {
    /**
     *
     * @param connection
     * @param bill
     * @return
     * @throws SQLException
     */
    public List<Bill> getBillList(Connection connection,Bill bill) throws SQLException;

    /**
     * 获取与providerId相对应的订单数
     * @param connection
     * @param providerId
     * @return
     * @throws SQLException
     */
    public int getBillCountByProviderId(Connection connection,int providerId) throws SQLException;

    /**
     * 通过BillId获得对应的Bill记录
     * @param connection
     * @param id
     * @return
     * @throws SQLException
     */
    public Bill getBillById(Connection connection ,String id) throws SQLException;

    /**
     * 添加Bill记录
     * @param connection
     * @param bill
     * @return
     * @throws SQLException
     */
    public boolean add(Connection connection,Bill bill) throws SQLException;

    /**
     * 删除与BillId对应的Bill记录
     * @param connection
     * @param id
     * @return
     * @throws SQLException
     */
    public boolean del(Connection connection,String id) throws SQLException;


    /**
     * 修改指定的Bill信息
      * @param connection
     * @param bill
     * @return
     * @throws SQLException
     */
    public boolean modify(Connection connection,Bill bill) throws SQLException;
}
package com.zhou.dao.bill;


import com.mysql.cj.conf.ConnectionPropertiesTransform;
import com.mysql.cj.util.StringUtils;
import com.sun.xml.internal.ws.wsdl.ActionBasedOperationSignature;
import com.zhou.dao.BaseDao;
import com.zhou.polo.Bill;
import sun.util.locale.provider.ResourceBundleBasedAdapter;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


public class BillDaoImpl implements BillDao {
    @Override
    public List<Bill> getBillList(Connection connection,Bill bill) throws SQLException {
        List<Bill> billList = null;
        PreparedStatement  pstm = null;
        ResultSet rs = null;
        if (connection != null) {
            billList = new ArrayList<>();
            List<Object> list = new ArrayList<>();
            StringBuffer sql = new StringBuffer();
            sql.append("select b.*,p.proName as ProviderName from smbms_bill b,smbms_provider p where b.providerId = p.id");
            if(!StringUtils.isNullOrEmpty(bill.getProductName())){
                sql.append(" and ProviderName like ?");
                list.add("%" + bill.getProductName() + "%");
            }
            if(bill.getProviderId() > 0){
                sql.append(" and providerId = ?");
                list.add(bill.getProviderId());
            }
            if(bill.getIsPayment() > 0 ){
                sql.append(" and isPayment = ?");
                list.add(bill.getIsPayment());
            }

            rs = BaseDao.execute(connection,sql.toString(),list.toArray(),rs,pstm);
            while(rs.next()){
                Bill _bill = new Bill();
                _bill.setId(rs.getInt("id"));
                _bill.setBillCode(rs.getString("billCode"));
                _bill.setProductName(rs.getString("productName"));
                _bill.setProductUnit(rs.getString("productUnit"));
                _bill.setProductDesc(rs.getString("productDesc"));
                _bill.setProductCount(rs.getBigDecimal("productCount"));
                _bill.setTotalPrice(rs.getBigDecimal("totalPrice"));
                _bill.setIsPayment(Integer.valueOf(rs.getString("isPayment")));
                _bill.setProviderName(rs.getString("providerName"));
                _bill.setCreatedBy(Integer.valueOf(rs.getString("createdBy")));
                _bill.setCreationDate(rs.getTimestamp("creationDate"));
                _bill.setModifyBy(rs.getInt("modifyBy"));
                _bill.setModifyDate(rs.getTimestamp("modifyDate"));
                _bill.setProviderId(rs.getInt("providerId"));
                billList.add(_bill);
            }
            BaseDao.close(connection,pstm,rs);
        }
        return billList;
    }

    @Override
    public int getBillCountByProviderId(Connection connection, int providerId) throws SQLException {
        int count = 0;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        if(connection != null){
            String sql = "select count(1) as billCount from smbms_bill where providerId = ?";
            Object[] params = {providerId};
            rs = BaseDao.execute(connection,sql,params,rs,pstm);
            if(rs.next()){
                count = rs.getInt("billCount");
            }
        }
        BaseDao.close(connection,pstm,null);
        return count;
    }

    @Override
    public Bill getBillById(Connection connection, String id)throws SQLException {
        Bill bill = null;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        if(connection != null){
            String sql = "select b.*,p.proName as providerName from smbms_bill b,smbms_provider p where b.id = ? ";
            Object[] params = {id};
            rs = BaseDao.execute(connection, sql, params, rs, pstm);
            if(rs.next()){
                bill = new Bill();
                bill.setId(rs.getInt("id"));
                bill.setBillCode(rs.getString("billCode"));
                bill.setProductName(rs.getString("productName"));
                bill.setProductUnit(rs.getString("productUnit"));
                bill.setProductDesc(rs.getString("productDesc"));
                bill.setProductCount(rs.getBigDecimal("productCount"));
                bill.setTotalPrice(rs.getBigDecimal("totalPrice"));
                bill.setProviderName(rs.getString("providerName"));
                bill.setIsPayment(Integer.valueOf(rs.getString("isPayment")));
                bill.setCreatedBy(Integer.valueOf(rs.getString("createdBy")));
                bill.setCreationDate(rs.getTimestamp("creationDate"));
                bill.setModifyBy(rs.getInt("modifyBy"));
                bill.setModifyDate(rs.getTimestamp("modifyDate"));
                bill.setProviderId(rs.getInt("providerId"));
            }
        }
        BaseDao.close(connection,pstm,rs);
        return bill;
    }

    @Override
    public boolean add(Connection connection, Bill bill) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        if(connection != null){
            String sql = "insert into smbms_bill(id,billCode,productName,productDesc,productUnit,productCount," +
                    "totalPrice,isPayment,createdBy,creationDate,modifyBy,modifyDate,providerId) values(?,?,?,?,?,?,?,?,?,?,?,?)";
            Object[] params = {bill.getId(),bill.getBillCode(),bill.getProductName(),bill.getProductDesc(),bill.getProductUnit(),
                            bill.getProductCount(),bill.getTotalPrice(),bill.getIsPayment(),bill.getCreatedBy(),bill.getCreationDate(),
                            bill.getModifyBy(),bill.getModifyDate(), bill.getProviderId()};
            int execute = BaseDao.execute(connection, sql, params, pstm);
            if(execute > 0){
                flag = true;
            }
        }
        BaseDao.close(connection,pstm,null);
        return flag;
    }

    @Override
    public boolean del(Connection connection, String id) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        if(connection != null){
            String sql = "delete from smbms_bill where id = ?";
            Object[] params = {id};
            int execute = BaseDao.execute(connection, sql, params, pstm);
            if(execute > 0) {
                flag = true;
            }
        }
        BaseDao.close(connection,pstm,null);
        return flag;
    }

    @Override
    public boolean modify(Connection connection, Bill bill) throws SQLException {
        boolean flag = false;
        PreparedStatement pstm = null;
        if(connection != null){
            //update加上where,如果不加上where就会更改所有的记录
            String sql = "update smbms_bill set billCode = ?,productName = ?,productUnit = ?,productCount = ?,totalPrice = ?," +
                    "providerId = ?,isPayment = ? where id = ?";
            //参数顺序不能出错,数量要一致
            Object[] params = {bill.getBillCode(),bill.getProductName(),bill.getProductUnit(),bill.getProductCount(),bill.getTotalPrice(),
                    bill.getProviderId(), bill.getIsPayment(),bill.getId()};
            int execute = BaseDao.execute(connection, sql, params, pstm);
            if(execute > 0){
                flag = true;
            }
        }
        BaseDao.close(connection,pstm,null);
        return flag;
    }
}

service

package com.zhou.service.Bill;

import com.zhou.polo.Bill;

import java.util.List;

public interface BillService {
    /**
     *获得Bill列表      通过模糊查询
     * @param bill
     * @return
     */
    public List<Bill> getBillList(Bill bill);

    /**
     * 通过BillId获得Bill
     * @param id
     * @return
     */

    public Bill getBillById(String id);

    /**
     * 增加bill记录
     * @param bill
     * @return
     */
    public boolean add(Bill bill);


    /**
     * 通过指定的BillId删除对应的bill记录
     * @param id
     * @return
     */
    public boolean del(String id);


    /**
     * 修改订单信息
     * @param bill
     * @return
     */
    public boolean modify(Bill bill);
}
package com.zhou.service.Bill;

import com.zhou.dao.BaseDao;
import com.zhou.dao.bill.BillDao;
import com.zhou.dao.bill.BillDaoImpl;
import com.zhou.polo.Bill;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class BillServiceImpl implements BillService {
    private BillDao billDao;
    public BillServiceImpl(){
        billDao = new BillDaoImpl();
    }
    @Override
    public List<Bill> getBillList(Bill bill) {
        List<Bill> billList = null;
        Connection connection = null;
        connection = BaseDao.getConnection();
        try {
            billList = billDao.getBillList(connection,bill);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);
        }
        return billList;
    }
    @Override
    public Bill getBillById(String id) {
        Bill bill = null;
        Connection connection = null;
        try {
            connection = BaseDao.getConnection();
            bill = billDao.getBillById(connection,id);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);
        }
        return bill;
    }

    @Override
    public boolean add(Bill bill) {
        boolean flag = false;
        Connection conncetion = null;
        try {
            conncetion = BaseDao.getConnection();
            billDao.add(conncetion,bill);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(conncetion,null,null);
        }
        return flag;
    }

    @Override
    public boolean del(String id) {
        boolean flag = false;
        Connection connection  = null;
        try {
            connection = BaseDao.getConnection();
            flag = billDao.del(connection,id);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            BaseDao.close(connection,null,null);

        }
        return flag;
    }

    @Override
    public boolean modify(Bill bill) {
        boolean flag = false;
        Connection connection = null;
        try {
            connection = BaseDao.getConnection();
            flag = billDao.modify(connection,bill);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            BaseDao.close(connection,null,null);
        }
        return flag;
    }
}

servlet

package com.zhou.servlet.bill;

import com.alibaba.fastjson.JSONArray;
import com.mysql.cj.util.StringUtils;
import com.zhou.polo.Bill;
import com.zhou.polo.Provider;
import com.zhou.polo.User;
import com.zhou.service.Bill.BillService;
import com.zhou.service.Bill.BillServiceImpl;
import com.zhou.service.provider.ProviderService;
import com.zhou.service.provider.ProviderServiceImpl;
import com.zhou.util.Constants;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.hamcrest.core.Is;

import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.*;

public class BillServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");
        System.out.println("billmethod--> " + method);
        if(method != null && method.equals("query")){
            this.query(req,resp);
        }else if(method != null && method.equals("add")) {
            this.add(req,resp);
        }else if(method != null && method.equals("view")){
            this.getBillById(req,resp,"billview.jsp");
        }else if(method != null && method.equals("modify")){
            this.getBillById(req,resp,"billmodify.jsp");
        }else if(method != null && method.equals("delbill")){
            this.delBill(req,resp);
        }else if(method != null && method.equals("modifysave")){
            this.modify(req,resp);
        }else if(method != null && method.equals("getproviderlist")){
            this.getProviderList(req,resp);
        }
    }

    public void add(HttpServletRequest req, HttpServletResponse resp){
        String billCode = req.getParameter("billCode");
        String productName = req.getParameter("productName");
        String productUnit = req.getParameter("productUnit");
        String productCount = req.getParameter("productCount");
        String totalPrice = req.getParameter("totalPrice");
        String providerId = req.getParameter("providerId");
        String isPayment = req.getParameter("isPayment");
        Bill bill = new Bill();
        bill.setBillCode(billCode);
        bill.setProductName(productName);
        bill.setProductUnit(productUnit);
        bill.setProductCount(new BigDecimal(productCount).setScale(2,BigDecimal.ROUND_DOWN));
        bill.setTotalPrice(new BigDecimal(totalPrice).setScale(2,BigDecimal.ROUND_DOWN));
        bill.setProviderId(Integer.valueOf(providerId));
        bill.setIsPayment(Integer.valueOf(isPayment));
        bill.setCreatedBy(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId());
        bill.setCreationDate(new Date());


        BillService billService = new BillServiceImpl();
        if(billService.add(bill)){
            try {
                resp.sendRedirect(req.getContextPath() + "/jsp/bill.do?method=query");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            try {
                req.getRequestDispatcher("billadd.jsp").forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public void query(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("---------query start---------");
        List<Provider> providerList = null;
        List<Bill> billList = null;
        ProviderService providerService = new ProviderServiceImpl();
        BillService billService = new BillServiceImpl();
        providerList = providerService.getProviderList("","");
        //将信息发送到前端
        req.setAttribute("providerList",providerList);

        String queryProductName = req.getParameter("queryProductName");
        String queryProviderId = req.getParameter("queryProviderId");
        String queryIsPayment = req.getParameter("queryIsPayment");
        Bill bill = new Bill();

        if(StringUtils.isNullOrEmpty(queryProductName)){
            queryProductName = "";
        }
        if(StringUtils.isNullOrEmpty(queryIsPayment)){
            bill.setIsPayment(0);
        }else{
            bill.setIsPayment(Integer.valueOf(queryIsPayment));
        }

        if(StringUtils.isNullOrEmpty(queryProviderId)){
            bill.setProviderId(0);
        }else{
            bill.setProviderId(Integer.valueOf(queryProviderId));
        }
        billList = billService.getBillList(bill);
        req.setAttribute("billList",billList);
        req.setAttribute("queryProductName",queryProductName);
        req.setAttribute("queryProviderId",queryProviderId);
        req.setAttribute("queryIsPayment",queryIsPayment);
        try {
            req.getRequestDispatcher("billlist.jsp").forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("---------query end---------");
    }

    public void getProviderList(HttpServletRequest req, HttpServletResponse resp){
        List<Provider> providerList = new ArrayList<>();
        ProviderService providerService = new ProviderServiceImpl();
        providerList = providerService.getProviderList("","");
        //把providerList对象转换成json对象输出
        resp.setContentType("application/json");

        PrintWriter writer = null;
        try {
            writer = resp.getWriter();
            writer.write(JSONArray.toJSONString(providerList.toArray()));
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void getBillById(HttpServletRequest req, HttpServletResponse resp,String url){
        String id = req.getParameter("billid");
        Bill bill = null;
        if(!StringUtils.isNullOrEmpty(id)){
            BillService billService = new BillServiceImpl();
            bill = billService.getBillById(id);
            req.setAttribute("bill",bill);
            try {
                req.getRequestDispatcher(url).forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void delBill(HttpServletRequest req, HttpServletResponse resp){
        String id = req.getParameter("billid");
        Map<String,String> resultMap = new HashMap<>();
        if(StringUtils.isNullOrEmpty(id)){
            resultMap.put("delResult","notexist");
        }else{
            BillService billService = new BillServiceImpl();
            if(billService.del(id)){
                resultMap.put("delResult","true");
            }else{
                resultMap.put("delResult","false");
            }
        }
        resp.setContentType("application/json");
        PrintWriter writer = null;
        try {
            writer = resp.getWriter();
            writer.write(JSONArray.toJSONString(resultMap));
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public void modify(HttpServletRequest req, HttpServletResponse resp){
        String id = req.getParameter("id");
        String billCode = req.getParameter("billCode");
        String productName = req.getParameter("productName");
        String productUnit = req.getParameter("productUnit");
        String productCount = req.getParameter("productCount");
        String totalPrice = req.getParameter("totalPrice");
        String providerId = req.getParameter("providerId");
        String isPayment = req.getParameter("isPayment");
        Bill bill = new Bill();
        bill.setId(Integer.valueOf(id));
        bill.setBillCode(billCode);
        bill.setProductName(productName);
        bill.setProductUnit(productUnit);
        bill.setProductCount(new BigDecimal(productCount).setScale(2,BigDecimal.ROUND_DOWN));
        bill.setTotalPrice(new BigDecimal(totalPrice).setScale(2,BigDecimal.ROUND_DOWN));
        bill.setProviderId(Integer.valueOf(providerId));
        bill.setIsPayment(Integer.valueOf(isPayment));
        bill.setModifyBy(((User)(req.getSession().getAttribute(Constants.USER_SESSION))).getId());
        bill.setModifyDate(new Date());

        BillService billService = new BillServiceImpl();
        if(billService.modify(bill)){
            try {
                resp.sendRedirect(req.getContextPath() + "/jsp/bill.do?method=query");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            try {
                req.getRequestDispatcher("billmodify.jsp").forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UgRPa7Nt-1647172563124)(C:\Users\周畅\AppData\Roaming\Typora\typora-user-images\image-20220313193635172.png)]

6.总结

在花费了几天的时间之后,终于是自己动手将所有的代码都敲完了,期间出现了很多问题,也找错找了很长时间,幸运的是我最后还是找到了错误

  • 在动手写相关的函数之前要先看jsp和js文件,与文件内部的方法相对应,不然很容易出现404
  • 在servlet写完之后一定要去web.xml注册相关的映射,否则servlet接收不到请求
  • 在sql语句中尽量使用PreparedStatement,可以避免SQL注入问题,除此之外,参数的个数以及顺序都要正确,否则sql语句会执行失败
  • 在涉及到多表查询的时候,sql语句一定要将所有涉及到的表加上,否则就会出现页面某一项没有数据的情况
  • 尽量不要将要序列化的数据定义成long类型,否则在转换成json数据的时候就会出错
  • 在导入依赖的时候,尽量让依赖的版本号相同
  • 出现错误的时候可以在代码中加上输出语句一层一层的排查错误,也可以看控制台的报错提示,还可以在浏览器控制台中或者网络等地方查看错误。
  • 进行模糊查询的时候,可以使用一个StringBuffer动态存储sql语句,list动态存储参数。
  • 如果要返回json数据,那么可以使用 Map<String,String>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

smbms(超市管理系统)源码 + 分析 的相关文章

  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • Netbeans 8 不会重新加载静态 Thymeleaf 文件

    我通过 Maven 使用 Spring Boot 和 Thymeleaf 当我进行更改时 我似乎无法让 Netbeans 自动重新部署我的任何 Thymeleaf 模板文件 为了看到更改 我需要进行完整的清理 构建 运行 这需要太长的时间
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的

随机推荐

  • 常用人体模型关节索引

    SMPL 24 joints Cocoplus 19 joints 0 RAnkle 1 RKnee 2 RHip 3 LHip 4 LKnee 5 LAnkle 6 RWrist 7 RElbow 8 RShoulder 9 LShoul
  • 程序员们最恐惧的“代码”,一见就头疼,是老前辈留下来的代码!

    t行业是目前最赚钱的行业 程序员是目前最赚钱的职业之一 也是最容易过劳死的职业之一 虽然程序员们工资都很高 有的还会赚年薪 但是他们的工作真的是非常辛苦 因为程序员经常会熬夜写代码 在电脑前工作 他们脱发秃头的几率也非常高 由于程序员经常在
  • poco源码简单分析

    自动化工具poco源码简单分析 Airtest简介 Airtest是网易游戏开源的一款UI自动化测试项目 目前处于公开测试阶段 该项目分为AirtestIDE Airtest Poco Testlab四个部分 基于python脚本的方式 用
  • 【公告】博客专家 6 月发布原创/翻译文章奖励

    博客专家6月发布原创 翻译文章奖励 CSDN ID 所获奖励 malefactor 图灵社区技术图书 程序员杂志最新期刊 C币100 lmj623565791 图灵社区技术图书 程序员杂志最新期刊 C币100 jiangwei0910410
  • python TypeError: missing 1 required positional argument:'self'

    Python 调用类的函数时报错如下 TypeError seperate data missing 1 required positional argument self 报错原因 train data test data DataCle
  • 对spark dataframe join之后的列值NULL值进行填充为指定数值的操作

    众所周知 两个数据集如A B取JOIN操作的时候 其结果往往会出现NULL值的出现 这种情况是非常不利于后续的分析与计算的 特别是当涉及到对这个数值列进行各种聚合函数计算的时候 针对这种问题 当然从最简单的dataframe map来处理是
  • QThreadPool线程池的原理与使用

    一 为什么需要用线程池 现在所有的高性能服务器程序 几乎都会使用到线程池技术 从而更好且有效的榨干服务器性能 1 开多少个线程可以达到性能最佳 不知道 你有没有这个疑问 这是一种常见的线程使用方式 class MyThread public
  • list集合(接口)

    list集合 显而易见是用来存储数据的 可以把它看作是长度可变的数组 它是有序存储数据的 具有跟数组一样的索引 ArrayList LinkedList Vector Stack都是list接口的实现类 以ArrayList为例说明list
  • 1033 旧键盘打字 (20 分)

    题目 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大写给
  • 基于Redis的BitMap实现签到、连续签到统计(含源码)

    微信公众号访问地址 基于Redis的BitMap实现签到 连续签到统计 含源码 推荐文章 1 springBoot对接kafka 批量 并发 异步获取消息 并动态 批量插入库表 2 SpringBoot用线程池ThreadPoolTaskE
  • mysql日期转换

    1 MySQL中和日期相关的函数 1 1 DATE FORMAT date format 主要用来将日期格式化函数 举例 SELECT DATE FORMAT NOW Y m d 1 2 STR TO DATE str format 主要用
  • 分析pandas的数据,分析某一列数据的长度分布等等

    分析数据 如分析sku的长度 import pandas as pd import numpy as np data file data data zh sku 80k csv 待分析的文件 def ana len file key Non
  • AI绘画:StableDiffusion实操教程-斗破苍穹-云韵-常服(附高清图下载)

    前段时间我分享了StableDiffusion的非常完整的教程 AI绘画 Stable Diffusion 终极宝典 从入门到精通 不久前 我与大家分享了StableDiffusion的全面教程 AI绘画 Stable Diffusion
  • HITICS-2018大作业 hello的一生

    摘 要 本论文详细介绍了hello程序在linux系统中从生成源代码到成功运行完毕被系统回收的整个过程 按照执行的先后顺序模块化介绍了hello c在计算机内部是系统具体执行了什么指令 如何执行的 用到了哪些知识等 本论文参考CSAPP课本
  • linux(centos) 保存退出vi编辑

    保存命令 按ESC键 跳到命令模式 然后 w 保存文件但不退出vi w file 将修改另外保存到file中 不退出vi w 强制保存 不推出vi wq 保存文件并退出vi wq 强制保存文件 并退出vi q 不保存文件 退出vi q 不保
  • Oracle存储过程获取入参出参(顺序,名字,类型,入参/出参)

    调用SQL语句 PROCEDURE NAME为过程名 自行替换要查询的过程名 POS为参数位置 NAME为参数名 TYPE为参数类型 IN OUT为入参 出参 SELECT A POSITION POS A ARGUMENT NAME NA
  • ABB 120 六轴机械手臂编程调试(三)

    下一步进行机械手臂的程序编写 程序只是进行简单的点位运动 实现抓取功能 程序控制的点位表 输入点位 点位描述 输出点位 点位描述 DI5 夹取完成 DO5 夹取物料 DI6 放料完成 DO6 放下物料 DI7 回原点 DO7 设备就绪 DI
  • Python练习——基础练习题2

    因为控制台会让不断输入 索性就把input放到注释里了 这一片主要练习if判断和while循环 初级 判断下列语句的打印结果 1 print True and True or True 2 print True and True or Fa
  • 因果图分析法例子

    某软件规格说明书包含这样的要求 第一列字符必须是A或B 第二列字符必须是一个数字 在此情况下进行文件的修改 但如果第一列字符不正确 则给出信息L 如果第二列字符不是数字 则给出信息M 解答 1 根据需求 分析出原因和结果如下 原因 1 第一
  • smbms(超市管理系统)源码 + 分析

    在项目开始之前 我们首先要对项目的整体架构分析一下 该项目一共分为四个模块 登录注销 用户管理 订单管理 供应商管理 其中用户管理 订单管理以及供应商管理都是需要对数据库进行crud的 项目的整体架构图如下 1 前期准备 1 项目架构 2