|
|
@ -21,182 +21,222 @@ import javax.servlet.http.HttpServletRequest;
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
import javax.servlet.http.HttpSession;
|
|
|
|
import javax.servlet.http.HttpSession;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @Author swg.
|
|
|
|
|
|
|
|
* @Date 2019/1/1 13:12
|
|
|
|
|
|
|
|
* @CONTACT 317758022@qq.com
|
|
|
|
|
|
|
|
* @DESC 用户模块,POSTMAN简单测试通过
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//TODO 先全部开放GET请求
|
|
|
|
//TODO 先全部开放GET请求
|
|
|
|
|
|
|
|
// 为该控制器类下的所有请求路径设置统一的前缀为 "user",方便对用户模块相关的接口进行统一管理和组织。
|
|
|
|
@RequestMapping("user")
|
|
|
|
@RequestMapping("user")
|
|
|
|
|
|
|
|
// 表明这个类是一个RESTful风格的控制器,其方法返回的数据会直接作为响应体返回(通常以JSON等格式),而不是进行视图解析等操作。
|
|
|
|
@RestController
|
|
|
|
@RestController
|
|
|
|
|
|
|
|
// 使用Slf4j注解生成一个名为log的日志记录对象,方便在类中记录与用户操作相关的日志信息。
|
|
|
|
@Slf4j
|
|
|
|
@Slf4j
|
|
|
|
// 表示标识这个类是swagger的资源
|
|
|
|
// 表示标识这个类是swagger的资源,用于生成接口文档,通过value属性指定接口文档中的名称,tags属性用于对接口进行分类标记。
|
|
|
|
@Api(value = "UserController", tags = {"用户服务接口"})
|
|
|
|
@Api(value = "UserController", tags = {"用户服务接口"})
|
|
|
|
public class UserController {
|
|
|
|
public class UserController {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 通过Spring的依赖注入功能,自动注入IUserService接口的实现类实例,用于调用用户相关的业务逻辑方法。
|
|
|
|
@Autowired
|
|
|
|
@Autowired
|
|
|
|
private IUserService userService;
|
|
|
|
private IUserService userService;
|
|
|
|
|
|
|
|
// 注入CommonCacheUtil实例,用于操作缓存,如在用户登录等操作中与缓存进行交互。
|
|
|
|
@Autowired
|
|
|
|
@Autowired
|
|
|
|
private CommonCacheUtil commonCacheUtil;
|
|
|
|
private CommonCacheUtil commonCacheUtil;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 用户登陆:验证参数、登陆、写到cookie中并且写到redis中
|
|
|
|
* 用户登录方法,处理用户登录的业务逻辑。
|
|
|
|
* 用户登陆以后,点击其他需要登陆才能看的页面时,先判断是否前端是否有这个key,没有则提示需要登陆
|
|
|
|
* 1. 接收用户名和密码,记录用户开始登录的日志信息。
|
|
|
|
|
|
|
|
* 2. 调用userService的login方法进行登录验证,该方法会根据用户名和密码在数据库等地方进行验证,并返回包含验证结果和用户信息(如果登录成功)的ServerResponse<UserResVO>对象。
|
|
|
|
|
|
|
|
* 3. 如果登录成功,将代表用户的sessionId写到前端浏览器的cookie中,方便后续识别用户登录状态。
|
|
|
|
|
|
|
|
* 4. 同时将用户信息序列化后存入redis缓存,设置过期时间为30分钟,以便后续快速获取用户信息。
|
|
|
|
|
|
|
|
* 5. 最后返回登录操作的响应结果给客户端,包含登录是否成功以及相关用户信息(如果成功)。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="用户登陆", notes="输入用户名,密码,不能为空")
|
|
|
|
@ApiOperation(value = "用户登陆", notes = "输入用户名,密码,不能为空")
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "password", value = "用户密码", required = true, dataType = "String")
|
|
|
|
@ApiImplicitParam(name = "password", value = "用户密码", required = true, dataType = "String")
|
|
|
|
})
|
|
|
|
})
|
|
|
|
@RequestMapping("/login.do")
|
|
|
|
@RequestMapping("/login.do")
|
|
|
|
public ServerResponse<UserResVO> login(HttpSession session, HttpServletResponse response, String username, String password){
|
|
|
|
public ServerResponse<UserResVO> login(HttpSession session, HttpServletResponse response, String username, String password) {
|
|
|
|
log.info("【用户{}开始登陆】",username);
|
|
|
|
// 记录用户开始登录的日志,方便后续排查问题,如查看登录失败的原因等。
|
|
|
|
ServerResponse<UserResVO> userVOServerResponse = userService.login(username,password);
|
|
|
|
log.info("【用户{}开始登陆】", username);
|
|
|
|
if(userVOServerResponse.isSuccess()){
|
|
|
|
ServerResponse<UserResVO> userVOServerResponse = userService.login(username, password);
|
|
|
|
//登陆成功,那么需要在redis中存储,并且将代表用户的sessionId写到前端浏览器的cookie中
|
|
|
|
if (userVOServerResponse.isSuccess()) {
|
|
|
|
log.info("【用户{}cookie开始写入】",username);
|
|
|
|
// 记录开始写入cookie的日志,用于跟踪cookie写入操作是否正常。
|
|
|
|
CookieUtil.writeLoginToken(response,session.getId());
|
|
|
|
log.info("【用户{} cookie开始写入】", username);
|
|
|
|
//写到redis中,将用户信息序列化,设置过期时间为30分钟
|
|
|
|
// 将用户的sessionId写入cookie,使浏览器保存该cookie,用于后续请求识别用户登录状态。
|
|
|
|
log.info("【用户{}redis开始写入】",username);
|
|
|
|
CookieUtil.writeLoginToken(response, session.getId());
|
|
|
|
|
|
|
|
// 记录开始写入redis的日志,便于监控redis写入操作的情况。
|
|
|
|
|
|
|
|
log.info("【用户{} redis开始写入】", username);
|
|
|
|
|
|
|
|
// 将用户信息序列化后存入redis缓存,设置过期时间为30分钟,提高后续获取用户信息的效率。
|
|
|
|
commonCacheUtil.cacheNxExpire(session.getId(), JsonUtil.obj2String(userVOServerResponse.getData()), Constants.RedisCacheExtime.REDIS_SESSION_EXTIME);
|
|
|
|
commonCacheUtil.cacheNxExpire(session.getId(), JsonUtil.obj2String(userVOServerResponse.getData()), Constants.RedisCacheExtime.REDIS_SESSION_EXTIME);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
log.info("【用户{}登陆成功】",username);
|
|
|
|
// 记录用户登录成功的日志,完整记录登录操作过程。
|
|
|
|
|
|
|
|
log.info("【用户{}登陆成功】", username);
|
|
|
|
return userVOServerResponse;
|
|
|
|
return userVOServerResponse;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 用户注册,要判断用户名和邮箱是否重复,这里用了分布式锁来防止用户名和邮箱可能出现重复
|
|
|
|
* 用户注册方法,处理用户注册的业务逻辑。
|
|
|
|
|
|
|
|
* 1. 接收用户对象,记录开始注册的日志信息。
|
|
|
|
|
|
|
|
* 2. 调用userService的register方法进行用户注册,该方法内部会判断用户名和邮箱是否重复(使用分布式锁保证并发安全),并将用户信息保存到数据库等操作。
|
|
|
|
|
|
|
|
* 3. 最后返回注册操作的响应结果给客户端,包含注册是否成功以及相关提示信息。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="创建用户", notes="根据User对象创建用户")
|
|
|
|
@ApiOperation(value = "创建用户", notes = "根据User对象创建用户")
|
|
|
|
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
|
|
|
|
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
|
|
|
|
@RequestMapping("/register.do")
|
|
|
|
@RequestMapping("/register.do")
|
|
|
|
public ServerResponse register(User user){
|
|
|
|
public ServerResponse register(User user) {
|
|
|
|
|
|
|
|
// 记录开始注册的日志,有助于排查注册过程中出现的问题,如用户名或邮箱重复等情况。
|
|
|
|
log.info("【开始注册】");
|
|
|
|
log.info("【开始注册】");
|
|
|
|
//这里模拟高并发的注册场景,防止用户名字注册重复,所以需要加上分布式锁
|
|
|
|
// 这里模拟高并发的注册场景,防止用户名字注册重复,所以需要加上分布式锁,调用userService的register方法进行实际注册操作。
|
|
|
|
ServerResponse response = userService.register(user);
|
|
|
|
ServerResponse response = userService.register(user);
|
|
|
|
|
|
|
|
// 记录用户注册成功的日志,方便监控注册操作的整体情况。
|
|
|
|
log.info("【用户注册成功】");
|
|
|
|
log.info("【用户注册成功】");
|
|
|
|
return response;
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 判断用户名和邮箱是否重复
|
|
|
|
* 验证用户名和邮箱是否重复方法,处理验证用户名和邮箱唯一性的业务逻辑。
|
|
|
|
|
|
|
|
* 1. 接收要验证的字符串和类型参数,记录开始验证的日志信息。
|
|
|
|
|
|
|
|
* 2. 调用userService的checkValid方法进行验证,该方法会根据类型去数据库等地方查询判断传入的用户名或邮箱是否已存在。
|
|
|
|
|
|
|
|
* 3. 最后返回验证操作的响应结果给客户端,包含验证是否通过以及相关提示信息。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="验证用户名和邮箱是否重复", notes="用户名和邮箱都不能用已经存在的")
|
|
|
|
@ApiOperation(value = "验证用户名和邮箱是否重复", notes = "用户名和邮箱都不能用已经存在的")
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParam(name = "str", value = "输入参数", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "str", value = "输入参数", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "type", value = "参数类型", required = true, dataType = "String")
|
|
|
|
@ApiImplicitParam(name = "type", value = "参数类型", required = true, dataType = "String")
|
|
|
|
})
|
|
|
|
})
|
|
|
|
@RequestMapping("/check_valid.do")
|
|
|
|
@RequestMapping("/check_valid.do")
|
|
|
|
public ServerResponse checkValid(@RequestParam("str") String str,
|
|
|
|
public ServerResponse checkValid(@RequestParam("str") String str,
|
|
|
|
@RequestParam("type") String type){
|
|
|
|
@RequestParam("type") String type) {
|
|
|
|
|
|
|
|
// 记录开始验证用户名和邮箱是否重复的日志,方便后续查看验证操作的执行情况。
|
|
|
|
log.info("【开始验证用户名和邮箱是否重复】");
|
|
|
|
log.info("【开始验证用户名和邮箱是否重复】");
|
|
|
|
ServerResponse response = userService.checkValid(str,type);
|
|
|
|
ServerResponse response = userService.checkValid(str, type);
|
|
|
|
return response;
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 获取登陆状态用户信息
|
|
|
|
* 获取登录状态用户信息方法,处理获取已登录用户详细信息的业务逻辑。
|
|
|
|
* 本地测试的时候,由于cookie是写到oursnai.cn域名下面的,所以需要在hosts文件中添加127.0.0.1 oursnail.cn这个解析
|
|
|
|
* 1. 从请求中读取登录token,若不存在则认为用户未登录,返回相应错误信息。
|
|
|
|
* 在浏览器中测试的时候,将login方法暂时开放为GET请求,然后请求路径为:http://oursnail.cn:8081/user/login.do?username=admin&password=123456
|
|
|
|
* 2. 若token存在,从缓存中获取用户信息字符串,若为空也认为用户未登录并返回错误。
|
|
|
|
* 同样地,在测试获取登陆用户信息接口,也要按照域名来请求,否则拿不到token:http://oursnail.cn:8081/user/get_user_info.do
|
|
|
|
* 3. 若获取到用户信息字符串,将其反序列化为User对象,再调用userService的getUserInfoFromDB方法从数据库获取更详细的用户信息。
|
|
|
|
|
|
|
|
* 4. 最后返回获取用户信息的响应结果给客户端,包含获取是否成功以及用户详细信息(如果成功)。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="获取用户个人信息", notes="登陆状态下获取")
|
|
|
|
@ApiOperation(value = "获取用户个人信息", notes = "登陆状态下获取")
|
|
|
|
@RequestMapping("/get_user_info.do")
|
|
|
|
@RequestMapping("/get_user_info.do")
|
|
|
|
public ServerResponse getUserInfo(HttpServletRequest request){
|
|
|
|
public ServerResponse getUserInfo(HttpServletRequest request) {
|
|
|
|
|
|
|
|
// 从请求中读取登录token,用于判断用户是否登录。
|
|
|
|
String loginToken = CookieUtil.readLoginToken(request);
|
|
|
|
String loginToken = CookieUtil.readLoginToken(request);
|
|
|
|
if(StringUtils.isEmpty(loginToken)){
|
|
|
|
if (StringUtils.isEmpty(loginToken)) {
|
|
|
|
|
|
|
|
// 记录用户未登录的日志,方便排查问题,如用户未登录却尝试获取信息的情况。
|
|
|
|
log.info("【用户未登录,无法获取当前用户信息】");
|
|
|
|
log.info("【用户未登录,无法获取当前用户信息】");
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 从缓存中获取用户信息字符串,若为空则表示用户未登录或缓存信息丢失等情况。
|
|
|
|
String userStr = commonCacheUtil.getCacheValue(loginToken);
|
|
|
|
String userStr = commonCacheUtil.getCacheValue(loginToken);
|
|
|
|
if(userStr == null){
|
|
|
|
if (userStr == null) {
|
|
|
|
|
|
|
|
// 记录用户未登录的日志,可能是缓存问题导致无法获取用户信息。
|
|
|
|
log.info("【用户未登录,无法获取当前用户信息】");
|
|
|
|
log.info("【用户未登录,无法获取当前用户信息】");
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
User currentUser = JsonUtil.Str2Obj(userStr,User.class);
|
|
|
|
// 将用户信息字符串反序列化为User对象,以便后续获取详细信息。
|
|
|
|
|
|
|
|
User currentUser = JsonUtil.Str2Obj(userStr, User.class);
|
|
|
|
UserResVO userResVO = userService.getUserInfoFromDB(currentUser.getId());
|
|
|
|
UserResVO userResVO = userService.getUserInfoFromDB(currentUser.getId());
|
|
|
|
return ServerResponse.createBySuccess("登陆用户获取自身信息成功",userResVO);
|
|
|
|
return ServerResponse.createBySuccess("登陆用户获取自身信息成功", userResVO);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 根据用户名去拿到对应的问题
|
|
|
|
* 根据用户名获取对应的问题方法,用于处理忘记密码时获取问题的业务逻辑。
|
|
|
|
|
|
|
|
* 1. 接收用户名作为参数,记录用户忘记密码并输入用户名获取问题的日志信息。
|
|
|
|
|
|
|
|
* 2. 调用userService的getQuestionByUsername方法,根据传入的用户名去查找对应的问题(可能是找回密码时设置的安全问题等)。
|
|
|
|
|
|
|
|
* 3. 最后返回获取问题操作的响应结果给客户端,包含是否获取到问题以及相关提示信息(如果获取成功则包含问题内容等)。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="根据用户名去拿到对应的问题", notes="忘记密码时首先根据用户名去获取设置的问题")
|
|
|
|
@ApiOperation(value = "根据用户名去拿到对应的问题", notes = "忘记密码时首先根据用户名去获取设置的问题")
|
|
|
|
@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String")
|
|
|
|
@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String")
|
|
|
|
@RequestMapping("/forget_get_question.do")
|
|
|
|
@RequestMapping("/forget_get_question.do")
|
|
|
|
public ServerResponse forgetGetQuestion(String username){
|
|
|
|
public ServerResponse forgetGetQuestion(String username) {
|
|
|
|
log.info("【用户{}忘记密码,点击忘记密码输入用户名】",username);
|
|
|
|
// 记录用户忘记密码并进行获取问题操作的日志,方便后续排查忘记密码流程中的问题,如用户名不存在等情况。
|
|
|
|
|
|
|
|
log.info("【用户{}忘记密码,点击忘记密码输入用户名】", username);
|
|
|
|
ServerResponse response = userService.getQuestionByUsername(username);
|
|
|
|
ServerResponse response = userService.getQuestionByUsername(username);
|
|
|
|
return response;
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 校验答案是否正确
|
|
|
|
* 校验答案是否正确方法,用于处理忘记密码时校验用户提交答案的业务逻辑。
|
|
|
|
|
|
|
|
* 1. 接收用户名、问题和答案作为参数,记录用户忘记密码并提交问题答案的日志信息。
|
|
|
|
|
|
|
|
* 2. 调用userService的checkAnswer方法,根据传入的用户名、问题和答案进行校验,判断答案是否正确(与之前设置的答案对比等)。
|
|
|
|
|
|
|
|
* 3. 最后返回校验答案操作的响应结果给客户端,包含答案是否正确以及相关提示信息。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="校验答案是否正确", notes="忘记密码时输入正确的用户名之后就可以获取到问题,此时就可以输入答案")
|
|
|
|
@ApiOperation(value = "校验答案是否正确", notes = "忘记密码时输入正确的用户名之后就可以获取到问题,此时就可以输入答案")
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "question", value = "设置的问题", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "question", value = "设置的问题", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "answer", value = "提交的答案", required = true, dataType = "String")
|
|
|
|
@ApiImplicitParam(name = "answer", value = "提交的答案", required = true, dataType = "String")
|
|
|
|
})
|
|
|
|
})
|
|
|
|
@RequestMapping("/forget_check_answer.do")
|
|
|
|
@RequestMapping("/forget_check_answer.do")
|
|
|
|
public ServerResponse forgetCheckAnswer(String username,String question,String answer){
|
|
|
|
public ServerResponse forgetCheckAnswer(String username, String question, String answer) {
|
|
|
|
log.info("【用户{}忘记密码,提交问题答案】",username);
|
|
|
|
// 记录用户忘记密码并提交答案进行校验的日志,有助于排查忘记密码答案校验过程中的问题,如答案错误等情况。
|
|
|
|
ServerResponse response = userService.checkAnswer(username,question,answer);
|
|
|
|
log.info("【用户{}忘记密码,提交问题答案】", username);
|
|
|
|
|
|
|
|
ServerResponse response = userService.checkAnswer(username, question, answer);
|
|
|
|
return response;
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 忘记密码的重置密码
|
|
|
|
* 忘记密码的重置密码方法,用于处理忘记密码时重置密码的业务逻辑,需要进行token校验。
|
|
|
|
|
|
|
|
* 1. 接收用户名、新密码和前端保存的token作为参数,记录用户忘记密码并输入新密码的日志信息。
|
|
|
|
|
|
|
|
* 2. 调用userService的forgetResetPasswd方法,根据传入的用户名、新密码和token进行密码重置操作,token用于验证用户身份等(可能是之前获取问题或校验答案时生成的)。
|
|
|
|
|
|
|
|
* 3. 最后返回重置密码操作的响应结果给客户端,包含密码是否重置成功以及相关提示信息。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="忘记密码的重置密码", notes="输入新的密码,要进行token的校验")
|
|
|
|
@ApiOperation(value = "忘记密码的重置密码", notes = "输入新的密码,要进行token的校验")
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "passwordNew", value = "新密码", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "passwordNew", value = "新密码", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "forgetToken", value = "前端保存的token", required = true, dataType = "String")
|
|
|
|
@ApiImplicitParam(name = "forgetToken", value = "前端保存的token", required = true, dataType = "String")
|
|
|
|
})
|
|
|
|
})
|
|
|
|
@RequestMapping("/forget_reset_password.do")
|
|
|
|
@RequestMapping("/forget_reset_password.do")
|
|
|
|
public ServerResponse forgetResetPasswd(String username,String passwordNew,String forgetToken){
|
|
|
|
public ServerResponse forgetResetPasswd(String username, String passwordNew, String forgetToken) {
|
|
|
|
log.info("【用户{}忘记密码,输入新密码】",username);
|
|
|
|
// 记录用户忘记密码并进行重置密码操作的日志,方便后续排查忘记密码重置过程中的问题,如新密码不符合要求等情况。
|
|
|
|
ServerResponse response = userService.forgetResetPasswd(username,passwordNew,forgetToken);
|
|
|
|
log.info("【用户{}忘记密码,输入新密码】", username);
|
|
|
|
|
|
|
|
ServerResponse response = userService.forgetResetPasswd(username, passwordNew, forgetToken);
|
|
|
|
return response;
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 登陆状态的重置密码
|
|
|
|
* 登陆状态的重置密码方法,用于处理已登录用户重置密码的业务逻辑。
|
|
|
|
|
|
|
|
* 1. 从请求中读取cookie获取登录token,若不存在则认为用户未登录,返回相应错误信息。
|
|
|
|
|
|
|
|
* 2. 若token存在,从redis中获取用户信息字符串,若为空也认为用户未登录并返回错误。
|
|
|
|
|
|
|
|
* 3. 若获取到用户信息字符串,将其反序列化为User对象,记录用户重置密码的日志信息。
|
|
|
|
|
|
|
|
* 4. 调用userService的resetPasswd方法,根据传入的老密码和新密码以及用户ID进行密码重置操作(可能会先验证老密码是否正确等)。
|
|
|
|
|
|
|
|
* 5. 最后返回重置密码操作的响应结果给客户端,包含密码是否重置成功以及相关提示信息。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="登陆状态的重置密码", notes="登陆的时候只需要输入老的密码和新密码即可")
|
|
|
|
@ApiOperation(value = "登陆状态的重置密码", notes = "登陆的时候只需要输入老的密码和新密码即可")
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParam(name = "passwordOld", value = "老密码", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "passwordOld", value = "老密码", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "passwordNew", value = "新密码", required = true, dataType = "String")
|
|
|
|
@ApiImplicitParam(name = "passwordNew", value = "新密码", required = true, dataType = "String")
|
|
|
|
})
|
|
|
|
})
|
|
|
|
@RequestMapping("/reset_password.do")
|
|
|
|
@RequestMapping("/reset_password.do")
|
|
|
|
public ServerResponse resetPasswd(String passwordOld,String passwordNew,HttpServletRequest request){
|
|
|
|
public ServerResponse resetPasswd(String passwordOld, String passwordNew, HttpServletRequest request) {
|
|
|
|
//1.读取cookie
|
|
|
|
// 1.读取cookie
|
|
|
|
String loginToken = CookieUtil.readLoginToken(request);
|
|
|
|
String loginToken = CookieUtil.readLoginToken(request);
|
|
|
|
if(StringUtils.isEmpty(loginToken)){
|
|
|
|
if (StringUtils.isEmpty(loginToken)) {
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//2.从redis中获取用户信息
|
|
|
|
// 2.从redis中获取用户信息
|
|
|
|
String userStr = commonCacheUtil.getCacheValue(loginToken);
|
|
|
|
String userStr = commonCacheUtil.getCacheValue(loginToken);
|
|
|
|
if(userStr == null){
|
|
|
|
if (userStr == null) {
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
User currentUser = JsonUtil.Str2Obj(userStr,User.class);
|
|
|
|
User currentUser = JsonUtil.Str2Obj(userStr, User.class);
|
|
|
|
log.info("【用户{}重置密码】",currentUser);
|
|
|
|
// 记录用户登录状态下重置密码的日志,有助于排查登录用户重置密码过程中的问题,如老密码错误等情况。
|
|
|
|
|
|
|
|
log.info("【用户{}重置密码】", currentUser);
|
|
|
|
|
|
|
|
|
|
|
|
ServerResponse response = userService.resetPasswd(passwordOld,passwordNew,currentUser.getId());
|
|
|
|
ServerResponse response = userService.resetPasswd(passwordOld, passwordNew, currentUser.getId());
|
|
|
|
return response;
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 更新当前登陆用户信息
|
|
|
|
* 更新当前登录用户信息方法,用于处理已登录用户更新自身信息的业务逻辑。
|
|
|
|
|
|
|
|
* 1. 从请求中读取登录 `token`,若不存在则认为用户未登录,返回相应错误信息。
|
|
|
|
|
|
|
|
* 2. 若 `token` 存在,从 `redis` 中获取用户信息字符串,若为空也认为用户未登录并返回错误。
|
|
|
|
|
|
|
|
* 3. 若获取到用户信息字符串,将其反序列化为 `User` 对象,然后调用 `userService` 的 `updateInfomation` 方法,传入更新后的邮箱、电话、问题、答案以及用户 `ID`,进行用户信息更新操作(可能涉及数据库更新等)。
|
|
|
|
|
|
|
|
* 4. 最后返回更新信息操作的响应结果给客户端,包含更新是否成功以及相关提示信息。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="更新当前登陆用户信息", notes="更新用户信息")
|
|
|
|
@ApiOperation(value = "更新当前登陆用户信息", notes = "更新用户信息")
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParams({
|
|
|
|
@ApiImplicitParam(name = "email", value = "邮箱", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "email", value = "邮箱", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "phone", value = "电话", required = true, dataType = "String"),
|
|
|
|
@ApiImplicitParam(name = "phone", value = "电话", required = true, dataType = "String"),
|
|
|
@ -204,40 +244,41 @@ public class UserController {
|
|
|
|
@ApiImplicitParam(name = "answer", value = "答案", required = true, dataType = "String")
|
|
|
|
@ApiImplicitParam(name = "answer", value = "答案", required = true, dataType = "String")
|
|
|
|
})
|
|
|
|
})
|
|
|
|
@RequestMapping("/update_information.do")
|
|
|
|
@RequestMapping("/update_information.do")
|
|
|
|
public ServerResponse updateInformation(String email,String phone,String question,String answer,HttpServletRequest request){
|
|
|
|
public ServerResponse updateInformation(String email, String phone, String question, String answer, HttpServletRequest request) {
|
|
|
|
//1.读取cookie
|
|
|
|
// 1.读取cookie
|
|
|
|
String loginToken = CookieUtil.readLoginToken(request);
|
|
|
|
String loginToken = CookieUtil.readLoginToken(request);
|
|
|
|
if(StringUtils.isEmpty(loginToken)){
|
|
|
|
if (StringUtils.isEmpty(loginToken)) {
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//2.从redis中获取用户信息
|
|
|
|
// 2.从redis中获取用户信息
|
|
|
|
String userStr = commonCacheUtil.getCacheValue(loginToken);
|
|
|
|
String userStr = commonCacheUtil.getCacheValue(loginToken);
|
|
|
|
if(userStr == null){
|
|
|
|
if (userStr == null) {
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户信息");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
User currentUser = JsonUtil.Str2Obj(userStr,User.class);
|
|
|
|
User currentUser = JsonUtil.Str2Obj(userStr, User.class);
|
|
|
|
|
|
|
|
|
|
|
|
ServerResponse response = userService.updateInfomation(email,phone,question,answer,currentUser.getId());
|
|
|
|
ServerResponse response = userService.updateInfomation(email, phone, question, answer, currentUser.getId());
|
|
|
|
return response;
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 登出,删除cookie和redis即可
|
|
|
|
* 登出方法,用于处理用户登出的业务逻辑,主要是删除 `cookie` 和 `redis` 中的相关缓存记录。
|
|
|
|
|
|
|
|
* 1. 从请求中读取登录 `token`,记录用户开始删除 `cookie` 的日志信息。
|
|
|
|
|
|
|
|
* 2. 使用 `CookieUtil` 的 `delLoginToken` 方法删除 `cookie` 中的登录相关信息,使得客户端后续请求不再携带有效的登录标识。
|
|
|
|
|
|
|
|
* 3. 记录用户开始删除 `redis` 缓存记录的日志信息,然后使用 `commonCacheUtil` 的 `delKey` 方法删除 `redis` 中与该用户登录相关的缓存记录,清理用户登录状态信息。
|
|
|
|
|
|
|
|
* 4. 最后返回表示登出成功的响应结果给客户端。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ApiOperation(value="登出", notes="退出登陆,删除cookie和redis缓存")
|
|
|
|
@ApiOperation(value = "登出", notes = "退出登陆,删除cookie和redis缓存")
|
|
|
|
@RequestMapping("/logout.do")
|
|
|
|
@RequestMapping("/logout.do")
|
|
|
|
public ServerResponse logout(HttpServletRequest request,HttpServletResponse response){
|
|
|
|
public ServerResponse logout(HttpServletRequest request, HttpServletResponse response) {
|
|
|
|
log.info("【用户删除cookie】");
|
|
|
|
log.info("【用户删除cookie】");
|
|
|
|
//1.删除cookie
|
|
|
|
// 1.删除cookie
|
|
|
|
String loginToken = CookieUtil.readLoginToken(request);
|
|
|
|
String loginToken = CookieUtil.readLoginToken(request);
|
|
|
|
CookieUtil.delLoginToken(request,response);
|
|
|
|
CookieUtil.delLoginToken(request, response);
|
|
|
|
log.info("【用户删除redis缓存】");
|
|
|
|
log.info("【用户删除redis缓存】");
|
|
|
|
//2.删除redis中缓存记录
|
|
|
|
// 2.删除redis中缓存记录
|
|
|
|
commonCacheUtil.delKey(loginToken);
|
|
|
|
commonCacheUtil.delKey(loginToken);
|
|
|
|
return ServerResponse.createBySuccess();
|
|
|
|
return ServerResponse.createBySuccess();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|