From 43983deb481a3f5fa00d371babd585404f57ff3f Mon Sep 17 00:00:00 2001 From: TinyAnts Date: Tue, 20 Dec 2022 11:55:21 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mdd/front/config/FrontConfig.java | 2 ++ .../mdd/front/controller/LoginController.java | 12 +++++++ .../com/mdd/front/service/ILoginService.java | 2 ++ .../front/service/impl/LoginServiceImpl.java | 34 +++++++++++++++++++ 4 files changed, 50 insertions(+) diff --git a/server/like-front/src/main/java/com/mdd/front/config/FrontConfig.java b/server/like-front/src/main/java/com/mdd/front/config/FrontConfig.java index b7d10914..6b9e2d7d 100644 --- a/server/like-front/src/main/java/com/mdd/front/config/FrontConfig.java +++ b/server/like-front/src/main/java/com/mdd/front/config/FrontConfig.java @@ -28,6 +28,8 @@ public class FrontConfig { "/api/article/category", "/api/article/detail", "/api/article/list", + + "/api/login/getScanCode" }; } diff --git a/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java b/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java index 1ea9bf50..6b5e6433 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java @@ -11,6 +11,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpSession; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.LinkedHashMap; import java.util.Map; /** @@ -104,4 +108,12 @@ public class LoginController { return AjaxResult.success(); } + @GetMapping("/getScanCode") + public AjaxResult> getScanCode(HttpSession session) { + String qrcodeUrl = iLoginService.getScanCode(session); + Map map = new LinkedHashMap<>(); + map.put("url", qrcodeUrl); + return AjaxResult.success(map); + } + } diff --git a/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java b/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java index fca2141c..85bfcb95 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java +++ b/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java @@ -3,6 +3,7 @@ package com.mdd.front.service; import com.mdd.front.validate.UserRegisterValidate; import com.mdd.front.vo.LoginTokenVo; +import javax.servlet.http.HttpSession; import java.util.Map; /** @@ -71,4 +72,5 @@ public interface ILoginService { */ void forgotPassword(Map params); + String getScanCode(HttpSession session); } diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java index f3cf8b73..585f6ad8 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java @@ -17,6 +17,7 @@ import com.mdd.front.config.FrontConfig; import com.mdd.front.service.ILoginService; import com.mdd.front.validate.UserRegisterValidate; import com.mdd.front.vo.LoginTokenVo; +import jdk.nashorn.internal.runtime.regexp.joni.Config; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; @@ -27,6 +28,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import javax.servlet.http.HttpSession; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.Map; /** @@ -414,6 +418,36 @@ public class LoginServiceImpl implements ILoginService { userMapper.updateById(user); } + @Override + public String getScanCode(HttpSession session) { + // 获取AppId + String appId = ConfigUtils.get("op_channel", "appId", ""); + + // 微信开放平台授权 + String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" + + "?appid=%s" + + "&redirect_uri=%s" + + "&response_type=code" + + "&scope=snsapi_login" + + "&state=%s" + + "#wechat_redirect"; + + // 回调地址 + String redirectUrl = "https://www.baidu.com/"; + try { + redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new OperateException(e.getMessage()); + } + + // 防止csrf攻击 + String state = ToolsUtils.makeUUID().replaceAll("-", ""); + RedisUtils.set("wechat-open-state-"+session.getId(), state, 600); + + //生成qrcodeUrl + return String.format(baseUrl, appId, redirectUrl, state); + } + /** * 生成用户编号 * From 3e97c2201b7694130dbc2b36a19498c898ebab3a Mon Sep 17 00:00:00 2001 From: TinyAnts Date: Tue, 20 Dec 2022 14:53:08 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=80=E6=94=BE?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E6=B8=A0=E9=81=93=E8=AE=BE=E7=BD=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../channel/ChannelOpController.java | 47 +++++++++++++++++++ .../mdd/admin/service/IChannelOpService.java | 27 +++++++++++ .../service/impl/ChannelOpServiceImpl.java | 44 +++++++++++++++++ .../validate/channel/ChannelOpValidate.java | 19 ++++++++ .../com/mdd/admin/vo/channel/ChannelOpVo.java | 18 +++++++ 5 files changed, 155 insertions(+) create mode 100644 server/like-admin/src/main/java/com/mdd/admin/controller/channel/ChannelOpController.java create mode 100644 server/like-admin/src/main/java/com/mdd/admin/service/IChannelOpService.java create mode 100644 server/like-admin/src/main/java/com/mdd/admin/service/impl/ChannelOpServiceImpl.java create mode 100644 server/like-admin/src/main/java/com/mdd/admin/validate/channel/ChannelOpValidate.java create mode 100644 server/like-admin/src/main/java/com/mdd/admin/vo/channel/ChannelOpVo.java diff --git a/server/like-admin/src/main/java/com/mdd/admin/controller/channel/ChannelOpController.java b/server/like-admin/src/main/java/com/mdd/admin/controller/channel/ChannelOpController.java new file mode 100644 index 00000000..2660297a --- /dev/null +++ b/server/like-admin/src/main/java/com/mdd/admin/controller/channel/ChannelOpController.java @@ -0,0 +1,47 @@ +package com.mdd.admin.controller.channel; + +import com.mdd.admin.service.IChannelOpService; +import com.mdd.admin.validate.channel.ChannelOpValidate; +import com.mdd.admin.vo.channel.ChannelOpVo; +import com.mdd.common.core.AjaxResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 微信开发平台渠道设置 + */ +@RestController +@RequestMapping("api/channel/op") +public class ChannelOpController { + + @Resource + IChannelOpService iChannelOpService; + + /** + * 开放平台设置详情 + * + * @author fzr + * @return AjaxResult + */ + @GetMapping("/detail") + public AjaxResult detail() { + ChannelOpVo vo = iChannelOpService.detail(); + return AjaxResult.success(vo); + } + + /** + * 开放平台设置保存 + * + * @author fzr + * @param opValidate 参数 + * @return AjaxResult + */ + @PostMapping("/save") + public AjaxResult save(@Validated @RequestBody ChannelOpValidate opValidate) { + iChannelOpService.save(opValidate); + return AjaxResult.success(); + } + +} diff --git a/server/like-admin/src/main/java/com/mdd/admin/service/IChannelOpService.java b/server/like-admin/src/main/java/com/mdd/admin/service/IChannelOpService.java new file mode 100644 index 00000000..4638cf42 --- /dev/null +++ b/server/like-admin/src/main/java/com/mdd/admin/service/IChannelOpService.java @@ -0,0 +1,27 @@ +package com.mdd.admin.service; + +import com.mdd.admin.validate.channel.ChannelOpValidate; +import com.mdd.admin.vo.channel.ChannelOpVo; + +/** + * 微信开放渠道设置接口服务类 + */ +public interface IChannelOpService { + + /** + * 开放平台设置详情 + * + * @author fzr + * @return ChannelOpVo + */ + ChannelOpVo detail(); + + /** + * 开放平台设置保存 + * + * @author fzr + * @param opValidate 参数 + */ + void save(ChannelOpValidate opValidate); + +} diff --git a/server/like-admin/src/main/java/com/mdd/admin/service/impl/ChannelOpServiceImpl.java b/server/like-admin/src/main/java/com/mdd/admin/service/impl/ChannelOpServiceImpl.java new file mode 100644 index 00000000..1350bfbd --- /dev/null +++ b/server/like-admin/src/main/java/com/mdd/admin/service/impl/ChannelOpServiceImpl.java @@ -0,0 +1,44 @@ +package com.mdd.admin.service.impl; + +import com.mdd.admin.service.IChannelOpService; +import com.mdd.admin.validate.channel.ChannelOpValidate; +import com.mdd.admin.vo.channel.ChannelOpVo; +import com.mdd.common.util.ConfigUtils; +import org.springframework.stereotype.Service; + +/** + * 开放平台设置服务类 + */ +@Service +public class ChannelOpServiceImpl implements IChannelOpService { + + /** + * 开放平台设置详情 + * + * @author fzr + * @return ChannelOpVo + */ + @Override + public ChannelOpVo detail() { + String appId = ConfigUtils.get("op_channel", "appId", ""); + String appSecret = ConfigUtils.get("op_channel", "appSecret", ""); + + ChannelOpVo vo = new ChannelOpVo(); + vo.setAppId(appId); + vo.setAppSecret(appSecret); + return vo; + } + + /** + * 开放平台设置保存 + * + * @author fzr + * @param opValidate 参数 + */ + @Override + public void save(ChannelOpValidate opValidate) { + ConfigUtils.set("op_channel", "appId", opValidate.getAppId()); + ConfigUtils.set("op_channel", "appSecret", opValidate.getAppId()); + } + +} diff --git a/server/like-admin/src/main/java/com/mdd/admin/validate/channel/ChannelOpValidate.java b/server/like-admin/src/main/java/com/mdd/admin/validate/channel/ChannelOpValidate.java new file mode 100644 index 00000000..91686ea6 --- /dev/null +++ b/server/like-admin/src/main/java/com/mdd/admin/validate/channel/ChannelOpValidate.java @@ -0,0 +1,19 @@ +package com.mdd.admin.validate.channel; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 开发平台渠道参数 + */ +@Data +public class ChannelOpValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + private String appId; + + private String appSecret; + +} diff --git a/server/like-admin/src/main/java/com/mdd/admin/vo/channel/ChannelOpVo.java b/server/like-admin/src/main/java/com/mdd/admin/vo/channel/ChannelOpVo.java new file mode 100644 index 00000000..9d236079 --- /dev/null +++ b/server/like-admin/src/main/java/com/mdd/admin/vo/channel/ChannelOpVo.java @@ -0,0 +1,18 @@ +package com.mdd.admin.vo.channel; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 开发平台Vo + */ +@Data +public class ChannelOpVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private String appId; + private String appSecret; + +} From 3b8e501a0b7263c38c045a11bd3312ed7981886f Mon Sep 17 00:00:00 2001 From: TinyAnts Date: Tue, 20 Dec 2022 15:22:17 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mdd/front/service/ILoginService.java | 8 +- .../front/service/impl/LoginServiceImpl.java | 213 +++++++++--------- 2 files changed, 108 insertions(+), 113 deletions(-) diff --git a/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java b/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java index 85bfcb95..648df3fd 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java +++ b/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java @@ -20,13 +20,13 @@ public interface ILoginService { void register(UserRegisterValidate userRegisterValidate); /** - * 微信登录 + * 账号登录 * * @author fzr * @param params 参数 * @return LoginTokenVo */ - LoginTokenVo mnpLogin(Map params); + LoginTokenVo accountLogin(Map params); /** * 手机登录 @@ -38,13 +38,13 @@ public interface ILoginService { LoginTokenVo mobileLogin(Map params); /** - * 账号登录 + * 微信登录 * * @author fzr * @param params 参数 * @return LoginTokenVo */ - LoginTokenVo accountLogin(Map params); + LoginTokenVo mnpLogin(Map params); /** * 公众号登录 diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java index 585f6ad8..b6c1e55a 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java @@ -17,7 +17,6 @@ import com.mdd.front.config.FrontConfig; import com.mdd.front.service.ILoginService; import com.mdd.front.validate.UserRegisterValidate; import com.mdd.front.vo.LoginTokenVo; -import jdk.nashorn.internal.runtime.regexp.joni.Config; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; @@ -79,6 +78,81 @@ public class LoginServiceImpl implements ILoginService { userMapper.insert(user); } + /** + * 账号登录 + * + * @author fzr + * @param params 参数 + * @return LoginTokenVo + */ + @Override + public LoginTokenVo accountLogin(Map params) { + 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() + .select("id,username,password,salt,mobile,is_disable") + .eq("username", username) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(user, "账号不存在!"); + String pwd = ToolsUtils.makeMd5(password+user.getSalt()); + Assert.isFalse(!pwd.equals(user.getPassword()), "账号或密码错误!"); + Assert.isFalse(user.getIsDisable() != 0, "账号已被禁用!"); + + // 更新登录信息 + user.setLastLoginIp(IpUtils.getHostIp()); + user.setLastLoginTime(System.currentTimeMillis() / 1000); + userMapper.updateById(user); + + return this.makeLoginToken(user.getId(), user.getMobile()); + } + + /** + * 手机号登录 + * + * @author fzr + * @param params 参数 + * @return LoginTokenVo + */ + @Override + public LoginTokenVo mobileLogin(Map params) { + Assert.notNull(params.get("mobile"), "mobile参数缺失!"); + Assert.notNull(params.get("code"), "code参数缺失!"); + String mobile = params.get("mobile"); + String code = params.get("code").toLowerCase(); + + // 校验验证码 + int typeCode = NoticeEnum.SMS_LOGIN_CODE.getCode(); + Object smsCode = RedisUtils.get(GlobalConfig.redisSmsCode+typeCode+":"+mobile); + if (StringUtils.isNull(smsCode) || !smsCode.toString().equals(code)) { + throw new OperateException("验证码错误!"); + } + + // 删除验证码 + RedisUtils.del(GlobalConfig.redisSmsCode+typeCode+":"+mobile); + + // 查询手机号 + User user = userMapper.selectOne(new QueryWrapper() + .select("id,username,mobile,is_disable") + .eq("mobile", mobile) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(user, "账号不存在!"); + Assert.isFalse(user.getIsDisable() != 0, "账号已禁用!"); + + // 更新登录信息 + user.setLastLoginIp(IpUtils.getHostIp()); + user.setLastLoginTime(System.currentTimeMillis() / 1000); + userMapper.updateById(user); + + return this.makeLoginToken(user.getId(), user.getMobile()); + } + /** * 微信小程序登录 * @@ -166,111 +240,13 @@ public class LoginServiceImpl implements ILoginService { userMapper.updateById(user); } - String token = ToolsUtils.makeToken(); - int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time")); - RedisUtils.set(FrontConfig.frontendTokenKey+token, userId, tokenValidTime); - LoginTokenVo vo = new LoginTokenVo(); - vo.setId(userId); - vo.setIsBindMobile(!user.getMobile().equals("")); - vo.setToken(token); - return vo; + return this.makeLoginToken(userId, user.getMobile()); } catch (WxErrorException e) { throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); } } - /** - * 手机号登录 - * - * @author fzr - * @param params 参数 - * @return LoginTokenVo - */ - @Override - public LoginTokenVo mobileLogin(Map params) { - Assert.notNull(params.get("mobile"), "mobile参数缺失!"); - Assert.notNull(params.get("code"), "code参数缺失!"); - String mobile = params.get("mobile"); - String code = params.get("code").toLowerCase(); - - // 校验验证码 - int typeCode = NoticeEnum.SMS_LOGIN_CODE.getCode(); - Object smsCode = RedisUtils.get(GlobalConfig.redisSmsCode+typeCode+":"+mobile); - if (StringUtils.isNull(smsCode) || !smsCode.toString().equals(code)) { - throw new OperateException("验证码错误!"); - } - - // 删除验证码 - RedisUtils.del(GlobalConfig.redisSmsCode+typeCode+":"+mobile); - - // 查询手机号 - User user = userMapper.selectOne(new QueryWrapper() - .select("id,username,mobile,is_disable") - .eq("mobile", mobile) - .eq("is_delete", 0) - .last("limit 1")); - - Assert.notNull(user, "账号不存在!"); - Assert.isFalse(user.getIsDisable() != 0, "账号已禁用!"); - - // 更新登录信息 - user.setLastLoginIp(IpUtils.getHostIp()); - user.setLastLoginTime(System.currentTimeMillis() / 1000); - userMapper.updateById(user); - - String token = ToolsUtils.makeToken(); - int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time")); - RedisUtils.set(FrontConfig.frontendTokenKey+token, user.getId(), tokenValidTime); - - LoginTokenVo vo = new LoginTokenVo(); - vo.setId(user.getId()); - vo.setIsBindMobile(!user.getMobile().equals("")); - vo.setToken(token); - return vo; - } - - /** - * 账号登录 - * - * @author fzr - * @param params 参数 - * @return LoginTokenVo - */ - @Override - public LoginTokenVo accountLogin(Map params) { - 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() - .select("id,username,password,salt,mobile,is_disable") - .eq("username", username) - .eq("is_delete", 0) - .last("limit 1")); - - Assert.notNull(user, "账号不存在!"); - String pwd = ToolsUtils.makeMd5(password+user.getSalt()); - Assert.isFalse(!pwd.equals(user.getPassword()), "账号或密码错误!"); - Assert.isFalse(user.getIsDisable() != 0, "账号已被禁用!"); - - // 更新登录信息 - user.setLastLoginIp(IpUtils.getHostIp()); - user.setLastLoginTime(System.currentTimeMillis() / 1000); - userMapper.updateById(user); - - String token = ToolsUtils.makeToken(); - int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time"))+1; - RedisUtils.set(FrontConfig.frontendTokenKey+token, user.getId(), tokenValidTime-1); - - LoginTokenVo vo = new LoginTokenVo(); - vo.setId(user.getId()); - vo.setIsBindMobile(!user.getMobile().equals("")); - vo.setToken(token); - return vo; - } - /** * 公众号登录 * @@ -345,15 +321,7 @@ public class LoginServiceImpl implements ILoginService { userMapper.updateById(user); } - String token = ToolsUtils.makeToken(); - int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time"))+1; - RedisUtils.set(FrontConfig.frontendTokenKey+token, userId, tokenValidTime-1); - - LoginTokenVo vo = new LoginTokenVo(); - vo.setId(user.getId()); - vo.setIsBindMobile(!user.getMobile().equals("")); - vo.setToken(token); - return vo; + return this.makeLoginToken(userId, user.getMobile()); } catch (WxErrorException e) { throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); } @@ -418,6 +386,13 @@ public class LoginServiceImpl implements ILoginService { userMapper.updateById(user); } + /** + * 扫码链接 + * + * @author fzr + * @param session session + * @return String + */ @Override public String getScanCode(HttpSession session) { // 获取AppId @@ -448,6 +423,26 @@ public class LoginServiceImpl implements ILoginService { return String.format(baseUrl, appId, redirectUrl, state); } + /** + * 生成登录Token + * + * @author fzr + * @param userId 用户ID + * @param mobile 用户手机 + * @return LoginTokenVo + */ + private LoginTokenVo makeLoginToken(Integer userId, String mobile) { + String token = ToolsUtils.makeToken(); + int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time")); + RedisUtils.set(FrontConfig.frontendTokenKey+token, userId, tokenValidTime); + + LoginTokenVo vo = new LoginTokenVo(); + vo.setId(userId); + vo.setIsBindMobile(!mobile.equals("")); + vo.setToken(token); + return vo; + } + /** * 生成用户编号 *