1. 个人资料-持久层
1.1 编写sql语句
- 根据用户id查询数据库中的数据(已完成)
- 修改用户个人信息
1.2 mapper接口抽象方法
/**
* 根据用户id修改用户信息
* @param user 用户数据
* @return
*/
Integer updateInfoByUid(User user);
1.3 mapper对应映射文件
<!-- 修改用户信息-->
<update id="updateInfoByUid" >
update t_user set
<if test="phone!=null">phone = #{phone},</if>
<if test="email!=null">email = #{email},</if>
<if test="gender!=null">gender = #{gender},</if>
modified_user = #{modifiedUser},
modified_time = #{modifiedTime}
where uid = #{uid}
</update>
在mapper测试类中进行测试,检查业务逻辑性
2.个人资料-业务层
2.1 异常规划
涉及两个功能:
- 当页面打开时获取用户的信息并且填充到对应的文本框中
- 检测用户是否点击修改按钮,如果检测到则执行修改用户信息的操作
打开页面的时候可能找不到用户的数据,点击删除按钮之前需要再次去检测用户的数据是否存在。
2.2 UserService接口抽象方法开发
/**
* 根据用户id查询用户数据
* @param uid 用户id
* @return 匹配的 用户数据,如果没有匹配的数据,则返回null
*/
User getByUid(Integer uid);
/**
* 修改用户数据
* @param uid 用户id
* @param username 用户名
* @param user 用户数据
*/
void changeInfo(Integer uid,String username,User user);
2.3 实现类
/**
* 根据用户id查询用户数据
* @param uid 用户id
* @return 用户数据
*/
@Override
public User getByUid(Integer uid) {
// 判断用户是否存在
User user = userMapper.findByUid(uid);
if (user==null || user.getIsDelete()==1){
throw new UsernameNotFoundException("用户数据不存在");
}
// 若存在,对User进行封装传递到前端展示
User newUser = new User();
newUser.setUsername(user.getUsername());
newUser.setPhone(user.getPhone());
newUser.setEmail(user.getEmail());
newUser.setGender(user.getGender());
return newUser;
}
/**
* 修改用户资料
* @param uid 用户id
* @param username 用户名
* @param user 用户数据
*/
@Override
public void changeInfo(Integer uid, String username, User user) {
User result = userMapper.findByUid(uid);
if (result==null || result.getIsDelete()==1){
throw new UsernameNotFoundException("用户数据不存在");
}
// 将user对象中的数据补全
user.setUid(uid);
user.setModifiedUser(username);
user.setModifiedTime(new Date());
Integer i = userMapper.updateInfoByUid(user);
// 判断是否封信成功
if (i!=1){
throw new InsertException("更新数据产生未知的异常");
}
}
UserServiceTest 测试类进行测试,检查业务逻辑是否正确
package com.cy.store.service;
import com.cy.store.entity.User;
import com.cy.store.service.ex.ServiceException;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void reg() {
try {
// 创建用户对象并设置测试数据
User user = new User();
user.setUsername("lingorm"); // 设置用户名为"李四"
user.setPassword("123456"); // 设置密码为"123456"
// 调用UserService的注册方法
userService.reg(user);
// 如果注册成功,输出成功提示
System.out.println("新增成功");
} catch (ServiceException e) {
// 捕获业务异常,输出错误信息和异常类型名称
System.out.println(e.getMessage()); // 打印异常消息
System.out.println(e.getClass().getSimpleName()); // 打印异常类名
}
}
@Test
void login() {
User user = userService.login("ling", "1234");
System.out.println(user);
}
@Test
void changePassword() {
userService.changePassword(5, "lingorm", "123456", "1234");
}
@Test
void getByUid() {
User user = userService.getByUid(5);
System.out.println(user);
}
@Test
void changeInfo() {
User user = new User();
user.setPhone("12345678901");
user.setEmail("123456@qq.com");
user.setGender(1);
userService.changeInfo(5, "lingorm", user);
}
}
3. 个人资料-控制层
3.1 处理异常
暂时没有需要处理的异常
3.2 设计请求
- 设置一打开页面就发送查询用户数据的请求
/users/getByUid
GET
HttpSession session
JsonResult<User>
- 点击修改按钮发送用户的数据修改操作请求的设计
/users/changeInfo
POST
User user, HttpSession session
JsonResult<Void>
3.3 编写请求业务
/**
* 获取当前登录用户的信息
* @param session
* @return
*/
@GetMapping("/getByUid")
public JsonResult<User> getByUid(HttpSession session) {
Integer uid = getUidFromSession(session);
User data = userService.getByUid(uid);
return new JsonResult<>(OK, data);
}
/**
* 修改用户信息
* @param user
* @param session
* @return
*/
@RequestMapping("/changeInfo")
public JsonResult<Void> changeInfo(User user, HttpSession session) {
Integer uid = getUidFromSession(session);
String username = getUsernameFromSession(session);
userService.changeInfo(uid, username, user);
return new JsonResult<>(OK);
}
3.4 测试类进行测试
4. 个人资料-前端页面
- 在打开userdata.html页面时自动发送ajax请求,查询到数据填充到这个页面
$(document).ready(function () {})是 jQuery 中的一个常用方法,用于在文档(DOM)加载完成后执行指定的代码。它确保在执行代码之前,页面的 HTML 结构已经完全加载并准备好。
- $(document):获取当前文档对象。
- .ready():这是 jQuery 的一个方法,用于监听文档是否已经加载完成。
- function () {}:这是一个回调函数,当文档加载完成后会执行这个函数中的代码。
等价简写形式:
$(function () {
// 这里的代码会在 DOM 加载完成后执行
});
这段代码会在文档加载完成后绑定一个点击事件到 ID 为 `myButton` 的元素上。
// 页面 一加载就触发的方法
$(document).ready(function () {
// ajax发送请求
$.ajax({
url: "/users/getByUid",
type: "GET",
data: $("#form-change-info").serialize(),
dataType: "json",
success: function (json) {
if (json.state == 200) {
// 将查询到的数据封装到 前端控件 中
$("#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");
// prop 表示给某个属性 添加属性和属性值
radio.prop("checked","checked");
} else {
alert("数据不存在")
}
},
error: function (xhr) {
alert("查询用户信息时产生未知异常"+xhr.message)
}
})
})
- 在检测到用户点击了修改按钮之后发送一个ajax请求进行修改操作
<!-- 监听按钮是否被点击如果被点击触发函数 -->
$("#btn-change-info").click(function () {
// ajax发送请求
$.ajax({
url: "/users/changeInfo",
type: "POST",
data: $("#form-change-info").serialize(),
dataType: "json",
success: function (json) {
if (json.state == 200) {
alert("用户信息修改成功")
// 修改成功后重新加载页面
location.href = "userdata.html"
} else {
alert("用户信息修改失败")
}
},
error: function (xhr) {
alert("用户信息修改时产生未知异常"+xhr.message)
}
})
})
userdata.html完整代码
<script type="text/javascript">
<!-- 监听按钮是否被点击如果被点击触发函数 -->
$("#btn-change-info").click(function () {
// ajax发送请求
$.ajax({
url: "/users/changeInfo",
type: "POST",
data: $("#form-change-info").serialize(),
dataType: "json",
success: function (json) {
if (json.state == 200) {
alert("用户信息修改成功")
// 修改成功后重新加载页面
location.href = "userdata.html"
} else {
alert("用户信息修改失败")
}
},
error: function (xhr) {
alert("用户信息修改时产生未知异常"+xhr.message)
}
})
})
// 页面 一加载就触发的方法
$(document).ready(function () {
// ajax发送请求
$.ajax({
url: "/users/getByUid",
type: "GET",
data: $("#form-change-info").serialize(),
dataType: "json",
success: function (json) {
if (json.state == 200) {
// 将查询到的数据封装到 前端控件 中
$("#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");
// prop 表示给某个属性 添加属性和属性值
radio.prop("checked","checked");
} else {
alert("数据不存在")
}
},
error: function (xhr) {
alert("查询用户信息时产生未知异常"+xhr.message)
}
})
})
</script>