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 @@