优化: 调整前端登录相关接口 (接口分离)

This commit is contained in:
TinyAnts 2023-03-14 12:07:40 +08:00
parent 44975bfd86
commit 1d0d314aee
40 changed files with 430 additions and 410 deletions

View File

@ -19,7 +19,7 @@ public class UserAuth implements Serializable {
private Integer userId; // 用户Id private Integer userId; // 用户Id
private String openid; // Openid private String openid; // Openid
private String unionid; // Unionid private String unionid; // Unionid
private Integer client; // 客户端类型: [1=微信小程序, 2=微信公众号, 3=手机H54=电脑PC, 5=苹果APP, 6=安卓APP] private Integer terminal; // 客户端类型: [1=微信小程序, 2=微信公众号, 3=手机H54=电脑PC, 5=苹果APP, 6=安卓APP]
private Long createTime; // 创建时间 private Long createTime; // 创建时间
private Long updateTime; // 更新时间 private Long updateTime; // 更新时间

View File

@ -44,6 +44,10 @@ public class LikeFrontInterceptor implements HandlerInterceptor {
@NonNull HttpServletResponse response, @NonNull HttpServletResponse response,
@NonNull Object handler) throws Exception { @NonNull Object handler) throws Exception {
// 记录当前平台
String terminal = request.getHeader("terminal");
LikeFrontThreadLocal.put("terminal", terminal);
// 判断请求接口 // 判断请求接口
response.setContentType("application/json;charset=utf-8"); response.setContentType("application/json;charset=utf-8");
if (!(handler instanceof HandlerMethod)) { if (!(handler instanceof HandlerMethod)) {
@ -113,12 +117,14 @@ public class LikeFrontInterceptor implements HandlerInterceptor {
private void checkLogin(Method method) { private void checkLogin(Method method) {
for (int i=0; i<=0; i++) { for (int i=0; i<=0; i++) {
// 免登校验 // 免登校验
Object id = StpUtil.getLoginId();
if (StringUtils.isNotNull(method) && method.isAnnotationPresent(NotLogin.class)) { if (StringUtils.isNotNull(method) && method.isAnnotationPresent(NotLogin.class)) {
try {
Object id = StpUtil.getLoginId();
if (StringUtils.isNotNull(id)) { if (StringUtils.isNotNull(id)) {
Integer userId = Integer.parseInt(id.toString()); Integer userId = Integer.parseInt(id.toString());
LikeFrontThreadLocal.put("userId", userId); LikeFrontThreadLocal.put("userId", userId);
} }
} catch (Exception ignored) {}
break; break;
} }
@ -131,6 +137,7 @@ public class LikeFrontInterceptor implements HandlerInterceptor {
} }
// 登录校验 // 登录校验
Object id = StpUtil.getLoginId();
if (StringUtils.isNull(id)) { if (StringUtils.isNull(id)) {
Integer errCode = HttpEnum.TOKEN_INVALID.getCode(); Integer errCode = HttpEnum.TOKEN_INVALID.getCode();
String errMsg = HttpEnum.TOKEN_INVALID.getMsg(); String errMsg = HttpEnum.TOKEN_INVALID.getMsg();

View File

@ -50,6 +50,17 @@ public class LikeFrontThreadLocal {
return Integer.parseInt(adminId.toString()); return Integer.parseInt(adminId.toString());
} }
/**
* 获取平台标识
*/
public static Integer getTerminal() {
Object adminId = LikeFrontThreadLocal.get("terminal");
if (adminId == null || adminId.toString().equals("")) {
return 0;
}
return Integer.parseInt(adminId.toString());
}
/** /**
* 删除本地线程 * 删除本地线程
*/ */

View File

@ -6,9 +6,9 @@ import com.mdd.common.core.PageResult;
import com.mdd.common.validator.annotation.IDMust; import com.mdd.common.validator.annotation.IDMust;
import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.LikeFrontThreadLocal;
import com.mdd.front.service.IArticleService; import com.mdd.front.service.IArticleService;
import com.mdd.front.validate.ArticleCollectValidate; import com.mdd.front.validate.article.ArticleCollectValidate;
import com.mdd.front.validate.ArticleSearchValidate; import com.mdd.front.validate.article.ArticleSearchValidate;
import com.mdd.front.validate.commons.PageValidate; import com.mdd.front.validate.common.PageValidate;
import com.mdd.front.vo.article.ArticleCateVo; import com.mdd.front.vo.article.ArticleCateVo;
import com.mdd.front.vo.article.ArticleCollectVo; import com.mdd.front.vo.article.ArticleCollectVo;
import com.mdd.front.vo.article.ArticleDetailVo; import com.mdd.front.vo.article.ArticleDetailVo;
@ -17,7 +17,6 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.List; import java.util.List;
/** /**

View File

@ -1,19 +1,27 @@
package com.mdd.front.controller; package com.mdd.front.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mdd.common.aop.NotLogin; import com.mdd.common.aop.NotLogin;
import com.mdd.common.core.AjaxResult; import com.mdd.common.core.AjaxResult;
import com.mdd.common.core.PageResult; import com.mdd.common.core.PageResult;
import com.mdd.common.entity.notice.NoticeRecord;
import com.mdd.common.enums.NoticeEnum;
import com.mdd.common.exception.OperateException;
import com.mdd.common.mapper.notice.NoticeRecordMapper;
import com.mdd.common.plugin.notice.NoticeDriver;
import com.mdd.common.plugin.notice.vo.NoticeSmsVo;
import com.mdd.common.util.StringUtils;
import com.mdd.common.util.ToolUtils;
import com.mdd.common.validator.annotation.IDMust; import com.mdd.common.validator.annotation.IDMust;
import com.mdd.front.service.IIndexService; import com.mdd.front.service.IIndexService;
import com.mdd.front.validate.commons.PageValidate; import com.mdd.front.validate.common.PageValidate;
import com.mdd.front.validate.common.SmsValidate;
import com.mdd.front.vo.article.ArticleListedVo; import com.mdd.front.vo.article.ArticleListedVo;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -21,9 +29,12 @@ import java.util.Map;
* 主页管理 * 主页管理
*/ */
@RestController @RestController
@RequestMapping("/api") @RequestMapping("api/index")
public class IndexController { public class IndexController {
@Resource
NoticeRecordMapper noticeRecordMapper;
@Resource @Resource
IIndexService iIndexService; IIndexService iIndexService;
@ -110,4 +121,39 @@ public class IndexController {
return AjaxResult.success(list); return AjaxResult.success(list);
} }
/**
* 发送短信
*
* @author fzr
* @param smsValidate 参数
* @return AjaxResult<Object>
*/
@NotLogin
@PostMapping("/sendSms")
public AjaxResult<Object> sendSms(@Validated @RequestBody SmsValidate smsValidate) {
NoticeRecord noticeRecord = noticeRecordMapper.selectOne(new QueryWrapper<NoticeRecord>()
.eq("account", smsValidate.getMobile())
.eq("scene", smsValidate.getScene())
.eq("status", Arrays.asList(NoticeEnum.STATUS_WAIT, NoticeEnum.STATUS_OK))
.orderByDesc("id")
.last("limit 1"));
if (StringUtils.isNotNull(noticeRecord)) {
if (noticeRecord.getCreateTime() >= (System.currentTimeMillis() / 1000 - 60)){
throw new OperateException("操作频繁,请稍后再试!");
}
}
NoticeSmsVo params = new NoticeSmsVo()
.setScene(smsValidate.getScene())
.setMobile(smsValidate.getMobile())
.setExpire(900)
.setParams(new String[] {
"code:" + ToolUtils.randomInt(4)
});
NoticeDriver.handle(params);
return AjaxResult.success();
}
} }

View File

@ -1,24 +1,19 @@
package com.mdd.front.controller; package com.mdd.front.controller;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.mdd.common.aop.NotLogin; import com.mdd.common.aop.NotLogin;
import com.mdd.common.core.AjaxResult; import com.mdd.common.core.AjaxResult;
import com.mdd.common.enums.ClientEnum; import com.mdd.front.LikeFrontThreadLocal;
import com.mdd.common.util.StringUtils;
import com.mdd.front.service.ILoginService; import com.mdd.front.service.ILoginService;
import com.mdd.front.validate.login.RegisterValidate; import com.mdd.front.validate.login.*;
import com.mdd.front.validate.login.ForgetPwdValidate; import com.mdd.front.vo.login.LoginUrlsVo;
import com.mdd.front.validate.login.OaLoginValidate; import com.mdd.front.vo.login.LoginTokenVo;
import com.mdd.front.validate.login.ScanLoginValidate;
import com.mdd.front.vo.LoginUrlsVo;
import com.mdd.front.vo.LoginTokenVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.util.Map; import javax.validation.constraints.NotNull;
/** /**
* 登录管理 * 登录管理
@ -35,45 +30,67 @@ public class LoginController {
* 注册账号 * 注册账号
* *
* @author fzr * @author fzr
* @param registerValidate 参数 * @param valid 注册参数
* @return AjaxResult<Object> * @return AjaxResult<Object>
*/ */
@NotLogin @NotLogin
@PostMapping("/register") @PostMapping("/register")
public AjaxResult<Object> register(@Validated @RequestBody RegisterValidate registerValidate) { public AjaxResult<Object> register(@Validated @RequestBody RegisterValidate valid) {
iLoginService.register(registerValidate); Integer terminal = LikeFrontThreadLocal.getTerminal();
String username = valid.getUsername();
String password = valid.getPassword();
iLoginService.register(username, password, terminal);
return AjaxResult.success(); return AjaxResult.success();
} }
/** /**
* 登录验证 * 账号登录
* *
* @author fzr * @param valid 登录参数
* @param params 参数
* @return AjaxResult<LoginTokenVo> * @return AjaxResult<LoginTokenVo>
*/ */
@NotLogin @NotLogin
@PostMapping("/check") @PostMapping("/accountLogin")
public AjaxResult<LoginTokenVo> check(@RequestBody Map<String, String> params) { public AjaxResult<LoginTokenVo> accountLogin(@Validated @RequestBody LoginPwdValidate valid) {
Assert.notNull(params.get("scene"), "scene参数缺失!"); Integer terminal = LikeFrontThreadLocal.getTerminal();
LoginTokenVo vo = new LoginTokenVo(); String username = valid.getUsername();
String password = valid.getPassword();
switch (params.get("scene")) { LoginTokenVo vo = iLoginService.accountLogin(username, password, terminal);
case "mnp": return AjaxResult.success(vo);
Assert.notNull(params.get("code"), "code参数缺失!");
Assert.notNull(params.get("client"), "client参数缺失!");
String code = params.get("code");
Integer client = Integer.parseInt(params.get("client"));
vo = iLoginService.mnpLogin(code, client);
break;
case "mobile":
vo = iLoginService.mobileLogin(params);
break;
case "account":
vo = iLoginService.accountLogin(params);
break;
} }
/**
* 手机登录
*
* @param valid 登录参数
* @return AjaxResult<LoginTokenVo>
*/
@NotLogin
@PostMapping("/mobileLogin")
public AjaxResult<LoginTokenVo> mobileLogin(@Validated @RequestBody LoginPhoneValidate valid) {
Integer terminal = LikeFrontThreadLocal.getTerminal();
String mobile = valid.getMobile();
String code = valid.getCode();
LoginTokenVo vo = iLoginService.mobileLogin(mobile, code, terminal);
return AjaxResult.success(vo);
}
/**
* 微信登录
*
* @param valid 登录参数
* @return AjaxResult<LoginTokenVo>
*/
@NotLogin
@PostMapping("/mnpLogin")
public AjaxResult<LoginTokenVo> mnpLogin(@Validated @RequestBody LoginCodeValidate valid) {
Integer terminal = LikeFrontThreadLocal.getTerminal();
String code = valid.getCode();
LoginTokenVo vo = iLoginService.mnpLogin(code, terminal);
return AjaxResult.success(vo); return AjaxResult.success(vo);
} }
@ -81,51 +98,34 @@ public class LoginController {
* 公众号登录 * 公众号登录
* *
* @author fzr * @author fzr
* @param oaLoginValidate 参数 * @param valid 登录参数
* @return AjaxResult<LoginTokenVo> * @return AjaxResult<LoginTokenVo>
*/ */
@NotLogin @NotLogin
@PostMapping("/oaLogin") @PostMapping("/oaLogin")
public AjaxResult<LoginTokenVo> oaLogin(@Validated @RequestBody OaLoginValidate oaLoginValidate) { public AjaxResult<LoginTokenVo> oaLogin(@Validated @RequestBody LoginCodeValidate valid) {
String code = oaLoginValidate.getCode(); Integer terminal = LikeFrontThreadLocal.getTerminal();
Integer client = oaLoginValidate.getClient(); String code = valid.getCode();
client = StringUtils.isNotNull(client) ? client : ClientEnum.OA.getCode();
LoginTokenVo vo = iLoginService.officeLogin(code, client); LoginTokenVo vo = iLoginService.officeLogin(code, terminal);
return AjaxResult.success(vo); return AjaxResult.success(vo);
} }
/** /**
* 公众号跳转url * 公众号链接
* *
* @author fzr * @author fzr
* @param url * @param url 跳转链
* @return AjaxResult<LoginCodesVo> * @return AjaxResult<LoginCodesVo>
*/ */
@NotLogin @NotLogin
@GetMapping("/codeUrl") @GetMapping("/oaCodeUrl")
public AjaxResult<LoginUrlsVo> codeUrl(@RequestParam String url) { public AjaxResult<LoginUrlsVo> oaCodeUrl(@Validated @NotNull() @RequestParam("url") String url) {
Assert.notNull(url, "url参数不能为空");
LoginUrlsVo vo = new LoginUrlsVo(); LoginUrlsVo vo = new LoginUrlsVo();
vo.setUrl(iLoginService.codeUrl(url)); vo.setUrl(iLoginService.oaCodeUrl(url));
return AjaxResult.success(vo); return AjaxResult.success(vo);
} }
/**
* 忘记密码
*
* @author fzr
* @param forgetPwdValidate 参数
* @return AjaxResult<Object>
*/
@NotLogin
@PostMapping("/forgotPassword")
public AjaxResult<Object> forgotPassword(@Validated @RequestBody ForgetPwdValidate forgetPwdValidate) {
iLoginService.forgotPassword(forgetPwdValidate);
return AjaxResult.success();
}
/** /**
* 扫码链接 * 扫码链接
* *
@ -134,9 +134,9 @@ public class LoginController {
* @return AjaxResult<LoginUrlsVo> * @return AjaxResult<LoginUrlsVo>
*/ */
@NotLogin @NotLogin
@GetMapping("/getScanCode") @GetMapping("/scanCodeUrl")
public AjaxResult<LoginUrlsVo> getScanCode(@RequestParam String url, HttpSession session) { public AjaxResult<LoginUrlsVo> scanCodeUrl(@Validated @NotNull() @RequestParam("url") String url, HttpSession session) {
String qrcodeUrl = iLoginService.getScanCode(url, session); String qrcodeUrl = iLoginService.scanCodeUrl(url, session);
LoginUrlsVo vo = new LoginUrlsVo(); LoginUrlsVo vo = new LoginUrlsVo();
vo.setUrl(qrcodeUrl); vo.setUrl(qrcodeUrl);
return AjaxResult.success(vo); return AjaxResult.success(vo);
@ -146,13 +146,17 @@ public class LoginController {
* 扫码登录 * 扫码登录
* *
* @author fzr * @author fzr
* @param scanLoginValidate 参数 * @param valid 扫码参数
* @return AjaxResult<Object> * @return AjaxResult<Object>
*/ */
@NotLogin @NotLogin
@PostMapping("/scanLogin") @PostMapping("/scanLogin")
public AjaxResult<Object> scanLogin(@Validated @RequestBody ScanLoginValidate scanLoginValidate, HttpSession session) { public AjaxResult<Object> scanLogin(@Validated @RequestBody LoginScanValidate valid, HttpSession session) {
LoginTokenVo vo = iLoginService.scanLogin(scanLoginValidate, session); Integer terminal = LikeFrontThreadLocal.getTerminal();
String code = valid.getCode();
String state = valid.getState();
LoginTokenVo vo = iLoginService.scanLogin(code, state, terminal, session);
return AjaxResult.success(vo); return AjaxResult.success(vo);
} }

View File

@ -5,8 +5,8 @@ import com.mdd.common.core.AjaxResult;
import com.mdd.common.validator.annotation.IDMust; import com.mdd.common.validator.annotation.IDMust;
import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.LikeFrontThreadLocal;
import com.mdd.front.service.IPcService; import com.mdd.front.service.IPcService;
import com.mdd.front.vo.PcArticleCenterVo; import com.mdd.front.vo.article.PcArticleCenterVo;
import com.mdd.front.vo.PcArticleDetailVo; import com.mdd.front.vo.article.PcArticleDetailVo;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;

View File

@ -1,67 +0,0 @@
package com.mdd.front.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mdd.common.core.AjaxResult;
import com.mdd.common.entity.notice.NoticeRecord;
import com.mdd.common.enums.NoticeEnum;
import com.mdd.common.exception.OperateException;
import com.mdd.common.mapper.notice.NoticeRecordMapper;
import com.mdd.common.plugin.notice.NoticeDriver;
import com.mdd.common.plugin.notice.vo.NoticeSmsVo;
import com.mdd.common.util.StringUtils;
import com.mdd.common.util.ToolUtils;
import com.mdd.front.validate.commons.SmsValidate;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Arrays;
/**
* 短信管理
*/
@RestController
@RequestMapping("/api/sms")
public class SmsController {
@Resource
NoticeRecordMapper noticeRecordMapper;
/**
* 发送短信
*
* @author fzr
* @param smsValidate 参数
* @return AjaxResult<Object>
*/
@PostMapping("/send")
public AjaxResult<Object> send(@Validated @RequestBody SmsValidate smsValidate) {
NoticeRecord noticeRecord = noticeRecordMapper.selectOne(new QueryWrapper<NoticeRecord>()
.eq("mobile", smsValidate.getMobile())
.eq("scene", smsValidate.getScene())
.eq("status", Arrays.asList(NoticeEnum.STATUS_WAIT, NoticeEnum.STATUS_OK))
.orderByDesc("id")
.last("limit 1"));
if (StringUtils.isNotNull(noticeRecord)) {
if (noticeRecord.getCreateTime() >= (System.currentTimeMillis() / 1000 - 60)){
throw new OperateException("操作频繁,请稍后再试!");
}
}
NoticeSmsVo params = new NoticeSmsVo()
.setScene(smsValidate.getScene())
.setMobile(smsValidate.getMobile())
.setExpire(900)
.setParams(new String[] {
"code:" + ToolUtils.randomInt(4)
});
NoticeDriver.handle(params);
return AjaxResult.success();
}
}

View File

@ -1,12 +1,14 @@
package com.mdd.front.controller; package com.mdd.front.controller;
import com.mdd.common.aop.NotLogin;
import com.mdd.common.core.AjaxResult; import com.mdd.common.core.AjaxResult;
import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.LikeFrontThreadLocal;
import com.mdd.front.service.IUserService; import com.mdd.front.service.IUserService;
import com.mdd.front.validate.UserBindMobileValidate; import com.mdd.front.validate.users.UserForgetPwdValidate;
import com.mdd.front.validate.UserMnpMobileValidate; import com.mdd.front.validate.users.UserPhoneBindValidate;
import com.mdd.front.validate.UserPasswordValidate; import com.mdd.front.validate.users.UserPhoneMnpValidate;
import com.mdd.front.validate.UserUpdateValidate; import com.mdd.front.validate.users.UserChangePwdValidate;
import com.mdd.front.validate.users.UserUpdateValidate;
import com.mdd.front.vo.users.UserCenterVo; import com.mdd.front.vo.users.UserCenterVo;
import com.mdd.front.vo.users.UserInfoVo; import com.mdd.front.vo.users.UserInfoVo;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -32,7 +34,8 @@ public class UserController {
*/ */
@GetMapping("/center") @GetMapping("/center")
public AjaxResult<UserCenterVo> center() { public AjaxResult<UserCenterVo> center() {
UserCenterVo vo = iUserService.center(LikeFrontThreadLocal.getUserId()); Integer userId = LikeFrontThreadLocal.getUserId();
UserCenterVo vo = iUserService.center(userId);
return AjaxResult.success(vo); return AjaxResult.success(vo);
} }
@ -44,7 +47,8 @@ public class UserController {
*/ */
@GetMapping("/info") @GetMapping("/info")
public AjaxResult<UserInfoVo> info() { public AjaxResult<UserInfoVo> info() {
UserInfoVo vo = iUserService.info(LikeFrontThreadLocal.getUserId()); Integer userId = LikeFrontThreadLocal.getUserId();
UserInfoVo vo = iUserService.info(userId);
return AjaxResult.success(vo); return AjaxResult.success(vo);
} }
@ -70,12 +74,26 @@ public class UserController {
* @return AjaxResult<Object> * @return AjaxResult<Object>
*/ */
@PostMapping("/changePwd") @PostMapping("/changePwd")
public AjaxResult<Object> changePwd(@Validated @RequestBody UserPasswordValidate passwordValidate) { public AjaxResult<Object> changePwd(@Validated @RequestBody UserChangePwdValidate passwordValidate) {
Integer userId = LikeFrontThreadLocal.getUserId(); Integer userId = LikeFrontThreadLocal.getUserId();
iUserService.changePwd(passwordValidate.getPassword(), passwordValidate.getOldPassword(), userId); iUserService.changePwd(passwordValidate.getPassword(), passwordValidate.getOldPassword(), userId);
return AjaxResult.success(); return AjaxResult.success();
} }
/**
* 忘记密码
*
* @author fzr
* @param userForgetPwdValidate 参数
* @return AjaxResult<Object>
*/
@NotLogin
@PostMapping("/forgotPwd")
public AjaxResult<Object> forgotPwd(@Validated @RequestBody UserForgetPwdValidate userForgetPwdValidate) {
iUserService.forgotPwd(userForgetPwdValidate);
return AjaxResult.success();
}
/** /**
* 绑定手机号 * 绑定手机号
* *
@ -84,7 +102,7 @@ public class UserController {
* @return AjaxResult<Object> * @return AjaxResult<Object>
*/ */
@PostMapping("/bindMobile") @PostMapping("/bindMobile")
public AjaxResult<Object> bindMobile(@Validated @RequestBody UserBindMobileValidate mobileValidate) { public AjaxResult<Object> bindMobile(@Validated @RequestBody UserPhoneBindValidate mobileValidate) {
Integer userId = LikeFrontThreadLocal.getUserId(); Integer userId = LikeFrontThreadLocal.getUserId();
iUserService.bindMobile(mobileValidate, userId); iUserService.bindMobile(mobileValidate, userId);
return AjaxResult.success(); return AjaxResult.success();
@ -98,7 +116,7 @@ public class UserController {
* @return AjaxResult<Object> * @return AjaxResult<Object>
*/ */
@PostMapping("/mnpMobile") @PostMapping("/mnpMobile")
public AjaxResult<Object> mnpMobile(@Validated @RequestBody UserMnpMobileValidate mobileValidate) { public AjaxResult<Object> mnpMobile(@Validated @RequestBody UserPhoneMnpValidate mobileValidate) {
iUserService.mnpMobile(mobileValidate.getCode().trim()); iUserService.mnpMobile(mobileValidate.getCode().trim());
return AjaxResult.success(); return AjaxResult.success();
} }

View File

@ -1,8 +1,8 @@
package com.mdd.front.service; package com.mdd.front.service;
import com.mdd.common.core.PageResult; import com.mdd.common.core.PageResult;
import com.mdd.front.validate.ArticleSearchValidate; import com.mdd.front.validate.article.ArticleSearchValidate;
import com.mdd.front.validate.commons.PageValidate; import com.mdd.front.validate.common.PageValidate;
import com.mdd.front.vo.article.ArticleCateVo; import com.mdd.front.vo.article.ArticleCateVo;
import com.mdd.front.vo.article.ArticleCollectVo; import com.mdd.front.vo.article.ArticleCollectVo;
import com.mdd.front.vo.article.ArticleDetailVo; import com.mdd.front.vo.article.ArticleDetailVo;

View File

@ -1,7 +1,7 @@
package com.mdd.front.service; package com.mdd.front.service;
import com.mdd.common.core.PageResult; import com.mdd.common.core.PageResult;
import com.mdd.front.validate.commons.PageValidate; import com.mdd.front.validate.common.PageValidate;
import com.mdd.front.vo.article.ArticleListedVo; import com.mdd.front.vo.article.ArticleListedVo;
import java.util.List; import java.util.List;

View File

@ -1,12 +1,8 @@
package com.mdd.front.service; package com.mdd.front.service;
import com.mdd.front.validate.login.RegisterValidate; import com.mdd.front.vo.login.LoginTokenVo;
import com.mdd.front.validate.login.ForgetPwdValidate;
import com.mdd.front.validate.login.ScanLoginValidate;
import com.mdd.front.vo.LoginTokenVo;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.util.Map;
/** /**
* 登录服务接口类 * 登录服务接口类
@ -17,47 +13,53 @@ public interface ILoginService {
* 账号注册 * 账号注册
* *
* @author fzr * @author fzr
* @param registerValidate 参数 * @param username 账号
* @param password 密码
* @param terminal 终端
*/ */
void register(RegisterValidate registerValidate); void register(String username, String password, Integer terminal);
/** /**
* 账号登录 * 账号登录
* *
* @author fzr * @author fzr
* @param params 参数 * @param username 账号
* @param password 密码
* @param terminal 终端
* @return LoginTokenVo * @return LoginTokenVo
*/ */
LoginTokenVo accountLogin(Map<String, String> params); LoginTokenVo accountLogin(String username, String password, Integer terminal);
/** /**
* 手机登录 * 手机登录
* *
* @author fzr * @author fzr
* @param params 参数 * @param mobile 手机号
* @param code 验证码
* @param terminal 终端
* @return LoginTokenVo * @return LoginTokenVo
*/ */
LoginTokenVo mobileLogin(Map<String, String> params); LoginTokenVo mobileLogin(String mobile, String code, Integer terminal);
/** /**
* 微信登录 * 微信登录
* *
* @author fzr * @author fzr
* @param code 微信code * @param code 微信code
* @param client 来源客户 * @param terminal
* @return LoginTokenVo * @return LoginTokenVo
*/ */
LoginTokenVo mnpLogin(String code, Integer client); LoginTokenVo mnpLogin(String code, Integer terminal);
/** /**
* 公众号登录 * 公众号登录
* *
* @author fzr * @author fzr
* @param code 参数 * @param code 微信Code
* @param client 参数 * @param terminal 终端
* @return LoginTokenVo * @return LoginTokenVo
*/ */
LoginTokenVo officeLogin(String code, Integer client); LoginTokenVo officeLogin(String code, Integer terminal);
/** /**
* 公众号跳转url * 公众号跳转url
@ -66,15 +68,7 @@ public interface ILoginService {
* @param url 连接 * @param url 连接
* @return String * @return String
*/ */
String codeUrl(String url); String oaCodeUrl(String url);
/**
* 忘记密码
*
* @author fzr
* @param forgetPwdValidate 参数
*/
void forgotPassword(ForgetPwdValidate forgetPwdValidate);
/** /**
* 扫码链接 * 扫码链接
@ -83,11 +77,17 @@ public interface ILoginService {
* @param session session * @param session session
* @return String * @return String
*/ */
String getScanCode(String url, HttpSession session); String scanCodeUrl(String url, HttpSession session);
/** /**
* 扫码登录 * 扫码登录
*
* @param code 编码
* @param state 标识
* @param terminal 终端
* @param session 会话
* @return LoginTokenVo
*/ */
LoginTokenVo scanLogin(ScanLoginValidate scanLoginValidate, HttpSession session); LoginTokenVo scanLogin(String code, String state, Integer terminal, HttpSession session);
} }

View File

@ -1,7 +1,7 @@
package com.mdd.front.service; package com.mdd.front.service;
import com.mdd.front.vo.PcArticleCenterVo; import com.mdd.front.vo.article.PcArticleCenterVo;
import com.mdd.front.vo.PcArticleDetailVo; import com.mdd.front.vo.article.PcArticleDetailVo;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@ -1,18 +0,0 @@
package com.mdd.front.service;
import java.util.Map;
/**
* 上传服务接口类
*/
public interface IUploadService {
/**
* 上传图片
*
* @author fzr
* @return Map<String, Object>
*/
Map<String, Object> image();
}

View File

@ -1,7 +1,8 @@
package com.mdd.front.service; package com.mdd.front.service;
import com.mdd.front.validate.UserBindMobileValidate; import com.mdd.front.validate.users.UserForgetPwdValidate;
import com.mdd.front.validate.UserUpdateValidate; import com.mdd.front.validate.users.UserPhoneBindValidate;
import com.mdd.front.validate.users.UserUpdateValidate;
import com.mdd.front.vo.users.UserCenterVo; import com.mdd.front.vo.users.UserCenterVo;
import com.mdd.front.vo.users.UserInfoVo; import com.mdd.front.vo.users.UserInfoVo;
@ -47,6 +48,8 @@ public interface IUserService {
*/ */
void changePwd(String password, String oldPassword, Integer userId); void changePwd(String password, String oldPassword, Integer userId);
void forgotPwd(UserForgetPwdValidate userForgetPwdValidate);
/** /**
* 绑定手机 * 绑定手机
* *
@ -54,7 +57,7 @@ public interface IUserService {
* @param mobileValidate 参数 * @param mobileValidate 参数
* @param userId 用户ID * @param userId 用户ID
*/ */
void bindMobile(UserBindMobileValidate mobileValidate, Integer userId); void bindMobile(UserPhoneBindValidate mobileValidate, Integer userId);
/** /**
* 微信手机 * 微信手机

View File

@ -17,8 +17,8 @@ import com.mdd.common.util.StringUtils;
import com.mdd.common.util.TimeUtils; import com.mdd.common.util.TimeUtils;
import com.mdd.common.util.UrlUtils; import com.mdd.common.util.UrlUtils;
import com.mdd.front.service.IArticleService; import com.mdd.front.service.IArticleService;
import com.mdd.front.validate.ArticleSearchValidate; import com.mdd.front.validate.article.ArticleSearchValidate;
import com.mdd.front.validate.commons.PageValidate; import com.mdd.front.validate.common.PageValidate;
import com.mdd.front.vo.article.ArticleCateVo; import com.mdd.front.vo.article.ArticleCateVo;
import com.mdd.front.vo.article.ArticleCollectVo; import com.mdd.front.vo.article.ArticleCollectVo;
import com.mdd.front.vo.article.ArticleDetailVo; import com.mdd.front.vo.article.ArticleDetailVo;

View File

@ -17,7 +17,7 @@ import com.mdd.common.mapper.DecorateTabbarMapper;
import com.mdd.common.mapper.setting.HotSearchMapper; import com.mdd.common.mapper.setting.HotSearchMapper;
import com.mdd.common.util.*; import com.mdd.common.util.*;
import com.mdd.front.service.IIndexService; import com.mdd.front.service.IIndexService;
import com.mdd.front.validate.commons.PageValidate; import com.mdd.front.validate.common.PageValidate;
import com.mdd.front.vo.article.ArticleListedVo; import com.mdd.front.vo.article.ArticleListedVo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;

View File

@ -15,12 +15,8 @@ import com.mdd.common.mapper.user.UserMapper;
import com.mdd.common.plugin.notice.NoticeCheck; import com.mdd.common.plugin.notice.NoticeCheck;
import com.mdd.common.util.*; import com.mdd.common.util.*;
import com.mdd.front.cache.ScanLoginCache; import com.mdd.front.cache.ScanLoginCache;
import com.mdd.front.config.FrontConfig;
import com.mdd.front.service.ILoginService; import com.mdd.front.service.ILoginService;
import com.mdd.front.validate.login.RegisterValidate; import com.mdd.front.vo.login.LoginTokenVo;
import com.mdd.front.validate.login.ForgetPwdValidate;
import com.mdd.front.validate.login.ScanLoginValidate;
import com.mdd.front.vo.LoginTokenVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
@ -53,30 +49,32 @@ public class LoginServiceImpl implements ILoginService {
* 注册账号 * 注册账号
* *
* @author fzr * @author fzr
* @param registerValidate 参数 * @param username 账号
* @param password 密码
* @param terminal 总端
*/ */
@Override @Override
public void register(RegisterValidate registerValidate) { public void register(String username, String password, Integer terminal) {
User model = userMapper.selectOne(new QueryWrapper<User>() User model = userMapper.selectOne(new QueryWrapper<User>()
.select("id,sn,username") .select("id,sn,username")
.eq("username", registerValidate.getUsername()) .eq("username", username)
.eq("is_delete", 0) .eq("is_delete", 0)
.last("limit 1")); .last("limit 1"));
Assert.isNull(model, "账号已存在,换一个吧!"); Assert.isNull(model, "账号已存在,换一个吧!");
Integer sn = this.randMakeSn(); Integer sn = this.__generateSn();
String salt = ToolUtils.randomString(5); String salt = ToolUtils.randomString(5);
String pwd = ToolUtils.makeMd5(registerValidate.getPassword()+salt); String pwd = ToolUtils.makeMd5(password+salt);
User user = new User(); User user = new User();
user.setSn(sn); user.setSn(sn);
user.setNickname("用户"+sn); user.setNickname("用户"+sn);
user.setUsername(registerValidate.getUsername()); user.setUsername(username);
user.setPassword(pwd); user.setPassword(pwd);
user.setSalt(salt); user.setSalt(salt);
user.setAvatar("/api/static/default_avatar.png"); user.setAvatar("/api/static/default_avatar.png");
user.setChannel(registerValidate.getClient()); user.setChannel(terminal);
user.setCreateTime(System.currentTimeMillis() / 1000); user.setCreateTime(System.currentTimeMillis() / 1000);
user.setUpdateTime(System.currentTimeMillis() / 1000); user.setUpdateTime(System.currentTimeMillis() / 1000);
userMapper.insert(user); userMapper.insert(user);
@ -86,16 +84,12 @@ public class LoginServiceImpl implements ILoginService {
* 账号登录 * 账号登录
* *
* @author fzr * @author fzr
* @param params 参数 * @param username 账号
* @param password 密码
* @return LoginTokenVo * @return LoginTokenVo
*/ */
@Override @Override
public LoginTokenVo accountLogin(Map<String, String> params) { public LoginTokenVo accountLogin(String username, String password, Integer terminal) {
Assert.notNull(params.get("username"), "username参数缺失!");
Assert.notNull(params.get("password"), "password参数缺失!");
String username = params.get("username");
String password = params.get("password");
User user = userMapper.selectOne(new QueryWrapper<User>() User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,username,password,salt,mobile,is_disable") .select("id,username,password,salt,mobile,is_disable")
.eq("username", username) .eq("username", username)
@ -107,23 +101,19 @@ public class LoginServiceImpl implements ILoginService {
Assert.isFalse(!pwd.equals(user.getPassword()), "账号或密码错误!"); Assert.isFalse(!pwd.equals(user.getPassword()), "账号或密码错误!");
Assert.isFalse(!user.getIsDisable().equals(0), "账号已被禁用!"); Assert.isFalse(!user.getIsDisable().equals(0), "账号已被禁用!");
return this.makeLoginToken(user.getId(), user.getMobile()); return this.__loginToken(user.getId(), user.getMobile(), terminal);
} }
/** /**
* 手机号登录 * 手机号登录
* *
* @author fzr * @author fzr
* @param params 参数 * @param mobile 手机号
* @param code 验证码
* @return LoginTokenVo * @return LoginTokenVo
*/ */
@Override @Override
public LoginTokenVo mobileLogin(Map<String, String> params) { public LoginTokenVo mobileLogin(String mobile, String code, Integer terminal) {
Assert.notNull(params.get("mobile"), "mobile参数缺失!");
Assert.notNull(params.get("code"), "code参数缺失!");
String mobile = params.get("mobile");
String code = params.get("code").toLowerCase();
// 校验验证码 // 校验验证码
int sceneCode = NoticeEnum.LOGIN_CODE.getCode(); int sceneCode = NoticeEnum.LOGIN_CODE.getCode();
if (!NoticeCheck.verify(sceneCode, code)) { if (!NoticeCheck.verify(sceneCode, code)) {
@ -140,20 +130,20 @@ public class LoginServiceImpl implements ILoginService {
Assert.notNull(user, "账号不存在!"); Assert.notNull(user, "账号不存在!");
Assert.isFalse(user.getIsDisable() != 0, "账号已禁用!"); Assert.isFalse(user.getIsDisable() != 0, "账号已禁用!");
return this.makeLoginToken(user.getId(), user.getMobile()); return this.__loginToken(user.getId(), user.getMobile(), terminal);
} }
/** /**
* 微信小程序登录 * 微信小程序登录
* *
* @author fzr * @author fzr
* @param code 微信code * @param code 编码
* @param client 来源客户 * @param terminal
* @return LoginTokenVo * @return LoginTokenVo
*/ */
@Override @Override
@Transactional @Transactional
public LoginTokenVo mnpLogin(String code, Integer client) { public LoginTokenVo mnpLogin(String code, Integer terminal) {
try { try {
WxMaService wxMaService = WeChatUtils.mnp(); WxMaService wxMaService = WeChatUtils.mnp();
WxMaJscode2SessionResult sessionResult = wxMaService.getUserService().getSessionInfo(code); WxMaJscode2SessionResult sessionResult = wxMaService.getUserService().getSessionInfo(code);
@ -161,7 +151,7 @@ public class LoginServiceImpl implements ILoginService {
String uniId = sessionResult.getUnionid(); String uniId = sessionResult.getUnionid();
String unionId = uniId == null ? "0" : uniId; String unionId = uniId == null ? "0" : uniId;
return this.userService(openId, unionId, client); return this.__wxLoginHandle(openId, unionId, terminal);
} catch (WxErrorException e) { } catch (WxErrorException e) {
throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg());
} }
@ -171,17 +161,19 @@ public class LoginServiceImpl implements ILoginService {
* 公众号登录 * 公众号登录
* *
* @author fzr * @author fzr
* @param code 编码
* @param terminal 终端
* @return LoginTokenVo * @return LoginTokenVo
*/ */
@Override @Override
public LoginTokenVo officeLogin(String code, Integer client) { public LoginTokenVo officeLogin(String code, Integer terminal) {
try { try {
WxMpService wxMpService = WeChatUtils.official(); WxMpService wxMpService = WeChatUtils.official();
WxOAuth2AccessToken wxOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(code); WxOAuth2AccessToken wxOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(code);
String uniId = wxOAuth2AccessToken.getUnionId(); String uniId = wxOAuth2AccessToken.getUnionId();
String openId = wxOAuth2AccessToken.getOpenId(); String openId = wxOAuth2AccessToken.getOpenId();
String unionId = uniId == null ? "0" : uniId; String unionId = uniId == null ? "0" : uniId;
return this.userService(openId, unionId, client); return this.__wxLoginHandle(openId, unionId, terminal);
} catch (WxErrorException e) { } catch (WxErrorException e) {
throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg());
} }
@ -195,50 +187,12 @@ public class LoginServiceImpl implements ILoginService {
* @return String * @return String
*/ */
@Override @Override
public String codeUrl(String url) { public String oaCodeUrl(String url) {
WxMpService wxMpService = WeChatUtils.official(); WxMpService wxMpService = WeChatUtils.official();
WxMpOAuth2ServiceImpl wxMpOAuth2Service = new WxMpOAuth2ServiceImpl(wxMpService); WxMpOAuth2ServiceImpl wxMpOAuth2Service = new WxMpOAuth2ServiceImpl(wxMpService);
return wxMpOAuth2Service.buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, null); return wxMpOAuth2Service.buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, null);
} }
/**
* 忘记密码
*
* @author fzr
* @param forgetPwdValidate 参数
*/
@Override
public void forgotPassword(ForgetPwdValidate forgetPwdValidate) {
String mobile = forgetPwdValidate.getMobile();
String code = forgetPwdValidate.getCode();
String password = forgetPwdValidate.getPassword();
// 校验验证码
int sceneCode = NoticeEnum.FORGOT_PASSWORD_CODE.getCode();
if (!NoticeCheck.verify(sceneCode, code)) {
throw new OperateException("验证码错误!");
}
// 查询手机号
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,username,mobile,is_disable")
.eq("is_delete", 0)
.eq("mobile", mobile)
.last("limit 1"));
// 验证账号
Assert.notNull(user, "账号不存在!");
String salt = ToolUtils.randomString(5);
String pwd = ToolUtils.makeMd5(password.trim()+salt);
// 更新密码
user.setPassword(pwd);
user.setSalt(salt);
user.setUpdateTime(System.currentTimeMillis() / 1000);
userMapper.updateById(user);
}
/** /**
* 扫码链接 * 扫码链接
* *
@ -247,7 +201,7 @@ public class LoginServiceImpl implements ILoginService {
* @return String * @return String
*/ */
@Override @Override
public String getScanCode(String url, HttpSession session) { public String scanCodeUrl(String url, HttpSession session) {
// 获取AppId // 获取AppId
String appId = ConfigUtils.get("op_channel", "appId", ""); String appId = ConfigUtils.get("op_channel", "appId", "");
@ -280,18 +234,14 @@ public class LoginServiceImpl implements ILoginService {
* 扫码登录 * 扫码登录
* *
* @author fzr * @author fzr
* @param scanLoginValidate 参数 * @param code 编码
* @param session 当前会话 * @param state 标识
* @param terminal 终端
* @param session 会话
*/ */
@Override @Override
public LoginTokenVo scanLogin(ScanLoginValidate scanLoginValidate, HttpSession session) { public LoginTokenVo scanLogin(String code, String state, Integer terminal, HttpSession session) {
// 验证唯一标识是否过期
if (ScanLoginCache.get(session.getId()).equals(scanLoginValidate.getState())) {
throw new OperateException("二维码已失效或不存在,请重新操作");
}
// 得到配置和授权临时票据code // 得到配置和授权临时票据code
String code = scanLoginValidate.getCode();
String appId = ConfigUtils.get("op_channel", "appId", ""); String appId = ConfigUtils.get("op_channel", "appId", "");
String appSecret = ConfigUtils.get("op_channel", "appSecret", ""); String appSecret = ConfigUtils.get("op_channel", "appSecret", "");
@ -327,44 +277,18 @@ public class LoginServiceImpl implements ILoginService {
String openId = userinfoMap.get("openid"); String openId = userinfoMap.get("openid");
String uniId = userinfoMap.get("unionid"); String uniId = userinfoMap.get("unionid");
String unionId = uniId == null ? "0" : uniId; String unionId = uniId == null ? "0" : uniId;
return this.userService(openId, unionId, ClientEnum.PC.getCode()); return this.__wxLoginHandle(openId, unionId, terminal);
} }
/** /**
* 生成登录Token * 处理微信登录
*
* @author fzr
* @param userId 用户ID
* @param mobile 用户手机
* @return LoginTokenVo
*/
private LoginTokenVo makeLoginToken(Integer userId, String mobile) {
// 实现账号登录
StpUtil.login(userId);
// 更新登录信息
User user = new User();
user.setLastLoginIp(IpUtils.getHostIp());
user.setLastLoginTime(System.currentTimeMillis() / 1000);
userMapper.update(user, new QueryWrapper<User>().eq("id", userId));
// 返回登录信息
LoginTokenVo vo = new LoginTokenVo();
vo.setId(userId);
vo.setIsBindMobile(!StringUtils.isEmpty(mobile));
vo.setToken(StpUtil.getTokenValue());
return vo;
}
/**
* 用户创建服务
* *
* @param openId (openId) * @param openId (openId)
* @param unionId (unionId) * @param unionId (unionId)
* @param client (client) * @param terminal (terminal)
* @return LoginTokenVo * @return LoginTokenVo
*/ */
private LoginTokenVo userService(String openId, String unionId, Integer client) { private LoginTokenVo __wxLoginHandle(String openId, String unionId, Integer terminal) {
UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper<UserAuth>() UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper<UserAuth>()
.nested(wq->wq .nested(wq->wq
.eq("unionid", unionId).or() .eq("unionid", unionId).or()
@ -381,7 +305,7 @@ public class LoginServiceImpl implements ILoginService {
} }
if (StringUtils.isNull(user)) { if (StringUtils.isNull(user)) {
Integer sn = this.randMakeSn(); Integer sn = this.__generateSn();
User model = new User(); User model = new User();
model.setSn(sn); model.setSn(sn);
model.setAvatar("/api/static/default_avatar.png"); model.setAvatar("/api/static/default_avatar.png");
@ -402,7 +326,7 @@ public class LoginServiceImpl implements ILoginService {
auth.setUserId(model.getId()); auth.setUserId(model.getId());
auth.setUnionid(unionId); auth.setUnionid(unionId);
auth.setOpenid(openId); auth.setOpenid(openId);
auth.setClient(client); auth.setTerminal(terminal);
auth.setCreateTime(System.currentTimeMillis() / 1000); auth.setCreateTime(System.currentTimeMillis() / 1000);
auth.setUpdateTime(System.currentTimeMillis() / 1000); auth.setUpdateTime(System.currentTimeMillis() / 1000);
userAuthMapper.insert(auth); userAuthMapper.insert(auth);
@ -414,7 +338,7 @@ public class LoginServiceImpl implements ILoginService {
.nested(wq->wq .nested(wq->wq
.eq("unionid", unionId).or() .eq("unionid", unionId).or()
.eq("openid", openId) .eq("openid", openId)
).eq("client", client) ).eq("terminal", terminal)
.last("limit 1")); .last("limit 1"));
if (StringUtils.isNull(auth)) { if (StringUtils.isNull(auth)) {
@ -422,7 +346,7 @@ public class LoginServiceImpl implements ILoginService {
authModel.setUserId(user.getId()); authModel.setUserId(user.getId());
authModel.setUnionid(unionId); authModel.setUnionid(unionId);
authModel.setOpenid(openId); authModel.setOpenid(openId);
authModel.setClient(client); authModel.setTerminal(terminal);
authModel.setCreateTime(System.currentTimeMillis() / 1000); authModel.setCreateTime(System.currentTimeMillis() / 1000);
authModel.setUpdateTime(System.currentTimeMillis() / 1000); authModel.setUpdateTime(System.currentTimeMillis() / 1000);
userAuthMapper.insert(authModel); userAuthMapper.insert(authModel);
@ -432,7 +356,34 @@ public class LoginServiceImpl implements ILoginService {
} }
} }
return this.makeLoginToken(userId, user.getMobile()); return this.__loginToken(userId, user.getMobile(), terminal);
}
/**
* 处理录令牌
*
* @author fzr
* @param userId 用户ID
* @param mobile 用户手机
* @param terminal 终端
* @return LoginTokenVo
*/
private LoginTokenVo __loginToken(Integer userId, String mobile, Integer terminal) {
// 实现账号登录
StpUtil.login(userId, terminal);
// 更新登录信息
User user = new User();
user.setLastLoginIp(IpUtils.getHostIp());
user.setLastLoginTime(System.currentTimeMillis() / 1000);
userMapper.update(user, new QueryWrapper<User>().eq("id", userId));
// 返回登录信息
LoginTokenVo vo = new LoginTokenVo();
vo.setId(userId);
vo.setIsBindMobile(!StringUtils.isEmpty(mobile));
vo.setToken(StpUtil.getTokenValue());
return vo;
} }
/** /**
@ -441,7 +392,7 @@ public class LoginServiceImpl implements ILoginService {
* @author fzr * @author fzr
* @return Integer * @return Integer
*/ */
private Integer randMakeSn() { private Integer __generateSn() {
Integer sn; Integer sn;
while (true) { while (true) {
sn = Integer.parseInt(ToolUtils.randomInt(8)); sn = Integer.parseInt(ToolUtils.randomInt(8));

View File

@ -13,8 +13,8 @@ import com.mdd.common.mapper.article.ArticleCollectMapper;
import com.mdd.common.mapper.article.ArticleMapper; import com.mdd.common.mapper.article.ArticleMapper;
import com.mdd.common.util.*; import com.mdd.common.util.*;
import com.mdd.front.service.IPcService; import com.mdd.front.service.IPcService;
import com.mdd.front.vo.PcArticleCenterVo; import com.mdd.front.vo.article.PcArticleCenterVo;
import com.mdd.front.vo.PcArticleDetailVo; import com.mdd.front.vo.article.PcArticleDetailVo;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;

View File

@ -1,19 +0,0 @@
package com.mdd.front.service.impl;
import com.mdd.front.service.IUploadService;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* 上传服务实现类
*/
@Service
public class UploadServiceImpl implements IUploadService {
@Override
public Map<String, Object> image() {
return null;
}
}

View File

@ -17,8 +17,9 @@ import com.mdd.common.plugin.notice.NoticeCheck;
import com.mdd.common.util.*; import com.mdd.common.util.*;
import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.LikeFrontThreadLocal;
import com.mdd.front.service.IUserService; import com.mdd.front.service.IUserService;
import com.mdd.front.validate.UserBindMobileValidate; import com.mdd.front.validate.users.UserForgetPwdValidate;
import com.mdd.front.validate.UserUpdateValidate; import com.mdd.front.validate.users.UserPhoneBindValidate;
import com.mdd.front.validate.users.UserUpdateValidate;
import com.mdd.front.vo.users.UserCenterVo; import com.mdd.front.vo.users.UserCenterVo;
import com.mdd.front.vo.users.UserInfoVo; import com.mdd.front.vo.users.UserInfoVo;
import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.error.WxErrorException;
@ -201,6 +202,43 @@ public class UserServiceImpl implements IUserService {
userMapper.updateById(u); userMapper.updateById(u);
} }
/**
* 忘记密码
*
* @param userForgetPwdValidate
*/
@Override
public void forgotPwd(UserForgetPwdValidate userForgetPwdValidate) {
String mobile = userForgetPwdValidate.getMobile();
String code = userForgetPwdValidate.getCode();
String password = userForgetPwdValidate.getPassword();
// 校验验证码
int sceneCode = NoticeEnum.FORGOT_PASSWORD_CODE.getCode();
if (!NoticeCheck.verify(sceneCode, code)) {
throw new OperateException("验证码错误!");
}
// 查询手机号
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,username,mobile,is_disable")
.eq("is_delete", 0)
.eq("mobile", mobile)
.last("limit 1"));
// 验证账号
com.baomidou.mybatisplus.core.toolkit.Assert.notNull(user, "账号不存在!");
String salt = ToolUtils.randomString(5);
String pwd = ToolUtils.makeMd5(password.trim()+salt);
// 更新密码
user.setPassword(pwd);
user.setSalt(salt);
user.setUpdateTime(System.currentTimeMillis() / 1000);
userMapper.updateById(user);
}
/** /**
* 绑定手机 * 绑定手机
* *
@ -209,7 +247,7 @@ public class UserServiceImpl implements IUserService {
* @param userId 用户ID * @param userId 用户ID
*/ */
@Override @Override
public void bindMobile(UserBindMobileValidate mobileValidate, Integer userId) { public void bindMobile(UserPhoneBindValidate mobileValidate, Integer userId) {
String type = mobileValidate.getType(); String type = mobileValidate.getType();
String mobile = mobileValidate.getMobile(); String mobile = mobileValidate.getMobile();
String code = mobileValidate.getCode().toLowerCase(); String code = mobileValidate.getCode().toLowerCase();

View File

@ -1,4 +1,4 @@
package com.mdd.front.validate; package com.mdd.front.validate.article;
import com.mdd.common.validator.annotation.IDMust; import com.mdd.common.validator.annotation.IDMust;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.mdd.front.validate; package com.mdd.front.validate.article;
import com.mdd.common.validator.annotation.StringContains; import com.mdd.common.validator.annotation.StringContains;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.mdd.front.validate.commons; package com.mdd.front.validate.common;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.mdd.front.validate.commons; package com.mdd.front.validate.common;
import lombok.Data; import lombok.Data;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;

View File

@ -0,0 +1,16 @@
package com.mdd.front.validate.login;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 微信登录参数
*/
@Data
public class LoginCodeValidate {
@NotNull(message = "code参数缺失")
private String code;
}

View File

@ -0,0 +1,27 @@
package com.mdd.front.validate.login;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
/**
* 手机号登录参数
*/
@Data
public class LoginPhoneValidate {
@NotNull(message = "mobile参数缺失")
@NotEmpty(message = "手机号不能为空")
@Length(min = 11, max = 11, message = "手机号只能为11位")
@Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
private String mobile;
@NotNull(message = "code参数缺失")
@NotEmpty(message = "code不能为空")
@Length(min = 4, max = 6, message = "验证码长度不符合")
private String code;
}

View File

@ -0,0 +1,22 @@
package com.mdd.front.validate.login;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 账号密码登录参数
*/
@Data
public class LoginPwdValidate {
@NotNull(message = "username参数缺失")
@NotEmpty(message = "账号不能为空")
private String username;
@NotNull(message = "password参数缺失")
@NotEmpty(message = "密码不能为空")
private String password;
}

View File

@ -2,6 +2,7 @@ package com.mdd.front.validate.login;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
@ -9,14 +10,16 @@ import java.io.Serializable;
* 网站扫码登录验证 * 网站扫码登录验证
*/ */
@Data @Data
public class ScanLoginValidate implements Serializable { public class LoginScanValidate implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@NotNull(message = "code参数缺失") @NotNull(message = "code参数缺失")
@NotEmpty(message = "code不能为空")
private String code; private String code;
@NotNull(message = "state参数缺失") @NotNull(message = "二维码已失效或不存在,请重新操作")
@NotEmpty(message = "二维码已失效或不存在,请重新操作")
private String state; private String state;
} }

View File

@ -1,23 +0,0 @@
package com.mdd.front.validate.login;
import com.mdd.common.validator.annotation.IntegerContains;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 公众号登录参数
*/
@Data
public class OaLoginValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "code参数缺失")
private String code;
@IntegerContains(values = {1, 2, 3, 4, 5, 6}, message = "client参数值不符合")
private Integer client;
}

View File

@ -1,6 +1,5 @@
package com.mdd.front.validate.login; package com.mdd.front.validate.login;
import com.mdd.common.validator.annotation.IntegerContains;
import lombok.Data; import lombok.Data;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
@ -28,8 +27,4 @@ public class RegisterValidate implements Serializable {
@Length(min = 6, max = 12, message = "密码必须在6~12个字符内") @Length(min = 6, max = 12, message = "密码必须在6~12个字符内")
private String password; private String password;
@NotNull(message = "client参数缺失")
@IntegerContains(values = {1, 2, 3, 4, 5, 6}, message = "不是合法客户端")
private Integer client;
} }

View File

@ -1,4 +1,4 @@
package com.mdd.front.validate; package com.mdd.front.validate.users;
import lombok.Data; import lombok.Data;
@ -10,7 +10,7 @@ import java.io.Serializable;
* 用户修改密码参数 * 用户修改密码参数
*/ */
@Data @Data
public class UserPasswordValidate implements Serializable { public class UserChangePwdValidate implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -18,6 +18,8 @@ public class UserPasswordValidate implements Serializable {
@Pattern(message = "密码必须是6-20字母+数字组合!", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$") @Pattern(message = "密码必须是6-20字母+数字组合!", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$")
private String password; private String password;
@NotNull(message = "oldPassword参数缺失")
@NotNull(message = "旧密码不能为空")
private String oldPassword=""; private String oldPassword="";
} }

View File

@ -1,7 +1,8 @@
package com.mdd.front.validate.login; package com.mdd.front.validate.users;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
@ -9,17 +10,20 @@ import java.io.Serializable;
* 忘记密码参数 * 忘记密码参数
*/ */
@Data @Data
public class ForgetPwdValidate implements Serializable { public class UserForgetPwdValidate implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@NotNull(message = "mobile参数缺失") @NotNull(message = "mobile参数缺失")
@NotEmpty(message = "手机号不能为空")
private String mobile; private String mobile;
@NotNull(message = "code参数缺失") @NotNull(message = "code参数缺失")
@NotEmpty(message = "验证码不能为空")
private String code; private String code;
@NotNull(message = "password参数缺失") @NotNull(message = "password参数缺失")
@NotEmpty(message = "新密码不能为空")
private String password; private String password;
} }

View File

@ -1,4 +1,4 @@
package com.mdd.front.validate; package com.mdd.front.validate.users;
import com.mdd.common.validator.annotation.StringContains; import com.mdd.common.validator.annotation.StringContains;
import lombok.Data; import lombok.Data;
@ -13,7 +13,7 @@ import java.io.Serializable;
* 绑定或修改手机参数 * 绑定或修改手机参数
*/ */
@Data @Data
public class UserBindMobileValidate implements Serializable { public class UserPhoneBindValidate implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -28,6 +28,7 @@ public class UserBindMobileValidate implements Serializable {
private String mobile; private String mobile;
@NotNull(message = "code参数缺失") @NotNull(message = "code参数缺失")
@NotEmpty(message = "验证码不能为空")
private String code; private String code;
} }

View File

@ -1,4 +1,4 @@
package com.mdd.front.validate; package com.mdd.front.validate.users;
import lombok.Data; import lombok.Data;
@ -9,7 +9,7 @@ import java.io.Serializable;
* 获取微信手机号参数 * 获取微信手机号参数
*/ */
@Data @Data
public class UserMnpMobileValidate implements Serializable { public class UserPhoneMnpValidate implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -1,4 +1,4 @@
package com.mdd.front.validate; package com.mdd.front.validate.users;
import com.mdd.common.validator.annotation.StringContains; import com.mdd.common.validator.annotation.StringContains;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.mdd.front.vo; package com.mdd.front.vo.article;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.mdd.front.vo; package com.mdd.front.vo.article;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.mdd.front.vo; package com.mdd.front.vo.login;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.mdd.front.vo; package com.mdd.front.vo.login;
import lombok.Data; import lombok.Data;