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/common.js b/src/api/common.js
index 7b3a4a92..845c484b 100644
--- a/src/api/common.js
+++ b/src/api/common.js
@@ -72,6 +72,7 @@ export const commonUploadVoiceFile = (file, url, data = {}, fileKey='voice') =>
};
if (token)
header['summary'] = token
+ console.log(`${base_url}${url}`)
return new Promise((resolve, reject) => {
uni.uploadFile({
url: `${base_url}${url}`,
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 改进建议:
+
+
+ {{ score }}分
+
+
+
+ {{ item.gradeDimensName }}
+ {{ item.anlyGrade }}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/course/components/talkingItem.vue b/src/pages/course/components/talkingItem.vue
index edc1b881..15629ef3 100644
--- a/src/pages/course/components/talkingItem.vue
+++ b/src/pages/course/components/talkingItem.vue
@@ -30,6 +30,7 @@
+
@@ -151,7 +152,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"
@@ -252,7 +254,7 @@ const audioCacheObj = computed(() => storageStore.audioObj)
const itemVoice = ref('')
const showWithdraw = computed(()=>{
- let _isMe = unref(lastQuestionInfo).qnsLogId === unref(dataInfo).qnsLogId
+ let _isMe = unref(lastQuestionInfo).qstLogId === unref(dataInfo).qstLogId
let _isQuestion = unref(lastQuestionInfo).isQuestion
return _isMe && _isQuestion
})
@@ -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..e28d2642 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,
@@ -445,7 +446,7 @@ const getQuestionInfoUnStudy = (pgrphId) => {
id: _id,
isQuestion: true
}
- talkingList.value.push(lastTalkingInfo.value)
+ talkingList.value.push(JSON.parse(JSON.stringify(lastTalkingInfo.value)))
qstLogId.value = _body.chatBody?.qstLogId
scrollToBottomNow()
}else{
@@ -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(()=>{
@@ -786,6 +786,7 @@ const submitAnswerNow = (val, cb) => {
talkingVoice: '',
type: 2,
userInfo: {...choiceTeacherInfo.value},
+ qstLogId: qstLogId.value,
id: _id
})
scrollToBottomNow()
diff --git a/src/pages/index/components/question.vue b/src/pages/index/components/question.vue
index f6e9a8df..0d0b4d79 100644
--- a/src/pages/index/components/question.vue
+++ b/src/pages/index/components/question.vue
@@ -1,6 +1,6 @@
-
+
{{voiceTime}}
@@ -15,13 +15,13 @@