Java项目:CRM客户关系管理系统(Spring+SpringMVC+MyBatis + maven)(3)

Java高频面试专题合集解析:

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

更多Java架构进阶资料展示

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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 javax.annotation.Resource;

import java.util.List;

​

/\*\*

 \* @author 桐叔

 \* @email liangtong@itcast.cn

 \*/

@Controller

@RequestMapping("/customer")

public class CustomerController {

​

    @Resource

    private CustomerService customerService;

​

    @RequestMapping("/findAll")

    public String findAll(CustomerVo customerVo, Model model){

​

        List<Customer> allCustomer = customerService.findAll(customerVo);

        model.addAttribute("allCustomer", allCustomer);

​

        return "customer/list";

    }

​

}

​

​

```
  • 步骤4:修改service,使用查询条件

    • 接口

    • 实现类

      
      package com.czxy.crm.service.impl;
      
      ​
      
      import com.czxy.crm.domain.BaseDict;
      
      import com.czxy.crm.domain.Customer;
      
      import com.czxy.crm.mapper.BaseDictMapper;
      
      import com.czxy.crm.mapper.CustomerMapper;
      
      import com.czxy.crm.service.CustomerService;
      
      import com.czxy.crm.vo.CustomerVo;
      
      import org.apache.commons.lang3.StringUtils;
      
      import org.springframework.stereotype.Service;
      
      import org.springframework.transaction.annotation.Transactional;
      
      import tk.mybatis.mapper.entity.Example;
      
      ​
      
      import javax.annotation.Resource;
      
      import java.util.List;
      
      ​
      
      /\*\*
      
       \* @author 桐叔
      
       \* @email liangtong@itcast.cn
      
       \*/
      
      @Service
      
      @Transactional
      
      public class CustomerServiceImpl implements CustomerService {
      
      ​
      
          @Resource
      
          private CustomerMapper customerMapper;
      
          @Resource
      
          private BaseDictMapper baseDictMapper;
      
      ​
      
          @Override
      
          public List<Customer> findAll(CustomerVo customerVo) {
      
      ​
      
              // 1 条件查询
      
              Example example = new Example(Customer.class);
      
              Example.Criteria criteria = example.createCriteria();
      
              if(StringUtils.isNotBlank(customerVo.getCustName())) {
      
                  criteria.andLike("custName", "%"+customerVo.getCustName()+"%");
      
              }
      
      ​
      
              // 2 分页查询
      
      ​
      
              // 3 查询所有
      
              List<Customer> list = customerMapper.selectByExample(example);
      
      ​
      
              // 4 关联查询
      
              list.forEach(customer -> {
      
                  // 客户来源
      
                  BaseDict custSourceBaseDict = baseDictMapper.selectByPrimaryKey(customer.getCustSource());
      
                  customer.setCustSourceBaseDict(custSourceBaseDict);
      
      ​
      
                  //客户行业
      
                  BaseDict custIndustryBaseDict = baseDictMapper.selectByPrimaryKey(customer.getCustIndustry());
      
                  customer.setCustIndustryBaseDict(custIndustryBaseDict);
      
      ​
      
                  //客户级别
      
                  BaseDict custLevelBaseDict = baseDictMapper.selectByPrimaryKey(customer.getCustLevel());
      
                  customer.setCustLevelBaseDict(custLevelBaseDict);
      
              });
      
      ​
      
              // 5 封装分页
      
      ​
      
              return list;
      
          }
      
      }
      
      ​
      
      

3.1.3 分页查询

  • 需求

  • 步骤:

    • 步骤1:修改CustomerVo,获得分页参数

    • 步骤2:修改controller,返回pageInfo

    • 步骤3:修改service,封装PageInfo

    • 步骤4:修改jsp,展示列表数据

    • 步骤5:修改jsp,展示分页条

  • 步骤1:修改CustomerVo,获得分页参数

    
    package com.czxy.crm.vo;
    
    ​
    
    /\*\*
    
     \* @author 桐叔
    
     \* @email liangtong@itcast.cn
    
     \*/
    
    public class CustomerVo {
    
        private String custName;
    
        private Integer pageNum = 1;
    
        private Integer pageSize = 2;
    
    ​
    
        // getter和setter
    
    }
    
    ​
    
    
  • 步骤2:修改controller,返回pageInfo

  • 步骤3:修改service,封装PageInfo

    • 接口

    • 实现类

      
      package com.czxy.crm.service.impl;
      
      ​
      
      import com.czxy.crm.domain.BaseDict;
      
      import com.czxy.crm.domain.Customer;
      
      import com.czxy.crm.mapper.BaseDictMapper;
      
      import com.czxy.crm.mapper.CustomerMapper;
      
      import com.czxy.crm.service.CustomerService;
      
      import com.czxy.crm.vo.CustomerVo;
      
      import com.github.pagehelper.PageHelper;
      
      import com.github.pagehelper.PageInfo;
      
      import org.apache.commons.lang3.StringUtils;
      
      import org.springframework.stereotype.Service;
      
      import org.springframework.transaction.annotation.Transactional;
      
      import tk.mybatis.mapper.entity.Example;
      
      ​
      
      import javax.annotation.Resource;
      
      import java.util.List;
      
      ​
      
      /\*\*
      
       \* @author 桐叔
      
       \* @email liangtong@itcast.cn
      
       \*/
      
      @Service
      
      @Transactional
      
      public class CustomerServiceImpl implements CustomerService {
      
      ​
      
          @Resource
      
          private CustomerMapper customerMapper;
      
          @Resource
      
          private BaseDictMapper baseDictMapper;
      
      ​
      
          @Override
      
          public PageInfo<Customer> findAll(CustomerVo customerVo) {
      
              // 1 条件查询
      
              Example example = new Example(Customer.class);
      
              Example.Criteria criteria = example.createCriteria();
      
              if(StringUtils.isNotBlank(customerVo.getCustName())) {
      
                  criteria.andLike("custName", "%"+customerVo.getCustName()+"%");
      
              }
      
              // 2 分页查询
      
              PageHelper.startPage(customerVo.getPageNum(),customerVo.getPageSize());
      
              // 3 查询所有
      
              List<Customer> list = customerMapper.selectByExample(example);
      
              // 4 关联查询
      
              list.forEach(customer -> {
      
                  // 客户来源
      
                  BaseDict custSourceBaseDict = baseDictMapper.selectByPrimaryKey(customer.getCustSource());
      
                  customer.setCustSourceBaseDict(custSourceBaseDict);
      
                  //客户行业
      
                  BaseDict custIndustryBaseDict = baseDictMapper.selectByPrimaryKey(customer.getCustIndustry());
      
                  customer.setCustIndustryBaseDict(custIndustryBaseDict);
      
                  //客户级别
      
                  BaseDict custLevelBaseDict = baseDictMapper.selectByPrimaryKey(customer.getCustLevel());
      
                  customer.setCustLevelBaseDict(custLevelBaseDict);
      
              });
      
              // 5 封装分页
      
              return new PageInfo<>(list);
      
          }
      
      }
      
      ​
      
      
  • 步骤4:修改jsp,展示列表数据

  • 步骤5:修改jsp,展示分页条

    • 查询表单

    • 分页条

      
      当前第\[<B>${pageInfo.pageNum}</B>\]页,共\[<B>${pageInfo.total}</B>\]条
      
      ,每页显示
      
      <select οnchange="change(this)">
      
          <option value="1" ${pageInfo.pageSize == 1 ? 'selected' : ''}>1</option>
      
          <option value="2" ${pageInfo.pageSize == 2 ? 'selected' : ''}>2</option>
      
          <option value="3" ${pageInfo.pageSize == 3 ? 'selected' : ''}>3</option>
      
          <option value="5" ${pageInfo.pageSize == 5 ? 'selected' : ''}>5</option>
      
          <option value="10" ${pageInfo.pageSize == 10 ? 'selected' : ''}>10</option>
      
      </select>
      
      条
      
      <c:if test="${pageInfo.pageNum > 1}">
      
          \[<a href="javascript:void(0)" οnclick="page(1)">首页</a>\]
      
          \[<a href="javascript:void(0)" οnclick="page(${pageInfo.pageNum - 1})">上一页</a>\]
      
      </c:if>
      
      ​
      
      <c:forEach begin="1" end="${pageInfo.pages}" var="num">
      
          <b><a href="javascript:void(0)" οnclick="page(${num})">${num}</a></b>
      
      </c:forEach>
      
      ​
      
      <c:if test="${pageInfo.pageNum < pageInfo.pages}">
      
          \[<a href="javascript:void(0)" οnclick="page(${pageInfo.pageNum + 1})">下一页</a>\]
      
          \[<a href="javascript:void(0)" οnclick="page(${pageInfo.pages})">尾页</a>\]
      
      </c:if>
      
      到
      
      <input type="number" style="width: 35px;" value="${customerVo.pageNum}" id="goId"/>
      
      页
      
      ​
      
      <input type="button" value="Go" οnclick="page(goId.value)"/>
      
      
    • js函数

      
      function change(obj) {
      
          // 重置,如果修改了pageSize,从1开始
      
          pageNumId.value = 1
      
          // 修改隐藏字段 pageSize
      
          pageSizeId.value = obj.value
      
          // 提交表单
      
          customerFormId.submit()
      
      }
      
      ​
      
      function page(pageNum) {
      
          // 修改pageNum的值
      
          pageNumId.value = pageNum
      
          // 提交表单
      
          customerFormId.submit()
      
      }
      
      

3.2 添加客户


3.2.1 需求

3.2.2 显示表单

  • 步骤:

    • 步骤1:入口

    • 步骤2:修改CustomerController,用于显示 customer/add.jsp 页面

      • 查询数据字典:客户来源(typeCode=002)

      • 查询数据字典:客户行业(typeCode=001)

      • 查询数据字典:客户级别(typeCode=006)

    • 步骤3:编写BaseDictService,通过typeCode查询所有数据字典信息。

    • 步骤4:修改add.jsp,显示字典相关信息

  • 步骤1:入口

  • 步骤2:修改CustomerController,用于显示 customer/add.jsp 页面

    • 查询数据字典:客户来源(typeCode=002)

    • 查询数据字典:客户行业(typeCode=001)

    • 查询数据字典:客户级别(typeCode=006)

    
    package com.czxy.crm.controller;
    
    ​
    
    import com.czxy.crm.domain.BaseDict;
    
    import com.czxy.crm.domain.Customer;
    
    import com.czxy.crm.service.BaseDictService;
    
    import com.czxy.crm.service.CustomerService;
    
    import com.czxy.crm.vo.CustomerVo;
    
    import com.github.pagehelper.PageInfo;
    
    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 javax.annotation.Resource;
    
    import java.util.List;
    
    ​
    
    /\*\*
    
     \* @author 桐叔
    
     \* @email liangtong@itcast.cn
    
     \*/
    
    @Controller
    
    @RequestMapping("/customer")
    
    public class CustomerController {
    
    ​
    
        @Resource
    
        private CustomerService customerService;
    
    ​
    
        @Resource
    
        private BaseDictService baseDictService;
    
    ​
    
        /\*\*
    
         \* 添加页面
    
         \* @return
    
         \*/
    
        @RequestMapping("/addUI")
    
        public String addUI(Model model) {
    
    ​
    
            // 客户行业 (typeCode=001)
    
            List<BaseDict> custIndustryBaseDictList = baseDictService.selectAllByTypeCode("001");
    
            model.addAttribute("custIndustryBaseDictList",custIndustryBaseDictList);
    
    ​
    
            // 客户来源(typeCode=002)
    
            List<BaseDict> custSourceBaseDictList = baseDictService.selectAllByTypeCode("002");
    
            model.addAttribute("custSourceBaseDictList",custSourceBaseDictList);
    
    ​
    
    ​
    
            // 客户级别(typeCode=006)
    
            List<BaseDict> custLevelBaseDictList = baseDictService.selectAllByTypeCode("006");
    
            model.addAttribute("custLevelBaseDictList",custLevelBaseDictList);
    
    ​
    
    ​
    
            return "customer/add";
    
        }
    
    ​
    
    }
    
    ​
    
    ​
    
    
  • 步骤3:编写BaseDictService,通过typeCode查询所有数据字典信息。

    • 接口

      
      package com.czxy.crm.service;
      
      ​
      
      import com.czxy.crm.domain.BaseDict;
      
      ​
      
      import java.util.List;
      
      ​
      
      /\*\*
      
       \* @author 桐叔
      
       \* @email liangtong@itcast.cn
      
       \*/
      
      public interface BaseDictService {
      
          /\*\*
      
           \* 通过类别代码查询数据字典信息
      
           \* @param dictTypeCode
      
           \* @return
      
           \*/
      
          List<BaseDict> selectAllByTypeCode(String dictTypeCode);
      
      }
      
      ​
      
      
    • 实现类

      
      package com.czxy.crm.service.impl;
      
      ​
      
      import com.czxy.crm.domain.BaseDict;
      
      import com.czxy.crm.mapper.BaseDictMapper;
      
      import com.czxy.crm.service.BaseDictService;
      
      import org.springframework.stereotype.Service;
      
      import org.springframework.transaction.annotation.Transactional;
      
      import tk.mybatis.mapper.entity.Example;
      
      ​
      
      import javax.annotation.Resource;
      
      import java.util.List;
      
      ​
      
      /\*\*
      
       \* @author 桐叔
      
       \* @email liangtong@itcast.cn
      
       \*/
      
      @Service
      
      @Transactional
      
      public class BaseDictServiceImpl implements BaseDictService {
      
          @Resource
      
          private BaseDictMapper baseDictMapper;
      
      ​
      
          @Override
      
          public List<BaseDict> selectAllByTypeCode(String dictTypeCode) {
      
              // 条件
      
              Example example = Example.builder(BaseDict.class).build();
      
              example.createCriteria().andEqualTo("dictTypeCode",dictTypeCode);
      
              // 查询
      
              return baseDictMapper.selectByExample(example);
      
          }
      
      }
      
      ​
      
      
  • 步骤4:修改add.jsp,显示字典相关信息

    
    <td>所属行业 :</td>
    
    <td>
    
        <select name="custIndustry" class=textbox style="WIDTH: 180px">
    
            <option value="">---请选择---</option>
    
            <c:forEach items="${custIndustryBaseDictList}" var="industry">
    
                <option value="${industry.dictId}">${industry.dictItemName}</option>
    
            </c:forEach>
    
        </select>
    
    </td>
    
    
    
    <td>信息来源 :</td>
    
    <td>
    
        <select name="custSource" class=textbox style="WIDTH: 180px">
    
            <option value="non">---请选择---</option>
    
            <c:forEach items="${custSourceBaseDictList}" var="source">
    
                <option value="${source.dictId}">${source.dictItemName}</option>
    
            </c:forEach>
    
        </select>
    
    </td>
    
    <td>客户级别:</td>
    
    <td>
    
        <select name="custLevel" class=textbox style="WIDTH: 180px">
    
            <option value="non">---请选择---</option>
    
            <c:forEach items="${custLevelBaseDictList}" var="level">
    
                <option value="${level.dictId}">${level.dictItemName}</option>
    
            </c:forEach>
    
        </select>                               
    
    </td>
    
    

3.2.3 添加

  • 步骤:

    • 步骤1:修改add.jsp页面,确定表单提交路径 /customer/add.action

    • 步骤2:修改CustomerController,添加add方法,并处理成功和失败。

    • 步骤3:修改CustomerService,添加add方法

    • 步骤4:修改add.jsp,显示错误信息

  • 步骤1:修改add.jsp页面,确定表单提交路径 /customer/add.action

  • 步骤2:修改CustomerController,添加add方法,并处理成功和失败。

    
     /\*\*
    
         \* 添加
    
         \* @param customer
    
         \* @return
    
         \*/
    
        @RequestMapping("/add")
    
        public String add(Customer customer, Model model) {
    
            try {
    
                // 添加
    
                boolean result = customerService.add(customer);
    
                if(result) {
    
                    // 成功
    
                    return "redirect:/customer/findAll.action";
    
                } else {
    
                    // 失败
    
                    model.addAttribute("error","添加客户失败");
    
                    return "customer/add";
    
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
                model.addAttribute("error",e.getMessage());
    
                return "customer/add";
    
            }
    
        }
    
    
  • 步骤3:修改CustomerService,添加add方法

    • 接口

      
          /\*\*
      
           \* 添加客户
      
           \* @param customer
      
           \* @return
      
           \*/
      
          boolean add(Customer customer);
      
      
    • 实现类

      
          @Override
      
          public boolean add(Customer customer) {
      
              int insert = customerMapper.insertSelective(customer);
      
              return insert == 1;
      
          }
      
      
  • 步骤4:修改add.jsp,显示错误信息

    
    <%-- 显示错误信息--%>
    
    <span style="color:red">${error}</span>
    
    

3.3 修改客户


3.3.1 需求

3.3.2 显示表单,回显数据

  • 步骤:

    • 步骤1:入口 /customer/editUI.action?custId=1

    • 步骤2:修改CustomerController,用于显示 customer/edit.jsp 页面

      • 查询数据字典:客户来源(typeCode=002)

      • 查询数据字典:客户行业(typeCode=001)

      • 查询数据字典:客户级别(typeCode=006)

      • 通过custId查询客户详情

    • 步骤3:编写CustomerService,查询客户详情。

    • 步骤4:修改edit.jsp,显示字典相关信息,回显客户信息。

  • 步骤1:入口 /customer/editUI.action?custId=1

  • 步骤2:修改CustomerController,用于显示 customer/edit.jsp 页面

    • 查询数据字典:客户来源(typeCode=002)

    • 查询数据字典:客户行业(typeCode=001)

    • 查询数据字典:客户级别(typeCode=006)

    • 通过custId查询客户详情

    
     /\*\*
    
         \* 修改页面
    
         \* @return
    
         \*/
    
        @RequestMapping("/editUI")
    
        public String editUI(Long custId, Model model) {
    
    ​
    
            // 客户行业 (typeCode=001)
    
            List<BaseDict> custIndustryBaseDictList = baseDictService.selectAllByTypeCode("001");
    
            model.addAttribute("custIndustryBaseDictList",custIndustryBaseDictList);
    
    ​
    
            // 客户来源(typeCode=002)
    
            List<BaseDict> custSourceBaseDictList = baseDictService.selectAllByTypeCode("002");
    
            model.addAttribute("custSourceBaseDictList",custSourceBaseDictList);
    
    ​
    
    ​
    
            // 客户级别(typeCode=006)
    
            List<BaseDict> custLevelBaseDictList = baseDictService.selectAllByTypeCode("006");
    
            model.addAttribute("custLevelBaseDictList",custLevelBaseDictList);
    
    ​
    
            // 查询客户项
    
            Customer customer = customerService.selectById(custId);
    
            model.addAttribute("customer",customer);
    
    ​
    
            return "customer/edit";
    
        }
    
    
  • 步骤3:编写CustomerService,查询客户详情。

    • 接口

      
          /\*\*
      
           \* 通过id查询详情
      
           \* @param custId
      
           \* @return
      
           \*/
      
          Customer selectById(Long custId);
      
      
    • 实现类

      
          @Override
      
          public Customer selectById(Long custId) {
      
              return customerMapper.selectByPrimaryKey(custId);
      
          }
      
      
  • 步骤4:修改edit.jsp,显示字典相关信息,回显客户信息。

    
    <select name="custIndustry" class=textbox style="WIDTH: 180px">
    
        <option value="">---请选择---</option>
    
        <c:forEach items="${custIndustryBaseDictList}" var="industry">
    
            <option value="${industry.dictId}" ${customer.custIndustry== industry.dictId?"selected":""}>${industry.dictItemName}</option>
    
        </c:forEach>
    
    </select>
    
    
    
    <td>信息来源 :</td>
    
    <td>
    
        <select name="custSource" class=textbox style="WIDTH: 180px">
    
            <option value="non">---请选择---</option>
    
            <c:forEach items="${custSourceBaseDictList}" var="source">
    
                <option value="${source.dictId}" ${customer.custSource== source.dictId?"selected":""}>${source.dictItemName}</option>
    
            </c:forEach>
    
        </select>
    
    </td>
    
    <td>客户级别:</td>
    
    <td>
    
        <select name="custLevel" class=textbox style="WIDTH: 180px">
    
            <option value="non">---请选择---</option>
    
            <c:forEach items="${custLevelBaseDictList}" var="level">
    
                <option value="${level.dictId}"  ${customer.custLevel==level.dictId?"selected":""}>${level.dictItemName}</option>
    
            </c:forEach>
    
        </select>                               
    
    </td>
    
    

3.3.3 修改

  • 步骤:

    • 步骤1:修改edit.jsp页面,确定表单提交路径 /customer/edit.action

    • 步骤2:修改CustomerController,添加edit方法,并处理成功和失败。

    • 步骤3:修改CustomerService,添加edit方法

    • 步骤4:修改edit.jsp,显示错误信息

  • 步骤1:修改edit.jsp页面,确定表单提交路径 /customer/edit.action

  • 步骤2:修改CustomerController,添加edit方法,并处理成功和失败。

    
     /\*\*
    
         \* 修改
    
         \* @param customer
    
         \* @return
    
         \*/
    
        @RequestMapping("/edit")
    
        public String edit(Customer customer, Model model) {
    
            try {
    
                // 修改
    
                boolean result = customerService.update(customer);
    
                if(result) {
    
                    // 成功
    
                    return "redirect:/customer/findAll.action";
    
                } else {
    
                    // 失败
    
                    model.addAttribute("error","修改客户失败");
    
                    return "customer/edit";
    
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
                model.addAttribute("error",e.getMessage());
    
                return "customer/edit";
    
            }
    
    
  • 步骤3:修改CustomerService,添加edit方法

    • 接口

      
          /\*\*
      
           \* 修改
      
           \* @param customer
      
           \* @return
      
           \*/
      
          boolean update(Customer customer);
      
      
    • 实现类

      
          @Override
      
          public boolean update(Customer customer) {
      
              int update = customerMapper.updateByPrimaryKeySelective(customer);
      
              return update == 1;
      
          }
      
      
  • 步骤4:修改edit.jsp,显示错误信息

3.4 删除客户


  • 步骤:

    • 步骤1:入口 customer/delete.action?custId=1

    • 步骤2:修改CustomerController,添加delete方法,删除成功重定向到列表页。

    • 步骤3:修改CustomerService,添加delete方法

  • 步骤1:入口 customer/delete.action?custId=1

    
    <a href="${pageContext.request.contextPath }/customer/delete.action?custId=${customer.custId}" οnclick="return confirm('您确定要删除【${customer.custName }】吗?')">删除</a>
    
    
  • 步骤2:修改CustomerController,添加delete方法,删除成功重定向到列表页。

    
        /\*\*
    
         \* 通过id删除客户
    
         \* @param custId
    
         \* @return
    
         \*/
    
        @RequestMapping("/delete")
    
        public String delete(Long custId) {
    
            // 删除
    
            customerService.deleteById(custId);
    
    
    
            // 重定向列表页
    
            return "redirect:/customer/findAll.action";
    
        }
    
    
  • 步骤3:修改CustomerService,添加delete方法

    • 接口

      
          /\*\*
      
           \* 通过id删除
      
           \* @param custId
      
           \*/
      
          void deleteById(Long custId);
      
      
    • 实现类

      
          @Override
      
          public void deleteById(Long custId) {
      
              customerMapper.deleteByPrimaryKey(custId);
      
          }
      
      

4. 联系人管理

=========

4.1 联系人与客户关系分析


  • 客户:指的是有很多员工的公司、组织、企业或类似机构。

    • 例如:传智学院
  • 联系人:与某公司(客户)进行对接时,所需要找该公司具体的员工。

    • 例如:教学-梁老师、就业-刘老师、后勤-唐老师
  • 根据分析,在CRM系统中,客户和联系人的关系是一对多,一个公司有多个对接人。

4.2 查询所有联系人


4.2.1 查询所有

  • 需求:

  • 步骤:

    • 步骤1:入口

    • 步骤2:编写LinkManController

    • 步骤3:编写LinkManService 接口、实现类

    • 步骤4:修改 linkman/list.jsp 展示数据

  • 步骤1:入口

  • 步骤2:编写LinkManController

    
    package com.czxy.crm.controller;
    
    ​
    
    import com.czxy.crm.domain.LinkMan;
    
    import com.czxy.crm.service.LinkManService;
    
    import com.czxy.crm.vo.LinkManVo;
    
    import org.springframework.stereotype.Controller;
    
    import org.springframework.ui.Model;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
    ​
    
    import javax.annotation.Resource;
    
    import java.util.List;
    
    ​
    
    /\*\*
    
     \* @author 桐叔
    
     \* @email liangtong@itcast.cn
    
     \*/
    
    @Controller
    
    @RequestMapping("/linkman")
    
    public class LinkManController {
    
    ​
    
        @Resource
    
        private LinkManService linkManService;
    
    ​
    
        @RequestMapping("/findAll")
    
        public String findAll(Model model){
    
            // 查询所有
    
            List<LinkMan> linkManList = linkManService.findAll();
    
            model.addAttribute("linkManList", linkManList);
    
    ​
    
            return "linkman/list";
    
        }
    
    }
    
    ​
    
    
  • 步骤3:编写LinkManService 接口、实现类

    • 接口

      
      package com.czxy.crm.service;
      
      
      
      import com.czxy.crm.domain.LinkMan;
      
      
      
      import java.util.List;
      
      
      
      /\*\*
      
       \* @author 桐叔
      
       \* @email liangtong@itcast.cn
      
       \*/
      
      public interface LinkManService {
      
          /\*\*
      
           \* 查询所有
      
           \* @param linkManVo
      
           \* @return
      
           \*/
      
          List<LinkMan> findAll();
      
      }
      
      
      
      
    • 实现类

      
      package com.czxy.crm.service.impl;
      
      
      
      import com.czxy.crm.domain.LinkMan;
      
      import com.czxy.crm.mapper.LinkManMapper;
      
      import com.czxy.crm.service.LinkManService;
      
      import com.github.pagehelper.PageHelper;
      
      import org.springframework.stereotype.Service;
      
      import org.springframework.transaction.annotation.Transactional;
      
      import tk.mybatis.mapper.entity.Example;
      
      
      
      import javax.annotation.Resource;
      
      import java.util.List;
      
      
      
      /\*\*
      
       \* @author 桐叔
      
       \* @email liangtong@itcast.cn
      
       \*/
      
      @Service
      
      @Transactional
      
      public class LinkManServiceImpl implements LinkManService {
      
      
      
          @Resource
      
          private LinkManMapper linkManMapper;
      
      
      
          @Override
      
          public List<LinkMan> findAll() {
      
              //1 条件查询
      
              Example example = new Example(LinkMan.class);
      
      
      
              //2 分页查询
      
      
      
              //3 查询
      
              List<LinkMan> linkManList = linkManMapper.selectByExample(example);
      
      
      
              //4 关联
      
              linkManList.forEach(linkMan -> {
      
                  Customer customer = customerMapper.selectByPrimaryKey(linkMan.getCustId());
      
                  linkMan.setCustomer(customer);
      
              });
      
      
      
              //5 封装
      
              return linkManList;
      
              //return new PageInfo<>(linkManList);
      
          }
      
      }
      
      
      
      
  • 步骤4:修改 linkman/list.jsp 展示数据

    
    <c:forEach items="${linkManList}" var="linkman">
    
    	<TR
    
    		style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
    
    		<TD>${linkman.lkmName }</TD>
    
    		<TD>${linkman.lkmGender }</TD>
    
    		<TD>${linkman.lkmPhone }</TD>
    
    		<TD>${linkman.lkmMobile }</TD>
    
    		<TD>${linkman.lkmEmail }</TD>
    
    		<TD>${linkman.lkmPosition }</TD>
    
    		<TD>${linkman.lkmMemo }</TD>
    
    		<TD>${linkman.customer.custName}</TD>
    
    		<TD>
    
    		<a href="${pageContext.request.contextPath }/linkman/editUI.action?lkmId=${linkman.lkmId}">修改</a>
    
    		&nbsp;&nbsp;
    
    		<a href="javascript:void(0)" οnclick="deleteLinkMan('${linkman.lkmId}','${linkman.lkmName}')">删除</a>
    
    		</TD>
    
    	</TR>
    
    </c:forEach>
    
    

4.2.2 条件查询

  • 需求:

  • 步骤:

    • 步骤1:入口,确定查询表单

    • 步骤2:创建LinkManVo,用于封装查询条件

    • 步骤3:修改LinkManController,获得查询条件

    • 步骤4:修改LinkManService,使用查询条件

  • 步骤1:入口,确定查询表单

  • 步骤2:创建LinkManVo,用于封装查询条件

    
    package com.czxy.crm.vo;
    
    ​
    
    /\*\*
    
     \* @author 桐叔
    
     \* @email liangtong@itcast.cn
    
     \*/
    
    public class LinkManVo {
    
        private String lkmName;
    
    ​
    
        public String getLkmName() {
    
            return lkmName;
    
        }
    
    ​
    
        public void setLkmName(String lkmName) {
    
            this.lkmName = lkmName;
    
        }
    
    }
    
    ​
    
    
  • 步骤3:修改LinkManController,获得查询条件

  • 步骤4:修改LinkManService,使用查询条件

    • 接口

    • 实现类

      
      package com.czxy.crm.service.impl;
      
      ​
      
      import com.czxy.crm.domain.LinkMan;
      
      import com.czxy.crm.mapper.LinkManMapper;
      
      import com.czxy.crm.service.LinkManService;
      
      import com.czxy.crm.vo.LinkManVo;
      
      import com.github.pagehelper.PageHelper;
      
      import com.github.pagehelper.PageInfo;
      
      import org.apache.commons.lang3.StringUtils;
      
      import org.springframework.stereotype.Service;
      
      import org.springframework.transaction.annotation.Transactional;
      
      import tk.mybatis.mapper.entity.Example;
      
      ​
      
      import javax.annotation.Resource;
      
      import java.util.List;
      
      ​
      
      /\*\*
      
       \* @author 桐叔
      
       \* @email liangtong@itcast.cn
      
       \*/
      
      @Service
      
      @Transactional
      
      public class LinkManServiceImpl implements LinkManService {
      
      ​
      
          @Resource
      
          private LinkManMapper linkManMapper;
      
      ​
      
          @Override
      
          public List<LinkMan> findAll(LinkManVo linkManVo) {
      
              //1 条件查询
      
              Example example = new Example(LinkMan.class);
      
              Example.Criteria criteria = example.createCriteria();
      
              if(StringUtils.isNotBlank(linkManVo.getLkmName())) {
      
                  criteria.andLike("lkmName", "%"+linkManVo.getLkmName()+"%");
      
              }
      
      ​
      
              //2 分页查询
      
      ​
      
              //3 查询
      
              List<LinkMan> linkManList = linkManMapper.selectByExample(example);
      
      ​
      
              //4 关联
      
              linkManList.forEach(linkMan -> {
      
                  Customer customer = customerMapper.selectByPrimaryKey(linkMan.getCustId());
      
                  linkMan.setCustomer(customer);
      
              });
      
      ​
      
              //5 封装
      
              return linkManList;
      
          }
      
      }
      
      ​
      
      

4.2.3 分页查询

  • 需求:

  • 步骤

    • 步骤1:修改LinkManVo,获得分页参数

    • 步骤2:修改LinkManController,返回pageInfo

    • 步骤3:修改LinkManService,封装PageInfo

    • 步骤4:修改jsp,展示列表数据

    • 步骤5:修改jsp,展示分页条

  • 步骤1:修改LinkManVo,获得分页参数

    
    package com.czxy.crm.vo;
    
    ​
    
    /\*\*
    
     \* @author 桐叔
    
     \* @email liangtong@itcast.cn
    
     \*/
    
    public class LinkManVo {
    
        private String lkmName;
    
        private Integer pageNum = 1;
    
        private Integer pageSize = 2;
    
        
    
        //getter和setter
    
    }
    
    
  • 步骤2:修改LinkManController,返回pageInfo

  • 步骤3:修改LinkManService,封装PageInfo

    • 接口

    • 实现类

      
      package com.czxy.crm.service.impl;
      
      ​
      
      import com.czxy.crm.domain.Customer;
      
      import com.czxy.crm.domain.LinkMan;
      
      import com.czxy.crm.mapper.CustomerMapper;
      
      import com.czxy.crm.mapper.LinkManMapper;
      
      import com.czxy.crm.service.LinkManService;
      
      import com.czxy.crm.vo.LinkManVo;
      
      import com.github.pagehelper.PageHelper;
      
      import com.github.pagehelper.PageInfo;
      
      import org.apache.commons.lang3.StringUtils;
      
      import org.springframework.stereotype.Service;
      
      import org.springframework.transaction.annotation.Transactional;
      
      import tk.mybatis.mapper.entity.Example;
      
      ​
      
      import javax.annotation.Resource;
      
      import java.util.List;
      
      ​
      
      /\*\*
      
       \* @author 桐叔
      
       \* @email liangtong@itcast.cn
      
       \*/
      
      @Service
      
      @Transactional
      
      public class LinkManServiceImpl implements LinkManService {
      
      ​
      
          @Resource
      
          private LinkManMapper linkManMapper;
      
      ​
      
          @Resource
      
          private CustomerMapper customerMapper;
      
      ​
      
          @Override
      
          public PageInfo<LinkMan> findAll(LinkManVo linkManVo) {
      
              //1 条件查询
      
              Example example = new Example(LinkMan.class);
      
              Example.Criteria criteria = example.createCriteria();
      
              if(StringUtils.isNotBlank(linkManVo.getLkmName())) {
      
                  criteria.andLike("lkmName", "%"+linkManVo.getLkmName()+"%");
      
              }
      
      ​
      
              //2 分页查询
      
              PageHelper.startPage(linkManVo.getPageNum() ,linkManVo.getPageSize());
      
      ​
      
              //3 查询
      
              List<LinkMan> linkManList = linkManMapper.selectByExample(example);
      
      ​
      
              //4 关联
      
              linkManList.forEach(linkMan -> {
      
                  Customer customer = customerMapper.selectByPrimaryKey(linkMan.getCustId());
      
                  linkMan.setCustomer(customer);
      
              });
      
      ​
      
              //5 封装
      
              return new PageInfo<>(linkManList);
      
          }
      
      }
      
      ​
      
      
  • 步骤4:修改jsp,展示列表数据

  • 步骤5:修改jsp,展示分页条

    • 查询表单

    • 分页条

      
      当前第\[<B>${pageInfo.pageNum}</B>\]页,共\[<B>${pageInfo.total}</B>\]条
      
      ,每页显示
      
      <select οnchange="change(this)">
      
          <option value="1" ${pageInfo.pageSize == 1 ? 'selected' : ''}>1</option>
      
          <option value="2" ${pageInfo.pageSize == 2 ? 'selected' : ''}>2</option>
      
          <option value="3" ${pageInfo.pageSize == 3 ? 'selected' : ''}>3</option>
      
          <option value="5" ${pageInfo.pageSize == 5 ? 'selected' : ''}>5</option>
      
          <option value="10" ${pageInfo.pageSize == 10 ? 'selected' : ''}>10</option>
      
      </select>
      
      条
      
      <c:if test="${pageInfo.pageNum > 1}">
      
          \[<a href="javascript:void(0)" οnclick="page(1)">首页</a>\]
      
          \[<a href="javascript:void(0)" οnclick="page(${pageInfo.pageNum - 1})">上一页</a>\]
      
      </c:if>
      
      ​
      
      <c:forEach begin="1" end="${pageInfo.pages}" var="num">
      
          <b><a href="javascript:void(0)" οnclick="page(${num})">${num}</a></b>
      
      </c:forEach>
      
      ​
      
      <c:if test="${pageInfo.pageNum < pageInfo.pages}">
      
          \[<a href="javascript:void(0)" οnclick="page(${pageInfo.pageNum + 1})">下一页</a>\]
      
          \[<a href="javascript:void(0)" οnclick="page(${pageInfo.pages})">尾页</a>\]
      
      </c:if>
      
      到
      
      <input type="number" style="width: 35px;" value="${customerVo.pageNum}" id="goId"/>
      
      页
      
      ​
      
      <input type="button" value="Go" οnclick="page(goId.value)"/>
      
      
    • JS函数

      
      <SCRIPT language=javascript>
      
          function change(obj) {
      
              // 重置,如果修改了pageSize,从1开始
      
              pageNumId.value = 1
      
              // 修改隐藏字段 pageSize
      
              pageSizeId.value = obj.value
      
              // 提交表单
      
              linkmanFormId.submit()
      
          }
      
      ​
      
          function page(pageNum) {
      
              // 修改pageNum的值
      
              pageNumId.value = pageNum
      
              // 提交表单
      
              linkmanFormId.submit()
      
          }
      
      </SCRIPT>
      
      

4.3 添加联系人


4.3.1 需求

4.3.2 显示表单

  • 步骤:

    • 步骤1:入口

    • 步骤2:修改LinkManController,用于显示 linkman/add.jsp 页面

      • 查询所有客户
    • 步骤3:编写CustomerService,查询所有客户。

    • 步骤4:修改add.jsp,显示客户列表。

  • 步骤1:入口

  • 步骤2:修改LinkManController,用于显示 linkman/add.jsp 页面

    • 查询所有客户
    
    package com.czxy.crm.controller;
    
    ​
    
    import com.czxy.crm.domain.Customer;
    
    import com.czxy.crm.domain.LinkMan;
    
    import com.czxy.crm.service.CustomerService;
    
    import com.czxy.crm.service.LinkManService;
    
    import com.czxy.crm.vo.CustomerVo;
    
    import com.czxy.crm.vo.LinkManVo;
    
    import com.github.pagehelper.PageInfo;
    
    import org.springframework.stereotype.Controller;
    
    import org.springframework.ui.Model;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
    ​
    
    import javax.annotation.Resource;
    
    import java.util.List;
    
    ​
    
    /\*\*
    
     \* @author 桐叔
    
     \* @email liangtong@itcast.cn
    
     \*/
    
    @Controller
    
    @RequestMapping("/linkman")
    
    public class LinkManController {
    
    ​
    
        @Resource
    
        private LinkManService linkManService;
    
    ​
    
        @Resource
    
        private CustomerService customerService;
    
    ​
    
        /\*\*
    
         \* 显示添加页面
    
         \* @param model
    
         \* @return
    
         \*/
    
        @RequestMapping("/addUI")
    
        public String addUI(Model model) {
    
    ​
    
            // 查询所有客户
    
            List<Customer> allCustomer = customerService.selectAll();
    
            model.addAttribute("allCustomer", allCustomer);
    
    ​
    
            return "linkman/add";
    
        }
    
    }
    
    ​
    
    
  • 步骤3:编写CustomerService,查询所有客户。

    • 接口

      
          /\*\*
      
           \* 查询所有
      
           \* @return
      
           \*/
      
          List<Customer> selectAll();
      
      
    • 实现类

      
          @Override
      
          public List<Customer> selectAll() {
      
              return customerMapper.selectAll();
      
          }
      
      
  • 步骤4:修改add.jsp,显示客户列表。

    
    <select name="custId">
    
        <option value="">--请选择--</option>
    
        <c:forEach items="${allCustomer}" var="customer">
    
            <option value="${customer.custId}">${customer.custName}</option>
    
        </c:forEach>
    
    </select>
    
    

4.3.3 添加

  • 步骤:

    • 步骤1:修改add.jsp页面,确定表单提交路径 /linkman/add.action

    • 步骤2:修改LinkManController,添加add方法,并处理成功和失败。

    • 步骤3:修改LinkManService,添加add方法

    • 步骤4:修改add.jsp,显示错误信息

  • 步骤1:修改add.jsp页面,确定表单提交路径 /linkman/add.action

  • 步骤2:修改LinkManController,添加add方法,并处理成功和失败。

    
     /\*\*
    
         \* 添加联系人
    
         \* @param linkMan
    
         \* @param model
    
         \* @return
    
         \*/
    
        @RequestMapping("/add")
    
        public String add(LinkMan linkMan , Model model) {
    
    ​
    
            try {
    
                // 查询所有客户
    
                boolean result = linkManService.add(linkMan);
    
                if(result) {
    
                    return "redirect:/linkman/findAll.action";
    
                } else {
    
                    model.addAttribute("error", "添加联系人失败");
    
                    return "linkman/add";
    
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
                model.addAttribute("error", e.getMessage());
    
                return "linkman/add";
    
            }
    
        }
    
    
  • 步骤3:修改LinkManService,添加add方法

    • 接口

    • 实现类

      
          @Override
      
          public boolean add(LinkMan linkMan) {
      
              int insert = linkManMapper.insertSelective(linkMan);
      
              return insert == 1;
      
          }
      
      
  • 步骤4:修改add.jsp,显示错误信息

4.4 修改联系人


4.4.1 需求

4.4.2 显示表单,回显数据

  • 步骤:

    • 步骤1:入口 /linkman/editUI.action?lkmId=1

    • 步骤2:修改LinkManController,用于显示 linkman/edit.jsp 页面

      • 查询所有客户

      • 查询当前联系人

    • 步骤3:编写LinkManService,查询联系人详情。

    • 步骤4:修改edit.jsp,显示客户列表,回显联系人信息。

  • 步骤1:入口 /linkman/editUI.action?lkmId=1

  • 步骤2:修改LinkManController,用于显示 linkman/edit.jsp 页面

    • 查询所有客户

    • 查询当前联系人

    
        /\*\*
    
         \* 编辑前操作
    
         \* @param lkmId
    
         \* @param model
    
         \* @return
    
         \*/
    
        @RequestMapping("/editUI")
    
        public String editUI(Long lkmId, Model model) {
    
    ​
    
            // 查询所有客户
    
            List<Customer> allCustomer = customerService.selectAll();
    
            model.addAttribute("allCustomer", allCustomer);
    
    ​
    
            // 查询详情
    
            LinkMan linkMan = linkManService.selectById(lkmId);
    
            model.addAttribute("linkMan", linkMan);
    
    ​
    
            return "linkman/edit";
    
        }
    
    
  • 步骤3:编写LinkManService,查询联系人详情。

    • 接口

      
          /\*\*
      
           \* 查询详情
      
           \* @param lkmId
      
           \* @return
      
           \*/
      
          LinkMan selectById(Long lkmId);
      
      
    • 实现类

      
          @Override
      
          public LinkMan selectById(Long lkmId) {
      
              return linkManMapper.selectByPrimaryKey(lkmId);
      
          }
      
      
  • 步骤4:修改edit.jsp,显示客户列表,回显联系人信息。

4.4.3 修改

  • 步骤:

    • 步骤1:修改edit.jsp页面,确定表单提交路径 /linkman/edit.action

    • 步骤2:修改LinkManController,添加edit方法,并处理成功和失败。

    • 步骤3:修改LinkManService,添加edit方法

    • 步骤4:修改edit.jsp,显示错误信息

  • 步骤1:修改edit.jsp页面,确定表单提交路径 /linkman/edit.action

  • 步骤2:修改LinkManController,添加edit方法,并处理成功和失败。

    
        /\*\*
    
         \* 修改联系人
    
         \* @param linkMan
    
         \* @param model
    
         \* @return
    
         \*/
    
        @RequestMapping("/edit")
    
        public String edit(LinkMan linkMan , Model model) {
    
    ​
    
            try {
    
                // 查询所有客户
    
                boolean result = linkManService.update(linkMan);
    
                if(result) {
    
                    return "redirect:/linkman/findAll.action";
    
                } else {
    
                    model.addAttribute("error", "修改联系人失败");
    
                    return "linkman/edit";
    
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
                model.addAttribute("error", e.getMessage());
    
                return "linkman/edit";
    
            }
    
        }
    
    
  • 步骤3:修改LinkManService,添加edit方法

    • 接口

    • 实现类

      
          @Override
      
          public boolean update(LinkMan linkMan) {
      
              int update = linkManMapper.updateByPrimaryKeySelective(linkMan);
      
              return update == 1;
      
          }
      
      
  • 步骤4:修改edit.jsp,显示错误信息

4.5 删除联系人


  • 步骤:

    • 步骤1:入口 linkman/delete.action?lkmId=1

    • 步骤2:修改LinkManController,添加delete方法,删除成功重定向到列表页。

    • 步骤3:修改LinkManService,添加delete方法

  • 步骤1:入口 linkman/delete.action?lkmId=1

    
    <a href="${pageContext.request.contextPath }/linkman/delete.action?lkmId=${linkman.lkmId}" οnclick="return confirm('您确定要删除【${linkman.lkmName}】吗?')">删除</a>
    
    
  • 步骤2:修改LinkManController,添加delete方法,删除成功重定向到列表页。

    
        /\*\*
    
         \* 通过id删除联系人
    
         \* @param lkmId
    
         \* @return
    
         \*/
    
        @RequestMapping("/delete")
    
        public String delete(Long lkmId) {
    
            // 删除
    
            linkManService.deleteById(lkmId);
    
    ​
    
            // 重定向列表页
    
            return "redirect:/linkman/findAll.action";
    
        }
    
    
  • 步骤3:修改LinkManService,添加delete方法

    • 接口

      
          /\*\*
      
           \* 删除
      
           \* @param lkmId
      
           \*/
      
          void deleteById(Long lkmId);
      
      
    • 实现类

      
          @Override
      
          public void deleteById(Long lkmId) {
      
              linkManMapper.deleteByPrimaryKey(lkmId);
      
          }
      
      

4.6 完善:删除客户


4.6.1 问题:客户和联系人主外键约束

  • 当联系人使用了客户后,此时如果删除客户,默认出现:

4.6.2 解决方案1:自动删除联系人

  • 需求:删除客户前,先删除联系人

  • 步骤:

    • 步骤1:修改 LinkManMapper ,添加 deleteAllByCustId方法

    • 步骤2:修改 CustomerServiceImpl,修改 deleteById 方法

  • 步骤1:修改 LinkManMapper ,添加 deleteAllByCustId方法

    
    package com.czxy.crm.mapper;
    
    ​
    
    
    

最后的话

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!

部分截图:
在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

        try {

            // 查询所有客户

            boolean result = linkManService.update(linkMan);

            if(result) {

                return "redirect:/linkman/findAll.action";

            } else {

                model.addAttribute("error", "修改联系人失败");

                return "linkman/edit";

            }

        } catch (Exception e) {

            e.printStackTrace();

            model.addAttribute("error", e.getMessage());

            return "linkman/edit";

        }

    }

```
  • 步骤3:修改LinkManService,添加edit方法

    • 接口

    • 实现类

      
          @Override
      
          public boolean update(LinkMan linkMan) {
      
              int update = linkManMapper.updateByPrimaryKeySelective(linkMan);
      
              return update == 1;
      
          }
      
      
  • 步骤4:修改edit.jsp,显示错误信息

