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