From b127837423b926b57b7139b390f356fb65a28000 Mon Sep 17 00:00:00 2001 From: Lilixu007 <1273914445@qq.com> Date: Thu, 26 Feb 2026 15:21:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A0=B7=E5=BC=8F=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AI语音的还未更改 --- xinlidsj/manifest.json | 2 +- xinlidsj/pages/index/index.vue | 199 +++++++++++++++++++++++---- xinlidsj/pages/profile/tagFilter.vue | 30 ++-- xinlidsj/utils/auth.js | 4 +- xinlidsj/utils/request.js | 26 +++- 5 files changed, 222 insertions(+), 39 deletions(-) diff --git a/xinlidsj/manifest.json b/xinlidsj/manifest.json index 252e7f0..305ff34 100644 --- a/xinlidsj/manifest.json +++ b/xinlidsj/manifest.json @@ -1,6 +1,6 @@ { "name" : "xinlijs", - "appid" : "__UNI__75D55B4", + "appid" : "__UNI__DFFA04F", "description" : "", "versionName" : "1.0.0", "versionCode" : "100", diff --git a/xinlidsj/pages/index/index.vue b/xinlidsj/pages/index/index.vue index 47875c4..334d772 100644 --- a/xinlidsj/pages/index/index.vue +++ b/xinlidsj/pages/index/index.vue @@ -141,7 +141,7 @@ 刑期 / 罪名分析 - + @@ -183,7 +183,7 @@ - + @@ -284,7 +284,7 @@ 加载中... - + @@ -311,7 +311,7 @@ 综合报告 - + @@ -328,7 +328,7 @@ import { getUnreadNoticeTop, markNoticeRead } from '../../api/app/notice' import { getUnreadMessageList, markMessageRead } from '../../api/app/message' import { openLink, getMessageWsUrl } from '../../utils/link' - import { request } from '../../utils/request' + import { request, setAuthFailureCallback } from '../../utils/request' import { getBaseUrl } from '../../utils/config' import { getReport, listReport } from '../../api/psychology/report' import { getStudentOptions, getUserAssessmentSummary } from '../../api/psychology/assessment' @@ -342,9 +342,28 @@ UniIcons, LoginModal }, + // 捕获子组件错误,防止图表错误影响整个应用 + errorCaptured(err, vm, info) { + // 如果是图表相关的错误,静默处理 + if (err && err.message && ( + err.message.includes('firstElementChild') || + err.message.includes('Cannot destructure') || + err.message.includes('qiun-data-charts') + )) { + console.warn('图表渲染警告(已处理):', err.message) + // 返回 false 阻止错误继续传播 + return false + } + // 其他错误继续传播 + return true + }, data() { return { showLoginModal: false, + hasCheckedLogin: false, + isMounted: false, + chartKey: 0, + resizeTimer: null, socketOpen: false, connecting: false, voiceTipsOpen: false, @@ -544,34 +563,128 @@ } }, onLoad() { + console.log('=== onLoad 触发 ===') + + // 注册认证失败回调 - 显示登录弹窗 + setAuthFailureCallback(() => { + console.log('认证失败回调触发,显示登录弹窗') + this.showLoginModal = true + this.bigErrorMsg = '' + }) + try { const info = uni.getSystemInfoSync() + console.log('系统信息:', info) this.isH5 = info && info.uniPlatform === 'web' + console.log('isH5:', this.isH5) } catch (e) { + console.error('获取系统信息失败:', e) this.isH5 = false } // 检查登录状态 - const token = getToken() - if (!token) { - this.showLoginModal = true - return + this.checkLoginStatus() + }, + onReady() { + // 组件渲染完成后延迟标记为已挂载,确保DOM完全准备好 + setTimeout(() => { + this.$nextTick(() => { + this.isMounted = true + }) + }, 300) + + // 监听窗口大小变化 + // #ifdef H5 + window.addEventListener('resize', this.handleResize) + // #endif + }, + onUnload() { + // 移除窗口大小变化监听 + // #ifdef H5 + window.removeEventListener('resize', this.handleResize) + // #endif + + // 清理定时器 + if (this.resizeTimer) { + clearTimeout(this.resizeTimer) } - this.initApp() }, onShow() { + console.log('=== onShow 触发 ===') // 检查登录状态 - const token = getToken() - if (!token) { - this.showLoginModal = true - return - } - this.checkUnreadNoticePopup() - this.checkUnreadMessagePopup() - if (this.isH5) { - this.fetchInboxList() - } + this.checkLoginStatus() }, methods: { + handleResize() { + // 防抖处理:窗口大小变化时,先隐藏图表,等待调整完成后再显示 + if (this.resizeTimer) { + clearTimeout(this.resizeTimer) + } + + try { + // 暂时隐藏图表,避免resize时的错误 + this.isMounted = false + + // 1200ms后重新显示图表并更新key强制重新渲染 + this.resizeTimer = setTimeout(() => { + try { + this.chartKey++ + // 延迟300ms再显示,确保DOM完全准备好 + setTimeout(() => { + this.$nextTick(() => { + this.isMounted = true + }) + }, 300) + } catch (e) { + console.error('图表重新渲染失败:', e) + // 即使出错也要恢复显示 + this.isMounted = true + } + }, 1200) + } catch (e) { + console.error('处理窗口大小变化失败:', e) + // 出错时恢复显示 + this.isMounted = true + } + }, + checkLoginStatus() { + console.log('=== checkLoginStatus 开始 ===') + const token = getToken() + console.log('当前token:', token ? '存在' : '不存在') + console.log('token值:', token) + console.log('showLoginModal当前状态:', this.showLoginModal) + + if (!token) { + // 没有token,显示登录框 + console.log('没有token,准备显示登录框') + if (!this.showLoginModal) { + console.log('设置showLoginModal = true') + this.showLoginModal = true + this.hasCheckedLogin = true + } else { + console.log('登录框已经显示,跳过') + } + return false + } + + console.log('有token,继续初始化') + // 有token,标记已检查过登录 + this.hasCheckedLogin = true + + // 如果是首次加载(onLoad触发),初始化应用 + if (!this.socketOpen && !this.connecting) { + console.log('初始化应用') + this.initApp() + } + + // 执行其他操作 + this.checkUnreadNoticePopup() + this.checkUnreadMessagePopup() + if (this.isH5) { + this.fetchInboxList() + } + + return true + }, initApp() { if (this.isH5) { this.fetchCenterVideo() @@ -585,8 +698,13 @@ } }, onLoginSuccess() { - // 登录成功后初始化应用 - this.initApp() + console.log('=== 登录成功回调 ===') + // 关闭登录弹窗 + this.showLoginModal = false + // 重置登录检查标记 + this.hasCheckedLogin = false + // 重新检查登录状态并初始化应用 + this.checkLoginStatus() }, getBailianConfig() { const HARDCODED_BAILIAN_API_KEY = 'sk-f991fd13fb044abebeaea81b9848c22b' @@ -1564,6 +1682,15 @@ } }, fetchBigData() { + // 检查是否有token,没有token不发起请求 + const token = getToken() + if (!token) { + console.log('fetchBigData: 没有token,跳过请求') + this.applyBigDemoData() + return + } + + console.log('fetchBigData: 开始请求,token存在') if (this.bigLoading) return this.bigLoading = true this.bigErrorMsg = '' @@ -1573,10 +1700,20 @@ ]) .then(([aRes, dRes]) => { this.bigLoading = false + console.log('fetchBigData: analytics响应 code:', aRes.data?.code) const aData = aRes && aRes.data ? aRes.data : null const dData = dRes && dRes.data ? dRes.data : null + + // 认证失败已在request.js中统一处理,这里只处理其他错误 if (!aData || aData.code !== 200) { - this.bigErrorMsg = (aData && aData.msg) ? aData.msg : '概览加载失败' + const errorMsg = (aData && aData.msg) ? aData.msg : '概览加载失败' + console.error('fetchBigData: 请求失败,code:', aData ? aData.code : 'null') + // 如果是认证失败,不显示错误消息(已在request.js中处理) + if (aData && (aData.code === 401 || aData.code === 403)) { + this.bigErrorMsg = '' + } else { + this.bigErrorMsg = errorMsg + } this.applyBigDemoData() return } @@ -1593,6 +1730,7 @@ }) .catch((e) => { this.bigLoading = false + console.error('fetchBigData: 请求异常', e) this.bigErrorMsg = e && e.message ? e.message : '网络错误' this.applyBigDemoData() }) @@ -1726,6 +1864,14 @@ this.voiceTipsOpen = !this.voiceTipsOpen }, fetchInboxList() { + // 检查是否有token,没有token不发起请求 + const token = getToken() + if (!token) { + console.log('fetchInboxList: 没有token,跳过请求') + this.bigInboxList = [] + return + } + if (this.bigInboxLoading) return this.bigInboxLoading = true getUnreadMessageList(6) @@ -2160,11 +2306,12 @@ } .page.big { - height: 100vh; - padding: 12rpx 12rpx 0; + min-height: 100vh; + padding: 12rpx 12rpx 20rpx; box-sizing: border-box; position: relative; - overflow: hidden; + overflow-x: hidden; + overflow-y: auto; --neon-a: rgba(0, 240, 255, 0.95); --neon-b: rgba(60, 140, 255, 0.95); --neon-soft: rgba(0, 240, 255, 0.18); diff --git a/xinlidsj/pages/profile/tagFilter.vue b/xinlidsj/pages/profile/tagFilter.vue index 353390e..6d6865b 100644 --- a/xinlidsj/pages/profile/tagFilter.vue +++ b/xinlidsj/pages/profile/tagFilter.vue @@ -213,10 +213,11 @@ } .page.big .big-top { height: 120rpx; - border-radius: 16rpx; - border: 1px solid rgba(0, 188, 255, 0.22); - background: linear-gradient(90deg, rgba(2, 8, 22, 0.86) 0%, rgba(2, 8, 22, 0.40) 50%, rgba(2, 8, 22, 0.86) 100%); - box-shadow: 0 10rpx 22rpx rgba(0, 0, 0, 0.35), 0 0 24rpx rgba(0, 166, 255, 0.14); + border-radius: 14rpx; + border: 1px solid rgba(0, 240, 255, 0.18); + background: linear-gradient(180deg, rgba(2, 10, 26, 0.88) 0%, rgba(2, 10, 26, 0.70) 100%); + box-shadow: 0 10rpx 22rpx rgba(0, 0, 0, 0.40); + backdrop-filter: blur(10px); display: flex; flex-direction: row; align-items: center; @@ -230,18 +231,24 @@ left: 20rpx; top: 50%; transform: translateY(-50%); - width: 60rpx; - height: 60rpx; + width: 64rpx; + height: 64rpx; display: flex; align-items: center; justify-content: center; border-radius: 12rpx; - background: rgba(0, 188, 255, 0.12); - border: 1px solid rgba(0, 188, 255, 0.22); + background: rgba(0, 240, 255, 0.08); + border: 1px solid rgba(0, 240, 255, 0.20); cursor: pointer; + transition: all 0.2s ease; + } + .page.big .big-back:hover { + background: rgba(0, 240, 255, 0.15); + border-color: rgba(0, 240, 255, 0.35); } .page.big .big-back:active { - background: rgba(0, 188, 255, 0.20); + background: rgba(0, 240, 255, 0.22); + transform: translateY(-50%) scale(0.95); } .page.big .big-top-content { display: flex; @@ -253,7 +260,10 @@ font-size: 34rpx; font-weight: 900; letter-spacing: 2rpx; - color: rgba(220, 250, 255, 0.95); + color: rgba(242, 252, 255, 0.98); + text-shadow: + 0 2rpx 12rpx rgba(0, 0, 0, 0.65), + 0 0 18rpx rgba(0, 240, 255, 0.26); } .page.big .big-sub { font-size: 22rpx; diff --git a/xinlidsj/utils/auth.js b/xinlidsj/utils/auth.js index 5eb3165..bd8c6a7 100644 --- a/xinlidsj/utils/auth.js +++ b/xinlidsj/utils/auth.js @@ -1,7 +1,9 @@ import { STORAGE_KEYS } from './config' export function getToken() { - return uni.getStorageSync(STORAGE_KEYS.token) || '' + const token = uni.getStorageSync(STORAGE_KEYS.token) || '' + console.log('getToken调用 - STORAGE_KEY:', STORAGE_KEYS.token, '- token:', token ? '存在' : '不存在') + return token } export function setToken(token) { diff --git a/xinlidsj/utils/request.js b/xinlidsj/utils/request.js index c5f6fa3..49821f9 100644 --- a/xinlidsj/utils/request.js +++ b/xinlidsj/utils/request.js @@ -1,5 +1,13 @@ import { getBaseUrl } from './config' -import { getToken } from './auth' +import { getToken, clearToken } from './auth' + +// 用于存储认证失败的回调 +let authFailureCallback = null + +// 设置认证失败的回调函数 +export function setAuthFailureCallback(callback) { + authFailureCallback = callback +} export function request(options) { const baseUrl = getBaseUrl() @@ -8,6 +16,10 @@ export function request(options) { if (token) { const normalized = token.startsWith('Bearer ') ? token : ('Bearer ' + token) headers['Authorization'] = normalized + console.log('请求URL:', baseUrl + options.url) + console.log('Authorization头:', normalized.substring(0, 50) + '...') + } else { + console.warn('请求时没有token:', baseUrl + options.url) } return new Promise((resolve, reject) => { @@ -16,9 +28,21 @@ export function request(options) { url: baseUrl + options.url, header: headers, success: (res) => { + const data = res.data + // 统一处理认证失败 + if (data && (data.code === 401 || data.code === 403)) { + console.error('认证失败,清除token并显示登录弹窗:', data.msg) + // 清除过期的token + clearToken() + // 调用认证失败回调(显示登录弹窗) + if (authFailureCallback) { + authFailureCallback() + } + } resolve(res) }, fail: (err) => { + console.error('请求失败:', err) reject(err) } })