From fce03101227d2356b0c6da910d17884ffceaaacc Mon Sep 17 00:00:00 2001 From: stapxs <1007028430.stapx@gmail.com> Date: Fri, 13 Sep 2024 16:04:16 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E5=96=9C=E6=8A=A5=EF=BC=81=E5=86=8D?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E5=A4=A9=E7=8F=AD=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :sparkles: 搜索消息功能,现在你可以在已加载的消息中搜索内容 :hammer: 在开发者模式下现在辉县市页面 fps :bug: 禁言通知未判断来源 <- #124 --- src/App.vue | 31 ++++++++++- src/assets/css/append/append_new.css | 5 +- src/assets/css/chat.css | 37 +++++++++++++ src/assets/css/view.css | 14 +++++ src/assets/l10n/zh-CN.json | 8 +-- src/function/msg.ts | 12 ++++- src/function/utils/msgUtil.ts | 6 +++ src/pages/Chat.vue | 77 +++++++++++++++++++++++++--- 8 files changed, 177 insertions(+), 13 deletions(-) diff --git a/src/App.vue b/src/App.vue index ce09780..86b463f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,4 +1,8 @@ +
+ + + +
@@ -126,6 +148,12 @@
+ +
+ + {{ $t('chat_fun_search_tag') }} +
+
@@ -164,6 +192,9 @@
+
+
+
@@ -184,7 +215,8 @@ time: Intl.DateTimeFormat(trueLang, getTimeConfig(new Date(chat.info.me_info.shut_up_timestamp * 1000))).format(new Date(chat.info.me_info.shut_up_timestamp * 1000)) }) : ''" @paste="addImg" @keyup="mainKeyUp" - @click="selectSQIn()"> + @click="selectSQIn()" + @input="searchMessage">
- + +
@@ -384,7 +418,7 @@ import NoticeBody from '@/components/NoticeBody.vue' import FacePan from '@/components/FacePan.vue' import imageCompression from 'browser-image-compression' -import { defineComponent, markRaw } from 'vue' +import { defineComponent, markRaw, reactive } from 'vue' import { v4 as uuid } from 'uuid' import { downloadFile, loadHistory as loadHistoryFirst } from '@/function/utils/appUtil' import { getTimeConfig, getTrueLang } from '@/function/utils/systemUtil' @@ -439,6 +473,10 @@ export default defineComponent({ respond: false, showRespond: true }, + search: { + userId: -1, + list: reactive(this.list) + }, msgTouch: { x: -1, y: -1, @@ -446,7 +484,7 @@ export default defineComponent({ onMove: 'no' } }, - details: [{ open: false }, { open: false }, { open: false }], + details: [{ open: false }, { open: false }, { open: false }, { open: false }], msgMenus: [], NewMsgNum: 0, msg: '', @@ -1382,6 +1420,10 @@ export default defineComponent({ * 发送消息 */ sendMsg () { + // 在搜索消息的时候不允许发送消息 + if(this.details[3].open) { + return + } // 关闭所有其他的已打开的更多功能弹窗 this.details.forEach((item) => { item.open = false @@ -1644,6 +1686,29 @@ export default defineComponent({ this.tags.showMoreDetail = !this.tags.showMoreDetail }, + searchMessage(event: Event) { + if(this.details[3].open) { + const value = (event.target as HTMLInputElement).value + if(value.length == 0) { + this.tags.search.list = reactive(this.list) + } else if(value.length > 0) { + this.tags.search.list = this.list.filter((item: any) => { + const rawMessage = getMsgRawTxt(item.message) + return rawMessage.indexOf(value) !== -1 + }) + } + } + }, + openSearch() { + this.details[3].open = !this.details[3].open + this.tags.showMoreDetail = !this.tags.showMoreDetail + }, + closeSearch() { + this.details[3].open = !this.details[3].open + this.msg = '' + this.tags.search.list = reactive(this.list) + }, + /** * 发送戳一戳 */ From c0bc9859e4231ebbd9e8932d1d703375231d5ff2 Mon Sep 17 00:00:00 2001 From: stapxs <1007028430.stapx@gmail.com> Date: Sat, 14 Sep 2024 14:11:37 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E4=B8=8A=E4=B8=8D=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E7=82=B9=E7=8F=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :sparkles: 优化 logger 便于更好的调试 :art: 现在正式构建中将不会再出现 source map :lipstick: 优化更新日志弹窗 --- public/css/append-dark.css | 2 ++ public/css/append-light.css | 2 ++ src/assets/css/append/append_new.css | 4 +++ src/background.ts | 2 +- src/components/MsgBody.vue | 2 +- src/components/UpdatePan.vue | 54 +++++++++++++++++++++++++--- src/function/base.ts | 30 ++++++++++++++-- src/function/connect.ts | 2 +- src/function/electron/ipc.ts | 2 +- src/function/msg.ts | 4 +-- src/function/utils/appUtil.ts | 2 +- src/function/utils/msgUtil.ts | 8 ++--- src/main.ts | 2 +- vue.config.js | 2 +- 14 files changed, 97 insertions(+), 21 deletions(-) diff --git a/public/css/append-dark.css b/public/css/append-dark.css index c88c729..b77237e 100644 --- a/public/css/append-dark.css +++ b/public/css/append-dark.css @@ -8,4 +8,6 @@ --color-bg-green: #3f544a; --color-bg-red: #523a3c; --color-bg-yellow: #504b3d; + + --color-issue-close: #a47ff1; } \ No newline at end of file diff --git a/public/css/append-light.css b/public/css/append-light.css index 9cb77a7..d62d88c 100644 --- a/public/css/append-light.css +++ b/public/css/append-light.css @@ -8,4 +8,6 @@ --color-bg-green: #d5e6de; --color-bg-red: #f3d8da; --color-bg-yellow: #fdf3d1; + + --color-issue-close: #8059d9; } \ No newline at end of file diff --git a/src/assets/css/append/append_new.css b/src/assets/css/append/append_new.css index 018bb9b..f3f8e1f 100644 --- a/src/assets/css/append/append_new.css +++ b/src/assets/css/append/append_new.css @@ -706,6 +706,10 @@ font-size: 0.75rem; } +.update-info > div.info { + font-size: 0.8rem; +} + @media (max-width: 700px) { .main-body > ul { background: var(--color-card-2) !important; diff --git a/src/background.ts b/src/background.ts index 77c8a7d..7316b7d 100644 --- a/src/background.ts +++ b/src/background.ts @@ -110,7 +110,7 @@ async function createWindow() { if (!process.env.IS_TEST) win.webContents.openDevTools() } else { createProtocol('app') - win.loadURL('app://./index.html') + win.loadURL('app://index.html') } session.defaultSession.webRequest.onHeadersReceived((details, callback) => { diff --git a/src/components/MsgBody.vue b/src/components/MsgBody.vue index 359614f..631eb6f 100644 --- a/src/components/MsgBody.vue +++ b/src/components/MsgBody.vue @@ -350,7 +350,7 @@ export default defineComponent({ }) .catch(error => { if (error) { - logger.error(this.$t('chat_link_view_fail') + ': ' + fistLink) + logger.error(error as Error, this.$t('chat_link_view_fail') + ': ' + fistLink) // UM:上传使用链接预览功能的事件用于分析(失败) const reg1 = /\/\/(.*?)\//g const getDom = fistLink.match(reg1) diff --git a/src/components/UpdatePan.vue b/src/components/UpdatePan.vue index ee95741..c75c29f 100644 --- a/src/components/UpdatePan.vue +++ b/src/components/UpdatePan.vue @@ -10,8 +10,13 @@
{{ info.title }}
-
- {{ str }} +
+ {{ item.text }} +
+ -> +
+ #{{ item.issue }} +
@@ -22,16 +27,18 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/src/function/base.ts b/src/function/base.ts index bd30fce..9989ae5 100644 --- a/src/function/base.ts +++ b/src/function/base.ts @@ -50,8 +50,12 @@ export class Logger { info(args: string) { this.add(LogType.INFO, args) } - error(args: string) { - this.add(LogType.ERR, args) + error(e: Error | null, args: string) { + if(e) { + this.add(LogType.ERR, args + '\n' + e.stack?.replaceAll('webpack-internal:///./', 'webpack-internal:///')) + } else { + this.add(LogType.ERR, args) + } } debug(args: string) { this.add(LogType.DEBUG, args) @@ -63,8 +67,28 @@ export class Logger { * @param args 日志内容 */ private print(type: LogType, args: string) { + const error = new Error() + // 从调用栈中获取调用者信息 + let from = '' + const stack = error.stack + if(stack) { + const stackArr = stack.split('\n') + // 找到第一个不是 at Logger 开头的调用者信息 + for (let i = 1; i < stackArr.length; i++) { + if (!stackArr[i].includes('at Logger')) { + // 取出链接部分,去除括号 + from = stackArr[i].replace(/\(|\)/g, '').split(' ').pop() || '' + from = from.replace('webpack-internal:///./', 'webpack-internal:///') + if(from.startsWith('webpack-internal:///node_modules')) { + // node_modules 部分路径太长,一般也不需要;所以只显示 node_modules + from = 'node_modules' + } + break + } + } + } // eslint-disable-next-line no-console - console.log(`%c${LogType[type]}%c ${args}`, `background:#${this.logTypeInfo[type][0]};color:#${this.logTypeInfo[type][1]};border-radius:7px 0 0 7px;display:inline-block;padding:2px 4px 2px 7px;`, ''); + console.log(`%c${LogType[type]}%c${from}%c\n> ${args}`, `background:#${this.logTypeInfo[type][0]};color:#${this.logTypeInfo[type][1]};border-radius:7px 0 0 7px;padding:2px 4px 2px 7px;margin-bottom:7px;`, 'background:#e3e8ec;color:#000;padding:2px 7px 4px 4px;border-radius:0 7px 7px 0;margin-bottom:7px;', ''); } } diff --git a/src/function/connect.ts b/src/function/connect.ts index d23e795..f6493be 100644 --- a/src/function/connect.ts +++ b/src/function/connect.ts @@ -158,7 +158,7 @@ export class Connector { } } - logger.error($t('pop_log_con_fail') + ': ' + code) + logger.error(null, $t('pop_log_con_fail') + ': ' + code) login.status = false } diff --git a/src/function/electron/ipc.ts b/src/function/electron/ipc.ts index 00a7334..cb36c22 100644 --- a/src/function/electron/ipc.ts +++ b/src/function/electron/ipc.ts @@ -2,7 +2,7 @@ import Store from 'electron-store' import path from 'path' import os from 'os' -import { ipcMain, shell, systemPreferences, app, Menu, MenuItemConstructorOptions, Notification as ELNotification, screen as sysScreen } from 'electron' +import { ipcMain, shell, systemPreferences, app, Menu, MenuItemConstructorOptions, Notification as ELNotification } from 'electron' import { GtkTheme, GtkData } from '@jakejarrett/gtk-theme' import { runCommand } from './util' import { win, touchBarInstance } from '@/background' diff --git a/src/function/msg.ts b/src/function/msg.ts index ea04102..06e8471 100644 --- a/src/function/msg.ts +++ b/src/function/msg.ts @@ -62,7 +62,7 @@ export function parse(str: string) { noticeFunctions[type](type, msg) } } catch (e) { - logger.error(`处理消息或通知错误 - ${name}:${(e as Error).message}`) + logger.error(e as Error, `处理消息或通知错误 - ${name}:${(e as Error).message}`) } } @@ -1156,7 +1156,7 @@ function revokeMsg(name: string, msg: any) { } } } else { - logger.error(app.config.globalProperties.$t('log_revoke_miss')) + logger.error(null, app.config.globalProperties.$t('log_revoke_miss')) } // 尝试撤回通知 const notificationIndex = notificationList.findIndex((item) => { diff --git a/src/function/utils/appUtil.ts b/src/function/utils/appUtil.ts index af0ab1b..139303a 100644 --- a/src/function/utils/appUtil.ts +++ b/src/function/utils/appUtil.ts @@ -58,10 +58,10 @@ export function scrollToMsg (seqName: string, showAnimation: boolean): boolean { * @param url 链接 */ export function openLink(url: string, external = false) { - runtimeData.popBoxList = [] // 判断是不是 Electron,是的话打开内嵌 iframe if(runtimeData.tags.isElectron) { if(!external) { + runtimeData.popBoxList = [] const popInfo = { html: ``, full: true, diff --git a/src/function/utils/msgUtil.ts b/src/function/utils/msgUtil.ts index aba1507..b1c3e69 100644 --- a/src/function/utils/msgUtil.ts +++ b/src/function/utils/msgUtil.ts @@ -55,7 +55,7 @@ export function getMsgData(name: string, msg: { [key: string]: any }, map: strin back = backList } } catch (ex) { - logger.error(`解析消息 JSON 错误:${name} -> ${map}`) + logger.error(ex as Error, `解析消息 JSON 错误:${name} -> ${map}`) // eslint-disable-next-line console.log(ex) } @@ -66,7 +66,7 @@ export function getMsgData(name: string, msg: { [key: string]: any }, map: strin try { data[key] = jp.query(msg, replaceJPValue(map[key]))[0] } catch (ex) { - logger.error(`解析 JSON 错误:${name} -> ${map}`) + logger.error(ex as Error, `解析 JSON 错误:${name} -> ${map}`) // eslint-disable-next-line console.log(ex) } @@ -228,7 +228,7 @@ export function getMsgRawTxt(message: [{ [key: string]: any }]): string { } } } catch (error) { - logger.error('解析消息短格式错误:' + JSON.stringify(message[i])) + logger.error(error as Error, '解析消息短格式错误:' + JSON.stringify(message[i])) // eslint-disable-next-line console.log(error) } @@ -436,7 +436,7 @@ export function updateLastestHistory(item: UserFriendElem & UserGroupElem) { } export function sendMsgAppendInfo(msg: any) { - msg.message.forEach((item: any) => { + msg.message.forEach(() => { // TODO }) } \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index dc937ec..771c98a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -64,4 +64,4 @@ const strList = ['VERSION', 'WELCOME', 'HELLO'] const colorList = ['50534f', 'f9a633', '8076a3', 'f0a1a8', '92aa8a', '606E7A', '7abb7e', 'b573f7', 'ff5370', '99b3db', '677480'] const color = colorList[Math.floor(Math.random() * colorList.length)] const str = strList[Math.floor(Math.random() * strList.length)] -console.log(`%c${str}%c Stapxs QQ Lite - ${packageInfo.version} ( ${process.env.NODE_ENV} ) `, `font-weight:bold;background:#${color};color:#fff;border-radius:7px 0 0 7px;display:inline-block;padding:7px 14px;margin:7px 0 7px 7px;`, 'background:#F8F9FA;color:#000;border-radius:0 7px 7px 0;display:inline-block;padding:7px 14px;margin:7px 7px 7px 0;'); +console.log(`%c${str}%c Stapxs QQ Lite - ${packageInfo.version} ( ${process.env.NODE_ENV} ) `, `font-weight:bold;background:#${color};color:#fff;border-radius:7px 0 0 7px;padding:7px 14px;margin:7px 0 7px 7px;`, 'background:#e3e8ec;color:#000;border-radius:0 7px 7px 0;display:inline-block;padding:7px 14px;margin:7px 7px 7px 0;'); diff --git a/vue.config.js b/vue.config.js index 8905c27..cb2ac25 100644 --- a/vue.config.js +++ b/vue.config.js @@ -15,7 +15,7 @@ module.exports = { transpileDependencies: true, productionSourceMap: false, configureWebpack: { - devtool: 'source-map', + devtool: process.env.NODE_ENV == 'development' ? 'eval-source-map' : false, module: { rules: [ { From a5cafef3a44f6796ec922de49609db7fb3bc7881 Mon Sep 17 00:00:00 2001 From: stapxs <1007028430.stapx@gmail.com> Date: Wed, 18 Sep 2024 16:53:31 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E6=80=8E=E4=B9=88=E9=82=A3=E4=B9=88?= =?UTF-8?q?=E5=A4=9A=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :sparkles: 优化好友列表动画 :bug: 戳一戳判定错误 --- src/assets/css/view.css | 7 +++++-- src/function/electron/connector.ts | 13 ------------- src/function/msg.ts | 4 ++-- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/assets/css/view.css b/src/assets/css/view.css index 0acab71..646ec5b 100644 --- a/src/assets/css/view.css +++ b/src/assets/css/view.css @@ -547,14 +547,15 @@ textarea:focus { width: 1rem !important; } .msg-menu-body > div > div > svg { + transition: color .3s, opacity .3s; color: var(--color-font-1); - transition: fill .3s; margin-top: 7px; height: 1rem; width: 1rem; } .msg-menu-body > div:hover > div > svg { color: var(--color-font-r); + opacity: 1; } .msg-menu-body > div > a { color: var(--color-font); @@ -1126,7 +1127,7 @@ textarea:focus { } .friend-list > div:last-child.open > div > div, .friend-list > div:last-child.open > div.list > div > div > div { - display: block !important; + display: block; } .friend-body { background: transparent !important; @@ -1154,9 +1155,11 @@ textarea:focus { .friend-body > div:nth-child(1) { transform: scaleY(1) !important; position: absolute; + display: none !important; } .friend-body > div:nth-child(1).new { border-radius: 100%; + display: block !important; height: 15px; width: 15px; right: -3px; diff --git a/src/function/electron/connector.ts b/src/function/electron/connector.ts index 9c19346..ff06925 100644 --- a/src/function/electron/connector.ts +++ b/src/function/electron/connector.ts @@ -50,19 +50,6 @@ export class Connector { this.win.webContents.send('onebot:onopen', { address: url, token: token }) } this.websocket.onmessage = (e) => { - try { - const message = JSON.parse((e.data as string)) - if(message.echo) - this.logger.debug('收到消息:', message.echo) - else if(message.post_type) { - if(message.notice_type) - this.logger.debug('收到消息:', message.post_type, message.notice_type) - else - this.logger.debug('收到消息:', message.post_type) - } - } catch(e) { - // - } this.win.webContents.send('onebot:onmessage', e.data) } this.websocket.onclose = (e) => { diff --git a/src/function/msg.ts b/src/function/msg.ts index 06e8471..6ac873e 100644 --- a/src/function/msg.ts +++ b/src/function/msg.ts @@ -206,7 +206,7 @@ const noticeFunctions = { if (user) userInfo.push({ txt: `${user.nickname}`, - isMe: true + isMe: false }) } }) @@ -1156,7 +1156,7 @@ function revokeMsg(name: string, msg: any) { } } } else { - logger.error(null, app.config.globalProperties.$t('log_revoke_miss')) + logger.error(null, '没有找到这条被撤回的消息 ……') } // 尝试撤回通知 const notificationIndex = notificationList.findIndex((item) => { From 61c662701526f814c7e6928a0cbb151c9b972849 Mon Sep 17 00:00:00 2001 From: stapxs <1007028430.stapx@gmail.com> Date: Fri, 20 Sep 2024 10:52:53 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E5=A5=BD=E5=A4=9A=E5=A5=BD=E5=A4=9A?= =?UTF-8?q?=E5=A5=BD=E5=A4=9A=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :sparkles: 增加对群成员头衔的显示支持 :art: 将多语言功能翻新为更常用的 POT/PO 格式 :lipstick: 优化 At 信息悬浮窗样式 :lipstick: 优化好友列表分组显示样式 :wheelchair: 群成员列表现在改为按照拼音首字母排序 :heavy_plus_sign: 新增依赖:gettext-parser --- package.json | 4 +- src/App.vue | 29 +- src/assets/css/append/append_new.css | 21 +- src/assets/css/chat.css | 21 +- src/assets/css/msg.css | 7 + src/assets/l10n/en-US.json | 301 ---- src/assets/l10n/en-US.po | 1442 +++++++++++++++++ src/assets/l10n/zh-CAT.json | 286 ---- src/assets/l10n/zh-CAT.po | 446 +++++ src/assets/l10n/zh-CN.json | 398 ----- src/assets/l10n/zh-CN.po | 1440 ++++++++++++++++ src/assets/l10n/zh-TW.json | 295 ---- src/assets/l10n/zh-TW.po | 1440 ++++++++++++++++ src/assets/l10n/zh-YUE.json | 295 ---- src/assets/l10n/zh-YUE.po | 1440 ++++++++++++++++ src/components/AboutPan.vue | 10 +- src/components/BulletinBody.vue | 8 +- src/components/DepPan.vue | 4 +- src/components/FacePan.vue | 2 +- src/components/FileBody.vue | 4 +- src/components/MsgBody.vue | 41 +- src/components/NoticeBody.vue | 18 +- src/components/UpdatePan.vue | 2 +- src/components/WelPan.vue | 12 +- src/components/msg-component/CardMessage.vue | 2 +- src/function/connect.ts | 20 +- src/function/elements/information.ts | 1 + src/function/model/msg-body.ts | 4 +- src/function/msg.ts | 46 +- src/function/option.ts | 24 +- src/function/utils/appUtil.ts | 105 +- src/function/utils/msgUtil.ts | 4 +- src/function/utils/systemUtil.ts | 23 + src/main.ts | 4 +- src/pages/Chat.vue | 110 +- src/pages/Friends.vue | 46 +- src/pages/Info.vue | 36 +- src/pages/Messages.vue | 22 +- src/pages/Options.vue | 12 +- src/pages/Scripts.vue | 26 +- .../Chat\345\274\271\345\271\225.vue" | 6 +- .../Chat\347\273\210\347\253\257.vue" | 2 +- src/pages/chat-view/SystemNotice.vue | 18 +- src/pages/options/OptAccount.vue | 20 +- src/pages/options/OptDev.vue | 136 +- src/pages/options/OptFunction.vue | 65 +- src/pages/options/OptInfo.vue | 16 +- src/pages/options/OptView.vue | 76 +- src/registerServiceWorker.ts | 18 +- vue.config.js | 6 +- 50 files changed, 6763 insertions(+), 2051 deletions(-) delete mode 100644 src/assets/l10n/en-US.json create mode 100644 src/assets/l10n/en-US.po delete mode 100644 src/assets/l10n/zh-CAT.json create mode 100644 src/assets/l10n/zh-CAT.po delete mode 100644 src/assets/l10n/zh-CN.json create mode 100644 src/assets/l10n/zh-CN.po delete mode 100644 src/assets/l10n/zh-TW.json create mode 100644 src/assets/l10n/zh-TW.po delete mode 100644 src/assets/l10n/zh-YUE.json create mode 100644 src/assets/l10n/zh-YUE.po diff --git a/package.json b/package.json index db4cd90..b898485 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "stapxs-qq-lite", - "version": "2.8.6", + "version": "2.9.0", "private": false, "author": "Stapx Steve [林槐]", "description": "一个兼容 OneBot 的非官方网页版 QQ 客户端,使用 Vue 重制的全新版本。", @@ -27,6 +27,7 @@ "detect-browser": "^5.3.0", "electron-store": "^8.1.0", "electron-window-state": "^5.0.3", + "gettext-parser": "^8.0.0", "js-file-downloader": "^1.1.24", "js-yaml-loader": "^1.2.2", "jsonpath": "^1.1.1", @@ -54,6 +55,7 @@ "@types/animejs": "^3.1.12", "@types/css": "^0.0.33", "@types/electron-devtools-installer": "^2.2.0", + "@types/gettext-parser": "^4.0.4", "@types/jsonpath": "^0.2.3", "@types/semver-compare": "^1.0.3", "@typescript-eslint/eslint-plugin": "^5.4.0", diff --git a/src/App.vue b/src/App.vue index 86b463f..e96e526 100644 --- a/src/App.vue +++ b/src/App.vue @@ -35,38 +35,37 @@
-
+