修改用户信息changeInfo



在持久层判断时:



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


解决方法:

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


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



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


1)持久层

接口:

    User getUserByUid(Integer uid);

    int updateInfoByUid(User user);

xml:


    <!--解决实体类属性名和数据库字段名不一致的问题-->
    <resultMap id="UserEntityMap" type="user">
        <id column="uid" property="uid"/>
        <result column="is_delete" property="isDelete"/>
        <result column="created_user" property="createdUser"/>
        <result column="created_time" property="createdTime"/>
        <result column="modified_user" property="modifiedUser"/>
        <result column="modified_time" property="modifiedTime"/>
    </resultMap>

 <select id="getUserByUid" resultMap="UserEntityMap">
        select * from store.t_user where uid=#{uid};
    </select>

    <update id="updateInfoByUid" >
        update store.t_user
        set phone = #{phone},email=#{email},gender=#{gender},modified_user=#{modifiedUser},modified_time=#{modifiedTime}
        where uid=#{uid};
    </update>

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<User> getUserById(HttpSession session) {
        Integer uid = (Integer) session.getAttribute("uid");
        User user = userService.getUserByUid(uid);
        return new JsonResult<User>(OK,user);

    }

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

        userService.changeUserInfo(uid,username,user);

        return new JsonResult<Void>(OK);

    }

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


4)前端


表单:简略版

<form id="form-change-info" class="form-horizontal" role="form">
      
      <input id="username" type="text" class="form-control" value="" readonly="readonly">
      <input id="phone" name="phone" type="text" class="form-control" placeholder="请输入电话号码" value="">
      <input id="email" name="email" type="text" class="form-control" placeholder="请输入电子邮箱" value="">
      <input id="gender-male" type="radio" name="gender" value="1">男
      <input id="gender-female" type="radio" name="gender" value="0">女

      <input id="btn-change-info" type="button" class="btn btn-primary" value="修改" />
								
<form>

js代码:

	<script type="text/javascript">
		$(document).ready(function (){ //当网页加载时即触发该函数
			$.ajax({
				url:"/users/getUser",
				type:"get",
				dataType:"json",
				success:function (json) {
					if (json.state==200){

							console.log(json);
							// console.log("phone=" + json.data.phone);
							// console.log("email=" + json.data.email);
							// console.log("gender=" + json.data.gender);
							$("#username").val(json.data.username);
							$("#phone").val(json.data.phone);
							$("#email").val(json.data.email);
							let radio = json.data.gender == 0 ? $("#gender-female") :
									$("#gender-male");
							radio.prop("checked", "checked");


						}else{
						alert("获取当前用户数据失败!"+json.message);
					}
				}
			})
		});

		$("#btn-change-info").click(function() {
			$.ajax({
				url: "/users/changeUInfo",
				type: "POST",
				data: $("#form-change-info").serialize(),
				dataType: "json",
				success: function(json) {
					if (json.state == 200) {
						alert("修改成功!");
						location.href = "login.html";
					} else {
						alert("修改失败!" + json.message);
					}
				},
				error: function(xhr) {
					alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status);
					location.href = "login.html";
				}
			});
		});

	</script>




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



posted @ 2022-04-08 16:47  卡卡发  阅读(139)  评论(0)    收藏  举报