SSM(spring+springmvc+mybatis)BOOT客户管理系统整合案例

68 篇文章 0 订阅
40 篇文章 0 订阅

新建maven项目

 

 

 导入依赖

<?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>com.shrimpking</groupId>
    <artifactId>springtest14</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>t01</module>
        <module>t02-newspublish</module>
        <module>t03</module>
        <module>t04</module>
        <module>t05-boot</module>
        <module>t05-boot</module>
        <module>t06-boot</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version> 1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.4</version>
        </dependency>
        <dependency>
            <groupId>ognl</groupId>
            <artifactId>ognl</artifactId>
            <version>3.1.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.22</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-impl</artifactId>
            <version>1.2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-spec</artifactId>
            <version>1.2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
</project>

数据库

drop table if exists b_user;
create table b_user(
	userId int auto_increment primary key comment '用户id',
	userCode varchar(32) comment '用户账号',
	userName varchar(50) comment '用户名称',
	userPwd varchar(32) comment '用户密码',
	userState varchar(1) comment '用户状态,1正常,0暂停'
) comment '系统用户表';

insert into b_user(userCode,userName,userPwd,userState) values ('user1','张','1234','1');
insert into b_user(userCode,userName,userPwd,userState) values ('user2','王','1234','1');
insert into b_user(userCode,userName,userPwd,userState) values ('user3','李','1234','1');
insert into b_user(userCode,userName,userPwd,userState) values ('user4','赵','1234','0');

drop table if exists b_customer;
create table b_customer(
	cusId int auto_increment primary key comment '客户编号',
	cusName varchar(50) comment '客户名称',
	cusUserId int comment '负责人id',
	cusCreateId int comment '创建人id',
	cusSource varchar(50) comment '客户信息来源',
	cusIndustry varchar(50) comment '客户所属行业',
	cusLevel varchar(32) comment '客户级别',
	cusLinkMan varchar(50) comment '联系人',
	cusPhone varchar(64) comment '固定电话',
	cusMobile varchar(16) comment '移动电话',
	cusZipCode varchar(10) comment '邮政编码',
	cusAddress varchar(100) comment '联系地址',
	cusCreateTime datetime default current_timestamp comment '创建时间'
) comment '客户信息表';

insert into b_customer(cusName,cusUserId,cusCreateId,cusSource,cusIndustry,cusLevel,cusLinkMan,cusPhone,cusMobile,cusZipCode,cusAddress) values
('腾讯',1,1,'d004','d005','d006','马化腾','111111','18011111111','000000','深圳市城中村');
insert into b_customer(cusName,cusUserId,cusCreateId,cusSource,cusIndustry,cusLevel,cusLinkMan,cusPhone,cusMobile,cusZipCode,cusAddress) values
('阿里巴巴',1,1,'d004','d005','d006','马云','111111','18011111111','000000','杭州市城中村');
insert into b_customer(cusName,cusUserId,cusCreateId,cusSource,cusIndustry,cusLevel,cusLinkMan,cusPhone,cusMobile,cusZipCode,cusAddress) values
('字节跳动',1,1,'d004','d005','d006','张一鸣','111111','18011111111','000000','北京市城中村');

drop table if exists b_basedict;
create table b_basedict(
	dicId varchar(32) primary key comment '字典id',
	dicTypeCode varchar(10) comment '字典类别代码',
	dicTypeName varchar(50) comment '字典类别名称',
	dicItemName varchar(50) comment '字典项名称',
	dicItemCode varchar(10) comment '字典项代码',
	dicSort int comment '排序字段',
	dicEnable char(1) comment '是否使用,1使用,0停用',
	dicMemo varchar(100) comment '备注'
) comment '数据字典表';

insert into b_basedict(dicId,dicTypeCode,dicTypeName,dicItemName,dicItemCode,dicSort,dicEnable,dicMemo) values 
('d001','A1','城市','杭州','hangzhou',1,1,'');
insert into b_basedict(dicId,dicTypeCode,dicTypeName,dicItemName,dicItemCode,dicSort,dicEnable,dicMemo) values 
('d002','A1','城市','大连','dalian',1,1,'');
insert into b_basedict(dicId,dicTypeCode,dicTypeName,dicItemName,dicItemCode,dicSort,dicEnable,dicMemo) values 
('d003','A2','区域','余杭区','yuhang',1,1,'');
insert into b_basedict(dicId,dicTypeCode,dicTypeName,dicItemName,dicItemCode,dicSort,dicEnable,dicMemo) values 
('d004','002','客户来源','行业介绍','jieshao',1,1,'');
insert into b_basedict(dicId,dicTypeCode,dicTypeName,dicItemName,dicItemCode,dicSort,dicEnable,dicMemo) values 
('d005','001','所属行业','零售业','lingshou',1,1,'');
insert into b_basedict(dicId,dicTypeCode,dicTypeName,dicItemName,dicItemCode,dicSort,dicEnable,dicMemo) values 
('d006','006','客户级别','大客户','dakehu',1,1,'');

