From cacc3a0926fcf9dbbc2320d919dae649b292890c Mon Sep 17 00:00:00 2001 From: BanTanger <1290288968@qq.com> Date: Sat, 4 Nov 2023 15:08:55 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20(demo)=20=E6=9B=B4=E6=96=B0=20githu?= =?UTF-8?q?b=20=E7=AC=AC=E4=B8=89=E6=96=B9=20Oauth=20=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 +- docker/mysql/conf/my.cnf | 6 +- docker/mysql/db/register_login_demo.sql | 13 +++ im-design-demo/im-register-login-demo/pom.xml | 20 ++++ .../com/bantanger/im/design/Application.java | 17 ++++ .../bantanger/im/design/adapter/Login3rd.md | 42 +++++++++ .../bantanger/im/design/adapter/adapter.md | 63 +++++++++++++ .../com/bantanger/im/design/adapter/img.png | Bin 0 -> 91470 bytes .../adapter/service/Login3rdAdapter.java | 86 ++++++++++++++++++ .../adapter/service/Login3rdTarget.java | 28 ++++++ .../design/adapter/utils/HttpClientUtils.java | 41 +++++++++ .../common/respository/UserRepository.java | 48 ++++++++++ .../common/respository/dao/UserEntity.java | 35 +++++++ .../mapper/UserRegisterLoginMapper.java | 14 +++ .../im/design/common/service/UserService.java | 57 ++++++++++++ .../ordinary/controller/UserController.java | 47 ++++++++++ .../src/main/resources/application.yml | 73 +++++++++++++++ .../src/main/resources/logback-spring.xml | 54 +++++++++++ .../main/resources/register_login_demo.sql | 13 +++ .../src/main/resources/static/img.png | Bin 0 -> 62881 bytes im-design-demo/pom.xml | 86 ++++++++++++++++++ pom.xml | 9 +- 22 files changed, 749 insertions(+), 5 deletions(-) create mode 100644 docker/mysql/db/register_login_demo.sql create mode 100644 im-design-demo/im-register-login-demo/pom.xml create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/Application.java create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/adapter.md create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/img.png create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdTarget.java create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/UserRepository.java create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/dao/UserEntity.java create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/mapper/UserRegisterLoginMapper.java create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java create mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/ordinary/controller/UserController.java create mode 100644 im-design-demo/im-register-login-demo/src/main/resources/application.yml create mode 100644 im-design-demo/im-register-login-demo/src/main/resources/logback-spring.xml create mode 100644 im-design-demo/im-register-login-demo/src/main/resources/register_login_demo.sql create mode 100644 im-design-demo/im-register-login-demo/src/main/resources/static/img.png create mode 100644 im-design-demo/pom.xml diff --git a/docker-compose.yml b/docker-compose.yml index b8c3b4b..d6625ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,7 +24,7 @@ services: timeout: 5s retries: 3 ports: - - "3306:3306" + - "13306:3306" networks: - im-network diff --git a/docker/mysql/conf/my.cnf b/docker/mysql/conf/my.cnf index 7b363b6..67e7a42 100644 --- a/docker/mysql/conf/my.cnf +++ b/docker/mysql/conf/my.cnf @@ -1,6 +1,6 @@ [mysqld] -# 设置3306端口 -port=3306 +# 设置13306端口 +port=13306 # 设置mysql的安装目录 basedir=/usr/local/mysql @@ -47,5 +47,5 @@ default-character-set=utf8mb4 [client] # 设置mysql客户端连接服务端时默认使用的端口 -port=3306 +port=13306 default-character-set=utf8mb4 \ No newline at end of file diff --git a/docker/mysql/db/register_login_demo.sql b/docker/mysql/db/register_login_demo.sql new file mode 100644 index 0000000..1052a08 --- /dev/null +++ b/docker/mysql/db/register_login_demo.sql @@ -0,0 +1,13 @@ +CREATE DATABASE IF NOT EXISTS im_register_login_demo; +USE im_register_login_demo; + +CREATE TABLE user ( + id BIGINT AUTO_INCREMENT + PRIMARY KEY, + username VARCHAR(64), + password VARCHAR(64), + create_time DATE, + user_email VARCHAR(64) +); + +INSERT INTO user (id, username, password, create_time, user_email) VALUES ('10001', 'admin', 'admin', now(), 'admin@edu.com') \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/pom.xml b/im-design-demo/im-register-login-demo/pom.xml new file mode 100644 index 0000000..143036e --- /dev/null +++ b/im-design-demo/im-register-login-demo/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + + im-design-demo + com.bantanger + 1.0-SNAPSHOT + + + im-register-login-demo + + 1.8 + + + im-register-login-demo + + \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/Application.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/Application.java new file mode 100644 index 0000000..67be2b9 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/Application.java @@ -0,0 +1,17 @@ +package com.bantanger.im.design; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 8:39 + */ +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md new file mode 100644 index 0000000..fa031c5 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md @@ -0,0 +1,42 @@ +# 第三方登录的实现 + +参考这篇文章: + +[官方文档](https://docs.github.com/zh/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) + +[github第三方登录超详细流程及分析(小白笔记)](https://blog.csdn.net/qq_43516238/article/details/105884926) + +[GitHub OAuth 第三方登录示例教程 - 阮一峰的网络日志](https://ruanyifeng.com/blog/2019/04/github-oauth.html) + +```yml +client_id: cf00a9382ce8110c2a70 +client_secret: fd348b2050f64c7a99c07294b390a5adfaa21e8c +redirect_uri: http://localhost:21001/github +``` + +导入依赖 +```xml + + org.springframework.boot + spring-boot-starter-oauth2-client + +``` + +yml 配置 +```yml +spring: + security: + oauth2: + client: + registration: + github: + clientId: **************** + clientSecret: **************** +``` + +![img.png](../../../../../../resources/static/img.png) + +权限访问: https://github.com/login/oauth/authorize?client_id=cf00a9382ce8110c2a70&redirect_uri=http://localhost:21001/github&state=GITHUB + +可能会出现超时的情况 +![img.png](img.png) \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/adapter.md b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/adapter.md new file mode 100644 index 0000000..5b5a150 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/adapter.md @@ -0,0 +1,63 @@ +# 适配器模式(Adapter)说明 + +适配器:意在将一个类的接口适配成用户所需的接口,它能帮助不兼容的接口变得兼容,宏观做法是将用户自定义的接口包裹在想要适配的接口里,就好比苹果的数据线.. + +适配器模式有三个角色 + ++ Target: 目标角色, 在 im-register-login-demo#adapter#Login3rdTarget, 是暴露给用户的接口, 根据设计模式六大原则之迪米特法则,一个类最好只暴露实现方法,而不暴露具体细节 ++ Adaptee: 被适配角色, 在 im-register-login-demo#adapter#UserService,适配器将继承 UserService 类以达到扩展新功能而不改动原有类的需求,这是设计模式六大原则的开闭原则,即对修改关闭,对扩展开放 ++ Adapter: 适配器角色, 在 im-register-login-demo#adapter#Login3rdAdapter,他将扩展出第三方登陆的核心逻辑方法,并且还具有 UserService 已实现的查询数据库是否有账号和注册逻辑 + +适配器根据适配的对象不同,可分为对象适配器和类适配器 ++ 前者适配器关联一个包裹它的类实例 ++ 后者适配器继承被适配的类对象(一般采用这种方式) + +对象适配器的一种实现方式: + +```java +@Component +public class Login3rdAdapter { + @Resource + private UserService userService; + // ... +} +``` + +类适配器的一种实现方式: + +```java +@Component +public class Login3rdAdapter extends UserService { + +} +``` + +Target 是接口,自然需要子类真正实现,在这里子类自然是 Adapter +不难写出这样的代码 + +```java +public class Login3rdAdapter extends UserService implements Login3rdTarget { + + public Login3rdAdapter(UserRepository userRepository) { + super(userRepository); + } + + @Override + public String loginByGithub(String code, String state) { + return null; + } + + @Override + public String loginByWechat() { + return null; + } + + @Override + public String loginByQQ() { + return null; + } +} +``` ++ 继承 UserService,以实现不侵入原有方法前提下进行第三方登录的扩展 + + diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/img.png b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/img.png new file mode 100644 index 0000000000000000000000000000000000000000..b186b7183119b59bff89b4c1875c4232529dfce4 GIT binary patch literal 91470 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�*I&R!~+}mr*AQVM-(2B0Gx#`+@km(_694E=1 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 literal 0 HcmV?d00001 diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java new file mode 100644 index 0000000..9c290e3 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java @@ -0,0 +1,86 @@ +package com.bantanger.im.design.adapter.service; + +import com.alibaba.fastjson.JSONObject; +import com.bantanger.im.design.adapter.utils.HttpClientUtils; +import com.bantanger.im.design.common.respository.UserRepository; +import com.bantanger.im.design.common.respository.dao.UserEntity; +import com.bantanger.im.design.common.service.UserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 10:58 + */ +@Slf4j +@Component +public class Login3rdAdapter extends UserService implements Login3rdTarget { + + @Value("${github.state:}") + private String githubState; + + @Value("${github.token_url:}") + private String githubTokenUrl; + + @Value("${github.user_url:}") + private String githubUserUrl; + + @Value("${github.user_prefix:}") + private String githubUserPrefix; + + public Login3rdAdapter(UserRepository userRepository) { + super(userRepository); + } + + @Override + public String loginByGithub(String code, String state) { + // github 回调该接口会携带 state, 防止跨站请求伪造攻击 + if (!githubState.equals(state)) { + log.warn("github 回调地址 state 不一致, 期望: {}, 实际: {}", githubState, state); + throw new UnsupportedOperationException("不是预期 state!"); + } + // 请求 Github 平台获取 Token,并携带 code + String tokenUrl = githubTokenUrl.concat(code); + JSONObject tokenResponse = HttpClientUtils.execute(tokenUrl, HttpMethod.GET); + // 请求用户信息,携带 token + String token = String.valueOf(tokenResponse.get("access_token")); + String userUrl = githubUserUrl.concat(token); + JSONObject userInfoResponse = HttpClientUtils.execute(userUrl, HttpMethod.GET); + + // 获取用户信息,username 加上 GITHUB@ 前缀,密码与 username 一致,这里就不加密了 + String username = githubUserPrefix.concat(String.valueOf(userInfoResponse.get("name"))); + String password = username; + + return autoRegister3rdAndLogin(username, password); + } + + private String autoRegister3rdAndLogin(String username, String password) { + //如果第三方账号已经登录过,则直接登录 + if(super.checkUserExists(username)) { + return super.login(username, password); + } + UserEntity userEntity = new UserEntity(); + userEntity.setUserName(username); + userEntity.setPassword(password); + userEntity.setCreateTime(new Date()); + + //如果第三方账号是第一次登录,先进行“自动注册” + super.register(userEntity); + //自动注册完成后,进行登录 + return super.login(username, password); + } + + @Override + public String loginByWechat() { + return null; + } + + @Override + public String loginByQQ() { + return null; + } +} diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdTarget.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdTarget.java new file mode 100644 index 0000000..b43b165 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdTarget.java @@ -0,0 +1,28 @@ +package com.bantanger.im.design.adapter.service; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 10:59 + */ +public interface Login3rdTarget { + + /** + * github oauth2 方式登录 + * @param code + * @param state + * @return + */ + String loginByGithub(String code, String state); + + /** + * 微信方式登录 + * @return + */ + String loginByWechat(); + + /** + * QQ 方式登录(还可以继续分:扫码,oauth2 登录方式) + * @return + */ + String loginByQQ(); +} diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java new file mode 100644 index 0000000..a0e64a3 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java @@ -0,0 +1,41 @@ +package com.bantanger.im.design.adapter.utils; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.http.HttpMethod; + +import java.util.Objects; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 12:03 + */ +@Slf4j +public class HttpClientUtils { + public static JSONObject execute(String url, HttpMethod httpMethod) { + HttpRequestBase http = null; + try { + HttpClient client = HttpClients.createDefault(); + if (httpMethod == HttpMethod.GET) { + http = new HttpGet(url); + } else if (httpMethod == HttpMethod.POST) { + http = new HttpPost(url); + } + HttpEntity entity = client.execute(http).getEntity(); + String accessToken = EntityUtils.toString(entity); + return JSONObject.parseObject(accessToken); + } catch (Exception e) { + log.error("请求失败,url 为: {}, 错误信息为 {}", url, e.getMessage()); + throw new RuntimeException("请求失败!" + e.getMessage()); + } finally { + http.releaseConnection(); + } + } +} diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/UserRepository.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/UserRepository.java new file mode 100644 index 0000000..9a72689 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/UserRepository.java @@ -0,0 +1,48 @@ +package com.bantanger.im.design.common.respository; + +import com.bantanger.im.design.common.respository.dao.UserEntity; +import com.bantanger.im.design.common.respository.mapper.UserRegisterLoginMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:44 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class UserRepository { + + private final UserRegisterLoginMapper userRegisterLoginMapper; + + public UserEntity findAccountByUserNameAndPassword(String username, String password) { + Map queryMap = new HashMap<>(); + queryMap.put("username", username); + queryMap.put("password", password); + List userEntities = userRegisterLoginMapper.selectByMap(queryMap); + if (userEntities == null || userEntities.size() == 0) { + return null; + } + return userEntities.get(0); + } + + public UserEntity findAccountByUserName(String username) { + Map queryMap = new HashMap<>(); + queryMap.put("username", username); + List userEntities = userRegisterLoginMapper.selectByMap(queryMap); + if (userEntities == null || userEntities.size() == 0) { + return null; + } + return userEntities.get(0); + } + + public int createAccount(UserEntity userEntity) { + return userRegisterLoginMapper.insert(userEntity); + } +} diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/dao/UserEntity.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/dao/UserEntity.java new file mode 100644 index 0000000..baea502 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/dao/UserEntity.java @@ -0,0 +1,35 @@ +package com.bantanger.im.design.common.respository.dao; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:47 + */ +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@TableName("user") +public class UserEntity { + + @TableId("id") + private String userId; + + @NonNull + @TableField("username") + private String userName; + + @NonNull + private String password; + + private Date createTime; + + private String userEmail; + +} diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/mapper/UserRegisterLoginMapper.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/mapper/UserRegisterLoginMapper.java new file mode 100644 index 0000000..55148d9 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/mapper/UserRegisterLoginMapper.java @@ -0,0 +1,14 @@ +package com.bantanger.im.design.common.respository.mapper; + +import com.bantanger.im.design.common.respository.dao.UserEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:46 + */ +@Mapper +public interface UserRegisterLoginMapper extends BaseMapper { + +} diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java new file mode 100644 index 0000000..d4afd53 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java @@ -0,0 +1,57 @@ +package com.bantanger.im.design.common.service; + +import com.bantanger.im.design.common.respository.UserRepository; +import com.bantanger.im.design.common.respository.dao.UserEntity; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:45 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class UserService { + + private final UserRepository userRepository; + + public String login(String username, String password) { + UserEntity user = userRepository.findAccountByUserNameAndPassword(username, password); + if (user == null) { + log.warn("账号密码错误, 您输入的账号为 {} ", username); + return "Login Fail"; + } + log.info("用户 {} 登录成功", username); + return "Login Success"; + } + + public String register(UserEntity userEntity) { + if (checkUserExists(userEntity.getUserName())) { + log.info("{} 用户已存在", userEntity.getUserName()); + throw new RuntimeException("用户已存在"); + } + userEntity.setCreateTime(new Date()); + int row = userRepository.createAccount(userEntity); + if (row <= 0) { + log.error("创建用户失败"); + } + log.info("用户 {} 创建成功", userEntity.getUserName()); + return "Register Success"; + } + + public boolean checkUserExists(String username) { + UserEntity user = userRepository.findAccountByUserName(username); + if (user == null) { + log.warn("不存在 {} 用户,请注册", username); + log.info("重定向到 index 页面进行注册逻辑 ..."); + return false; + } + log.info("用户 {} 存在", username); + return true; + } +} + diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/ordinary/controller/UserController.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/ordinary/controller/UserController.java new file mode 100644 index 0000000..ef399d7 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/ordinary/controller/UserController.java @@ -0,0 +1,47 @@ +package com.bantanger.im.design.ordinary.controller; + +import com.bantanger.im.design.adapter.service.Login3rdAdapter; +import com.bantanger.im.design.common.respository.dao.UserEntity; +import com.bantanger.im.design.common.service.UserService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:23 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +// @RequestMapping("/ordinary/v1") +public class UserController { + + // private final UserService userService; + private final Login3rdAdapter login3rdAdapter; + + @PostMapping("/login") + public String login(String account, String password) { + if (StringUtils.isBlank(account) || StringUtils.isBlank(password)) { + log.error("账号或密码不能为空"); + return "error 500"; + } + log.info("密码加盐处理..."); + return login3rdAdapter.login(account, password); + } + + @PostMapping("/register") + public String register(@RequestBody UserEntity userEntity) { + return login3rdAdapter.register(userEntity); + } + + @GetMapping("/github") + public String login3rdByGithub(String code, String state) throws IOException { + return login3rdAdapter.loginByGithub(code, state); + } + +} + diff --git a/im-design-demo/im-register-login-demo/src/main/resources/application.yml b/im-design-demo/im-register-login-demo/src/main/resources/application.yml new file mode 100644 index 0000000..0564362 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/resources/application.yml @@ -0,0 +1,73 @@ +DATABASE: im_register_login_demo +USERNAME: root +#password: whalesharkim +PASSWORD: 123456 +IP: 127.0.0.1:3306 + +spring: +# profiles: +# active: dev + datasource: + driver-class-name: com.mysql.jdbc.Driver + password: 123456 + url: jdbc:mysql://${IP}/${DATABASE}?serverTimezone=UTC&useSSL=false&characterEncoding=UTF8&allowPublicKeyRetrieval=true + username: root + + application: + name: im-register-login-demo + +github: + state: GITHUB + user_prefix: ${github.state}@ + client_id: cf00a9382ce8110c2a70 + client_secret: fd348b2050f64c7a99c07294b390a5adfaa21e8c + callback: http://localhost:21001/github # github 回调 callback 会携带 code 参数 + token_url: https://github.com/login/oauth/access_token?client_id=${github.client_id}&client_secret=${github.client_secret}&redirect_uri=${github.callback}&code= # 拼接 code + user_url: https://api.github.com/user?access_token= + +server: + port: 21001 + tomcat: + basedir: ./ + accesslog: + buffered: false + directory: logs + enabled: true + file-date-format: .yyyy-MM-dd + pattern: '%h %l %u %t "%r" %s"%{Referer}i" "%{User-Agent}i" %D %{x-request-id}r %{user-id}r %{resource-id}r' + prefix: access_log + rename-on-rotate: true + request-attributes-enabled: false + rotate: true + suffix: .log + +# logger 配置 +logging: + level: + root: info + com: + bantanger: + im: + design: debug + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + mapper-locations: classpath*:mapper/*.xml + global-config: + db-config: + update-strategy: NOT_EMPTY + type-aliases-package: com.bantanger.im.design + +#mybatis: +# configuration: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +# 配置全局 httpClient 设置 +httpclient: + maxTotal: 100 + defaultMaxPerRoute: 50 + connectTimeout: 2000 + connectionRequestTimeout: 2000 + socketTimeout: 5000 + staleConnectionCheckEnabled: true diff --git a/im-design-demo/im-register-login-demo/src/main/resources/logback-spring.xml b/im-design-demo/im-register-login-demo/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..234d177 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/resources/logback-spring.xml @@ -0,0 +1,54 @@ + + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS Z}] [%X{XRequestId}] [%thread] [%level] [%logger{50}] [%msg]%n + + + + + + + + + + + ERROR + DENY + ACCEPT + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS Z}] [%X{XRequestId}] [%thread] [%level] [%logger{50}] [%msg]%n + + + + + + ./../logs/info_register_login_demo.%d.log + + + + + ERROR + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS Z}] [%X{XRequestId}] [%thread] [%level] [%logger{50}] [%msg]%n + + + + + + ./../logs/error_register_login_demo.%d.log + + + + + + + + \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/src/main/resources/register_login_demo.sql b/im-design-demo/im-register-login-demo/src/main/resources/register_login_demo.sql new file mode 100644 index 0000000..1052a08 --- /dev/null +++ b/im-design-demo/im-register-login-demo/src/main/resources/register_login_demo.sql @@ -0,0 +1,13 @@ +CREATE DATABASE IF NOT EXISTS im_register_login_demo; +USE im_register_login_demo; + +CREATE TABLE user ( + id BIGINT AUTO_INCREMENT + PRIMARY KEY, + username VARCHAR(64), + password VARCHAR(64), + create_time DATE, + user_email VARCHAR(64) +); + +INSERT INTO user (id, username, password, create_time, user_email) VALUES ('10001', 'admin', 'admin', now(), 'admin@edu.com') \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/src/main/resources/static/img.png b/im-design-demo/im-register-login-demo/src/main/resources/static/img.png new file mode 100644 index 0000000000000000000000000000000000000000..e5071879509c98af988a13fcdab43157689598ed GIT binary patch literal 62881 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 z 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 Q4dA8rRQt&nMT@Zi0izZ^3;+NC literal 0 HcmV?d00001 diff --git a/im-design-demo/pom.xml b/im-design-demo/pom.xml new file mode 100644 index 0000000..a17c516 --- /dev/null +++ b/im-design-demo/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + + im-whale-shark + com.bantanger + 1.0-SNAPSHOT + + + im-design-demo + + 1.8 + + + im-design-demo + pom + + + im-register-login-demo + + + + + + org.springframework.boot + spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.projectlombok + lombok + + + + + com.alibaba + fastjson + 2.0.32 + + + + + org.apache.httpcomponents + httpclient + + + + + org.springframework.boot + spring-boot-starter-jdbc + 2.2.1.RELEASE + + + + + mysql + mysql-connector-java + runtime + 5.1.34 + + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.2 + + + com.github.jeffreyning + mybatisplus-plus + 1.5.1-RELEASE + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 72e097d..c425ef8 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ im-message-store im-infrastructure im-tcp + im-design-demo @@ -34,11 +35,17 @@ lombok 1.18.24 + + + org.apache.httpcomponents + httpclient + 4.5.6 + com.alibaba fastjson - 1.2.51 + 1.2.80 From 73130affa8ac3f4685c35402bd4ab08ad5bec9ec Mon Sep 17 00:00:00 2001 From: BanTanger <1290288968@qq.com> Date: Sat, 4 Nov 2023 16:08:28 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20github=20?= =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=20Oauth=20=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=EF=BC=88demo=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bantanger/im/design/adapter/Login3rd.md | 3 ++- .../adapter/service/Login3rdAdapter.java | 9 ++++--- .../design/adapter/utils/HttpClientUtils.java | 24 +++++++++++++++---- .../im/design/common/service/UserService.java | 4 ++-- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md index fa031c5..64565df 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md @@ -36,7 +36,8 @@ spring: ![img.png](../../../../../../resources/static/img.png) -权限访问: https://github.com/login/oauth/authorize?client_id=cf00a9382ce8110c2a70&redirect_uri=http://localhost:21001/github&state=GITHUB +权限访问: +https://github.com/login/oauth/authorize?client_id=cf00a9382ce8110c2a70&redirect_uri=http://localhost:21001/github&state=GITHUB 可能会出现超时的情况 ![img.png](img.png) \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java index 9c290e3..3c462aa 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java @@ -45,14 +45,13 @@ public String loginByGithub(String code, String state) { } // 请求 Github 平台获取 Token,并携带 code String tokenUrl = githubTokenUrl.concat(code); - JSONObject tokenResponse = HttpClientUtils.execute(tokenUrl, HttpMethod.GET); + String tokenResponse = HttpClientUtils.execute2(tokenUrl, HttpMethod.GET); // 请求用户信息,携带 token - String token = String.valueOf(tokenResponse.get("access_token")); - String userUrl = githubUserUrl.concat(token); - JSONObject userInfoResponse = HttpClientUtils.execute(userUrl, HttpMethod.GET); + String token = tokenResponse.substring(tokenResponse.indexOf("=") + 1); + String userInfoResponse = HttpClientUtils.execute(githubUserUrl, token); // 获取用户信息,username 加上 GITHUB@ 前缀,密码与 username 一致,这里就不加密了 - String username = githubUserPrefix.concat(String.valueOf(userInfoResponse.get("name"))); + String username = githubUserPrefix.concat(userInfoResponse); String password = username; return autoRegister3rdAndLogin(username, password); diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java index a0e64a3..fff0fe0 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java @@ -11,15 +11,30 @@ import org.apache.http.util.EntityUtils; import org.springframework.http.HttpMethod; -import java.util.Objects; - /** * @author BanTanger 半糖 * @Date 2023/11/4 12:03 */ @Slf4j public class HttpClientUtils { - public static JSONObject execute(String url, HttpMethod httpMethod) { + public static String execute(String url, String accessToken) { + HttpRequestBase http = null; + try { + HttpClient client = HttpClients.createDefault(); + http = new HttpGet(url); + http.addHeader("Authorization", "token " + accessToken); + + HttpEntity entity = client.execute(http).getEntity(); + return EntityUtils.toString(entity); + } catch (Exception e) { + log.error("请求失败,url 为: {}, 错误信息为 {}", url, e.getMessage()); + throw new RuntimeException("请求失败!" + e.getMessage()); + } finally { + http.releaseConnection(); + } + } + + public static String execute2(String url, HttpMethod httpMethod) { HttpRequestBase http = null; try { HttpClient client = HttpClients.createDefault(); @@ -30,7 +45,8 @@ public static JSONObject execute(String url, HttpMethod httpMethod) { } HttpEntity entity = client.execute(http).getEntity(); String accessToken = EntityUtils.toString(entity); - return JSONObject.parseObject(accessToken); + accessToken = accessToken.substring(0, accessToken.indexOf("&")); + return accessToken; } catch (Exception e) { log.error("请求失败,url 为: {}, 错误信息为 {}", url, e.getMessage()); throw new RuntimeException("请求失败!" + e.getMessage()); diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java index d4afd53..e67417a 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java +++ b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java @@ -26,7 +26,7 @@ public String login(String username, String password) { return "Login Fail"; } log.info("用户 {} 登录成功", username); - return "Login Success"; + return "Login Success, username: " + username; } public String register(UserEntity userEntity) { @@ -40,7 +40,7 @@ public String register(UserEntity userEntity) { log.error("创建用户失败"); } log.info("用户 {} 创建成功", userEntity.getUserName()); - return "Register Success"; + return "Register Success, username: " + userEntity.getUserName(); } public boolean checkUserExists(String username) { From 42ec697434d2c24f65c4ec8980fb9345c9c3011b Mon Sep 17 00:00:00 2001 From: BanTanger <1290288968@qq.com> Date: Sat, 4 Nov 2023 22:59:23 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E4=BB=A5=E6=A1=A5=E6=8E=A5?= =?UTF-8?q?=E5=92=8C=E9=80=82=E9=85=8D=E5=99=A8=E4=B8=A4=E7=A7=8D=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E5=AE=9E=E7=8E=B0=E7=AC=AC=E4=B8=89=E6=96=B9=20Oauth(?= =?UTF-8?q?github)=20=E7=99=BB=E5=BD=95=20[demo]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 +++---- .../design/design_pattern}/adapter.md | 0 assert/design/design_pattern/login3rd.md | 61 ++++++++++++ assert/design/{ => photo}/IM-WhaleShark.png | Bin ...7\350\241\214\346\265\201\347\250\213.png" | Bin ...7\350\203\275\346\265\213\350\257\225.png" | Bin ...7\350\203\275\350\256\262\350\247\243.png" | Bin ...44\270\212\344\270\213\350\241\214ACK.png" | Bin ...6\346\210\221\350\201\224\347\263\273.png" | Bin .../\345\206\231\346\211\251\346\225\243.png" | Bin ...7\350\267\257\347\224\261\345\261\202.png" | Bin ...0\346\201\257\347\241\256\350\256\244.png" | Bin ...4\346\255\245\346\224\271\350\277\233.png" | Bin ...5\347\232\204\345\274\212\347\253\257.png" | Bin ...3\346\236\204\346\233\264\345\217\230.png" | Bin ...0\346\200\247\344\274\240\350\276\276.png" | Bin ...1\346\200\247\344\277\235\350\257\201.png" | Bin ...4\350\260\203\350\256\276\350\256\241.png" | Bin ...6\346\236\204\350\256\276\350\256\241.png" | Bin ...0\346\201\257\346\265\201\350\275\254.png" | Bin ...0\345\210\266\351\207\215\345\217\221.png" | Bin ...0\346\201\257\347\241\256\350\256\244.png" | Bin ...4\346\255\245\346\265\201\347\250\213.png" | Bin .../\350\257\273\346\211\251\346\225\243.png" | Bin .../sql}/register_login_demo.sql | 0 .../assert/adapter.md | 63 ++++++++++++ .../assert}/img.png | Bin .../assert/login3rd.md | 52 ++++++++++ .../assert/success.png | Bin 0 -> 27030 bytes .../assert/timeout.png} | Bin ...234\211github\350\264\246\345\217\267.png" | Bin 0 -> 15014 bytes .../login-design-adapter-demo/pom.xml | 19 ++++ .../design/adapter}/Application.java | 2 +- .../adapter}/controller/UserController.java | 17 ++-- .../adapter}/respository/UserRepository.java | 6 +- .../adapter}/respository/dao/UserEntity.java | 2 +- .../mapper/UserRegisterLoginMapper.java | 4 +- .../adapter/service/Login3rdAdapter.java | 22 +++-- .../adapter/service/Login3rdTarget.java | 2 +- .../design/adapter}/service/UserService.java | 6 +- .../design/adapter/utils/HttpClientUtils.java | 57 +++++++++++ .../src/main/resources/application.yml | 12 ++- .../src/main/resources/logback-spring.xml | 0 .../main/resources/register_login_demo.sql | 13 +++ .../login-design-bridge-demo/assert/bridge.md | 57 +++++++++++ .../login-design-bridge-demo/assert/img.png | Bin 0 -> 87385 bytes .../login-design-bridge-demo/pom.xml | 19 ++++ .../bantanger/design/bridge/Application.java | 19 ++++ .../abst/AbstractRegisterLoginComponent.java | 25 +++++ .../bridge/abst/RegisterLoginComponent.java | 38 ++++++++ .../RegisterLoginComponentFactory.java | 42 ++++++++ .../function/AbstractRegisterLoginFunc.java | 82 ++++++++++++++++ .../function/RegisterLoginByDefault.java | 43 ++++++++ .../function/RegisterLoginByGithub.java | 92 ++++++++++++++++++ .../bridge/function/RegisterLoginFunc.java | 42 ++++++++ .../bridge/controller/UserController.java | 46 +++++++++ .../bridge/respository/UserRepository.java | 48 +++++++++ .../bridge/respository/dao/UserEntity.java | 35 +++++++ .../mapper/UserRegisterLoginMapper.java | 14 +++ .../bridge/service/UserBridgeService.java | 34 +++++++ .../design/bridge}/utils/HttpClientUtils.java | 6 +- .../src/main/resources/application.yml | 79 +++++++++++++++ .../src/main/resources/logback-spring.xml | 54 ++++++++++ .../main/resources/register_login_demo.sql | 13 +++ .../src/main/resources/static/img.png | Bin 0 -> 62881 bytes .../src/main/resources/static/success.png | Bin 0 -> 27030 bytes .../src/main/resources/static/timeout.png | Bin 0 -> 91470 bytes ...234\211github\350\264\246\345\217\267.png" | Bin 0 -> 15014 bytes .../login-ordinary-demo/logs/access_log.log | 1 + .../error_register_login_demo.2023-11-04.log | 0 .../info_register_login_demo.2023-11-04.log | 61 ++++++++++++ .../login-ordinary-demo/pom.xml | 19 ++++ .../design/ordinary/Application.java | 17 ++++ .../ordinary/controller/UserController.java | 41 ++++++++ .../ordinary/respository/UserRepository.java | 48 +++++++++ .../ordinary/respository/dao/UserEntity.java | 35 +++++++ .../mapper/UserRegisterLoginMapper.java | 14 +++ .../service/UserLogin3rdServiceImpl.java | 55 +++++++++++ .../design/ordinary/service/UserService.java | 45 +++++++++ .../ordinary/service/UserServiceImpl.java | 78 +++++++++++++++ .../src/main/resources/application.yml | 51 ++++++++++ .../src/main/resources/logback-spring.xml | 54 ++++++++++ im-design-demo/im-register-login-demo/pom.xml | 67 +++++++++++++ .../bantanger/im/design/adapter/Login3rd.md | 43 -------- im-design-demo/pom.xml | 61 ------------ 85 files changed, 1698 insertions(+), 154 deletions(-) rename {im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter => assert/design/design_pattern}/adapter.md (100%) create mode 100644 assert/design/design_pattern/login3rd.md rename assert/design/{ => photo}/IM-WhaleShark.png (100%) rename "assert/design/SDK\346\211\247\350\241\214\346\265\201\347\250\213.png" => "assert/design/photo/SDK\346\211\247\350\241\214\346\265\201\347\250\213.png" (100%) rename "assert/design/websocket\345\212\237\350\203\275\346\265\213\350\257\225.png" => "assert/design/photo/websocket\345\212\237\350\203\275\346\265\213\350\257\225.png" (100%) rename "assert/design/websocket\347\252\227\345\217\243\345\212\237\350\203\275\350\256\262\350\247\243.png" => "assert/design/photo/websocket\347\252\227\345\217\243\345\212\237\350\203\275\350\256\262\350\247\243.png" (100%) rename "assert/design/\344\270\212\344\270\213\350\241\214ACK.png" => "assert/design/photo/\344\270\212\344\270\213\350\241\214ACK.png" (100%) rename "assert/design/\344\270\216\346\210\221\350\201\224\347\263\273.png" => "assert/design/photo/\344\270\216\346\210\221\350\201\224\347\263\273.png" (100%) rename "assert/design/\345\206\231\346\211\251\346\225\243.png" => "assert/design/photo/\345\206\231\346\211\251\346\225\243.png" (100%) rename "assert/design/\345\210\206\345\270\203\345\274\217\350\267\257\347\224\261\345\261\202.png" => "assert/design/photo/\345\210\206\345\270\203\345\274\217\350\267\257\347\224\261\345\261\202.png" (100%) rename "assert/design/\345\234\250\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" => "assert/design/photo/\345\234\250\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" (100%) rename "assert/design/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\346\224\271\350\277\233.png" => "assert/design/photo/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\346\224\271\350\277\233.png" (100%) rename "assert/design/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\347\232\204\345\274\212\347\253\257.png" => "assert/design/photo/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\347\232\204\345\274\212\347\253\257.png" (100%) rename "assert/design/\346\225\260\346\215\256\345\272\223\347\273\223\346\236\204\346\233\264\345\217\230.png" => "assert/design/photo/\346\225\260\346\215\256\345\272\223\347\273\223\346\236\204\346\233\264\345\217\230.png" (100%) rename "assert/design/\346\234\211\344\272\206TCP\344\270\272\344\273\200\344\271\210\350\277\230\350\246\201\344\277\235\350\257\201\345\217\257\351\235\240\346\200\247\344\274\240\350\276\276.png" => "assert/design/photo/\346\234\211\344\272\206TCP\344\270\272\344\273\200\344\271\210\350\277\230\350\246\201\344\277\235\350\257\201\345\217\257\351\235\240\346\200\247\344\274\240\350\276\276.png" (100%) rename "assert/design/\346\266\210\346\201\257\345\271\202\347\255\211\346\200\247\344\277\235\350\257\201.png" => "assert/design/photo/\346\266\210\346\201\257\345\271\202\347\255\211\346\200\247\344\277\235\350\257\201.png" (100%) rename "assert/design/\346\266\210\346\201\257\346\213\211\345\217\226\345\211\215\345\220\216\347\253\257\350\201\224\350\260\203\350\256\276\350\256\241.png" => "assert/design/photo/\346\266\210\346\201\257\346\213\211\345\217\226\345\211\215\345\220\216\347\253\257\350\201\224\350\260\203\350\256\276\350\256\241.png" (100%) rename "assert/design/\346\266\210\346\201\257\346\213\211\345\217\226\346\236\266\346\236\204\350\256\276\350\256\241.png" => "assert/design/photo/\346\266\210\346\201\257\346\213\211\345\217\226\346\236\266\346\236\204\350\256\276\350\256\241.png" (100%) rename "assert/design/\346\266\210\346\201\257\346\265\201\350\275\254.png" => "assert/design/photo/\346\266\210\346\201\257\346\265\201\350\275\254.png" (100%) rename "assert/design/\347\246\201\346\255\242\345\256\242\346\210\267\347\253\257\346\227\240\351\231\220\345\210\266\351\207\215\345\217\221.png" => "assert/design/photo/\347\246\201\346\255\242\345\256\242\346\210\267\347\253\257\346\227\240\351\231\220\345\210\266\351\207\215\345\217\221.png" (100%) rename "assert/design/\347\246\273\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" => "assert/design/photo/\347\246\273\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" (100%) rename "assert/design/\347\276\244\350\201\212\346\266\210\346\201\257\345\220\214\346\255\245\346\265\201\347\250\213.png" => "assert/design/photo/\347\276\244\350\201\212\346\266\210\346\201\257\345\220\214\346\255\245\346\265\201\347\250\213.png" (100%) rename "assert/design/\350\257\273\346\211\251\346\225\243.png" => "assert/design/photo/\350\257\273\346\211\251\346\225\243.png" (100%) rename {im-design-demo/im-register-login-demo/src/main/resources => assert/sql}/register_login_demo.sql (100%) create mode 100644 im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/adapter.md rename im-design-demo/im-register-login-demo/{src/main/resources/static => login-design-adapter-demo/assert}/img.png (100%) create mode 100644 im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/login3rd.md create mode 100644 im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/success.png rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im/design/adapter/img.png => login-design-adapter-demo/assert/timeout.png} (100%) create mode 100644 "im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/\346\225\260\346\215\256\345\272\223\345\255\230\346\234\211github\350\264\246\345\217\267.png" create mode 100644 im-design-demo/im-register-login-demo/login-design-adapter-demo/pom.xml rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im/design => login-design-adapter-demo/src/main/java/com/bantanger/design/adapter}/Application.java (90%) rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im/design/ordinary => login-design-adapter-demo/src/main/java/com/bantanger/design/adapter}/controller/UserController.java (72%) rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im/design/common => login-design-adapter-demo/src/main/java/com/bantanger/design/adapter}/respository/UserRepository.java (87%) rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im/design/common => login-design-adapter-demo/src/main/java/com/bantanger/design/adapter}/respository/dao/UserEntity.java (91%) rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im/design/common => login-design-adapter-demo/src/main/java/com/bantanger/design/adapter}/respository/mapper/UserRegisterLoginMapper.java (66%) rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im => login-design-adapter-demo/src/main/java/com/bantanger}/design/adapter/service/Login3rdAdapter.java (79%) rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im => login-design-adapter-demo/src/main/java/com/bantanger}/design/adapter/service/Login3rdTarget.java (90%) rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im/design/common => login-design-adapter-demo/src/main/java/com/bantanger/design/adapter}/service/UserService.java (90%) create mode 100644 im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/utils/HttpClientUtils.java rename im-design-demo/im-register-login-demo/{ => login-design-adapter-demo}/src/main/resources/application.yml (77%) rename im-design-demo/im-register-login-demo/{ => login-design-adapter-demo}/src/main/resources/logback-spring.xml (100%) create mode 100644 im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/resources/register_login_demo.sql create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/assert/bridge.md create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/assert/img.png create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/pom.xml create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/Application.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/AbstractRegisterLoginComponent.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/RegisterLoginComponent.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/factory/RegisterLoginComponentFactory.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/AbstractRegisterLoginFunc.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginByDefault.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginByGithub.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginFunc.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/controller/UserController.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/UserRepository.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/dao/UserEntity.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/mapper/UserRegisterLoginMapper.java create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/service/UserBridgeService.java rename im-design-demo/im-register-login-demo/{src/main/java/com/bantanger/im/design/adapter => login-design-bridge-demo/src/main/java/com/bantanger/design/bridge}/utils/HttpClientUtils.java (91%) create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/application.yml create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/logback-spring.xml create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/register_login_demo.sql create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/img.png create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/success.png create mode 100644 im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/timeout.png create mode 100644 "im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/\346\225\260\346\215\256\345\272\223\345\255\230\346\234\211github\350\264\246\345\217\267.png" create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/logs/access_log.log create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/logs/error_register_login_demo.2023-11-04.log create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/logs/info_register_login_demo.2023-11-04.log create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/pom.xml create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/Application.java create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/controller/UserController.java create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/UserRepository.java create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/dao/UserEntity.java create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/mapper/UserRegisterLoginMapper.java create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserLogin3rdServiceImpl.java create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserService.java create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserServiceImpl.java create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/resources/application.yml create mode 100644 im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/resources/logback-spring.xml delete mode 100644 im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md diff --git a/README.md b/README.md index bca8a04..5826ee2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # IM-WhaleShark
-![IM-WhaleShark](assert/design/IM-WhaleShark.png) +![IM-WhaleShark](assert/design/photo/IM-WhaleShark.png) IM-WhaleShark(鲸鲨)是基于 Netty 实现的高性能分布式 IM 即时通讯系统 @@ -169,11 +169,11 @@ Docker 部署测试请访问 `localhost:19000` 浏览方式通过 F12 查看服务端发送的 `json` 格式是否正确 -![](assert/design/websocket窗口功能讲解.png) +![](assert/design/photo/websocket窗口功能讲解.png) 如图所示: 平台 [appId = 10001] 的用户 [userId = 10001, clientType = 3, imei = 200] 在登录 Login 之后向群组 [groupId = 27a35ff2f9be4cc9a8d3db1ad3322804] 通过操作指令`群发模式`[command = 2104] 发送一条群组消息 -![websocket功能测试](assert/design/websocket功能测试.png) +![websocket功能测试](assert/design/photo/websocket功能测试.png) ## 架构设计 ### 私有协议 @@ -211,7 +211,7 @@ IM 的私有协议确立信息如下: ### 消息投递过程 -![一条消息的流转](assert/design/消息流转.png) +![一条消息的流转](assert/design/photo/消息流转.png) 流程如下: 1. 客户端 userA 发送一条消息到服务器, 消息通过私有协议转化为二进制序列化, 通过 TCP 三次握手保证消息在传输层的稳定性(上下行 ACK 保证消息在应用层的稳定性 ) @@ -228,7 +228,7 @@ IM 的私有协议确立信息如下: 当然, 也可采用 TCP、UDP 连接甚至是 HTTP 短连接也行,只不过这样会需要更多的设计,需要考虑用户弱网行为,后续设计中我会添加 ### 路由层 -![分布式路由层](assert/design/分布式路由层.png) +![分布式路由层](assert/design/photo/分布式路由层.png) 由于使用了分布式, 用户的信息会因为负载均衡分布在不同的服务器上,怎么保证多 Channel 的跨节点通讯就显得额外的重要。 @@ -254,7 +254,7 @@ IM 的私有协议确立信息如下: ### 读写扩散模型 #### 写扩散 -![写扩散](assert/design/写扩散.png) +![写扩散](assert/design/photo/写扩散.png) + 在架构中, 单聊会话消息采用写扩散 写扩散优缺: @@ -272,7 +272,7 @@ IM 的私有协议确立信息如下: + 先写扩散后读,实时性差。 #### 读扩散 -![读扩散](assert/design/读扩散.png) +![读扩散](assert/design/photo/读扩散.png) + 在架构中, 群聊会话消息采用读扩散 读扩散优缺: @@ -292,21 +292,21 @@ IM 的私有协议确立信息如下: #### 多端消息同步的弊端: 由于 WhaleShark 实现了用户多端同步,因此需要保证一条消息既同步给发送方的其他端,又得保证消息能发送给目标对象的所有端。一条消息的处理流程如下: -![多端消息同步的弊端](assert/design/多端消息同步的弊端.png) +![多端消息同步的弊端](assert/design/photo/多端消息同步的弊端.png) 如架构图所演示,一条消息如图所示就裂变成三条消息了,如果说端的类型更多 (设计上是有六种端: Windows、Mac、Web、Android、IOS、WebApi) 但实际上我们基本是通过 WebApi 来接收消息, 再同步给其他端,也就需要裂变出 `5 * 5 - 1 = 24` 条消息 一口气发送如此多条消息对于服务器来说,压力是巨大的,因此我们需要重新设计一些策略来实现消息同步 #### 多端消息同步改进: -![多端消息同步改进](assert/design/多端消息同步改进.png) +![多端消息同步改进](assert/design/photo/多端消息同步改进.png) 1. 发送方 userA 发送消息给服务端 2. 服务端接收发送方的消息之后向发送方回应消息接收确认 ACK 数据包表示服务端已经成功接收消息 3. 先将消息同步给发送方其他端(在线端使用 TCP 通知投递,离线端存储最新的 1000 条数据到离线消息队列里) 4. 发送消息给接收方所有端 #### 群聊消息同步流程: -![群聊消息同步流程](assert/design/群聊消息同步流程.png) +![群聊消息同步流程](assert/design/photo/群聊消息同步流程.png) 1. 发送方 userA 发送消息给服务端 2. 服务端接收发送方的消息之后向发送方回应消息接收确认 ACK 数据包表示服务端已经成功接收消息 3. 先将消息同步给发送方其他端(在线端使用 TCP 通知投递,离线端存储最新的 1000 条数据到离线消息队列里) @@ -317,7 +317,7 @@ IM 的私有协议确立信息如下: ### 消息可靠传达模型 我们难以保证消息全都可靠传达,不会产生丢失现象,在 IM 系统中也不允许丢失一条消息。如下图: -![有了TCP为什么还要保证可靠性传达](assert/design/有了TCP为什么还要保证可靠性传达.png) +![有了TCP为什么还要保证可靠性传达](assert/design/photo/有了TCP为什么还要保证可靠性传达.png) + 在传输层,TCP的三次握手保证了双方通讯的可靠性,稳定性。简而言之,用户发送的消息, 在忽视应用层的情况下,无论如何都会从自身主机的 “发送缓冲区” 抵达对方主机的 “接收缓冲区” @@ -327,7 +327,7 @@ IM 的私有协议确立信息如下: > 如果只是单台机器进行双向通信,则不会经历传输层拆包装包的过程,而是直接将数据包通过内核拷贝到另一个进程进行通讯 在设计上,我们采用应用层两次握手(上下行 ACK)来保证消息在应用层的可靠传达 -![上下行ACK](assert/design/上下行ACK.png) +![上下行ACK](assert/design/photo/上下行ACK.png) + 上行 ACK:服务端发送给消息发送方的接收确认 ACK + 下行 ACK:目标用户发送给消息发送方的接收确认 ACK @@ -345,10 +345,10 @@ ps: 上行 ACK 也同理, 服务端的消息发送实际抵达 MQ 时有一个 RecvID, ServerID, ClientID, SendTime 做冗余避免查库提升性能 #### 在线用户消息接收 -![在线用户消息确认](assert/design/在线用户消息确认.png) +![在线用户消息确认](assert/design/photo/在线用户消息确认.png) #### 离线用户消息接收 -![离线用户消息确认](assert/design/离线用户消息确认.png) +![离线用户消息确认](assert/design/photo/离线用户消息确认.png) #### ACK 丢失现象 下面分别探讨上下行 ACK 丢失现象的处理流程 @@ -369,13 +369,13 @@ ACK 丢失现象解决策略: 由于我们 ack 中含有 msgId, 可以在客户 或者是消息到达时做一个缓存,缓存时间尽量短,缓存时间内的消息重试直接让接收方接收消息,不进行二次持久化。 -![消息幂等性保证](assert/design/消息幂等性保证.png) +![消息幂等性保证](assert/design/photo/消息幂等性保证.png) 为了避免客户端无限制重发的现象,我们可以对缓存做一个过期时间,只有在过期时间之前的缓存才能做幂等; 当超过缓存时间时, 服务端忽略重投的消息, 直到客户端计时器超时并且已经超过了最大重试次数, 才让客户端重新生成消息唯一id:messageId, 也就是重新做一个消息体 -![禁止客户端无限制重发](assert/design/禁止客户端无限制重发.png) +![禁止客户端无限制重发](assert/design/photo/禁止客户端无限制重发.png) ### 消息有序性保证 为了提高消息在服务端的处理流程(MQ消费,落库存储,ACK确认),我们在程序实现中采用了线程池技术来提高消息处理时长 @@ -412,7 +412,7 @@ ACK 丢失现象解决策略: 由于我们 ack 中含有 msgId, 可以在客户 ## 前后端对接 IM 服务采用 SDK 方式集成到前端代码。一个大致的流程演示如下: -![SDK执行流程](assert/design/SDK执行流程.png) +![SDK执行流程](assert/design/photo/SDK执行流程.png) 对此我已经大致实现了后端的一个 im-app-server 与前端的 SDK 进行对接,欢迎前端同学与我一起来完善 WhaleShark ## 联系 @@ -420,4 +420,4 @@ IM 服务采用 SDK 方式集成到前端代码。一个大致的流程演示如 欢迎与我联系交流,我拉你进交流群,微信二维码为(注明来意喔~): -![与我联系.png](assert/design/与我联系.png) +![与我联系.png](assert/design/photo/与我联系.png) diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/adapter.md b/assert/design/design_pattern/adapter.md similarity index 100% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/adapter.md rename to assert/design/design_pattern/adapter.md diff --git a/assert/design/design_pattern/login3rd.md b/assert/design/design_pattern/login3rd.md new file mode 100644 index 0000000..15c8bc1 --- /dev/null +++ b/assert/design/design_pattern/login3rd.md @@ -0,0 +1,61 @@ +# 第三方登录的实现以及使用说明 + +## 使用说明 + ++ im-design-demo/im-register-login-demo/login-design-adapter-demo ++ im-design-demo/im-register-login-demo/login-design-bridge-demo + +这两个子模块都对接了第三方登录的功能 + +体验步骤: +1. 运行项目 +2. 点击命令行里出现的蓝链 进行权限校验 + +## Github Oauth 第三方登录实现 +参考这篇文章: + +[官方文档](https://docs.github.com/zh/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) + +[github第三方登录超详细流程及分析(小白笔记)](https://blog.csdn.net/qq_43516238/article/details/105884926) + +[GitHub OAuth 第三方登录示例教程 - 阮一峰的网络日志](https://ruanyifeng.com/blog/2019/04/github-oauth.html) + +```yml +client_id: cf00a9382ce8110c2a70 +client_secret: fd348b2050f64c7a99c07294b390a5adfaa21e8c +redirect_uri: http://localhost:21001/github +``` + +yml 配置 +```yml +github: + state: GITHUB + user_prefix: ${github.state}@ + + # ========= 自己申请 client_id\secret 用完之后记得删除 ========= + client_id: cf00a9382ce8110c2a70 + client_secret: fd348b2050f64c7a99c07294b390a5adfaa21e8c + # ========================================================== + + callback: http://localhost:21001/github # github 回调 callback 会携带 code 参数 + token_url: https://github.com/login/oauth/access_token?client_id=${github.client_id}&client_secret=${github.client_secret}&redirect_uri=${github.callback}&code= # 拼接 code + user_url: https://api.github.com/user # 使用访问令牌访问 API +``` + +![img.png](../../../im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/img.png) + +权限访问: + +https://github.com/login/oauth/authorize?client_id=cf00a9382ce8110c2a70&redirect_uri=http://localhost:21001/github&state=GITHUB + +可能会出现超时的情况 + +![timeout.png](../../../im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/timeout.png) + +成功 + +![success.png](../../../im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/success.png) + +数据库存在该数据 + +![数据库存有github账号.png](../../../im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/数据库存有github账号.png) \ No newline at end of file diff --git a/assert/design/IM-WhaleShark.png b/assert/design/photo/IM-WhaleShark.png similarity index 100% rename from assert/design/IM-WhaleShark.png rename to assert/design/photo/IM-WhaleShark.png diff --git "a/assert/design/SDK\346\211\247\350\241\214\346\265\201\347\250\213.png" "b/assert/design/photo/SDK\346\211\247\350\241\214\346\265\201\347\250\213.png" similarity index 100% rename from "assert/design/SDK\346\211\247\350\241\214\346\265\201\347\250\213.png" rename to "assert/design/photo/SDK\346\211\247\350\241\214\346\265\201\347\250\213.png" diff --git "a/assert/design/websocket\345\212\237\350\203\275\346\265\213\350\257\225.png" "b/assert/design/photo/websocket\345\212\237\350\203\275\346\265\213\350\257\225.png" similarity index 100% rename from "assert/design/websocket\345\212\237\350\203\275\346\265\213\350\257\225.png" rename to "assert/design/photo/websocket\345\212\237\350\203\275\346\265\213\350\257\225.png" diff --git "a/assert/design/websocket\347\252\227\345\217\243\345\212\237\350\203\275\350\256\262\350\247\243.png" "b/assert/design/photo/websocket\347\252\227\345\217\243\345\212\237\350\203\275\350\256\262\350\247\243.png" similarity index 100% rename from "assert/design/websocket\347\252\227\345\217\243\345\212\237\350\203\275\350\256\262\350\247\243.png" rename to "assert/design/photo/websocket\347\252\227\345\217\243\345\212\237\350\203\275\350\256\262\350\247\243.png" diff --git "a/assert/design/\344\270\212\344\270\213\350\241\214ACK.png" "b/assert/design/photo/\344\270\212\344\270\213\350\241\214ACK.png" similarity index 100% rename from "assert/design/\344\270\212\344\270\213\350\241\214ACK.png" rename to "assert/design/photo/\344\270\212\344\270\213\350\241\214ACK.png" diff --git "a/assert/design/\344\270\216\346\210\221\350\201\224\347\263\273.png" "b/assert/design/photo/\344\270\216\346\210\221\350\201\224\347\263\273.png" similarity index 100% rename from "assert/design/\344\270\216\346\210\221\350\201\224\347\263\273.png" rename to "assert/design/photo/\344\270\216\346\210\221\350\201\224\347\263\273.png" diff --git "a/assert/design/\345\206\231\346\211\251\346\225\243.png" "b/assert/design/photo/\345\206\231\346\211\251\346\225\243.png" similarity index 100% rename from "assert/design/\345\206\231\346\211\251\346\225\243.png" rename to "assert/design/photo/\345\206\231\346\211\251\346\225\243.png" diff --git "a/assert/design/\345\210\206\345\270\203\345\274\217\350\267\257\347\224\261\345\261\202.png" "b/assert/design/photo/\345\210\206\345\270\203\345\274\217\350\267\257\347\224\261\345\261\202.png" similarity index 100% rename from "assert/design/\345\210\206\345\270\203\345\274\217\350\267\257\347\224\261\345\261\202.png" rename to "assert/design/photo/\345\210\206\345\270\203\345\274\217\350\267\257\347\224\261\345\261\202.png" diff --git "a/assert/design/\345\234\250\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" "b/assert/design/photo/\345\234\250\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" similarity index 100% rename from "assert/design/\345\234\250\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" rename to "assert/design/photo/\345\234\250\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" diff --git "a/assert/design/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\346\224\271\350\277\233.png" "b/assert/design/photo/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\346\224\271\350\277\233.png" similarity index 100% rename from "assert/design/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\346\224\271\350\277\233.png" rename to "assert/design/photo/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\346\224\271\350\277\233.png" diff --git "a/assert/design/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\347\232\204\345\274\212\347\253\257.png" "b/assert/design/photo/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\347\232\204\345\274\212\347\253\257.png" similarity index 100% rename from "assert/design/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\347\232\204\345\274\212\347\253\257.png" rename to "assert/design/photo/\345\244\232\347\253\257\346\266\210\346\201\257\345\220\214\346\255\245\347\232\204\345\274\212\347\253\257.png" diff --git "a/assert/design/\346\225\260\346\215\256\345\272\223\347\273\223\346\236\204\346\233\264\345\217\230.png" "b/assert/design/photo/\346\225\260\346\215\256\345\272\223\347\273\223\346\236\204\346\233\264\345\217\230.png" similarity index 100% rename from "assert/design/\346\225\260\346\215\256\345\272\223\347\273\223\346\236\204\346\233\264\345\217\230.png" rename to "assert/design/photo/\346\225\260\346\215\256\345\272\223\347\273\223\346\236\204\346\233\264\345\217\230.png" diff --git "a/assert/design/\346\234\211\344\272\206TCP\344\270\272\344\273\200\344\271\210\350\277\230\350\246\201\344\277\235\350\257\201\345\217\257\351\235\240\346\200\247\344\274\240\350\276\276.png" "b/assert/design/photo/\346\234\211\344\272\206TCP\344\270\272\344\273\200\344\271\210\350\277\230\350\246\201\344\277\235\350\257\201\345\217\257\351\235\240\346\200\247\344\274\240\350\276\276.png" similarity index 100% rename from "assert/design/\346\234\211\344\272\206TCP\344\270\272\344\273\200\344\271\210\350\277\230\350\246\201\344\277\235\350\257\201\345\217\257\351\235\240\346\200\247\344\274\240\350\276\276.png" rename to "assert/design/photo/\346\234\211\344\272\206TCP\344\270\272\344\273\200\344\271\210\350\277\230\350\246\201\344\277\235\350\257\201\345\217\257\351\235\240\346\200\247\344\274\240\350\276\276.png" diff --git "a/assert/design/\346\266\210\346\201\257\345\271\202\347\255\211\346\200\247\344\277\235\350\257\201.png" "b/assert/design/photo/\346\266\210\346\201\257\345\271\202\347\255\211\346\200\247\344\277\235\350\257\201.png" similarity index 100% rename from "assert/design/\346\266\210\346\201\257\345\271\202\347\255\211\346\200\247\344\277\235\350\257\201.png" rename to "assert/design/photo/\346\266\210\346\201\257\345\271\202\347\255\211\346\200\247\344\277\235\350\257\201.png" diff --git "a/assert/design/\346\266\210\346\201\257\346\213\211\345\217\226\345\211\215\345\220\216\347\253\257\350\201\224\350\260\203\350\256\276\350\256\241.png" "b/assert/design/photo/\346\266\210\346\201\257\346\213\211\345\217\226\345\211\215\345\220\216\347\253\257\350\201\224\350\260\203\350\256\276\350\256\241.png" similarity index 100% rename from "assert/design/\346\266\210\346\201\257\346\213\211\345\217\226\345\211\215\345\220\216\347\253\257\350\201\224\350\260\203\350\256\276\350\256\241.png" rename to "assert/design/photo/\346\266\210\346\201\257\346\213\211\345\217\226\345\211\215\345\220\216\347\253\257\350\201\224\350\260\203\350\256\276\350\256\241.png" diff --git "a/assert/design/\346\266\210\346\201\257\346\213\211\345\217\226\346\236\266\346\236\204\350\256\276\350\256\241.png" "b/assert/design/photo/\346\266\210\346\201\257\346\213\211\345\217\226\346\236\266\346\236\204\350\256\276\350\256\241.png" similarity index 100% rename from "assert/design/\346\266\210\346\201\257\346\213\211\345\217\226\346\236\266\346\236\204\350\256\276\350\256\241.png" rename to "assert/design/photo/\346\266\210\346\201\257\346\213\211\345\217\226\346\236\266\346\236\204\350\256\276\350\256\241.png" diff --git "a/assert/design/\346\266\210\346\201\257\346\265\201\350\275\254.png" "b/assert/design/photo/\346\266\210\346\201\257\346\265\201\350\275\254.png" similarity index 100% rename from "assert/design/\346\266\210\346\201\257\346\265\201\350\275\254.png" rename to "assert/design/photo/\346\266\210\346\201\257\346\265\201\350\275\254.png" diff --git "a/assert/design/\347\246\201\346\255\242\345\256\242\346\210\267\347\253\257\346\227\240\351\231\220\345\210\266\351\207\215\345\217\221.png" "b/assert/design/photo/\347\246\201\346\255\242\345\256\242\346\210\267\347\253\257\346\227\240\351\231\220\345\210\266\351\207\215\345\217\221.png" similarity index 100% rename from "assert/design/\347\246\201\346\255\242\345\256\242\346\210\267\347\253\257\346\227\240\351\231\220\345\210\266\351\207\215\345\217\221.png" rename to "assert/design/photo/\347\246\201\346\255\242\345\256\242\346\210\267\347\253\257\346\227\240\351\231\220\345\210\266\351\207\215\345\217\221.png" diff --git "a/assert/design/\347\246\273\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" "b/assert/design/photo/\347\246\273\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" similarity index 100% rename from "assert/design/\347\246\273\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" rename to "assert/design/photo/\347\246\273\347\272\277\347\224\250\346\210\267\346\266\210\346\201\257\347\241\256\350\256\244.png" diff --git "a/assert/design/\347\276\244\350\201\212\346\266\210\346\201\257\345\220\214\346\255\245\346\265\201\347\250\213.png" "b/assert/design/photo/\347\276\244\350\201\212\346\266\210\346\201\257\345\220\214\346\255\245\346\265\201\347\250\213.png" similarity index 100% rename from "assert/design/\347\276\244\350\201\212\346\266\210\346\201\257\345\220\214\346\255\245\346\265\201\347\250\213.png" rename to "assert/design/photo/\347\276\244\350\201\212\346\266\210\346\201\257\345\220\214\346\255\245\346\265\201\347\250\213.png" diff --git "a/assert/design/\350\257\273\346\211\251\346\225\243.png" "b/assert/design/photo/\350\257\273\346\211\251\346\225\243.png" similarity index 100% rename from "assert/design/\350\257\273\346\211\251\346\225\243.png" rename to "assert/design/photo/\350\257\273\346\211\251\346\225\243.png" diff --git a/im-design-demo/im-register-login-demo/src/main/resources/register_login_demo.sql b/assert/sql/register_login_demo.sql similarity index 100% rename from im-design-demo/im-register-login-demo/src/main/resources/register_login_demo.sql rename to assert/sql/register_login_demo.sql diff --git a/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/adapter.md b/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/adapter.md new file mode 100644 index 0000000..0faf495 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/adapter.md @@ -0,0 +1,63 @@ +# 适配器模式(Adapter)说明 + +适配器:意在将一个类的接口适配成用户所需的接口,它能帮助不兼容的接口变得兼容,宏观做法是将用户自定义的接口包裹在想要适配的接口里,就好比苹果的数据线.. + +适配器模式有三个角色 + ++ Target: 目标角色, 在 im-register-login-demo#adapter#Login3rdTarget, 是暴露给用户的接口, 根据设计模式六大原则之迪米特法则,一个类最好只暴露实现方法,而不暴露具体细节 ++ Adaptee: 被适配角色, 在 im-register-login-demo#adapter#UserService,适配器将继承 UserService 类以达到扩展新功能而不改动原有类的需求,这是设计模式六大原则的开闭原则,即对修改关闭,对扩展开放 ++ Adapter: 适配器角色, 在 im-register-login-demo#adapter#Login3rdAdapter,他将扩展出第三方登陆的核心逻辑方法,并且还具有 UserService 已实现的查询数据库是否有账号和注册逻辑 + +适配器根据适配的对象不同,可分为对象适配器和类适配器 ++ 前者适配器关联一个包裹它的类实例 ++ 后者适配器继承被适配的类对象(一般采用这种方式) + +对象适配器的一种实现方式: + +```java +@Component +public class Login3rdAdapter { + @Resource + private UserService userService; + // ... +} +``` + +类适配器的一种实现方式: + +```java +@Component +public class Login3rdAdapter extends UserService { + +} +``` + +Target 是接口,自然需要子类真正实现,在这里子类自然是 Adapter +不难写出这样的代码 + +```java +public class Login3rdAdapter extends UserService implements Login3rdTarget { + + public Login3rdAdapter(UserRepository userRepository) { + super(userRepository); + } + + @Override + public String loginByGithub(String code, String state) { + return null; + } + + @Override + public String loginByWechat() { + return null; + } + + @Override + public String loginByQQ() { + return null; + } +} +``` ++ 继承 UserService,以实现不侵入原有方法前提下进行第三方登录的扩展 + +适配器的好处在于不修改原有逻辑就能实现扩展与替换,但如果需要扩展的子类过多,例如 demo 里所展示的第三方账号越来越多,手机短信验证码、CSDN账号、Gitee、twitter 等等,可能会导致适配器适配的种类越来越多 diff --git a/im-design-demo/im-register-login-demo/src/main/resources/static/img.png b/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/img.png similarity index 100% rename from im-design-demo/im-register-login-demo/src/main/resources/static/img.png rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/img.png diff --git a/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/login3rd.md b/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/login3rd.md new file mode 100644 index 0000000..d10a803 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/login3rd.md @@ -0,0 +1,52 @@ +# 第三方登录的实现 + +参考这篇文章: + +[官方文档](https://docs.github.com/zh/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) + +[github第三方登录超详细流程及分析(小白笔记)](https://blog.csdn.net/qq_43516238/article/details/105884926) + +[GitHub OAuth 第三方登录示例教程 - 阮一峰的网络日志](https://ruanyifeng.com/blog/2019/04/github-oauth.html) + +所需要的四个键值 +```yml +client_id: cf00a9382ce8110c2a70 +client_secret: fd348b2050f64c7a99c07294b390a5adfaa21e8c +redirect_uri: http://localhost:21001/github +state: GITHUB +``` ++ 注:为了保证安全,我的 oauth Apps 已经删掉了,想要实验的自己申请 github oauth + +yml 配置 +```yml +github: + state: GITHUB + user_prefix: ${github.state}@ + + # ========= 自己申请 client_id\secret 用完之后记得删除 ========= + client_id: cf00a9382ce8110c2a70 + client_secret: fd348b2050f64c7a99c07294b390a5adfaa21e8c + # ========================================================== + + callback: http://localhost:21001/github # github 回调 callback 会携带 code 参数 + token_url: https://github.com/login/oauth/access_token?client_id=${github.client_id}&client_secret=${github.client_secret}&redirect_uri=${github.callback}&code= # 拼接 code + user_url: https://api.github.com/user # 使用访问令牌访问 API +``` + +![img.png](img.png) + +权限访问: + +https://github.com/login/oauth/authorize?client_id=cf00a9382ce8110c2a70&redirect_uri=http://localhost:21001/github&state=GITHUB + +可能会出现超时的情况 + +![timeout.png](timeout.png) + +成功 + +![success.png](success.png) + +数据库存在该数据 + +![数据库存有github账号.png](数据库存有github账号.png) \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/success.png b/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/success.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8b0d096bfbd3823fa19c0125626b289c8289cd GIT binary patch literal 27030 zcmc$_Ra9Kd6Y!e^0>Md0aCdii4KTPn1ZU9T4j}}08C-(9y9aj&gAeXHxa*yB&i}5v z)_wZkzL#0O_TD{RUEN*P{j2IQWkqQ;WPIc|Z{DEE%1Eldc>~7-D-V8n2m37>=0|$- z252BFDW>jWc#xsz|%RS2OkJ;9*n(l>#fwzRL>yoT^WKIYP zdGf3&8F@pplw_jtAHRN(jD;V;3z$wb3$)9Bbz4hKJ1jlS%9@JA?G{?Qzltg?D=RIt zU-53`=gSCj8xeH0^;a>*j{6{(;G*7$NggLd`6;ZsP(txtA!YyQRGNo3JI8aqEt%xM zZvqt>0Hg8(RMIw^(BYr$E{o!!|Gq#-w+0~u=tR%;EhVu{5tvbstp*bcR?p8BgPi!! zxhe7B;^HF7Jk-lL`4q7nEKed<=n0Tu&+kphDgO5kwH+XkoJ~jLwIYdX{*VJkAB6ts z@^*K4aru6_m+ie9d`bW!whvN>IDyuy}N~mL+D_sDx$N?=b-3lKHzLC zy(*l2TB(eyQvC?vrWoJ~ z!OGs|7WreDB25N^%tUQh`!fxegVn@mc?N@LjYK`dz%|d4cF))Vb847C`CwN1ChNs_ zvkNQkYp#PtUE6P8#mVjMZil69aZL87wTvPumg=SU}0Y_1hc6YLUmIf0H88+^wn)}mnC@;(XY;Ky5Z+CfqjKrC9CvmGH&hF zB<>76#&^~S$(flvZ_S8wdpU%!1v!TRSpXrw59Ls;62u*k_ij41&cb22{_R4ZR+kba zq``ivL}JfgLOSx7EljGG-@c$=8!{6A1=P1$7EOj$@j6k^}{)z1duGvy|t zJZwie%D1^=_%}OU12k+jN>m=>MrNq;THX_aF?Vn3vl!kHaSH{mSB;ci|He`Plmqc=NEs;=g!S@DPFRGgWwvNIG=Vahuike9hwj`e?KNyU^jRYQ#O-m-V zg!GyKhYU(@Cxx}B8VnmaxL#8qfl7a^`dgLdl!WO1SFupAnL^l&=!v((V!<7Yn7^%9 zh&p`Ho(4g*;LEo8pS70DT{qODDZ28lV%~MwEye-v%7+QCeSt(IYKz6draC7Hv zm*rpI@PaX*Yvn+!yN|?k(RMp3d#N-#P9s?$1|fFnrK6MA8_#d2*s-HEZQMu)rqUQ$ zB74q!U3k71{cY~{K9w&hG3u2sGCTMZ!B>NQc6yqp3!U8dYuv2CnF4cmE64P9cV}cV z!kSp>x`D}t(JK`~I-4MY#)@voUja!?2r)+TL>M4(=tZGZce)8G(uB~OQ3w3yk=K+~ zDoMK=_La^v{sEI=TeZhre=j04aWt&t_RxmL0cmPZO3n+bCxG-%l5}>7V_?C9c=~Y@ zXOhOzzh)bN3-;>rM{TN6M)?7N%aY}rsx;LOVP4^}{oCVj zs7U`56%JX*ac)Yo*y`fLzK<$*{@N!w3Z16-y>LKjhIVzf-_P} zIL9!$L2JmbwH1J$!CRwRU(KyhZEKka8K7nLb}9@!6-M|Sc4&8+o@MWs{4PG$*XhoV zvoPixqY(b0j=x_wO%pRx;A!r*oBD8_9Wo$z z|4XhoK(g&}Lf{l;XTFSLkK8j^85PV{-7*$)V*c!Un60vy{L5@0_6GX|F~t9TAn*NU z;i~(Z11ZPx#e)sn4%m!;nI3IkCByzSQm?lcvT>2}dxMmSR?>wp=;P=wRK}otUox8Q z?pB|)*Vt^W0^ySSj<)_fLxE+Iww;3_Yl)88Qla1zZTCL+W#`)!HR`CO%k(K4qvg%O zTarq3gD&WCm=sDwf+>orcB8H0wXTx*ZU}>x!*pYVewrxfo4Ozkfj*U+ykAbx^Gu#$ z+|K7#nKlY&$knOa3wzaMHh9(Vz)K}3$?4haJSy8Y^QP``_^m=l4au61uNboewY(3v zkmHZDs*F0pPwJ4Tmh3=)UaNMx^gFSFfQ)yb-J{|3OKQBpcqH$6n*A6Q!my<{w!P<5 zYN15oy}-MbGL)hj0g=kX8r)~(NVFWy8+tTxQ97lW3OZs`)#&LtLLT8zuf17i9ObpNLzjn=yH|uF=fy9E<9~x zHT*L;+5RH5dmFF443Xt22h>U?L{hxj9}?w*J?|MNAwXt|Jwo-Q80RzrRLr^~3#?e=V?y(b_3$H8en z5vm>Qu1W0WJC$TRnBk*OrcNLMaMz;K=_afB@i$`>*E^aDYn0Y293}q*L@d@!V1Rbp z@dij$MLY%S>W_F#i2>P<8#P4EWan29W22aRrPZ0_c=E?RdGG7H=pbE1XObQndWG>R z(*d_bh%>a6t7Xwr4DZicdj@CY^`8JCD8HNC(py{v)YDZIzZiU>ugubgzrmVSy1VP7 zmIGHf1T)E4L>V6O8oJ;T_#`yzjff!d0`<@sc*j7Pi2X+a@71AlJ<@w}PtX8uas5mk zjab3(BZLMOQHC?5^4C*>l~iXjXYppVKz%ycu-FLaMaV_eF$e`I{hLMSi>}1b)2PwQ z1y9#~Lxyx=FErxb5BtYYqDM1rh0JrQzMr1c+%2c4 zkxNYqv~%dA3%K@AJ_-r?sT8km*EnlX7kz;)+^fZ?Y=7{lsud51F%VCPp*{N(a`kyN zLzTZ*%RzBjNl=>n<3UmOKZYcd9*vsx#hflBAnJ2gPK|$1&c>jK|M7;to=niXi?Y@JRXHDK! zou-2d3wRYs(a!Hvk9f)n1pInJRZNqZ4O*Qv%m$f-{`ITv00}-STBcaQ9g7tm^#tk1 zppVqkosUKd&`Hp$8?2bdKlPq$;zZkM)#0sdgg_AHzXikr? z_9oNAj`U_rHQr89Tb=<#)FBBo<-SQ(H{>8^(Cw53J=#I+9N2oc93fy)Nj!hO{d!Wz8Gq$_H%@ZK%)@`IV9 z);-IW2!W&@=e>(D4hjgNt=iGj56?MmmLam4-HF##?%T(AR05ckk9Ds4vjOA|v$gLT z{O2OWeovn9$ml&;1g_PzFh;%AfMBFjytFB(0Y$JGIn{vU1NuPWn-S@cYczZJC15jl zyI-%hw4s5ts6ryNDQb$AB8g#Vfn32XZ_~R8-`kr+|Ky3!T$+D*G94e znhl(;4f)Yj5XA|VtTyGn_}V+IZ14C+4^;N^6c2mTm1Nlb1UTa=Z7! z=EB1M5WDcEDq8AB#0mIa7$M$35I6syIpF34UtB+TvIlooyGsM@h14Il^Kb{7_dd?< zj%6-Uwcjo{3LBlf;3n6GyO;;34Nqvu8HxSi-__7qP)Hh?+YVg$)~LKb z4X&|?WDE~4!Xqn=r=j~2b5BbV1TU~OM`XqJM9^pTByJ6dI{_|JF<$Sgl<4hdLdA~P z4yLJ5iNGPxqgWdFzbs#w?S4#$VC@K;G;ehyzP`2dcqoB%wwh-9oYzgxRw>sU_JT@h zJu3~5neCn@M{sZKOCEjTe8M1g*M_lmNS}T5ITFkj1D-@bP^G9$40!w0c})q9rG+H+ z3&kfNi^d+S6-5S-9BHzs3Y%?Z0~kzA?>0)^`Y&}iav9jV?(Ewr1UxaH9xo?FoU{b} z`9YVaswb0h$xnYh_CeeUT`YIHZ7kyxUz7+b_%M<2w6#np>zao!;6(-(sTU0Rv_~WZ z+MkCygWNxht4JVRAI>!d>VIR^9vJxcEu*n7i@$4peyeO-9{AnDI3yvRhUQq;%gI#o zsmpT4~BbA5B#A$BE6mN4+7r>niwM?RclR?Q}jF;S8&i+o-H;BUdp%P54 zRcW;(Hf^?CmqE1T`r+tri+5kXY%G}wPX((8TuQpH+n+yVumiSsgI9rmw0t2r@eq*` z-@c*QSD_PGCtnr##EjlVm>41D7#y??QhqtKj*}Jev|nxBjgzLYcbNaWs{YvuG(ZVi zUYzCtD{d7iiTq0Q1>JxnCi4z|hI?J_M~3wjFyAJuJ`tK zD(1|hJ&yOgf2W?k3#mF;pfP%y8YJ1Yv4w5AeEUMlQmiacW8bcQM=7l|FN@g$!y|8o zHN8df2dj&Zb_XkAzPP1 zPvpffR{+2K*;)HLQ^gmQ=U~&P(U&jbQWx*(I{?jx52%`ltd#;EK4C?P{kQ5psdwN@ zIrXJ%77GIlXCZEfe+wQ%RVp7R&lDTb2udu_@boR>|5iggc zX6Hv;zNH(cvfj4FLHF;=Ii_R9-A>%8=v$v^sw2BCJ}M#=f^m&ae&aNTj*rMjn>o${ zKV_w&pvME2>W%S&&5Wu%E~0VOo}34T?>8sO2h@wTD>R`++2v|DpBJi);oPMdh>v4d zJMD*x;LZe8Vl*pX_DyGLlxlS|L`UcqLj8TXEfAhWX`f5v7m49Ph2`_Z6=lP2Ls$R_ zqevq;2~Z>OS(VT7w>m_DEqLrI-$cO`#27~MdYG$~&gh+|<+6sN)j30q`F*QPtIEIi zs>uDTft}#-#R#0pPkRPt<^UqtyxI&MIuJ+To|~f|_o^o3zY}yKe;IY?FV$g+{0X?U zj(WSNz=p7H{ETdId}0?@Hct}GVK~0rMdkQ-oMX9n9;S&knAP}Xt3F5ZD{G4!OQ15P6f3#d7 zy+$O^*xzR>;&Ufz+<63TK*TsX`aIWRs*UlwYJGHe9!`Ty?M63^0it#=(GuK|WLy+4 zs4%E|y6t*hYkqFqR)`$26g+=+?sU2?E$DiN`pV~$sT6lyT*wJ`_>Ol1mfE~812JB< zULO5l7k_>9NV?w>c|PwbjJiEw5LJBUo{bUqIX(4%jId8dKSTe=hd28+mVU>j5hc2f zdN(p_%EzB8$$?T9IU@LU)qD7>WFfN6TUHt9VKV;WdRG7zO|8(c6nfsSZy%JCwK{X~ zyR_L2joXjTE_;l82JyiRI*f5n&N`g+aZD;^3m>f9u6oy7R}>uz&Qq0d`MJ9y-q=G| zDV`ShjEa>@AQCZ}Q=P{;Ee{cBMm3iZnr?zQHbX}XLVJClYl(v4!l0mU;W`~MA$5>R{B_OV;FPzH+yJ!mqB6G>^f)Xyl8`J8kJ%8 zOhc9LS%-YCA2qm2_dAMWhoO8o^{_q7LOb2Sx{F-pN?T*4ZqxmD{jo(UB4mq>EWQre z-N+^mi_Uc6qmE_IakZpd-p@F2c%%eN{R|-SknDaZ1moyBD$c^gzfmc8DWs3vj){W? zq;>oSz_5Q07@Zte;#%C>7-3;*ot&pc5b)7ki+C{l!o^n zgdmu@e|72$l!E9jenv?mow;xpQd)=P_<|4!d3M!!w?{xEE46gBejTm;cfHTwx{K-2 zkCgPg9-QEYerNvyk{G@Av-q+39>TW}QW4d@KU$|?%Y(5;u8{-wsTyPyS9JT6^PloV zf#X|nd`ZC?6vk`BEBv+ocBSV$9lPQ>{tW4 zm5C07vC?tboHl&s6Uf=&?ymm8OiLj+Ny-{W51iyOl70X6CURhLdTlK0mffqCpl0tMM0ttN0$swP_i**+$%WMBQ?4Z@I{?uHo+HdZ9j=~>`r8-%dY9LguuvW#z}Ir zi50wtZkZ;RkI8xUBb*p?si6-g^NmmF@TPB3B=7CtwA7E6b?8M&y&hPfP{u~~^+NP0 zkQ@h&wL@;{p{p(3F)Whr!#f{L2p5?R_=PUCqjZ&or?)fR$;rP8@R{z z!~Fz+b1NKlJwWL7Jf%6!(7`M}>g%cgJ*YnU$r-<|&(UHdnVMFE|eJ!RpjpkBWK$;FDTj;8IX zoD9i%?Ige8^=>rp2R`Ou954BO>q5E>$P2yMLWt1|gT>i~obL-h8i=~RNglX`HKa9l@miga= zN9Op{a1O+-FDJygJseeqGaGfdK#Pt<@6Knn_SmNrK4rA+JQ;?C)AR*Fa0X6iKzR*5 zRg6(=m=$;)ps(%M`%M6fRTD}hc{57Wv%n``AT|$Ul0ZBgd`vz#bhU+Lu1WeitciXY z2Mcc)H#E`=wL4F|fG8pcw8eSuwi_q$q8~`Q>h)iJQucr9A%ol=`pEtbdKP91F)tzg z8(;1Ft(pU#C?rhyr=EqPMXfE(|Kh8FAi(H|O#Hvkjs1fEzvn6iRMf`_ft+zEP7pdh zjQ{>-ed;$jns`xTeG7*;tO-M`dlW$u7QU4vXOrP9uD5NSljXD&GfeYm$@uqa+&-cK zJ@js>!;{Z)=Z`$)1>=yMi0@{s?brWWhf`E2$W)Mx-C~Qg8W_7$la4u#j|%%IAS`L} z=74r=GPajBZXd*_LkF~so(ALpD}-3CM0DqW^~3to6;*-%E9c1kpA^@$QknX;&4&p0Tf=wVt!r# zu;Zf3|3c6p*ccTGYQ?5{?e^8=A)2?5{r9mg?Bi0TPfQ0cKW*9m6K*sZ_AN5@Zc(

