From 58adee173b8d1d17eddca06c5b9236aa17107478 Mon Sep 17 00:00:00 2001 From: yanghang Date: Wed, 2 Jul 2025 11:04:58 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=80=8D=E9=80=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/request.js | 5 + src/api/socket.js | 8 +- src/api/study.js | 36 +- src/components/loading.vue | 352 ++++++++++++++++++++ src/main.js | 2 + src/pages/course/components/talkingItem.vue | 66 +++- src/pages/course/study.vue | 216 +++++++++--- src/static/images/course/send.png | Bin 0 -> 1681 bytes src/static/images/course/setting.png | Bin 0 -> 1350 bytes 9 files changed, 617 insertions(+), 68 deletions(-) create mode 100644 src/components/loading.vue create mode 100644 src/static/images/course/send.png create mode 100644 src/static/images/course/setting.png diff --git a/src/api/request.js b/src/api/request.js index c6b60f82..2afaf5f3 100644 --- a/src/api/request.js +++ b/src/api/request.js @@ -49,6 +49,7 @@ export default function request({ meta, isStream, suppressErrors, + toastErrors, header = {}, timeout = 6000 }) { @@ -80,6 +81,10 @@ export default function request({ const res = response.data if (res?.rtnCode === '0000') { return resolve(res) + }else{ + if(toastErrors){ + common.msg(res?.message) + } } //到这里下面全是异常的处理 if (suppressErrors) { // 静默的接口,报错也不处理,因为下面有公共处理 diff --git a/src/api/socket.js b/src/api/socket.js index 66cd2c1f..26367b88 100644 --- a/src/api/socket.js +++ b/src/api/socket.js @@ -1,3 +1,6 @@ + +import { goto_login_fun } from '@/api/request' + export default class WebSocketUtil { /** * WebSocket工具类,用于管理WebSocket连接 @@ -113,10 +116,6 @@ export default class WebSocketUtil { triggerEvent(event, data) { if (this.callbacks[event]) { this.callbacks[event].forEach(callback => callback(data)); - uni.$emit('socketEvent',{ - type: event, - data - }) } } @@ -201,6 +200,7 @@ export default class WebSocketUtil { } else { console.error('达到最大重连次数,停止尝试'); this.triggerEvent('error', new Error('达到最大重连次数')); + goto_login_fun() } } diff --git a/src/api/study.js b/src/api/study.js index 9bbc9ffd..0f93cd64 100644 --- a/src/api/study.js +++ b/src/api/study.js @@ -7,6 +7,7 @@ export const getCourseStudyInfoApi = (data) => { return request({ url: base_url + '/traStdyInfo/queryTraStdyProgressAndTeacher', method: 'post', + toastErrors: true, data }); }; @@ -16,6 +17,7 @@ export const queryTraStdyBatchWaitParagraphInfoApi = (data) => { return request({ url: base_url + '/traStdyInfo/queryTraStdyBatchWaitParagraphInfo', method: 'post', + toastErrors: true, data }); }; @@ -24,6 +26,7 @@ export const deleteTraStdyInfoByIdApi = (data) => { return request({ url: base_url + '/traStdyInfo/deleteTraStdyInfoById', method: 'post', + toastErrors: true, data }); }; @@ -33,6 +36,7 @@ export const studyParagraphOverApi = (data) => { return request({ url: base_url + '/traStdyInfo/studyParagraphOver', method: 'post', + toastErrors: true, data }); }; @@ -41,6 +45,7 @@ export const studyAnswerTextUpApi = (data) => { return request({ url: base_url + '/traStdyInfo/studyAnswerTextUp', method: 'post', + toastErrors: true, data }); }; @@ -49,6 +54,7 @@ export const queryTraStdyBatchWaitQuestionInfoApi = (data) => { return request({ url: base_url + '/traStdyInfo/queryTraStdyBatchWaitQuestionInfo', method: 'post', + toastErrors: true, data }); }; @@ -57,6 +63,34 @@ export const audioTranscriptionsApi = (data) => { return request({ url: base_url + '/traStdyInfo/audioTranscriptions', method: 'post', + toastErrors: true, data }); -}; \ No newline at end of file +}; + +// 撤回消息 +export const withdrawalAnswerApi = (data) => { + return request({ + url: base_url + '/traStdyInfo/withdrawalAnswer', + method: 'post', + toastErrors: true, + data + }); +}; +// 异步完成回答 +// 入参: +// qstLogId 必输项:true 类型:String +// 出参: +// qstLogId 问题日志ID String +// qnsId 问题ID String +// processStat 状态 String +// message 处理消息 String + +export const waitMakeEvaluateApi = (data) => { + return request({ + url: base_url + '/traStdyInfo/waitMakeEvaluate', + method: 'post', + toastErrors: true, + data + }); +}; diff --git a/src/components/loading.vue b/src/components/loading.vue new file mode 100644 index 00000000..3bf15e46 --- /dev/null +++ b/src/components/loading.vue @@ -0,0 +1,352 @@ + + + + + \ No newline at end of file diff --git a/src/main.js b/src/main.js index f985b87a..47a8fa35 100644 --- a/src/main.js +++ b/src/main.js @@ -1,10 +1,12 @@ import App from './App' import { createSSRApp } from 'vue' import pinia from './store.js' +import CommonLoading from './components/loading.vue' export function createApp() { const app = createSSRApp(App) app.use(pinia) + app.component('CommonLoading',CommonLoading) return { app } diff --git a/src/pages/course/components/talkingItem.vue b/src/pages/course/components/talkingItem.vue index ec6cd3cd..d8d79ab0 100644 --- a/src/pages/course/components/talkingItem.vue +++ b/src/pages/course/components/talkingItem.vue @@ -11,7 +11,9 @@ - + + + {{ dataInfo.pgrphContent }} @@ -56,7 +58,7 @@ - 继续 + 继续 @@ -73,9 +75,12 @@ - + + + + {{ dataInfo.talkingContent }} @@ -98,8 +103,8 @@ > - 完成 - 撤回 + 完成 + 撤回 @@ -153,12 +158,19 @@ import { getUserInfo } from '@/common/common'; default:false, type: Boolean }, + voiceRate: { + default: '1.0', + type:[Number,String], + } }) const { type, dataInfo, activeVoiceId, isPlaying, isLast} = toRefs(props) - const emit = defineEmits(['changePlay', 'nextQuestion']) + const emit = defineEmits(['changePlay', 'nextQuestion', 'withdraw', 'finishQuestion']) // 声音播放初始化 const talkVoiceObj = ref(uni.createInnerAudioContext()) + talkVoiceObj.value.playbackRate = Number(props.voiceRate) const userInfo = computed(() => getUserInfo()) + + const voiceLoading = ref(false) watch(() => props.isPlaying,(val) => { if(!val){ talkVoiceObj.value?.stop() @@ -167,6 +179,12 @@ import { getUserInfo } from '@/common/common'; deep: true, immediate: true }) + watch(() => props.voiceRate,(val) => { + talkVoiceObj.value.playbackRate = Number(val) + },{ + deep: true, + immediate: true + }) talkVoiceObj.value.onEnded(()=>{ emit('changePlay', '') @@ -183,8 +201,8 @@ import { getUserInfo } from '@/common/common'; } // 重播 const restartPlay = () => { - emit('changePlay', unref(dataInfo)?.id) if(itemVoice.value){ + emit('changePlay', unref(dataInfo)?.id) setTimeout(()=>{ talkVoiceObj.value.src = itemVoice.value talkVoiceObj.value.play() @@ -198,13 +216,12 @@ import { getUserInfo } from '@/common/common'; // readType 阅读内容类型pgrh段落/qns问题 emit('changePlay', unref(dataInfo)?.id) if(itemVoice.value){ - console.log(1111111,itemVoice.value) setTimeout(()=>{ talkVoiceObj.value.src = itemVoice.value talkVoiceObj.value.play() },100) }else{ - console.log(2,itemVoice.value) + voiceLoading.value = true let _params = { crsId: unref(dataInfo)?.crsId || '', pgrphId: unref(dataInfo)?.pgrphId || '', @@ -217,9 +234,12 @@ import { getUserInfo } from '@/common/common'; return encodeURIComponent(t) + '=' + encodeURIComponent(_params[t]) }).join('&') downloadVoiceFile(_url).then(res=>{ + voiceLoading.value = false itemVoice.value = res.tempFilePath talkVoiceObj.value.src = res.tempFilePath talkVoiceObj.value.play() + }).catch((err)=>{ + voiceLoading.value = false }) } } @@ -237,11 +257,17 @@ import { getUserInfo } from '@/common/common'; talkVoiceObj.value.play() },100) } + const translateLoading = ref(false) + // 翻译 const translateVoice = (item) =>{ if(!item.talkingVoice) return + translateLoading.value = true uploadVoiceFile(item.talkingVoice,{}).then(res=>{ let _data = JSON.parse(res.data) item.talkingContent = _data.body + translateLoading.value = false + }).catch(()=>{ + translateLoading.value = false }) } const showNextBtn = ref(true) @@ -254,6 +280,14 @@ import { getUserInfo } from '@/common/common'; emit('nextQuestion', unref(dataInfo)) }) } + // 撤回 + const withdraw = (data) => { + emit('withdraw',data) + } + // 完成 + const finishQuestion = (data) => { + emit('finishQuestion',data) + } diff --git a/src/static/images/course/send.png b/src/static/images/course/send.png new file mode 100644 index 0000000000000000000000000000000000000000..579436de51e2e5d9a222ae9fcb5f19a8eaf82d50 GIT binary patch literal 1681 zcmV;C25$L@P)Px*OG!jQRA@upnrUoQRTO}~Gp&m3H4+0gqJR39l1Xa3@jhukbcEdy5Sbo88qbH1apfxQf7t(!)69_hUJ?Dj7mOTt-xX!NL{AJ%>#z@ z9)!=&kvW$Q{8cQO>K^bZEv1ev0j!qWfFnR(z}@1O4bAzzmNVSVeA(EXdee@=`WfQ; zJ{Q9x0-}U*1O%0%3g?nBgPj32N!i0x{>Tq;|k`> z!GwLs=qSB~BEI#54Om1M%9C&-v<(;0hnQ@z?N{gxC`XttyVD?rX+Ev4qp@U8I$&65 zB8>42s4S+GC)40AW;O6-a<8h?K`3(wF@U+UD`nvs2fXJQQrSdQZcPV_=w6`I6QJ@T zrHpI_?oO16M8zD|!2w(wKQQlV2J-oMYQx+!^B=B?B9vmue$$=cWZYrR2N?KF@|J^79h{?{BNWKib<tWPI>#JM2Siy0XP#p&Oc>1QCWt8JHr|@1+JwCHW2KgmH{k~ z9rYvXXQ0>vU~(P`VO@_fFmGc{!&C7y<`=;A@m2JyCboo$%&VV+sY5hf@nC$oevQ~E z#}beJ9Kw=I5)u3zd_BE1_01iiN2W&2Pf4>%_?f<&jooq@2=q_ESX}fW}buYEV z!Ac$7%>HTscOi5Qwl@k72%WIxUo%9%0d70b0FPtQ#$2*Z1Y?M~w*@MNj^Gbia+9+U zhV?~+w*$o^Wr$YlU^MVKxC~2%CpLOh+uL+r0V>ZBmDvuU$;Fgl%2XW!glrh1g@|As z*AWv_Ij+BVRqAq-M*;&>ULz`#ZTrCk?!b~{-7=A~xSt|EEeK#l?*%(+9+bR}B~=OI z4q%lQvk!BtzbuemQzIBGph-_&gC&2Y1Dd~rEVdL5a3z*JoEoHt+(((Vr!~6~I{F^P zLI66sn47WW`{n_iC+(T}#2U=-qTf_W*iIUPxnn4G;;?`w2f%@`XT#7{6*A-`E;JKjX77sYLuzO z#8b8*f4~ON&cI{9<31em_M$AMmc=X-^Ki(scn3^%VU+ejxXZ2(iT$AAYRFg?s0DV$ zGYQ)eOzQG0Ec3$3#lwXhu>A#W+;NqL_?ynu(jKK9N)f_Q`_+97`&l8TY!Ijf3mB;D b?u`ErMD8b7L67a100000NkvXXu0mjfql*P4 literal 0 HcmV?d00001 diff --git a/src/static/images/course/setting.png b/src/static/images/course/setting.png new file mode 100644 index 0000000000000000000000000000000000000000..bed63236d2b3aebd54032d8356eb337197cfb46a GIT binary patch literal 1350 zcmV-M1-bf(P)Px)07*naR7gvuR(pulRTTcdou{&{DVRxMkt=J?&hE~=YazYtA*9j!VN_6*2|XZF z3QCbSE9hzeNJU8@7*bkPhM|;e8JcE8w(@BnZ&h-E|l1`^H0NiL&a5PRzsV7N34IotNFCv*-E;l!m z$s8Uj&xk+`4Gs0-aCk3C@4Fws-y$*wz*Lge0A4r7JaD=|RZ6K%BW znl1{3LOTHb+t=5p+uGWGs03Diqhf0YlF8(G(P;E#05^z8FMyP_c3){St@RfGE(h?Z zh%Bn9srjU}wKZ2;TN}$}vp#0%3;}7a{S20hNStIhfSQ6=&N+8q5Cm(>D{gFTJUbi? zw*sj3HeV3Q0RUq}WLGYiyDgK+{O)aoKw9gC0NyN1T1egl zV0@Y1He<{cgFyB5^^;?<*pG!9Ebi^?T_2Cf&p3MY=%H*j+cnaVOYEU!GI;vD_q)*(gXCEv za**T(W6Y-&iVAD3Jrk!n=jKpr?U!wmAC)o2mIv0=)s3sJuHFb>?l4I|>g?>i{lI|( zUMWsGi9{kAkH>w!gmZ4L2U?MzRf~vxZ>>$1ON!R|eE_!r=*%m_O6OcV$rQ=ug}JUV z#&|NFbW*8QOI1~s&%Ljwr>BVpWUpCuA~Mff`&r3SHibf=Ktzr^=Thl(`lq5Tl}a^| z+zlYy-`_vIt*z~sQeyZ{iO2+!ml|Vs4ANUE^$f{nzG7pHuVV0Mt(O4sOZ%EJ=E3r+ zwbttZ+(B~To;`ck6zz?TjfrqL{2hRwjWL5eR@|ed0A9+s;uT|z|6K$swzb7t`&2oQ zQfd{+#Uk>kwf5Dby}7yhf_!(r0kGQ`bKww>Qfec~n?&ScYwhY{fKqA!$@PVR*`@Q- zT1P}AO>(AlZhjC1n@id{iR2$7Pjq*8PwD9BIL2ACW?eQgFt80ke=e7sR+J1Mlt?71 z6zZ%-riSwW39E%IY&fRS!{y>TF$y=l3$YyiO38ObR57~=iHe= z5F9BFD3Ik6l70rN#J*cZ9;u{*N~x_RuX4^^?>Bxk$*c4IUtx?{IUG<4Ii>=b(%;{I zu(ZX)#WXZD)I}nZb`cpMd9J_F#Q?s_KM}{AbIBkGeys#HN}IpHmcnh`3WDJNBE1Lq z0YIB)nBRC2+3%d&kWQz+9VvM#mGY{6XI}s6Ju?e$+RXs|0#I*^IW!2ANF*l4VzFH$ zrw^0#-DotraOcjQCx!#mT0h|>tU#7hmz; z%r+Tgt{rA!A1C>I;r}fn@-cuM$#KrPtw9j%Eyh&*3Q|g)Px5n5fI@Zel@P=Kx1VH8 zM3!4?pRLs55kI%I*8W!S)H0A`5DL@!q)4?E}920`%UNFd(+AG=&cx~ub&4*&oF07*qo IM6N<$g4@T0Jpcdz literal 0 HcmV?d00001 From 0ed0a3d53dd122ff6f48865d77748b4e2a244643 Mon Sep 17 00:00:00 2001 From: yanghang Date: Wed, 2 Jul 2025 11:07:59 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/socket.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/api/socket.js b/src/api/socket.js index 118d521a..5abf5514 100644 --- a/src/api/socket.js +++ b/src/api/socket.js @@ -1,4 +1,5 @@ -import { goto_login_fun } from '@/api/requestexport default class WebSocketUtil { +import { goto_login_fun } from '@/api/request' +export default class WebSocketUtil { /** * WebSocket工具类,用于管理WebSocket连接 * @param {string} url - WebSocket服务器地址 @@ -197,7 +198,7 @@ import { goto_login_fun } from '@/api/requestexport default class WebSocketUtil } else { console.error('达到最大重连次数,停止尝试'); this.triggerEvent('error', new Error('达到最大重连次数')); - goto_login_fun() + goto_login_fun() } }