簡易的CRM系統案例SpringBoot + thymeleaf + MySQL + MyBatis版本


創建maven項目

pop.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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.loaderman</groupId>
    <artifactId>crm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>crm</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 數據庫連接池 -->
        <!-- alibaba的druid數據庫連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

resources下創建

application.yml

spring:
  thymeleaf:
    mode: HTML5
    encoding: UTF-8
    sourceType: text/html; charset=utf-8
    type: text/html; charset=utf-8
    # 開發禁用緩存
    cache: false
  datasource:
    druid:
      #監控統計攔截的filters
      filters: stat
      driver-class-name: com.mysql.jdbc.Driver
      #基本屬性
      url: jdbc:mysql://localhost:3306/infos
      username: root
      password: root
      #配置初始化大小/最小/最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      #獲取連接等待超時時間
      max-wait: 60000
      #間隔多久進行一次檢測,檢測需要關閉的空閑連接
      time-between-eviction-runs-millis: 60000
      #一個連接在池中最小生存的時間
      min-evictable-idle-time-millis: 300000

      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      #打開PSCache,並指定每個連接上PSCache的大小。oracle設為true,mysql設為false。分庫分表較多推薦設置為false
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
    hikari:
      connection-timeout: 60000
    mvc:
        view:
          prefix: /WEB-INF/
          suffix: .jsp
        resources:
          add-mappings: false
        jackson:
          serialization:
            write-dates-as-timestamps: true
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.loaderman.crm.entity
  configuration:
    use-column-label: true
    use-generated-keys: true
    map-underscore-to-camel-case: true
# spring-boot默認打印輸出info級別以上的,可在此處修改輸出級別
logging:
  config: classpath:logback-spring.xml
  path: /var/log
  debug: true

logback-spring.xml

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

    <!-- 控制台輸出 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 時間滾動輸出 level為 INFO 日志 -->
    <appender name="file-info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY </onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>./logs/info.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 時間滾動輸出 level為 DEBUG 日志 -->
    <appender name="file-debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY </onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>./logs/debug.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 時間滾動輸出 level為 ERROR 日志 -->
    <appender name="file—error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY </onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>./logs/error.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.apache.ibatis" level="INFO"/>
    <logger name="java.sql.Connection" level="debug" />
    <logger name="java.sql.Statement" level="debug" />
    <logger name="java.sql.PreparedStatement" level="debug" />

    <root level="info">
        <appender-ref ref="stdout" />
        <appender-ref ref="file-info" />
    </root>
</configuration>

創建用戶MyBatis 的 Mapper

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

