From 90d40386ac2fd4863b878ad21d787efc93fa1c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=91=E5=B0=8F=E9=A9=AC?= Date: Thu, 24 Jul 2025 18:15:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=B8=E5=85=B3=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=EF=BC=8C=E8=B0=83=E6=95=B4=E7=99=BB=E5=BD=95=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/controller/RestAuthController.java | 14 +- .../com/lktx/center/filter/CorsFilter.java | 22 + api/src/main/resources/app.yml | 2 +- web/package.json | 2 + web/src/api/login.js | 9 + web/src/data/host.js | 4 + web/src/data/http.js | 66 +++ web/src/data/userInfo.js | 16 + web/src/main.js | 1 + web/src/router/index.js | 18 +- web/src/views/announcement.vue | 63 +++ web/src/views/chat.vue | 417 ++++++++++++++++++ web/src/views/index.vue | 2 +- web/src/views/login.vue | 128 ++++++ .../{components/layout.vue => menu/index.vue} | 51 ++- web/src/views/news.vue | 52 +++ web/src/views/staffstyle.vue | 58 +++ web/src/views/suggestionbox.vue | 127 ++++++ 18 files changed, 1038 insertions(+), 14 deletions(-) create mode 100644 api/src/main/java/com/lktx/center/filter/CorsFilter.java create mode 100644 web/src/api/login.js create mode 100644 web/src/data/host.js create mode 100644 web/src/data/http.js create mode 100644 web/src/data/userInfo.js create mode 100644 web/src/views/announcement.vue create mode 100644 web/src/views/chat.vue create mode 100644 web/src/views/login.vue rename web/src/views/{components/layout.vue => menu/index.vue} (77%) create mode 100644 web/src/views/news.vue create mode 100644 web/src/views/staffstyle.vue create mode 100644 web/src/views/suggestionbox.vue diff --git a/api/src/main/java/com/lktx/center/controller/RestAuthController.java b/api/src/main/java/com/lktx/center/controller/RestAuthController.java index 59ea08a..832ab6b 100644 --- a/api/src/main/java/com/lktx/center/controller/RestAuthController.java +++ b/api/src/main/java/com/lktx/center/controller/RestAuthController.java @@ -3,17 +3,21 @@ package com.lktx.center.controller; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.StpUtil; import cn.hserver.core.ioc.annotation.Autowired; +import cn.hserver.core.server.util.JsonResult; import cn.hserver.plugin.web.annotation.Controller; import cn.hserver.plugin.web.annotation.RequestMapping; +import cn.hserver.plugin.web.interfaces.HttpRequest; import cn.hserver.plugin.web.interfaces.HttpResponse; import com.lktx.center.config.Data; import com.lktx.center.config.SsoAuthRequest; +import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.utils.AuthStateUtils; +@Slf4j @Controller("/oauth") public class RestAuthController { @@ -27,16 +31,20 @@ public class RestAuthController { } @RequestMapping("/callback") - public void login(AuthCallback callback,HttpResponse response) { + public JsonResult login(AuthCallback callback, HttpRequest request) { try { + String rawData = request.getRawData(); + System.out.println(rawData); AuthResponse login = authRequest.login(callback); + AuthUser data = login.getData(); AuthToken token = login.getData().getToken(); StpUtil.login(login.getData().getUuid()); SaSession session = StpUtil.getSession(); session.set(Data.AuthToken, token); - response.redirect("/"); + return JsonResult.ok().put("data", data); }catch (Exception e) { - response.redirect("/"); + log.error("login error",e); } + return JsonResult.error(); } } \ No newline at end of file diff --git a/api/src/main/java/com/lktx/center/filter/CorsFilter.java b/api/src/main/java/com/lktx/center/filter/CorsFilter.java new file mode 100644 index 0000000..c34dda0 --- /dev/null +++ b/api/src/main/java/com/lktx/center/filter/CorsFilter.java @@ -0,0 +1,22 @@ +package com.lktx.center.filter; + +import cn.hserver.core.ioc.annotation.Bean; +import cn.hserver.core.ioc.annotation.Order; +import cn.hserver.plugin.web.context.Webkit; +import cn.hserver.plugin.web.interfaces.FilterAdapter; +import io.netty.handler.codec.http.HttpMethod; + +@Bean +@Order(1) +public class CorsFilter implements FilterAdapter { + @Override + public void doFilter(Webkit webkit) throws Exception { + webkit.httpResponse.setHeader("Access-Control-Allow-Origin", "*"); + webkit.httpResponse.setHeader("Access-Control-Allow-Methods", "*"); + webkit.httpResponse.setHeader("Access-Control-Allow-Credentials", "*"); + webkit.httpResponse.setHeader("Access-Control-Allow-Headers", "*"); + if (webkit.httpRequest.getRequestType().equals(HttpMethod.OPTIONS)) { + webkit.httpResponse.sendHtml(""); + } + } +} \ No newline at end of file diff --git a/api/src/main/resources/app.yml b/api/src/main/resources/app.yml index ab21917..bfe6873 100644 --- a/api/src/main/resources/app.yml +++ b/api/src/main/resources/app.yml @@ -1,5 +1,5 @@ oauth: client-id: 65013a3d89d14fab8ff3eb2c0f3981a3 client-secret: 22b5ce70d67f41b79b27cbedb57c976a - redirect-uri: http://127.0.0.1:8981/oauth/callback + redirect-uri: http://127.0.0.1:5173/login url: http://192.168.0.206:8911/21/ \ No newline at end of file diff --git a/web/package.json b/web/package.json index 65b299e..4d0b330 100644 --- a/web/package.json +++ b/web/package.json @@ -10,7 +10,9 @@ }, "dependencies": { "@tailwindcss/vite": "^4.1.11", + "axios": "^1.11.0", "element-plus": "^2.10.4", + "font-awesome": "^4.7.0", "vue": "^3.5.17", "vue-router": "4", "vuedraggable": "^4.1.0" diff --git a/web/src/api/login.js b/web/src/api/login.js new file mode 100644 index 0000000..3d16079 --- /dev/null +++ b/web/src/api/login.js @@ -0,0 +1,9 @@ +import http from '../data/http' + +export function login(data) { + return http({ + url: '/oauth/callback', + method: 'post', + data + }) +} diff --git a/web/src/data/host.js b/web/src/data/host.js new file mode 100644 index 0000000..fd5b325 --- /dev/null +++ b/web/src/data/host.js @@ -0,0 +1,4 @@ +//API地址 +export const host = 'http://127.0.0.1:8981' +//登录回调调整地址 +export const login = 'http://127.0.0.1:8981/oauth/render' diff --git a/web/src/data/http.js b/web/src/data/http.js new file mode 100644 index 0000000..33a6656 --- /dev/null +++ b/web/src/data/http.js @@ -0,0 +1,66 @@ +import axios from 'axios' +import userInfo from './userInfo.js' +import {host} from './host.js' + +// create an axios instance +const service = axios.create({ + + // baseURL: "http://127.0.0.1:9090", // url = base url + request url + // baseURL: "http://xxx.com", // url = base url + request url + baseURL: host, // url = base url + request url + // withCredentials: true, // send cookies when cross-domain requests + timeout: 500000 // request timeout +}) + +// request interceptor +service.interceptors.request.use( + config => { + // do something before request is sent + + if (userInfo.getUserInfo()) { + // let each request carry token + // ['X-Token'] is a custom headers key + // please modify it according to the actual situation + config.headers['token'] = userInfo.getUserInfo().token + } + return config + }, + error => { + // do something with request error + console.log(error) // for debug + return Promise.reject(error) + } +) + +// response interceptor +service.interceptors.response.use( + /** + * If you want to get http information such as headers or status + * Please return response => response + */ + + /** + * Determine the request status by custom code + * Here is just an example + * You can also judge the status by HTTP Status Code + */ + response => { + const res = response.data + // if the custom code is not 20000, it is judged as an error. + if (res.code !== 200) { + // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; + if (res.code === -2 || res.code === -3 || res.code === -4 || res.code === -5) { + location.href = "/login" + } + return res + } else { + return res + } + }, + error => { + console.log('err' + error) // for debug + return Promise.reject(error) + } +) + +export default service diff --git a/web/src/data/userInfo.js b/web/src/data/userInfo.js new file mode 100644 index 0000000..db52012 --- /dev/null +++ b/web/src/data/userInfo.js @@ -0,0 +1,16 @@ +export default { + KEY: "USER_INFO", + setUserInfo(userInfo) { + localStorage.setItem(this.KEY, JSON.stringify(userInfo)) + }, + getUserInfo() { + try { + return JSON.parse(localStorage.getItem(this.KEY)) + } catch (e) { + return null + } + }, + removeUserInfo(){ + localStorage.removeItem(this.KEY) + } +} diff --git a/web/src/main.js b/web/src/main.js index ddac3eb..63a516a 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -4,4 +4,5 @@ import App from './App.vue' import router from './router/index.js' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' +import 'font-awesome/css/font-awesome.min.css' createApp(App).use(router).use(ElementPlus).mount('#app') diff --git a/web/src/router/index.js b/web/src/router/index.js index 4ff9c03..1a9255b 100644 --- a/web/src/router/index.js +++ b/web/src/router/index.js @@ -1,23 +1,35 @@ -import { createMemoryHistory, createRouter } from 'vue-router' +import {createMemoryHistory, createRouter, createWebHashHistory, createWebHistory} from 'vue-router' import index from '../views/index.vue' +import login from '../views/login.vue' import home from '../views/home.vue' import appcenter from '../views/appcenter.vue' +import news from '../views/news.vue' +import announcement from '../views/announcement.vue' +import staffstyle from '../views/staffstyle.vue' +import chat from '../views/chat.vue' +import suggestionbox from '../views/suggestionbox.vue' const routes = [ + {path: '/login', component: login}, { path: '/', component: index, children:[ {path: '', redirect: '/home'}, { path: '/home', component: home }, - { path: '/app-center', component: appcenter } + { path: '/app-center', component: appcenter }, + { path: '/news', component: news }, + { path: '/announcement', component: announcement }, + { path: '/staff-style', component: staffstyle }, + { path: '/chat', component: chat }, + { path: '/suggestion-box', component: suggestionbox } ] }, ] const router = createRouter({ - history: createMemoryHistory(), + history: createWebHistory(), routes, }) diff --git a/web/src/views/announcement.vue b/web/src/views/announcement.vue new file mode 100644 index 0000000..bfd2953 --- /dev/null +++ b/web/src/views/announcement.vue @@ -0,0 +1,63 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/chat.vue b/web/src/views/chat.vue new file mode 100644 index 0000000..4aefe4a --- /dev/null +++ b/web/src/views/chat.vue @@ -0,0 +1,417 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/index.vue b/web/src/views/index.vue index d6ed760..5bf07a4 100644 --- a/web/src/views/index.vue +++ b/web/src/views/index.vue @@ -1,6 +1,6 @@ diff --git a/web/src/views/login.vue b/web/src/views/login.vue new file mode 100644 index 0000000..b1d88f7 --- /dev/null +++ b/web/src/views/login.vue @@ -0,0 +1,128 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/components/layout.vue b/web/src/views/menu/index.vue similarity index 77% rename from web/src/views/components/layout.vue rename to web/src/views/menu/index.vue index 9c57604..3892be3 100644 --- a/web/src/views/components/layout.vue +++ b/web/src/views/menu/index.vue @@ -20,8 +20,8 @@ @open="handleOpen" router > - 新闻中心 - 公告 + 新闻中心 + 公告 @@ -38,8 +38,8 @@
- User Avatar - + User Avatar +
@@ -61,9 +61,25 @@ - + + + + + + + + + + + + + + + + + @@ -102,12 +118,18 @@ \ No newline at end of file diff --git a/web/src/views/staffstyle.vue b/web/src/views/staffstyle.vue new file mode 100644 index 0000000..de53ee6 --- /dev/null +++ b/web/src/views/staffstyle.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/suggestionbox.vue b/web/src/views/suggestionbox.vue new file mode 100644 index 0000000..8475871 --- /dev/null +++ b/web/src/views/suggestionbox.vue @@ -0,0 +1,127 @@ + + + + + \ No newline at end of file