4.5 删除联系人


  • 步骤:

    • 步骤1:入口 linkman/delete.action?lkmId=1

    • 步骤2:修改LinkManController,添加delete方法,删除成功重定向到列表页。

    • 步骤3:修改LinkManService,添加delete方法

  • 步骤1:入口 linkman/delete.action?lkmId=1

    
    <a href="${pageContext.request.contextPath }/linkman/delete.action?lkmId=${linkman.lkmId}" οnclick="return confirm('您确定要删除【${linkman.lkmName}】吗?')">删除</a>
    
    
  • 步骤2:修改LinkManController,添加delete方法,删除成功重定向到列表页。

    
        /\*\*
    
         \* 通过id删除联系人
    
         \* @param lkmId
    
         \* @return
    
         \*/
    
        @RequestMapping("/delete")
    
        public String delete(Long lkmId) {
    
            // 删除
    
            linkManService.deleteById(lkmId);
    
    ​
    
            // 重定向列表页
    
            return "redirect:/linkman/findAll.action";
    
        }
    
    
  • 步骤3:修改LinkManService,添加delete方法

    • 接口

      
          /\*\*
      
           \* 删除
      
           \* @param lkmId
      
           \*/
      
          void deleteById(Long lkmId);
      
      
    • 实现类

      
          @Override
      
          public void deleteById(Long lkmId) {
      
              linkManMapper.deleteByPrimaryKey(lkmId);
      
          }
      
      

