diff --git a/.env b/.env index 9c8442e..59c14cb 100644 --- a/.env +++ b/.env @@ -2,4 +2,5 @@ VITE_BASE_URL= #接口地址 VITE_ASSETSURL=https://cdn.vrupup.com/s/1598/assets/ #资源地址 VITE_APPID=wx9cb717d8151d8486 #小程序APPID VITE_UNI_APPID=_UNI_8842336 #UNI-APPID -VITE_LIBVERSION=3.0.0 #微信小程序基础库 \ No newline at end of file +VITE_LIBVERSION=3.0.0 #微信小程序基础库 +VITE_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=9a401eb2-065a-4882-82e9-b438bcd1eac4#WEBHOOK地址 \ No newline at end of file diff --git a/.manifest-updated b/.manifest-updated new file mode 100644 index 0000000..5a40213 --- /dev/null +++ b/.manifest-updated @@ -0,0 +1 @@ +Manifest updated by HBuilder first compile \ No newline at end of file diff --git a/common/utils/tool.js b/common/utils/tool.js index 0f0395b..4e7ccd3 100644 --- a/common/utils/tool.js +++ b/common/utils/tool.js @@ -16,6 +16,19 @@ class Tool { // 字体加载状态缓存 this.loadedFonts = new Set() + + // 初始化错误统计 + this.errorStats = { + total: 0, + global: 0, + promise: 0, + console: 0, + miniProgram: 0, + lastErrorTime: null, + } + + // Promise包装方法 + this.wrapPromise = null } /** @@ -357,6 +370,497 @@ class Tool { }) }) } + + /** + * 初始化全局错误监控 + * @param {Object} options 配置选项 + * @param {boolean} [options.enableGlobalError=true] 是否启用全局错误捕获 + * @param {boolean} [options.enablePromiseError=true] 是否启用Promise错误捕获 + * @param {boolean} [options.enableConsoleError=true] 是否启用console.error捕获 + * @param {string} [options.webhookUrl] 自定义webhook地址,不传则使用环境变量 + * @param {number} [options.maxRetries=3] 发送失败时最大重试次数 + * @param {number} [options.retryDelay=1000] 重试延迟时间(毫秒) + */ + initErrorMonitor(options = {}) { + const config = { + enableGlobalError: true, + enablePromiseError: true, + enableConsoleError: false, + webhookUrl: import.meta.env.VITE_WEBHOOK, + maxRetries: 3, + retryDelay: 1000, + ...options, + } + + // 检查webhook配置 + if (!config.webhookUrl) { + console.warn('错误监控初始化失败:未配置webhook地址') + return + } + + this.config = config + + // 全局错误捕获(uniapp环境适配) + if (config.enableGlobalError) { + // Web环境 + if (typeof window !== 'undefined') { + window.onerror = (message, source, lineno, colno, error) => { + this._handleGlobalError({ + type: 'global', + message, + source, + lineno, + colno, + error, + timestamp: Date.now(), + }) + } + + // 处理未捕获的Promise错误 + window.addEventListener('unhandledrejection', event => { + this._handlePromiseError({ + type: 'promise', + reason: event.reason, + promise: event.promise, + timestamp: Date.now(), + }) + }) + } + + // uniapp环境 - 提供Promise包装工具 + if (typeof uni !== 'undefined' && config.enablePromiseError) { + // 提供一个包装Promise的方法,让开发者可以手动包装重要的Promise + this.wrapPromise = promise => { + const self = this + return promise.catch(error => { + self._handlePromiseError({ + type: 'promise', + reason: error, + timestamp: Date.now(), + }) + throw error + }) + } + } + } + + // console.error捕获(可选) + if (config.enableConsoleError) { + const originalError = console.error + console.error = (...args) => { + originalError.apply(console, args) + this._handleConsoleError({ + type: 'console', + args: args.map(arg => this._serializeError(arg)), + timestamp: Date.now(), + }) + } + } + + // 微信小程序错误捕获 + if (typeof uni !== 'undefined') { + // 监听小程序错误事件 + uni.onError && + uni.onError(error => { + this._handleMiniProgramError({ + type: 'miniProgram', + error, + timestamp: Date.now(), + }) + }) + + // 监听小程序页面错误 + uni.onPageNotFound && + uni.onPageNotFound(result => { + this._handleMiniProgramError({ + type: 'pageNotFound', + path: result.path, + query: result.query, + timestamp: Date.now(), + }) + }) + + // 监听小程序网络请求错误 + const originalRequest = uni.request + uni.request = options => { + return originalRequest({ + ...options, + fail: err => { + options.fail && options.fail(err) + this._handleNetworkError({ + type: 'network', + url: options.url, + method: options.method, + error: err, + timestamp: Date.now(), + }) + }, + }) + } + } + + console.log('错误监控已初始化') + } + + /** + * 手动上报错误 + * @param {Error|Object} error 错误对象或错误信息 + * @param {Object} [context] 错误上下文信息 + */ + reportError(error, context = {}) { + const errorInfo = { + type: 'manual', + error: error instanceof Error ? error.message : error, + stack: error instanceof Error ? error.stack : null, + context, + timestamp: Date.now(), + url: this._getCurrentUrl(), + userAgent: this._getUserAgent(), + page: getCurrentPageName(), + } + + this._sendErrorToWebhook(errorInfo) + } + + /** + * 获取错误统计信息 + * @returns {Object} 错误统计信息 + */ + getErrorStats() { + return { ...this.errorStats } + } + + /** + * 重置错误统计 + */ + resetErrorStats() { + this.errorStats = { + total: 0, + global: 0, + promise: 0, + console: 0, + lastErrorTime: null, + } + } + + /** + * 处理全局错误 + * @private + */ + _handleGlobalError(errorInfo) { + this.errorStats.total++ + this.errorStats.global++ + this.errorStats.lastErrorTime = errorInfo.timestamp + + this._sendErrorToWebhook({ + ...errorInfo, + message: errorInfo.message || 'Unknown global error', + source: errorInfo.source || '', + lineno: errorInfo.lineno || 0, + colno: errorInfo.colno || 0, + url: this._getCurrentUrl(), + userAgent: this._getUserAgent(), + page: getCurrentPageName(), + }) + } + + /** + * 处理Promise错误 + * @private + */ + _handlePromiseError(errorInfo) { + this.errorStats.total++ + this.errorStats.promise++ + this.errorStats.lastErrorTime = errorInfo.timestamp + + this._sendErrorToWebhook({ + ...errorInfo, + reason: this._serializeError(errorInfo.reason), + url: this._getCurrentUrl(), + userAgent: this._getUserAgent(), + page: getCurrentPageName(), + }) + } + + /** + * 处理console错误 + * @private + */ + _handleConsoleError(errorInfo) { + this.errorStats.total++ + this.errorStats.console++ + this.errorStats.lastErrorTime = errorInfo.timestamp + + this._sendErrorToWebhook({ + ...errorInfo, + url: this._getCurrentUrl(), + userAgent: this._getUserAgent(), + page: getCurrentPageName(), + }) + } + + /** + * 处理小程序错误 + * @private + */ + _handleMiniProgramError(errorInfo) { + this.errorStats.total++ + this.errorStats.miniProgram++ + this.errorStats.lastErrorTime = errorInfo.timestamp + + this._sendErrorToWebhook({ + ...errorInfo, + url: this._getCurrentUrl(), + userAgent: this._getUserAgent(), + page: getCurrentPageName(), + }) + } + + /** + * 处理网络错误 + * @private + */ + _handleNetworkError(errorInfo) { + this.errorStats.total++ + this.errorStats.miniProgram++ + this.errorStats.lastErrorTime = errorInfo.timestamp + + this._sendErrorToWebhook({ + ...errorInfo, + url: this._getCurrentUrl(), + userAgent: this._getUserAgent(), + page: getCurrentPageName(), + }) + } + + /** + * 获取当前URL + * @private + */ + _getCurrentUrl() { + if (typeof window !== 'undefined') { + return window.location?.href || '' + } + + if (typeof uni !== 'undefined') { + try { + const pages = getCurrentPages() + if (pages && pages.length > 0) { + const currentPage = pages[pages.length - 1] + return currentPage.route || '' + } + } catch (error) { + // 忽略错误 + } + } + + return '' + } + + /** + * 获取用户代理信息 + * @private + */ + _getUserAgent() { + if (typeof navigator !== 'undefined') { + return navigator.userAgent || '' + } + + if (typeof uni !== 'undefined') { + try { + const systemInfo = uni.getSystemInfoSync() + return `${systemInfo.platform} ${systemInfo.system} ${systemInfo.model}` + } catch (error) { + return 'Unknown Device' + } + } + + return 'Unknown Device' + } + + /** + * 序列化错误对象 + * @private + */ + _serializeError(error) { + if (error instanceof Error) { + return { + name: error.name, + message: error.message, + stack: error.stack, + } + } + + if (typeof error === 'object' && error !== null) { + try { + return JSON.stringify(error, null, 2) + } catch (e) { + return String(error) + } + } + + return String(error) + } + + /** + * 发送错误到webhook + * @private + */ + async _sendErrorToWebhook(errorInfo, retryCount = 0) { + const webhookUrl = import.meta.env.VITE_WEBHOOK + if (!webhookUrl) { + console.error('未配置webhook地址,无法发送错误信息') + return + } + + try { + // 格式化错误信息 + const message = this._formatErrorMessage(errorInfo) + + // 使用uni.request发送POST请求(适配uniapp环境) + await new Promise((resolve, reject) => { + uni.request({ + url: webhookUrl, + method: 'POST', + header: { + 'Content-Type': 'application/json', + }, + data: { + msgtype: 'text', + text: { + content: message, + mentioned_list: [], + }, + }, + success: resolve, + fail: reject, + }) + }) + + console.log('错误信息已发送到webhook') + } catch (error) { + console.error('发送错误到webhook失败:', error) + + // 重试机制 + if (retryCount < (this.config?.maxRetries || 3)) { + setTimeout(() => { + this._sendErrorToWebhook(errorInfo, retryCount + 1) + }, (this.config?.retryDelay || 1000) * (retryCount + 1)) + } + } + } + + /** + * 格式化错误消息 + * @private + */ + _formatErrorMessage(errorInfo) { + const timestamp = new Date(errorInfo.timestamp).toLocaleString('zh-CN') + + let message = `🚨 JavaScript错误报告\n` + message += `⏰ 时间: ${timestamp}\n` + message += `📱 页面: ${errorInfo.page || '未知页面'}\n` + message += `🌐 链接: ${errorInfo.url || '未知链接'}\n\n` + + switch (errorInfo.type) { + case 'global': + message += `🔍 错误类型: 全局错误\n` + message += `📝 错误信息: ${errorInfo.message}\n` + if (errorInfo.source) { + message += `📂 文件: ${errorInfo.source}\n` + } + if (errorInfo.lineno) { + message += `📍 行号: ${errorInfo.lineno}:${errorInfo.colno}\n` + } + break + + case 'promise': + message += `🔍 错误类型: Promise错误\n` + message += `📝 错误信息: ${this._serializeError(errorInfo.reason)}\n` + break + + case 'console': + message += `🔍 错误类型: Console错误\n` + message += `📝 错误信息: ${errorInfo.args.join(' ')}\n` + break + + case 'miniProgram': + message += `🔍 错误类型: 小程序错误\n` + message += `📝 错误信息: ${errorInfo.error || 'Unknown'}\n` + if (errorInfo.path) { + message += `📱 页面路径: ${errorInfo.path}\n` + } + if (errorInfo.query) { + message += `🔗 查询参数: ${errorInfo.query}\n` + } + break + + case 'network': + message += `🔍 错误类型: 网络错误\n` + message += `📝 请求地址: ${errorInfo.url || 'Unknown'}\n` + message += `📝 请求方法: ${errorInfo.method || 'Unknown'}\n` + message += `📝 错误信息: ${this._serializeError(errorInfo.error)}\n` + break + + default: + message += `🔍 错误类型: ${errorInfo.type}\n` + message += `📝 错误信息: ${this._serializeError(errorInfo.error)}\n` + } + + message += `\n📊 统计信息:\n` + message += `总计错误: ${this.errorStats.total}\n` + message += `全局错误: ${this.errorStats.global}\n` + message += `Promise错误: ${this.errorStats.promise}\n` + message += `Console错误: ${this.errorStats.console}\n` + message += `小程序错误: ${this.errorStats.miniProgram}\n` + + // 添加设备信息 + if (errorInfo.userAgent) { + message += `\n📱 设备信息:\n${errorInfo.userAgent}\n` + } + + return message + } +} + +/** + * 获取当前页面名称 + * @returns {string} 页面名称 + */ +function getCurrentPageName() { + try { + // 尝试从getCurrentPages获取 + const pages = getCurrentPages() + if (pages && pages.length > 0) { + const currentPage = pages[pages.length - 1] + return currentPage.route || currentPage.$page?.fullPath || '未知页面' + } + } catch (error) { + // 忽略错误,返回默认值 + } + + // 微信小程序环境 + if (typeof uni !== 'undefined') { + try { + const currentPages = getCurrentPages?.() + if (currentPages && currentPages.length > 0) { + return currentPages[currentPages.length - 1]?.route || '未知页面' + } + } catch (error) { + return '未知页面' + } + } + + // Web环境 + try { + if (typeof window !== 'undefined' && window.location) { + return window.location.pathname || '未知页面' + } + } catch (error) { + return '未知页面' + } + + return '未知页面' } // 创建单例并导出 diff --git a/main.js b/main.js index 4095eff..69a676e 100644 --- a/main.js +++ b/main.js @@ -2,6 +2,7 @@ import App from './App' import uviewPlus from '/uview-plus' import globalMixin from './mixins/global' import store from './store' +import tool from './common/utils/tool' import { createSSRApp } from 'vue' import './uni.promisify.adaptor' @@ -17,5 +18,13 @@ export function createApp() { app.use(uviewPlus) app.use(globalMixin) app.use(store) + + // 初始化全局错误监控 + tool.initErrorMonitor({ + enableGlobalError: true, + enablePromiseError: true, + enableConsoleError: false, // 可选开启console错误监控 + }) + return { app } } diff --git a/manifest.json b/manifest.json index 03fbc66..4ba00f2 100644 --- a/manifest.json +++ b/manifest.json @@ -1,25 +1,26 @@ { - "name" : "template", - "appid" : "", - "description" : "", - "versionName" : "1.0.0", - "versionCode" : "100", - "vueVersion" : "3", - "uniStatistics" : { - "enable" : false + "name": "template", + "appid": "_UNI_8842336", + "description": "", + "versionName": "1.0.0", + "versionCode": "100", + "vueVersion": "3", + "uniStatistics": { + "enable": false }, - "mp-weixin" : { - "appid" : "", - "setting" : { - "urlCheck" : false, - "es6" : true, - "postcss" : true, - "minified" : true + "mp-weixin": { + "appid": "wx9cb717d8151d8486", + "setting": { + "urlCheck": false, + "es6": true, + "postcss": true, + "minified": true }, - "lazyCodeLoading" : "requiredComponents", - "usingComponents" : true, - "optimization" : { - "subPackages" : true - } + "lazyCodeLoading": "requiredComponents", + "usingComponents": true, + "optimization": { + "subPackages": true + }, + "libVersion": "3.0.0" } -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2d19ff4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,299 @@ +{ + "name": "template-mp", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "dayjs": "*", + "dotenv": "^17.2.2", + "vue": "^3.5.21" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.25.tgz", + "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.25", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz", + "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz", + "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.25", + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz", + "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.25.tgz", + "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.25.tgz", + "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz", + "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/runtime-core": "3.5.25", + "@vue/shared": "3.5.25", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.25.tgz", + "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "vue": "3.5.25" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.25.tgz", + "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue": { + "version": "3.5.25", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.25.tgz", + "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-sfc": "3.5.25", + "@vue/runtime-dom": "3.5.25", + "@vue/server-renderer": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + } + } +} diff --git a/pages.json b/pages.json index 88b29f0..b86d452 100644 --- a/pages.json +++ b/pages.json @@ -14,20 +14,6 @@ ] } ], - "tabBar": { - "color": "#c3c3c3", - "selectedColor": "#454c5c", - "backgroundColor": "#ffffff", - "borderStyle": "black", - "list": [ - { - "pagePath": "pages/index/index", - "text": "首页", - "iconPath": "static/assets/icon_home.png", - "selectedIconPath": "static/assets/icon_home_selected.png" - } - ] - }, "easycom": { "autoscan": true, "custom": { diff --git a/pages/index/index.vue b/pages/index/index.vue index 6ff5ec6..1a08afa 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -3,7 +3,6 @@