毕设小结(四)
菜单权限分配
实现效果

逻辑分析
数据库分为角色表,菜单表,和角色菜单关联表
菜单表需要自己的id生成子id来调用自己,这样来形成2级菜单
2.png
角色表

角色菜单关系表

查询菜单列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| 1.点击选择菜单按钮,前端获取当前的roleid和roleflag ,设置roleId和roleFlag this.roleId = role.id this.roleFlag = role.flag 2.请求后端数据,发送请求,获取菜单数据 this.request.get("/menu").then(res => { this.menuData = res.data this.expends = this.menuData.map(v => v.id) console.log(expends) }) @GetMapping public Result findAll(@RequestParam(defaultValue = "") String name) { return Result.success( menuService.findMenus(name)); }
@Override public List<Menu> findMenus(String name) {
QueryWrapper<Menu> queryWrapper = new QueryWrapper<>(); if (StrUtil.isNotBlank(name)) { queryWrapper.like("name", name); } List<Menu> list = list(queryWrapper); List<Menu> parentNodes = list.stream().filter(menu -> menu.getPid() == null).collect(Collectors.toList()); for (Menu menu : parentNodes) { menu.setChildren(list.stream().filter(m -> menu.getId().equals(m.getPid())).collect(Collectors.toList())); } return parentNodes; }
|
前端渲染
发送请求,获取角色和菜单之间的关系,并且渲染成一个树形表
角色和菜单之间的关系,维护在一张表中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| this.request.get("/role/roleMenu/" + this.roleId).then(res => {
this.checks = res.data
this.ids.forEach(id => { if (!this.checks.includes(id)) { this.$nextTick(() => { this.$refs.tree.setChecked(id, false) }) } }) this.menuDialogVis = true })
|
文件上传
前端页面点击上传按钮,向后端发送请求,后端先生成文件信息上传到磁盘,再存储到数据库。返回文件的url地址。
文件上传
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| @Value("${files.upload.path}") private String fileuploadPath;
@PostMapping("/upload") public String upload(@RequestParam MultipartFile file) throws IOException { String originalFilename = file.getOriginalFilename(); String type = FileUtil.extName(originalFilename); long size = file.getSize(); String uuid = IdUtil.fastSimpleUUID(); String fileUuid = uuid + StrUtil.DOT + type; File file1 = new File(fileuploadPath + fileUuid); File parentFile=file1.getParentFile(); if(!parentFile.exists()){ parentFile.mkdirs(); } String url; File uploadFile = new File(fileuploadPath); file.transferTo(file1); String md5 = SecureUtil.md5(file1); Files one = getFileByMD5(md5); if (one != null) { url = one.getUrl(); file1.delete(); }else { url = "http://localhost:9091/file/" + fileUuid; }
Files files = new Files(); files.setName(originalFilename); files.setType(type); files.setUrl(url); files.setSize(size / 1024);
files.setMd5(md5); fileMapper.insert(files);
return url; }
private Files getFileByMD5(String md5) { QueryWrapper<Files> queryWrapper = new QueryWrapper(); queryWrapper.eq("md5", md5); List<Files> filesList = fileMapper.selectList(queryWrapper); return filesList.size()==0?null:filesList.get(0); }
@PostMapping("/insert") public Result save(@RequestBody Files files) { return Result.success(fileService.updateById(files)); }
|
文件下载
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @GetMapping("/{fileUuid}") public void download(@PathVariable String fileUuid, HttpServletResponse response) throws IOException { File file = new File(fileuploadPath + fileUuid); ServletOutputStream os = response.getOutputStream(); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileUuid, "UTF-8")); response.setContentType("application/octet-stream");
os.write(FileUtil.readBytes(file)); os.flush(); os.close(); }
|