演示视频
超市订单管理系统SSM版本
声名:此系统修改了一些原来的页面内容,以及修补之前项目不足的地方…
另外新添了一个 根据时间 计算 早上 中午 下午 晚上的demo 记录在右上角
另外优化了一个查询… 就是当查询不存在的数据时 会发生如下情况
我将它整成查询不存在的数据时 0记录 0条0页
创作不易:兄弟们 三连一下 可以吗? 🐕
一:数据库
用之前的数据库数据即可 这里就不再赘述 上篇SMBMS博文
数据库中的 smbms_address 表没用到 可以不使用
二:我们先创建一个普通的maven项目
如果不懂的 查看 如何建立maven项目
三:建立包结构
四:实体类
User类
import java.text.SimpleDateFormat;
import java.util.Date;
public class User {
private Integer id;
private String userCode; //用户编码
private String userName;
private String userPassword;
private Integer gender;
private Date birthday;
private String phone;
private String address;
private Integer userRole;
private Integer createdBy; //创建者
private Date createDate;
private Integer modifyBy; //更新者
private Date modifyDate; //更新时间
private Integer age; //年龄
private String userRoleName; //用户角色名称
private String birth; //用户生日
public Integer getAge() {
Date date = new Date();//获取当前时间
Integer age = date.getYear() - this.birthday.getYear();//获取当前用户多少岁
return age;
}
public String getBirth(){
return birth;
}
public void setAge(Integer age) {
this.age = age;
}
public String getUserRoleName() {
return userRoleName;
}
public void setUserRoleName(String userRoleName) {
this.userRoleName = userRoleName;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirth(String birth) {
this.birth = birth;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
this.setBirth(sdf.format(this.birthday));
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getUserRole() {
return userRole;
}
public void setUserRole(Integer userRole) {
this.userRole = userRole;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userCode='" + userCode + '\'' +
", userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
", gender=" + gender +
", birthday=" + birthday +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
", userRole=" + userRole +
", createdBy=" + createdBy +
", createDate=" + createDate +
", modifyBy=" + modifyBy +
", modifyDate=" + modifyDate +
", age=" + age +
", userRoleName='" + userRoleName + '\'' +
", birth='" + birth + '\'' +
'}';
}
}
Role类
import java.util.Date;
public class Role {
private Integer id; //id
private String roleCode; //角色编码
private String roleName; //角色名称
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate;//更新时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRoleCode() {
return roleCode;
}
public void setRoleCode(String roleCode) {
this.roleCode = roleCode;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
Provider类
import java.util.Date;
public class Provider {
private Integer id; //id
private String proCode; //供应商编码
private String proName; //供应商名称
private String proDesc; //供应商描述
private String proContact; //供应商联系人
private String proPhone; //供应商电话
private String proAddress; //供应商地址
private String proFax; //供应商传真
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate;//更新时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getProCode() {
return proCode;
}
public void setProCode(String proCode) {
this.proCode = proCode;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
public String getProDesc() {
return proDesc;
}
public void setProDesc(String proDesc) {
this.proDesc = proDesc;
}
public String getProContact() {
return proContact;
}
public void setProContact(String proContact) {
this.proContact = proContact;
}
public String getProPhone() {
return proPhone;
}
public void setProPhone(String proPhone) {
this.proPhone = proPhone;
}
public String getProAddress() {
return proAddress;
}
public void setProAddress(String proAddress) {
this.proAddress = proAddress;
}
public String getProFax() {
return proFax;
}
public void setProFax(String proFax) {
this.proFax = proFax;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
Bill类
import java.math.BigDecimal;
import java.util.Date;
public class Bill {
private Integer id; //id
private String billCode; //账单编码
private String productName; //商品名称
private String productDesc; //商品描述
private String productUnit; //商品单位
private BigDecimal productCount; //商品数量
private BigDecimal totalPrice; //总金额
private Integer isPayment; //是否支付
private Integer providerId; //供应商ID
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate;//更新时间
private String providerName;//供应商名称
public String getProviderName() {
return providerName;
}
public void setProviderName(String providerName) {
this.providerName = providerName;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBillCode() {
return billCode;
}
public void setBillCode(String billCode) {
this.billCode = billCode;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public String getProductUnit() {
return productUnit;
}
public void setProductUnit(String productUnit) {
this.productUnit = productUnit;
}
public BigDecimal getProductCount() {
return productCount;
}
public void setProductCount(BigDecimal productCount) {
this.productCount = productCount;
}
public BigDecimal getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(BigDecimal totalPrice) {
this.totalPrice = totalPrice;
}
public Integer getIsPayment() {
return isPayment;
}
public void setIsPayment(Integer isPayment) {
this.isPayment = isPayment;
}
public Integer getProviderId() {
return providerId;
}
public void setProviderId(Integer providerId) {
this.providerId = providerId;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
五:导入资源文件
application-context.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<import resource="classpath:spring-dao.xml"/>
<import resource="classpath:spring-service.xml"/>
<import resource="classpath:spring-mvc.xml"/>
<!--扫描util下的工具类-->
<context:component-scan base-package="com.csnz.util"/>
</beans>
db.properties文件
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
jdbc.username = 你的账户
jdbc.password = 你的密码
log4j.properties文件 可配可不配 我这里配置是为了查日志
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/CSNZ.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
mybatis-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件 整合的话 mybatis只需要负责两样东西 别名 和 mapper映射-->
<configuration>
<!--配置日志-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--配置数据源的事情 让spring做-->
<typeAliases>
<package name="com.csnz.pojo"/>
</typeAliases>
<!--MapperRegistry:注册绑定我们的Mapper文件 因为我们spring-dao.xml 中配置了dao接口扫描包 所以此时我们这里不用重新注册 二选一即可
<mappers>
<mapper class="com.csnz.dao.User.UserMapper"/>
<mapper class="com.csnz.dao.Role.RoleMapper" />
<mapper class="com.csnz.dao.Bill.BillMapper"/>
<mapper class="com.csnz.dao.Provider.ProviderMapper"/>
</mappers>
-->
</configuration>
spring-dao.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--1、关联数据库配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--2、配置连接池
dbcp:半自动化操作,不能自动连接
c3p0:自动化操作(自动化的加载配置文件,并且可以自动设置到对象中)
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--c3p0连接池的私有属性-->
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<!--关闭连接后不自动commit-->
<property name="autoCommitOnClose" value="false"/>
<!--获取连接超时时间-->
<property name="checkoutTimeout" value="10000"/>
<!--当获取连接失败重试次数-->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!--3、sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
<!--绑定mybatis的配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--4、配置dao接口扫描包,动态的实现了dao接口可以注入到Spring容器中(tips:之前是用实现类继承support类或者 注入template模板)-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入 sqlSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--要扫描的dao包-->
<property name="basePackage" value="com.csnz.dao"/>
</bean>
</beans>
spring-mvc.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--1、注解驱动-->
<mvc:annotation-driven/>
<!--2、静态资源过滤-->
<mvc:default-servlet-handler/>
<!--3、扫描包:controller-->
<context:component-scan base-package="com.csnz.controller"/>
<!--4、视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
spring-service.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cotext="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--1、扫描service下的包-->
<cotext:component-scan base-package="com.csnz.service"/>
<!--2、将我们所有业务类,注入到Spring,可以通过配置 或者 使用注解实现(@Service @AutoWire)-->
<!-- <bean id="userServiceImpl" class="com.csnz.service.Impl.UserServiceImpl">-->
<!-- <property name="userMapper" ref="userMapper"/>-->
<!-- </bean>-->
<!-- <bean id="roleServiceImpl" class="com.csnz.service.Impl.RoleServiceImpl">-->
<!-- <property name="roleMapper" ref="roleMapper"/>-->
<!-- </bean>-->
<!-- -->
<!-- <bean id="billServiceImpl" class="com.csnz.service.Impl.BillServiceImpl">-->
<!-- <property name="billMapper" ref="billMapper"/>-->
<!-- </bean>-->
<!-- <bean id="pageSupport" class="com.csnz.util.PageSupport"/>-->
<!--3、声明式事务配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
这里别忘记配置web.xm文件!!!
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--DispatchServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--乱码过滤-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Session过期时间 15分钟-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
六:导入依赖
<!--依赖 : junit,数据库驱动,连接池,servlet,jsp,mybatis,mybatis-spring,spring-->
<dependencies>
<!--Junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--lombok 可用可不用 不用的话自己生成set、get、以及构造器-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<!-- 阿里巴巴的fastjson:用于转换json格式-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.61</version>
</dependency>
<!-- 配置Log4j 日志处理 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
顺便配置一下静态资源导入导出问题 静态资源导入导出问题
下面开始干活啦:
一:登陆模块
从底层往上写 dao -> service -> controller
dao层
登陆时 从数据库中查找此 用户userCode 查得到user再判断密码是否相同
service层
service层 负责判断密码是否相同的逻辑
@Service
public class UserServiceImpl implements UserService {
//业务层调用dao层
@Autowired
private UserMapper userMapper;
// 使用注解模式开发:对应类上加 @Service 和 @Autowired 此时就不用set方法注入了
// public void setUserMapper(UserMapper userMapper) {
// this.userMapper = userMapper;
// }
@Override
public User login(String userCode, String password) {
//先通过 userCode查找用户的信息 再判断用户密码是否相等 如果不相同就返回 null
User user = userMapper.findUserByUserCode(userCode);
boolean flag = user != null ? user.getUserPassword().equals(password) : false;
return flag == true ? user : null;
}
}
controller层
控制层检测 如果用户不为空 将用户信息存入session
@Controller
@RequestMapping("/User")
public class UserController {
@Autowired
private UserService userService;
/*
***************************** 用户登陆 与 注销模块 *****************************
*/
@RequestMapping("/login")
public String findUser(String userCode, String userPassword,HttpServletRequest request){
User user = userService.login(userCode,userPassword);
if (user != null) { //如果用户不为空 将用户信息存入session
request.getSession().setAttribute("userSession",user);
return "frame";
}
request.getSession().setAttribute("msg","当前账号或密码错误");
return "redirect:/index.jsp";
}
}
最后配置一下登陆页面的 登陆请求 就大功告成啦
二:注销模块
直接在 controller 层写 移除用户的session 返回登录页面
controller层
//退出系统
@GetMapping("/logout")
public void logout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//移除用户的session
req.getSession().removeAttribute("userSession");
//返回登录页面
req.setAttribute("msg","");
req.getRequestDispatcher("/index.jsp").forward(req,resp);
}
最后配置一下head页面的 注销请求 就大功告成啦
三:用户修改密码模块
从底层往上写 dao -> service -> controller
dao层
//修改密码
public abstract int updatePassword(@Param("userId") int userId ,@Param("newPassword") String newPassword);
service层
controller层
看这个请求 网页肯定是先去修改密码的页面 再执行修改密码的操作
此时 pwdmodify.jsp 判断你填入的密码数据 又是根据 ajax判断的 所以看 pwdmodify.js
//验证旧密码是否正确
@GetMapping("/verifyPwd")
@ResponseBody
public String verifyPwd(String oldpassword,HttpServletRequest req) {
//依旧从session中取ID
User user = (User) req.getSession().getAttribute("userSession");
//System.out.println("前端传来的旧密码:"+oldpassword);
//将结果存放在map集合中 让Ajax使用
Map<String, String> resultMap = new HashMap<>();
//下面开始判断 键都是用result 此处匹配js中的Ajax代码
if(user == null){
//说明session被移除了 或未登录|已注销
resultMap.put("result","sessionerror");
}else if(oldpassword == null){
//前端输入的密码为空
resultMap.put("result","error");
}else {
//如果旧密码与前端传来的密码相同
if((user).getUserPassword().equals(oldpassword)){
resultMap.put("result","true");
}else{
//前端输入的密码和真实密码不相同
resultMap.put("result","false");
}
}
//JSONArray 阿里巴巴的JSON工具类 用途就是:转换格式
return JSONArray.toJSONString(resultMap);
}
最后就看 pwdmodify.jsp 文件提交的action
最终密码在这里进行修改
// 修改密码
@RequestMapping("/pwdmodify")
public String pwdmodify(String newpassword,HttpServletRequest req, ModelAndView model) {
//从Session中获取ID
User user = (User) req.getSession().getAttribute("userSession");
//先判断不为空 再比较密码是否相等
if(user != null && newpassword != null){
//修改密码并返回结果
boolean flag = userService.updatePassword(user.getId(), newpassword);
//如果密码修改成功 移除当前session
if(flag){
model.addObject("message","修改密码成功,请使用新密码登录!");
req.getSession().removeAttribute("userSession");
}else{
model.addObject("message","密码修改失败 新密码不符合规范");
}
}else{
model.addObject("message","新密码不能为空!");
}
//修改完了 重定向到此修改页面
return "pwdmodify";
}
修改密码模块大功告成啦
四:登陆拦截器模块
写一个拦截器类 并在 spring-mvc.xml 中进行注册绑定
LoginInterceptor类
除了 登陆和注销 无需经过拦截 其他请求都需要经过拦截器判断
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//用户登陆成功 : true
if(request.getSession().getAttribute("userSession") != null) {
return true;
}
// 用户请求登陆需求 : true
if(request.getRequestURI().contains("login") || request.getRequestURI().contains("logout")){
return true;
}
// 其余请求都是 error
System.out.println("拦截到非法请求...");
request.setAttribute("msg","请先登陆!");
request.getRequestDispatcher("/index.jsp").forward(request,response);
return false;
}
}
写完 LoginInterceptor 类 记得在 spring-mvc.xml 中 配置此拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/calendar/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/js/**"/>
<bean class="com.csnz.Interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
五:用户管理模块
小插曲:分页工具类 PageSupport
@Component
public class PageSupport {
//当前页面 来自于用户输入
private int currentPageNo = 1;
//总数量(表)
private int totalCount = 0;
//页面容量
private int pageSize = 0;
//总共显示的页数 为总表数量/单页容量 +1
private int totalPageCount =1;
public int getCurrentPageNo() {
return currentPageNo;
}
public void setCurrentPageNo(int currentPageNo) {
if(currentPageNo>0){
this.currentPageNo = currentPageNo;
}
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
if(totalCount>0){
this.totalCount = totalCount;
this.setTotalPageCountByRs();
}
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
if(pageSize>0){
this.pageSize = pageSize;
}
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public void setTotalPageCountByRs(){
if(this.totalCount % this.pageSize == 0){
this.totalPageCount = this.totalCount / this.pageSize;
}else if(this.totalCount % this.pageSize > 0){
this.totalPageCount = this.totalCount / this.pageSize +1;
}else{
this.totalPageCount = 0;
}
}
}
5.1:用户列表查询模块
从底层往上写 dao -> service -> controller
dao层
查询用户列表 需要 用户总数 因为 分页要用到
//根据用户名 或 角色 查询用户总数
public abstract int getUserCounts(@Param("username") String username,@Param("userRole") int userRole);
//根据条件 查询 获取用户列表 userlist
public abstract List<User> getUserList(@Param("username") String username, @Param("userRole") int userRole,@Param("currentPageNo") int currentPageNo,@Param("pageSize") int pageSize);
<!--根据 用户名 或 角色 查找 用户总数-->
<select id="getUserCounts" resultType="Integer" >
select count(1) from smbms_user u , smbms_role r
<where>
u.userRole = r.id
<if test="username != null">
and u.userName like CONCAT(CONCAT('%',#{ username }),'%')
</if>
<if test="userRole != 0">
and u.userRole = #{ userRole }
</if>
</where>
</select>
<!--根据条件 查询 获取用户列表 userlist-->
<select id="getUserList" resultType="User">
select u.*,r.roleName as userRoleName
from smbms_user u, smbms_role r
<where>
u.userRole = r.id
<if test="username != null and !username.trim().equals('')">
and u.username like CONCAT('%',#{ username },'%')
</if>
<if test="userRole != 0">
and u.userRole = #{ userRole }
</if>
</where>
order by u.creationDate DESC limit #{ currentPageNo },#{ pageSize }
</select>
service层
//用户管理——查询记录数
public abstract int getUserCounts(String username, int userRole);
//根据条件 查询用户列表
public abstract List<User> getUserList(String QueryUserName, int QueryUserRole, int currentPageNo, int pageSize);
@Override
public int getUserCounts(String username, int userRole) {
return userMapper.getUserCounts(username,userRole);
}
@Override
public List<User> getUserList(String QueryUserName, int QueryUserRole, int currentPageNo, int pageSize) {
return userMapper.getUserList(QueryUserName,QueryUserRole,currentPageNo,pageSize);
}
controller层
前端head 页面 根据这个请求 跳转到 用户管理页面 查看用户列表 一开始不带参数 查全表
@Controller
@RequestMapping("/UserManager")
public class UserManagerController {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@Autowired
private PageSupport pageSupport;
/*
************************* 查询用户列表模块 *********************************
*/
/**
* @Des 去用户管理页面时 也需要查询用户信息
* @Author zzj
* @Date 2021/11/7/0007 14:09
**/
@GetMapping("/toUserManagerPage")
public String toUserManagerPage(String queryName, String queryUserRole, String pageIndex, HttpServletRequest request) {
//这里需要设置分页参数
//1、下面是默认要返回的分页信息 还没根据前端传来的做转化
int userRole = 0; // 用户角色 默认 为 0
int pageSize = 5; // 一页显式的数据量 默认为 5
int currentPageNo = 1; // 当前页码
int totalCount = 0; // 根据条件查询出来的记录总数量 默认为0
int totalPageCount = 0; // 全部数据量 算出 总共显示的页数
//2、根据前端传来的信息做转化 替换默认分页信息
if (queryUserRole != null && !queryUserRole.trim().equals("")) {
try {
userRole = Integer.parseInt(queryUserRole);
} catch (Exception e) {
e.printStackTrace();
}
}
if (pageIndex != null && !pageIndex.trim().equals("")) {
try {
currentPageNo = Integer.parseInt(pageIndex);
} catch (Exception e) {
e.printStackTrace();
}
}
//3、根据条件(用户名、用户角色)查询出来的记录总数量
totalCount = userService.getUserCounts(queryName, userRole);
//4、设置pageSupport的参数
pageSupport.setPageSize(pageSize); // 设置 页面容量
pageSupport.setTotalCount(totalCount); // 设置 总数量(表)
pageSupport.setCurrentPageNo(currentPageNo); // 设置 当前页码 来自于用户输入
//总共显示的页数
totalPageCount = pageSupport.getTotalPageCount();
//5、如果页数小于1,就显示第一页 页数大于 最后一页就 显示最后一页
if (currentPageNo < 1) {
currentPageNo = 1;
} else if (currentPageNo > totalPageCount) {
currentPageNo = totalPageCount;
}
//6、根据条件 查询用户列表
List<User> userList = userService.getUserList(queryName, userRole, (currentPageNo - 1) * pageSize, pageSize);
//将信息返回至前端页面
request.setAttribute("userList", userList);
//潮汕奴仔_优化: 这里加一步 判断此 列表是否为空 是则 清零页码信息 并返回
if(userList.size() == 0){
System.out.println("\n潮汕奴仔_优化\n");
request.setAttribute("queryUserName", queryName);
request.setAttribute("queryUserRole", queryUserRole);
request.setAttribute("totalPageCount",0);
request.setAttribute("totalCount",0);
request.setAttribute("currentPageNo",0);
return "userlist";
}
//7、查询用户角色列表
List<Role> roleList = roleService.getRoleList();
//将信息返回至前端页面
request.setAttribute("roleList", roleList);
//8、将所有信息返回至前端展示
request.setAttribute("queryUserName", queryName);
request.setAttribute("queryUserRole", queryUserRole);
request.setAttribute("totalPageCount", totalPageCount);
request.setAttribute("totalCount", totalCount);
request.setAttribute("currentPageNo", currentPageNo);
return "userlist";
}
}
相应的,userlist.jsp 页面的查询请求也要改变 这个请求可以带参数进行模糊查询
5.2:用户列表 查询指定用户信息 模块
从底层往上写 dao -> service -> controller
dao层
根据 用户id 去查询 用户的信息
<!--根据用户id 查询用户信息-->
<select id="findById" resultType="User">
select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.id = #{ id } and u.userRole = r.id
</select>
service层
controller层
可以看到前端页面 调用js 并将 userid 传递进去
js文件中 请求如下 跳转到 用户信息视图页面
那我们就开始在控制层写吧…
5.3:用户列表 修改用户详情模块
从底层往上写 dao -> service -> controller
dao层
根据 用户id 和 用户整体信息 进行修改
<!--用户管理模块中的子模块 —— 更改用户信息-->
<update id="modify">
update smbms_user set userName = #{ user.userName },gender = #{ user.gender },birthday =#{ user.birthday },phone = #{ user.phone },address = #{ user.address },userRole = #{ user.userRole },modifyBy = #{ user.modifyBy },modifyDate = #{ user.modifyDate } where id = #{ id }
</update>
service层
controller层
前端页面请求 将userid传给js文件
可以看到页面 调用js 并将 userid 传递进去
先去往 用户信息修改页面 然后根据用户id 查询用户原来的信息 并展示在用户修改页面
可以看到 usermodify.jsp 页面 收集数据后 执行请求
这才是最终修改用户信息的功能
// 修改用户
@PostMapping("/modifyUser")
public String modifyUser(String uid, String userName, String gender, String birthday, String phone, String address, String userRole, HttpServletRequest request) throws ParseException {
int id = 0;
try {
id = Integer.parseInt(uid);
} catch (Exception e) {
e.printStackTrace();
}
User user = new User();
user.setUserName(userName);
user.setGender(Integer.parseInt(gender));
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
user.setPhone(phone);
user.setAddress(address);
user.setUserRole(Integer.parseInt(userRole));
//注意这两个参数不在表单的填写范围内
user.setModifyBy(((User) request.getSession().getAttribute("userSession")).getId());
user.setModifyDate(new Date());
//要插入数据
boolean flag = userService.modify(id, user);
//如果执行成功了 到 用户管理页面(即 查询全部用户列表)
if (flag) {
return "redirect:/UserManager/toUserManagerPage";
}
return "redirect:/UserManager/toModifyUserPage/" + id;
}
5.4:用户列表 删除用户模块 模块
从底层往上写 dao -> service -> controller
dao层
根据 用户的id 去删除用户
service层
controller层
**前端页面请求 去往js文件 传入userid **
我们可以看到这个 ajax 请求 deleteUser/ 传入一个userid
删除用户模块代码
5.5:用户列表 添加用户模块
从底层往上写 dao -> service -> controller
dao层
将一整个User类型的对象存进数据库中
<!--用户管理模块中的 子模块 —— 添加用户-->
<insert id="addUser">
insert into smbms_user
(`userCode`,`userName`,`userPassword`,`gender`,`birthday`,`phone`,`address`,`userRole`,`createdBy`,`creationDate`)
values
(#{ userCode } , #{ userName } , #{ userPassword } , #{ gender } , #{ birthday } , #{ phone } , #{ address } , #{ userRole } , #{ createdBy } , #{ creationDate } )
</insert>
service层
controller层
**前端页面请求 **
去往 添加用户信息的页面
可以看到useradd.jsp 页面收集数据后 发送 添加请求
最终的添加代码
@PostMapping("/addUser")
public String addUser(String userCode, String userName, String userPassword, String gender, String birthday, String phone, String address, String userRole, HttpServletRequest request) throws ParseException {
//转换格式后 调用service层 添加用户
int resGender = 0;
int resUserRole = 0;
try {
resGender = Integer.parseInt(gender);
resUserRole = Integer.parseInt(userRole);
} catch (Exception e) {
e.printStackTrace();
}
User user = new User();
user.setUserCode(userCode);
user.setUserName(userName);
user.setUserPassword(userPassword);
user.setGender(resGender);
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
user.setPhone(phone);
user.setAddress(address);
user.setUserRole(resUserRole);
//注意这两个参数不在表单的填写范围内
user.setCreatedBy(((User) request.getSession().getAttribute("userSession")).getId());
user.setCreateDate(new Date());
boolean flag = userService.addUser(user);
if (flag) {
//说明执行成功 到 用户管理页面(即 查询全部用户列表)
return "redirect:/UserManager/toUserManagerPage";
} else {
//说明 添加失败 回到 添加页面
return "useradd";
}
}
5.6:用户列表 用户通用模块
从底层往上写 dao -> service -> controller
//验证是否存在 此userCode
@GetMapping(value = "/ifExistUserCode/{uCode}",produces = "application/json;charset=utf-8")
@ResponseBody
public String ifExistUserCode(@PathVariable("uCode") String userCode){
System.out.println("进入ifExistUserCode");
//根据此 userCode 查询是否有这个用户
boolean flag = userService.ifExistUserCode(userCode);
HashMap<String, String> map = new HashMap<>();
if(userCode==null || userCode.trim().equals("")){
map.put("userCode","NoWrite");
}else if(flag){
map.put("userCode","exist");
}
return JSONArray.toJSONString(map);
}
//用户管理模块中 子模块(表单中的用户角色下拉框)
@GetMapping(value = "/getRoleList", produces = "application/json;charset=utf-8")
@ResponseBody
public String getRoleList() {
List<Role> roleList = roleService.getRoleList();
//JSONArray 阿里巴巴的JSON工具类 用途就是:转换格式
return JSONArray.toJSONString(roleList);
}
至此 用户管理模块功能完成
六:供应商管理模块
6.1:供应商信息列表查询 模块
从底层往上写 dao -> service -> controller
dao层
需要 根据供应商编码 或 供应商名称 查询供应商总数 因为分页会用到
@Repository
public interface ProviderMapper {
// 根据供应商编码 或 供应商名称 查询供应商总数
public abstract int getProviderCounts(@Param("proCode") String queryProCode,@Param("proName") String queryProName);
// 根据 供应商编码 和 供应商名称 和 当前页码 页码size 查询供应商数据列表
public abstract List<Provider> getProviderList(@Param("proCode") String queryProCode,@Param("proName") String queryProName,@Param("currentPageNo") int currentPageNo,@Param("pageSize") int pageSize);
}
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--一个mapper对应一个接口-->
<mapper namespace="com.csnz.dao.Provider.ProviderMapper">
<!--根据供应商编码 或 供应商名称 查询供应商总数-->
<select id="getProviderCounts" resultType="int">
select count(1) from smbms_provider
<where>
<if test="proCode != null and !proCode.trim().equals('')">
and proCode = #{ proCode }
</if>
<if test="proName != null and !proName.trim().equals('')">
and proName like concat('%', #{ proName } , '%')
</if>
</where>
</select>
<!--根据 供应商编码 和 供应商名称 和 当前页码、页码size 查询供应商数据列表-->
<select id="getProviderList" resultType="Provider">
select * from smbms_provider
<where>
<if test="proCode != null and !proCode.trim().equals('')">
and proCode = #{ proCode }
</if>
<if test="proName != null and !proName.trim().equals('')">
and proName like concat('%', #{ proName } , '%')
</if>
</where>
order by creationDate DESC limit #{ currentPageNo }, #{ pageSize }
</select>
</mapper>
service层
import java.util.List;
@Service
public class ProviderServiceImpl implements ProviderService {
//service层调用dao层
@Autowired
private ProviderMapper providerMapper;
// 使用注解模式开发:对应类上加 @Service 和 @Autowired 此时就不用set方法注入了
// public void setProviderMapper(ProviderMapper providerMapper) {
// this.providerMapper = providerMapper;
// }
@Override
public int getProviderCounts(String queryProCode, String queryProName) {
return providerMapper.getProviderCounts(queryProCode,queryProName);
}
@Override
public List<Provider> getProviderList(String queryProCode, String queryProName, int currentPageNo, int pageSize) {
return providerMapper.getProviderList(queryProCode,queryProName,(currentPageNo-1)*pageSize,pageSize);
}
}
controller层
前端请求 跳转至 供应商管理页面 此时不带参数进行查询 也就是全表查询
@Controller
@RequestMapping("/Provider")
public class ProviderManagerController {
@Autowired
private ProviderService providerService;
@Autowired
private PageSupport pageSupport;
/*
************************* 查看供应商列表模块 *********************************
*/
/**
* @Des 供应商编码、供应商名称、pageIndex
* @Author zzj
* @Date 2021/11/8/0008 23:18
**/
@GetMapping("/toProviderPage")
public String toProviderPage(String queryProCode , String queryProName , String pageIndex , HttpServletRequest request){
//这里需要设置分页参数
//1、下面是默认要返回的分页信息 还没根据前端传来的做转化
int pageSize = 5; // 一页显式的数据量 默认为 5
int currentPageNo = 1; // 当前页码
int totalCount = 0; // 根据条件查询出来的记录总数量 默认为0
int totalPageCount = 0; // 全部数据量 算出 总共显示的页数
if(pageIndex != null && !pageIndex.trim().equals("")){
try {
currentPageNo = Integer.parseInt(pageIndex);
}catch (Exception e){
e.printStackTrace();
}
}
// 根据供应商编码 或 供应商名称 查询供应商总数
totalCount = providerService.getProviderCounts(queryProCode,queryProName);
//4、设置pageSupport的参数
pageSupport.setPageSize(pageSize); // 设置 页面容量
pageSupport.setTotalCount(totalCount); // 设置 总数量(表)
pageSupport.setCurrentPageNo(currentPageNo); // 设置 当前页码 来自于用户输入
//总共显示的页数
totalPageCount = pageSupport.getTotalPageCount();
//5、如果页数小于1,就显示第一页 页数大于 最后一页就 显示最后一页
if(currentPageNo<1){
currentPageNo =1;
}else if(currentPageNo>totalPageCount){
currentPageNo = totalPageCount;
}
//6、根据条件 查询供应商列表
List<Provider> providerList = providerService.getProviderList(queryProCode, queryProName, currentPageNo, pageSize);
//将信息返回至前端页面
request.setAttribute("providerList",providerList);
//潮汕奴仔_优化: 这里加一步 判断此 列表是否为空 是则 清零页码信息 并返回
if(providerList.size() == 0){
System.out.println("\n潮汕奴仔_优化\n");
request.setAttribute("queryProCode",queryProCode);
request.setAttribute("queryProName",queryProName);
request.setAttribute("totalPageCount",0);
request.setAttribute("totalCount",0);
request.setAttribute("currentPageNo",0);
return "providerlist";
}
//8、将所有信息返回至前端展示
request.setAttribute("queryProCode",queryProCode);
request.setAttribute("queryProName",queryProName);
request.setAttribute("totalPageCount",totalPageCount);
request.setAttribute("totalCount",totalCount);
request.setAttribute("currentPageNo",currentPageNo);
return "providerlist";
}
}
6.2:新添供应商模块
从底层往上写 dao -> service -> controller
dao层
将一个Provider类型的对象存入数据库
service层
controller层
看一下 前端请求 跳转至 添加供应商页面 进行信息填写
请求控制层跳转
provideradd.jsp页面收集信息 并发送请求进行提交
最终的供应商添加代码
6.3:查看供应商信息模块
从底层往上写 dao -> service -> controller
dao层
根据id 查询供应商信息
service层
controller层
先看看前端的请求 发现走的 js 并且带了providerId
请求地址 去往 供应商查看页面
6.4:修改供应商信息模块
从底层往上写 dao -> service -> controller
dao层
根据供应商 id 和 供应商对象 对 指定id的供应商进行修改
service层
controller层
先看看前端的请求 发现走的 js 并且带了providerId
发现这个请求 去到修改供应商的页面 它会根据此供应商id 先查询 供应商原有的信息 进行展示
去到这个页面后 搜集数据 并发送修改请求
最终的供应商修改代码
6.5:删除供应商模块
从底层往上写 dao -> service -> controller
dao层
根据供应商id 删除指定的供应商
service层
controller层
先看看前端的请求 发现走的 js 并且带了providerId
我们可以看看 ajax 的请求
最终的删除指定供应商 的代码
至此 供应商模块功能完成
七:订单管理模块
7.1:订单查询列表 模块
从底层往上写 dao -> service -> controller
dao层
需要 根据商品名称、供应商id、是否付款 查询订单总数 因为分页需要
@Repository
public interface BillMapper {
// 根据商品名称、供应商id、是否付款 查询订单总数
public abstract int getBillCount(@Param("productName") String queryProductName,@Param("providerId") int queryProviderId,@Param("isPayment") int queryIsPayment);
// 根据商品名称、供应商id、是否付款 查询订单列表
public abstract List<Bill> getBillList(@Param("productName") String queryProductName,@Param("providerId")int queryProviderId,@Param("isPayment")int queryIsPayment,@Param("currentPageNo") int currentPageNo,@Param("pageSize") int pageSize);
}
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--一个mapper对应一个接口-->
<mapper namespace="com.csnz.dao.Bill.BillMapper">
<!--根据商品名称、供应商id、是否付款 查询订单总数-->
<select id="getBillCount" resultType="int">
select count(1) from smbms_bill b , smbms_provider p
<where>
b.providerId = p.id
<if test= "productName != null and !productName.trim().equals('')">
and b.productName like concat('%', #{ productName},'%')
</if>
<if test= "providerId != 0">
and b.providerId = #{ providerId }
</if>
<if test= "isPayment != 0">
and b.isPayment = #{ isPayment }
</if>
</where>
</select>
<!--根据商品名称、供应商id、是否付款、当前页码、总页数 查询订单列表-->
<select id = "getBillList" resultType="Bill">
select b.* , p.proName as providerName from smbms_bill b,smbms_provider p
<where>
b.providerId = p.id
<if test= "productName != null and !productName.trim().equals('')">
and b.productName like concat('%', #{ productName} , '%')
</if>
<if test= "providerId != 0">
and b.providerId = #{ providerId }
</if>
<if test= "isPayment != 0">
and b.isPayment = #{ isPayment }
</if>
</where>
order by b.creationDate desc limit #{ currentPageNo } , #{ pageSize }
</select>
</mapper>
service层
public interface BillService {
//根据商品名称、供应商id、是否付款 查询订单总数
public abstract int getBillCount(String queryProductName,int queryProviderId,int queryIsPayment);
//根据商品名称、供应商id、是否付款 查询订单列表
public abstract List<Bill> getBillList(String queryProductName, int queryProviderId, int queryIsPayment, int currentPageNo, int pageSize);
}
@Service
public class BillServiceImpl implements BillService {
//service层调用dao层
@Autowired
private BillMapper billMapper;
// 使用注解模式开发:对应类上加 @Service 和 @Autowired 此时就不用set方法注入了
// public void setBillMapper(BillMapper billMapper) {
// this.billMapper = billMapper;
// }
@Override
public int getBillCount(String queryProductName, int queryProviderId, int queryIsPayment) {
return billMapper.getBillCount(queryProductName,queryProviderId,queryIsPayment);
}
@Override
public List<Bill> getBillList(String queryProductName, int queryProviderId, int queryIsPayment, int currentPageNo, int pageSize) {
return billMapper.getBillList(queryProductName,queryProviderId,queryIsPayment,(currentPageNo-1)*pageSize,pageSize);
}
}
controller层
前端页面请求 去往订单管理页面 此时不带参数 进行全表查询
//进入订单管理页面
@GetMapping("/toBillManagerPage")
public String toBillManagerPage(String queryProductName, String queryProviderId, String queryIsPayment,String pageIndex, HttpServletRequest request){
//这里需要设置分页参数
//1、下面是默认要返回的分页信息 还没根据前端传来的做转化
int resProviderId = 0;
int resIsPayment = 0;
int pageSize = 5; // 一页显式的数据量 默认为 5
int currentPageNo = 1; // 当前页码
int totalCount = 0; // 根据条件查询出来的记录总数量 默认为0
int totalPageCount = 0; // 全部数据量 算出 总共显示的页数
//2、根据前端传来的信息做转化 替换默认分页信息
if(queryProductName == null){
queryProductName = "";
}
if(queryProviderId != null && !queryProviderId.trim().equals("")){
try {
resProviderId = Integer.parseInt(queryProviderId);
}catch (Exception e){
e.printStackTrace();
}
}
if(queryIsPayment != null && !queryIsPayment.trim().equals("")){
try {
resIsPayment = Integer.parseInt(queryIsPayment);
}catch (Exception e){
e.printStackTrace();
}
}
if(pageIndex != null && !pageIndex.trim().equals("")){
try {
currentPageNo = Integer.parseInt(pageIndex);
}catch (Exception e){
e.printStackTrace();
}
}
//3、根据商品名称、供应商id、是否付款 查询订单总数
totalCount = billService.getBillCount(queryProductName, resProviderId, resIsPayment);
//4、设置pageSupport的参数
pageSupport.setPageSize(pageSize); // 设置 页面容量
pageSupport.setTotalCount(totalCount); // 设置 总数量(表)
pageSupport.setCurrentPageNo(currentPageNo); // 设置 当前页码 来自于用户输入
//总共显示的页数
totalPageCount = pageSupport.getTotalPageCount();
//5、如果页数小于1,就显示第一页 页数大于 最后一页就 显示最后一页
if(currentPageNo<1){
currentPageNo =1;
}else if(currentPageNo>totalPageCount){
currentPageNo = totalPageCount;
}
//6、根据条件 查询订单列表
List<Bill> billList = billService.getBillList(queryProductName, resProviderId, resIsPayment, currentPageNo, pageSize);
//将信息返回至前端页面
request.setAttribute("billList",billList);
//7、查询供应商列表
int providerCounts = providerService.getProviderCounts("", "");
List<Provider> providerList = providerService.getProviderList("", "", 1, providerCounts);
//将信息返回至前端页面
request.setAttribute("providerList",providerList);
//潮汕奴仔_优化: 这里加一步 判断此 列表是否为空 是则 清零页码信息 并返回
if(billList.size() == 0){
System.out.println("\n潮汕奴仔_优化\n");
request.setAttribute("queryProductName",queryProductName);
request.setAttribute("queryProviderId",queryProviderId);
request.setAttribute("queryIsPayment",queryIsPayment);
request.setAttribute("totalPageCount",0);
request.setAttribute("totalCount",0);
request.setAttribute("currentPageNo",0);
return "billlist";
}
//8、将所有信息返回至前端展示
request.setAttribute("queryProductName",queryProductName);
request.setAttribute("queryProviderId",queryProviderId);
request.setAttribute("queryIsPayment",queryIsPayment);
request.setAttribute("totalPageCount",totalPageCount);
request.setAttribute("totalCount",totalCount);
request.setAttribute("currentPageNo",currentPageNo);
return "billlist";
}
然后跳转到 billlist页面 同时 billlist页面的搜索请求也是一样的 只是这个请求可以带参数进行具体查询
7.2:新添订单模块
从底层往上写 dao -> service -> controller
dao层
将一个Bill 类型的对象存入数据库
<!--新添订单-->
<insert id="addBill">
insert into smbms_bill
(`billCode`,`productName`,`productDesc`,`productUnit`,`productCount`,`totalPrice`,`isPayment`,`createdBy`,`creationDate`,`providerId`)
values
( #{ bill.billCode } , #{ bill.productName } , #{ bill.productDesc } , #{ bill.productUnit } , #{ bill.productCount } , #{ bill.totalPrice } , #{ bill.isPayment } , #{ bill.createdBy } , #{ bill.creationDate } , #{ bill.providerId })
</insert>
service层
controller层
前端页面请求 先跳转至 添加订单页面 进行信息的填报
跳转到新添订单页面
收集信息后 执行 addBill 请求 完成添加功能
7.3:查看具体订单信息模块
从底层往上写 dao -> service -> controller
dao层
根据订单id 查询具体订单信息
service层
controller层
前端页面请求
可以看到页面 调用js 并将 billid 传递进去
有一个去往订单信息展示页的请求
查询信息后 跳转到 订单信息查看页面 进行展示
7.4:修改订单模块
从底层往上写 dao -> service -> controller
dao层
根据 订单id 和 订单类型的对象 对指定id 的订单进行修改
<!--修改 订单信息-->
<update id="updateBill">
update smbms_bill set `billCode` = #{ bill.billCode }, `productName` = #{ bill.productName},`productDesc` = #{ bill.productDesc},`productUnit` = #{ bill.productUnit},`productCount` = #{ bill.productCount },`totalPrice` = #{ bill.totalPrice },`isPayment` = #{ bill.isPayment},`modifyBy` = #{ bill.modifyBy },`modifyDate` = #{ bill.modifyDate} where id = #{ billId }
</update>
service层
controller层
前端页面请求 携带订单id
去往 订单修改页面(顺带查询指定id订单信息)
收集信息后 跳转至修改请求 进行订单修改
//修改订单信息
@PostMapping("/modifyBill")
public String modifyBill(String billid ,Bill bill,HttpServletRequest request){
int id = Integer.parseInt(billid);
bill.setModifyBy(((User)request.getSession().getAttribute("userSession")).getId());
bill.setModifyDate(new Date());
boolean flag = billService.updateBill(id, bill);
if (flag) {
return "redirect:/Bill/toBillManagerPage";
}else{
return "billmodify";
}
}
7.5:删除订单模块
从底层往上写 dao -> service -> controller
dao层
根据订单id 对指定订单进行删除操作
service层
controller层
前端页面请求 携带订单id 进行删除
可以看到页面 调用js 并将 billid 传递进去
最终删除指定订单的代码
至此 订单管理模块 功能完成
八:角色管理模块
获取用户角色列表
从底层往上写 dao -> service -> controller
dao层
/*
@Repository作用:把资源让Spring来管理,相当于在xml中配置了一个bean
value属性指定bean的id,如果不指定,默认id为当前类的类名(首字母小写) roleMapper
*/
@Repository
public interface RoleMapper {
// 获取用户角色列表
public abstract List<Role> getRoleList();
}
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 一个mapper对应一个接口 -->
<mapper namespace="com.csnz.dao.Role.RoleMapper">
<!--获取用户角色列表-->
<select id="getRoleList" resultType="Role">
select * from smbms_role
</select>
</mapper>
service层
public interface RoleService {
// 获取用户角色列表
public abstract List<Role> getRoleList();
}
@Service
public class RoleServiceImpl implements RoleService {
//业务层调用dao层
@Autowired
private RoleMapper roleMapper;
// 使用注解模式开发:对应类上加 @Service 和 @Autowired 此时就不用set方法注入了
// public void setRoleMapper(RoleMapper roleMapper) {
// this.roleMapper = roleMapper;
// }
@Override
public List<Role> getRoleList() {
return roleMapper.getRoleList();
}
}
它在用户管理模块就用到了
至此 项目整体搭建完毕 这不赶紧启动玩它一波?
项目整体结构: