Java最全谷粒学院权限管理模块,最新高频Java面试题目分享

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

拿到字节跳动offer后,简历被阿里捞了起来,二面迎来了P9"盘问"

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

//2.加入所有子菜单的id

this.selectPermissionChildById(id, idList);

//3.加入自己的id

idList.add(id);

//4.批量根据id删除菜单

baseMapper.deleteBatchIds(idList);

}

根据当前菜单id,查询其所有的子菜单的id并放入idList,分为这几步:

  1. 根据id查询下一层子菜单

  2. 循环变量子菜单list,将id放入idList

  3. 递归求子id的子id,也放入idList,以此类推

/**

  • 根据当前菜单id,查询菜单里面子菜单id,封装到list集合

  • @param id 当前菜单id

  • @param idList 最终封装要删除的id集合

*/

private void selectPermissionChildById(String id, List idList) {

LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();

//1.查询菜单里面子菜单id

queryWrapper.eq(Permission::getPid, id);

//2.只需要id

queryWrapper.select(Permission::getId);

List childIdList = baseMapper.selectList(queryWrapper);

//3.遍历子id集合,加入idList,然后递归遍历子菜单的子菜单

childIdList.stream().forEach(item -> {

idList.add(item.getId());

selectPermissionChildById(item.getId(), idList);

});

}

2.3 给角色分配权限

controller

根据角色id和菜单id集合,一个角色分配多个菜单(权限):

/**

  • 给角色分配权限 √

  • @param roleId 角色id

  • @param permissionId 分配的菜单id集合

  • @return

*/

@PostMapping(“/doAssign”)

public R doAssign(String roleId,String[] permissionId) {

permissionService.saveRolePermissionRealtionShipGuli(roleId,permissionId);

return R.ok();

}

service

/**

  • 角色分配菜单

  • @param roleId 角色id

  • @param permissionIds 菜单id集合

*/

@Override

public void saveRolePermissionRealtionShipGuli(String roleId, String[] permissionIds) {

//1.创建list集合,用于封装添加数据

List permissionList = new ArrayList<>();

for (String permissionId : permissionIds) {

if (StringUtils.isEmpty(permissionId)) continue;

RolePermission rolePermission = new RolePermission();

rolePermission.setPermissionId(permissionId);

rolePermission.setRoleId(roleId);

permissionList.add(rolePermission);

}

//2.批量保存到acl_role_permission表

rolePermissionService.saveBatch(permissionList);

}

2.4 根据角色获取菜单

controller

根据角色id获取对应的拥有的菜单集合:

/**

  • 根据角色获取菜单

  • @param roleId

  • @return

*/

@GetMapping(“toAssign/{roleId}”)

public R toAssign(@PathVariable String roleId) {

List list = permissionService.selectAllMenu(roleId);

return R.ok().data(“children”, list);

}

service

根据角色id获取菜单集合,具体分为这几步:

  1. 查询所有Perssion,并按id排序得到permissionList

  2. 根据roleId查询在acl_role_permission表里查询所有RolePerssion得到rolePermissionList

  3. 用stream将rolePermissionList所有对应的permissionId提取出来得到permissionIdList

  4. 遍历permissionList,如果对象的id是目标集合permissionIdList里的id,则设置select为true

  5. 把所有的菜单list集合permissionList进行树状封装,递归封装,最终返回

/**

  • 根据角色获取菜单

  • @param roleId 角色id

  • @return

*/

@Override

public List selectAllMenu(String roleId) {

//1.查询所有Perssion,并按id排序

List permissionList = baseMapper.selectList(new LambdaQueryWrapper().orderByDesc(Permission::getId));

//2.根据roleId查询在acl_role_permission表里查询所有RolePerssion

List rolePermissionList = rolePermissionService.list(new LambdaQueryWrapper().eq(RolePermission::getRoleId, roleId));

//3.用stream将rolePermissionList所有对应的permissionId提取出来

List permissionIdList = rolePermissionList.stream().map(e -> e.getPermissionId()).collect(Collectors.toList());

//4.遍历permissionList,如果对象的id是目标集合permissionIdList里的id,则设置select为true

permissionList.forEach(permission->{

if(permissionIdList.contains(permission.getId())){

permission.setSelect(true);

}else{

permission.setSelect(false);

}

});

//5.把所有的菜单list集合进行树状封装,递归封装

List resPermission = bulidPermission(permissionList);

return resPermission;

}

2.5 添加菜单

controller

直接调用mybatis-plus提供的方法:

/**

  • 新增菜单 √

  • @param permission

  • @return

*/

@PostMapping(“save”)

public R save(@RequestBody Permission permission) {

permissionService.save(permission);

return R.ok();

}

2.6 修改菜单

controller

根据菜单id修改菜单,直接调用mybatis-plus提供的方法:

/**

  • 修改菜单 √

  • @param permission

  • @return

*/

@PutMapping(“update”)

public R updateById(@RequestBody Permission permission) {

//直接根据id修改

permissionService.updateById(permission);

return R.ok();

}

3.角色相关操作


3.1 获取角色分页列表

