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() + } + }); +};