经过前面的编写,现在我们已经可以从后台获取一个静态菜单返回给前端了。当然这不科学,我们需要的是一个可编辑的菜单。实现了菜单编辑后,我们需要把所有菜单都实现了。

要实现菜单编辑,并且希望不对SCUI做出太多修改,那就先研究SCUI设计的菜单结构,考虑如何与后端对应。

{ id: "", parentId: "", name: "", path: "", component: "", redirect: "", meta:{ title: "", icon: "", active: "", color: "", type: "menu" }, apiList: [] }

实体类设计:

@Data @TableName(value = "sys_menu",resultMap = "sysMenuMap") public class SysMenuEntity { @TableId(type = IdType.AUTO) private Long id; private Long parentId; private String title; public String getTitle(){ return this.meta.getTitle(); } private String type; public String getType(){ return this.meta.getType(); } private String name; private String icon; public String getIcon(){ return this.meta.getIcon(); } private String path; private String redirect; private String active; private String component; private String color; private Boolean hidden; private Boolean hiddenBreadcrumb; private Boolean affix; public Boolean getAffix(){ return this.meta.getAffix(); } @TableField(exist = false) private SysMenuMeta meta; private LocalDateTime createTime; private Long createBy; private LocalDateTime updateTime; private Long updateBy; }

XML:

<resultMap id="sysMenuMap" type="com.demo.satoken.modules.sys.entity.SysMenuEntity"> <id column="id" property="id"/> <result column="parent_id" property="parentId"/> <result column="name" property="name"/> <result column="path" property="path"/> <result column="redirect" property="redirect"/> <result column="active" property="active"/> <result column="component" property="component"/> <result column="color" property="color"/> <result column="hidden" property="hidden"/> <result column="hidden_breadcrumb" property="hiddenBreadcrumb"/> <association property="meta" javaType="com.demo.satoken.modules.sys.dto.SysMenuMeta"> <result column="icon" property="icon"/> <result column="title" property="title"/> <result column="type" property="type"/> <result column="affix" property="affix"/> </association> </resultMap>

指定resultMap,可以让后台返回满足前端格式的数据。手动实现get函数,是为了让前端传来的数据入库时可以获取正确的值。暂时先这么设计,后续权限完善以后说不定会选择缓存到Redis中,到时候还需要重写。

实现SysMenu的MP实现(mapper、service、serviceImpl),增加、修改菜单接口:

@RestController @RequestMapping("/system/menu") public class SysMenuController { @Autowired private SysMenuService menuService; @GetMapping("/my") public SaResult my(){ Map<String,Object> data = new HashMap<>(); List<String> permissions = new ArrayList<>(); permissions.add("list.add"); permissions.add("list.edit"); permissions.add("list.delete"); permissions.add("user.add"); permissions.add("user.edit"); permissions.add("user.delete"); data.put("permissions",permissions); // 菜单增删改查功能测试完成前此处应该使用静态数据 List<SysMenuEntity> list = menuService.list(); data.put("menu",list); return SaResult.data(data); } @GetMapping("/list") public SaResult list(){ List<SysMenuEntity> list = menuService.list(); return SaResult.data(list); } @PostMapping("save") public SaResult save(@RequestBody SysMenuEntity menuEntity){ menuService.save(menuEntity); return SaResult.data(menuEntity.getId()); } @PostMapping("update") public SaResult update(@RequestBody SysMenuEntity menuEntity){ menuService.updateById(menuEntity); return SaResult.ok(); } @PostMapping("delete") public SaResult delete(@RequestBody Long[] ids){ menuService.removeByIds(Arrays.asList(ids)); return SaResult.ok(); } }

利用测试CRUD功能的空档在菜单中加入几个基础菜单项,最重要的是把《菜单管理》这个菜单添加好

在SCUI中修改、增加相应的接口信息:

myMenus: { url: `${config.API_URL}/system/menu/my`, name: "获取我的菜单", get: async function(){ return await http.get(this.url); } }, list: { url: `${config.API_URL}/system/menu/list`, name: "获取菜单", get: async function(){ return await http.get(this.url); } }, save: { url: `${config.API_URL}/system/menu/save`, name: "保存菜单", post: async function(params){ return await http.post(this.url,params); } }, update: { url: `${config.API_URL}/system/menu/update`, name: "修改菜单", post: async function(params){ return await http.post(this.url,params); } }, delete: { url: `${config.API_URL}/system/menu/delete`, name: "删除菜单", post: async function(params){ return await http.post(this.url,params); } }

在views/setting/menu的页面中修改相应的接口调用

自动管理和手动管理后台(从零开始码后台管理系统)(1)

自动管理和手动管理后台(从零开始码后台管理系统)(2)

自动管理和手动管理后台(从零开始码后台管理系统)(3)

登录测试:

自动管理和手动管理后台(从零开始码后台管理系统)(4)

菜单加载成功

然后使用菜单管理功能写入所有菜单

自动管理和手动管理后台(从零开始码后台管理系统)(5)

写入部分菜单

OK,菜单管理搞定。

,