!KUF5%1#7sy=(wh^78Hqe^FP*^KeWGj}LQ;y1LMWH)W?Q8HcEr;(0*vek}RW@Wn=tsV5k&M)!9gv`yx~{C5zp zVhS{X!?J0Ta2@P6H;kS(c$kzbiyyd@WnjqrV5EExW?V?;2bAv0y;-0O0Wh;VKC1BQ z1L3?Qq69U1UDFq$Z!~4(a9&+=9EM<=r1Lp{-J38V=(;AJoG{*S-W>}UsWn>dkB{hi zz5W~M5VJ^Ch?p|kCUmvlwTjn8^vaY604;M-99J~0S`c;s#@0>7a13VknkJCzAihwU z$+=37MnKz5W9>~R2t#mr$E|A$ThX3AE=H4BTor=r@pa&;g*H_XL&4pv>W~^LH7_p8%HAo9a=@G% zhZ&~4Rln7w1B<4$Z6rpa6=}Mpa0#bXB#lVpbkA8N4F@-L+1f2)hAA7Z#=L8>ObFAL zLE*c@Omxql?(xSMU0QuPvpfr@Nb6Md_(hGvY_%&UsB=|7b;D)8vlNQQMGT~@BEOWm`cT3GZrym#*|7g7;h_v@XbdA)#GOj zJs6^uS!ne*@3CMK4zB2UxB}gBS+c&z8e~@kwo$iV{tki#BIwoWWiWTA^8b`fVSeGH z&v@4r(KC8oIVLZ zktq@*TmPeslX_~d%4qb{hWnc!-HQX$TJsdg-7!4Uo;0pkE3GkZd7UP=*?d{74VD*z z4%5-LQ{Ok9Nz5O)GWY^%VG+%6K!VjSt%jezOKs0dxTwvh0%LDWa_n(XEmktDujV%9 zX>AZyH7;5*Ne;buTDlw$H8nAM`3MzsL0y%?@z}?|qv47Aom!hUW0>I=E3AxV*pHI- zEqptQv9yYAHLV_7v5Tb!I)!a}OlW^3^uC;5bu8Jb2x4QU%~T3&CybrPQx&_%VCk9X zf{$;rMCh5|sqjAqL6R!c;b><>ox0-`GjD?0k@%eFYz=eYYZi>Bav&nxt~5>;juXI^ z#k+&IAFYcNAI@ZpF+}XqkZq@W?it@x;^+S{O8N?7JMozkT=gGjUnP-7^RgAB2Xz7=?X zZdfO4UT_^iHXLw-a+*z->>1nrO+U=lDPD*CNgHSPz?SL5_6miv+0S|pNNGsznwtP^ z%NBnZqcka%iAQ#nqLSGI8v96iEfD}^%8>$j8j^{#aC&U<95#vK$u;nFs^K4}Y(ko8 zetM*on>l-9(rS*YoG@!<8gtHqHH~H7^_O;x+j}<<9QNN2jeH&qI<;gRH2Z0zu7@vT z?CR7p?hRLxxk`5vgGc3D3t6FbZs%M+T-oYNC3h?7kG6g&2PLAC)RK{TeGPyH7@IYImm)zpETx}O0g zbZ|wf*g-ZXGRanV5=AOWCF=N9WAfH)cEK-IMQBTdzuNpG1iVy$g(zCcBFvNb9uvNy zY)Bkuwg~7OTlYU}M z7OH%WryE;z=%(oL-_qEM;K$zWPA=tYDqP-)O4Nqpa`7Z0dtKsW{X~HvjNXAEOIqb< zJxzt{RWjmn8hdlV&r`!o2`qOWZY07tK_4{|D>1qB?UG`HJX=@n)UATWoK>NT2!NVPCJs#J*vz_=j6^!l zt52#(AHMn|O$)~m^8KTC%dxcg(qtl>n6~zi`he@4)Z;*xBpQ0_gp6+L7!n~`z2Nv} z8E%U)TwxVW;2$yx;h>BN9M7a>MxZ+I!6c>Gx}PRjcXK9%E=n9w02aho99yrz`w72I zSHj7Vi>@5}6*hfa5q5=VR5a0Z@yC5L_KVc{&{mCXi;lze&jW9J5W32Xd$dF43g~{; zII^$__6>)arY@!wk9?c4b6UeM+cFOq730_bY?6=L-mhR1$airr@ezk=BOZfynY=D z<*ZSs@UNA4H`aU6iWEkqB8i&g2_uPC>h!7@4AK4Cg@0u<0>2>GikGSH?$-EL^|Wm`4ZdiSEw(y)W}rI zDk8z$hcPjYQ}5P)9Lw__^t)BJ2|7bp-lhdY@Fd+!s(2~mTx1-(yWdk2_4d74wDigK z>Br*r>+z7u;CBtz4-H2ES>*Z&db*%dTE-4B3%6cph!^0o)Lk5o*l=8-TGLtR6|^W> zn`8Xk8H!dtz<*Z;?xRl>o>(XEcN1Aps<#+gabYdDj2zyk9Z90f8+R<7$6yW6%;&}c>9gV@S+LH2?|Dc%s|qj) z`H)17pHoM_3ii5bLS4uT4X{q(+z?ac+I)+4|(7* zYvb{ChaXsVi>km%8HZS$lVmI%)LgMDsCe#+y6<(;LN9fYT;M49+Fv7Ja2nOIj9t^X25?Z=pgdc% ztXxXZ-luqp9w%OI<)Mm@x%<_mF+$fvcGfYKDnXfuI?sBd6s4&MTN#^TQX>;+-Anj1R3{Yzb?Bx4_PLC+56YcL!E|RufE-iNh{yr!OSnr;Fa~BM zkw^~d=`IQvW<;C2G@^d)Tcu3EkKW_OwytYq3-kP6xBJsM&ODxKKy7aN@fTm9UZX8M zbhgx0;GgwF%df=BWidaTcDXyj9*9)DZu5 ziBmXXu-wncKAfsS%qOXlhH1g*HeGA!YEWTXW(<**y$K2Jz#KzV8&_`e0 zZY|s5?!T)CtBA}qqiL`U=vrvpc`Bup+*wNYvWP+ z8UPM)Dl~JJt+=qS+vIxmz%hyQb3}QMc0x)c5T@iA5 z+4|XIcIh90NT=MOU`pLTM!f;>RLCKCz3q=Gm3DMh}acN(4L^;zu2hs~6gvS6~Z$SL2*`rTu#WHQM|)`15oCLqNkJb!k1h zVlf&4AAQxBh-WnH>>RV&!sPJ@&4c=0a*%n2@#MMZ*8G?25eS60j*u7yxIFL$I`56W zdp}p+KX`nvaPA9S%3B3Kbh5;t_l5l&erohhK2fm<#mWBijqh0vc&K}4fm_TAufZK< zDD*iG93w}(yxz8R&$6>O9b{1)SV>+aN0?H~*+K{s*@*xFzPAAb0azKC4GZyJ97uO1>b~{pa_g9{5{p zpen+2(%si-VMaI*^$n5{BhS}x3a-VeUj?c_sbzP;5OfmPN>a56Om*=n<}mCpjA6mc zT_V_B%x~hYdV{YAKcVmK+pK1e=q5z{Z*9S{*k8Q!X zR^`6lzh}eE_uT1>~|lB9SID6K(K)7@E&zz`_DplZjUZ%AnFz}4N^|-Kl^hA=U>%< zK1?Yl*rWI1@ZCjRlh4%XHJCM-x$jtQ5Ke>0q^3fW>goITcUI7<&E*ChyG=LvJ!d~u zepS)7dA!&v;E});8@}B3Ci^XwO3=)0 z6hSIOfEZ9Wpd1?ZvnFGO+ZqRLbp^G8-xL@-VXijJZvUfQJB@cy$TL#0*9?>Cfc;I7 zgK<#V%FhLF<}|Ztt*D5Zj&LA(38&|WavfceWnn} zhZTUDlJJB_6w8c#Fe*ky$XRu@;L6MhT2Hzi=YAFT;xky6a3qigg}A5jo^w1!Tb9j1 zS=rk4V&3=+PCxC`m!ckLvA!IRyAC(i@QYR%iYLLr|LK-z^bRmFbW_&Z+xikHWghjw~91OzO2 zB3)I=5uPD3pV20X0`FI`C2Es{>2ez!v5rml`CH&KktM`SXW{bhj~jK`rof-cdqGy! zKIa}mNX$_UW(4J0LUuRS-x}$Z;7hC>6UQGGVH@bhW&$r+mEV7tOqSX?-q53^WTn9; zPLKX*;e**9b9b%fN`t9?(ly&of7}rD2BQ+Nxvws74Q4nsiaJVdBkLp~>DRe6wC7dT zzrJ~UF_hCWU8H2Xrf-RQ1o1stUObn+8EwOq$h0Og`?|tI=Zp6bJA&)`Q_N}NX?d8M zQ0us0JT_4gfz6!4?>e$6g>rKYA+sb+!U<>4o4Zl~|HHqgNMPW~8fIpaqXK0lt#PRD zj;JqIaQ_8k?_gNUKrkVZb_p?VKll6uSyzezhML%6ekC^|=pGO0+)YGW^k3SogJXS|9BtkKQyeCR78kvquQ3? zf7mSkA8hthS-|xtv+sX2isPTUBiocDojr>GHCGL5uHMA$D*#5o9%TP{wyE%sSU6b> zL-{-||3W40n}0s)e`>$tkR6O65~5tf{12{ui&e*;;@P#x7D|uzI5c|-liWN1)jJps z-b4OZdQ@as$N$Arl)>cxH;WE*7CQx%a{R0hX9LkSa%&M;&#M!BE4Nin78ySjg5Ia@ z{Rq-I(^`%5u&IOPmb_S)Q%)MOHjUFjvpgI9cC2IIHl))Vp*V~w$)HqK$wskyvHAjI z352;y0|x8qG;($V6V`)tfPhwP<+F^QBUOjqMosj4B&azywF@mT<4UbV@aiuky2JJ8rWnP-LL^_gN+kI?Yu%FM2tiCTiAsg-&+F-gj)vk zbTWLrg;;1AKyLblTI$K8^SOKPJeDmdEHQJP(g%kZ6T{s)dVd-Wq`E zz_uxhLBK|szW~cx(kRuvgkAF>ne(UkfA6SB$Kdt5k$rlfYmAEfckgw@`}Wk&cb)O5%a_OQ#r}xq-LGf+-xEb3P;nC_oDD*=;4ls>4+@f z^Nq#dwhqBMW%s!0XnUJRf0b#W%SR$@Us{6=9u#EuZ)y<|qpKpdCWljY57A9hugklA zQqf8w=)SOPD1)U!h81%OzlX2>f45KwxV$)*;$+PFH0ocTy6>p zfG`Pv!o(;VNe!QmFse|X--S)7idG`GqDM*5zkkZIBEt}XP_uNsdgi4sj5X7^1v)@d z_4PAch-*Y(?rA5H$rpq_SCsP*)XbCHCK?;Uca@<~Knda8mt3(!fY zp>>3g;4bbL8zmo3r82wW|6m-h*ma=AyWd)gWvAWuCK#5>z;ACow*? zB9FL<2uD!+tN~mk2}GSKyVqa8?xDNGITYSg4Lx)f%qlGo{uuhIHEA2E_naqBo~!f2 zG5L2i8-L3}A(!YR9zH$O-<6XFh9@(;()#lDnTZ;?bP|0Ci@idYUoFEZi~M488teMd zgVNSq<`{nzz9RFuO#g2iiSkCyyLOQy4HjvQ@^(AZ5cD~=L_5+VXkU>1&@gMbu<-atkJ-3rAd}aES%8Vxxb)} z>&+JAb;~@}V>-VMaNG@U!oid%AyshDJG_aB;^dPnGu$kcGllhSjJgZio?ug)aUrA( zS!!7W-u6o(*zvS#4#i^|Jk%im{84x=0n+!cOxU&6WJn&4g!H)fgz}L zW0OOZvla=WGQSjhr6YgXg09Epl9}S`kT~HH1Pw1&8z*DKdA`=xY0f)XOzxxlvVP(~ z7^VRI^vJ0*TFbg!b)L_3U%fvmbM543yB$@N>x4kI!55D#QZE~2zCsN=P3Mi|c)fwz?~}%cN)EM;QHLE;WxT2FsTh%P`NGFeyOhO9^rMcbHcu$of4$VM%ox z3p%i=mkO%NxFoaeve+~N=T9~Ovn0OdUmJ9l?3Rc%@{L+Q9mBu$AL+EY*;VO00*9Wy z?;IMmxhBYA(ZaWg_P2|Iu)YIov)r?Kx?b32h=+}GOMXbU!E(NTu<-b>30)`Js2Lve zu#p&rx4&MbJ$4DQO3KY-t6nG`Vd3)JO>7&4luOAMwnzfm5hlQtAnZSw-}DNG5k2bu zQ42l2LcKCkRH0Iw7J5C>7!qA{X#?liojbZMx;jQ|gPDY_7gB1(k1{bJ)gRv=3=)o>253Rx!t9gyg2Y;jo zwcMi(=q=ZWQ^mfkr*X~Dk4v)BoghpX+Y=YFl^d+}5maEJE+2Rm__lLtb7GhVB$aY{ z_%s^A`6#ci>@tNfi)qPzwq_E3Di$v|{6ep3b9Z>;L>zz&8o1{6kKV&0@*I$bqa09N zRgVPYz3f=CU5OZZztZ}l$*+!RU5&Ur_jFiuzAw`(<}@xN_=8*-od;E0x;0A6$M}z~aNmCm&ZaUlp{P*-u z@34N*;$2nN^t8x;zYzVn^6zdsNrjI@^+vXh&Wh6u?`@Q993(Hj#IQKZ`8vA#JNr+i zCX+a5t<;ySK?8!(NBc8#f12}s`cgz|!NeIC+(SLD zIj5*14Pb6y)NX-n-R+Am-4KN@YgHxwQoyw8ZF3#Gby4?!qT`DZ%@ZQP!T3~oWhqpW zjyNBHuB7OfP^*n=&;9eE^W?45z0hq}Fp^b9X=O$^cFE$2g4KXUFC~7YSOLNitn%0#EA-fndUv7BwdeX61*>(aSHlR5LZ^+xBqFArwKC_M`h4|?M zX!nLdKQ|1J@O4fo!nMsQrrb8_t3(4X-RO`>@f7sUiXIvj!||Y@7VJtd+TvSHpfc5k zZnqh9I4F|o!O&2XmlvV}v`7Vc@`k_t+Ne8D`k>@)9>K0Jd8^s1IO~J*CU5~7oLV?d zTOE1whvN&{w8nDWGqy#XBQ;{^c&@J|F!sKq10`L0GLGYnGlP_THRV%*I`FPaI<$E+ z7uC-wupx8+m|x8$)@AT%%QxF_fD0AQ?v61J`7_zLaA7a+hlV>GQwvKt0-945dnf(O77g4CvB%*4+k``>&2!3KSf=@ zMOfW1%>*S)RzMdW%|u~gPfQ&hjcR-}!>Lz&{>AUU@4bv@P7ftub>gpt=$X1epIl4H zt2^5I@LLZA2Mc?QTHlMdQG`EuVYtTTkLSD_>BE15kKdGWlFpPq)25yGrt(ah4<34# zd?8oTDBl0F!^XI3o!Z(%VqyHXeu#W{Fw7aQG_Zo+CaEZjT|f0tkD(o#$4X_2qHX+8 zdNYu20^4s;e1034FF1uH8FF^qEZw%rx3>C4X^d5b4Z#iAWm%IUCKZ?_0)*MBxPf&; z$CaK>S!2lQE}16W@#86ZpvR<@)G}G_$hG)Gz|P^wuWS5v{TvewWrIl`s}BL#`6;T! z#$KAcsW^r{?~QUbU;C4HY~MwRp%?JYd-q_L1;)}g=9^Gy|b;Oc=GwT5j4l z%&)n+jUi34Ip&2V*bB^u{PkGhC3P~rD_c43UjGlciKk94Dv)0=*rV77aB zxg}I@-r8m?#Y(3n=n-35IooF1*y8%2AhQgYT`wCQxLy?4sygb15JSZ8)-%5#tY7j_ z&r)cT`+X(h83m8D=;lhaz&f+dB@X7p5cuqozZE;Xqu})30m*GuzeLb*`~1=zlv-0y z3o975ptEg&Q9!untc~z5-tv`G3nGOp+SD*&{kU8=x$HZ+^89c^?^ITw5GH+l8ucF3 zC_wGyJ{D~t&~zHUiu^ht=^#?ga&r}C>coeA<&qW<%+X7p$IgHPDr8hJ){5-;8``+h zK=?>MUazfW(IPUM_Me$(6@1!!Jl+TjF}!0xf3`VLn8?g5J1xTwBW^7$tE_)$hSG%# zrO=h|NLRhI*0d&Dsw=0Z*?jErA)W0#)_B+Y{JUuUttn=kK_p)Le5_@fWjt*Lib&h? zgqC~l=C2t#oD&)zDiT}lw)GAJ=PfYTD{U8J)JGnulH8B6Q>a1p!?rMAjHKXp!x$p$ zB0y!j6K|81OZlo)40`37N4lBtD9CE3Wo)JC+hk?&59sIHO&c8F4!_R>^!jb4#oR$) z`gfBs2CD_j7r#-Pobx<+ulxp5jjpLxDDg5t+$1Y>7n%~>myREMi+F={;NbUuzaC`+I8F!tpYpyU zEUqQ$wsEI%cY+h#T?4@(xO;GS*8ssnaHk2D;6Z}BHVz5F-Q8XObMO7%@QvT#&1%r! z={{9k*4nlA>NQ+x>%kkxla9x#;HORJRxi81MK08Q42KTJDt18$Hy!OuIdK)EM@uoxRn`ToVd;5Asa(qJNT&$GoREvl8c$Me=n2 z2Y#5QmJIh666zl`)sm)9FOfwG|hXf_vRFtE&DdU zh6^gT^Fd`io0c=E;4%n&_2M!lMF*7Uv|bwZXfn$kHprtQGNCl{k^S*l&nAW8NB$^O z@%TsQpGN1UA2}k&KB-a|xYW|8&*fQzZ-FS|s-NJU4kiCt-p$ZnR&V^wnP3i<5xn2j zS|rtQ^nB7L*S|l(K0h*F$SgU@u1=^k_6Bi07xJSI0%o0E@D@#rG0`{hu7rw!zmh=0y za~?6K(@zp{E79S#kauckt^XRa|Ng_p*%Kqmm^Qn)>Jnxp{Q_?H-ue?B6$V~$_|(B2 z_2!6cX4U(YRC}JQL|=ZyRX4R_a>2G+cJR|ZFeZFA(Mh>fXK$ZWk7bY&bXFc7K3;m7 zu6QODTcWT+1!7hvWp{PyUzcd17ua3&wdZ*UZ#}G`-nM(Y)%}!~)Nhmj?y=jIUpM!> z%h4M_Si*JzO1>fdA3LL86>ZYy*nendFF5Iu#t34~auqGLQir~2{D$FXKD0I)PczKx zwp4U2m7b3ix5#@ODNj3wl}pczVL+2uZnIZxj@3#YSa{PFfmZl;@?#|0hS`RPTlb_O z;_e}|#A;0emxUR@JIA%7)!qq!H{UQFhlah$-6SOuX-h13i{nMwAp0lxfd4e@)W=8i zP)F<`5=SO|jq*?7jOKHzJcZI*GX4Io{n5!Za!w@NChd4;^rP=|ym2BLNWjW(T|c*s zxu8nSzO*$lon_uLZebMXp#42F1`%=d6~NOv?q`L8PO9gkK!2lRj4oO10B`->Dzh&T zw+8(qw_T`KV+Yo@7nRc)($GEQU-!K^YJp9Ma-N-5GQTL7>^^dY^38==H1Um|Y@}5; z)s~7(bUfDX84h@HV zhnkX65FS2_0L8mANHn%nbY5sItMi(LMoy9oJ!ENWU@sk_fF?6^BUh{!EPYjqb{RZG zuI01WpWk8VBKk|&?BZjMqFLx)!r_`w$!r%tJF%s&?4myxs9TB4Cqz51KUZKG&hUC}R9~&ey{+_Kcyoh>y1?&92IWbJk9?y@zw+=j3 zOu7yJb>zH@+i2Ew?=e@r*^0%(lh}}jzrEs;@{^AUF3iJD7WlWyO_<8Q> zQO?Z9-VdzE9jaZw6x4yQ3;Ve3#af9KU6&M5xc>qdh-ujSjf$~=iL zaEKy6D=|af_r<61L;}_fouWeyO_)5cL*8n_^q0;=HMo#2VMeQIB!{k=-=&YdS zEd1cdk!Q?7c9WnD_SF+7_aL3QU>%)~`ioaK*_Z1PnX#PDZMoNxuvU@YESw$*Y&F!2 zI;kauNsSu{e!qGw$kA{X%IB)qbfes3%ytvK8HMJn8QF~&w+Sx&tP~Hts{8O8_PFKz zj!f>IMwbYp(mPKLVX}?@a14~t+U~oHl`RN8mVU8bT&)o-TJ?-CMu|-al#JZS8EY)6GLS~wUg#&) z=Z~_tugy4~uiMwRCi>UGtCi&*)UKgva`=YQU(;@lQa&>4FggG&Q zdL!jZ+3pG5{V=^;{WkTMIf}4W>~2q%#b2N5n&3huYNF5x*+%n3AFuzK zyaFv#6ZC{nLHFC~X47;G46j!+sy%E#hX4!`!mh2XtZc^Dv^2hPLJ1Ut;>^%LJ*Su; zag-ID>2CM1*De0xt^<%7Nj_$SH0crs4;2>|P9p&!;pKfhtf7^I!%+wf+`(+6|7zf^ z+2CxM`ZwRpojU6==*lAX#E9M~aBSriHa0d)q)D@z>=LA+>tTuhD2_eU1$Q0L zE&^KQyTy9~5INy54VMDyT=%Do6U82oMaMHZE&9en5wE(2l4vs%ld-efWvC*=I-V{@ zf}S7rl-T-yT8%`I%f%7F>;nVr!u~g`C4K$T%iu|*i}RD+Vy zD=F-Q@j-6WN*) ze$iLfZzG_m{TA{$ViVYP`i)t2Te^pRqhxyJ7LR>cW8)}DFqwc+x+=~&j?!bX#LJ3aQ4ZmMn!_h zY3c6i{_@Efw!i{RA)*VE*P=Qo<|_^OOJ|0K87D0xBO?$0RtG;{|E(Q;d44ol66(=h z_@F8psr^m-jz!9vYBdvNI&2g@OhI`7+&BZW2ilPi! zn?ZpOj9aXw_qu4`{KmA*6Vrf}aGn`OmuD&E>5Ys-5W%X@(t0$e! z2)dQk??^EjHL1f0S-ZMeYIZlr#GGvBd&Ej*kqkqXzz|}{Ktn*YOg7)>v1Rair z&4aL!Az%$#v2Y{(z_n1MwE)c}B`T~ZDFp>+vZ~nrH` z&qEh>7X@oYld?dFj^wcKv6hUaq~zv6JbBBH4=a||CDWk4RYquF@L(liUpS2`co`U2 zp;!-8sXN?mZf<$LJH%0<6N*$=M{67Xv6R72oS&w@e<)qR!-YNC`(dC|Tw7_a#c_Oi zcrDksnZop83tt&6b--DxvH8f1PXdTT-&i$CM$ZZh3y&9n$;rrsly3zj=fJ6#i0#E=Zg*Ml0Zar^I669tQ#F4^2&VKBblr$BU6iUtuR*zqgsr8kN$*F; zK}Y!!Zfzl(&FA>AKs4kU;=uQw|-uVb1h4 zDi$&A$Vr6O3IyD7sC>*&c9EfDW~UC%uOSGMU_;%(^MED$y+2c$`mBVk2d`5c${RA= zaXo7wAnhY^F+^)>3784)?G#L7lX*YtI;LLKiT%apknbl)jJ8l^kg;Ea`)9ANEBwar(2;79FT$e>Ym1BsL-S)-HG7ndGq&cIVsN${Rv zTRSt5u9$-<=NXEl7j@l`nJ3Co*@Xj(fGk`uw%(^9H;S6|z%QYFI{jXn7q4>ToSFEkkSbXOf{F^l})iXEG3P21(Z3Aa9Gdb=={bGew$HhjJ9|_(9CV|)Z zjPg5B%RzZ$S9tZ}(B&>)6mGdY_0FKc_5C;7%HTDbHJQ-u(EBIAXMXBD2HdSj0h5lN zWo@OI*%td)`DfN>0s24Q#gkMCkzu;LQ&2C2_xB4)^qsA7u|uvKNZ-4SUZbY1IX{YF z?moTCA{OpjKluo9FSrP|cp6(inr9$tlRskHijv52-rFp#?Nf zjTpi$2Y@yc5LfLM8!LNdFnXy9&kh!Uu^TL#x#Pxt1hSt`9=Zj;$DZ0Ybx4tmeBJlH zX-KY+Cn_l!0Rg?LMk8&u9>J%+UBEEt52&v+1$?ogy}LjJL!P~4l|Og>O3GlwbR%4F z#*Sp_Ukir<21ogkGuww^!G-r{MRcSeBkyyRw7uIU$Fvbx86J{;|L=j+DiWE-7HrS| zBqmy#`X<*sG-PETBCoJLxg5)O?Ir7Hc@L;@~Uq`3fGX}jOa#$0BQ>a6{`F4uUTsZF3`?0?MLwiOlP6lL0J z_lG%cgQblGqERf_B=yHLKgd9+GtB>dL)HddpI_Xy9wOZ*7V%;R?!$Lyj{)gm!lobh z08%AoQ-CH2_~W!nDQ*@j!=O*vMAmZ`9JtG4EjDsMBDv-lfU+`DQu;pklS9B!U`oul zmgM8DN7|M8DC+UVIKTUE#VKPn)ps3t76mx@Sv6a=i;loY7bZMb)F5~N zCXgSYCc9-w%mhv?k6;xc0l{p!j;a_u<2%Yr@2< z#V5Z$1Ii40`Zj}djxUQ2bX68$*KGq5F$q|`NJrJDAY^DeFy!WhFNopAeoI4fN1RgR$(w$e?g{oJ6r3XR^pVJ zr`2V~2*Xlxh#KAxikUhMx3SoFkaMAPX_+{Nz*u8f6?UB)z z)nIc3^lfg>Hb3vst&sPOZ1ea~qoa zL@xkuEXh?fxVJUZF#4rS5{*0BsLQQvymS4wF9z3@C5}pQmzPb6AT7a^0kMaRhz!r8 zHP>nfXB83is0A7PLH?nTeD41|_E7;1CZxJt4bsCsA(EV&+>7Jt zh(0ROwEvkmmH!CG2ubt1hU^IopCuR7YaB86=##3pcADGHM!#N^CEU|OwnLChoR1@U zVa&XvCEbdqzMb8V8jTRsi3!xY>CTWIC%BLjsEM%Y?kMK4{@i}8i(7QaUJQc{7V*5t z4tc^667n`$w}$O#N2<3Xl`e$~8EX=PPaV10S3rK}NMLk{Oi?G#S#s{3k&c^0MwEHpI55kKL`uUPf4r?#%voI6 zR$LNckiTZcQLafWuh4`z1b_&`T9*tNY`OwxS3+)ko$&&|g4bukVs{|Tl$uoD@Wd2{ zflxNh75UG-7*RXdH&oml;n;6r!%&c6E+Q~KDO{phRZNq$sM#;KT*u%tY}KwbyO;Jd zn#>tQY-K-;X_Cyc-KIt=xbKblTMQ;N9r?-+_r0%8EG#9Q9|N39;!3eG^sfhhC zHRboGe`!fVHqAe}E3I2W&0@P~$$HdQPtAK3wQ#5kH)ORsfF$6*LSRCn49 z4)b3Hdxbm?bZG1c`31tP@Q$EEK6aIuY^H92ejH6^vJG1r?Tjnqd=+r zmhYY&_~6|>Le~{OJ>NT(@A<>zfLiA$X zqS;G4Li1aI89gXTD&m0Cqy1vz@t<;?c>kt?D;!n@?FwD&agJu&U6?CKFXK>(EH;!0 z*j8PYZI%F{4Bk3_`?&-HeqzR5P>;h!Mlmfb>J>h~s*hq%vE=U_Wm$7bq~_(7>cx~T z&zS125zr`}T!Ps}-#K}KKR+$R0?en%s8!o{cvK9qyv!x0v^)!)m6=|zThtZ(QD&>N z1D-L3kdv?z{2n4$-g@bujK$QPcaUk_P-8O!*!Hjn=y*GXU>YggPBiIw!dtkQdQ>Ll zxkX{L`~xN`*sHpz2J0|cp|0aqiO<14YQV|CQ(mz~E$L!e3AihvJZFUJ7ULh92=qs> zAk@&K`0M>GBlF;kCLpK+UVREv*Z;rQEuS7`Bc%pj)(S=VLPZb>%Q|_GmE26dfb#A% z_;n^k8iE__(VaJ8PI6zHAr(4C`9x@MH)@HTaT^t^Yh?YdCrSZP#pS+MG)k z6z5K7S|Zyl!24t=Gc`5xbey;DpY2F_SDaZ{%;_-yGm>Q#sfJD|_D~Z2SCN7RVdGW~ zRC2w0);0pOyA}OjMu7O!2Xo)%s=jA0YKYg(m(Nd6t(o_nHE7!bb@z!O4K`Ee0I54a zKQ{@wr}H7I`%dnVIDw&Q24} z9m@Y7({K>e7@VD(hh~y5YK+4~%x`fj%IV_mQD*pWsAgwWtFJ)S%%|mVX4!-ZIRl}i zRX$nwV%0zg8;yWoqmb44P){TpVTnpEl%nnnrCU9?TF98m8$RSUQpGy4V|8%(Vqz<- z|Aebe``}MaDxE}q*WFa3qrtuDSWnUP7a~9*>*#ao&#sV=G0CXmx6>lfBn6iBPrZKH z`b$R;GCT_F*~r_xunutm0F-b{ur9Tra^L;~P>Gq51p;6q-0ZS5DZ`f-sQQ5za5$MB zYGH03(YiOfp{S-sB0v*hg?@DgFzY*Ix*btxqi@q)DY%9qZe-h!VMh{rc#s?#M&|hC z3dg|fcw#n#vX3{8wN!l+Ka<-_|J?>g1})nz5!h9Ar52_@j9`D^Rry2zc7(f>`4@ZM z3Ye*402Jz0&o6Hy-zdDXFRwvFv$kG|B2U+0*%W2YCc5W8rZeVitm~pEQ%iLnWNTQpNc=y4XzuH$ zs0Ea~EGW9n8!|9>#1mL~&g>Rh+JwlY1c8jCk8*p)@v5&$(Z4j(?!(ZdvXq*C_jY~d z9j(7=-LOSkf|?35nuLcAUtA~(moaEvxd{{38zKjzeg%M$xNGeh>UdMC zoz=pIG1s4^Z_azc;%oK?DMA!}{sVEux{>58R%YRqI|QxbPQC0kzLB!gvOb=GSFj%4 zKvP*N^&2#t8s^IT*i#2^6zh-=@B#f8$=eb297w=-o|`n*^>Gs@ zpPSP;&~A(ITTNJc!DO!wkEMBjs3t!X+3yz{>9I7qkVxKzD`5c?u z#uT3u`o}npd5o1j^t1Mg-9HwPF~{|xJwO5vJ^MQ3+1t*?Qy{`E!W8&UnhqoiAJglD zKR+F7`GwKIFr1}`!P^G88o-3FR>3fIW#-?AnUV~J{W7?L(D;-deb+$eRidlxXTTo( zm^3N>5?Bf){6lca4hVpYSy@voLCRUSm7f8esah9oX3{*0qms&XjDVx2N5%GfrlU2t z>Ax0|5;-^RXs5SK zCrX-8?hLp|Thbj{wH-f!!q1S21qcYhUY&A?&+Ev%FtyiiFq|C1enBdPMRdMHdnp5` z8OL{KohsIeP@KzuOqL^C)7n(!5~v_Y382nw+LNEb1(3C>D(d=}uKsr4%SVE_4o}DL zVgg77=>yD23MmS421g`GH}*HQ@E}A&I6v%`kusp-#EJ(t*8kWtD@MC_ zg1~&Ta&nt{Yr-aLMDr|y0YAOOHT7dCYB|Uk;Bp6AuwSJ1`m-_bVP~eNIjVG7shC{% zCaL+bPiCAsOge)^RXCBi9&bpr8Srw^(O zmOzgqD4|H;dWw&W!}H!j?B58q#r#uxqtK)!bdPXVgR+&S;cn9IrWlOTa0p& zdo2R0KoC^R(G^JW zy=*&aiqxc*))X0nH~I~B=bpa*xEg%0W){L73Swh})3Oksg;hv*X!2K!Oa9e>-U>a? zNns8g-Oj)1n(zB)S567S8jq$JgEd4EBoK{)OOH+=LiCzSio&~rR+xe%60MqfuWG~6 zZPI6%r}F7cLwQHn3VD^R&s}d1=DuuAQK&uGFnZ7ahf2(Sv zdQ-4E@OJ;KV?nXQ%BHbg=rPpQeBKvaXlaRb)giNAdGF=4RAT$X`3JhGrENCs5 zxpQ_GyxNx7Gv;oFV}QE()c8b_zLCOz5*Ef%Lyk*v>6X%C0(N+&0)FpR{oA|qZ*UkH zTvn)CoUL1yj`9Gvfse~QGscIHNVVhIC1WlxPrgsH%u2)= zzZJrF&+9Nb{~&XxB5DB_PRv3=`hwV|LkSe3pI3=YLFx&yvHY^dpQ zeA$?@y!xaWN6wIzljT-IeEeDpwGKAC1!7!W+Rnci#|(6Ik@=X$lqQf#KV(o6m`fANe(F1zl#2!6g`@bZ6{GO(_ZQ5y{ZVu#XU`=8w>I zQHIbPB#dgD(}v|@i2(}SLIT1y)-7Cv*{;c%?U$lfOX)8NH|T!UNy+cML=}+Oljs&< z1>I8{hFU}#nf^Yjv@oZqHI42r-(XWio6B}gfc!DmzoiG>3q~ssCf^6nH3+Fsj>|dh#*;dbR6Y^tNxDp zZAi`KcMPd!kpG8}3uRn*Sn3dvqsLkojId7f_6S}C7sx*alHx2!vt-T~%pBhy(>rd^ zjSN9=D=unQWFl@6D1E zvLL{C9ySxjKYw@H+TGn;P6sN>N(u@%{J2p3Gkgjt;Se@5d{1QrDZi7hVXlbh0p1GS z?xAu^gaHM0>GT>;72sDc3P=nAubu6}jgDB+upCE`BJdb2HSn=>6)w3}3i_zvb*8-~ zbqJ5(eF}2FYoVqu%Bs#ZO?R;TDL~C0FZjrfR7eLmr^=tJM{XayS_PZnUX6ohd6knj z9ypGZC__qTzK=?YE)Mjh$yU^Jk=3*&)@_H&8vWJMs*EzH&|v^c=pNFcG!GxNUYtg` z)mB(OZ1|Hd;#EzjSqYM1CdN{Kehyl_eg2ia1;QE>nQ&YTYB99-UPbk2HVm?g$XV;r z(oZrt_G{0Z*u71i?d5p#a7F<2sRy;DYcQWSR2>eu=9Ik8KUbPmfCJ45q#}Z_l7LmT zd@&42rf3=jqS3Ggfv~^xfI^}*Nk9@Z%ordln*ZC!+F{LuBHKW5JsiOQErH(4s>oDH HnTGuj<#FD? literal 0 HcmV?d00001 diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/img.png b/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/timeout.png similarity index 100% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/img.png rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/timeout.png diff --git "a/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/\346\225\260\346\215\256\345\272\223\345\255\230\346\234\211github\350\264\246\345\217\267.png" "b/im-design-demo/im-register-login-demo/login-design-adapter-demo/assert/\346\225\260\346\215\256\345\272\223\345\255\230\346\234\211github\350\264\246\345\217\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..67115341e9fc3409cd8127a19297080fbe58ada4 GIT binary patch literal 15014 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 literal 0 HcmV?d00001 diff --git a/im-design-demo/im-register-login-demo/login-design-adapter-demo/pom.xml b/im-design-demo/im-register-login-demo/login-design-adapter-demo/pom.xml new file mode 100644 index 0000000..d421d44 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/pom.xml @@ -0,0 +1,19 @@ + + + + im-register-login-demo + com.bantanger + 1.0-SNAPSHOT + + 4.0.0 + + login-design-adapter-demo + + + 8 + 8 + + + \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/Application.java b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/Application.java similarity index 90% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/Application.java rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/Application.java index 67be2b9..ae48c00 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/Application.java +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/Application.java @@ -1,4 +1,4 @@ -package com.bantanger.im.design; +package com.bantanger.design.adapter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/ordinary/controller/UserController.java b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/controller/UserController.java similarity index 72% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/ordinary/controller/UserController.java rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/controller/UserController.java index ef399d7..39de3aa 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/ordinary/controller/UserController.java +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/controller/UserController.java @@ -1,15 +1,12 @@ -package com.bantanger.im.design.ordinary.controller; +package com.bantanger.design.adapter.controller; -import com.bantanger.im.design.adapter.service.Login3rdAdapter; -import com.bantanger.im.design.common.respository.dao.UserEntity; -import com.bantanger.im.design.common.service.UserService; +import com.bantanger.design.adapter.respository.dao.UserEntity; +import com.bantanger.design.adapter.service.Login3rdAdapter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.*; -import java.io.IOException; - /** * @author BanTanger 半糖 * @Date 2023/11/3 23:23 @@ -17,10 +14,14 @@ @Slf4j @RestController @RequiredArgsConstructor -// @RequestMapping("/ordinary/v1") +@RequestMapping("/adapter/v1") public class UserController { // private final UserService userService; + + /** + * 适配器已完美适配 UserService,直接用他就行了 + */ private final Login3rdAdapter login3rdAdapter; @PostMapping("/login") @@ -39,7 +40,7 @@ public String register(@RequestBody UserEntity userEntity) { } @GetMapping("/github") - public String login3rdByGithub(String code, String state) throws IOException { + public String login3rdByGithub(String code, String state) { return login3rdAdapter.loginByGithub(code, state); } diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/UserRepository.java b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/respository/UserRepository.java similarity index 87% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/UserRepository.java rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/respository/UserRepository.java index 9a72689..b362a77 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/UserRepository.java +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/respository/UserRepository.java @@ -1,7 +1,7 @@ -package com.bantanger.im.design.common.respository; +package com.bantanger.design.adapter.respository; -import com.bantanger.im.design.common.respository.dao.UserEntity; -import com.bantanger.im.design.common.respository.mapper.UserRegisterLoginMapper; +import com.bantanger.design.adapter.respository.dao.UserEntity; +import com.bantanger.design.adapter.respository.mapper.UserRegisterLoginMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/dao/UserEntity.java b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/respository/dao/UserEntity.java similarity index 91% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/dao/UserEntity.java rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/respository/dao/UserEntity.java index baea502..d2d7477 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/dao/UserEntity.java +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/respository/dao/UserEntity.java @@ -1,4 +1,4 @@ -package com.bantanger.im.design.common.respository.dao; +package com.bantanger.design.adapter.respository.dao; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/mapper/UserRegisterLoginMapper.java b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/respository/mapper/UserRegisterLoginMapper.java similarity index 66% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/mapper/UserRegisterLoginMapper.java rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/respository/mapper/UserRegisterLoginMapper.java index 55148d9..cefeff2 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/respository/mapper/UserRegisterLoginMapper.java +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/respository/mapper/UserRegisterLoginMapper.java @@ -1,6 +1,6 @@ -package com.bantanger.im.design.common.respository.mapper; +package com.bantanger.design.adapter.respository.mapper; -import com.bantanger.im.design.common.respository.dao.UserEntity; +import com.bantanger.design.adapter.respository.dao.UserEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/service/Login3rdAdapter.java similarity index 79% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/service/Login3rdAdapter.java index 3c462aa..450d585 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdAdapter.java +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/service/Login3rdAdapter.java @@ -1,15 +1,15 @@ -package com.bantanger.im.design.adapter.service; +package com.bantanger.design.adapter.service; import com.alibaba.fastjson.JSONObject; -import com.bantanger.im.design.adapter.utils.HttpClientUtils; -import com.bantanger.im.design.common.respository.UserRepository; -import com.bantanger.im.design.common.respository.dao.UserEntity; -import com.bantanger.im.design.common.service.UserService; +import com.bantanger.design.adapter.respository.UserRepository; +import com.bantanger.design.adapter.respository.dao.UserEntity; +import com.bantanger.design.adapter.utils.HttpClientUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import java.util.Date; /** @@ -32,10 +32,18 @@ public class Login3rdAdapter extends UserService implements Login3rdTarget { @Value("${github.user_prefix:}") private String githubUserPrefix; + @Value("${github.authorize_uri:}") + private String authorizeUri; + public Login3rdAdapter(UserRepository userRepository) { super(userRepository); } + @PostConstruct + public void init() { + log.info("请求 Oauth uri 为 {}", authorizeUri); + } + @Override public String loginByGithub(String code, String state) { // github 回调该接口会携带 state, 防止跨站请求伪造攻击 @@ -48,10 +56,10 @@ public String loginByGithub(String code, String state) { String tokenResponse = HttpClientUtils.execute2(tokenUrl, HttpMethod.GET); // 请求用户信息,携带 token String token = tokenResponse.substring(tokenResponse.indexOf("=") + 1); - String userInfoResponse = HttpClientUtils.execute(githubUserUrl, token); + JSONObject userInfoResponse = HttpClientUtils.execute(githubUserUrl, token); // 获取用户信息,username 加上 GITHUB@ 前缀,密码与 username 一致,这里就不加密了 - String username = githubUserPrefix.concat(userInfoResponse); + String username = githubUserPrefix.concat(String.valueOf(userInfoResponse.get("login"))); String password = username; return autoRegister3rdAndLogin(username, password); diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdTarget.java b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/service/Login3rdTarget.java similarity index 90% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdTarget.java rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/service/Login3rdTarget.java index b43b165..61db412 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/service/Login3rdTarget.java +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/service/Login3rdTarget.java @@ -1,4 +1,4 @@ -package com.bantanger.im.design.adapter.service; +package com.bantanger.design.adapter.service; /** * @author BanTanger 半糖 diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/service/UserService.java similarity index 90% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/service/UserService.java index e67417a..2332594 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/common/service/UserService.java +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/service/UserService.java @@ -1,7 +1,7 @@ -package com.bantanger.im.design.common.service; +package com.bantanger.design.adapter.service; -import com.bantanger.im.design.common.respository.UserRepository; -import com.bantanger.im.design.common.respository.dao.UserEntity; +import com.bantanger.design.adapter.respository.UserRepository; +import com.bantanger.design.adapter.respository.dao.UserEntity; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/utils/HttpClientUtils.java b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/utils/HttpClientUtils.java new file mode 100644 index 0000000..fc48774 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/java/com/bantanger/design/adapter/utils/HttpClientUtils.java @@ -0,0 +1,57 @@ +package com.bantanger.design.adapter.utils; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.http.HttpMethod; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 12:03 + */ +@Slf4j +public class HttpClientUtils { + public static JSONObject execute(String url, String accessToken) { + HttpRequestBase http = null; + try { + HttpClient client = HttpClients.createDefault(); + http = new HttpGet(url); + http.addHeader("Authorization", "token " + accessToken); + + HttpEntity entity = client.execute(http).getEntity(); + return JSONObject.parseObject(EntityUtils.toString(entity)); + } catch (Exception e) { + log.error("请求失败,url 为: {}, 错误信息为 {}", url, e.getMessage()); + throw new RuntimeException("请求失败!" + e.getMessage()); + } finally { + http.releaseConnection(); + } + } + + public static String execute2(String url, HttpMethod httpMethod) { + HttpRequestBase http = null; + try { + HttpClient client = HttpClients.createDefault(); + if (httpMethod == HttpMethod.GET) { + http = new HttpGet(url); + } else if (httpMethod == HttpMethod.POST) { + http = new HttpPost(url); + } + HttpEntity entity = client.execute(http).getEntity(); + String accessToken = EntityUtils.toString(entity); + accessToken = accessToken.substring(0, accessToken.indexOf("&")); + return accessToken; + } catch (Exception e) { + log.error("请求失败,url 为: {}, 错误信息为 {}", url, e.getMessage()); + throw new RuntimeException("请求失败!" + e.getMessage()); + } finally { + http.releaseConnection(); + } + } +} diff --git a/im-design-demo/im-register-login-demo/src/main/resources/application.yml b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/resources/application.yml similarity index 77% rename from im-design-demo/im-register-login-demo/src/main/resources/application.yml rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/resources/application.yml index 0564362..fcdcc10 100644 --- a/im-design-demo/im-register-login-demo/src/main/resources/application.yml +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/resources/application.yml @@ -14,16 +14,22 @@ spring: username: root application: - name: im-register-login-demo + name: im-register-login-adapter-demo github: state: GITHUB user_prefix: ${github.state}@ + + # ========= 自己申请 client_id\secret 用完之后记得删除 ========= client_id: cf00a9382ce8110c2a70 client_secret: fd348b2050f64c7a99c07294b390a5adfaa21e8c - callback: http://localhost:21001/github # github 回调 callback 会携带 code 参数 + # ========================================================== + + callback: http://localhost:${server.port}/adapter/v1/github # github 回调 callback 会携带 code 参数 token_url: https://github.com/login/oauth/access_token?client_id=${github.client_id}&client_secret=${github.client_secret}&redirect_uri=${github.callback}&code= # 拼接 code - user_url: https://api.github.com/user?access_token= + user_url: https://api.github.com/user # 使用访问令牌访问 API + + authorize_uri: https://github.com/login/oauth/authorize?client_id=${github.client_id}&redirect_uri=${github.callback}&state=${github.state} server: port: 21001 diff --git a/im-design-demo/im-register-login-demo/src/main/resources/logback-spring.xml b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/resources/logback-spring.xml similarity index 100% rename from im-design-demo/im-register-login-demo/src/main/resources/logback-spring.xml rename to im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/resources/logback-spring.xml diff --git a/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/resources/register_login_demo.sql b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/resources/register_login_demo.sql new file mode 100644 index 0000000..1052a08 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-adapter-demo/src/main/resources/register_login_demo.sql @@ -0,0 +1,13 @@ +CREATE DATABASE IF NOT EXISTS im_register_login_demo; +USE im_register_login_demo; + +CREATE TABLE user ( + id BIGINT AUTO_INCREMENT + PRIMARY KEY, + username VARCHAR(64), + password VARCHAR(64), + create_time DATE, + user_email VARCHAR(64) +); + +INSERT INTO user (id, username, password, create_time, user_email) VALUES ('10001', 'admin', 'admin', now(), 'admin@edu.com') \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/assert/bridge.md b/im-design-demo/im-register-login-demo/login-design-bridge-demo/assert/bridge.md new file mode 100644 index 0000000..0fbef3a --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/assert/bridge.md @@ -0,0 +1,57 @@ +# 桥接模式(Bridge)说明 + +桥接模式旨在将抽象和具体实现解耦 + +UML 图如下 + +![img.png](img.png) + +桥接一共有四个角色 + +分成左路和右路,左路抽象右路实现 + +左路是暴露给用户的抽象类和其具体抽象子类,右路是接口(也可以是抽象类)和实现它的具体子类们,中间有个桥梁连接左右两个部分 + +左路 Abstraction **通过构造函数的形式初始化**右路 Implementor **接口属性**,完成抽象和实现的桥梁搭建 + +## 右路 + +### Implementor 核心方法的承载接口(或抽象类) + +Implementor 是实现化对象,也就是核心方法的承载角色,即:需要实现的功能,都会被 Implementor 定义方法并交由子类实现 + +### ConcreteImplementor 承载核心方法的具体子类 + +如本 demo 中的第三方登录有不同的三方,微信可以是子类,QQ 可以是子类,Github 可以是子类,以及账号密码登录也是个子类 + +## 左路 + +### Abstraction 抽象角色,暴露给用户,提供方法调用入口 + +从 UML 图也可以看出,Client 除了 Abstraction 之外其他所有类都不知道,这体现了设计模式六大原则中的迪米特法则 + +再者桥接模式的定义是抽象与实现分离,用户所知道的只有左路抽象,而右路实现并不知晓,实现了解耦 + +### RefinedAbstraction 抽象角色子类 + +本 demo 例子并不是很好,并没有很好的体现抽象子类的作用, + +可以思考思考第三方支付逻辑,微信可以支付,支付宝也可以支付,而他们两个属于不同的平台被我们用户调用,从理性角度而言这不就是桥接模式的左路抽象吗 + +## 感悟: + +桥接在第三方登录并不是一个很好的方式, 因为难以拆分出职责,第三方登录,说到底,就只有个登录逻辑拆分不出其他的职责了, + +就是说,哪怕把登录方式放在左路,右路的实现也就一个登陆方式的具体实现,没法体现桥接模式的精妙之处 + +所以引入桥接倒是复杂了,不过写这个 demo 的目的还是为了实践一些工程能力,例如一开始想用枚举做各种登录模式子类的单例,但后面发现不太好写 + +又比如 Spring 并不把 Abstract 抽象类看作是实例对象,无法在 Abstract 层注入 IoC 容器, 本想用子类构造函数延迟初始化这种方式,但发现又有一点坑 + +如:如果要通过 new 的方式来创建子类对象,实例化对象的时候也没法填写参数,只能老老实实的交由 Spring 托管 + +--- + +我个人觉得像是第三方支付 _微信、支付宝、银行卡_ 适合做 左路的 RefinedAbstraction + +支付方式 _指纹、人脸、扫码_ 适合做 右路的 ConcreteImplementor \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/assert/img.png b/im-design-demo/im-register-login-demo/login-design-bridge-demo/assert/img.png new file mode 100644 index 0000000000000000000000000000000000000000..33d79d82048a801048a27ff43d21f67f6ca5b960 GIT binary patch literal 87385 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

