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)
}
})