1.用redis 缓存存取地区树
Redis部分
1)刷新缓存
封装返回实体
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class SysTree {
private String value;
private String label;
private List<SysTree> children;
}
Service接口
/**
* 刷新缓存
*/
void refreshCache();
实现类
private String firstParentCode = "000000";
/**
* 刷新缓存
*/
@Override
public void refreshCache() {
//清空
RedisUtils.clearAllDataCache(RedisUtils.getAreaCodeCacheKey(firstParentCode));
RedisUtils.clearAllDataCache(RedisUtils.getAreaTreeCacheKey(firstParentCode));
// 刷入
RedisUtils.setDataCache(RedisUtils.getAreaTreeCacheKey(firstParentCode), getAreaCodeChildren(firstParentCode));
}
/**
* 获取子地区树
*
* @param parentCode
* @return
*/
private List<SysTree> getAreaCodeChildren(String parentCode) {
List<DictAreaCode> dictAreaCodes = dictAreaCodeMapper.selectChildCodeListByParentCode(parentCode);
List<SysTree> sysTreeList = new ArrayList<>();
SysTree sysTree;
if (!dictAreaCodes.isEmpty()) {
for (DictAreaCode areaCode : dictAreaCodes) {
sysTree = new SysTree();
sysTree.setValue(areaCode.getAreaCode());
sysTree.setLabel(areaCode.getAreaName());
sysTree.setChildren(getAreaCodeChildren(areaCode.getAreaCode()));
sysTreeList.add(sysTree);
RedisUtils.clearAllDataCache(RedisUtils.getAreaCodeCacheKey(areaCode.getAreaCode()));
RedisUtils.clearAllDataCache(RedisUtils.getAreaTreeCacheKey(areaCode.getAreaCode()));
// 缓存树
RedisUtils.setDataCache(RedisUtils.getAreaTreeCacheKey(areaCode.getAreaCode()), sysTree.getChildren());
// 缓存当前地区数据
RedisUtils.setDataCache(RedisUtils.getAreaCodeCacheKey(areaCode.getAreaCode()), areaCode);
}
}
return sysTreeList;
}
Mapper层查询地区字典表
/**
* 根据superCode进行查询
*
* @param parentCode
* @return
*/
List<DictAreaCode> selectChildCodeListByParentCode(String parentCode);
xml SQL语句
<select id="selectChildCodeListByParentCode" parameterType="String" resultMap="DictAreaCodeResult">
select * from dict_area_code
where parent_code = #{parentCode}
</select>
上面把地区树存入缓存
2)返给前端页面接口
Service 接口
/**
* 获取所有层级的deptid
*
* @return
*/
List<SysTree> selectTree(String parentCode);
**实现类**
/***
* 获取地区树
* @param parentCode
* @return
*/
@Override
public List<SysTree> selectTree(String parentCode) {
if (StringUtils.isEmpty(parentCode)) {
parentCode = firstParentCode;
}
List<SysTree> sysTreeList = RedisUtils.getDataCache(RedisUtils.getAreaTreeCacheKey(parentCode));
if (sysTreeList == null) {
sysTreeList = new ArrayList<>();
}
return sysTreeList;
}
controller 层
/**
* 地区树形结构
*
* @return
*/
@GetMapping("/selectTree")
public AjaxResult selectTree(String parentCode) {
return AjaxResult.success(dictAreaCodeService.selectTree(parentCode));
}
RedisUtils 工具类
package cn.guangl.common.utils;
import cn.guangl.common.constant.RedisConstants;
import cn.guangl.common.core.redis.RedisCache;
import cn.guangl.common.utils.spring.SpringUtils;
import java.util.Collection;
/**
* redis 工具类
*
* @author lhh
*/
public class RedisUtils {
public static <T> void setDataCache(String key, T data) {
SpringUtils.getBean(RedisCache.class).setCacheObject(key, data);
}
public static <T> T getDataCache(String key) {
Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(key);
if (StringUtils.isNotNull(cacheObj)) {
T data = StringUtils.cast(cacheObj);
return data;
}
return null;
}
public static void clearAllDataCache(String prefixKey) {
Collection<String> keys = SpringUtils.getBean(RedisCache.class).keys(prefixKey + "*");
SpringUtils.getBean(RedisCache.class).deleteObject(keys);
}
public static void clearDataCache(String key) {
Collection<String> keys = SpringUtils.getBean(RedisCache.class).keys(key);
SpringUtils.getBean(RedisCache.class).deleteObject(keys);
}
/**
* 获取机构完整 key
*
* @param key
* @return
*/
public static String getDeptCacheKey(String key) {
return RedisConstants.SYS_DEPT_KEY + key;
}
/**
* 获取地区key
*
* @param key
* @return
*/
public static String getAreaCodeCacheKey(String key) {
return RedisConstants.SYS_AREA_CODE_KEY + key;
}
public static String getAreaTreeCacheKey(String key) {
return RedisConstants.SYS_AREA_TREE_KEY + key;
}
}
常量类
/**
* 地区编码缓存
*/
public static final String SYS_AREA_CODE_KEY = "sys_area_code:";
/**
* 地区树缓存
*/
public static final String SYS_AREA_TREE_KEY = "sys_area_tree:";
地区字典表见下片