1. 持久层
1.1 规划需要执行的sql语句
SELECT * FROM student WHERE sid = ?
1.2 设计接口和抽象方法
在mapper包的StudentMapper中进行定义
/**
* 根据学号选择学生对象
* @param sid 学生学号
* @return 学生对象数据
*/
Student findByStudentsid(String sid);
1.3 sql映射
在resources.mapper包的StudentMapper.xml进行sql映射
<resultMap id="StudentEntityMap" type="com.example.hzuniversity.entity.Student">
<!--将表的资源和类的属性不一致字段进行匹配指定,名称一致可以缩略不写-->
<!--定义映射规则时,主键不可省略-->
<id column="sid" property="sid"></id>
<result column="gender" property="gender"></result>
<result column="is_delete" property="isDelete"></result>
<result column="created_time" property="createdTime"></result>
<result column="modified_time" property="modifiedTime"></result>
</resultMap>
<select id="findByStudentsid" resultMap="StudentEntityMap">
SELECT * FROM student WHERE sid = #{sid}
</select>
1.4 单元功能测试
在test中mapper包StudentMapperTest中进行单元测试
@Test
public void findByStudentsid() {
Student student = studentMapper.findByStudentsid("5");
System.out.println(student);
}
2. 业务层
2.1 规划异常
- 用户登录密码错误PasswordNotMatchException
- 用户登录学号不存在SidNotFoundException
2.2 设计接口和抽象方法
在service包中IStudentService中定义
/**
* 学生登录接口
* @param sid 学号
* @param password 密码
* @return 学生对象数据
*/
Student Login(String sid, String password);
在实现类StudentServiceImpl中实现抽象方法
/**学生登录*/
@Override
public Student login(String sid, String password) {
Student result = studentMapper.findByStudentsid(sid);
if (result == null || result.getIsDelete() == 1) { // 用户账号不存在或已经注销
throw new SidNotFoundException("学号不存在!");
}
/**获取盐值对密码加密后进行比较*/
String salt = result.getSalt();
String newMd5Password = getMD5Password(password, salt);
String rpassword = result.getPassword();
if (!newMd5Password.equals(rpassword)) {
throw new PasswordNotMatchException("用户密码错误!");
}
// 只需要传输三个值id name avatar 响应速度更快 提升性能
Student student = new Student();
student.setSid(result.getSid());
student.setName(result.getName());
student.setAvatar(result.getAvatar());
return student;
}
2.3 单元测试
@Test
public void login() {
String sid = "5";
String password = "123456";
Student student = studentService.login(sid, password);
System.out.println(student);
}
3. 控制层
3.1 异常处理
- 用户登录密码错误PasswordNotMatchException配置在统一异常处理中
else if (e instanceof PasswordNotMatchException) {
result.setState(4001);
result.setMessage("密码错误");
}
- 用户登录学号不存在SidNotFoundException配置在统一异常处理中
else if (e instanceof SidNotFoundException) {
result.setState(4002);
result.setMessage("用户数据不存在");
}
3.2 设计请求
/stu/login
POST
String sid, String password, HttpSession session
JsonResult< Student >
3.3 处理请求
@RequestMapping("login")
public JsonResult<Student> login(String sid, String password, HttpSession session) {
Student student = studentService.login(sid, password);
// 向session对象中完成数据的绑定(session全局的)
session.setAttribute("sid", student.getSid());
session.setAttribute("username", student.getName());
return new JsonResult<Student>(OK, student);
}