/**

  • 获取角色分页列表

  • @param page 当前页

  • @param limit 每页数量

  • @param role 查询的角色,根据名字模糊查询

  • @return

*/

@GetMapping(“{page}/{limit}”)

public R index(@PathVariable Long page, @PathVariable Long limit, Role role) {

//构造page对象

Page pageParam=new Page<>(page,limit);

//构造查询,如果有名字查询则进行like模糊查询

LambdaQueryWrapper queryWrapper=new LambdaQueryWrapper<>();

if(StringUtils.isNotBlank(role.getRoleName())){

queryWrapper.like(Role::getRoleName,role.getRoleName());

}

//进行带条件的分页查询

roleService.page(pageParam,queryWrapper);

//返回最终的数据集合和总条数

return R.ok().data(“items”,pageParam.getRecords()).data(“total”,pageParam.getTotal());

}

3.2 其他操作

根据id获取角色:

/**

  • 根据id获取角色

  • @param id 角色id

  • @return

*/

@GetMapping(“get/{id}”)

public R get(@PathVariable String id) {

Role role = roleService.getById(id);

return R.ok().data(“item”, role);

}

新增角色:

/**

  • 保存角色

  • @param role 角色对象

  • @return

*/

@PostMapping(“save”)

public R save(@RequestBody Role role) {

roleService.save(role);

return R.ok();

}

根据id修改角色:

/**

  • 根据id修改角色

  • @param role

  • @return

*/

@PutMapping(“update”)

public R updateById(@RequestBody Role role) {

roleService.updateById(role);

return R.ok();

}

根据id删除角色:

/**

  • 根据id删除角色

  • @param id

  • @return

*/

@DeleteMapping(“remove/{id}”)

public R remove(@PathVariable String id) {

roleService.removeById(id);

return R.ok();

}

批量删除角色:

/**

  • 批量删除角色

  • @param idList 要删除角色的id集合

  • @return

*/

@DeleteMapping(“batchRemove”)

public R batchRemove(@RequestBody List idList) {

roleService.removeByIds(idList);

return R.ok();

}

4.用户相关操作


4.1 获取管理用户分页列表

/**

  • 获取管理用户分页列表

  • @param page 当前页

  • @param limit 每页数量

  • @param userQueryVo 查询条件,根据用户名字模糊查询

  • @return

*/

@GetMapping(“{page}/{limit}”)

public R index(@PathVariable Long page, @PathVariable Long limit, User userQueryVo) {

//构造page对象

Page pageParam = new Page<>(page, limit);

构造查询,如果有名字查询则进行like模糊查询

LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();

if (StringUtils.isNotBlank(userQueryVo.getUsername())) {

queryWrapper.like(User::getUsername, userQueryVo.getUsername());

}

//进行带条件的分页查询

userService.page(pageParam, queryWrapper);

//返回最终的数据集合和总条数

return R.ok().data(“items”, pageParam.getRecords()).data(“total”, pageParam.getTotal());

}

4.2 根据用户获取角色数据

controller

/**

  • 根据用户获取角色数据

  • @param userId 用户id

  • @return

*/

@GetMapping(“/toAssign/{userId}”)

public R toAssign(@PathVariable String userId) {

Map<String, Object> roleMap = roleService.findRoleByUserId(userId);

return R.ok().data(roleMap);

}

service

/**

  • 根据用户获取角色数据

  • @param userId

  • @return

*/

@Override

public Map<String, Object> findRoleByUserId(String userId) {

//1.查询所有的角色

List roleList = baseMapper.selectList(null);

//2.根据用户id查询对应UserRole对象

List userRoleList = userRoleService.list(new LambdaQueryWrapper()

.eq(UserRole::getUserId, userId)

.select(UserRole::getRoleId));

//3.将UserRole对象等价转换为Role集合,这些角色就是该用户拥有的

List resRoles = userRoleList.stream()

.map(e -> baseMapper.selectById(e.getRoleId()))

.collect(Collectors.toList());

Map<String, Object> map = new HashMap<>();

//4.告诉前端哪些是角色是该用户已经拥有的

map.put(“assignRoles”, resRoles);

//5.为了前端显示所有的角色

map.put(“allRolesList”, roleList);

return map;

}

4.3 根据用户分配角色

controller

/**

  • 根据用户分配角色

  • @param userId 用户id

  • @param roleId 角色id集合

  • @return

*/

@PostMapping(“/doAssign”)

public R doAssign(@RequestParam String userId, @RequestParam String[] roleId) {

roleService.saveUserRoleRealtionShip(userId, roleId);

return R.ok();

}

service

/**

  • 根据用户分配角色

  • @param userId

  • @param roleIds

*/

@Override

public void saveUserRoleRealtionShip(String userId, String[] roleIds) {

//分配前,先将原有的删除

userRoleService.remove(new LambdaQueryWrapper()

.eq(UserRole::getUserId, userId));

List userRoleList = new ArrayList<>();

//遍历roleIds,一个个封装到UserRole

for (String roleId : roleIds) {

最后

为什么我不完全主张自学?
平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

[外链图片转存中…(img-9SM9aNLn-1715357203679)]

[外链图片转存中…(img-vrZ8kDXf-1715357203679)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值