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 00000000..579436de Binary files /dev/null and b/src/static/images/course/send.png differ diff --git a/src/static/images/course/setting.png b/src/static/images/course/setting.png new file mode 100644 index 00000000..bed63236 Binary files /dev/null and b/src/static/images/course/setting.png differ