select dicId,dicItemName from b_basedict where dicTypeCode='002'






配置文件

applicationContext.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:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 读取db.properties   -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- dbcp数据源   -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxTotal" value="${jdbc.maxTotal}"/>
        <property name="maxIdle" value="${jdbc.maxIdle}"/>
        <property name="initialSize" value="${jdbc.initialSize}"/>
    </bean>
    <!--事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 开启事务注解   -->
<!--    <tx:annotation-driven transaction-manager="transactionManager"/>-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="create*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.shrimpking.service.*.*(..))"/>
    </aop:config>
    <!--配置mybatis工厂-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    <!-- 配置mapper扫描器   -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.shrimpking.mapper"/>
    </bean>
    <!-- 扫描service   -->
    <context:component-scan base-package="com.shrimpking.service"/>
</beans>

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=UTC
jdbc.username=root
jdbc.password=mysql123
jdbc.maxTotal=30
jdbc.maxIdle=10
jdbc.initialSize=5

log4j.properties

log4j.rootLogger=ERROR,stdout
log4j.logger.com.shrimpking=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

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>

    <!--  起别名  -->
    <typeAliases>
        <package name="com.shrimpking.pojo"/>
    </typeAliases>

</configuration>

resource.properties

//客户来源
customer.from.type=002
//所属行业
customer.industry.type=001
//客户级别,对应数据字典表dicTypeCode字段
customer.level.type=006

springmvc-config.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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 加载属性文件   -->
    <context:property-placeholder location="classpath:resource.properties"/>

    <!-- 指定需要扫描的包   -->
    <context:component-scan base-package="com.shrimpking.controller"/>
    <!-- 配置注解驱动  -->
    <mvc:annotation-driven/>
    <!-- 静态资源放行   -->
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>
    <mvc:resources mapping="/css/**" location="/WEB-INF/css/"/>
    <mvc:resources mapping="/fonts/**" location="/WEB-INF/fonts"/>
    <mvc:resources mapping="/images/" location="/WEB-INF/images"/>
    <!-- 配置拦截器   -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.shrimpking.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
    <!-- 视图解析器   -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

web.xml

<?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">

    <!-- 配置加载spring文件的监听器   -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 编码过滤器,解决中文乱码   -->
    <filter>
        <filter-name>encoding</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>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 配置前端过滤器   -->
    <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:springmvc-config.xml</param-value>
        </init-param>
        <!-- 服务器启动时立即加载springmvc配置       -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- /表示拦截所有请求,jsp除外       -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

实体类

User.java

package com.shrimpking.pojo;

import java.io.Serializable;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 10:58
 * 用户类
 */
public class User implements Serializable
{
    private static final long serialVersionUID = 1L;

    private Integer userId;
    private String userCode;
    private String userName;
    private String userPwd;
    private String userState;

    public Integer getUserId()
    {
        return userId;
    }

    public void setUserId(Integer userId)
    {
        this.userId = userId;
    }

    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 getUserPwd()
    {
        return userPwd;
    }

    public void setUserPwd(String userPwd)
    {
        this.userPwd = userPwd;
    }

    public String getUserState()
    {
        return userState;
    }

    public void setUserState(String userState)
    {
        this.userState = userState;
    }

    @Override
    public String toString()
    {
        return "User{" + "userId=" + userId + ", userCode='" + userCode + '\'' + ", userName='" + userName + '\'' + ", userPwd='" + userPwd + '\'' + ", userState='" + userState + '\'' + '}';
    }
}

BaseDict.java

package com.shrimpking.pojo;

import java.io.Serializable;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 12:14
 * 数据字典类
 */
public class BaseDict implements Serializable
{
    private static final long serialVersionUID=1L;

