第二天
1、部门
添加:使用form的方式,注意input标签的name属性
修改:通过json将后端传过来的数据隐藏到修改按钮上,代码实现
//使用getJson()可能存在递归
public String toJson(){
return JSON.toJSONString(this);
}
//---------这是分割线----------------------
<a href="#" class="btn btn-info btn-xs btn-input" data-option='${department.toJson()}'>
<span class="glyphicon glyphicon-pencil"></span> 编辑
</a>
---------------这是分割线-----------
<script>
$(function () {
//编辑功能
$(".btn-input").click(function () {
//获取data
var data = $(this).data("option");
//清空数据
$("input[name]").val("");
if(data){
$("input[name=name]").val(data.name);
$("input[name=sn]").val(data.sn);
$("input[name=id]").val(data.id);
}
$(".modal").modal("show");
});
});
</script>
删除 官网:sweetalert2
引入样式
<link rel="stylesheet" href="/js/plugins/sweetalert2/sweetalert2.min.css">
<script src="/js/plugins/sweetalert2/sweetalert2.min.js"></script>
2.RBAC
不同员工有不同权限,为了方便管理部分员工有相同的权限这中间引入了角色表
因为员工、角色和权限他们之间都是多对多的关系,所以需要设计中间表
权限表
确定权限表中的权限是什么(系统的每个Controller方法)
怎么将Controller转换成权限表的数据(Controller和权限表中间使用注解来转换)
怎么获取注解上的权限表达式(需要查询API如何获取)
权限的表的数据判断是否存在同时不能重复(使用Set集合,同时重写hashCode方法)
怎么批量插入数据库中(使用MyBatis的动态标签)
Controller
@RequestMapping("/reload")
@RequiredPermission(name = "权限加载", expression = "permission:reload")
@ResponseBody
public JsonResult reload() {
//获取所有权限
List<Permission> allPermissions = permissionService.listAll();
//将所有权限的权限表达式放进ArrayList中
ArrayList<String> expressions = new ArrayList<>();
for (Permission permission : allPermissions) {
expressions.add(permission.getExpression());
}
//创建不可重复的Set集合
Set<Permission> permissionSet = new LinkedHashSet<>();
//获取容器对象,从容器对象获取所有控制器对象,获取控制器对象的方法
Map<String, Object> beans = ctx.getBeansWithAnnotation(Controller.class);
Collection<Object> values = beans.values();
//遍历每个Controller
for (Object controller : values) {
Method[] declaredMethods = controller.getClass().getDeclaredMethods();
//遍历Controller上的每个方法
for (Method method : declaredMethods) {
RequiredPermission annotation = method.getAnnotation(RequiredPermission.class);
if (annotation != null) {
//使用Permission进行封装权限数据
Permission permission = new Permission();
permission.setName(annotation.name());
permission.setExpression(annotation.expression());
//判断List集合中是否存在数据
if (!expressions.contains(annotation.expression())) {
permissionSet.add(permission);
}
}
}
}
//不判空的话,传到Mapper中会SQL语法出错
if (permissionSet.size() > 0) {
permissionService.save(permissionSet);
}
return new JsonResult(true, "加载成功");
}
MyBatis
void batInsert(@Param("permissions") Set<Permission> permissions);
-----------------分隔线---------------
<insert id="batInsert">
insert into permission (name, expression) values
<foreach collection="permissions" separator="," item="p">
(#{p.name},#{p.expression})
</foreach>
</insert>
3.角色
3.1.角色新增
需要关联权限表(角色的Controller为了让跳转的input页面有权限数据需要权限的Service对象)
为了选取权限,需要一些js完成喧嚷,同时提交的时候将提交的参数传递给后台
<script>
function moveSelected(src, target) {
$("." + target).append($("." + src + "> option:selected"));
}
function moveAll(src, target) {
$("." + target).append($("." + src + "> option"));
}
</script>
后端接收的参数包括权限的id数组类型
public String saveOrUpdate(Role role,Long[] ids){
新增需要往中间表中插入数据
@Override
public void save(Role role, Long[] ids) {
roleMapper.insert(role);
if(ids!=null && ids.length>0){
for(Long id:ids){
roleMapper.insertRelation(role.getId(),id);
}
}
}
3.2.角色修改
需要获取该角色有什么权限,为此需要根据id去连权限表来查询该角色权限
左右来回移动权限,为了避免出现权限重复,需要再页面一渲染完毕的时候将权限进行去重
提交之后,数据库需要删除一开始的所有数据,在插入从前端获取的数据
3.3.角色删除
根据id删除角色信息,同时删除中间表的角色权限信息
为了优化代码,将删除的js抽取出来
$(".btn-delete").click(function () {
var url = $(this).data("url");
Swal.fire({
title: '你確定刪除?',
text: "此操作不可逆",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '确定',
cancelButtonText: "取消"
}).then((result) => {
if (result.value) {
location.href = url;
}
})