需要完成的功能如下
登录
验证账号、密码、验证码
先把数据存到mysql中,其中ticket是表示唯一的凭证,先写数据访问层,再写业务层,最后写表现层。
- 写实体类,实现对表的封装,实现增删改查。
package com.newcoder.community.entity;
import java.util.Date;
public class LoginTicket {
private int id;
private int userId;
private String ticket;
private int status;
private Date expired;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getTicket() {
return ticket;
}
public void setTicket(String ticket) {
this.ticket = ticket;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Date getExpired() {
return expired;
}
public void setExpired(Date expired) {
this.expired = expired;
}
@Override
public String toString() {
return "LoginTicket{" +
"id=" + id +
", userId=" + userId +
", ticket='" + ticket + '\'' +
", status=" + status +
", expired=" + expired +
'}';
}
}
/* int insertLoginTicket(LoginTicket loginTicket);
// 查询方法,整个表是围绕ticket进行的
// 唯一的标识
LoginTicket selectByTicket(String ticket);*/
2.接口,三个方法,通过注解加上sql语句。
package com.newcoder.community.dao;
import com.newcoder.community.entity.LoginTicket;
import org.apache.ibatis.annotations.*;
@Mapper
public interface LoginTicketMapper {
// 返回的是行数
@Insert({
"insert into login_ticket(user_id,ticket,status,expired) ",
"values(#{userId},#{ticket},#{status},#{expired}) "
})
@Options(useGeneratedKeys = true,keyProperty = "id")
int insertLoginTicket(LoginTicket loginTicket);
// 查询方法,整个表是围绕ticket进行的
// 唯一的标识,利用这个标识进行查表
@Select({
"select id,user_id,ticket,status,expired ",
"from login_ticket where ticket =#{ticket} "
})
LoginTicket selectByTicket(String ticket);
// 修改凭证的状态,如果是退出,则进行更改
@Update({
// 动态的sql
"<script>",
"update login_ticket set status =#{status} where ticket=#{ticket} ",
"if test=\"ticket!=null\"> ",
"and 1=1 ",
"</if>",
"</script>"
})
int updateStatus(String ticket,int status);
}
- 测试
@Autowired
private LoginTicketMapper loginTicketMapper;
@Test
public void testInsertLoginTick(){
LoginTicket loginTicket = new LoginTicket();
loginTicket.setId(101);
loginTicket.setTicket("abc");
loginTicket.setStatus(0);
loginTicket.setExpired(new Date(System.currentTimeMillis()+1000*60*18));
loginTicketMapper.insertLoginTicket(loginTicket);
}
测试结果显示成功插入信息。更新的逻辑也是没有问题的。
服务层直接加到userService`
@Autowired
private LoginTicketMapper loginTicketMapper;
// 登录的时候有多个情况失败
public Map<String,Object> login(String username,String password,int expiredSeconds){
Map<String,Object> map = new HashMap<>();
// 空值处理
if (StringUtils.isBlank(username)) {
map.put("usernameMsg","账号不能为空");
return map;
}
if (StringUtils.isBlank(password)) {
map.put("passwordMsg","密码不能为空");
return map;
}
// 验证账号
User user = userMapper.selectByName(username);
if (user == null){
map.put("usernameMsg","该账号不存在");
return map;
}
// 判断状态对不对
if (user.getStatus() == 0){
map.put("usernameMsg","该账号未激活");
return map;
}
// 验证密码
password = CommunityUtil.md5(password + user.getSalt());
if (!user.getPassword().equals(password)) {
map.put("passwordMsg","密码不正确!");
}
// 生成登录凭证
LoginTicket loginTicket = new LoginTicket();
loginTicket.setUserId(user.getId());
loginTicket.setTicket(CommunityUtil.generateUUid());
loginTicket.setStatus(0);
loginTicket.setExpired(new Date(System.currentTimeMillis()+expiredSeconds *1000));
loginTicketMapper.insertLoginTicket(loginTicket);
map.put("ticket",loginTicket.getTicket());
return map;
}