感受:
其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。
特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。
也祝愿各位同学,都能找到自己心动的offer。
分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档
//2.加入所有子菜单的id
this.selectPermissionChildById(id, idList);
//3.加入自己的id
idList.add(id);
//4.批量根据id删除菜单
baseMapper.deleteBatchIds(idList);
}
根据当前菜单id,查询其所有的子菜单的id并放入idList,分为这几步:
-
根据id查询下一层子菜单
-
循环变量子菜单list,将id放入idList
-
递归求子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获取菜单集合,具体分为这几步:
-
查询所有Perssion,并按id排序得到permissionList
-
根据roleId查询在acl_role_permission表里查询所有RolePerssion得到rolePermissionList
-
用stream将rolePermissionList所有对应的permissionId提取出来得到permissionIdList
-
遍历permissionList,如果对象的id是目标集合permissionIdList里的id,则设置select为true
-
把所有的菜单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.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.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是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。
应该学哪些技术才能达到企业的要求?(下图总结)
样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。
除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。
我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。
应该学哪些技术才能达到企业的要求?(下图总结)
[外链图片转存中…(img-9SM9aNLn-1715357203679)]
[外链图片转存中…(img-vrZ8kDXf-1715357203679)]