From e03a71776afb4fce0a909ef45764c6d694356985 Mon Sep 17 00:00:00 2001
From: barney <15270405776@163.com>
Date: Sat, 10 Sep 2022 22:15:18 +0800
Subject: [PATCH] =?UTF-8?q?10.3=20AcApp=E4=B8=8EWeb=E7=AB=AF=E7=9A=84?=
=?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E6=8E=88=E6=9D=83=E7=99=BB=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
acapp/src/App.vue | 47 +++---
acapp/src/store/user.js | 1 +
backendCloud/backend/pom.xml | 14 ++
.../kob/backend/config/SecurityConfig.java | 7 +-
.../user/account/acwing/AcappController.java | 31 ++++
.../user/account/acwing/WebController.java | 27 ++++
.../main/java/com/kob/backend/pojo/User.java | 1 +
.../user/account/RegisterServiceImpl.java | 2 +-
.../user/account/acwing/AcappServiceImpl.java | 136 +++++++++++++++++
.../user/account/acwing/WebServiceImpl.java | 138 ++++++++++++++++++
.../account/acwing/utils/HttpClientUtil.java | 38 +++++
.../user/account/acwing/AcappService.java | 8 +
.../user/account/acwing/WebService.java | 8 +
.../src/main/resources/application.properties | 5 +-
web/src/components/NavBar.vue | 3 +
web/src/router/index.js | 11 +-
web/src/views/record/RecordIndexView.vue | 3 +-
.../user/account/UserAcWingCodeIndex.vue | 42 ++++++
web/src/views/user/account/UserLoginView.vue | 18 +++
19 files changed, 517 insertions(+), 23 deletions(-)
create mode 100644 backendCloud/backend/src/main/java/com/kob/backend/controller/user/account/acwing/AcappController.java
create mode 100644 backendCloud/backend/src/main/java/com/kob/backend/controller/user/account/acwing/WebController.java
create mode 100644 backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/AcappServiceImpl.java
create mode 100644 backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/WebServiceImpl.java
create mode 100644 backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/utils/HttpClientUtil.java
create mode 100644 backendCloud/backend/src/main/java/com/kob/backend/service/user/account/acwing/AcappService.java
create mode 100644 backendCloud/backend/src/main/java/com/kob/backend/service/user/account/acwing/WebService.java
create mode 100644 web/src/views/user/account/UserAcWingCodeIndex.vue
diff --git a/acapp/src/App.vue b/acapp/src/App.vue
index b24a917..c3c5f0e 100644
--- a/acapp/src/App.vue
+++ b/acapp/src/App.vue
@@ -17,6 +17,7 @@ import RanklistIndexView from "./views/ranklist/RanklistIndexView.vue";
import RecordIndexView from "@/views/record/RecordIndexView.vue";
import RecordContentView from "@/views/record/RecordContentView.vue";
import UserBotIndexView from "@/views/user/bot/UserBotIndexView.vue";
+import $ from 'jquery';
export default {
components: {
@@ -29,23 +30,35 @@ export default {
},
setup() {
const store = useStore();
- // 如果localStorage中保存了token,那就读取出来并和后端信息比对,比对成功进入首页
- const jwt_token =
- "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI0YTMyOTdhYzE0YmY0ZDVkYmU2ODAxZDVkNTk3ODhiYyIsInN1YiI6IjEiLCJpc3MiOiJzZyIsImlhdCI6MTY2MjYyMTAwNCwiZXhwIjoxNjYzODMwNjA0fQ.rKZG8n3U_U50Aql25nB2k27cZWtxSpE4__a8bnSP3Fs";
- if (jwt_token) {
- store.commit("updateToken", jwt_token);
- store.dispatch("getInfo", {
- // 向后端请求信息
- success() {
- store.commit("updatePullingInfo", false);
- },
- error() {
- store.commit("updatePullingInfo", false);
- },
- });
- } else {
- store.commit("updatePullingInfo", false);
- }
+
+ $.ajax({
+ url: "https://kob.bnblogs.cc/api/user/account/acwing/acapp/apply_code/",
+ type: "GET",
+ success: resp => {
+ if (resp.result === "success") {
+ store.state.user.AcWingOS.api.oauth2.authorize(resp.appid, resp.redirect_uri, resp.scope, resp.state, resp => {
+ if (resp.result === "success") {
+ const jwt_token = resp.jwt_token;
+ store.commit("updateToken", jwt_token);
+ store.dispatch("getInfo", {
+ // 向后端请求信息
+ success() {
+ store.commit("updatePullingInfo", false);
+ },
+ error() {
+ store.commit("updatePullingInfo", false);
+ },
+ });
+ }else {
+ store.state.user.AcWingOS.api.window.close(); // 关闭acwing窗口
+ }
+ });
+ }
+ else {
+ store.state.user.AcWingOS.api.window.close(); // 关闭acwing窗口
+ }
+ }
+ });
},
};
diff --git a/acapp/src/store/user.js b/acapp/src/store/user.js
index e27b62b..e5fb65f 100644
--- a/acapp/src/store/user.js
+++ b/acapp/src/store/user.js
@@ -8,6 +8,7 @@ export default {
token: "",
is_login: false, // 默认未登录状态
pulling_info: true, // 是否正在拉取信息
+ AcWingOS: "AcWingOS",
},
getters: {
},
diff --git a/backendCloud/backend/pom.xml b/backendCloud/backend/pom.xml
index 9e02d68..e96e317 100644
--- a/backendCloud/backend/pom.xml
+++ b/backendCloud/backend/pom.xml
@@ -99,6 +99,20 @@
spring-boot-starter-test
test
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.13
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+ 2.7.3
+
+
+
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/config/SecurityConfig.java b/backendCloud/backend/src/main/java/com/kob/backend/config/SecurityConfig.java
index 1c4dbf6..ecb5d8a 100644
--- a/backendCloud/backend/src/main/java/com/kob/backend/config/SecurityConfig.java
+++ b/backendCloud/backend/src/main/java/com/kob/backend/config/SecurityConfig.java
@@ -43,7 +43,12 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
- .antMatchers("/api/user/account/token/", "/api/user/account/register/").permitAll()
+ .antMatchers("/api/user/account/token/",
+ "/api/user/account/register/",
+ "/api/user/account/acwing/web/apply_code/",
+ "/api/user/account/acwing/web/receive_code/",
+ "/api/user/account/acwing/acapp/apply_code/",
+ "/api/user/account/acwing/acapp/receive_code/").permitAll()
.antMatchers("/pk/start/game/").hasIpAddress("127.0.0.1")
.antMatchers("/pk/receive/bot/move/").hasIpAddress("127.0.0.1")
.antMatchers(HttpMethod.OPTIONS).permitAll()
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/controller/user/account/acwing/AcappController.java b/backendCloud/backend/src/main/java/com/kob/backend/controller/user/account/acwing/AcappController.java
new file mode 100644
index 0000000..ad7c71c
--- /dev/null
+++ b/backendCloud/backend/src/main/java/com/kob/backend/controller/user/account/acwing/AcappController.java
@@ -0,0 +1,31 @@
+package com.kob.backend.controller.user.account.acwing;
+
+import com.alibaba.fastjson.JSONObject;
+import com.kob.backend.service.user.account.acwing.AcappService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+public class AcappController {
+ @Autowired
+ private AcappService acappService;
+
+ @GetMapping("/api/user/account/acwing/acapp/apply_code/")
+ public JSONObject applyCode() {
+ return acappService.applyCode();
+ }
+
+ @GetMapping("/api/user/account/acwing/acapp/receive_code/")
+ public JSONObject receiveCode(@RequestParam Map data) {
+ String code = data.get("code");
+ String state = data.get("state");
+ return acappService.receiveCode(code,state);
+ }
+
+
+}
+
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/controller/user/account/acwing/WebController.java b/backendCloud/backend/src/main/java/com/kob/backend/controller/user/account/acwing/WebController.java
new file mode 100644
index 0000000..5c3ea9f
--- /dev/null
+++ b/backendCloud/backend/src/main/java/com/kob/backend/controller/user/account/acwing/WebController.java
@@ -0,0 +1,27 @@
+package com.kob.backend.controller.user.account.acwing;
+
+import com.alibaba.fastjson.JSONObject;
+import com.kob.backend.service.user.account.acwing.WebService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+public class WebController {
+ @Autowired
+ private WebService webService;
+
+ @GetMapping("/api/user/account/acwing/web/apply_code/")
+ public JSONObject applyCode() {
+ return webService.applyCode();
+ }
+ @GetMapping("/api/user/account/acwing/web/receive_code/")
+ public JSONObject receiveCode(@RequestParam Map data) {
+ String code = data.get("code");
+ String state = data.get("state");
+ return webService.receiveCode(code,state);
+ }
+}
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/pojo/User.java b/backendCloud/backend/src/main/java/com/kob/backend/pojo/User.java
index 037cfc0..46f8902 100644
--- a/backendCloud/backend/src/main/java/com/kob/backend/pojo/User.java
+++ b/backendCloud/backend/src/main/java/com/kob/backend/pojo/User.java
@@ -26,4 +26,5 @@ public class User {
private String password;
private String photo;
private Integer rating;
+ private String openid;
}
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/RegisterServiceImpl.java b/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/RegisterServiceImpl.java
index 15615a8..287208f 100644
--- a/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/RegisterServiceImpl.java
+++ b/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/RegisterServiceImpl.java
@@ -76,7 +76,7 @@ public class RegisterServiceImpl implements RegisterService {
// 将用户密码加密
String encodedPassword = passwordEncoder.encode(password);
String photo = "https://cdn.acwing.com/media/user/profile/photo/41648_lg_8d1ad446b6.jpg";
- User user = new User(null,username,encodedPassword,photo,1500);
+ User user = new User(null,username,encodedPassword,photo,1500,null);
// 将用户数据存入数据库
userMapper.insert(user);
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/AcappServiceImpl.java b/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/AcappServiceImpl.java
new file mode 100644
index 0000000..7aedac4
--- /dev/null
+++ b/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/AcappServiceImpl.java
@@ -0,0 +1,136 @@
+package com.kob.backend.service.impl.user.account.acwing;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.kob.backend.mapper.UserMapper;
+import com.kob.backend.pojo.User;
+import com.kob.backend.service.impl.user.account.acwing.utils.HttpClientUtil;
+import com.kob.backend.service.user.account.acwing.AcappService;
+import com.kob.backend.utils.JwtUtil;
+import org.apache.http.NameValuePair;
+import org.apache.http.message.BasicNameValuePair;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+
+@Service
+public class AcappServiceImpl implements AcappService {
+ private static final String appId = "3357";
+ private static final String appSecret = "f343ff7eeaa649d2a257bffac0a9323a";
+ private static final String redirectUri = "https://kob.bnblogs.cc/api/user/account/acwing/acapp/receive_code/";
+ private static final String applyAccessTokenUrl = "https://www.acwing.com/third_party/api/oauth2/access_token/";
+ private static final String getUserInfoUrl = "https://www.acwing.com/third_party/api/meta/identity/getinfo/";
+ private static final Random random = new Random();
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+ @Override
+ public JSONObject applyCode() {
+ JSONObject resp = new JSONObject();
+ resp.put("appid",appId);
+ try {
+ resp.put("redirect_uri", URLEncoder.encode(redirectUri,"UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ resp.put("result","failed");
+ return resp;
+ }
+
+ resp.put("scope","userinfo");
+
+ StringBuilder state = new StringBuilder();
+ for (int i = 0; i < 10; i++) {
+ state.append((char)(random.nextInt(10) + '0')); // 十位随机数字字符串
+ }
+ resp.put("state",state.toString());
+ resp.put("result","success");
+ redisTemplate.opsForValue().set(state.toString(),"true"); // 将state值存入redis
+ redisTemplate.expire(state.toString(), Duration.ofMinutes(10)); // 设置过期时间为10分钟
+ return resp;
+ }
+
+ @Override
+ public JSONObject receiveCode(String code, String state) {
+ JSONObject resp = new JSONObject();
+ resp.put("result","failed");
+ if (code == null || state == null) return resp; // 传入的code和state为空
+ if (Boolean.FALSE.equals(redisTemplate.hasKey(state))) return resp; // redis中没有该state
+ redisTemplate.delete(state); // 删除该state,只使用一次
+
+ // 获取accessToken
+ List nameValuePairs = new LinkedList<>();
+ nameValuePairs.add(new BasicNameValuePair("appid",appId));
+ nameValuePairs.add(new BasicNameValuePair("secret",appSecret));
+ nameValuePairs.add(new BasicNameValuePair("code",code));
+
+ String getString = HttpClientUtil.get(applyAccessTokenUrl,nameValuePairs); // 请求结果存入一个字符串
+
+ if (getString == null) return resp;
+
+ JSONObject getResp = JSONObject.parseObject(getString);
+ String accessToken = getResp.getString("access_token");
+ String openId = getResp.getString("openid");
+
+ if (accessToken == null || openId == null) return resp;
+
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.eq("openid",openId);
+ List users = userMapper.selectList(qw); // 查询满足openid的用户是否存在
+ if (!users.isEmpty()) {
+ User user = users.get(0);
+ String jwt = JwtUtil.createJWT(user.getId().toString());
+ resp.put("result","success");
+ resp.put("jwt_token",jwt);
+ return resp;
+ }
+
+ // 如果不存在说明该用户没有登录过,需要根据上面的accessToken和openid向Acwing请求用户信息
+
+ nameValuePairs = new LinkedList<>();
+ nameValuePairs.add(new BasicNameValuePair("access_token",accessToken));
+ nameValuePairs.add(new BasicNameValuePair("openid",openId));
+
+ getString = HttpClientUtil.get(getUserInfoUrl,nameValuePairs); // 将请求结果存入字符串
+
+ if (getString == null) return resp;
+ getResp = JSONObject.parseObject(getString);
+ // 获得用户的用户名和头像
+ String username = getResp.getString("username");
+ String photo = getResp.getString("photo");
+
+ if (username == null || photo == null) return resp;
+
+ // 避免新出现的用户重名
+ for (int i = 0; i < 100; i++) { // 随机在后面添加以为数字
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("username",username);
+ // 没有重名,直接退出
+ if (userMapper.selectList(queryWrapper).isEmpty()) break;
+ username += (char)(random.nextInt(10) + '0');
+ if (i == 99) return resp; // 小概率事件,太逆天,直接返回
+ }
+
+ // 根据获得的信息建立一个用户
+ User user = new User(null,username,null,photo,null,openId);
+ userMapper.insert(user);
+
+ String jwt = JwtUtil.createJWT(user.getId().toString());
+
+ resp.put("result","success");
+ resp.put("jwt_token",jwt);
+
+ return resp;
+ }
+}
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/WebServiceImpl.java b/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/WebServiceImpl.java
new file mode 100644
index 0000000..e3a50ea
--- /dev/null
+++ b/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/WebServiceImpl.java
@@ -0,0 +1,138 @@
+package com.kob.backend.service.impl.user.account.acwing;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.kob.backend.mapper.UserMapper;
+import com.kob.backend.pojo.User;
+import com.kob.backend.service.impl.user.account.acwing.utils.HttpClientUtil;
+import com.kob.backend.service.user.account.acwing.WebService;
+import com.kob.backend.utils.JwtUtil;
+import org.apache.http.NameValuePair;
+import org.apache.http.message.BasicNameValuePair;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.time.Duration;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+
+@Service
+public class WebServiceImpl implements WebService {
+ private static final String appId = "3357";
+ private static final String appSecret = "f343ff7eeaa649d2a257bffac0a9323a";
+ private static final String redirectUri = "https://kob.bnblogs.cc/user/account/acwing/web/receive_code/";
+ private static final String applyAccessTokenUrl = "https://www.acwing.com/third_party/api/oauth2/access_token/";
+ private static final String getUserInfoUrl = "https://www.acwing.com/third_party/api/meta/identity/getinfo/";
+ private static final Random random = new Random();
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ @Override
+ public JSONObject applyCode() {
+ JSONObject resp = new JSONObject();
+ String encodeUrl="";
+ try {
+ encodeUrl = URLEncoder.encode(redirectUri,"UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ resp.put("result","failed");
+ return resp;
+ }
+
+ StringBuilder state = new StringBuilder();
+ for (int i = 0; i < 10; i++) {
+ state.append((char)(random.nextInt(10) + '0')); // 十位随机数字字符串
+ }
+ resp.put("result","success");
+ redisTemplate.opsForValue().set(state.toString(),"true"); // 将state值存入redis
+ redisTemplate.expire(state.toString(), Duration.ofMinutes(10)); // 设置过期时间为10分钟
+
+ String applyCodeUrl = "https://www.acwing.com/third_party/api/oauth2/web/authorize/?appid=" + appId
+ + "&redirect_uri=" + encodeUrl
+ + "&scope=userinfo"
+ + "&state=" + state;
+ resp.put("apply_code_url",applyCodeUrl);
+ return resp;
+ }
+
+ @Override
+ public JSONObject receiveCode(String code, String state) {
+ JSONObject resp = new JSONObject();
+ resp.put("result","failed");
+ if (code == null || state == null) return resp; // 传入的code和state为空
+ if (Boolean.FALSE.equals(redisTemplate.hasKey(state))) return resp; // redis中没有该state
+ redisTemplate.delete(state); // 删除该state,只使用一次
+
+ // 获取accessToken
+ List nameValuePairs = new LinkedList<>();
+ nameValuePairs.add(new BasicNameValuePair("appid",appId));
+ nameValuePairs.add(new BasicNameValuePair("secret",appSecret));
+ nameValuePairs.add(new BasicNameValuePair("code",code));
+
+ String getString = HttpClientUtil.get(applyAccessTokenUrl,nameValuePairs); // 请求结果存入一个字符串
+
+ if (getString == null) return resp;
+
+ JSONObject getResp = JSONObject.parseObject(getString);
+ String accessToken = getResp.getString("access_token");
+ String openId = getResp.getString("openid");
+
+ if (accessToken == null || openId == null) return resp;
+
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.eq("openid",openId);
+ List users = userMapper.selectList(qw); // 查询满足openid的用户是否存在
+ if (!users.isEmpty()) {
+ User user = users.get(0);
+ String jwt = JwtUtil.createJWT(user.getId().toString());
+ resp.put("result","success");
+ resp.put("jwt_token",jwt);
+ return resp;
+ }
+
+ // 如果不存在说明该用户没有登录过,需要根据上面的accessToken和openid向Acwing请求用户信息
+
+ nameValuePairs = new LinkedList<>();
+ nameValuePairs.add(new BasicNameValuePair("access_token",accessToken));
+ nameValuePairs.add(new BasicNameValuePair("openid",openId));
+
+ getString = HttpClientUtil.get(getUserInfoUrl,nameValuePairs); // 将请求结果存入字符串
+
+ if (getString == null) return resp;
+ getResp = JSONObject.parseObject(getString);
+ // 获得用户的用户名和头像
+ String username = getResp.getString("username");
+ String photo = getResp.getString("photo");
+
+ if (username == null || photo == null) return resp;
+
+ // 避免新出现的用户重名
+ for (int i = 0; i < 100; i++) { // 随机在后面添加以为数字
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("username",username);
+ // 没有重名,直接退出
+ if (userMapper.selectList(queryWrapper).isEmpty()) break;
+ username += (char)(random.nextInt(10) + '0');
+ if (i == 99) return resp; // 小概率事件,太逆天,直接返回
+ }
+
+ // 根据获得的信息建立一个用户
+ User user = new User(null,username,null,photo,null,openId);
+ userMapper.insert(user);
+
+ String jwt = JwtUtil.createJWT(user.getId().toString());
+
+ resp.put("result","success");
+ resp.put("jwt_token",jwt);
+
+ return resp;
+ }
+}
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/utils/HttpClientUtil.java b/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/utils/HttpClientUtil.java
new file mode 100644
index 0000000..835751f
--- /dev/null
+++ b/backendCloud/backend/src/main/java/com/kob/backend/service/impl/user/account/acwing/utils/HttpClientUtil.java
@@ -0,0 +1,38 @@
+package com.kob.backend.service.impl.user.account.acwing.utils;
+
+
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.List;
+
+public class HttpClientUtil {
+ public static String get(String url, List params) {
+ URIBuilder uriBuilder = null;
+ try {
+ uriBuilder = new URIBuilder(url);
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ return null;
+ }
+ uriBuilder.setParameters(params);
+
+ try (CloseableHttpClient client = HttpClients.createDefault()) {
+ HttpGet httpGet = new HttpGet(uriBuilder.build());
+ CloseableHttpResponse response = client.execute(httpGet);
+ HttpEntity entity = response.getEntity();
+ return EntityUtils.toString(entity);
+ } catch (IOException | URISyntaxException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/service/user/account/acwing/AcappService.java b/backendCloud/backend/src/main/java/com/kob/backend/service/user/account/acwing/AcappService.java
new file mode 100644
index 0000000..d3bdca0
--- /dev/null
+++ b/backendCloud/backend/src/main/java/com/kob/backend/service/user/account/acwing/AcappService.java
@@ -0,0 +1,8 @@
+package com.kob.backend.service.user.account.acwing;
+
+import com.alibaba.fastjson.JSONObject;
+
+public interface AcappService {
+ JSONObject applyCode();
+ JSONObject receiveCode(String code,String state);
+}
diff --git a/backendCloud/backend/src/main/java/com/kob/backend/service/user/account/acwing/WebService.java b/backendCloud/backend/src/main/java/com/kob/backend/service/user/account/acwing/WebService.java
new file mode 100644
index 0000000..038f454
--- /dev/null
+++ b/backendCloud/backend/src/main/java/com/kob/backend/service/user/account/acwing/WebService.java
@@ -0,0 +1,8 @@
+package com.kob.backend.service.user.account.acwing;
+
+import com.alibaba.fastjson.JSONObject;
+
+public interface WebService {
+ JSONObject applyCode();
+ JSONObject receiveCode(String code,String state);
+}
diff --git a/backendCloud/backend/src/main/resources/application.properties b/backendCloud/backend/src/main/resources/application.properties
index c8fb5c0..a4bba3d 100644
--- a/backendCloud/backend/src/main/resources/application.properties
+++ b/backendCloud/backend/src/main/resources/application.properties
@@ -2,4 +2,7 @@ server.port=4000
spring.datasource.username=root
spring.datasource.password=zfp251217
spring.datasource.url=jdbc:mysql://101.33.213.197:3307/kob?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
\ No newline at end of file
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.redis.database=0
+spring.redis.host=101.33.213.197
+spring.redis.port=6379
\ No newline at end of file
diff --git a/web/src/components/NavBar.vue b/web/src/components/NavBar.vue
index 4f339a2..db3aeba 100644
--- a/web/src/components/NavBar.vue
+++ b/web/src/components/NavBar.vue
@@ -2,6 +2,9 @@