Feat: [后台]:新增获取当前用户基本信息接口

This commit is contained in:
fanxb 2019-07-30 17:13:12 +08:00
parent c39bc7922c
commit d26ffa1dd4
4 changed files with 285 additions and 240 deletions

View File

@ -4,6 +4,7 @@ import com.fanxb.bookmark.business.user.entity.LoginBody;
import com.fanxb.bookmark.business.user.entity.RegisterBody; import com.fanxb.bookmark.business.user.entity.RegisterBody;
import com.fanxb.bookmark.business.user.service.UserService; import com.fanxb.bookmark.business.user.service.UserService;
import com.fanxb.bookmark.common.entity.Result; import com.fanxb.bookmark.common.entity.Result;
import com.fanxb.bookmark.common.util.UserContextHolder;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -50,6 +51,18 @@ public class UserController {
return Result.success(null); return Result.success(null);
} }
/**
* Description: 获取当前登录用户的基本信息
*
* @return com.fanxb.bookmark.common.entity.Result
* @author fanxb
* @date 2019/7/30 15:14
*/
@GetMapping("/currentUserInfo")
public Result currentUserInfo() {
return Result.success(userService.getUserInfo(UserContextHolder.get().getUserId()));
}
/** /**
* Description: 用户登录 * Description: 用户登录
* *

View File

@ -1,56 +1,66 @@
package com.fanxb.bookmark.business.user.dao; package com.fanxb.bookmark.business.user.dao;
import com.fanxb.bookmark.common.entity.User; import com.fanxb.bookmark.common.entity.User;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
* 类功能简述 * 类功能简述
* 类功能详述 * 类功能详述
* *
* @author fanxb * @author fanxb
* @date 2019/7/6 11:36 * @date 2019/7/6 11:36
*/ */
@Component @Component
public interface UserDao { public interface UserDao {
/** /**
* Description: 新增一个用户 * Description: 新增一个用户
* *
* @param user user * @param user user
* @author fanxb * @author fanxb
* @date 2019/7/6 11:37 * @date 2019/7/6 11:37
*/ */
void addOne(User user); void addOne(User user);
/** /**
* Description: 通过用户名或者email获取用户信息 * Description: 通过用户名或者email获取用户信息
* *
* @param name username * @param name username
* @param email email * @param email email
* @return com.fanxb.bookmark.common.entity.User * @return com.fanxb.bookmark.common.entity.User
* @author fanxb * @author fanxb
* @date 2019/7/6 16:45 * @date 2019/7/6 16:45
*/ */
User selectByUsernameOrEmail(@Param("name") String name, @Param("email") String email); User selectByUsernameOrEmail(@Param("name") String name, @Param("email") String email);
/** /**
* Description: 更新用户上次登录时间 * Description: 更新用户上次登录时间
* *
* @param time 时间 * @param time 时间
* @param userId 用户id * @param userId 用户id
* @author fanxb * @author fanxb
* @date 2019/7/6 16:46 * @date 2019/7/6 16:46
*/ */
void updateLastLoginTime(@Param("time") long time, @Param("userId") int userId); void updateLastLoginTime(@Param("time") long time, @Param("userId") int userId);
/** /**
* Description: 更新一个参数 * Description: 更新一个参数
* *
* @param password 新密码 * @param password 新密码
* @param email 邮箱 * @param email 邮箱
* @author fanxb * @author fanxb
* @date 2019/7/9 20:03 * @date 2019/7/9 20:03
*/ */
void resetPassword(@Param("password") String password,@Param("email") String email); void resetPassword(@Param("password") String password,@Param("email") String email);
}
/**
* Description: 根据用户id查询用户信息
*
* @author fanxb
* @date 2019/7/30 16:08
* @param userId userId
* @return com.fanxb.bookmark.common.entity.User
*/
User selectByUserId(int userId);
}

View File