    private String dicId;
    private String dicTypeCode;
    private String dicTypeName;
    private String dicItemName;
    private String dicItemCode;
    private Integer dicSort;
    private String dicEnable;
    private String dicMemo;

    public String getDicId()
    {
        return dicId;
    }

    public void setDicId(String dicId)
    {
        this.dicId = dicId;
    }

    public String getDicTypeCode()
    {
        return dicTypeCode;
    }

    public void setDicTypeCode(String dicTypeCode)
    {
        this.dicTypeCode = dicTypeCode;
    }

    public String getDicTypeName()
    {
        return dicTypeName;
    }

    public void setDicTypeName(String dicTypeName)
    {
        this.dicTypeName = dicTypeName;
    }

    public String getDicItemName()
    {
        return dicItemName;
    }

    public void setDicItemName(String dicItemName)
    {
        this.dicItemName = dicItemName;
    }

    public String getDicItemCode()
    {
        return dicItemCode;
    }

    public void setDicItemCode(String dicItemCode)
    {
        this.dicItemCode = dicItemCode;
    }

    public Integer getDicSort()
    {
        return dicSort;
    }

    public void setDicSort(Integer dicSort)
    {
        this.dicSort = dicSort;
    }

    public String getDicEnable()
    {
        return dicEnable;
    }

    public void setDicEnable(String dicEnable)
    {
        this.dicEnable = dicEnable;
    }

    public String getDicMemo()
    {
        return dicMemo;
    }

    public void setDicMemo(String dicMemo)
    {
        this.dicMemo = dicMemo;
    }

    @Override
    public String toString()
    {
        return "BaseDict{" + "dicId='" + dicId + '\'' + ", dicTypeCode='" + dicTypeCode + '\'' + ", dicTypeName='" + dicTypeName + '\'' + ", dicItemName='" + dicItemName + '\'' + ", dicItemCode='" + dicItemCode + '\'' + ", dicSort=" + dicSort + ", dicEnable='" + dicEnable + '\'' + ", dicMemo='" + dicMemo + '\'' + '}';
    }
}

Customer.java

package com.shrimpking.pojo;


import java.io.Serializable;
import java.util.Date;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 12:04
 * 客户类
 */
public class Customer implements Serializable
{
    private static final long serialVersionUID=1L;

    private Integer cusId;
    private String cusName;
    private Integer cusUserId;
    private Integer cusCreateId;
    private String cusSource;
    private String cusIndustry;
    private String cusLevel;
    private String cusLinkMan;
    private String cusPhone;
    private String cusMobile;
    private String cusZipCode;
    private String cusAddress;
    private Date cusCreateTime;
    //分页起始行
    private Integer start;
    //分页选取行数
    private Integer rows;

    public Integer getCusId()
    {
        return cusId;
    }

    public void setCusId(Integer cusId)
    {
        this.cusId = cusId;
    }

    public String getCusName()
    {
        return cusName;
    }

    public void setCusName(String cusName)
    {
        this.cusName = cusName;
    }

    public Integer getCusUserId()
    {
        return cusUserId;
    }

    public void setCusUserId(Integer cusUserId)
    {
        this.cusUserId = cusUserId;
    }

    public Integer getCusCreateId()
    {
        return cusCreateId;
    }

    public void setCusCreateId(Integer cusCreateId)
    {
        this.cusCreateId = cusCreateId;
    }

    public String getCusSource()
    {
        return cusSource;
    }

    public void setCusSource(String cusSource)
    {
        this.cusSource = cusSource;
    }

    public String getCusIndustry()
    {
        return cusIndustry;
    }

    public void setCusIndustry(String cusIndustry)
    {
        this.cusIndustry = cusIndustry;
    }

    public String getCusLevel()
    {
        return cusLevel;
    }

    public void setCusLevel(String cusLevel)
    {
        this.cusLevel = cusLevel;
    }

    public String getCusLinkMan()
    {
        return cusLinkMan;
    }

    public void setCusLinkMan(String cusLinkMan)
    {
        this.cusLinkMan = cusLinkMan;
    }

    public String getCusPhone()
    {
        return cusPhone;
    }

    public void setCusPhone(String cusPhone)
    {
        this.cusPhone = cusPhone;
    }

    public String getCusMobile()
    {
        return cusMobile;
    }

    public void setCusMobile(String cusMobile)
    {
        this.cusMobile = cusMobile;
    }

