一、封装树形菜单数据
表结构必须有parentId,以便于实现无限级分类,如下:
实体类
@Schema(description = "系统菜单实体类")
@Data
public class SysMenu extends BaseEntity {
@Schema(description = "父节点id")
private Long parentId;
@Schema(description = "节点标题")
private String title;
@Schema(description = "组件名称")
private String component;
@Schema(description = "排序值")
private Integer sortValue;
@Schema(description = "状态(0:禁止,1:正常)")
private Integer status;
// 下级列表
@Schema(description = "子节点")
private List<SysMenu> children;
}
java中使用:
-------controller-----
List<SysMenu> list = sysMenuService.findNodes();
-----------service-----
@Override
public List<SysMenu> findNodes() {
//1 查询所有菜单,返回list集合
List<SysMenu> sysMenuList = sysMenuMapper.findAll();
if(CollectionUtils.isEmpty(sysMenuList)) {
return null;
}
//2 调用工具类的方法,把返回list集合封装要求数据格式
List<SysMenu> treeList = MenuHelper.buildTree(sysMenuList);
return treeList;
}
---------util----------
//封装树形菜单数据
public class MenuHelper {
//递归实现封装过程
public static List<SysMenu> buildTree(List<SysMenu> sysMenuList) {
//sysMenuList所有菜单集合
//创建list集合,用于封装最终的数据
List<SysMenu> trees = new ArrayList<>();
//遍历所有菜单集合
for(SysMenu sysMenu:sysMenuList) {
//找到递归操作入口,第一层的菜单
//条件: parent_id=0
if(sysMenu.getParentId().longValue()==0) {
//根据第一层,找下层数据,使用递归完成
//写方法实现找下层过程,
// 方法里面传递两个参数:第一个参数当前第一层菜单,第二个参数是所有菜单集合
trees.add(findChildren(sysMenu,sysMenuList));
}
}
return trees;
}
//递归查找下层菜单
public static SysMenu findChildren(SysMenu sysMenu, List<SysMenu> sysMenuList) {
// SysMenu有属性 private List<SysMenu> children;封装下一层数据
sysMenu.setChildren(new ArrayList<>());
//递归查询
// sysMenu的id值 和 sysMenuList中parentId相同
for(SysMenu it:sysMenuList) {
//判断id 和 parentid是否相同
if(sysMenu.getId().longValue() == it.getParentId().longValue()) {
// it就是下层数据,进行封装
sysMenu.getChildren().add(findChildren(it,sysMenuList));
}
}
return sysMenu;
}
}
二、获取图片验证码
首先导入Hutool库
然后使用CaptchaUtil
具体用法举例:
//生成图片验证码
@Override
public ValidateCodeVo generateValidateCode() {
//1 通过工具生成图片验证码
//hutool
//int width, int height, int codeCount, int circleCount
CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2);
String codeValue = circleCaptcha.getCode();//4位验证码值
String imageBase64 = circleCaptcha.getImageBase64(); //返回图片验证码,base64编码
//2 把验证码存储到redis里面,设置redis的key: uuid redis的value :验证码值
//设置过期时间
String key = UUID.randomUUID().toString().replaceAll("-","");
redisTemplate.opsForValue().set("user:validate"+key,
codeValue,
5,
TimeUnit.MINUTES);
//3 返回ValidateCodeVo对象
ValidateCodeVo validateCodeVo = new ValidateCodeVo();
validateCodeVo.setCodeKey(key); //redis存储数据key,返回给前端接收,后续登录的时候前端拿着key给后端,后端拿着key去redis中查询验证码是否准确
validateCodeVo.setCodeValue("data:image/png;base64," + imageBase64);
return validateCodeVo;
}
这里返回的validateCodeVo
@Data
@Schema(description = "验证码响应结果实体类")
public class ValidateCodeVo {
@Schema(description = "验证码key")
private String codeKey ; // 验证码的key
@Schema(description = "验证码value")
private String codeValue ; // 图片验证码对应的字符串数据
}
--前端调用接收--
refreshCaptcha: async () => {
const { data } = await GetValidateCode() ;
state.model.codeKey = data.codeKey
state.captchaSrc = data.codeValue
},
标签:java,sysMenuList,description,List,验证码,sysMenu,整理,好用,Schema
From: https://blog.csdn.net/wuguanghui1/article/details/144390907