1、此处只有后端的部分,测试使用的是swagger
Result类:
package com.chaoxing.user.beans.DTO;
import com.google.gson.Gson;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@ApiModel("响应对象")
public class Result<T> implements Serializable {
private static final long serialVersionUID = -8614669828681890797L;
public static final int SUCCESS = 1;
public static final int FAIL = 0;
@ApiModelProperty(
value = "结果码",
dataType = "Integer",
required = true
)
private int status;
@ApiModelProperty(
value = "结果描述",
dataType = "String",
required = true
)
private String message;
@ApiModelProperty("响应数据对象")
private T data;
public Result() {
}
public Result(int status, String message) {
this.status = status;
this.message = message;
this.data = null;
}
public Result(T data) {
this.status = 1;
this.message = "SUCCESS";
this.data = data;
}
public Result(int status, T data, String message) {
this.status = status;
this.data = data;
this.message = message;
}
@Override
public String toString() {
Gson gson = new Gson();
return gson.toJson(this);
}
public static <T> Result<T> custom(int status, T t, String message) {
return new Result(status, t, message);
}
public static <T> Result<T> custom(int status, String message) {
return new Result(status, message);
}
public static <T> Result<T> success(T t, String message) {
return new Result(1, t, message);
}
public static <T> Result<T> success(String message) {
return new Result(1, message);
}
public static <T> Result<T> fail(T t, String message) {
return new Result(0, t, message);
}
public static <T> Result<T> fail(String message) {
return new Result(0, message);
}
public static Result<String> success() {
return new Result(1, "OK");
}
public static Result<String> fail() {
return new Result(0, "FAIL");
}
public int getStatus() {
return this.status;
}
public String getMessage() {
return this.message;
}
public T getData() {
return this.data;
}
public void setStatus(int status) {
this.status = status;
}
public void setMessage(String message) {
this.message = message;
}
public void setData(T data) {
this.data = data;
}
}
AreaTreeDTO 类:
import lombok.Data;
import java.util.List;
@Data
public class AreaTreeDTO {
// 当前地区
private AreaInfoDTO areaInfoDTO ;
// 当前地区的下一级地区
private List<AreaTreeDTO> areaTreeDTOS ;
}
AreaInfo类:
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Table(name = "area_info")
public class AreaInfo {
/**
* id
*/
@Id
private Long id;
/**
* 区域名称
*/
@Column(name = "area_name")
private String areaName;
/**
* 区域编码
*/
@Column(name = "area_code")
private String areaCode;
/**
* 父类id
*/
@Column(name = "parent_id")
private Long parentId;
/**
* 创建时间
*/
@Column(name = "create_time")
private Date createTime;
/**
* 备注
*/
private String remark;
/**
* 1:正常 0:删除
*/
private Integer status;
/**
* 获取id
*
* @return id - id
*/
public Long getId() {
return id;
}
/**
* 设置id
*
* @param id id
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取区域名称
*
* @return area_name - 区域名称
*/
public String getAreaName() {
return areaName;
}
/**
* 设置区域名称
*
* @param areaName 区域名称
*/
public void setAreaName(String areaName) {
this.areaName = areaName;
}
/**
* 获取区域编码
*
* @return area_code - 区域编码
*/
public String getAreaCode() {
return areaCode;
}
/**
* 设置区域编码
*
* @param areaCode 区域编码
*/
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
/**
* 获取父类id
*
* @return parent_id - 父类id
*/
public Long getParentId() {
return parentId;
}
/**
* 设置父类id
*
* @param parentId 父类id
*/
public void setParentId(Long parentId) {
this.parentId = parentId;
}
/**
* 获取创建时间
*
* @return create_time - 创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置创建时间
*
* @param createTime 创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取备注
*
* @return remark - 备注
*/
public String getRemark() {
return remark;
}
/**
* 设置备注
*
* @param remark 备注
*/
public void setRemark(String remark) {
this.remark = remark;
}
/**
* 获取1:删除 0:正常
*
* @return status - 1:删除 0:正常
*/
public Integer getStatus() {
return status;
}
/**
* 设置1:删除 0:正常
*
* @param status 1:删除 0:正常
*/
public void setStatus(Integer status) {
this.status = status;
}
controller类:
@Controller
@Api(tags = "地区模块")
public class AreaController {
@Autowired
private IAreaService areaService ;
@GetMapping("/selectAreaListById")
@ApiOperation("级联查询地区")
@ResponseBody
public Result selectAreaListById(String id) {
return areaService.selectAreaListById(id);
}
@GetMapping("/selectAreaDataById")
@ApiOperation("级联查询地区树数据结构")
@ResponseBody
// 参数 id 对应的 是 parentId
public Result selectAreaDataById( String id) {
return areaService.selectAreaDataById(id);
}
}
注释:第二个接口,查出来的内容是树形的。
Service类:IAreaService
public interface IAreaService {
Result selectAreaListById(String id);
Result selectAreaDataById(String id);
}
ServiceImpl类:
@Service
public class AreaServiceImpl implements IAreaService {
@Autowired
private IAreaDao areaDao ;
@Override
public Result selectAreaListById(String id) {
if (null == id || "".equals(id.trim())){
id = "0" ;
}
List<AreaInfo> areaInfos = areaDao.selectAreaListById(id) ;
if (null != areaInfos && areaInfos.size()>0){
List<AreaInfoDTO> areaInfoDTOList= AreaInfoConvert.INSTANCE.doList2DtoList(areaInfos) ;
return Result.success(areaInfoDTOList,"查询成功") ;
}
return Result.fail("数据为空,查询失败");
}
@Override
public Result selectAreaDataById(String id) {
if (null == id || "".equals(id.trim())){
id = "0" ;
}//判断id中是否有值,如果有值就不走,如果没有值,就会将id变成0
AreaInfo areaInfo ; //实体类AreaInfo,这个是DO,是一个数据库的对象实体
//将查出来的信息,封装在实体类中。只是一个实体,不是很多实体类
if ("0".equals(id)){
areaInfo = areaDao.selectAreaInfoById("1") ;
}else {
areaInfo = areaDao.selectAreaInfoById(id) ;
}
//如果查出来的数据为空的时候,就会查询失败
if (null==areaInfo){
return Result.fail("数据为空,查询失败");
}
//创建一个DTD的对象
AreaTreeDTO areaTreeDTO = new AreaTreeDTO() ;
//将地区信息里面的参数,改成地区信息DTO的形式
areaTreeDTO.setAreaInfoDTO(AreaInfoConvert.INSTANCE.do2Dto(areaInfo));
//查询一个列表,就是parent_id=id的就是我们要查询的,最后,返回的是一个list的列表
List<AreaInfo> areaInfos = areaDao.selectAreaListById(id) ;
//然后查询的列表进行判断,如果有子节点,就将子节点放在父节点下面。
if (null != areaInfos && areaInfos.size()>0){
List<AreaTreeDTO> areaDataDTOS = getAraaList(areaInfos) ;
areaTreeDTO.setAreaTreeDTOS(areaDataDTOS);
return Result.success(areaDataDTOS,"查询成功") ;
}
return Result.fail("数据为空,查询失败");
}
/**
* 无限极递归
*
*
* @param list
* @return
*/
private List<AreaTreeDTO> getAraaList(List<AreaInfo> list) {
List<AreaTreeDTO> areaDataDTOS = new ArrayList<>() ;
//1,第一层
list.stream().forEach(areaInfo -> {
Long parentId = areaInfo.getId();
//2,第二层
List<AreaInfo> areaInfos = areaDao.selectAreaListById(parentId.toString());
AreaTreeDTO areaTreeDTO = new AreaTreeDTO() ;
areaTreeDTO.setAreaInfoDTO(AreaInfoConvert.INSTANCE.do2Dto(areaInfo));
if (null!=areaInfos && areaInfos.size()>0){
// 递归核心地方
List<AreaTreeDTO> areaTreeDTOList = getAraaList(areaInfos) ;
areaTreeDTO.setAreaTreeDTOS(areaTreeDTOList);
}
areaDataDTOS.add(areaTreeDTO) ;
});
return areaDataDTOS ;
}
}
mapper类:
import java.util.List;
public interface IAreaDao {
List<AreaInfo> selectAreaListById(String id);
AreaInfo selectAreaInfoById(String id);
}
mapperImpl类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
@Repository
public class AreaDaoImpl implements IAreaDao {
@Autowired
private AreaInfoMapper areaInfoMapper ;
@Override
public List<AreaInfo> selectAreaListById(String parentId) {
Example example = new Example(AreaInfo.class);
example.createCriteria()
.andEqualTo("parentId",parentId)
.andEqualTo("status", Constant.STATUS_ENABLE);
return areaInfoMapper.selectByExample(example);
}
@Override
public AreaInfo selectAreaInfoById(String id) {
Example example = new Example(AreaInfo.class);
example.createCriteria()
.andEqualTo("id",id) //会根据id,进行查找
.andEqualTo("status", Constant.STATUS_ENABLE); //查找的时候,会进行判断,如果是1,就是没有被删除,如果是0就是已经删除了。
return areaInfoMapper.selectOneByExample(example);
}
}
注释:有些包可能没有导入,因此可以改成自己的。
上面使用的方法,来自
tk_mybatis的mybatis_generator插件实现的类自带的接口。
使用Example类,需要传入一个值,这个值是实体类的编译后的类,通过反射的方式进行。
整个使用的方法是固定的,需要查询的就是,id,和status两个字段的属性。