    public String getCusZipCode()
    {
        return cusZipCode;
    }

    public void setCusZipCode(String cusZipCode)
    {
        this.cusZipCode = cusZipCode;
    }

    public String getCusAddress()
    {
        return cusAddress;
    }

    public void setCusAddress(String cusAddress)
    {
        this.cusAddress = cusAddress;
    }

    public Date getCusCreateTime()
    {
        return cusCreateTime;
    }

    public void setCusCreateTime(Date cusCreateTime)
    {
        this.cusCreateTime = cusCreateTime;
    }

    public Integer getStart()
    {
        return start;
    }

    public void setStart(Integer start)
    {
        this.start = start;
    }

    public Integer getRows()
    {
        return rows;
    }

    public void setRows(Integer rows)
    {
        this.rows = rows;
    }

    @Override
    public String toString()
    {
        return "Customer{" + "cusId=" + cusId + ", cusName='" + cusName + '\'' + ", cusUserId=" + cusUserId + ", cusCreateId=" + cusCreateId + ", cusSource='" + cusSource + '\'' + ", cusIndustry='" + cusIndustry + '\'' + ", cusLevel='" + cusLevel + '\'' + ", cusLinkMan='" + cusLinkMan + '\'' + ", cusPhone='" + cusPhone + '\'' + ", cusMobile='" + cusMobile + '\'' + ", cusZipCode='" + cusZipCode + '\'' + ", cusAddress='" + cusAddress + '\'' + ", cusCreateTime=" + cusCreateTime + '}';
    }
}

Mapper层

UserMapper.java

package com.shrimpking.mapper;

import com.shrimpking.pojo.User;
import org.apache.ibatis.annotations.Param;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 11:03
 */
public interface UserMapper
{
    //通过用户名和密码查询用户
    public User selectUser(
            @Param("userCode") String userCode,
            @Param("password") String password);


}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.shrimpking.mapper.UserMapper">

    <!--  通过用户名和用户密码查询  -->
    <select id="selectUser" parameterType="string"
            resultType="user">
        select userId,userCode,userName,userPwd,userState
        from b_user
        where userCode=#{userCode} and userPwd=#{password} and userState = 1
    </select>

</mapper>

BaseDictMapper.java

package com.shrimpking.mapper;

import com.shrimpking.pojo.BaseDict;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 12:52
 */
public interface BaseDictMapper
{
    //根据类别代码查询数据字典
    public List<BaseDict> selectBaseDictByTypeCode(String typeCode);


}

BaseDictMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.shrimpking.mapper.BaseDictMapper">

    <!-- 根据类别代码查询数据字典   -->
    <select id="selectBaseDictByTypeCode" parameterType="string"
            resultType="baseDict">
        select dicId,dicTypeCode,dicTypeName,dicItemName,dicItemCode,dicSort,
        dicEnable,dicMemo from b_basedict
        where dicTypeCode = #{dicTypeCode}
    </select>

</mapper>

CustomerMapper.java

package com.shrimpking.mapper;

import com.shrimpking.pojo.Customer;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 12:19
 */
public interface CustomerMapper
{
    //获取客户列表
    public List<Customer> selectCustomerList(Customer customer);

    //获取客户数
    public Integer selectCustomerCount(Customer customer);
}

CustomerMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.shrimpking.mapper.CustomerMapper">

    <!-- 公共字段   -->
    <sql id="commons_sql">
        cusId,
        cusName,
        cusUserId,
        cusCreateId,
        cusSource,
        cusIndustry,
        cusLevel,
        cusLinkMan,
        cusPhone,
        cusMobile,
        cusZipCode,
        cusAddress,
        cusCreateTime
    </sql>

    <sql id="selectCustomerListWhere">
        <where>
            <if test="cusName != null and cusName != ''">
                and cusName like concat('%',#{cusName},'%')
            </if>
            <if test="cusSource != null and cusSource != ''">
                and cusSource = #{cusSource}
            </if>
            <if test="cusIndustry != null and cusIndustry != ''">
                and cusIndustry = #{cusIndustry}
            </if>
            <if test="cusLevel != null and cusLevel != ''">
                and cusLevel = #{cusLevel}
            </if>
        </where>
    </sql>

    <!-- 获取客户列表   -->
    <select id="selectCustomerList" parameterType="customer"
            resultType="customer">
        select
        a.cusId,
        a.cusName,
        a.cusUserId,
        a.cusCreateId,
        b.dicItemName as cusSource,
        c.dicItemName as cusIndustry,
        d.dicItemName as cusLevel,
        a.cusLinkMan,
        a.cusPhone,
        a.cusMobile,
        a.cusZipCode,
        a.cusAddress,
        a.cusCreateTime
        from b_customer a
        left join (select dicId,dicItemName from b_basedict where dicTypeCode='002') b
        on a.cusSource = b.dicId
        left join (select dicId,dicItemName from b_basedict where dicTypeCode='001') c
        on a.cusIndustry = c.dicId
        left join (select dicId,dicItemName from b_basedict where dictypeCode='006') d
        on a.cusLevel = d.dicId
        <include refid="selectCustomerListWhere"/>
        <if test="start != null and rows != null">
            limit #{start},#{rows}
        </if>
    </select>

    <!-- 获取客户数   -->
    <select id="selectCustomerCount" parameterType="customer"
            resultType="integer">
        select count(*) from b_customer
        <include refid="selectCustomerListWhere"/>
    </select>


</mapper>

service层

UserService.java

package com.shrimpking.service;

import com.shrimpking.pojo.User;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 11:10
 */
public interface UserService
{
    //通过用户名和用户密码获取用户
    public User getUser(String userCode,String password);
}

UserServiceImpl.java

package com.shrimpking.service.impl;

import com.shrimpking.mapper.UserMapper;
import com.shrimpking.pojo.User;
import com.shrimpking.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 11:11
 */
@Service
@Transactional
public class UserServiceImpl implements UserService
{
    @Autowired
    private UserMapper userMapper;


    @Override
    public User getUser(String userCode, String password)
    {
        return userMapper.selectUser(userCode,password);
    }
}

CustomerService.java

package com.shrimpking.service;

import com.shrimpking.pojo.Customer;
import com.shrimpking.utils.Page;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 19:01
 */
public interface CustomerService
{
    //查询客户列表
    public Page<Customer> getCustomerList(
            Integer page,
            Integer rows,
            String cusName,
            String cusSource,
            String cusIndustry,
            String cusLevel);

}

CustomerServiceImpl.java

package com.shrimpking.service.impl;


import com.shrimpking.mapper.CustomerMapper;
import com.shrimpking.pojo.Customer;
import com.shrimpking.service.CustomerService;
import com.shrimpking.utils.Page;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 19:06
 */
@Service
@Transactional
public class CustomerServiceImpl implements CustomerService
{
    @Autowired
    private CustomerMapper customerMapper;

    @Override
    public Page<Customer> getCustomerList(Integer page, Integer rows, String cusName, String cusSource, String cusIndustry, String cusLevel)
    {
        Customer customer = new Customer();
        if(StringUtils.isNotBlank(cusName)){
            customer.setCusName(cusName);
        }
        if(StringUtils.isNoneBlank(cusSource)){
            customer.setCusSource(cusSource);
        }
        if(StringUtils.isNotBlank(cusIndustry)){
            customer.setCusIndustry(cusIndustry);
        }
        if(StringUtils.isNotBlank(cusLevel)){
            customer.setCusLevel(cusLevel);
        }
        customer.setStart((page-1)* rows);
        customer.setRows(rows);
        //查询客户列表
        List<Customer> customers = customerMapper.selectCustomerList(customer);
        //查询客户列表总数
        Integer count = customerMapper.selectCustomerCount(customer);
        Page<Customer> result = new Page<>();
        result.setPage(page);
        result.setRows(customers);
        result.setSize(rows);
        result.setTotal(count);
        return result;
    }
}

BaseDictService.java

package com.shrimpking.service;

import com.shrimpking.pojo.BaseDict;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 19:00
 */
public interface BaseDictService
{
    //根据类别代码查询数据字典
    public List<BaseDict> getBaseDictByTypeCode(String typeCode);

}

BaseDictServiceImpl.java

package com.shrimpking.service.impl;

import com.shrimpking.mapper.BaseDictMapper;
import com.shrimpking.pojo.BaseDict;
import com.shrimpking.service.BaseDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 19:04
 */
@Service
public class BaseDictServiceImpl implements BaseDictService
{
    @Autowired
    private BaseDictMapper baseDictMapper;

    @Override
    public List<BaseDict> getBaseDictByTypeCode(String typeCode)
    {
        return baseDictMapper.selectBaseDictByTypeCode(typeCode);
    }
}

Controller层

UserController.java

package com.shrimpking.controller;

import com.shrimpking.pojo.User;
import com.shrimpking.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpSession;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 11:14
 */
@Controller
public class UserController
{
    @Autowired
    private UserService userService;

    //用户登录
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public String login(
            String userCode,
            String password,
            Model model,
            HttpSession session)
    {
        User user = userService.getUser(userCode,password);
        if(user != null)
        {
            session.setAttribute("user_session",user);
            return "redirect:customer/list";
        }
        model.addAttribute("msg","账号或密码错误,请重新输入");
        return "login";
    }

    //转向登录页
    @RequestMapping("/toLogin")
    public String toLogin()
    {
        return "login";
    }

    //转向客户页
    @RequestMapping("/toCustomer")
    public String toCustomer()
    {
        return "customer";
    }

    //退出登录
    @RequestMapping("/logout")
    public String logout(HttpSession session){
        //清除session
        session.invalidate();
        return "redirect:toLogin";
    }
}

CustomerController.java

package com.shrimpking.controller;

import com.shrimpking.pojo.BaseDict;
import com.shrimpking.pojo.Customer;
import com.shrimpking.service.BaseDictService;
import com.shrimpking.service.CustomerService;
import com.shrimpking.utils.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 19:17
 * 客户控制类
 */
@Controller
public class CustomerController
{

    @Autowired
    private CustomerService customerService;

    @Autowired
    private BaseDictService baseDictService;

    //客户来源
    @Value("${customer.from.type}")
    private String FROM_TYPE;

    //客户所属行业
    @Value("${customer.industry.type}")
    private String INDUSTRY_TYPE;

    //客户级别
    @Value("${customer.level.type}")
    private String LEVEL_TYPE;

    @RequestMapping(value = "/customer/list",method = RequestMethod.GET)
    public String list(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer rows,
            String cusName,
            String cusSource,
            String cusIndustry,
            String cusLevel,
            Model model
    )
    {
        Page<Customer> customerList = customerService.getCustomerList(page, rows, cusName, cusSource, cusIndustry, cusLevel);
        model.addAttribute("page",customerList);

        //客户来源
        List<BaseDict> fromType = baseDictService.getBaseDictByTypeCode(FROM_TYPE);
        //客户所属行业
        List<BaseDict> industryType = baseDictService.getBaseDictByTypeCode(INDUSTRY_TYPE);
        //客户级别
        List<BaseDict> levelType = baseDictService.getBaseDictByTypeCode(LEVEL_TYPE);
        System.out.println(fromType);

        model.addAttribute("fromType",fromType);
        model.addAttribute("industryType",industryType);
        model.addAttribute("levelType",levelType);
        model.addAttribute("cusName",cusName);
        model.addAttribute("cusSource",cusSource);
        model.addAttribute("cusIndustry",cusIndustry);
        model.addAttribute("cusLevel",cusLevel);
        return "customer";
    }
}

interceptor层

LoginInterceptor.java

package com.shrimpking.interceptor;

import com.shrimpking.pojo.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 11:44
 * 登录拦截器
 */
public class LoginInterceptor implements HandlerInterceptor
{
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception
    {
        //获取请求的URL
        String url = httpServletRequest.getRequestURI();
        if(url.indexOf("/toLogin") >= 0){
            return true;
        }
        if(url.indexOf("/login") >= 0){
            return true;
        }

        HttpSession session = httpServletRequest.getSession();
        User user = (User)session.getAttribute("user_session");
        if(user != null){
            return true;
        }
        httpServletRequest.setAttribute("msg","尚未登录,请先登录");
        httpServletRequest.getRequestDispatcher("/toLogin").forward(httpServletRequest,httpServletResponse);

        return false;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception
    {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception
    {

    }
}

Utils

Page.java

package com.shrimpking.utils;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/7/26 13:04
 * 分页类
 */
public class Page<T>
{
    //总条数
    private int total;
    //当前页
    private int page;
    //每页数
    private int size;
    //结果集
    private List<T> rows;

    public int getTotal()
    {
        return total;
    }

    public void setTotal(int total)
    {
        this.total = total;
    }

    public int getPage()
    {
        return page;
    }

    public void setPage(int page)
    {
        this.page = page;
    }

    public int getSize()
    {
        return size;
    }

    public void setSize(int size)
    {
        this.size = size;
    }

    public List<T> getRows()
    {
        return rows;
    }

    public void setRows(List<T> rows)
    {
        this.rows = rows;
    }

    @Override
    public String toString()
    {
        return "Page{" + "total=" + total + ", page=" + page + ", size=" + size + ", rows=" + rows + '}';
    }
}

jsp层

login.jsp

<%--
  Created by IntelliJ IDEA.
  User: user1
  Date: 2023/7/26
  Time: 11:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
    <link href="${pageContext.request.contextPath}/css/style.css">
    <script src="${pageContext.request.contextPath}/js/jQuery-3.4.1"></script>
    <script>
        function check() {
            var userCode = $('#userCode').val();
            var password = $('#password').val();
            if(userCode === "" || password === ""){
                $("#message").text("账号或密码不能为空!");
                return false;
            }
            return true;
        }
    </script>
</head>
<body>
    <h2>欢迎使用BOOT客户管理系统</h2>
    <p style="color: red" id="message">${msg}</p>
    <div>
        <form action="${pageContext.request.contextPath}/login" method="post" onsubmit="return check()">
            账号:<input type="text" id="userCode" name="userCode"><br>
            密码:<input type="password" id="password" name="password"><br>
            <input type="submit" value="登录">
        </form>
    </div>
</body>
</html>

Customer.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: user1
  Date: 2023/7/26
  Time: 11:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>客户管理</title>
</head>
<body>
    <h2>客户管理</h2>
    <ul>
        <li><p>用户:<strong>${user_session.userName}</strong>--<a href="${pageContext.request.contextPath}/logout">退出系统</a></p></li>
    </ul>
    <div>
        <div>
            <form method="get" action="${pageContext.request.contextPath}/customer/list">
                <div>
                    <label for="cusName">客户名称</label>
                    <input type="text" id="cusName" name="cusName" value="${cusName}">
                </div>
                <div>
                    <label for="cusSource">客户来源</label>
                    <select id="cusSource" name="cusSource">
                        <option value="">--请选择--</option>
                        <c:forEach items="${fromType}" var="item">
                            <option value="${item.dicId}"
                                    <c:if test="${item.dicId eq cusSource}">selected="selected"</c:if>
                            >${item.dicItemName}</option>
                        </c:forEach>
                    </select>
                </div>
                <div>
                    <label for="cusIndustry">所属行业</label>
                    <select id="cusIndustry" name="cusIndustry">
                        <option value="">--请选择--</option>
                        <c:forEach items="${industryType}" var="item">
                            <option value="${item.dicId}"
                                    <c:if test="${item.dicId eq cusIndustry}">selected="selected"</c:if>
                            >${item.dicItemName}</option>
                        </c:forEach>
                    </select>
                </div>
                <div>
                    <label for="cusLevel">客户级别</label>
                    <select name="cusLevel" id="cusLevel">
                        <option value="">--请选择--</option>
                        <c:forEach items="${levelType}" var="item">
                            <option value="${item.dicId}"
                                    <c:if test="${item.dicId eq cusLevel}">selected="selected"</c:if>
                            >${item.dicItemName}</option>
                        </c:forEach>
                    </select>
                </div>
                <button type="submit">查询</button>
            </form>
            <div>
                <p>客户信息列表</p>
                <table border="1">
                    <thead>
                        <tr>
                            <th>编号</th>
                            <th>客户名称</th>
                            <th>客户来源</th>
                            <th>客户所属行业</th>
                            <th>客户级别</th>
                            <th>固定电话</th>
                            <th>手机</th>
                            <th>
                                操作
                            </th>
                        </tr>
                    </thead>
                    <tbody>
                        <c:forEach items="${page.rows}" var="row">
                            <tr>
                                <td>${row.cusId}</td>
                                <td>${row.cusName}</td>
                                <td>${row.cusSource}</td>
                                <td>${row.cusIndustry}</td>
                                <td>${row.cusLevel}</td>
                                <td>${row.cusPhone}</td>
                                <td>${row.cusMobile}</td>
                                <td>
                                    <a href="#" onclick="editCustomer(${row.cusId})">修改</a>
                                </td>
                            </tr>
                        </c:forEach>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾米大王

有你的支持,我会更有动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值