9w&|`a= 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%0D84mTz&rC@!f&!^X%*UCXLO5xmw<1O(OhI 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 I=akR{03$3q{r~^~ literal 0 HcmV?d00001 diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/pom.xml b/im-design-demo/im-register-login-demo/login-design-bridge-demo/pom.xml new file mode 100644 index 0000000..5b3e615 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/pom.xml @@ -0,0 +1,19 @@ + + + + im-register-login-demo + com.bantanger + 1.0-SNAPSHOT + + 4.0.0 + + login-design-bridge-demo + + + 8 + 8 + + + \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/Application.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/Application.java new file mode 100644 index 0000000..7acaf9a --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/Application.java @@ -0,0 +1,19 @@ +package com.bantanger.design.bridge; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 8:39 + */ +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/AbstractRegisterLoginComponent.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/AbstractRegisterLoginComponent.java new file mode 100644 index 0000000..d2c5b6d --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/AbstractRegisterLoginComponent.java @@ -0,0 +1,25 @@ +package com.bantanger.design.bridge.bridge.abst; + +import com.bantanger.design.bridge.bridge.function.RegisterLoginFunc; +import com.bantanger.design.bridge.respository.dao.UserEntity; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 21:27 + */ +public abstract class AbstractRegisterLoginComponent { + + protected RegisterLoginFunc funcInterface; + + public AbstractRegisterLoginComponent(RegisterLoginFunc funcInterface) { + this.funcInterface = funcInterface; + } + + public abstract String login(String username, String password); + public abstract String register(UserEntity userEntity); + public abstract boolean checkUserExists(String username); + public abstract String login3rd(HttpServletRequest request); + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/RegisterLoginComponent.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/RegisterLoginComponent.java new file mode 100644 index 0000000..7a869bf --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/RegisterLoginComponent.java @@ -0,0 +1,38 @@ +package com.bantanger.design.bridge.bridge.abst; + +import com.bantanger.design.bridge.bridge.function.RegisterLoginFunc; +import com.bantanger.design.bridge.respository.dao.UserEntity; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 21:57 + */ +public class RegisterLoginComponent extends AbstractRegisterLoginComponent { + + public RegisterLoginComponent(RegisterLoginFunc funcInterface) { + super(funcInterface); + } + + @Override + public String login(String username, String password) { + return funcInterface.login(username, password); + } + + @Override + public String register(UserEntity userEntity) { + return funcInterface.register(userEntity); + } + + @Override + public boolean checkUserExists(String username) { + return funcInterface.checkUserExists(username); + } + + @Override + public String login3rd(HttpServletRequest request) { + return funcInterface.login3rd(request); + } + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/factory/RegisterLoginComponentFactory.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/factory/RegisterLoginComponentFactory.java new file mode 100644 index 0000000..5a389a6 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/abst/factory/RegisterLoginComponentFactory.java @@ -0,0 +1,42 @@ +package com.bantanger.design.bridge.bridge.abst.factory; + +import com.bantanger.design.bridge.bridge.abst.AbstractRegisterLoginComponent; +import com.bantanger.design.bridge.bridge.abst.RegisterLoginComponent; +import com.bantanger.design.bridge.bridge.function.RegisterLoginFunc; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 21:42 + */ +public class RegisterLoginComponentFactory { + + /** 缓存 AbstractRegisterLoginComponent(左路)。根据不同的登录方式进行缓存 */ + public static Map componentMap + = new ConcurrentHashMap<>(); + /** 缓存不同类型的实现类(右路),如:RegisterLoginByDefault,RegisterLoginByGithub */ + public static java.util.Map funcMap + = new ConcurrentHashMap<>(); + + /** 根据不同的登录类型,获取 AbstractRegisterLoginComponent */ + public static AbstractRegisterLoginComponent getComponent(String type) { + //如果存在,直接返回 + AbstractRegisterLoginComponent component = componentMap.get(type); + if(component == null) { + //并发情况下,汲取双重检查锁机制的设计,如果 componentMap 中没有,则进行创建 + synchronized (componentMap) { + component = componentMap.get(type); + if(component == null) { + //根据不同类型的实现类(右路),创建 RegisterLoginComponent 对象, + //并 put 到 map 中缓存起来,以备下次使用。 + component = new RegisterLoginComponent(funcMap.get(type)); + componentMap.put(type, component); + } + } + } + return component; + } + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/AbstractRegisterLoginFunc.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/AbstractRegisterLoginFunc.java new file mode 100644 index 0000000..e404f79 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/AbstractRegisterLoginFunc.java @@ -0,0 +1,82 @@ +package com.bantanger.design.bridge.bridge.function; + +import com.bantanger.design.bridge.respository.UserRepository; +import com.bantanger.design.bridge.respository.dao.UserEntity; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 21:08 + */ +@Slf4j +@RequiredArgsConstructor +public abstract class AbstractRegisterLoginFunc implements RegisterLoginFunc { + + /** + * 抽象方法无法通过 @Autowired 注入 Bean + * + * 要么通过构造函数延迟到子类注入,要么使用 Setter 注入 + * + * 这里使用第三种方式,直接注入,因为考虑到方便 + */ + + protected String commonLogin(String account, String password, UserRepository userRepository) { + UserEntity user = userRepository.findAccountByUserNameAndPassword(account, password); + if (user == null) { + log.warn("账号密码错误, 您输入的账号为 {} ", account); + return "Login Fail"; + } + log.info("用户 {} 登录成功", account); + return "Login Success, username: " + account; + } + + protected String commonRegister(UserEntity userEntity, UserRepository userRepository) { + if (commonCheckUserExists(userEntity.getUserName(), userRepository)) { + log.info("{} 用户已存在", userEntity.getUserName()); + throw new RuntimeException("用户已存在"); + } + userEntity.setCreateTime(new Date()); + int row = userRepository.createAccount(userEntity); + if (row <= 0) { + log.error("创建用户失败"); + } + log.info("用户 {} 创建成功", userEntity.getUserName()); + return "Register Success, username: " + userEntity.getUserName(); + } + + public boolean commonCheckUserExists(String username, UserRepository userRepository) { + UserEntity user = userRepository.findAccountByUserName(username); + if (user == null) { + log.warn("不存在 {} 用户,请注册", username); + log.info("重定向到 index 页面进行注册逻辑 ..."); + return false; + } + log.info("用户 {} 存在", username); + return true; + } + + @Override + public String login(String username, String password) { + throw new UnsupportedOperationException(); + } + + @Override + public String login3rd(HttpServletRequest request) { + throw new UnsupportedOperationException(); + } + + @Override + public String register(UserEntity userEntity){ + throw new UnsupportedOperationException(); + } + + @Override + public boolean checkUserExists(String username){ + throw new UnsupportedOperationException(); + } + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginByDefault.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginByDefault.java new file mode 100644 index 0000000..29484e3 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginByDefault.java @@ -0,0 +1,43 @@ +package com.bantanger.design.bridge.bridge.function; + +import com.bantanger.design.bridge.bridge.abst.factory.RegisterLoginComponentFactory; +import com.bantanger.design.bridge.respository.UserRepository; +import com.bantanger.design.bridge.respository.dao.UserEntity; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 21:07 + */ +@Component +public class RegisterLoginByDefault extends AbstractRegisterLoginFunc { + + @Resource + private UserRepository userRepository; + + @PostConstruct + private void initFuncMap() { + RegisterLoginComponentFactory.funcMap.put("Default", this); + } + + + @Override + public String login(String username, String password) { + return super.commonLogin(username, password, userRepository); + } + + @Override + public String register(UserEntity userEntity) { + return super.commonRegister(userEntity, userRepository); + } + + @Override + public boolean checkUserExists(String userName) { + return super.commonCheckUserExists(userName, userRepository); + } + + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginByGithub.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginByGithub.java new file mode 100644 index 0000000..4b3d10d --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginByGithub.java @@ -0,0 +1,92 @@ +package com.bantanger.design.bridge.bridge.function; + +import com.alibaba.fastjson.JSONObject; +import com.bantanger.design.bridge.bridge.abst.factory.RegisterLoginComponentFactory; +import com.bantanger.design.bridge.respository.UserRepository; +import com.bantanger.design.bridge.respository.dao.UserEntity; +import com.bantanger.design.bridge.utils.HttpClientUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Date; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 21:22 + */ +@Slf4j +@Component +public class RegisterLoginByGithub extends AbstractRegisterLoginFunc implements RegisterLoginFunc { + + @Value("${github.state:}") + private String githubState; + + @Value("${github.token_url:}") + private String githubTokenUrl; + + @Value("${github.user_url:}") + private String githubUserUrl; + + @Value("${github.user_prefix:}") + private String githubUserPrefix; + + @Value("${github.authorize_uri:}") + private String authorizeUri; + + @Resource + private UserRepository userRepository; + + @PostConstruct + private void initFuncMap() { + RegisterLoginComponentFactory.funcMap.put("GITHUB", this); + log.info("请求 Oauth uri 为 {}", authorizeUri); + } + + @Override + public String login3rd(HttpServletRequest request) { + String code = request.getParameter("code"); + String state = request.getParameter("state"); + + // github 回调该接口会携带 state, 防止跨站请求伪造攻击 + if (!githubState.equals(state)) { + log.warn("github 回调地址 state 不一致, 期望: {}, 实际: {}", githubState, state); + throw new UnsupportedOperationException("不是预期 state!"); + } + // 请求 Github 平台获取 Token,并携带 code + String tokenUrl = githubTokenUrl.concat(code); + String tokenResponse = HttpClientUtils.execute2(tokenUrl, HttpMethod.GET); + // 请求用户信息,携带 token + String token = tokenResponse.substring(tokenResponse.indexOf("=") + 1); + JSONObject userInfoResponse = HttpClientUtils.execute(githubUserUrl, token); + + // 获取用户信息,username 加上 GITHUB@ 前缀,密码与 username 一致,这里就不加密了 + String username = githubUserPrefix.concat(String.valueOf(userInfoResponse.get("login"))); + String password = username; + + return autoRegister3rdAndLogin(username, password); + } + + private String autoRegister3rdAndLogin(String username, String password) { + //如果第三方账号已经登录过,则直接登录 + if(super.commonCheckUserExists(username, userRepository)) { + return super.commonLogin(username, password, userRepository); + } + UserEntity userEntity = new UserEntity(); + userEntity.setUserName(username); + userEntity.setPassword(password); + userEntity.setCreateTime(new Date()); + + //如果第三方账号是第一次登录,先进行“自动注册” + super.commonRegister(userEntity, userRepository); + //自动注册完成后,进行登录 + return super.commonLogin(username, password, userRepository); + } + + + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginFunc.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginFunc.java new file mode 100644 index 0000000..bc74ce3 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/bridge/function/RegisterLoginFunc.java @@ -0,0 +1,42 @@ +package com.bantanger.design.bridge.bridge.function; + +import com.bantanger.design.bridge.respository.dao.UserEntity; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 21:04 + */ +public interface RegisterLoginFunc { + + /** + * 账号密码登录 + * @param username + * @param password + * @return + */ + String login(String username, String password); + + /** + * 用户填写表单注册逻辑 + * @param userEntity 用户填写表单构建的实体对象 + * @return + */ + String register(UserEntity userEntity); + + /** + * 第三方登录 + * @param request + * @return + */ + String login3rd(HttpServletRequest request); + + /** + * 检查用户是否存在 + * @param userName + * @return + */ + boolean checkUserExists(String userName); + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/controller/UserController.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/controller/UserController.java new file mode 100644 index 0000000..2dfdb48 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/controller/UserController.java @@ -0,0 +1,46 @@ +package com.bantanger.design.bridge.controller; + +import com.bantanger.design.bridge.respository.dao.UserEntity; +import com.bantanger.design.bridge.service.UserBridgeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:23 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/bridge/v1") +public class UserController { + + private final UserBridgeService userBridgeService; + + @PostMapping("/login") + public String login(String account, String password) { + if (StringUtils.isBlank(account) || StringUtils.isBlank(password)) { + log.error("账号或密码不能为空"); + return "error 500"; + } + log.info("密码加盐处理..."); + return userBridgeService.login(account, password); + } + + @PostMapping("/register") + public String register(@RequestBody UserEntity userEntity) { + return userBridgeService.register(userEntity); + } + + @GetMapping("/github") + public String login3rdByGithub(HttpServletRequest request) { + return userBridgeService.login3rd(request, "GITHUB"); + } + +} + diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/UserRepository.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/UserRepository.java new file mode 100644 index 0000000..4b6c927 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/UserRepository.java @@ -0,0 +1,48 @@ +package com.bantanger.design.bridge.respository; + +import com.bantanger.design.bridge.respository.dao.UserEntity; +import com.bantanger.design.bridge.respository.mapper.UserRegisterLoginMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:44 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class UserRepository { + + private final UserRegisterLoginMapper userRegisterLoginMapper; + + public UserEntity findAccountByUserNameAndPassword(String username, String password) { + Map queryMap = new HashMap<>(); + queryMap.put("username", username); + queryMap.put("password", password); + List userEntities = userRegisterLoginMapper.selectByMap(queryMap); + if (userEntities == null || userEntities.size() == 0) { + return null; + } + return userEntities.get(0); + } + + public UserEntity findAccountByUserName(String username) { + Map queryMap = new HashMap<>(); + queryMap.put("username", username); + List userEntities = userRegisterLoginMapper.selectByMap(queryMap); + if (userEntities == null || userEntities.size() == 0) { + return null; + } + return userEntities.get(0); + } + + public int createAccount(UserEntity userEntity) { + return userRegisterLoginMapper.insert(userEntity); + } +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/dao/UserEntity.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/dao/UserEntity.java new file mode 100644 index 0000000..9fe601e --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/dao/UserEntity.java @@ -0,0 +1,35 @@ +package com.bantanger.design.bridge.respository.dao; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:47 + */ +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@TableName("user") +public class UserEntity { + + @TableId("id") + private String userId; + + @NonNull + @TableField("username") + private String userName; + + @NonNull + private String password; + + private Date createTime; + + private String userEmail; + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/mapper/UserRegisterLoginMapper.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/mapper/UserRegisterLoginMapper.java new file mode 100644 index 0000000..6efb0d5 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/respository/mapper/UserRegisterLoginMapper.java @@ -0,0 +1,14 @@ +package com.bantanger.design.bridge.respository.mapper; + +import com.bantanger.design.bridge.respository.dao.UserEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:46 + */ +@Mapper +public interface UserRegisterLoginMapper extends BaseMapper { + +} diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/service/UserBridgeService.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/service/UserBridgeService.java new file mode 100644 index 0000000..194391a --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/service/UserBridgeService.java @@ -0,0 +1,34 @@ +package com.bantanger.design.bridge.service; + +import com.bantanger.design.bridge.bridge.abst.AbstractRegisterLoginComponent; +import com.bantanger.design.bridge.bridge.abst.factory.RegisterLoginComponentFactory; +import com.bantanger.design.bridge.respository.dao.UserEntity; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 22:17 + */ +@Service +public class UserBridgeService { + + public String login(String account, String password) { + AbstractRegisterLoginComponent component = + RegisterLoginComponentFactory.getComponent("Default"); + return component.login(account, password); + } + + public String register(UserEntity userEntity) { + AbstractRegisterLoginComponent component = + RegisterLoginComponentFactory.getComponent("Default"); + return component.register(userEntity); + } + + public String login3rd(HttpServletRequest request, String type) { + AbstractRegisterLoginComponent component = + RegisterLoginComponentFactory.getComponent(type); + return component.login3rd(request); + } +} diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/utils/HttpClientUtils.java similarity index 91% rename from im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java rename to im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/utils/HttpClientUtils.java index fff0fe0..741df54 100644 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/utils/HttpClientUtils.java +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/java/com/bantanger/design/bridge/utils/HttpClientUtils.java @@ -1,4 +1,4 @@ -package com.bantanger.im.design.adapter.utils; +package com.bantanger.design.bridge.utils; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; @@ -17,7 +17,7 @@ */ @Slf4j public class HttpClientUtils { - public static String execute(String url, String accessToken) { + public static JSONObject execute(String url, String accessToken) { HttpRequestBase http = null; try { HttpClient client = HttpClients.createDefault(); @@ -25,7 +25,7 @@ public static String execute(String url, String accessToken) { http.addHeader("Authorization", "token " + accessToken); HttpEntity entity = client.execute(http).getEntity(); - return EntityUtils.toString(entity); + return JSONObject.parseObject(EntityUtils.toString(entity)); } catch (Exception e) { log.error("请求失败,url 为: {}, 错误信息为 {}", url, e.getMessage()); throw new RuntimeException("请求失败!" + e.getMessage()); diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/application.yml b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/application.yml new file mode 100644 index 0000000..f3bb21d --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/application.yml @@ -0,0 +1,79 @@ +DATABASE: im_register_login_demo +USERNAME: root +#password: whalesharkim +PASSWORD: 123456 +IP: 127.0.0.1:3306 + +spring: +# profiles: +# active: dev + datasource: + driver-class-name: com.mysql.jdbc.Driver + password: 123456 + url: jdbc:mysql://${IP}/${DATABASE}?serverTimezone=UTC&useSSL=false&characterEncoding=UTF8&allowPublicKeyRetrieval=true + username: root + + application: + name: im-register-login-bridge-demo + +github: + state: GITHUB + user_prefix: ${github.state}@ + + # ========= 自己申请 client_id\secret 用完之后记得删除 ========= + client_id: 735c33bd4f1fe621bd03 + client_secret: f3b10f7e941f191b8eeaf0595660103181ab647c + # ========================================================== + + callback: http://localhost:${server.port}/bridge/v1/github # github 回调 callback 会携带 code 参数 + token_url: https://github.com/login/oauth/access_token?client_id=${github.client_id}&client_secret=${github.client_secret}&redirect_uri=${github.callback}&code= # 拼接 code + user_url: https://api.github.com/user # 使用访问令牌访问 API + + authorize_uri: https://github.com/login/oauth/authorize?client_id=${github.client_id}&redirect_uri=${github.callback}&state=${github.state} + +server: + port: 21002 + tomcat: + basedir: ./ + accesslog: + buffered: false + directory: logs + enabled: true + file-date-format: .yyyy-MM-dd + pattern: '%h %l %u %t "%r" %s"%{Referer}i" "%{User-Agent}i" %D %{x-request-id}r %{user-id}r %{resource-id}r' + prefix: access_log + rename-on-rotate: true + request-attributes-enabled: false + rotate: true + suffix: .log + +# logger 配置 +logging: + level: + root: info + com: + bantanger: + im: + design: debug + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + mapper-locations: classpath*:mapper/*.xml + global-config: + db-config: + update-strategy: NOT_EMPTY + type-aliases-package: com.bantanger.im.design + +#mybatis: +# configuration: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +# 配置全局 httpClient 设置 +httpclient: + maxTotal: 100 + defaultMaxPerRoute: 50 + connectTimeout: 2000 + connectionRequestTimeout: 2000 + socketTimeout: 5000 + staleConnectionCheckEnabled: true diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/logback-spring.xml b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..234d177 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/logback-spring.xml @@ -0,0 +1,54 @@ + + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS Z}] [%X{XRequestId}] [%thread] [%level] [%logger{50}] [%msg]%n + + + + + + + + + + + ERROR + DENY + ACCEPT + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS Z}] [%X{XRequestId}] [%thread] [%level] [%logger{50}] [%msg]%n + + + + + + ./../logs/info_register_login_demo.%d.log + + + + + ERROR + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS Z}] [%X{XRequestId}] [%thread] [%level] [%logger{50}] [%msg]%n + + + + + + ./../logs/error_register_login_demo.%d.log + + + + + + + + \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/register_login_demo.sql b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/register_login_demo.sql new file mode 100644 index 0000000..1052a08 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/register_login_demo.sql @@ -0,0 +1,13 @@ +CREATE DATABASE IF NOT EXISTS im_register_login_demo; +USE im_register_login_demo; + +CREATE TABLE user ( + id BIGINT AUTO_INCREMENT + PRIMARY KEY, + username VARCHAR(64), + password VARCHAR(64), + create_time DATE, + user_email VARCHAR(64) +); + +INSERT INTO user (id, username, password, create_time, user_email) VALUES ('10001', 'admin', 'admin', now(), 'admin@edu.com') \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/img.png b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/img.png new file mode 100644 index 0000000000000000000000000000000000000000..e5071879509c98af988a13fcdab43157689598ed GIT binary patch literal 62881 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 z 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 Q4dA8rRQt&nMT@Zi0izZ^3;+NC literal 0 HcmV?d00001 diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/success.png b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/success.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8b0d096bfbd3823fa19c0125626b289c8289cd GIT binary patch literal 27030 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 HnTGuj<#FD? literal 0 HcmV?d00001 diff --git a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/timeout.png b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/timeout.png new file mode 100644 index 0000000000000000000000000000000000000000..b186b7183119b59bff89b4c1875c4232529dfce4 GIT binary patch literal 91470 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�*I&R!~+}mr*AQVM-(2B0Gx#`+@km(_694E=1 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 literal 0 HcmV?d00001 diff --git "a/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/\346\225\260\346\215\256\345\272\223\345\255\230\346\234\211github\350\264\246\345\217\267.png" "b/im-design-demo/im-register-login-demo/login-design-bridge-demo/src/main/resources/static/\346\225\260\346\215\256\345\272\223\345\255\230\346\234\211github\350\264\246\345\217\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..67115341e9fc3409cd8127a19297080fbe58ada4 GIT binary patch literal 15014 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 literal 0 HcmV?d00001 diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/logs/access_log.log b/im-design-demo/im-register-login-demo/login-ordinary-demo/logs/access_log.log new file mode 100644 index 0000000..0e0630b --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/logs/access_log.log @@ -0,0 +1 @@ +127.0.0.1 - - [04/Nov/2023:19:04:40 +0800] "POST /ordinary/v1/login?account=admin&password=admin HTTP/1.1" 200"-" "Apifox/1.0.0 (https://www.apifox.cn)" 227 - - - diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/logs/error_register_login_demo.2023-11-04.log b/im-design-demo/im-register-login-demo/login-ordinary-demo/logs/error_register_login_demo.2023-11-04.log new file mode 100644 index 0000000..e69de29 diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/logs/info_register_login_demo.2023-11-04.log b/im-design-demo/im-register-login-demo/login-ordinary-demo/logs/info_register_login_demo.2023-11-04.log new file mode 100644 index 0000000..815d069 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/logs/info_register_login_demo.2023-11-04.log @@ -0,0 +1,61 @@ +[2023-11-04 19:02:42.436 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [Starting Application on BanTanger with PID 4948 (E:\JavaProjectManager\im-whale-shark\im-design-demo\im-register-login-demo\login-ordinary-demo\target\classes started by 12902 in E:\JavaProjectManager\im-whale-shark)] +[2023-11-04 19:02:42.436 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [No active profile set, falling back to default profiles: default] +[2023-11-04 19:02:43.191 +0800] [] [main] [INFO] [o.s.boot.web.embedded.tomcat.TomcatWebServer] [Tomcat initialized with port(s): 21000 (http)] +[2023-11-04 19:02:43.194 +0800] [] [main] [INFO] [org.apache.coyote.http11.Http11NioProtocol] [Initializing ProtocolHandler ["http-nio-21000"]] +[2023-11-04 19:02:43.194 +0800] [] [main] [INFO] [org.apache.catalina.core.StandardService] [Starting service [Tomcat]] +[2023-11-04 19:02:43.194 +0800] [] [main] [INFO] [org.apache.catalina.core.StandardEngine] [Starting Servlet engine: [Apache Tomcat/9.0.37]] +[2023-11-04 19:02:43.255 +0800] [] [main] [INFO] [o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]] [Initializing Spring embedded WebApplicationContext] +[2023-11-04 19:02:43.255 +0800] [] [main] [INFO] [o.s.b.w.s.c.ServletWebServerApplicationContext] [Root WebApplicationContext: initialization completed in 787 ms] +[2023-11-04 19:02:43.822 +0800] [] [main] [INFO] [o.s.scheduling.concurrent.ThreadPoolTaskExecutor] [Initializing ExecutorService 'applicationTaskExecutor'] +[2023-11-04 19:02:43.932 +0800] [] [main] [INFO] [org.apache.coyote.http11.Http11NioProtocol] [Starting ProtocolHandler ["http-nio-21000"]] +[2023-11-04 19:02:43.947 +0800] [] [main] [INFO] [o.s.boot.web.embedded.tomcat.TomcatWebServer] [Tomcat started on port(s): 21000 (http) with context path ''] +[2023-11-04 19:02:43.995 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [Started Application in 2.2 seconds (JVM running for 3.062)] +[2023-11-04 19:04:40.126 +0800] [] [http-nio-21000-exec-1] [INFO] [o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]] [Initializing Spring DispatcherServlet 'dispatcherServlet'] +[2023-11-04 19:04:40.127 +0800] [] [http-nio-21000-exec-1] [INFO] [org.springframework.web.servlet.DispatcherServlet] [Initializing Servlet 'dispatcherServlet'] +[2023-11-04 19:04:40.131 +0800] [] [http-nio-21000-exec-1] [INFO] [org.springframework.web.servlet.DispatcherServlet] [Completed initialization in 4 ms] +[2023-11-04 19:04:40.156 +0800] [] [http-nio-21000-exec-1] [INFO] [c.b.design.ordinary.controller.UserController] [密码加盐处理...] +[2023-11-04 19:04:40.187 +0800] [] [http-nio-21000-exec-1] [INFO] [com.zaxxer.hikari.HikariDataSource] [HikariPool-1 - Starting...] +[2023-11-04 19:04:40.293 +0800] [] [http-nio-21000-exec-1] [INFO] [com.zaxxer.hikari.HikariDataSource] [HikariPool-1 - Start completed.] +[2023-11-04 19:04:40.322 +0800] [] [http-nio-21000-exec-1] [INFO] [c.b.design.ordinary.service.UserServiceImpl] [用户 admin 登录成功] +[2023-11-04 19:53:26.115 +0800] [] [SpringContextShutdownHook] [INFO] [o.s.scheduling.concurrent.ThreadPoolTaskExecutor] [Shutting down ExecutorService 'applicationTaskExecutor'] +[2023-11-04 19:53:26.115 +0800] [] [SpringContextShutdownHook] [INFO] [com.zaxxer.hikari.HikariDataSource] [HikariPool-1 - Shutdown initiated...] +[2023-11-04 19:53:26.115 +0800] [] [SpringContextShutdownHook] [INFO] [com.zaxxer.hikari.HikariDataSource] [HikariPool-1 - Shutdown completed.] +[2023-11-04 19:53:29.402 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [Starting Application on BanTanger with PID 23660 (E:\JavaProjectManager\im-whale-shark\im-design-demo\im-register-login-demo\login-ordinary-demo\target\classes started by 12902 in E:\JavaProjectManager\im-whale-shark)] +[2023-11-04 19:53:29.402 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [No active profile set, falling back to default profiles: default] +[2023-11-04 19:53:30.239 +0800] [] [main] [INFO] [o.s.boot.web.embedded.tomcat.TomcatWebServer] [Tomcat initialized with port(s): 21000 (http)] +[2023-11-04 19:53:30.239 +0800] [] [main] [INFO] [org.apache.coyote.http11.Http11NioProtocol] [Initializing ProtocolHandler ["http-nio-21000"]] +[2023-11-04 19:53:30.239 +0800] [] [main] [INFO] [org.apache.catalina.core.StandardService] [Starting service [Tomcat]] +[2023-11-04 19:53:30.239 +0800] [] [main] [INFO] [org.apache.catalina.core.StandardEngine] [Starting Servlet engine: [Apache Tomcat/9.0.37]] +[2023-11-04 19:53:30.301 +0800] [] [main] [INFO] [o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]] [Initializing Spring embedded WebApplicationContext] +[2023-11-04 19:53:30.317 +0800] [] [main] [INFO] [o.s.b.w.s.c.ServletWebServerApplicationContext] [Root WebApplicationContext: initialization completed in 883 ms] +[2023-11-04 19:53:30.837 +0800] [] [main] [INFO] [o.s.scheduling.concurrent.ThreadPoolTaskExecutor] [Initializing ExecutorService 'applicationTaskExecutor'] +[2023-11-04 19:53:30.949 +0800] [] [main] [INFO] [org.apache.coyote.http11.Http11NioProtocol] [Starting ProtocolHandler ["http-nio-21000"]] +[2023-11-04 19:53:31.017 +0800] [] [main] [INFO] [o.s.boot.web.embedded.tomcat.TomcatWebServer] [Tomcat started on port(s): 21000 (http) with context path ''] +[2023-11-04 19:53:31.028 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [Started Application in 2.301 seconds (JVM running for 3.185)] +[2023-11-04 19:53:53.591 +0800] [] [SpringContextShutdownHook] [INFO] [o.s.scheduling.concurrent.ThreadPoolTaskExecutor] [Shutting down ExecutorService 'applicationTaskExecutor'] +[2023-11-04 19:53:56.330 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [Starting Application on BanTanger with PID 2576 (E:\JavaProjectManager\im-whale-shark\im-design-demo\im-register-login-demo\login-ordinary-demo\target\classes started by 12902 in E:\JavaProjectManager\im-whale-shark)] +[2023-11-04 19:53:56.343 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [No active profile set, falling back to default profiles: default] +[2023-11-04 19:53:57.115 +0800] [] [main] [INFO] [o.s.boot.web.embedded.tomcat.TomcatWebServer] [Tomcat initialized with port(s): 21000 (http)] +[2023-11-04 19:53:57.115 +0800] [] [main] [INFO] [org.apache.coyote.http11.Http11NioProtocol] [Initializing ProtocolHandler ["http-nio-21000"]] +[2023-11-04 19:53:57.131 +0800] [] [main] [INFO] [org.apache.catalina.core.StandardService] [Starting service [Tomcat]] +[2023-11-04 19:53:57.131 +0800] [] [main] [INFO] [org.apache.catalina.core.StandardEngine] [Starting Servlet engine: [Apache Tomcat/9.0.37]] +[2023-11-04 19:53:57.179 +0800] [] [main] [INFO] [o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]] [Initializing Spring embedded WebApplicationContext] +[2023-11-04 19:53:57.179 +0800] [] [main] [INFO] [o.s.b.w.s.c.ServletWebServerApplicationContext] [Root WebApplicationContext: initialization completed in 788 ms] +[2023-11-04 19:53:57.748 +0800] [] [main] [INFO] [o.s.scheduling.concurrent.ThreadPoolTaskExecutor] [Initializing ExecutorService 'applicationTaskExecutor'] +[2023-11-04 19:53:57.857 +0800] [] [main] [INFO] [org.apache.coyote.http11.Http11NioProtocol] [Starting ProtocolHandler ["http-nio-21000"]] +[2023-11-04 19:53:57.874 +0800] [] [main] [INFO] [o.s.boot.web.embedded.tomcat.TomcatWebServer] [Tomcat started on port(s): 21000 (http) with context path ''] +[2023-11-04 19:53:57.921 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [Started Application in 2.149 seconds (JVM running for 2.993)] +[2023-11-04 19:54:12.305 +0800] [] [SpringContextShutdownHook] [INFO] [o.s.scheduling.concurrent.ThreadPoolTaskExecutor] [Shutting down ExecutorService 'applicationTaskExecutor'] +[2023-11-04 19:54:15.127 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [Starting Application on BanTanger with PID 20236 (E:\JavaProjectManager\im-whale-shark\im-design-demo\im-register-login-demo\login-ordinary-demo\target\classes started by 12902 in E:\JavaProjectManager\im-whale-shark)] +[2023-11-04 19:54:15.131 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [No active profile set, falling back to default profiles: default] +[2023-11-04 19:54:15.926 +0800] [] [main] [INFO] [o.s.boot.web.embedded.tomcat.TomcatWebServer] [Tomcat initialized with port(s): 21000 (http)] +[2023-11-04 19:54:15.942 +0800] [] [main] [INFO] [org.apache.coyote.http11.Http11NioProtocol] [Initializing ProtocolHandler ["http-nio-21000"]] +[2023-11-04 19:54:15.942 +0800] [] [main] [INFO] [org.apache.catalina.core.StandardService] [Starting service [Tomcat]] +[2023-11-04 19:54:15.942 +0800] [] [main] [INFO] [org.apache.catalina.core.StandardEngine] [Starting Servlet engine: [Apache Tomcat/9.0.37]] +[2023-11-04 19:54:15.989 +0800] [] [main] [INFO] [o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]] [Initializing Spring embedded WebApplicationContext] +[2023-11-04 19:54:15.989 +0800] [] [main] [INFO] [o.s.b.w.s.c.ServletWebServerApplicationContext] [Root WebApplicationContext: initialization completed in 817 ms] +[2023-11-04 19:54:16.511 +0800] [] [main] [INFO] [o.s.scheduling.concurrent.ThreadPoolTaskExecutor] [Initializing ExecutorService 'applicationTaskExecutor'] +[2023-11-04 19:54:16.605 +0800] [] [main] [INFO] [org.apache.coyote.http11.Http11NioProtocol] [Starting ProtocolHandler ["http-nio-21000"]] +[2023-11-04 19:54:16.674 +0800] [] [main] [INFO] [o.s.boot.web.embedded.tomcat.TomcatWebServer] [Tomcat started on port(s): 21000 (http) with context path ''] +[2023-11-04 19:54:16.684 +0800] [] [main] [INFO] [com.bantanger.design.ordinary.Application] [Started Application in 2.189 seconds (JVM running for 3.06)] +[2023-11-04 21:01:04.311 +0800] [] [SpringContextShutdownHook] [INFO] [o.s.scheduling.concurrent.ThreadPoolTaskExecutor] [Shutting down ExecutorService 'applicationTaskExecutor'] diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/pom.xml b/im-design-demo/im-register-login-demo/login-ordinary-demo/pom.xml new file mode 100644 index 0000000..59901b5 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/pom.xml @@ -0,0 +1,19 @@ + + + + im-register-login-demo + com.bantanger + 1.0-SNAPSHOT + + 4.0.0 + + login-ordinary-demo + + + 8 + 8 + + + \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/Application.java b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/Application.java new file mode 100644 index 0000000..f1397c4 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/Application.java @@ -0,0 +1,17 @@ +package com.bantanger.design.ordinary; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 8:39 + */ +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/controller/UserController.java b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/controller/UserController.java new file mode 100644 index 0000000..e5a78a8 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/controller/UserController.java @@ -0,0 +1,41 @@ +package com.bantanger.design.ordinary.controller; + +import com.bantanger.design.ordinary.respository.dao.UserEntity; +import com.bantanger.design.ordinary.service.UserService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +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; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:23 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/ordinary/v1") +public class UserController { + + private final UserService userServiceImpl; + + @PostMapping("/login") + public String login(String account, String password) { + if (StringUtils.isBlank(account) || StringUtils.isBlank(password)) { + log.error("账号或密码不能为空"); + return "error 500"; + } + log.info("密码加盐处理..."); + return userServiceImpl.login(account, password); + } + + @PostMapping("/register") + public String register(@RequestBody UserEntity userEntity) { + return userServiceImpl.register(userEntity); + } + +} + diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/UserRepository.java b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/UserRepository.java new file mode 100644 index 0000000..00bdf32 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/UserRepository.java @@ -0,0 +1,48 @@ +package com.bantanger.design.ordinary.respository; + +import com.bantanger.design.ordinary.respository.mapper.UserRegisterLoginMapper; +import com.bantanger.design.ordinary.respository.dao.UserEntity; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:44 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class UserRepository { + + private final UserRegisterLoginMapper userRegisterLoginMapper; + + public UserEntity findAccountByUserNameAndPassword(String username, String password) { + Map queryMap = new HashMap<>(); + queryMap.put("username", username); + queryMap.put("password", password); + List userEntities = userRegisterLoginMapper.selectByMap(queryMap); + if (userEntities == null || userEntities.size() == 0) { + return null; + } + return userEntities.get(0); + } + + public UserEntity findAccountByUserName(String username) { + Map queryMap = new HashMap<>(); + queryMap.put("username", username); + List userEntities = userRegisterLoginMapper.selectByMap(queryMap); + if (userEntities == null || userEntities.size() == 0) { + return null; + } + return userEntities.get(0); + } + + public int createAccount(UserEntity userEntity) { + return userRegisterLoginMapper.insert(userEntity); + } +} diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/dao/UserEntity.java b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/dao/UserEntity.java new file mode 100644 index 0000000..4f57094 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/dao/UserEntity.java @@ -0,0 +1,35 @@ +package com.bantanger.design.ordinary.respository.dao; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:47 + */ +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@TableName("user") +public class UserEntity { + + @TableId("id") + private String userId; + + @NonNull + @TableField("username") + private String userName; + + @NonNull + private String password; + + private Date createTime; + + private String userEmail; + +} diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/mapper/UserRegisterLoginMapper.java b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/mapper/UserRegisterLoginMapper.java new file mode 100644 index 0000000..0983751 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/respository/mapper/UserRegisterLoginMapper.java @@ -0,0 +1,14 @@ +package com.bantanger.design.ordinary.respository.mapper; + +import com.bantanger.design.ordinary.respository.dao.UserEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:46 + */ +@Mapper +public interface UserRegisterLoginMapper extends BaseMapper { + +} diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserLogin3rdServiceImpl.java b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserLogin3rdServiceImpl.java new file mode 100644 index 0000000..b9c313f --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserLogin3rdServiceImpl.java @@ -0,0 +1,55 @@ +package com.bantanger.design.ordinary.service; + +import com.bantanger.design.ordinary.respository.dao.UserEntity; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 17:09 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class UserLogin3rdServiceImpl implements UserService { + + /** + * 可以看到我们这个类其实是想实现第三方接口相关的逻辑, + * 但由于继承了 UserService 接口,不得不实现它的所有方法 + * 有没有什么更好的方式呢,往接口里加 default 固然是种选择,但这就有点违背接口的本意 + * + * 接口的本意是子类实现它的所有方法,若接口新增方法,所有子类没有实现就会产生编译错误爆红 + * 这样的意义是为了让我们知道到底有那些子类还没有实现方法 + */ + + @Override + public String login(String username, String password) { + return null; + } + + @Override + public String register(UserEntity userEntity) { + return null; + } + + @Override + public String loginByGithub(String code, String state) { + log.info("使用 github 登录..."); + // 逻辑写在 adapter、bridge, 这里就不写了 + return "Success!!!"; + } + + @Override + public String loginByWechat() { + log.info("使用微信扫码登录..."); + return "Success!!!"; + } + + @Override + public String loginByQQ() { + log.info("使用 QQ 登录..."); + return "Success!!!"; + } + +} diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserService.java b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserService.java new file mode 100644 index 0000000..88756b7 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserService.java @@ -0,0 +1,45 @@ +package com.bantanger.design.ordinary.service; + +import com.bantanger.design.ordinary.respository.dao.UserEntity; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/4 17:03 + */ +public interface UserService { + + /** + * 账号密码登录 + * @param username + * @param password + * @return + */ + String login(String username, String password); + + /** + * 用户填写表单注册逻辑 + * @param userEntity 用户填写表单构建的实体对象 + * @return + */ + String register(UserEntity userEntity); + + /** + * 第三方登录:github + * @param code + * @param state + * @return + */ + String loginByGithub(String code, String state); + + /** + * 第三方登录:微信 + * @return + */ + String loginByWechat(); + + /** + * 第三方登录:qq + * @return + */ + String loginByQQ(); +} diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserServiceImpl.java b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserServiceImpl.java new file mode 100644 index 0000000..9f19249 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/java/com/bantanger/design/ordinary/service/UserServiceImpl.java @@ -0,0 +1,78 @@ +package com.bantanger.design.ordinary.service; + +import com.bantanger.design.ordinary.respository.UserRepository; +import com.bantanger.design.ordinary.respository.dao.UserEntity; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * @author BanTanger 半糖 + * @Date 2023/11/3 23:45 + */ +@Slf4j +@Primary +@Service +@RequiredArgsConstructor +public class UserServiceImpl implements UserService { + + private final UserRepository userRepository; + + @Override + public String login(String username, String password) { + UserEntity user = userRepository.findAccountByUserNameAndPassword(username, password); + if (user == null) { + log.warn("账号密码错误, 您输入的账号为 {} ", username); + return "Login Fail"; + } + log.info("用户 {} 登录成功", username); + return "Login Success, username: " + username; + } + + @Override + public String register(UserEntity userEntity) { + if (checkUserExists(userEntity.getUserName())) { + log.info("{} 用户已存在", userEntity.getUserName()); + throw new RuntimeException("用户已存在"); + } + userEntity.setCreateTime(new Date()); + int row = userRepository.createAccount(userEntity); + if (row <= 0) { + log.error("创建用户失败"); + } + log.info("用户 {} 创建成功", userEntity.getUserName()); + return "Register Success, username: " + userEntity.getUserName(); + } + + @Override + public String loginByGithub(String code, String state) { + log.info("使用 github 登录..."); + // 逻辑写在 adapter、bridge, 这里就不写了 + return null; + } + + @Override + public String loginByWechat() { + return null; + } + + @Override + public String loginByQQ() { + return null; + } + + public boolean checkUserExists(String username) { + UserEntity user = userRepository.findAccountByUserName(username); + if (user == null) { + log.warn("不存在 {} 用户,请注册", username); + log.info("重定向到 index 页面进行注册逻辑 ..."); + return false; + } + log.info("用户 {} 存在", username); + return true; + } +} + diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/resources/application.yml b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/resources/application.yml new file mode 100644 index 0000000..01732d0 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/resources/application.yml @@ -0,0 +1,51 @@ +db: + database: im_register_login_demo + username: root + #password: whalesharkim + password: 123456 + ip: 127.0.0.1:3306 + +spring: + datasource: + driver-class-name: com.mysql.jdbc.Driver + password: ${db.password} + url: jdbc:mysql://${db.ip}/${db.database}?serverTimezone=UTC&useSSL=false&characterEncoding=UTF8&allowPublicKeyRetrieval=true + username: ${db.username} + +server: + port: 21000 + tomcat: + basedir: ./ + accesslog: + buffered: false + directory: im-design-demo/im-register-login-demo/login-ordinary-demo/logs + enabled: true + file-date-format: .yyyy-MM-dd + pattern: '%h %l %u %t "%r" %s"%{Referer}i" "%{User-Agent}i" %D %{x-request-id}r %{user-id}r %{resource-id}r' + prefix: access_log + rename-on-rotate: true + request-attributes-enabled: false + rotate: true + suffix: .log + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + mapper-locations: classpath*:mapper/*.xml + global-config: + db-config: + update-strategy: NOT_EMPTY + type-aliases-package: com.bantanger.design.ordinary + +#mybatis: +# configuration: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +# 配置全局 httpClient 设置 +httpclient: + maxTotal: 100 + defaultMaxPerRoute: 50 + connectTimeout: 2000 + connectionRequestTimeout: 2000 + socketTimeout: 5000 + staleConnectionCheckEnabled: true diff --git a/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/resources/logback-spring.xml b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..9305d47 --- /dev/null +++ b/im-design-demo/im-register-login-demo/login-ordinary-demo/src/main/resources/logback-spring.xml @@ -0,0 +1,54 @@ + + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS Z}] [%X{XRequestId}] [%thread] [%level] [%logger{50}] [%msg]%n + + + + + + + + + + + ERROR + DENY + ACCEPT + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS Z}] [%X{XRequestId}] [%thread] [%level] [%logger{50}] [%msg]%n + + + + + + im-design-demo/im-register-login-demo/login-ordinary-demo/logs/info_register_login_demo.%d.log + + + + + ERROR + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS Z}] [%X{XRequestId}] [%thread] [%level] [%logger{50}] [%msg]%n + + + + + + im-design-demo/im-register-login-demo/login-ordinary-demo/logs/error_register_login_demo.%d.log + + + + + + + + \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/pom.xml b/im-design-demo/im-register-login-demo/pom.xml index 143036e..0ae936c 100644 --- a/im-design-demo/im-register-login-demo/pom.xml +++ b/im-design-demo/im-register-login-demo/pom.xml @@ -3,6 +3,12 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + pom + + login-ordinary-demo + login-design-adapter-demo + login-design-bridge-demo + im-design-demo @@ -17,4 +23,65 @@ im-register-login-demo + + + + org.springframework.boot + spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.projectlombok + lombok + + + + + com.alibaba + fastjson + 2.0.32 + + + + + org.apache.httpcomponents + httpclient + + + + + org.springframework.boot + spring-boot-starter-jdbc + 2.2.1.RELEASE + + + + + mysql + mysql-connector-java + runtime + 5.1.34 + + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.2 + + + com.github.jeffreyning + mybatisplus-plus + 1.5.1-RELEASE + + + + \ No newline at end of file diff --git a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md b/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md deleted file mode 100644 index 64565df..0000000 --- a/im-design-demo/im-register-login-demo/src/main/java/com/bantanger/im/design/adapter/Login3rd.md +++ /dev/null @@ -1,43 +0,0 @@ -# 第三方登录的实现 - -参考这篇文章: - -[官方文档](https://docs.github.com/zh/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) - -[github第三方登录超详细流程及分析(小白笔记)](https://blog.csdn.net/qq_43516238/article/details/105884926) - -[GitHub OAuth 第三方登录示例教程 - 阮一峰的网络日志](https://ruanyifeng.com/blog/2019/04/github-oauth.html) - -```yml -client_id: cf00a9382ce8110c2a70 -client_secret: fd348b2050f64c7a99c07294b390a5adfaa21e8c -redirect_uri: http://localhost:21001/github -``` - -导入依赖 -```xml - - org.springframework.boot - spring-boot-starter-oauth2-client - -``` - -yml 配置 -```yml -spring: - security: - oauth2: - client: - registration: - github: - clientId: **************** - clientSecret: **************** -``` - -![img.png](../../../../../../resources/static/img.png) - -权限访问: -https://github.com/login/oauth/authorize?client_id=cf00a9382ce8110c2a70&redirect_uri=http://localhost:21001/github&state=GITHUB - -可能会出现超时的情况 -![img.png](img.png) \ No newline at end of file diff --git a/im-design-demo/pom.xml b/im-design-demo/pom.xml index a17c516..9f52635 100644 --- a/im-design-demo/pom.xml +++ b/im-design-demo/pom.xml @@ -22,65 +22,4 @@ im-register-login-demo - - - - org.springframework.boot - spring-boot-starter - - - - - org.springframework.boot - spring-boot-starter-web - - - - - org.projectlombok - lombok - - - - - com.alibaba - fastjson - 2.0.32 - - - - - org.apache.httpcomponents - httpclient - - - - - org.springframework.boot - spring-boot-starter-jdbc - 2.2.1.RELEASE - - - - - mysql - mysql-connector-java - runtime - 5.1.34 - - - - - com.baomidou - mybatis-plus-boot-starter - 3.4.2 - - - com.github.jeffreyning - mybatisplus-plus - 1.5.1-RELEASE - - - - \ No newline at end of file