From 5c81b60b58d57a1d07cfd5244693b9fdd61ba871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Fri, 15 Nov 2024 19:48:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B8=B2=E6=9F=93=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- napcat.webui/src/backend/shell.ts | 59 +++++++-- napcat.webui/src/main.ts | 9 +- napcat.webui/src/pages/NetWork.vue | 115 +++++++++++++++++- .../src/pages/network/HttpClientComponent.vue | 29 +++++ .../src/pages/network/HttpServerComponent.vue | 38 ++++++ .../network/WebsocketClientComponent.vue | 32 +++++ .../network/WebsocketServerComponent.vue | 38 ++++++ src/webui/index.ts | 7 ++ src/webui/src/api/BaseInfo.ts | 15 +++ 9 files changed, 329 insertions(+), 13 deletions(-) create mode 100644 napcat.webui/src/pages/network/HttpClientComponent.vue create mode 100644 napcat.webui/src/pages/network/HttpServerComponent.vue create mode 100644 napcat.webui/src/pages/network/WebsocketClientComponent.vue create mode 100644 napcat.webui/src/pages/network/WebsocketServerComponent.vue create mode 100644 src/webui/src/api/BaseInfo.ts diff --git a/napcat.webui/src/backend/shell.ts b/napcat.webui/src/backend/shell.ts index 8a1cc8fd..dd320221 100644 --- a/napcat.webui/src/backend/shell.ts +++ b/napcat.webui/src/backend/shell.ts @@ -1,13 +1,57 @@ export class QQLoginManager { private retCredential: string; + private apiprefix: string; - constructor(retCredential: string) { + constructor(retCredential: string, apiprefix: string = 'http://127.0.0.1:6099/api') { this.retCredential = retCredential; + this.apiprefix = apiprefix; + } + public async GetOB11Config(): Promise { + try { + const ConfigResponse = await fetch(`${this.apiprefix}/OB11Config/GetConfig`, { + method: 'POST', + headers: { + Authorization: 'Bearer ' + this.retCredential, + 'Content-Type': 'application/json', + }, + }); + if (ConfigResponse.status == 200) { + const ConfigResponseJson = await ConfigResponse.json(); + if (ConfigResponseJson.code == 0) { + return ConfigResponseJson?.data; + } + } + } catch (error) { + console.error("Error getting OB11 config:", error); + } + return {}; + } + + public async SetOB11Config(config: any): Promise { + try { + const ConfigResponse = await fetch(`${this.apiprefix}/OB11Config/SetConfig`, { + method: 'POST', + headers: { + Authorization: 'Bearer ' + this.retCredential, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ config: JSON.stringify(config) }), + }); + if (ConfigResponse.status == 200) { + const ConfigResponseJson = await ConfigResponse.json(); + if (ConfigResponseJson.code == 0) { + return true; + } + } + } catch (error) { + console.error("Error setting OB11 config:", error); + } + return false; } public async checkQQLoginStatus(): Promise { try { - let QQLoginResponse = await fetch('../api/QQLogin/CheckLoginStatus', { + let QQLoginResponse = await fetch(`${this.apiprefix}/QQLogin/CheckLoginStatus`, { method: 'POST', headers: { 'Authorization': "Bearer " + this.retCredential, @@ -28,7 +72,7 @@ export class QQLoginManager { public async checkWebUiLogined(): Promise { try { - let LoginResponse = await fetch('../api/auth/check', { + let LoginResponse = await fetch(`${this.apiprefix}/auth/check`, { method: 'POST', headers: { 'Authorization': "Bearer " + this.retCredential, @@ -37,7 +81,6 @@ export class QQLoginManager { }); if (LoginResponse.status == 200) { let LoginResponseJson = await LoginResponse.json(); - //console.log(LoginResponseJson); if (LoginResponseJson.code == 0) { return true; } @@ -50,7 +93,7 @@ export class QQLoginManager { public async loginWithToken(token: string): Promise { try { - let loginResponse = await fetch('../api/auth/login', { + let loginResponse = await fetch(`${this.apiprefix}/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' @@ -71,7 +114,7 @@ export class QQLoginManager { public async getQQLoginQrcode(): Promise { try { - let QQLoginResponse = await fetch('../api/QQLogin/GetQQLoginQrcode', { + let QQLoginResponse = await fetch(`${this.apiprefix}/QQLogin/GetQQLoginQrcode`, { method: 'POST', headers: { 'Authorization': "Bearer " + this.retCredential, @@ -92,7 +135,7 @@ export class QQLoginManager { public async getQQQuickLoginList(): Promise { try { - let QQLoginResponse = await fetch('../api/QQLogin/GetQuickLoginList', { + let QQLoginResponse = await fetch(`${this.apiprefix}/QQLogin/GetQuickLoginList`, { method: 'POST', headers: { 'Authorization': "Bearer " + this.retCredential, @@ -113,7 +156,7 @@ export class QQLoginManager { public async setQuickLogin(uin: string): Promise<{ result: boolean, errMsg: string }> { try { - let QQLoginResponse = await fetch('../api/QQLogin/SetQuickLogin', { + let QQLoginResponse = await fetch(`${this.apiprefix}/QQLogin/SetQuickLogin`, { method: 'POST', headers: { 'Authorization': "Bearer " + this.retCredential, diff --git a/napcat.webui/src/main.ts b/napcat.webui/src/main.ts index 222907f1..59c46f5b 100644 --- a/napcat.webui/src/main.ts +++ b/napcat.webui/src/main.ts @@ -20,7 +20,10 @@ import { Alert as TAlert, Tag as TTag, ListItem as TListItem, - + Tabs as TTabs, + TabPanel as TTabPanel, + Space as TSpace, + Checkbox as TCheckbox, } from 'tdesign-vue-next'; import { router } from './router'; import 'tdesign-vue-next/es/style/index.css'; @@ -46,4 +49,8 @@ app.use(TList); app.use(TAlert); app.use(TTag); app.use(TListItem); +app.use(TTabs); +app.use(TTabPanel); +app.use(TSpace); +app.use(TCheckbox); app.mount('#app'); \ No newline at end of file diff --git a/napcat.webui/src/pages/NetWork.vue b/napcat.webui/src/pages/NetWork.vue index 57a5b293..4a063aa1 100644 --- a/napcat.webui/src/pages/NetWork.vue +++ b/napcat.webui/src/pages/NetWork.vue @@ -1,6 +1,113 @@ + + \ No newline at end of file diff --git a/napcat.webui/src/pages/network/HttpClientComponent.vue b/napcat.webui/src/pages/network/HttpClientComponent.vue new file mode 100644 index 00000000..45f02d8f --- /dev/null +++ b/napcat.webui/src/pages/network/HttpClientComponent.vue @@ -0,0 +1,29 @@ + + + \ No newline at end of file diff --git a/napcat.webui/src/pages/network/HttpServerComponent.vue b/napcat.webui/src/pages/network/HttpServerComponent.vue new file mode 100644 index 00000000..a43286b0 --- /dev/null +++ b/napcat.webui/src/pages/network/HttpServerComponent.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/napcat.webui/src/pages/network/WebsocketClientComponent.vue b/napcat.webui/src/pages/network/WebsocketClientComponent.vue new file mode 100644 index 00000000..52312230 --- /dev/null +++ b/napcat.webui/src/pages/network/WebsocketClientComponent.vue @@ -0,0 +1,32 @@ + + + \ No newline at end of file diff --git a/napcat.webui/src/pages/network/WebsocketServerComponent.vue b/napcat.webui/src/pages/network/WebsocketServerComponent.vue new file mode 100644 index 00000000..c6d6d1f3 --- /dev/null +++ b/napcat.webui/src/pages/network/WebsocketServerComponent.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/src/webui/index.ts b/src/webui/index.ts index 3d4cae46..de9c83c1 100644 --- a/src/webui/index.ts +++ b/src/webui/index.ts @@ -36,6 +36,13 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp // 配置静态文件服务,提供./static目录下的文件服务,访问路径为/webui app.use(config.prefix + '/webui', express.static(pathWrapper.staticPath)); //挂载API接口 + // 添加CORS支持 + app.use((req, res, next) => { + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization'); + next(); + }); app.use(config.prefix + '/api', ALLRouter); app.listen(config.port, config.host, async () => { log(`[NapCat] [WebUi] Current WebUi is running at http://${config.host}:${config.port}${config.prefix}`); diff --git a/src/webui/src/api/BaseInfo.ts b/src/webui/src/api/BaseInfo.ts new file mode 100644 index 00000000..d7e9a825 --- /dev/null +++ b/src/webui/src/api/BaseInfo.ts @@ -0,0 +1,15 @@ +import { RequestHandler } from 'express'; +import { WebUiDataRuntime } from '../helper/Data'; + +export const LogFileListHandler: RequestHandler = async (req, res) => { + res.send({ + code: 0, + data: { + uin: 0, + nick: 'NapCat', + avatar: 'https://q1.qlogo.cn/g?b=qq&nk=0&s=640', + status: 'online', + boottime: Date.now() + } + }); +};