<!-- namespace屬性是名稱空間,必須唯一 -->
<mapper namespace="com.loaderman.crm.dao.UserDao">

    <update id="modifyUser" parameterType="com.loaderman.crm.entity.User">
        update t_user set id=#{id},name=#{name},telephone=#{telephone},age=#{age},telephone=#{telephone},idCard=#{idCard},address=#{address},weixin=#{weixin},qq=#{qq},email=#{email},job=#{job},area=#{area},grade=#{grade},remark=#{remark} where id=#{id}

    </update>


    <delete id="delUser" parameterType="com.loaderman.crm.entity.User">
        delete from t_user where id = #{id}
    </delete>
    <insert id="addUser" parameterType="com.loaderman.crm.entity.User" >
        insert into t_user (name,sex,age,telephone,idCard,address,weixin,qq,email,job,area,grade,remark) values(#{name},#{sex},#{age},#{telephone},#{idCard},#{address},#{weixin},#{qq},#{email},#{job},#{area},#{grade},#{remark})

    </insert>
    <select  id="getUserByName" parameterType="String" resultType="com.loaderman.crm.entity.User">
        select * from t_user where name=#{name}
    </select >
    <select id="getUserMoreInfo"  parameterType="com.loaderman.crm.entity.User" resultType="com.loaderman.crm.entity.User">
        select * from t_user where id=#{id}
    </select>
    <select id="findUser"  parameterType="com.loaderman.crm.entity.User" resultType="com.loaderman.crm.entity.User">
        select * from t_user where id=#{id}
    </select>

    <select  id="getAllUser"  resultType="com.loaderman.crm.entity.User">
        select * from t_user
    </select >




</mapper>

User實體類

package com.loaderman.crm.entity;

import org.springframework.stereotype.Service;

import java.io.Serializable;

@Service
public class User  {
    private int id;
    private String name;

    private String sex;
    private String age;
    private String telephone;
    private String idCard;
    private String address;
    private String weixin  ;
    private String qq;
    private String email;
    private String job;
    private String grade;

    public int getId() {
        return id;
    }

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

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    private String remark;
    private String area;
    public User() {
    }

    public String getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public String getAddress() {
        return address;
    }

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

    public String getWeixin() {
        return weixin;
    }

    public void setWeixin(String weixin) {
        this.weixin = weixin;
    }

    public String getQq() {
        return qq;
    }

    public void setQq(String qq) {
        this.qq = qq;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age='" + age + '\'' +
                ", telephone='" + telephone + '\'' +
                ", idCard='" + idCard + '\'' +
                ", address='" + address + '\'' +
                ", weixin='" + weixin + '\'' +
                ", qq='" + qq + '\'' +
                ", email='" + email + '\'' +
                ", job='" + job + '\'' +
                ", grade='" + grade + '\'' +
                ", remark='" + remark + '\'' +
                ", area='" + area + '\'' +
                '}';
    }
}

dao層

package com.loaderman.crm.dao;


import com.loaderman.crm.entity.User;

import java.util.List;


/*
 *
 * @ class description:對客戶表的操作接口
 *
 */
public interface UserDao {
    //獲取所有客戶信息
    public List<User> getAllUser();
    //獲取指定客戶信息
    public User getUserMoreInfo(User user);
    public List<User> getUserByName(String name);
    //添加客戶
    public int addUser(User user);
    //刪除客戶
    public int delUser(User user);
    //修改客戶
    public int modifyUser(User user);
    //查找指定的客戶存在不存在
    public boolean findUser(User user);

}

service層

package com.loaderman.crm.service;


import com.loaderman.crm.entity.User;

import java.util.List;


public interface UserService {
    public List<User> getAllUser();
    public User getUserMoreInfo(User user);
    public List<User> getUserByName(String name);
    public int addUser(User user);
    public int delUser(User user);
    public int modifyUser(User user);
    public boolean findUser(User user);
}
package com.loaderman.crm.service.impl;

import com.loaderman.crm.entity.User;
import com.loaderman.crm.dao.UserDao;
import com.loaderman.crm.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;


/*
 *
 * @ class description:操作客戶
 *
 */
@Service
public class UserServiceimp implements UserService {

    @Resource
    private UserDao userDao;
    @Override
    public List<User> getAllUser() {
        return userDao.getAllUser();
    }

    @Override
    public User getUserMoreInfo(User user) {
        return userDao.getUserMoreInfo(user);
    }

    @Override
    public List<User> getUserByName(String name) {
        return userDao.getUserByName(name);
    }

    @Override
    public int addUser(User user) {
        return userDao.addUser(user);
    }

    @Override
    public int delUser(User user) {
        return userDao.delUser(user);
    }

    @Override
    public int modifyUser(User user) {
        return userDao.modifyUser(user);
    }

    public boolean findUser(User user) {
        return userDao.findUser(user);

    }

}

控制層

package com.loaderman.crm.controller;

import com.loaderman.crm.entity.Account;
import com.loaderman.crm.entity.User;
import com.loaderman.crm.service.impl.UserServiceimp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@Controller
public class UserController {
    @Resource
    private UserServiceimp userService;
    @Autowired
    private User user;

    @RequestMapping(value = "/getUserMoreInfo")
    public String getUserMoreInfo(Model model, @RequestParam(required = true) int id) {
        user.setId(id);
        User user1 = userService.getUserMoreInfo(user);
        model.addAttribute("user", user1);
        return "/userDetail";
    }

    @RequestMapping(value = "/adduser")
    public String adduser() {
        return "/addUser";
    }

    @RequestMapping(value = "/addUser", method = RequestMethod.GET)
    public void addUser(HttpServletResponse response, @ModelAttribute User user, @RequestParam(required = true) String opr, @RequestParam(required = false) Integer id) {
        int n = 0;
        if (opr.equals("addUser")) {
            n = userService.addUser(user);
        } else if (opr.equals("modifyUser")) {
            user.setId(id);
            n = userService.modifyUser(user);
        }
        if (n > 0) {
            try {
                response.sendRedirect("/getUserList");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            try {
                response.sendRedirect("/addUser");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @RequestMapping(value = "/delUser", method = RequestMethod.GET)
    public void delUser(@RequestParam(required = true) int id, HttpServletResponse response) {
        user.setId(id);
        userService.delUser(user);
        try {
            response.sendRedirect("/getUserList");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping(value = "/getUserList")
    public String getUserList(HttpServletResponse response, @RequestParam(required = false) String name, ModelMap model, HttpServletRequest request, Model model1) throws IOException {
        Account account = (Account) request.getSession().getAttribute("account");
        System.out.println(account);

        if (name != null && (!name.isEmpty())) {

            List<User> list = userService.getUserByName(name);
            model.addAttribute("list", list);
        } else {
            List<User> list = userService.getAllUser();
            model.addAttribute("list", list);
        }
        return "/getUserList";
    }

    @RequestMapping(value = "/modifyUser", method = RequestMethod.GET)
    public String modifyUser(@RequestParam(required = true) int id, Model model) {
        user.setId(id);
        User user1 = userService.getUserMoreInfo(user);
        model.addAttribute("user", user1);
        return "/modifyUser";
    }
}

web 頁面演示,具體查看demo

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>Home</title>
    <link href="css/common.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div align="right"  >  歡迎你 <td  th:text="${session.account.username} "></td><a th:href="@{/}">  退出</a> </div>

<h2>客戶信息列表</h2>
<div align="right" style="margin-right: 50px">
    <form action="/getUserList" style="text-align: right" >
        <tr>
            <input type="text"  placeholder="請輸入要查詢姓名" name="name"></td>
        </tr>
        <td  ><input type="submit" value="查詢"></td>
        </tr>
    </form>
    <p>
        <a th:href="@{/adduser}" ><input type="button" value="添加客戶"></a>
        <a href="/getPolicyList"><input type="button" value="保單列表"></a>
    </p>

</div>

<table>
    <tr>
        <td class="listTable">編號</td>
        <td class="listTable">姓名</td>
        <td class="listTable">性別</td>
        <td class="listTable">年齡</td>
        <td class="listTable">電話</td>
        <td class="listTable">等級</td>
        <td class="listTable">身份證</td>
        <td class="listTable">地區</td>
        <td class="listTable">地址</td>
        <td class="listTable">微信</td>
        <td class="listTable">QQ</td>
        <td class="listTable">郵箱</td>
        <td class="listTable">職業</td>
        <td id="profile">備注</td>
        <td id="operate">操作</td>
    </tr>

    </td>
    <!--/*@thymesVar id="list" type="java"*/-->
    <li th:each = "user, iterStat : ${list} " >
        <tr>
            <td  th:text="${iterStat.count}">
            </td>
            <td   th:text="${user.getName()}">
            </td>
            <td th:text="${user.getSex()}">
            </td>
            <td th:text="${user.getAge()}">
            </td>
            <td th:text="${user.getTelephone()}">
            </td>
            <td th:text="${user.getGrade()}">
            </td>
            <td th:text="${user.getIdCard()}">
            </td>
            <td th:text="${user.getArea()}">${
            </td>
            <td th:text="${user.getAddress()}">
            </td>
            <td th:text="${user.getWeixin()}">
            </td>
            <td th:text="${user.getQq()}">$
            </td >
            <td th:text="${user.getEmail()}">$
            </td>
            <td th:text="${user.getJob()}">
            </td>
            <td th:text="${user.getRemark()}">
            </td>
            <td><a  th:href="@{/getUserMoreInfo(id = ${user.getId()})}" >查看&nbsp;&nbsp;</a>
                <a th:href="@{/modifyUser(id = ${user.getId()})} ">修改&nbsp;&nbsp;</a>
                <a th:href="@{/delUser(id = ${ user.getId()})} "
                   onclick="return check()">刪除&nbsp;&nbsp;</a></td>
        </tr>

    </li>


</table>

</body>
</html>

點擊 源碼下載


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM