若依框架学习(五)用户的增删改查

本文介绍了前端通过部门树状图触发的用户列表查询,详细解析了`getList()`方法的复用和权限校验。重点讲解了`getUserInfo()`方法如何根据部门ID过滤数据,并展示了`checkUserDataScope()`在不同场景下的作用。最后涉及了事务处理和数据关联操作的实现细节。
摘要由CSDN通过智能技术生成

点击部门树状图来进行条件查询

前端找到对应的页面,按照路由路径
在这里插入图片描述
里面有个handleNodeClick()点击事件,点进去看看
在这里插入图片描述
发现是复用了getList()方法,说明后台也是复用相应的方法

/**
     * 获取用户列表
     */
    //@PreAuthorize在调用方法前先检查有没有权限,通过Service层的@ss.hasPermi()方法来校验
    @PreAuthorize("@ss.hasPermi('system:user:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectUserList(user);
        return getDataTable(list);
    }

之前点击用户管理,调用这个方法传入的参数是null,没有deptId,现在通过部门树状图点击,会传入一个参数deptId
在这里插入图片描述
那具体也不讲,也就是通过数据库根据条件部门id去查找的。

添加数据

添加用户的预加载
在这里插入图片描述

reset是表单重置
getTreeselect()获取部门树状图,奇怪为啥还要这个东西,原因是新增用户界面有一个部门选项
在这里插入图片描述
然后就是getUser()方法回传了role角色和rost岗位的参数,我们看下这个方法
在这里插入图片描述
然后我们从后端查看该方法,从url中可以看出是在user/下的,带有一个userId参数,很顺利也找到了对应的方法

/**
     * 根据用户编号获取详细信息
     */
    @PreAuthorize("@ss.hasPermi('system:user:query')")
    @GetMapping(value = { "/", "/{userId}" })
    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
    {
        userService.checkUserDataScope(userId);
        AjaxResult ajax = AjaxResult.success();
        List<SysRole> roles = roleService.selectRoleAll();
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        ajax.put("posts", postService.selectPostAll());
        if (StringUtils.isNotNull(userId))
        {
            ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId));
            ajax.put("postIds", postService.selectPostListByUserId(userId));
            ajax.put("roleIds", roleService.selectRoleListByUserId(userId));
        }
        return ajax;
    }

这个方法主要是获取系统目前所有的角色集合(超级管理员除外)以及岗位信息集合。至于参数的userId是在修改用户信息时,才用到。

/**
     * 校验用户是否有数据权限
     * 
     * @param userId 用户id
     */
    @Override
    public void checkUserDataScope(Long userId)
    {
        if (!SysUser.isAdmin(SecurityUtils.getUserId()))
        {
            SysUser user = new SysUser();
            user.setUserId(userId);
            List<SysUser> users = SpringUtils.getAopProxy(this).selectUserList(user);
//            List<SysUser> users = selectUserList(user);
            if (StringUtils.isEmpty(users))
            {
                throw new ServiceException("没有权限访问用户数据!");
            }
        }
    }

首先先检查当前登录用户是否有数据权限,不过只要你能点击新增用户的按钮,这个检查肯定能过,因为传入的userId为null,它就会查询所有的用户出来,所以也不会抛出"没有权限访问用户数据!"的异常。估计是修改用户的时候才会起到作用。

回到controller,接下来就是把所有的角色信息和岗位信息封装成AjaxResult,返回给前端。

添加用户信息

当我们填写好新增用户信息时,是要按确认才能生效。一般方法应该是submit或则有注解是提交之类,
在这里插入图片描述
之里面做了一个判断,如果有userId的话,则是修改,不是的话则执行新增方法,我们看下新增方法
在这里插入图片描述
看到这里我也知道后端controller对应的方法在哪了,

/**
     * 校验手机号码是否唯一
     *
     * @param user 用户信息
     * @return
     */
    @Override
    public String checkPhoneUnique(SysUser user)
    {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
        //如果info为空,说明手机号肯定没重复,但如果是info不为空的,有可能是同一个用户,如果不是同一个用户则说明手机号重复。
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

其中判断用户名是否重复是通过sql的count来判断,而手机号的重复性是通过查询该手机号对应的用户,如果结果是null,则说明手机号不重复,另一种情况是,查出来某个用户,但如果这个用户和参数的用户的userid相同,则说明是同一个人,估计修改的功能,说明该方法多次复用。
邮箱账号的重复性与手机号的判断类似。
然后就是加密,这里用springsecurity的BCryptPasswordEncoder(官方推荐)
最后是把新增用户信息保存数据库,运用了事务的原理

/**
     * 新增保存用户信息
     * 
     * @param user 用户信息
     * @return 结果
     */
    @Override
    @Transactional
    public int insertUser(SysUser user)
    {
        // 新增用户信息
        int rows = userMapper.insertUser(user);
        // 新增用户岗位关联
        insertUserPost(user);
        // 新增用户与角色管理
        insertUserRole(user);
        return rows;
    }

这里不止插入了用户信息,还插入了中间表
在这里插入图片描述
因为用户与角色,与岗位是多对多的关系,所以需要中间表来记录各自的主键id。

举个岗位插入例子

/**
     * 新增用户岗位信息
     * 
     * @param user 用户对象
     */
    public void insertUserPost(SysUser user)
    {
        Long[] posts = user.getPostIds();
        if (StringUtils.isNotNull(posts))
        {
            // 新增用户与岗位管理
            List<SysUserPost> list = new ArrayList<SysUserPost>();
            for (Long postId : posts)
            {
                SysUserPost up = new SysUserPost();
                up.setUserId(user.getUserId());
                up.setPostId(postId);
                list.add(up);
            }
            if (list.size() > 0)
            {
                userPostMapper.batchUserPost(list);
            }
        }
    }

通过foreach循环记录多个SysUserPost ,然后封装成List,给mybatis,通过动态sql加上foreach标签来循环插入数据到中间表。

在这里插入图片描述
在这里插入图片描述
而userId是102,按理说执行玩mapper方法应该已经插入数据库,可是数据库却没变化
在这里插入图片描述
在这里插入图片描述
这是因为使用了事务的注解,使得这几行代码也有事务的特性。
回到controller层,最后把影响的行数返回给AjaxResult,如果row>0,则说明新增用户成功,返回一个AjaxResult给前端。

若依用户管理的增删改查操作需要满足以下条件: 1. 对于新增用户操作,首先需要检查当前登录用户是否有数据权限。如果传入的userId为null,系统会查询所有的用户信息,不会抛出"没有权限访问用户数据!"的异常。这个检查主要在修改用户信息时起作用。\[1\] 2. 获取系统目前所有的角色集合和岗位信息集合。这个方法主要用于获取角色和岗位信息,参数userId在修改用户信息时使用。\[2\] 3. 在添加菜单时,需要给出请求地址和相应的权限。权限可以限制不同登录用户对教师目录的查看权限。这个权限可以在数据库表中进行修改,也可以在页面上进行修改。例如,可以给普通用户添加管理教师的权限。\[3\] 综上所述,若依用户管理的增删改查操作需要满足以上条件。 #### 引用[.reference_title] - *1* *2* [若依框架学习()用户增删改查](https://blog.csdn.net/weixin_41262132/article/details/122831742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [诺依框架二给普通用户菜单设置增删改查的权限](https://blog.csdn.net/qq_40579139/article/details/125638278)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值