@ -1,147 +1,159 @@
package com.fanxb.bookmark.business.user.service; package com.fanxb.bookmark.business.user.service;
import com.fanxb.bookmark.business.user.dao.UserDao; import com.fanxb.bookmark.business.user.dao.UserDao;
import com.fanxb.bookmark.business.user.entity.LoginBody; import com.fanxb.bookmark.business.user.entity.LoginBody;
import com.fanxb.bookmark.business.user.entity.LoginRes; import com.fanxb.bookmark.business.user.entity.LoginRes;
import com.fanxb.bookmark.business.user.entity.RegisterBody; import com.fanxb.bookmark.business.user.entity.RegisterBody;
import com.fanxb.bookmark.common.constant.Constant; import com.fanxb.bookmark.common.constant.Constant;
import com.fanxb.bookmark.common.entity.MailInfo; import com.fanxb.bookmark.common.entity.MailInfo;
import com.fanxb.bookmark.common.entity.User; import com.fanxb.bookmark.common.entity.User;
import com.fanxb.bookmark.common.exception.CustomException; import com.fanxb.bookmark.common.exception.CustomException;
import com.fanxb.bookmark.common.exception.FormDataException; import com.fanxb.bookmark.common.exception.FormDataException;
import com.fanxb.bookmark.common.util.*; import com.fanxb.bookmark.common.util.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* 类功能简述 * 类功能简述
* 类功能详述 * 类功能详述
* *
* @author fanxb * @author fanxb
* @date 2019/7/5 17:39 * @date 2019/7/5 17:39
*/ */
@Service @Service
public class UserService { public class UserService {
private static final String DEFAULT_ICON = "defaultIcon.png"; private static final String DEFAULT_ICON = "defaultIcon.png";
/** /**
* 短期jwt失效时间 * 短期jwt失效时间
*/ */
private static final long SHORT_EXPIRE_TIME = 2 * 60 * 60 * 1000; private static final long SHORT_EXPIRE_TIME = 2 * 60 * 60 * 1000;
/** /**
* 长期jwt失效时间 * 长期jwt失效时间
*/ */
private static final long LONG_EXPIRE_TIME = 30L * TimeUtil.DAY_MS; private static final long LONG_EXPIRE_TIME = 30L * TimeUtil.DAY_MS;
@Autowired @Autowired
private UserDao userDao; private UserDao userDao;
/** /**
* Description: 向目标发送验证码 * Description: 向目标发送验证码
* *
* @param email 目标 * @param email 目标
* @author fanxb * @author fanxb
* @date 2019/7/5 17:48 * @date 2019/7/5 17:48
*/ */
public void sendAuthCode(String email) { public void sendAuthCode(String email) {
MailInfo info = new MailInfo(); MailInfo info = new MailInfo();
info.setSubject("签签世界注册验证码"); info.setSubject("签签世界注册验证码");
String code = StringUtil.getRandomString(6, 2); String code = StringUtil.getRandomString(6, 2);
info.setContent("欢迎注册 签签世界 ,本次验证码"); info.setContent("欢迎注册 签签世界 ,本次验证码");
info.setContent(code + " 是您的验证码注意验证码有效期为15分钟哦"); info.setContent(code + " 是您的验证码注意验证码有效期为15分钟哦");
info.setReceiver(email); info.setReceiver(email);
if (Constant.isDev) { if (Constant.isDev) {
code = "123456"; code = "123456";
} else { } else {
MailUtil.sendTextMail(info); MailUtil.sendTextMail(info);
} }
RedisUtil.set(Constant.authCodeKey(email), code, Constant.AUTH_CODE_EXPIRE); RedisUtil.set(Constant.authCodeKey(email), code, Constant.AUTH_CODE_EXPIRE);
} }
/** /**
* Description: 用户注册 * Description: 用户注册
* *
* @param body 注册表单 * @param body 注册表单
* @author fanxb * @author fanxb
* @date 2019/7/6 11:30 * @date 2019/7/6 11:30
*/ */
public void register(RegisterBody body) { public void register(RegisterBody body) {
String codeKey = Constant.authCodeKey(body.getEmail()); String codeKey = Constant.authCodeKey(body.getEmail());
String realCode = RedisUtil.get(codeKey, String.class); String realCode = RedisUtil.get(codeKey, String.class);
if ((!StringUtil.isEmpty(realCode)) && (!realCode.equals(body.getAuthCode()))) { if ((!StringUtil.isEmpty(realCode)) && (!realCode.equals(body.getAuthCode()))) {
throw new CustomException("验证码错误"); throw new CustomException("验证码错误");
} }
RedisUtil.delete(codeKey); RedisUtil.delete(codeKey);
User user = userDao.selectByUsernameOrEmail(body.getUsername(), body.getEmail()); User user = userDao.selectByUsernameOrEmail(body.getUsername(), body.getEmail());
if (user != null) { if (user != null) {
if (user.getUsername().equals(body.getUsername())) { if (user.getUsername().equals(body.getUsername())) {
throw new FormDataException("用户名已经被注册"); throw new FormDataException("用户名已经被注册");
} }
if (user.getEmail().equals(body.getEmail())) { if (user.getEmail().equals(body.getEmail())) {
throw new FormDataException("邮箱已经被注册"); throw new FormDataException("邮箱已经被注册");
} }
} }
user = new User(); user = new User();
user.setUsername(body.getUsername()); user.setUsername(body.getUsername());
user.setEmail(body.getEmail()); user.setEmail(body.getEmail());
user.setIcon(DEFAULT_ICON); user.setIcon(DEFAULT_ICON);
user.setPassword(HashUtil.sha1(HashUtil.md5(body.getPassword()))); user.setPassword(HashUtil.sha1(HashUtil.md5(body.getPassword())));
user.setCreateTime(System.currentTimeMillis()); user.setCreateTime(System.currentTimeMillis());
user.setLastLoginTime(0); user.setLastLoginTime(0);
userDao.addOne(user); userDao.addOne(user);
} }
/** /**
* Description: 登录 * Description: 登录
* *
* @param body 登录表单 * @param body 登录表单
* @return LoginRes * @return LoginRes
* @author fanxb * @author fanxb
* @date 2019/7/6 16:37 * @date 2019/7/6 16:37
*/ */
public LoginRes login(LoginBody body) { public LoginRes login(LoginBody body) {
User userInfo = userDao.selectByUsernameOrEmail(body.getStr(), body.getStr()); User userInfo = userDao.selectByUsernameOrEmail(body.getStr(), body.getStr());
if (userInfo == null) { if (userInfo == null) {
throw new FormDataException("账号/密码错误"); throw new FormDataException("账号/密码错误");
} }
if (!HashUtil.sha1(HashUtil.md5(body.getPassword())).equals(userInfo.getPassword())) { if (!HashUtil.sha1(HashUtil.md5(body.getPassword())).equals(userInfo.getPassword())) {
throw new FormDataException("账号/密码错误"); throw new FormDataException("账号/密码错误");
} }
Map<String, String> data = new HashMap<>(1); Map<String, String> data = new HashMap<>(1);
data.put("userId", String.valueOf(userInfo.getUserId())); data.put("userId", String.valueOf(userInfo.getUserId()));
String token = JwtUtil.encode(data, Constant.jwtSecret, body.isRememberMe() ? LONG_EXPIRE_TIME : SHORT_EXPIRE_TIME); String token = JwtUtil.encode(data, Constant.jwtSecret, body.isRememberMe() ? LONG_EXPIRE_TIME : SHORT_EXPIRE_TIME);
LoginRes res = new LoginRes(); LoginRes res = new LoginRes();
res.setToken(token); res.setToken(token);
res.setUserId(userInfo.getUserId()); res.setUserId(userInfo.getUserId());
res.setUsername(userInfo.getUsername()); res.setUsername(userInfo.getUsername());
res.setEmail(userInfo.getEmail()); res.setEmail(userInfo.getEmail());
res.setIcon(userInfo.getIcon()); res.setIcon(userInfo.getIcon());
userDao.updateLastLoginTime(System.currentTimeMillis(), userInfo.getUserId()); userDao.updateLastLoginTime(System.currentTimeMillis(), userInfo.getUserId());
return res; return res;
} }
/** /**
* Description: 重置密码 * Description: 重置密码
* *
* @param body 重置密码 由于参数和注册差不多所以用同一个表单 * @param body 重置密码 由于参数和注册差不多所以用同一个表单
* @author fanxb * @author fanxb
* @date 2019/7/9 19:59 * @date 2019/7/9 19:59
*/ */
public void resetPassword(RegisterBody body) { public void resetPassword(RegisterBody body) {
User user = userDao.selectByUsernameOrEmail(body.getEmail(), body.getEmail()); User user = userDao.selectByUsernameOrEmail(body.getEmail(), body.getEmail());
if (user == null) { if (user == null) {
throw new FormDataException("用户不存在"); throw new FormDataException("用户不存在");
} }
String codeKey = Constant.authCodeKey(body.getEmail()); String codeKey = Constant.authCodeKey(body.getEmail());
String realCode = RedisUtil.get(codeKey, String.class); String realCode = RedisUtil.get(codeKey, String.class);
if (StringUtil.isEmpty(realCode) || (!realCode.equals(body.getAuthCode()))) { if (StringUtil.isEmpty(realCode) || (!realCode.equals(body.getAuthCode()))) {
throw new FormDataException("验证码错误"); throw new FormDataException("验证码错误");
} }
RedisUtil.delete(codeKey); RedisUtil.delete(codeKey);
String newPassword = HashUtil.sha1(HashUtil.md5(body.getPassword())); String newPassword = HashUtil.sha1(HashUtil.md5(body.getPassword()));
userDao.resetPassword(newPassword, body.getEmail()); userDao.resetPassword(newPassword, body.getEmail());
} }
}
/**
* Description: 根据userId获取用户信息
*
* @author fanxb
* @date 2019/7/30 15:57
* @param userId userId
* @return com.fanxb.bookmark.common.entity.User
*/
public User getUserInfo(int userId){
return userDao.selectByUserId(userId);
}
}

