需求分析
@Override
public List<TreeVO> listResource() {
//一级目录父id为null
LambdaQueryWrapper<Resource> wrapper = Wrappers.<Resource>lambdaQuery()
.isNull(Resource::getParentId).orderByAsc(Resource::getSort);
List<Resource> resources = list(wrapper);
//资源需要转化
List<TreeVO> treeVOS = resources.stream().map(r->{
TreeVO treeVO=new TreeVO();
treeVO.setId(r.getResourceId());
treeVO.setTitle(r.getResourceName());
//二级目录特征:父id是上级的id
LambdaQueryWrapper<Resource> subwrapper = Wrappers.<Resource>lambdaQuery()
.eq(Resource::getParentId,r.getResourceId()).orderByAsc(Resource::getSort);
List<Resource> subResource = list(subwrapper);
//判断二级目录资源是否为空(其实可以写一个递归方法,这里因为数据库我就存了两层,所以没有封装)
if (CollectionUtils.isNotEmpty(subResource)){
List<TreeVO> children = subResource.stream().map(sub->{
TreeVO subTreeVO=new TreeVO();
subTreeVO.setId(sub.getResourceId());
subTreeVO.setTitle(sub.getResourceName());
return subTreeVO;
}).collect(Collectors.toList());
treeVO.setChildren(children);
}
return treeVO;
}).collect(Collectors.toList());
return treeVOS;
}
使用webjars依赖是为了当前段框架升级了,只需要修改一下它的版本号即可,否则要删掉重新下载,比较麻烦。引入webjars-locator就不用加入引用的框架的版本号,当有框架更替的时候,也就不用更改
数据库设计
这是我的笔记
盐密码匹配
配置成动态页面
改写依赖作用域,打包的时候不需要打进去
启动类增加包扫描注解
基本配置
mysql连接配置
动态页面配置
mybatis配置
日志配置
依赖
依赖
版本管理
依赖引用
插件
角色表
用户表(单角色)
资源表、资源角色中间表
客户表
数据库设计
这个前端框架非常拙手,记得在add页面删掉layui.all.js的引用
<script th:src="@{/webjars/layui/layui.all.js}"></script>
不然新增会请求两次后台.
在实战的过程中,遇到了一个问题,layui的form表单在ajax提交的时候执行了两次。导致的最直观的后果就是数据重复,每次保存的内容,都会在数据库中存两条,偶尔还会多一条
代码如下
layui.form.on('submit(addSubmit)', function (data) { $.ajax({ url: data.form.action , async: false//同步 , type: 'POST' , contentType: 'application/json;charset=utf-8' , data: JSON.stringify(data.field) , success: function (res) { if (res.code == 0) { layer.closeAll();//关闭弹出层 query(); } else { layer.alert(res, msg); } } }); return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。 });
看起来没有任何问题
查看了一些资料和回答,发现是引用layui.js的问题
解决方案,将下面的代码注释掉
<script th:src="@{/webjars/layui/layui.all.js}"></script>
执行后,终于正常了
数据库要初始化一个数据
数据库表关系
为角色分配资源
前端组件简介