From 00dabafb60b936f6c36e78b928d6f5ca9b6816f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Fri, 12 Dec 2025 15:14:15 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- src/common/permission.js | 54 +++++++++++++++++--------- src/components/examination/subject.vue | 10 +---- src/pages/competition/pk.vue | 6 +-- src/pages/sparring/tip.vue | 4 +- 5 files changed, 44 insertions(+), 32 deletions(-) diff --git a/.env.development b/.env.development index ec141c0a..e3343c6f 100644 --- a/.env.development +++ b/.env.development @@ -6,7 +6,7 @@ ENV = 'development' # VITE_APP_BASE_API_Url = 'https://aits.jlbank.com.cn:7001' -VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7001' +VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7003' # VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' diff --git a/src/common/permission.js b/src/common/permission.js index 67164297..9a02fef4 100644 --- a/src/common/permission.js +++ b/src/common/permission.js @@ -2,7 +2,7 @@ * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启 */ -var isIos +let isIos // #ifdef APP-PLUS isIos = (plus.os.name == "iOS") // #endif @@ -80,18 +80,34 @@ function judgeIosPermissionRecord() { // 判断相机权限是否开启 function judgeIosPermissionCamera() { - var result = false; - var AVCaptureDevice = plus.ios.import("AVCaptureDevice"); - var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide'); - console.log("authStatus:" + authStatus); - if (authStatus == 3) { - result = true; - console.log("相机权限已经开启"); - } else { - console.log("相机权限没有开启"); + const authSetting = uni.getAppAuthorizeSetting(); + const state = authSetting.cameraAuthorized; + console.log('state', state); + switch (state) { + case 'authorized': + console.log("相机权限已经开启"); + return 'authorized'; + case 'denied': + return 'denied'; + case 'not determined': + return 'undetermined'; + case 'config error': + return 'undetermined'; + default: + return 'undetermined'; } - plus.ios.deleteObject(AVCaptureDevice); - return result; + // var result = false; + // var AVCaptureDevice = plus.ios.import("AVCaptureDevice"); + // var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide'); + // console.log("authStatus:" + authStatus); + // if (authStatus == 3) { + // result = true; + // console.log("相机权限已经开启"); + // } else { + // console.log("相机权限没有开启"); + // } + // plus.ios.deleteObject(AVCaptureDevice); + // return result; } // 判断相册权限是否开启 @@ -264,9 +280,11 @@ function checkSystemEnableLocation() { } } -export default ({ - judgeIosPermission: judgeIosPermission, - requestAndroidPermission: requestAndroidPermission, - checkSystemEnableLocation: checkSystemEnableLocation, - gotoAppPermissionSetting: gotoAppPermissionSetting -}) + + +export default { + judgeIosPermission, + requestAndroidPermission, + checkSystemEnableLocation, + gotoAppPermissionSetting +} \ No newline at end of file diff --git a/src/components/examination/subject.vue b/src/components/examination/subject.vue index f193d26a..392a171c 100644 --- a/src/components/examination/subject.vue +++ b/src/components/examination/subject.vue @@ -194,19 +194,11 @@ watch( () => props.modelValue, (newVal) => { - console.log('modelValue', newVal); + // console.log('modelValue', newVal); item_answer.value = typeof newVal === 'string' ? newVal.split(',') : newVal; }, { deep: true } ); - // watch( - // item_answer, - // (newVal) => { - // console.log('item_answer', newVal); - // emit('update:modelValue', newVal); - // }, - // { deep: true } - // ); const feedback_click = () => { emit('subject_click', 'feedback', props.item); diff --git a/src/pages/competition/pk.vue b/src/pages/competition/pk.vue index d7807f7e..8efad330 100644 --- a/src/pages/competition/pk.vue +++ b/src/pages/competition/pk.vue @@ -147,6 +147,7 @@ const pkData = reactive({ comLimit: 0, crsId: '', + comId: '', name: '', // 名称 orgId: '', papersId: '', @@ -247,7 +248,7 @@ traQnsInfoVo = res.body.traQnsInfoVo; } topic.value.isPreview = true; // 不能在点击了,打开预览模式 - console.log('给出来的traQnsInfoVo', traQnsInfoVo); + // console.log('给出来的traQnsInfoVo', traQnsInfoVo); common.hideLoading(); topic.value.clearResult = false; // 不清除正确答案 topic.value.analyContent = traQnsInfoVo.analyContent; // 答案解析 @@ -257,7 +258,6 @@ topic.value.judgeResult = traQnsInfoVo.judgeResult; // 正确答案字符串分割 if (questionNumber.value >= topicList.length - 1) { - console.log('pk页答完了,带走的数据', pkData); common.setPageCache('competition_pk_to_resulf', pkData); nextTick(() => { common.redirectTo( @@ -418,7 +418,7 @@ } nextTick(() => { common.redirectTo( - `/pages/competition/result?mode=${mode}&execId=${pkData.execId}&orgId=${pkData.orgId}&papersId=${pkData.papersId}&autoSub=01` + `/pages/competition/result?mode=${mode}&execId=${pkData.execId}&orgId=${pkData.orgId}&papersId=${pkData.papersId}&autoSub=01&comId=${pkData.comId}` ); }); diff --git a/src/pages/sparring/tip.vue b/src/pages/sparring/tip.vue index 46231338..55b49d89 100644 --- a/src/pages/sparring/tip.vue +++ b/src/pages/sparring/tip.vue @@ -141,6 +141,7 @@ import points from '@/components/points-and-badge/points'; import usePointsAndBadge from '@/components/points-and-badge/usePointsAndBadge'; import { initRecord } from '@/composables/useExamSubject.js'; + import permissionApi from '@/common/permission' const { pointAndBadgesRun, badgeRef, pointsRef } = usePointsAndBadge(); const socketStore = useSocketStore(); @@ -252,8 +253,9 @@ console.log('申请权限'); await initRecord(); } + // console.log('水水水水水水水水', permissionApi.judgeIosPermission('camera')); + //#endif - common.setPageCache('tipMsgsceneDesc', { ossAddr: detailInfo.value.ossAddr, chaName: detailInfo.value.chaName, From 04da7192e268b1ec11651b6dab1d133883d48785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Fri, 12 Dec 2025 18:03:26 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=80=9A=E8=AF=9D?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=9D=83=E9=99=90=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hbuilderx/launch.json | 2 +- src/common/app-permission.js | 306 ++++++++++++++++++++++++++++++ src/common/permission.js | 135 ++++++++----- src/manifest.json | 24 +-- src/pages/pointsAndRank/badge.vue | 2 +- src/pages/sparring/tip.vue | 17 +- src/pages/test/index.vue | 13 +- 7 files changed, 431 insertions(+), 68 deletions(-) create mode 100644 src/common/app-permission.js diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json index e4668703..15f11888 100644 --- a/.hbuilderx/launch.json +++ b/.hbuilderx/launch.json @@ -2,7 +2,7 @@ "version" : "1.0", "configurations" : [ { - "playground" : "standard", + "playground" : "custom", "type" : "uni-app:app-android" }, { diff --git a/src/common/app-permission.js b/src/common/app-permission.js new file mode 100644 index 00000000..954263ce --- /dev/null +++ b/src/common/app-permission.js @@ -0,0 +1,306 @@ +let popupView = null // 窗口实例 +export function showModal(info) { + const title = info && info.title ? info.title : '标题' + const content = info && info.content ? info.content : '请输入内容' + let screenWidth = plus.screen.resolutionWidth + let screenHeight = plus.screen.resolutionHeight + const popupViewWidth = screenWidth * 0.85 + const viewContentPadding = 20 // 减小内边距 + const viewContentWidth = parseInt(popupViewWidth - (viewContentPadding * 2)) + const descriptionList = drawtext(content, viewContentWidth) + let popupViewHeight = 60 + 20 + 20 // 减小整体高度 + let popupViewContentList = [{ + tag: 'font', + id: 'title', + text: title, + textStyles: { + size: '18px', + color: "#333333", + weight: "bold", + whiteSpace: "normal" + }, + position: { + top: '25px', // 调整标题位置 + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: "25px", + } + }] + + const textHeight = 24 // 调整行高 + let contentTop = 60 // 调整内容起始位置 + + descriptionList.forEach((item, index) => { + if (index > 0) { + popupViewHeight += textHeight; + contentTop += textHeight; + } + popupViewContentList.push({ + tag: 'font', + id: 'content' + index + 1, + text: item.content, + textStyles: { + size: '15px', + color: "#666666", + lineSpacing: "50%", // 调整行间距 + align: "left" + }, + position: { + top: contentTop + "px", + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: textHeight + "px", + } + }); + if (item.type == "break") { + contentTop += 8; // 减小段落间距 + popupViewHeight += 8; + } + }) + + popupView = new plus.nativeObj.View("popupView", { + tag: "rect", + top: "80px", // 固定在靠近顶部的位置 + left: (screenWidth - popupViewWidth) / 2 + "px", + height: popupViewHeight + "px", + width: popupViewWidth + "px" + }) + + // 绘制主体背景 + popupView.drawRect({ + color: "#FFFFFF", + radius: "12px", + borderWidth: "1px", + borderColor: "#E5E5E5" + }, { + top: "0px", + height: popupViewHeight + "px", + }) + + popupView.draw(popupViewContentList) + popupView.show() +} + + +function closeModal() { + // 在不再需要 popupView 时关闭它 + popupView && popupView.close(); + popupView = null; +} + +// 文字换行 +function drawtext(text, maxWidth) { + let textArr = text.split(""); + let len = textArr.length; + // 上个节点 + let previousNode = 0; + // 记录节点宽度 + let nodeWidth = 0; + // 文本换行数组 + let rowText = []; + // 如果是字母,侧保存长度 + let letterWidth = 0; + // 汉字宽度 + let chineseWidth = 14; + // otherFont宽度 + let otherWidth = 7; + for (let i = 0; i < len; i++) { + if (/[\u4e00-\u9fa5]|[\uFE30-\uFFA0]/g.test(textArr[i])) { + if (letterWidth > 0) { + if (nodeWidth + chineseWidth + letterWidth * otherWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i) + }); + previousNode = i + nodeWidth = chineseWidth + letterWidth = 0 + } else { + nodeWidth += chineseWidth + letterWidth * otherWidth + letterWidth = 0 + } + } else { + if (nodeWidth + chineseWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i) + }) + previousNode = i + nodeWidth = chineseWidth + } else { + nodeWidth += chineseWidth + } + } + } else { + if (/\n/g.test(textArr[i])) { + rowText.push({ + type: "break", + content: text.substring(previousNode, i) + }) + previousNode = i + 1 + nodeWidth = 0 + letterWidth = 0 + } else if (textArr[i] == "\\" && textArr[i + 1] == "n") { + rowText.push({ + type: "break", + content: text.substring(previousNode, i) + }) + previousNode = i + 2 + nodeWidth = 0 + letterWidth = 0 + } else if (/[a-zA-Z0-9]/g.test(textArr[i])) { + letterWidth += 1; + if (nodeWidth + letterWidth * otherWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i + 1 - letterWidth) + }) + previousNode = i + 1 - letterWidth + nodeWidth = letterWidth * otherWidth + letterWidth = 0 + } + } else { + if (nodeWidth + otherWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i) + }); + previousNode = i + nodeWidth = otherWidth + } else { + nodeWidth += otherWidth + } + } + } + } + if (previousNode < len) { + rowText.push({ + type: "text", + content: text.substring(previousNode, len) + }) + } + return rowText +} + + + +//权限检测 +export function requestPermissions(info) { + const permissionID = info.permissionID + console.log(info,permissionID) + return new Promise((rev, jec) => { + if (!permissionID) { + rev({ + isSuc: false, + msg: "缺少permissionID" + }) + return false + } + //判断安卓与ios设备 + if (plus.os.name == 'Android') { + let _permissionID = 'android.permission.' + permissionID; + plus.android.checkPermission(_permissionID, + granted => { + console.log(granted) + if (granted.checkResult == 0) { + rev({ + isSuc: true + }) + } + if (granted.checkResult == -1) { + //还未授权当前查询的权限,打开权限申请目的自定义弹框 + closeModal() // 先关闭再弹窗 + showModal(info) + plus.android.requestPermissions([_permissionID], + (e) => { + console.log(e) + //关闭权限申请目的自定义弹框 + if (e.granted.length > 0) { + closeModal() + //当前查询权限已授权,此时可以通知页面执行接下来的操作 + rev({ + isSuc: true + }) + } + if (e.deniedPresent.length > 0) { + closeModal() + //当前查询权限已授权,此时可以通知页面执行接下来的操作 + rev({ + isSuc: false, + msg: "用户已拒绝" + }) + } + if (e.deniedAlways.length > 0) { + //当前查询权限已被永久禁用,此时需要引导用户跳转手机系统设置去开启 + uni.showModal({ + title: '温馨提示', + content: '还没有该权限,立即去设置开启?', + cancelText: "取消", + confirmText: "去设置", + showCancel: true, + confirmColor: '#000', + cancelColor: '#666', + success: (res) => { + if (res.confirm) { + goSetting(); + } + if (res.cancel) { + rev({ + isSuc: false, + msg: "取消前往权限设置页面" + }) + } + }, + fail(e) { + rev({ + isSuc: false, + msg: e.message || "弹窗失败" + }) + }, + complete() { + closeModal() + } + }) + } + }) + } + }, + error => { + rev({ + isSuc: false, + mes: error.message || '检查权限失败' + }) + } + ); + + } else { + //IOS不需要添加自定义弹框来描述权限目的,因为在配置文件的隐私信息访问的许可描述里可添加 + rev({ + isSuc: true + }) + } + }) +} +//跳转手机系统设置 +export function goSetting() { + if (plus.os.name == "iOS") { + var UIApplication = plus.ios.import("UIApplication"); + var application2 = UIApplication.sharedApplication(); + var NSURL2 = plus.ios.import("NSURL"); + var setting2 = NSURL2.URLWithString("app-settings:"); + application2.openURL(setting2); + plus.ios.deleteObject(setting2); + plus.ios.deleteObject(NSURL2); + plus.ios.deleteObject(application2); + } else { + var Intent = plus.android.importClass("android.content.Intent"); + var Settings = plus.android.importClass("android.provider.Settings"); + var Uri = plus.android.importClass("android.net.Uri"); + var mainActivity = plus.android.runtimeMainActivity(); + var intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + var uri = Uri.fromParts("package", mainActivity.getPackageName(), null); + intent.setData(uri); + mainActivity.startActivity(intent); + } +} \ No newline at end of file diff --git a/src/common/permission.js b/src/common/permission.js index 9a02fef4..70571bd5 100644 --- a/src/common/permission.js +++ b/src/common/permission.js @@ -2,6 +2,12 @@ * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启 */ +import common from '@/common/common.js' +import { + getPhoneEnvBool +} from '@/common/common.js' +const IsAndEnv = getPhoneEnvBool('AND') + let isIos // #ifdef APP-PLUS isIos = (plus.os.name == "iOS") @@ -63,51 +69,90 @@ function judgeIosPermissionLocation() { // 判断麦克风权限是否开启 function judgeIosPermissionRecord() { - var result = false; - var avaudiosession = plus.ios.import("AVAudioSession"); - var avaudio = avaudiosession.sharedInstance(); - var permissionStatus = avaudio.recordPermission(); - console.log("permissionStatus:" + permissionStatus); - if (permissionStatus == 1684369017 || permissionStatus == 1970168948) { - console.log("麦克风权限没有开启"); - } else { - result = true; - console.log("麦克风权限已经开启"); - } - plus.ios.deleteObject(avaudiosession); - return result; + return new Promise(async (resolve, reject) => { + const authSetting = uni.getAppAuthorizeSetting(); + const state = authSetting.microphoneAuthorized; + console.log('麦克风state', state); + switch (state) { + case 'authorized': + console.log("麦克风权限是否开启"); + resolve() + break; + case 'denied': // ios拒绝,安卓拒绝或者未授权都是这个 + if (IsAndEnv) { // 安卓二次判定 + const result = await requestAndroidPermission('android.permission.RECORD_AUDIO') + if (result === 1) { + resolve() + break; + } + } + const resultT = await common.show( + '提示信息', + '当前页面需要使用录音权限,是否前往开启?' + ) + if (resultT) { + // 前往权限设置页面 + uni.openAppAuthorizeSetting(); + } + reject() + break; + case 'not determined': // 表示尚未请求授权,仅 iOS 会出现。此种情况下引导用户打开系统设置,不展示开关 + resolve() + break; + case 'config error': // 只有在 App 端时返回 + resolve() + break; + default: + resolve() + break; + } + }) } + // 判断相机权限是否开启 function judgeIosPermissionCamera() { - const authSetting = uni.getAppAuthorizeSetting(); - const state = authSetting.cameraAuthorized; - console.log('state', state); - switch (state) { - case 'authorized': - console.log("相机权限已经开启"); - return 'authorized'; - case 'denied': - return 'denied'; - case 'not determined': - return 'undetermined'; - case 'config error': - return 'undetermined'; - default: - return 'undetermined'; - } - // var result = false; - // var AVCaptureDevice = plus.ios.import("AVCaptureDevice"); - // var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide'); - // console.log("authStatus:" + authStatus); - // if (authStatus == 3) { - // result = true; - // console.log("相机权限已经开启"); - // } else { - // console.log("相机权限没有开启"); - // } - // plus.ios.deleteObject(AVCaptureDevice); - // return result; + + return new Promise(async (resolve, reject) => { + const authSetting = uni.getAppAuthorizeSetting(); + const state = authSetting.cameraAuthorized; + console.log('相机权限', state); + switch (state) { + case 'authorized': + console.log("相机权限已经开启"); + resolve() + break; + case 'denied': // ios拒绝,安卓拒绝或者未授权都是这个 + console.log('IsAndEnv', IsAndEnv); + if (IsAndEnv) { // 安卓二次判定 + const result = await requestAndroidPermission('android.permission.CAMERA') + console.log('安卓二次判定', result); + if (result === 1) { + resolve() + break; + } + } + const resultT = await common.show( + '提示信息', + '当前页面需要使用相机权限,是否前往开启?' + ) + if (resultT) { + // 前往权限设置页面 + uni.openAppAuthorizeSetting(); + } + reject() + break; + case 'not determined': // 表示尚未请求授权,仅 iOS 会出现。此种情况下引导用户打开系统设置,不展示开关 + resolve() + break; + case 'config error': // 只有在 App 端时返回 + resolve() + break; + default: + resolve() + break; + } + }) } // 判断相册权限是否开启 @@ -283,8 +328,8 @@ function checkSystemEnableLocation() { export default { - judgeIosPermission, - requestAndroidPermission, - checkSystemEnableLocation, - gotoAppPermissionSetting + judgeIosPermission, + requestAndroidPermission, + checkSystemEnableLocation, + gotoAppPermissionSetting } \ No newline at end of file diff --git a/src/manifest.json b/src/manifest.json index 3a5e9a32..686c8548 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -33,8 +33,8 @@ /* 模块配置 */ "modules" : { "Camera" : { - "description": "用于访问摄像头进行实时预览" - }, + "description" : "用于访问摄像头进行实时预览" + }, "Barcode" : {}, "Record" : {}, "VideoPlayer" : {}, @@ -66,16 +66,16 @@ /* ios打包配置 */ "ios" : { "dSYMs" : false, - "deploymentTarget": "11.0", - "privacyDescription": { - "NSCameraUsageDescription": "此应用需要访问您的摄像头来进行视频录制和拍照功能", - "NSMicrophoneUsageDescription": "此应用需要访问您的麦克风来录制音频" - }, - "capabilities": { - "entitlements": { - "com.apple.developer.avfoundation.multitasking-camera-access": true - } - } + "deploymentTarget" : "11.0", + "privacyDescription" : { + "NSCameraUsageDescription" : "此应用需要访问您的摄像头来进行视频录制和拍照功能", + "NSMicrophoneUsageDescription" : "此应用需要访问您的麦克风来录制音频" + }, + "capabilities" : { + "entitlements" : { + "com.apple.developer.avfoundation.multitasking-camera-access" : true + } + } }, /* SDK配置 */ "sdkConfigs" : {}, diff --git a/src/pages/pointsAndRank/badge.vue b/src/pages/pointsAndRank/badge.vue index cc0c9dc0..1ef23d38 100644 --- a/src/pages/pointsAndRank/badge.vue +++ b/src/pages/pointsAndRank/badge.vue @@ -68,7 +68,7 @@ {{ detailedInfo.badgeName }} {{ detailedInfo.remark }} - {{ detailedInfo.obtainTm }} + 获得时间:{{ detailedInfo.obtainTm }} { try { - //#ifdef APP-PLUS - console.log('申请权限', getPhoneEnvBool('AND')); - if (getPhoneEnvBool('AND')) { - console.log('申请权限'); - await initRecord(); - } - // console.log('水水水水水水水水', permissionApi.judgeIosPermission('camera')); + //#ifdef APP-PLUS + console.log('申请权限'); + try { + // await initRecord(); + await permissionApi.judgeIosPermission('record') + await permissionApi.judgeIosPermission('camera') + } catch(e) { + console.error('摄像头或者麦克风权限申请失败:', e); + return; + } //#endif common.setPageCache('tipMsgsceneDesc', { ossAddr: detailInfo.value.ossAddr, diff --git a/src/pages/test/index.vue b/src/pages/test/index.vue index 85bfd026..14f7c9e9 100644 --- a/src/pages/test/index.vue +++ b/src/pages/test/index.vue @@ -23,6 +23,7 @@ From 2c6904481ec147f35262867fe23049c0ed3cd6d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Fri, 12 Dec 2025 18:21:43 +0800 Subject: [PATCH 03/11] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E9=80=9A=E8=AF=9D=E6=A0=B7=E5=BC=8F=E4=B8=8D=E5=B0=8F?= =?UTF-8?q?=E5=BF=83=E8=A2=AB=E8=A7=86=E9=A2=91=E6=8C=A4=E4=B9=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/sparring/talk.vue | 8 +++++++- src/pages/test/index.vue | 8 -------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/pages/sparring/talk.vue b/src/pages/sparring/talk.vue index 7e67f9ef..7e3e21c4 100644 --- a/src/pages/sparring/talk.vue +++ b/src/pages/sparring/talk.vue @@ -3,7 +3,7 @@ - + {{ formattedTime }} @@ -273,6 +273,12 @@ } .role-name { margin-bottom: 26rpx; + // position: relative; + // width: 100vw; + text-align: center; + color: #fff; + line-height: 58rpx; + font-size: 38rpx; } .title-tip { diff --git a/src/pages/test/index.vue b/src/pages/test/index.vue index 14f7c9e9..281077f4 100644 --- a/src/pages/test/index.vue +++ b/src/pages/test/index.vue @@ -37,14 +37,6 @@ } const aaaa = async() => { - await permision.judgeIosPermission('camera') - - // var result = await permision.requestAndroidPermission('android.permission.CAMERA') - // console.log('result', result); - - // const permResult = await permission.requestAndroidPermission( - // 'android.permission.RECORD_AUDIO'); - // common.navigateTo('/pages/test/testChat') } From 6f674a4df6762f1b9f3924678373f40aa25b716e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Fri, 12 Dec 2025 20:19:14 +0800 Subject: [PATCH 04/11] Update talk.vue --- src/pages/sparring/talk.vue | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/pages/sparring/talk.vue b/src/pages/sparring/talk.vue index 7e3e21c4..57d1285f 100644 --- a/src/pages/sparring/talk.vue +++ b/src/pages/sparring/talk.vue @@ -51,7 +51,7 @@ traInterTyp: '', execId: '', sceneDesc: '', - preview: false, // 是否是预览 + isPreview: '', // 是否是预览 traInterTypDesc: '', // 类型的文字提示,例如 语音通话 ossAddr: '', //用户头像 chaName: '' //用户名称 @@ -86,16 +86,20 @@ if (type <= 2) { nextTick(() => { setTimeout(() => { - common.redirectTo( - '/pages/sparring/result?isOver=1&traId=' + - dataInfo.traId + - '&execId=' + - dataInfo.execId + - '&type=' + - dataInfo.traType + - '&isPreview=' + - (dataInfo.isPreview ? '1' : '') - ); + if(dataInfo.execId) { + common.redirectTo( + '/pages/sparring/result?isOver=1&traId=' + + dataInfo.traId + + '&execId=' + + dataInfo.execId + + '&type=' + + dataInfo.traType + + '&isPreview=' +dataInfo.isPreview + ); + } else { + common.navigateBack() + } + }, 300); }); } @@ -213,8 +217,7 @@ // 只有app才能打开摄像头 isVideo.value = dataInfo.traInterTyp === '03'; //#endif - console.log('isVideo.value', isVideo.value); - dataInfo.preview = e.isPreview === '1'; // 是否是预览 + dataInfo.isPreview = e.isPreview || ''; // 是否是预览 const pageData = common.getPageCache('tipMsgsceneDesc'); dataInfo.ossAddr = pageData.ossAddr; dataInfo.chaName = pageData.chaName; From d740d679f336504f2a246a9330a0a707011975e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Fri, 12 Dec 2025 20:11:48 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=88=91=E7=9A=84git?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/sparring/talk.vue | 1 - src/pages/test/testChat.nvue | 38 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/pages/test/testChat.nvue diff --git a/src/pages/sparring/talk.vue b/src/pages/sparring/talk.vue index 57d1285f..ac2ea33d 100644 --- a/src/pages/sparring/talk.vue +++ b/src/pages/sparring/talk.vue @@ -212,7 +212,6 @@ dataInfo.chaId = e.chaId ?? ''; dataInfo.traType = '02'; // 陪练类型 01-练习 02-考试 dataInfo.traInterTyp = e.traInterTyp ?? '02'; // 陪练交互类型 01 对话 02 语音 03 视频 - // dataInfo.traInterType = '02'; // 陪练交互类型 01 对话 02 语音 03 视频 //#ifdef APP-PLUS // 只有app才能打开摄像头 isVideo.value = dataInfo.traInterTyp === '03'; diff --git a/src/pages/test/testChat.nvue b/src/pages/test/testChat.nvue new file mode 100644 index 00000000..336c20c6 --- /dev/null +++ b/src/pages/test/testChat.nvue @@ -0,0 +1,38 @@ + + + + From 1dbec4e38aee1c183547896e92433f54eddf747d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Fri, 12 Dec 2025 20:55:13 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=A5=9E=E5=A5=87=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/sparring/talk.vue | 98 ++++++++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 24 deletions(-) diff --git a/src/pages/sparring/talk.vue b/src/pages/sparring/talk.vue index ac2ea33d..37d5078b 100644 --- a/src/pages/sparring/talk.vue +++ b/src/pages/sparring/talk.vue @@ -28,9 +28,28 @@ + \ No newline at end of file diff --git a/src/pages/sparring/js/ProtocolCodec.ts b/src/pages/sparring/js/ProtocolCodec.ts index 02da520c..c114cd05 100644 --- a/src/pages/sparring/js/ProtocolCodec.ts +++ b/src/pages/sparring/js/ProtocolCodec.ts @@ -169,7 +169,6 @@ export class ProtocolCodec { // STRING 序列化:必须传入字符串(非 PING 消息已校验非空) serializedBody = textEncoder.encode(body as string); break; - case SerializationType.JSON: // 断言:body 是 string 或 object if (typeof body === 'string') { diff --git a/src/pages/sparring/js/useWebSocket.js b/src/pages/sparring/js/useWebSocket.js index ebfbae19..0b7cd92d 100644 --- a/src/pages/sparring/js/useWebSocket.js +++ b/src/pages/sparring/js/useWebSocket.js @@ -22,8 +22,8 @@ const DEFAULT_AUTH_PARAMS = { user_id: '1001', // 默认用户ID(可从缓存/全局状态取) token: '', // 优先从缓存获取,避免硬编码 name: '测试用户', - device_id: uni.getSystemInfoSync().deviceId || '', // 设备ID(补充) - timestamp: Date.now() // 时间戳(防篡改) + // device_id: uni.getSystemInfoSync().deviceId || '', // 设备ID(补充) + // timestamp: Date.now() // 时间戳(防篡改) }; // const wsUrl = 'ws://127.0.0.1:8000/ws/audio' const url = '/trapractice/voiceCallSocket/voiceCall' @@ -44,6 +44,7 @@ export default function useWebSocket(aaas = null, options = {}) { ...DEFAULT_AUTH_PARAMS, ...authParams, }; + ws.value = uni.connectSocket({ url: wsUrl, fail: () => { @@ -54,15 +55,12 @@ export default function useWebSocket(aaas = null, options = {}) { } }); ws.value.onOpen((res) => { - console.log('onOpen', finalAuthParams); ws.value.send({ data: ProtocolCodec.pack(MessageType.IDENTITY, finalAuthParams) }); }); ws.value.onError((err) => onError(err)) - - ws.value.onClose((err) => { console.log('onClose', err); onClose(err) diff --git a/src/pages/sparring/talk.vue b/src/pages/sparring/talk.vue index 37d5078b..de5c933a 100644 --- a/src/pages/sparring/talk.vue +++ b/src/pages/sparring/talk.vue @@ -259,7 +259,7 @@ 'traInterTyp': dataInfo.traInterTyp, 'traId': dataInfo.traId, 'chaId': dataInfo.chaId, - 'preview': true, + 'preview': true }, onStartRecord: onStartRecord, playPcmCallback: (res) => talkSpeakerRef.value.playPCM(res), diff --git a/src/pages/test/testChat.nvue b/src/pages/test/testChat.nvue deleted file mode 100644 index 336c20c6..00000000 --- a/src/pages/test/testChat.nvue +++ /dev/null @@ -1,38 +0,0 @@ - - - - From 5774ea2514593ba59c5c876d2d42042eb076ee15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Fri, 12 Dec 2025 21:29:33 +0800 Subject: [PATCH 08/11] =?UTF-8?q?m=E4=BF=AE=E5=A4=8Dtalk=E9=A1=B5=E5=A5=87?= =?UTF-8?q?=E6=80=AA=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/sparring/talk.vue | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/pages/sparring/talk.vue b/src/pages/sparring/talk.vue index de5c933a..5f22780b 100644 --- a/src/pages/sparring/talk.vue +++ b/src/pages/sparring/talk.vue @@ -69,13 +69,13 @@ const isVideoStyle = computed(() => dataInfo.traInterTyp === '03'); const dataInfo = reactive({ - isPreview: '', // 是否是预览 traId: '', chaId: '', traType: '', traInterTyp: '', execId: '', sceneDesc: '', + preview: false, // 是否是预览 traInterTypDesc: '', // 类型的文字提示,例如 语音通话 ossAddr: '', //用户头像 chaName: '' //用户名称 @@ -118,7 +118,8 @@ dataInfo.execId + '&type=' + dataInfo.traType + - '&isPreview=' + dataInfo.isPreview + '&isPreview=' + + (dataInfo.preview ? '1' : '') ); } else { common.navigateBack() @@ -245,8 +246,7 @@ // 只有app才能打开摄像头 isVideo.value = dataInfo.traInterTyp === '03'; //#endif - console.log('isVideo.value', isVideo.value); - dataInfo.isPreview = e.isPreview ?? '0'; // 是否是预览 + dataInfo.preview = e.isPreview === '1'; // 是否是预览 const pageData = common.getPageCache('tipMsgsceneDesc'); dataInfo.ossAddr = pageData.ossAddr; dataInfo.chaName = pageData.chaName; @@ -254,13 +254,7 @@ }); onMounted(() => { initConnection({ - authParams: { - 'traType': dataInfo.traType, - 'traInterTyp': dataInfo.traInterTyp, - 'traId': dataInfo.traId, - 'chaId': dataInfo.chaId, - 'preview': true - }, + authParams: Object.assign({}, dataInfo), onStartRecord: onStartRecord, playPcmCallback: (res) => talkSpeakerRef.value.playPCM(res), setPlayNumber: (id) => talkSpeakerRef.value.setPlayNumber(id), From 55d8044d71dff3623deb7bf87c70082b48a575e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Mon, 15 Dec 2025 09:12:04 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=B0=8F=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 4 ++-- src/pages/sparring/talk.vue | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.env.development b/.env.development index 27b8fd64..acccd2fd 100644 --- a/.env.development +++ b/.env.development @@ -6,7 +6,7 @@ ENV = 'development' # VITE_APP_BASE_API_Url = 'https://aits.jlbank.com.cn:7001' -VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' +#VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' # VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' @@ -14,7 +14,7 @@ VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' # VITE_APP_BASE_API_Url = 'http://aitscdn.jlbank.com.cn:7001' # VITE_APP_BASE_API_Url = 'http://192.168.108.129' # dev -#VITE_APP_BASE_API_Url = 'http://25.18.122.65:7001' +VITE_APP_BASE_API_Url = 'http://25.18.122.65:7001' # sit #VITE_APP_BASE_API_Url = 'http://25.18.122.91:9786' diff --git a/src/pages/sparring/talk.vue b/src/pages/sparring/talk.vue index 5f22780b..b6f7bf76 100644 --- a/src/pages/sparring/talk.vue +++ b/src/pages/sparring/talk.vue @@ -35,7 +35,8 @@ onUnmounted, computed, getCurrentInstance, - nextTick + nextTick, + toRaw } from 'vue'; import { onShow, @@ -254,7 +255,7 @@ }); onMounted(() => { initConnection({ - authParams: Object.assign({}, dataInfo), + authParams: toRaw(dataInfo), onStartRecord: onStartRecord, playPcmCallback: (res) => talkSpeakerRef.value.playPCM(res), setPlayNumber: (id) => talkSpeakerRef.value.setPlayNumber(id), From 31cc7133822eee0fc66bdc6f5ff27d61320977f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Mon, 15 Dec 2025 09:33:06 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BC=A0=E5=85=A5?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/sparring/talk.vue | 8 +++++++- src/pages/test/{testChat.vue => testChat.nvue} | 0 2 files changed, 7 insertions(+), 1 deletion(-) rename src/pages/test/{testChat.vue => testChat.nvue} (100%) diff --git a/src/pages/sparring/talk.vue b/src/pages/sparring/talk.vue index b6f7bf76..42e699ab 100644 --- a/src/pages/sparring/talk.vue +++ b/src/pages/sparring/talk.vue @@ -255,7 +255,13 @@ }); onMounted(() => { initConnection({ - authParams: toRaw(dataInfo), + authParams: { + traId: dataInfo.traId, + chaId: dataInfo.chaId, + traType: dataInfo.traType, + traInterTyp: dataInfo.traInterTyp, + preview: dataInfo.preview + }, onStartRecord: onStartRecord, playPcmCallback: (res) => talkSpeakerRef.value.playPCM(res), setPlayNumber: (id) => talkSpeakerRef.value.setPlayNumber(id), diff --git a/src/pages/test/testChat.vue b/src/pages/test/testChat.nvue similarity index 100% rename from src/pages/test/testChat.vue rename to src/pages/test/testChat.nvue From 9c7ae6cf119b2bd1d501e22479b4fc0fe74a239c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Mon, 15 Dec 2025 09:33:56 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E8=BF=98=E5=8E=9Fnvue=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/test/{testChat.nvue => testChat.vue} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/pages/test/{testChat.nvue => testChat.vue} (100%) diff --git a/src/pages/test/testChat.nvue b/src/pages/test/testChat.vue similarity index 100% rename from src/pages/test/testChat.nvue rename to src/pages/test/testChat.vue