diff --git a/certificate/ios/jiaixue.mobileprovision b/certificate/ios/jiaixue.mobileprovision new file mode 100644 index 00000000..45c182ff Binary files /dev/null and b/certificate/ios/jiaixue.mobileprovision differ diff --git a/certificate/ios/jiaixuepro.mobileprovision b/certificate/ios/jiaixuepro.mobileprovision new file mode 100755 index 00000000..cf33e8ec Binary files /dev/null and b/certificate/ios/jiaixuepro.mobileprovision differ diff --git a/certificate/ios/爱加密.txt b/certificate/ios/爱加密.txt new file mode 100644 index 00000000..d3874c75 --- /dev/null +++ b/certificate/ios/爱加密.txt @@ -0,0 +1,30 @@ +sudo xattr -r -d com.apple.quarantine /Users/jlbank/Desktop/lx_uniapp/ijiami-clang-tools &&  chmod -R 777 /Users/jlbank/Desktop/lx_uniapp/ijiami-clang-tools + + + +硬件UDID:E3C9EBD6-514C-5D48-952D-850F37E06380 +Device: en0 +Ethernet Address: d0:11:e5:42:11:3d + +./setijmkey.sh "16968477f92c1590247396" + +jlbank@jlbank-aideiMac sh % ./ijiami-version.sh +Execution time: 0 milliseconds +Apple clang version 17.0.0 (clang-1700.0.13.5) +Target: arm64-apple-darwin24.5.0 +Thread model: posix +InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/ijiami.xctoolchain/usr/bin +author_code: 0 +after_mainExecution time: 3 milliseconds +Execution time: 0 milliseconds +swift-driver version: 1.120.5 Execution time: 0 milliseconds +Apple Swift version 6.1.2 (swiftlang-6.1.2.1.2 clang-1700.0.13.5) +Target: arm64-apple-macosx15.0 +author_code: 0 +after_mainExecution time: 1 milliseconds +爱加密工具链版本号: ijiami Obfuscator v3.1.14 + +-Xllvm -ipo -Xllvm -ipo-percent=80 -Xllvm -ipo-prob=50 -Xllvm -ipo-loop=1 + + +-Xllvm -ipo -Xllvm -ipo-percent=80 -Xllvm -ipo-prob=50 -Xllvm -ipo-loop=1 diff --git a/certificate/ios/生产证书.p12 b/certificate/ios/生产证书.p12 new file mode 100644 index 00000000..15d52c25 Binary files /dev/null and b/certificate/ios/生产证书.p12 differ diff --git a/certificate/ios/生产证书.p12.zip b/certificate/ios/生产证书.p12.zip new file mode 100755 index 00000000..40d24a5e Binary files /dev/null and b/certificate/ios/生产证书.p12.zip differ diff --git a/certificate/ios/苹果账号.txt b/certificate/ios/苹果账号.txt new file mode 100644 index 00000000..060280ce --- /dev/null +++ b/certificate/ios/苹果账号.txt @@ -0,0 +1,36 @@ +包名:cn.com.jlbank.aits +苹果账号 +xiangyuanhua@126.com +Xiang@1987 +田岩UDID: +00008101-001911401152001E +官网地址:https://appstoreconnect.apple.com/ +https://developer.apple.com/account/resources +1.生成证书 +证书文件:development.cer +p12证书:证书.p12 +证书密码:Kup9dayLY#* +2.生成标识符Identifiers +App ID Prefix:2EP6SRRN43 (Team ID) +Bundle ID:cn.com.jlbank.aits (explicit) +3.生成描述文件 +测试描述文件:jiaixue.mobileprovision + +离线key:caf112ffeb8174f764076b6b109aa329 +appID:__UNI__EDE0E52 + +dcloud_appkey + + + +Hb修改流程: +1.修改infoPlist的app名称 +2.修改control.xml里面的appid +3.在HBuilder-Hello-Info.plist添加dcloud_appkey项,值为caf112ffeb8174f764076b6b109aa329 +4. + +25.64.16.140 +255.255.255.0 +25.64.16.254 + +http://25.13.9.101:9000/ \ No newline at end of file diff --git a/certificate/ios/证书.p12 b/certificate/ios/证书.p12 new file mode 100644 index 00000000..031f533a Binary files /dev/null and b/certificate/ios/证书.p12 differ diff --git a/src/api/socket.js b/src/api/socket.js index 40957666..f10f1ba3 100644 --- a/src/api/socket.js +++ b/src/api/socket.js @@ -35,6 +35,7 @@ export default class WebSocketUtil { */ init(flag = false) { if(flag) this.reconnectCount = 0 + this.isClose = false; // 手动关闭 // 创建WebSocket连接 this.socketTask = uni.connectSocket({ url: this.url, diff --git a/src/components/image-preview/image-preview.vue b/src/components/image-preview/image-preview.vue index f368c93f..330050b6 100644 --- a/src/components/image-preview/image-preview.vue +++ b/src/components/image-preview/image-preview.vue @@ -156,7 +156,7 @@ position: absolute; left: 50%; top: 50%; - max-width: 100%; + width: 100vw; max-height: 100%; transform: translate(-50%, -50%); } diff --git a/src/components/image-preview/video-preview.vue b/src/components/image-preview/video-preview.vue index 8f65deec..3eb87594 100644 --- a/src/components/image-preview/video-preview.vue +++ b/src/components/image-preview/video-preview.vue @@ -104,8 +104,8 @@ transform: translate(-50%, -50%); } .overlay-box .video-cont-center{ - max-width: 100%; - max-height: 80%; + width: 100vw; + max-height: 100%; position: absolute; top: 50%; left: 50%; diff --git a/src/pages/course/components/chartFive.vue b/src/pages/course/components/chartFive.vue new file mode 100644 index 00000000..27533000 --- /dev/null +++ b/src/pages/course/components/chartFive.vue @@ -0,0 +1,329 @@ + + + \ No newline at end of file diff --git a/src/pages/course/components/talkingItem.vue b/src/pages/course/components/talkingItem.vue index edc1b881..96473597 100644 --- a/src/pages/course/components/talkingItem.vue +++ b/src/pages/course/components/talkingItem.vue @@ -30,6 +30,7 @@ + @@ -189,6 +190,7 @@ import { downloadVoiceFile, uploadVoiceFile, getAudioByText } from "@/api/common import { studyParagraphOverApi, getAskAboutRawApi } from "@/api/study.js" import ChartFour from "./chartFour.vue" import ChartThree from "./chartThree.vue" +import ChartFive from './chartFive.vue' import common from '@/common/common'; import { getUserInfo } from '@/common/common'; import { useStorageStore } from "@/store/storage.js" @@ -365,13 +367,17 @@ const audioCacheObj = computed(() => storageStore.audioObj) },100) }else{ voiceLoading.value = true + let _type = props.type == 2 ? 'ans' : props.type == 3 ? 'pgrh' : props.type == 4 ? 'qns' : '' + let _readId = props.type == 2 ? unref(dataInfo)?.intrctId : props.type == 3 ? unref(dataInfo)?.pgrphId : props.type == 4 ? unref(dataInfo)?.qnsId : '' + console.log(unref(dataInfo)) let _params = { crsId: unref(dataInfo)?.crsId || '', pgrphId: unref(dataInfo)?.pgrphId || '', qnsId: unref(dataInfo)?.qnsId || '', - readType: readType, + readType: _type,// 2 文本回答 3, 段落信息 4 问题信息 teachNo: unref(teacherInfo)?.teacherNo, // 必填 - content: _content + readId: _readId + // content: _content } @@ -386,19 +392,6 @@ const audioCacheObj = computed(() => storageStore.audioObj) talkVoiceObj.value.src = url talkVoiceObj.value.play() }else{ - // getAudioByText(_params).then(res=>{ - // // uni.env.USER_DATA_PATH || - // let filePath = `${'/'}/${dataInfo.value.id}.mp3` - // saveFile(res, filePath, () => { - // voiceLoading.value = false - // itemVoice.value = filePath - // talkVoiceObj.value.src = filePath - // talkVoiceObj.value.play() - // storageStore.setStorage('audio', _url + _params.teachNo, itemVoice.value) - // }) - // }).catch(err=>{ - // console.log(err) - // }) downloadVoiceFile(_url).then(res=>{ if(res?.data){ common.msg(res.data.message) @@ -522,7 +515,7 @@ const audioCacheObj = computed(() => storageStore.audioObj) width: 76rpx; height: 76rpx; border: 3rpx solid #fff; - background-color: #ccc; + background-color: #f1f1f1; overflow: hidden; border-radius: 10rpx; margin-right: 16rpx; @@ -698,7 +691,7 @@ const audioCacheObj = computed(() => storageStore.audioObj) width: 76rpx; height: 76rpx; border: 3rpx solid #fff; - background-color: #ccc; + background-color: #f1f1f1; overflow: hidden; border-radius: 10rpx; margin-left: 16rpx; diff --git a/src/pages/course/components/touchBtn.vue b/src/pages/course/components/touchBtn.vue index 9818ec00..3765cae2 100644 --- a/src/pages/course/components/touchBtn.vue +++ b/src/pages/course/components/touchBtn.vue @@ -61,12 +61,23 @@ const props = defineProps({ default: false, type: Boolean }, + canAnswer:{ + default: true, + type: Boolean + }, + canAnswerText:{ + default: '当前状态不能发送内容!', + type: String + }, }) const { isDisabled, onlyVoice } = toRefs(props) const isLoadingState = computed(() => props.isLoading) watch(()=>props.isLoading,()=>{},{ deep:true,immediate:true }) +watch(()=>props.canAnswer,()=>{},{ + deep:true,immediate:true +}) watch(()=>props.onlyVoice,()=>{},{ deep:true,immediate:true }) @@ -87,11 +98,32 @@ const initRecord = () => { // stopRecord() unref(recordObjCom)?.onStop((res, duration)=>{ audioPath.value = res.tempFilePath + showTalkingModel.value = false + if(startFlag.value !== 2){ + common.msg('说话时间太短,没有听清!') + return + } + if(!isOut.value){ + emit('uploadVoice', audioPath.value) + } + }) + unref(recordObjCom).onStart(() => { + startFlag.value = 1 + setTimeout(()=>{ + startFlag.value = 2 + },1000) + let _recordPerm = uni.getAppAuthorizeSetting() + let _state = _recordPerm.microphoneAuthorized + if(_state === 'authorized'){ + showTalkingModel.value = true + } }) } +const startFlag = ref(1) const startRecord = () => { unref(recordObjCom).start({format:'mp3'}) } + const stopRecord = () => { if(unref(recordObjCom).stop){ unref(recordObjCom)?.stop?.() @@ -120,17 +152,20 @@ onMounted(async ()=>{ }) } }else{ - let _recordPerm = permission.judgeIosPermission('record') - if(!_recordPerm){ + let _recordPerm = uni.getAppAuthorizeSetting() + let _state = _recordPerm.microphoneAuthorized + if(_state === 'denied'){ common.show('提示信息', '当前页面需要使用的录音权限,是否前往开启?',true, '取消','确定').then((res) => { if(res) { // 去开启权限 - permission.gotoAppPermissionSetting() + uni.openAppAuthorizeSetting() }else{ // 取消 common.navigateBack() } }) + }else if(_state === 'not determined'){ + // startRecord() } } // #endif @@ -154,21 +189,10 @@ const outScreen = computed(()=>{ const recNum = ref(1) const activeNum = ref(1) -const getRecordPermission = async (obj) => { - //#ifdef APP-PLUS - // 安卓端 - // let _recordPerm = await permission.requestAndroidPermission('android.permission.RECORD_AUDIO') - // if(_recordPerm !== 1){ - // permission.gotoAppPermissionSetting() - // return - // } - showOverlayTalking(obj) - // #endif - //#ifndef APP-PLUS - // pc端 - showOverlayTalking(obj) - // #endif +const getRecordPermission = (obj) => { + showOverlayTalking(obj) } +const isMoving = ref(false) const showOverlayTalking = (obj) => { if(isLoadingState.value){ uni.showToast({ @@ -178,10 +202,18 @@ const showOverlayTalking = (obj) => { }) return } + if(!props.canAnswer){ + uni.showToast({ + title: props.canAnswerText, + icon: "none", + duration:1000 + }) + return + } + isMoving.value = true emit('startRecord') recNum.value += 1 if(!isDisabled.value){ - showTalkingModel.value = true touchX.value = obj.changedTouches[0].pageX touchY.value = obj.changedTouches[0].pageY baseY.value = obj.currentTarget.offsetTop @@ -201,29 +233,20 @@ const showOverlayTalking = (obj) => { } } const hideOverlayTalking = (obj) => { + isMoving.value = false if(!showTalkingModel.value) return - if(activeNum.value + 1 === recNum.value){ - showTalkingModel.value = false - //#ifdef APP-PLUS - stopRecord() - // #endif - if(!isOut.value){ - setTimeout(()=>{ - emit('uploadVoice', audioPath.value) - },1000) - } - }else{ - showTalkingModel.value = false - common.msg('录音失败,请重试!') - } - activeNum.value = recNum.value + //#ifdef APP-PLUS + stopRecord() + // #endif } const handleMove = (obj) => { - touchX.value = obj.changedTouches[0].pageX - touchY.value = obj.changedTouches[0].pageY - if(outScreen.value){ - hideOverlayTalking(obj) + if(isMoving.value){ + touchX.value = obj.changedTouches[0].pageX + touchY.value = obj.changedTouches[0].pageY + if(outScreen.value){ + hideOverlayTalking(obj) + } } } // 发送文本 diff --git a/src/pages/course/study.vue b/src/pages/course/study.vue index dfe9dd51..6c78dcf6 100644 --- a/src/pages/course/study.vue +++ b/src/pages/course/study.vue @@ -85,6 +85,8 @@ @startRecord="changePlayItemId('')" :isLoading="isUploadingVoice" :onlyVoice="answerOnlyVoice" + :canAnswer="testAnswer" + :canAnswerText="'每个问题最多连续发送五次答案!'" :isDisabled="((lastTalkingInfo.type||0) !== 4)" /> @@ -177,7 +179,6 @@ const isUploadingVoice = ref(false) // 初始化数据 const getData = async (flag) => { try{ - initsocketTask() const { body } = await getCourseStudyInfoApi({crsId: crsId.value}) teacherList.value = body.teacheList.map(t=>({ ...t, @@ -548,7 +549,8 @@ const nextQuestionSuccess = (info, type='next') => { isQuestion: true } talkingList.value.push(lastTalkingInfo.value) - qstLogId.value = _body.chatBody.qstLogId + logId.value = _body.chatBody.logId + qstLogId.value = _body.chatBody.qstLogId || qstLogId.value scrollToBottomNow() }) } @@ -581,18 +583,18 @@ const logId = ref('') // ws 初始化逻辑 const initsocketTask = () => { socketStore.creatSocket() - unref(SocketObj).on('open', (res)=>{ - if(startPgrphId.value){ - sendMessage({ - "commond" : 'STDY', - "body" : { - crsId: crsId.value, - teacherNo: choiceTeacher.value - } - }) - step.value = 2 - } - }) + // unref(SocketObj).on('open', (res)=>{ + // if(startPgrphId.value){ + // sendMessage({ + // "commond" : 'STDY', + // "body" : { + // crsId: crsId.value, + // teacherNo: choiceTeacher.value + // } + // }) + // step.value = 2 + // } + // }) unref(SocketObj).on('message', (res)=>{ const { rtnCode, body, commond } = JSON.parse(res.data) if(rtnCode === '0000'){ @@ -611,10 +613,7 @@ const initsocketTask = () => { }) } const reconnect = ()=> { - if(reconnectTimer || isManualClose.value) return - reconnectTimer = setTimeout(()=>{ - initsocketTask() - },3000) + initsocketTask() } const sendMessage = (data) => { unref(SocketObj).send(data) @@ -623,6 +622,7 @@ const sendMessage = (data) => { const startPgrphId = ref('') const imageId = ref('') onLoad((params) => { + watchFlag.value = 1 crsId.value = params.crsId||''; crsNum.value = params.crsNum||''; imageId.value = params.imgId || '' @@ -632,21 +632,21 @@ onLoad((params) => { const showTalkingModel = ref(false) // 录音 onMounted(()=>{ + initsocketTask() getData('1'); - console.log('onMounted') }) onHide(()=>{ if(watchFlag.value === 1) return changePlayItemId('') socketStore.closeSocket() - common.show('提示信息', '检测到您已离开,即将退出学习页面。',false, '','确认').then((res) => { - common.redirectTo(`/pages/courseDetail/index?crsId=${crsId.value}&crsNum=${crsNum.value}&from=study`) - }).finally(() => {}) + // common.show('提示信息', '检测到您已离开,即将退出学习页面。',false, '','确认').then((res) => { + // common.redirectTo(`/pages/courseDetail/index?crsId=${crsId.value}&crsNum=${crsNum.value}&from=study`) + // }).finally(() => {}) }) onShow(()=>{ - console.log('onShow') if(watchFlag.value === 1) return - getData('1'); + // getData('2'); + initsocketTask() }) const watchFlag = ref(1) onUnload(()=>{ diff --git a/src/pages/index/components/question.vue b/src/pages/index/components/question.vue index f6e9a8df..898c50ef 100644 --- a/src/pages/index/components/question.vue +++ b/src/pages/index/components/question.vue @@ -1,6 +1,6 @@