feat 解决普通账号登录问题

This commit is contained in:
damonyuan
2024-10-16 01:13:14 +08:00
parent b4ad8bb3a7
commit 5411b82755
19 changed files with 271 additions and 116 deletions

View File

@@ -124,10 +124,10 @@ public class LikeFrontInterceptor implements HandlerInterceptor {
if (StringUtils.isNotNull(id)) {
Integer userId = Integer.parseInt(id.toString());
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,sn,username")
.select("id,sn,account")
.eq("id", userId)
.eq("is_disable", 0)
.eq("is_delete", 0)
.isNull("delete_time")
.last("limit 1"));
Integer uid = StringUtils.isNull(user) ? 0 : userId;
@@ -156,9 +156,9 @@ public class LikeFrontInterceptor implements HandlerInterceptor {
// 用户信息缓存
Integer userId = Integer.parseInt(id.toString());
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,sn,username,nickname,mobile,is_disable")
.select("id,sn,account,nickname,mobile,is_disable")
.eq("id", userId)
.eq("is_delete", 0)
.isNull("delete_time")
.last("limit 1"));
// 删除校验

View File

@@ -62,6 +62,18 @@ public class LikeFrontThreadLocal {
return Integer.parseInt(adminId.toString());
}
/**
* 获取登录令牌
*/
public static String getToken() {
Object token = LikeFrontThreadLocal.get("token");
if (token == null || token.toString().equals("")) {
return "";
}
return token.toString();
}
/**
* 删除本地线程
*/

View File

@@ -0,0 +1,59 @@
package com.mdd.front.cache;
import com.mdd.common.util.RedisUtils;
import com.mdd.common.util.StringUtils;
import com.mdd.common.util.YmlUtils;
import com.mdd.front.LikeFrontThreadLocal;
/**
* 登录令牌缓存
*/
public class TokenLoginCache {
private static final String KEY = "login:front:token:";
public static Integer get() {
Integer terminal = LikeFrontThreadLocal.getTerminal();
String token = LikeFrontThreadLocal.getToken();
String key = KEY + terminal + ":" + token;
Object o = RedisUtils.get(key);
if (StringUtils.isNull(o)) {
return 0;
}
return Integer.parseInt(o.toString());
}
public static void set(String token, Object id) {
int timeout = 7200;
if (StringUtils.isNotNull(YmlUtils.get("like.login.timeout"))) {
timeout = Integer.parseInt(YmlUtils.get("like.login.timeout"));
}
Integer terminal = LikeFrontThreadLocal.getTerminal();
String key = KEY + terminal + ":" + token;
RedisUtils.set(key, id, timeout);
}
public static void set(String token, Object id, String terminal) {
int timeout = 7200;
if (StringUtils.isNotNull(YmlUtils.get("like.login.timeout"))) {
timeout = Integer.parseInt(YmlUtils.get("like.login.timeout"));
}
String key = KEY + terminal + ":" + token;
RedisUtils.set(key, id, timeout);
}
public static void del() {
Integer terminal = LikeFrontThreadLocal.getTerminal();
String token = LikeFrontThreadLocal.getToken();
del(terminal, token);
}
public static void del(Integer terminal, String token) {
String key = KEY + terminal + ":" + token;
System.out.println(key);
RedisUtils.del(key);
}
}

View File

@@ -38,9 +38,9 @@ public class ArticleController {
}
@NotLogin
@GetMapping("/list")
@GetMapping("/lists")
@ApiOperation(value="文章列表")
public AjaxResult<PageResult<ArticleListedVo>> list(@Validated PageValidate pageValidate,
public AjaxResult<PageResult<ArticleListedVo>> lists(@Validated PageValidate pageValidate,
@Validated ArticleSearchValidate searchValidate) {
Integer userId = LikeFrontThreadLocal.getUserId();

View File

@@ -1,6 +1,7 @@
package com.mdd.front.controller;
import com.mdd.common.aop.NotLogin;
import com.mdd.common.aop.NotPower;
import com.mdd.common.core.AjaxResult;
import com.mdd.front.LikeFrontThreadLocal;
import com.mdd.front.service.ILoginService;
@@ -14,6 +15,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.constraints.NotNull;
@@ -31,22 +33,22 @@ public class LoginController {
@ApiOperation(value="注册账号")
public AjaxResult<Object> register(@Validated @RequestBody RegisterValidate registerValidate) {
Integer terminal = LikeFrontThreadLocal.getTerminal();
String username = registerValidate.getUsername();
String account = registerValidate.getAccount();
String password = registerValidate.getPassword();
iLoginService.register(username, password, terminal);
iLoginService.register(account, password, terminal);
return AjaxResult.success();
}
@NotLogin
@PostMapping("/accountLogin")
@PostMapping("/account")
@ApiOperation(value="账号登录")
public AjaxResult<LoginTokenVo> accountLogin(@Validated @RequestBody LoginPwdValidate loginPwdValidate) {
public AjaxResult<LoginTokenVo> account(@Validated @RequestBody LoginPwdValidate loginPwdValidate) {
Integer terminal = LikeFrontThreadLocal.getTerminal();
String username = loginPwdValidate.getUsername();
String account = loginPwdValidate.getAccount();
String password = loginPwdValidate.getPassword();
LoginTokenVo vo = iLoginService.accountLogin(username, password, terminal);
LoginTokenVo vo = iLoginService.accountLogin(account, password, terminal);
return AjaxResult.success(vo);
}
@@ -115,4 +117,12 @@ public class LoginController {
return AjaxResult.success(vo);
}
@NotLogin
@PostMapping("/logout")
@ApiOperation(value="退出登录")
public AjaxResult<Object> logout() {
iLoginService.logout();
return AjaxResult.success();
}
}

View File

@@ -17,18 +17,18 @@ public interface ILoginService {
* @param password 密码
* @param terminal 终端
*/
void register(String username, String password, Integer terminal);
void register(String account, String password, Integer terminal);
/**
* 账号登录
*
* @author fzr
* @param username 账号
* @param account 账号
* @param password 密码
* @param terminal 终端
* @return LoginTokenVo
*/
LoginTokenVo accountLogin(String username, String password, Integer terminal);
LoginTokenVo accountLogin(String account, String password, Integer terminal);
/**
* 手机登录
@@ -90,4 +90,11 @@ public interface ILoginService {
*/
LoginTokenVo scanLogin(String code, String state, Integer terminal, HttpSession session);
/**
* @notes 退出登录
* @param $userInfo
* @return bool
* @author damonyuan
*/
void logout();
}

View File

@@ -87,7 +87,7 @@ public class ArticleServiceImpl implements IArticleService {
Integer pageSize = pageValidate.getPage_size();
QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id,title,image,intro,visit,create_time");
queryWrapper.select("id,cid,title,`desc`,image,click_virtual,click_actual,create_time");
queryWrapper.isNull("delete_time");
queryWrapper.eq("is_show", 1);
@@ -102,7 +102,8 @@ public class ArticleServiceImpl implements IArticleService {
if (StringUtils.isNotNull(searchValidate.getSort())) {
switch (searchValidate.getSort()) {
case "hot": // 最热
queryWrapper.orderByDesc(Arrays.asList("visit", "id"));
//queryWrapper.orderByDesc(Arrays.asList("click_actual + click_virtual", "id"));
queryWrapper.orderByDesc("click_actual + click_virtual").orderByDesc("id");
break;
case "new": // 最新
queryWrapper.orderByDesc("id");
@@ -122,6 +123,7 @@ public class ArticleServiceImpl implements IArticleService {
vo.setCollect(false);
vo.setImage(UrlUtils.toAbsoluteUrl(article.getImage()));
vo.setCreateTime(TimeUtils.timestampToDate(article.getCreateTime()));
vo.setClick(article.getClickActual() + article.getClickVirtual());
list.add(vo);
ids.add(article.getId());

View File

@@ -15,6 +15,7 @@ import com.mdd.common.plugin.notice.NoticeCheck;
import com.mdd.common.plugin.wechat.WxMnpDriver;
import com.mdd.common.util.*;
import com.mdd.front.cache.ScanLoginCache;
import com.mdd.front.cache.TokenLoginCache;
import com.mdd.front.service.ILoginService;
import com.mdd.front.vo.login.LoginTokenVo;
import lombok.extern.slf4j.Slf4j;
@@ -55,11 +56,11 @@ public class LoginServiceImpl implements ILoginService {
* @param terminal 总端
*/
@Override
public void register(String username, String password, Integer terminal) {
public void register(String account, String password, Integer terminal) {
User model = userMapper.selectOne(new QueryWrapper<User>()
.select("id,sn,username")
.eq("username", username)
.eq("is_delete", 0)
.select("id,sn,account")
.eq("account", account)
.isNull("delete_time")
.last("limit 1"));
Assert.isNull(model, "账号已存在,换一个吧!");
@@ -71,7 +72,7 @@ public class LoginServiceImpl implements ILoginService {
User user = new User();
user.setSn(sn);
user.setNickname("用户"+sn);
user.setAccount(username);
user.setAccount(account);
user.setPassword(pwd);
user.setAvatar("/api/static/default_avatar.png");
user.setChannel(terminal);
@@ -85,16 +86,15 @@ public class LoginServiceImpl implements ILoginService {
* 账号登录
*
* @author fzr
* @param username 账号
* @param account 账号
* @param password 密码
* @return LoginTokenVo
*/
@Override
public LoginTokenVo accountLogin(String username, String password, Integer terminal) {
public LoginTokenVo accountLogin(String account, String password, Integer terminal) {
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,username,password,salt,mobile,is_disable,is_new")
.eq("username", username)
.eq("is_delete", 0)
.eq("account", account)
.isNull("delete_time")
.last("limit 1"));
Assert.notNull(user, "账号不存在!");
@@ -301,6 +301,11 @@ public class LoginServiceImpl implements ILoginService {
return this.__wxLoginHandle(openId, unionId, avatar, nickname, terminal);
}
@Override
public void logout() {
TokenLoginCache.del();
}
/**
* 处理微信登录
*

View File

@@ -11,6 +11,7 @@ import com.mdd.common.entity.user.User;
import com.mdd.common.entity.user.UserAuth;
import com.mdd.common.enums.ClientEnum;
import com.mdd.common.enums.NoticeEnum;
import com.mdd.common.enums.UserEnum;
import com.mdd.common.exception.OperateException;
import com.mdd.common.mapper.user.UserAuthMapper;
import com.mdd.common.mapper.user.UserMapper;
@@ -54,8 +55,8 @@ public class UserServiceImpl implements IUserService {
@Override
public UserCenterVo center(Integer userId, Integer terminal) {
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,sn,avatar,real_name,nickname,account,mobile,user_money,is_new_user,password")
.eq("id", userId)
.select("id,sn,sex,account,nickname,real_name,avatar,mobile,create_time,is_new_user,user_money,password")
.eq("id", userId).isNull("delete_time")
.last("limit 1"));
UserCenterVo vo = new UserCenterVo();
@@ -67,19 +68,20 @@ public class UserServiceImpl implements IUserService {
vo.setAvatar(UrlUtils.toAbsoluteUrl(user.getAvatar()));
}
vo.setIsBindWechat(false);
vo.setIsAuth(false);
if (terminal.equals(ClientEnum.OA.getCode()) || terminal.equals(ClientEnum.MNP.getCode())) {
UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper<UserAuth>()
.select("id,openid,terminal")
.eq("user_id", userId)
.eq("terminal", terminal)
.last("limit 1"));
vo.setIsBindWechat(userAuth != null);
vo.setIsAuth(userAuth != null);
}
// 是否有设置登录密码
vo.setHasPwd(StringUtils.isNotBlank(user.getPassword()));
vo.setHasPassword(StringUtils.isNotBlank(user.getPassword()));
vo.setCreateTime(TimeUtils.timestampToDate(user.getCreateTime()));
vo.setSex(UserEnum.getSexDesc(user.getSex()));
return vo;
}
@@ -93,7 +95,7 @@ public class UserServiceImpl implements IUserService {
@Override
public UserInfoVo info(Integer userId) {
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,sn,avatar,real_name,nickname,account,mobile,password,sex,create_time")
.select("id,sn,sex,account,password,nickname,real_name,avatar,mobile,create_time,user_money")
.eq("id", userId)
.last("limit 1"));
@@ -104,10 +106,10 @@ public class UserServiceImpl implements IUserService {
UserInfoVo vo = new UserInfoVo();
BeanUtils.copyProperties(user, vo);
vo.setIsPassword(!user.getPassword().equals(""));
vo.setIsBindMnp(userAuth != null);
vo.setHasPassword(!user.getPassword().equals(""));
vo.setHasAuth(userAuth != null);
vo.setVersion(GlobalConfig.version);
vo.setSex(user.getSex());
vo.setSex(UserEnum.getSexDesc(user.getSex()));
vo.setCreateTime(TimeUtils.timestampToDate(user.getCreateTime()));
if (!user.getAvatar().equals("")) {

View File

@@ -20,7 +20,7 @@ public class ArticleSearchValidate implements Serializable {
@ApiModelProperty(value = "关键词")
private String keyword;
@StringContains(values = {"hot", "new"})
@StringContains(values = {"hot", "new", "default"})
@ApiModelProperty(value = "排序号")
private String sort;

View File

@@ -14,7 +14,7 @@ public class LoginPwdValidate {
@NotNull(message = "username参数缺失")
@NotEmpty(message = "账号不能为空")
@ApiModelProperty(value = "登录账号", required = true)
private String username;
private String account;
@NotNull(message = "password参数缺失")
@NotEmpty(message = "密码不能为空")

View File

@@ -16,12 +16,12 @@ public class RegisterValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "username参数缺失")
@NotNull(message = "账号缺失")
@NotEmpty(message = "账号不能为空")
@Length(min = 3, max = 12, message = "账号必须在3~12个字符内")
@Pattern(message = "账号应该为3-12位数字、字母组合", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{3,12}$")
@ApiModelProperty(value = "登录账号", required = true)
private String username;
private String account;
@NotNull(message = "password参数缺失")
@NotEmpty(message = "密码不能为空")

View File

@@ -15,6 +15,9 @@ public class ArticleListedVo implements Serializable {
@ApiModelProperty(value = "文章ID")
private Integer id;
@ApiModelProperty(value = "分类ID")
private Integer cid;
@ApiModelProperty(value = "文章标题")
private String title;
@@ -22,10 +25,10 @@ public class ArticleListedVo implements Serializable {
private String image;
@ApiModelProperty(value = "文章简介")
private String intro;
private String desc;
@ApiModelProperty(value = "浏览数量")
private Integer visit;
private Integer click;
@ApiModelProperty(value = "是否收藏")
private Boolean collect;

View File

@@ -18,32 +18,38 @@ public class UserCenterVo implements Serializable {
@ApiModelProperty(value = "用户编号")
private Integer sn;
@ApiModelProperty(value = "用户头像")
@ApiModelProperty("用户头像")
private String avatar;
@ApiModelProperty(value = "真实姓名")
@ApiModelProperty("真实姓名")
private String realName;
@ApiModelProperty(value = "用户昵称")
@ApiModelProperty("用户昵称")
private String nickname;
@ApiModelProperty(value = "用户账号")
private String username;
@ApiModelProperty("用户账号")
private String account;
@ApiModelProperty(value = "手机号码")
@ApiModelProperty("用户电话")
private String mobile;
@ApiModelProperty(value = "钱包余额")
private BigDecimal money;
@ApiModelProperty("创建时间")
private String createTime;
@ApiModelProperty(value = "是否新用户")
private Integer isNew;
@ApiModelProperty("是否新用户: [0=否, 1=是]")
private Integer isNewUser;
@ApiModelProperty(value = "是否绑定微信")
private Boolean isBindWechat;
@ApiModelProperty("有密码")
private Boolean hasPassword;
@ApiModelProperty("用户性别: [1=男, 2=女]")
private String sex;
@ApiModelProperty("用户钱包")
private BigDecimal userMoney;
@ApiModelProperty("是否绑定微信")
private Boolean isAuth;
@ApiModelProperty(value = "是否有设置登录密码")
private Boolean hasPwd;
}

View File

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "个人信息Vo")
@@ -17,49 +18,40 @@ public class UserInfoVo implements Serializable {
@ApiModelProperty(value = "用户编号")
private Integer sn;
@ApiModelProperty(value = "用户头像")
@ApiModelProperty("用户头像")
private String avatar;
@ApiModelProperty(value = "真实姓名")
@ApiModelProperty("真实姓名")
private String realName;
@ApiModelProperty(value = "用户昵称")
@ApiModelProperty("用户昵称")
private String nickname;
@ApiModelProperty(value = "用户账号")
private String username;
@ApiModelProperty("用户账号")
private String account;
@ApiModelProperty(value = "手机号码")
@ApiModelProperty("用户电话")
private String mobile;
@ApiModelProperty(value = "用户性别")
private String sex;
@ApiModelProperty(value = "是否设置密码")
private Boolean isPassword;
@ApiModelProperty(value = "是否绑定微信")
private Boolean isBindMnp;
@ApiModelProperty(value = "版本信息")
private String version;
@ApiModelProperty(value = "创建时间")
@ApiModelProperty("创建时间")
private String createTime;
public void setSex(Integer sex) {
switch (sex) {
case 0:
this.sex = "未知";
break;
case 1:
this.sex = "";
break;
case 2:
this.sex = "";
break;
}
}
@ApiModelProperty("是否为新用户: [0=否, 1=是]")
private Integer isNewUser;
@ApiModelProperty("有密码")
private Boolean hasPassword;
@ApiModelProperty("用户性别: [1=男, 2=女]")
private String sex;
@ApiModelProperty("用户钱包")
private BigDecimal userMoney;
@ApiModelProperty("是否绑定微信")
private Boolean hasAuth;
@ApiModelProperty("版本")
private String version;
}