修改用户信息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
浙公网安备 33010602011771号