diff --git a/tra-app/.env.development b/tra-app/.env.development index 9a63819..f235ef7 100644 --- a/tra-app/.env.development +++ b/tra-app/.env.development @@ -5,21 +5,17 @@ ENV = 'development' # VITE_APP_BASE_API_Url = 'https://aits.jlbank.com.cn:7001' -VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' - - +VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7001' # VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' - - # VITE_APP_BASE_API_Url = 'http://192.168.247.200' # VITE_APP_BASE_API_Url = 'http://aitscdn.jlbank.com.cn:7001' # VITE_APP_BASE_API_Url = 'http://192.168.108.129' # dev -# VITE_APP_BASE_API_Url = 'http://25.18.122.65:7001' +#VITE_APP_BASE_API_Url = 'http://25.18.122.65:7001' # sit -# VITE_APP_BASE_API_Url = 'http://25.18.122.91:9786' +#VITE_APP_BASE_API_Url = 'http://25.18.122.91:9786' # UAT # VITE_APP_BASE_API_Url = 'http://25.18.122.78:9786' @@ -34,6 +30,6 @@ VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' # h5专用地址x2 # VITE_APP_BASE_H5_API_Url_TRAAPP = 'http://25.64.32.150:9601' # dev -#VITE_APP_BASE_H5_API_Url = 'http://25.18.122.65:7001' +# VITE_APP_BASE_H5_API_Url = 'http://25.18.122.65:7001' # sit -# VITE_APP_BASE_H5_API_Url = 'http://25.18.122.91:9786' \ No newline at end of file +#VITE_APP_BASE_H5_API_Url = 'http://25.18.122.91:9786' \ No newline at end of file diff --git a/tra-app/.env.development.yh b/tra-app/.env.development.yh index c56d90f..193ce29 100644 --- a/tra-app/.env.development.yh +++ b/tra-app/.env.development.yh @@ -11,4 +11,5 @@ VITE_APP_BASE_H5_API_Url = 'http://25.18.122.91:9786' # VITE_APP_BASE_H5_API_Url_TRAPRACTICE = 'http://25.64.32.156:9603' # VITE_APP_BASE_H5_API_Url_TRAAPP = 'http://25.64.32.154:9601' # VITE_APP_BASE_H5_API_Url_TRAAPP = 'http://25.64.32.158:9601' +# VITE_APP_BASE_H5_API_Url_TRASTUDY = 'http://25.64.32.154:9602' diff --git a/tra-app/package.json b/tra-app/package.json index b9725b1..b0df4ff 100644 --- a/tra-app/package.json +++ b/tra-app/package.json @@ -42,7 +42,8 @@ "terser": "^5.42.0", "uuid": "^11.1.0", "vue": "^3.5.11", - "vue-i18n": "^9.1.9" + "vue-i18n": "^9.1.9", + "text-encoding": "^0.7.0" }, "devDependencies": { "@dcloudio/types": "^3.4.8", diff --git a/tra-app/src/components/cached-avatar/cached-avatar.vue b/tra-app/src/components/cached-avatar/cached-avatar.vue index ff1a20b..cc2475d 100644 --- a/tra-app/src/components/cached-avatar/cached-avatar.vue +++ b/tra-app/src/components/cached-avatar/cached-avatar.vue @@ -8,7 +8,7 @@ import { ref, reactive, watch, onMounted } from 'vue'; import { defaultAvatar } from '@/enum.js'; import { getUserInfo } from '@/common/common'; - + const imagePath = ref(''); const imageAddr = ref(''); diff --git a/tra-app/src/components/image-preview/preview-detail.vue b/tra-app/src/components/image-preview/preview-detail.vue index 80ea81a..5b369f4 100644 --- a/tra-app/src/components/image-preview/preview-detail.vue +++ b/tra-app/src/components/image-preview/preview-detail.vue @@ -22,6 +22,7 @@ import { useStorageStore } from "@/store/storage.js" import { get_base_url } from '@/api/request.js' import imagePreviewVue from './image-preview.vue' + import { getToken } from '@/common/common.js' export default { name:"video-preview", components:{imagePreviewVue}, @@ -74,11 +75,11 @@ handler(newval, oldval) { if(this.fileType === 'image'){ if (newval.indexOf('/') === 0) { - this.fileUrlShow = this.base_url + newval; + this.fileUrlShow = this.base_url + newval + '?tk=' + getToken(); return; } if (newval.indexOf('http') === 0) { - this.fileUrlShow = newval; + this.fileUrlShow = newval + '?tk=' + getToken(); return; } if (newval && this.watching) { @@ -87,7 +88,7 @@ } if(this.fileType === 'video'){ if(newval.indexOf('http') === 0){ - this.fileUrlShow = newval + this.fileUrlShow = newval + '?tk=' + getToken() }else{ if (newval && this.watching) { this.getPreviewUrlBlob(newval); @@ -102,9 +103,9 @@ src: { handler(newval, oldval) { if(newval.indexOf('http') === 0){ - this.fileUrlShow = newval + this.fileUrlShow = newval + '?tk=' + getToken() }else{ - this.fileUrlShow = this.base_url + newval + this.fileUrlShow = this.base_url + newval + '?tk=' + getToken() } }, immediate: true, @@ -132,7 +133,7 @@ return; } previewCacheThumbImage(id, this.width, this.height).then((res) => { - this.fileUrlShow = res; + this.fileUrlShow = res + '?tk=' + getToken(); this.storageStore.setStorage('image', `/${id}/${this.width}/${this.height}`, res); }); } else { @@ -183,7 +184,7 @@ if (this.fileId) { let _newDate = new Date().getTime() if(this.fileId.indexOf('http') === 0){ - this.fileUrlShow = this.fileId + '?t=' + _newDate + this.fileUrlShow = this.fileId + '?tk=' + getToken() + '&t=' + _newDate }else{ this.getPreviewUrlBlob(this.fileId); } @@ -213,7 +214,7 @@ return } let _newDate = new Date().getTime() - this.fileUrlShow = getPreviewFileUrl(this.fileId)+'?t=' + _newDate + this.fileUrlShow = getPreviewFileUrl(this.fileId) + '?tk=' + getToken() + '&t=' + _newDate // downloadFile(id).then(res=>{ // this.fileUrlShow = res.tempFilePath // this.storageStore.setStorage('video', id, this.fileUrlShow) @@ -222,7 +223,7 @@ getPreviewFileUrlNow(id){ let _newDate = new Date().getTime() if(id.indexOf('http') === 0){ - this.fileUrlShow = id + '?t=' + _newDate + this.fileUrlShow = id + '?tk=' + getToken() + '&t=' + _newDate return } if (id && this.watching) { diff --git a/tra-app/src/components/image-preview/video-preview.vue b/tra-app/src/components/image-preview/video-preview.vue index bfd3d5d..290596b 100644 --- a/tra-app/src/components/image-preview/video-preview.vue +++ b/tra-app/src/components/image-preview/video-preview.vue @@ -31,6 +31,7 @@ import { useStorageStore } from "@/store/storage.js" import { get_base_url } from '@/api/request.js' import imagePreviewVue from './image-preview.vue' + import { getToken } from '@/common/common.js' export default { name:"video-preview", components:{ imagePreviewVue }, @@ -75,7 +76,7 @@ fileId: { handler(newval, oldval) { if(newval.indexOf('http') === 0){ - this.fileUrlShow = newval + this.fileUrlShow = newval + '?tk=' + getToken() }else{ if (newval && this.watching) { this.getPreviewUrlBlob(newval); @@ -129,7 +130,7 @@ return } let _newDate = new Date().getTime() - this.fileUrlShow = getPreviewFileUrl(this.fileId)+'?t=' + _newDate + this.fileUrlShow = getPreviewFileUrl(this.fileId) + '?tk=' + getToken() + '&t=' + _newDate // downloadFile(id).then(res=>{ // this.fileUrlShow = res.tempFilePath // this.storageStore.setStorage('video', id, this.fileUrlShow) @@ -150,7 +151,7 @@ if (this.fileId) { let _newDate = new Date().getTime() if(this.fileId.indexOf('http') === 0){ - this.fileUrlShow = this.fileId + '?t=' + _newDate + this.fileUrlShow = this.fileId + '?tk=' + getToken() + '&t=' + _newDate }else{ this.getPreviewUrlBlob(this.fileId); } diff --git a/tra-app/src/components/points-and-badge/check-in.vue b/tra-app/src/components/points-and-badge/check-in.vue index 3596321..f1a6a7b 100644 --- a/tra-app/src/components/points-and-badge/check-in.vue +++ b/tra-app/src/components/points-and-badge/check-in.vue @@ -138,8 +138,11 @@ }, failCb: (res) => { checkInLoading.value = false; - console.log('签到失败', res); - common.msg('签到失败,请稍后再试'); + if (res.data.rtnCode === '0002') { + common.msg(res.data.message); + } else { + common.msg('签到失败,请稍后再试'); + } } }); }; diff --git a/tra-app/src/components/points-and-badge/usePointsAndBadge.js b/tra-app/src/components/points-and-badge/usePointsAndBadge.js index a702c17..4e4bb02 100644 --- a/tra-app/src/components/points-and-badge/usePointsAndBadge.js +++ b/tra-app/src/components/points-and-badge/usePointsAndBadge.js @@ -34,88 +34,118 @@ export default function usePointsAndBadge() { * @param {any} res - 接口返回数据 */ const handlePointsBadgePopup = (points, pointsBadges, complete = () => {}, res = {}) => { - // AI问答仅弹徽章弹窗 - if (points?.length > 0) { - // 普通场景:先弹积分弹窗,再弹徽章弹窗 - pointsRef.value?.open(points, pointsBadges, (status, pointsList, badgesList) => { - pointsRef.value.close(); - // 有徽章则弹徽章弹窗,否则直接完成 - if (badgesList?.length > 0) { - nextTick(() => { - setTimeout(() => { - badgeRef.value.open(pointsList, badgesList, () => { - badgeRef.value.close(); - complete(true, '积分获取成功', res); + // AI问答仅弹徽章弹窗 + if (points?.length > 0) { + // 普通场景:先弹积分弹窗,再弹徽章弹窗 + pointsRef.value?.open(points, pointsBadges, (status, pointsList, badgesList) => { + pointsRef.value.close(); + if(pointsList.length > 0) { + setTimeout(() => { + pointsRef.value?.open(pointsList, badgesList, (status, pointsList, + badgesList) => { + pointsRef.value.close(); + // 有徽章则弹徽章弹窗,否则直接完成 + if (badgesList?.length > 0) { + nextTick(() => { + setTimeout(() => { + badgeRef.value.open(pointsList, + badgesList, () => { + badgeRef.value.close(); + complete(true, '积分获取成功', + res); + }); + }, pop_up_time); }); - }, pop_up_time); + } else { + complete(true, '积分获取成功', res); + } }); - } else { - complete(true, '积分获取成功', res); - } - }); - } else if (pointsBadges?.length > 0) { - badgeRef.value.open([], pointsBadges, () => { - badgeRef.value.close(); + }, 300) + } else if (badgesList?.length > 0) { + // 有徽章则弹徽章弹窗,否则直接完成 + nextTick(() => { + setTimeout(() => { + badgeRef.value.open(pointsList, badgesList, () => { + badgeRef.value.close(); + complete(true, '积分获取成功', res); + }); + }, pop_up_time); + }); + } else { complete(true, '积分获取成功', res); - }); - }else{ + } + }); + } else if (pointsBadges?.length > 0) { + badgeRef.value.open([], pointsBadges, () => { + badgeRef.value.close(); + complete(true, '积分获取成功', res); + }); + } else { + complete(false, '积分接口返回数据异常', res); + } + }; + + /** + * 积分和徽章处理主方法 + * @param {string} type - 任务类型(04:课程练习,06:AI问答,其他:普通任务) + * @param {string|null} taskId - 任务ID + * @param {Function} complete - 完成回调(status, message, data) + */ + const pointAndBadgesRun = async (type, taskId = '', complete = () => {}) => { + + try { + console.log('调用积分接口'); + const res = await addPointsByTask({ + type, + taskId + }); + + // 防御性处理:确保res.body存在 + if (!res?.body) { complete(false, '积分接口返回数据异常', res); + return; } - }; - - /** - * 积分和徽章处理主方法 - * @param {string} type - 任务类型(04:课程练习,06:AI问答,其他:普通任务) - * @param {string|null} taskId - 任务ID - * @param {Function} complete - 完成回调(status, message, data) - */ - const pointAndBadgesRun = async (type, taskId = '', complete = () => {}) => { - - try { - console.log('调用积分接口'); - const res = await addPointsByTask({ - type, - taskId - }); - - // 防御性处理:确保res.body存在 - if (!res?.body) { - complete(false, '积分接口返回数据异常', res); + const { + points, + pointsBadges, + message = '' + } = res.body; + // const points = [{ + // "changePoints": 1, + // "message": '学习时长累计1小时' + // }, + // { + // "changePoints": 10, + // "message": '完成课程学习' + // } + // ] + // 分支逻辑:按类型处理 + switch (type) { + case '04': // 04:课程练习,自定义返回逻辑,不弹弹窗 + complete(true, '', res.body); // 补充回调,避免调用方等待 return; - } - const { - points, - pointsBadges, - message = '' - } = res.body; - - // 分支逻辑:按类型处理 - switch (type) { - case '04': // 04:课程练习,自定义返回逻辑,不弹弹窗 - complete(true, '', res.body); // 补充回调,避免调用方等待 - return; - case '06': // 06:AI问答,仅弹徽章弹窗 - if (pointsBadges?.length > 0) { - handlePointsBadgePopup(points, pointsBadges, complete, res); - } else { - complete(true, '', res); - } - return; - // 其他类型:弹积分+徽章弹窗 - default: + case '06': // 06:AI问答,仅弹徽章弹窗 + if (pointsBadges?.length > 0) { handlePointsBadgePopup(points, pointsBadges, complete, res); - return; - } - } catch (error) { - // 细化错误信息:区分网络错误/接口错误 - const errorMsg = error?.message || '积分获取失败'; - complete(false, `积分获取失败:${errorMsg}`, error); + } else { + complete(true, '', res); + } + return; + // 其他类型:弹积分+徽章弹窗 + default: + handlePointsBadgePopup(points, pointsBadges, complete, res); + return; } - }; - return { - pointAndBadgesRun, - handlePointsBadgePopup, - badgeRef, - pointsRef - }; - } \ No newline at end of file + } catch (error) { + // 细化错误信息:区分网络错误/接口错误 + const errorMsg = error?.message || '积分获取失败'; + complete(false, `积分获取失败:${errorMsg}`, error); + } + }; + return { + pointAndBadgesRun, + handlePointsBadgePopup, + badgeRef, + pointsRef + }; +} \ No newline at end of file diff --git a/tra-app/src/pages.json b/tra-app/src/pages.json index 62ee516..68ecbeb 100644 --- a/tra-app/src/pages.json +++ b/tra-app/src/pages.json @@ -516,6 +516,7 @@ "path": "pages/sparring/talk", "style": { "navigationBarTitleText": "AI陪练通话", + "disableSwipeBack": true, "app-plus": { "titleNView": false } diff --git a/tra-app/src/pages/analytics/study.vue b/tra-app/src/pages/analytics/study.vue index 9c52ab1..42a3cf6 100644 --- a/tra-app/src/pages/analytics/study.vue +++ b/tra-app/src/pages/analytics/study.vue @@ -6,7 +6,11 @@ - + + + - {{statisticsObj.completeTaskCnt }} + {{statisticsObj.completeTaskCnt }} @@ -61,7 +65,7 @@ 完成考试数 - {{statisticsObj.completedExamCnt }} + {{statisticsObj.completedExamCnt }} @@ -70,7 +74,7 @@ 考试及格率 - {{statisticsObj.passExamRate }} + {{statisticsObj.passExamRate }} % @@ -104,7 +108,7 @@ - + @@ -113,7 +117,7 @@ - + @@ -122,7 +126,7 @@ - + @@ -130,7 +134,7 @@ - + @@ -186,15 +190,15 @@ }) const calendarRef = ref() const statisticsObj = ref({ - crsStdyTmLen: 0, - completeTaskCnt: 0, - completedExamCnt: 0, - passExamRate: 0, - partnerCnt: 0, - askCnt: 0, - completeCrsCnt: 0, - crsCompleteRate: 0, - partnerRate: 0 + crsStdyTmLen: 0, + completeTaskCnt: 0, + completedExamCnt: 0, + passExamRate: 0, + partnerCnt: 0, + askCnt: 0, + completeCrsCnt: 0, + crsCompleteRate: 0, + partnerRate: 0 }) const dimesionList = ref([]) const studyList = ref([]) @@ -225,17 +229,20 @@ loading.value = true try { let _res1 = await queryStudyStatistics(params) - statisticsObj.value = {..._res1.body} + statisticsObj.value = { + ..._res1.body + } let _res2 = await queryDimesionInfo(params) dimesionList.value = [..._res2.body] let _res3 = await queryHabitInfo(params) studyList.value = [..._res3.body] let _res4 = await querySuggestInfo(params) - if(_res4.body && _res4.body.length > 0){ - suggestObj.value = {..._res4.body[0]} + if (_res4.body && _res4.body.length > 0) { + suggestObj.value = { + ..._res4.body[0] + } } - } catch { - } finally{ + } catch {} finally { loading.value = false } } @@ -246,9 +253,9 @@ const changeTab = (info) => { activeTabVal.value = info.value if (info.value === '04') { - dateinputRef.value&&dateinputRef.value?.clear() + dateinputRef.value && dateinputRef.value?.clear() daterange.value = ['', ''] - }else{ + } else { getInfoNow({ dateType: activeTabVal.value }) @@ -308,6 +315,11 @@ // position: fixed; // float: left; // margin-top: var(--status-bar-height); + background-image: url(@/static/images/analytics/title.png); + background-repeat: no-repeat; + background-position: 26rpx 125rpx; + background-size: 277rpx 135rpx; + .top-title { height: 90rpx; @@ -363,6 +375,33 @@ position: relative; margin-bottom: 24rpx; backdrop-filter: blur(10rpx); + z-index: 1; + + &.loading-box-cont{ + background: #ddeafa; + &::before { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + border-radius: 15rpx; + z-index: 2; + // #ddeafa + background: url(@/static/images/analytics/bg2.png) no-repeat; + background-size: cover; + background-position: center; + backdrop-filter: blur(10rpx); + } + } + + .loading-box { + position: absolute; + z-index: 3; + top: 120rpx; + left: 50%; + transform: translateX(-50%); + } .calendar-box { position: absolute; @@ -385,6 +424,7 @@ padding-bottom: 20rpx; width: 100%; overflow: hidden; + position: relative; .analytics-item { padding-bottom: 12rpx; @@ -405,6 +445,7 @@ &-value { font-size: 54rpx; font-weight: 600; + &-v { font-family: DINAlternate, DINAlternate; } @@ -428,13 +469,15 @@ margin-bottom: 24rpx; position: relative; min-height: 200rpx; - .loading-box{ + + .loading-box { position: absolute; top: 120rpx; left: 50%; transform: translateX(-50%); } - &::before{ + + &::before { content: ''; display: block; position: absolute; @@ -445,26 +488,27 @@ top: -12rpx; background-size: cover; } + &.dens { - &::before{ + &::before { background-image: url(@/static/images/analytics/weidu-1.png); } } &.study { - &::before{ + &::before { background-image: url(@/static/images/analytics/study1-1.png) } } &.study1 { - &::before{ + &::before { background-image: url(@/static/images/analytics/study-1.png); } } &.course { - &::before{ + &::before { background-image: url(@/static/images/analytics/course-1.png); } } @@ -524,11 +568,13 @@ background-repeat: no-repeat; background-size: 100% 100%; } - &.study2-tip{ + + &.study2-tip { &::before { background-image: url(@/static/images/analytics/den-tips2.png); } } + &.bg-tm { padding-left: 54rpx; background-image: url(@/static/images/analytics/time-icon.png); diff --git a/tra-app/src/pages/competition/result.vue b/tra-app/src/pages/competition/result.vue index d607719..ec763a0 100644 --- a/tra-app/src/pages/competition/result.vue +++ b/tra-app/src/pages/competition/result.vue @@ -1,5 +1,6 @@ +