修改用户信息changeInfo




在持久层判断时:



问题:修改用户信息时,有一个这样的问题。举个例子:用户邮箱不是必填项,原本不为空。此时用户把邮箱信息删除后提交,这个时候如果非空来判断是否需要修改,则系统就会认为邮箱信息就不用修改。因此这种判断方式会混淆"原本有信息,但用户设置为空"和"原本有信息,但用户不做改动"这两种情况。


解决方法:

1)做更新一般两种方法,一种是根据对象实体整体更新,这种更新是每次覆盖的,所以要先把对象记录先读出来,改完后再全部字段更新回去。 另外一种是更新指定字段,这种就是拼SQL。 大部分时候都建议使用根据对象来更新的方法,虽然这种方法哪怕只更新一个字段也要每次覆盖全部字段,但是写代码简单。


2)这个问题不能在持久层dao中得到解决,首先,dao不应该考虑前端业务的问题 2.那么这个问题就需要业务层来解决,然后你这里其实有个问题,就是不规范,就是完全不清楚前端是 想更新这个空字段呢,还是不想更新,就是如果你业务层提供一个通用的方法,但是由于没有足够清楚的 规范,导致没法判断,所以前端到业务层,需要一个规范,比如你要将这个字段置空,就需要传特殊字符如-1,然后 业务层就可以做成一个通用的东西了。



以下直接用全部覆盖法实现系修改信息功能


1)持久层

接口:

    User getUserByUid(Integer uid);

    int updateInfoByUid(User user);

xml:


    
    
        
        
        
        
        
        
    

 

    
        update store.t_user
        set phone = #{phone},email=#{email},gender=#{gender},modified_user=#{modifiedUser},modified_time=#{modifiedTime}
        where uid=#{uid};
    

2)业务层


接口:

    //根据uid获取用户信息
    public User getUserByUid(Integer uid);

    //修改用户个人信息
    public void changeUserInfo(Integer uid,String username,User user);//此处的user对象封装了用户修改后的数据

实现类:

    //主要用于返回给前端用户的基本信息:用户名,邮箱,性别,电话
    @Override
    public User getUserByUid(Integer uid) {
        User user = userMapper.getUserByUid(uid);
        if (user == null){
            throw new UserNotFoundException("用户数据不存在!");
        }
        if (user.getIsDelete().equals(1)){
            throw new UserNotFoundException("用户已注销,不能返回用户信息!");
        }

        System.out.println("业务层查出的用户:"+user.toString());

        //为了减少数据量的大小,提高传输性能,重新创建一个用户对象,将有需要的字段封装穿回前端
        User user1=new User();
        user1.setUsername(user.getUsername());
        user1.setPhone(user.getPhone());
        user1.setEmail(user.getEmail());
        user1.setGender(user.getGender());


        return user1;
    }

    @Override
    public void changeUserInfo(Integer uid, String username, User user) {
        //通过uid擦汗寻该用户用来判断这个用户是否存在或者注销
        User user1 = userMapper.getUserByUid(uid);
        if (user1 == null){
            throw new UserNotFoundException("用户数据不存在!");
        }
        if (user1.getIsDelete().equals(1)){
            throw new UserNotFoundException("用户已注销,不能返回用户信息!");
        }

        // 向参数user中补全数据
        user.setUid(uid);
        user.setModifiedUser(username);
        user.setModifiedTime(new Date());

        int rows = userMapper.updateInfoByUid(user);
        if (rows != 1) {
            throw new UpdateException("更新用户数据时出现未知错误,请联系系统管理员");
        }

    }

以及ex包里面一些异常的编写:UpdateException等


3)控制层


    @RequestMapping("/getUser")
    public JsonResult getUserById(HttpSession session) {
        Integer uid = (Integer) session.getAttribute("uid");
        User user = userService.getUserByUid(uid);
        return new JsonResult(OK,user);

    }

    @RequestMapping("/changeUInfo")
    public JsonResult changeUserInfo(User user, HttpSession httpSession){
        Integer uid = getUidFromSession(httpSession);
        String username = getUsernameFromSession(httpSession);

        userService.changeUserInfo(uid,username,user);

        return new JsonResult(OK);

    }

以及BaseController里面一些异常的编写


4)前端


表单:简略版

js代码:

	




参考链接:https://bbs.csdn.net/topics/391065737



相关