本博客处理该部分
1.业务流程
- 首先通过观察表得知,该表是将省、市、区都进行了存放,省的parent是国(编号是86),市的parent是省(编号依省而定),区的parent是市(编号依市而定),用户在页面的操作肯定是,先选择省份下拉框,得到所有市的数据,选择市以后,得到所有区的数据,再加上省一开始就能选择,说明进入页面以后,发送了一次请求,得到国家下的所有省份,综合以上操作,都是根据parent进行查询
- 查询到的数据返回给前端,前端将下拉框里的选项和数据中的code进行绑定,以便进行下一级的查询返回
2.实体类
package com.cy.store.entity;
import java.util.Objects;
/**
* @author ZhangHailong
* @date 2022/5/13 - 22:52
* @project_name 省、市、区实体类
*/
public class District {
private Integer id;
/*
* parent: 省或市或区的上一级编号,
* 如省的上一级是中国,代号是86
* 市的上一级是省,parent就是该省的代号
* 区的上一级是市,parent就是该市的代号
*
* code: 当前省或市或区的编号
* name: 当前省或市或区的名称
* */
private String parent;
private String code;
private String name;
// 省略get,set,equals(),hashCode(),toString()
3.持久层接口及mapper映射
package com.cy.store.dao;
import com.cy.store.entity.District;
import java.util.List;
/**
* @author ZhangHailong
* @date 2022/5/13 - 23:04
* @project_name 省市区持久层接口
*/
public interface DistrictDao {
/**
*@描述 根据当前级的编码parent查找它的子节点们
*@参数 当前级的编码
*@返回值 子节点
*@创建人 ZhangHailong
*/
List<District> selectDistrictsByParent(String parent);
}
<?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.cy.store.dao.DistrictDao">
<!--select|insert|update|delete语句-->
<select id="selectDistrictsByParent" resultType="com.cy.store.entity.District">
SELECT * FROM t_dict_district WHERE parent=#{parent} ORDER BY code ASC
</select>
</mapper>
4.业务层
package com.cy.store.service.impl;
import com.cy.store.dao.DistrictDao;
import com.cy.store.entity.District;
import com.cy.store.service.IDistrictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author ZhangHailong
* @date 2022/5/13 - 23:29
* @project_name 省市区业务层抽象方法实现类
*/
@Service
public class DistrictServiceImpl implements IDistrictService {
@Autowired
private DistrictDao districtDao;
@Override
public List<District> getDistrictsByParent(String parent) {
/*
* 该业务方法的功能就是,将用户当前层选择的省或市或区作为父节点,查找其下的子节点,信息包括子节点的编号和名称
* 但是持久层查找的是满足条件的所有字段,但其实id和parent是两个无用的数据,将其设置为null,一方面节省了流量,另一方面提高了性能
* 也可以在持久层代码上只查找需要的两个字段,其他的结果就是null
* 但是在这里,不改变持久层代码,而是手动将无用的字段设置为null,可以提高持久层代码的复用性
* */
List<District> list = districtDao.selectDistrictsByParent(parent);
for (District d : list) {
d.setId(null);
d.setParent(null);
}
return list;
}
}
5.控制层
package com.cy.store.controller;
import com.cy.store.entity.District;
import com.cy.store.service.IDistrictService;
import com.cy.store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author ZhangHailong
* @date 2022/5/13 - 23:40
* @project_name
*/
@RestController
@RequestMapping("district")
public class DistrictController extends BaseController{
@Autowired
private IDistrictService iDistrictService;
@RequestMapping(value = "getDistricts", method = RequestMethod.GET)
public JsonResult<List<District>> getDistrictsByParentController(String parent) {
List<District> list = iDistrictService.getDistrictsByParent(parent);
return new JsonResult<>(OK, list);
}
}
6.补充
-
在之前添加用户收货地址的业务层方法中,有三个字段proviceName,cityName,areaName没有获取到,只获取到了其对应的编号,provinceCode,cityCode,areaCode,所以在此补全
-
持久层接口及mapper映射代码
/** *@描述 根据省或市或区的编号查找它的名称 *@参数 编号 *@返回值 名称 *@创建人 ZhangHailong */ String selectDistrictNameByCode(String code);
<select id="selectDistrictNameByCode" resultType="java.lang.String"> SELECT name FROM t_dict_district WHERE code=#{code} </select>
-
address业务层补全代码
// 补全其他信息部分2 String provinceName = districtDao.selectDistrictNameByCode(address.getProvinceCode()); String cityName = districtDao.selectDistrictNameByCode(address.getCityCode()); String areaName = districtDao.selectDistrictNameByCode(address.getAreaCode()); address.setProvinceName(provinceName); address.setCityName(cityName); address.setAreaName(areaName);
至此,新增收货地址业务完成