View File

@ -1,38 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fanxb.bookmark.business.user.dao.UserDao"> <mapper namespace="com.fanxb.bookmark.business.user.dao.UserDao">
<insert id="addOne"> <insert id="addOne">
insert into user (username, email, icon, password, createTime, lastLoginTime) insert into user (username, email, icon, password, createTime, lastLoginTime)
value value
(#{username}, #{email}, #{icon}, #{password}, #{createTime}, #{lastLoginTime}) (#{username}, #{email}, #{icon}, #{password}, #{createTime}, #{lastLoginTime})
</insert> </insert>
<select id="selectByUsernameOrEmail" resultType="com.fanxb.bookmark.common.entity.User"> <select id="selectByUsernameOrEmail" resultType="com.fanxb.bookmark.common.entity.User">
select select
userId, userId,
username, username,
email, email,
icon, icon,
password, password,
createTime createTime
from user from user
where username = #{name} or email = #{email} where username = #{name} or email = #{email}
limit 1 limit 1
</select> </select>
<update id="updateLastLoginTime"> <update id="updateLastLoginTime">
update user update user
set lastLoginTime = #{time} set lastLoginTime = #{time}
where userId = #{userId} where userId = #{userId}
</update> </update>
<update id="resetPassword"> <update id="resetPassword">
update user update user
set password = #{password} set password = #{password}
where email = #{email} where email = #{email}
</update> </update>
<select id="selectByUserId" resultType="com.fanxb.bookmark.common.entity.User">
select
userId,
username,
email,
icon
from user
where userId = #{userId}
</select>
</mapper> </mapper>