最近在实现一个菜单权限功能,想到一种自动化即时显示权限列表功能的实现,就是在我们写接口时通过反射的方式获取注解的数据,提取接口层的数据展示出来。
具体实现方式举例看下
@RequestMapping( path = "get", name = "查询", method = RequestMethod.GET)
public UserInfo get(@RequestParam Integer id) {
return userService.getById(id);
}
@RequestMapping( path = "create", name = "创建", method = RequestMethod.POST)
public UserInfo create(@Valid @RequestBody CreateUserRequest dto) throws CustomException{
return authService.register(dto);
}
在写接口实现时,良好的接口注释会写上接口的路径、请求方式和接口功能,通过反射出RequestMapping注解可以获取到这些数据,当我们需要控制权限时可以将角色和这些接口权限绑定一起来实现。如果我们需要获取所有的菜单功能,也可以通过类上注解的方式,每个控制器类就是一个菜单下功能。
比如:
@ClassMenu(uri = "/api/v1/users", mod = "系统管理", sub = "用户管理")
通过类上注解说明父菜单和子菜单的名称,然后获取类上注解内容可以及时得知新菜单和接口权限的数据。
类上注解实现方式:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ClassMenu {
String uri();
String mod();
String sub();
}
方法注解实现方式:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FuncMenu {
String value() default "";
}
自定义注解的定义方式很像接口,但与接口不同的是前面加了@代表注解
当然菜单权限功能的实现方式开始最能想到的实现方式就是保存在数据库里,后面新的菜单权限在前台录入然后及时更新数据库保证数据一致。不同的实现方式可以用在不同的业务场景下,可以择优选取。