4.6 完善:删除客户


4.6.1 问题:客户和联系人主外键约束

  • 当联系人使用了客户后,此时如果删除客户,默认出现:

4.6.2 解决方案1:自动删除联系人

  • 需求:删除客户前,先删除联系人

  • 步骤:

    • 步骤1:修改 LinkManMapper ,添加 deleteAllByCustId方法

    • 步骤2:修改 CustomerServiceImpl,修改 deleteById 方法

  • 步骤1:修改 LinkManMapper ,添加 deleteAllByCustId方法

    
    package com.czxy.crm.mapper;
    
    ​
    
    
    

最后的话

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!

部分截图:
[外链图片转存中…(img-cZWWDLCh-1715454594122)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
需求概述 1.1.1 坐席(用户)登录系统,根据用户的角色和权限,得到相应功能 1.1.2 客户电话呼入,坐席定位客户信息(未查找到),如果客户为新客户,首先增加新客户,针对该客户进行业务咨询或者订单预定请求处理,为客户提供个性化服务。 1.1.3 客户电话呼入,坐席定位大客户信息(查找到),针对客户进行业务咨询或者订单预定请求处理,为客户提供个性化服务。 1.1.4 根据客户请求坐席进行订单管理: 订单受理:生成订单(含客户信息、用户信息、订单信息、产品等) 订单查询:根据客户要求进行订单查询,包括订单状态等查询; 订单处理:根据客户请求,进行订单修改,包括订单信息修改,订单 产品的增加、修改及删除等; 1.1.5 坐席对产品进行管理: 产品查询:订单受理及处理中,选择查询产品; 产品增加:增加新产品信息; 产品修改:修改产品规格及状态信息; 1.1.6 根据订单确认需要,坐席查询订单列表,生成电话回呼列表( CallBack List),准备进行电话回呼及电话营销。 1.1.7 根据公司新产品市场推广需要,通过对客户资料的挖掘,筛选电话营销的客户群,批量生成电话营销列表( CallBack List),准备进行电话营销。 1.1.8 外呼坐席(用户)拥有电话营销角色及权限,进入电话回呼列表页面,选择相应的外呼任务,针对客户进行个性化的营销活动,如果客户接受则下订单,并且记录营销结果。 1.1.9 统计报表:生成座席订单业务量统计 、座席产品销售情况统计 、产品销售情况统计、外呼情况统计等报表(暂不实现); 主要需求环节: 坐席登录系统——〉客户电话打入——〉坐席响应服务——〉 坐席定位客户信息(客户管理)——〉客户下定单(订单管 理)——〉选择订购产品(产品管理)——〉订单处理 (订 单管理)——〉生成电话营销信息 ——〉坐席电话营销 —— 〉营销成功生成订单 ——〉 记录电话营销结果 ——〉 生成统计报表(暂不实现)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值