修改pk页两个bug
This commit is contained in:
+5
-3
@@ -6,24 +6,26 @@ 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:7001'
|
||||
|
||||
|
||||
# VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002'
|
||||
|
||||
# VITE_APP_BASE_API_Url = 'http://192.168.247.200'
|
||||
# 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'
|
||||
# sit
|
||||
# VITE_APP_BASE_API_Url = 'http://25.18.122.91:9786'
|
||||
VITE_APP_BASE_API_Url = 'http://25.18.122.91:9786'
|
||||
# UAT
|
||||
# VITE_APP_BASE_API_Url = 'http://25.18.122.78:9786'
|
||||
|
||||
# DEV
|
||||
# app入口
|
||||
|
||||
#VITE_APP_BASE_API_Url = 'http://25.18.122.65:7001'
|
||||
# VITE_APP_BASE_API_Url = 'http://25.18.122.65:7001'
|
||||
# VITE_APP_BASE_API_Url = 'http://25.16.122.91:9786'
|
||||
# VITE_APP_BASE_API_Url = 'http://25.18.122.66:9786'
|
||||
|
||||
|
||||
@@ -202,8 +202,16 @@
|
||||
console.log('声音加载完毕', e.duration);
|
||||
// 计算原始时长
|
||||
const originalTime = Math.ceil(e.duration) || 1;
|
||||
// 判断是否在118-123秒范围内
|
||||
const displayTime = originalTime >= 118 && originalTime <= 124 ? 120 : originalTime;
|
||||
let displayTime
|
||||
if(originalTime >= 118 && originalTime <= 122) {
|
||||
// 判断是否在118-123秒范围内
|
||||
displayTime = 120
|
||||
} else if(originalTime >= 58 && originalTime <= 62) {
|
||||
// 判断是否在58-62秒范围内
|
||||
displayTime = 60
|
||||
} else {
|
||||
displayTime = originalTime
|
||||
}
|
||||
// 赋值显示
|
||||
console.log('displayTime', displayTime);
|
||||
voiceTime.value = displayTime + 's';
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
mode=""
|
||||
@click="changeBtn"
|
||||
></image>
|
||||
|
||||
<image
|
||||
class="talk-btn-icon"
|
||||
v-show="keyboardIsShow && !!inputText"
|
||||
@@ -48,7 +47,6 @@
|
||||
@click.stop="showKeyboard"
|
||||
></image>
|
||||
</view>
|
||||
|
||||
<uni-popup ref="popupRef" class="popup">
|
||||
<view class="overlay-box">
|
||||
<view class="circle-bg-box">
|
||||
@@ -147,7 +145,7 @@
|
||||
console.log('延迟开始');
|
||||
recordingStatus.value = 'preparing';
|
||||
popupRef.value.open();
|
||||
recorderManager.start({ duration: 120000 });
|
||||
recorderManager.start({ duration: 59000 });
|
||||
startTime = Date.now();
|
||||
}, 80);
|
||||
};
|
||||
|
||||
@@ -89,15 +89,17 @@
|
||||
const expand = ref(false); // 展开状态
|
||||
const isSigned = ref(false); // 今日签到状态
|
||||
const continuousDay = ref(0); // 连续签到
|
||||
const continuousDay30 = computed(() => continuousDay.value % 30); // 连续签到取模30的天数
|
||||
// 判断一下当前的签到显示在第几周
|
||||
const nowLine = computed(() => {
|
||||
// 计算当前需要显示图标的天数(已签到则是连续天数,未签到则是下一天)
|
||||
const currentDay = isSigned.value ? continuousDay.value : continuousDay.value + 1;
|
||||
|
||||
const currentDay = isSigned.value ? continuousDay30.value : continuousDay30.value + 1;
|
||||
// 按每周7天分行,行数从0开始(例如:1-7天 → 第0行,8-14天 → 第1行...)
|
||||
// 注意:如果天数从1开始(不是0),需要减1再计算
|
||||
console.log('nowLine', Math.floor((currentDay - 1) / 7));
|
||||
return Math.floor((currentDay - 1) / 7);
|
||||
});
|
||||
|
||||
const emits = defineEmits(['checkInFun']);
|
||||
// 切换显示状态
|
||||
const switchStatus = () => {
|
||||
@@ -174,7 +176,7 @@
|
||||
|
||||
// 计算当前是第几天(以"前X天"为第1天)
|
||||
const dayNumber = i - -X + 1; // 核心计算:转换为从1开始的序列
|
||||
|
||||
|
||||
// 计算text字段
|
||||
let text = '1'; // 默认显示1
|
||||
if (dayNumber === 30) {
|
||||
@@ -209,6 +211,7 @@
|
||||
const open = (isSignedStatus, days, onCheckInClick = () => {}, onCheckInSuccess = () => {}) => {
|
||||
isSigned.value = isSignedStatus; // 今日签到状态
|
||||
// isSigned.value = false; // 今日签到状态
|
||||
// continuousDay.value = 1; // 连续签到
|
||||
continuousDay.value = days; // 连续签到
|
||||
checkInClickCallback = onCheckInClick;
|
||||
checkInSuccessCallback = onCheckInSuccess;
|
||||
@@ -218,7 +221,8 @@
|
||||
// const X = 10;
|
||||
// console.log(`以${continuousDay.value}天`);
|
||||
// console.log(`以${X}天前为第1天的35天分组日期:`);
|
||||
dateGroups.value = generateGroupedDateList(X);
|
||||
console.log('取模', continuousDay30.value);
|
||||
dateGroups.value = generateGroupedDateList(continuousDay30.value);
|
||||
} catch (err) {
|
||||
console.error(err.message);
|
||||
}
|
||||
|
||||
@@ -488,6 +488,7 @@
|
||||
"path": "pages/sparring/tip",
|
||||
"style": {
|
||||
"navigationBarTitleText": "AI陪练提示",
|
||||
"disableSwipeBack": true,
|
||||
"app-plus": {
|
||||
"titleNView": false
|
||||
}
|
||||
@@ -515,6 +516,7 @@
|
||||
"path": "pages/sparring/result",
|
||||
"style": {
|
||||
"navigationBarTitleText": "AI陪练报告",
|
||||
"disableSwipeBack": true,
|
||||
"app-plus": {
|
||||
"titleNView": false
|
||||
}
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
<view class="main_div max_page">
|
||||
<template v-if="!isMatchingSuccess">
|
||||
<!-- 顶部一些按钮 -->
|
||||
<view class="top-button-div">
|
||||
<view class="top-button-div" v-if="!challengeLoading">
|
||||
<view class="back_div" @click="common.navigateBack()">
|
||||
<view class="back-icon"></view>
|
||||
</view>
|
||||
<view class="fl1"></view>
|
||||
<view class="top-icon-div" @click="click_top_icon(1)">
|
||||
<view class="top-icon-div" @click="click_top_icon(1)" >
|
||||
<image class="img1" :src="data_info.isAnony === 'N' ? pkAnonymousOpen() : pkAnonymousClose()"></image>
|
||||
<view class="text">{{ data_info.isAnony === 'N' ? '不匿名' : '匿名' }}</view>
|
||||
</view>
|
||||
@@ -20,6 +20,7 @@
|
||||
<view class="text">排行榜</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="top-button-div" v-else></view>
|
||||
<view class="title-div" :class="{ hidden: challengeLoading }">
|
||||
{{ data_info.comName }}
|
||||
</view>
|
||||
|
||||
@@ -124,7 +124,6 @@
|
||||
import { competitionAnswer, queryCompetitionPracticeAnswerResult, competitionAnswerEnd } from '@/api/competition.js';
|
||||
import { startExamByCrs } from '@/api/examination.js';
|
||||
import { startPracticeByCrs } from '@/api/practice.js';
|
||||
|
||||
const feedbackRef = ref(null);
|
||||
const dialogRef = ref(null);
|
||||
const touchBtnRef = ref(null);
|
||||
|
||||
@@ -31,13 +31,18 @@
|
||||
</view>
|
||||
<view class="user-column">
|
||||
<view class="avatar-box">
|
||||
<image
|
||||
v-if="item.isAnony !== 'N'"
|
||||
class="avatar-image"
|
||||
:src="defaultAnonymousAvatar"
|
||||
></image>
|
||||
<image-preview
|
||||
v-if="item.ossAddr"
|
||||
v-else-if="item.ossAddr"
|
||||
class="avatar-image"
|
||||
:src="item.ossAddr"
|
||||
mode="aspectFit"
|
||||
></image-preview>
|
||||
<image v-else class="avatar-image" :src="defaultAnonymousAvatar"></image>
|
||||
<image v-else class="avatar-image" :src="defaultAvatar"></image>
|
||||
</view>
|
||||
<view class="user-name">
|
||||
{{ item.isAnony === 'N' ? item.userName : formatName(item.userName) }}
|
||||
@@ -66,13 +71,13 @@
|
||||
:src="userRankObj.ossAddr"
|
||||
mode="aspectFit"
|
||||
></image-preview>
|
||||
<image class="avatar-image" v-else :src="defaultAnonymousAvatar"></image>
|
||||
<image class="avatar-image" v-else :src="defaultAvatar"></image>
|
||||
</view>
|
||||
<view class="user-name">{{ userRankObj.isAnony === 'N' ? userRankObj.userName : formatName(userRankObj.userName) }}</view>
|
||||
<view class="user-name">{{ userRankObj.userName }}</view>
|
||||
<view class="user-org">{{ userRankObj.orgName }}</view>
|
||||
</view>
|
||||
<view class="score-column">{{ userRankObj.examGrade }}</view>
|
||||
<view class="time-column">{{ userRankObj.time }}s</view>
|
||||
<view class="time-column">{{ userRankObj.time ? userRankObj.time + 's' : '--' }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -81,13 +86,12 @@
|
||||
|
||||
<script setup>
|
||||
import { queryTraCompetitionRankingList } from '@/api/competition.js';
|
||||
import { defaultAvatar } from '@/enum.js';
|
||||
import common from '@/common/common';
|
||||
import { onLoad } from '@dcloudio/uni-app';
|
||||
import { formatSecondsToMS } from './js/tool';
|
||||
import { ref } from 'vue';
|
||||
import { formatName } from '@/common/common';
|
||||
import { defaultAnonymousAvatar } from '@/enum';
|
||||
import { defaultAnonymousAvatar, defaultAvatar } from '@/enum';
|
||||
const papersId = ref('');
|
||||
const orgId = ref('');
|
||||
const userList = ref([]);
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
<view class="sparring-list">
|
||||
<view class="sparring-list-body">
|
||||
<scroll-view :class="['right-sparring-list']" :scroll-y="true" @scrolltolower="getMoreList()"
|
||||
:refresher-enabled="true" refresher-default-style="none" :refresher-triggered="triggered"
|
||||
:refresher-enabled="refresherEnabled" refresher-default-style="none" :refresher-triggered="triggered"
|
||||
@refresherrefresh="changeTab({
|
||||
name: activeTab.value || '全部',
|
||||
value: activeCourseType.value || ''
|
||||
@@ -292,9 +292,11 @@
|
||||
})
|
||||
}
|
||||
const loading = ref(false)
|
||||
const refresherEnabled = ref(true)
|
||||
const changeTab = item => {
|
||||
if (!item) return
|
||||
triggered.value = true
|
||||
refresherEnabled.value = false
|
||||
sparringListBase.value = []
|
||||
activeTab.value = item.name
|
||||
activeTabId.value = item.value || ''
|
||||
@@ -305,7 +307,7 @@
|
||||
// activeTag.value = ''
|
||||
activePrdlineType.value = ''
|
||||
loading.value = true
|
||||
|
||||
console.log(111)
|
||||
queryCrsInfoByCatalogApi({
|
||||
...pageObj.value,
|
||||
catalogId: activeCourseType.value
|
||||
@@ -317,6 +319,7 @@
|
||||
.finally(() => {
|
||||
loading.value = false
|
||||
triggered.value = false
|
||||
refresherEnabled.value = true
|
||||
})
|
||||
}
|
||||
const changeTabSec = (item) => {
|
||||
|
||||
@@ -60,9 +60,9 @@
|
||||
<view :class="['body-bottom-static', isPass?'pass':'fialed']">
|
||||
<view class="static-tip">得分</view>
|
||||
<view class="static-score">{{ totalScore }}</view>
|
||||
<view class="static-desc" v-if="false">{{'朋友,你挺能说违禁词啊!'}}</view>
|
||||
<view class="static-desc" v-if="false">以下均为违禁词:<text style="color: red;">{{'违禁词'}}</text></view>
|
||||
<view class="static-desc">{{!isPass?'你这个得分,不容易的!':'恭喜你过关斩将,顺利通关!'}}</view>
|
||||
<view class="static-desc" v-if="!!hitBanWords">{{'朋友,你挺能说违禁词啊!'}}</view>
|
||||
<view class="static-desc" v-if="!!hitBanWords">以下均为违禁词:<text style="color: red;">{{hitBanWords}}</text></view>
|
||||
<view class="static-desc" v-else>{{!isPass?'你这个得分,不容易的!':'恭喜你过关斩将,顺利通关!'}}</view>
|
||||
|
||||
<view class="static-charts">
|
||||
<ChartThree v-if="evalDimens.length === 3" fromType="tra" :dataList="evalDimens" />
|
||||
@@ -87,7 +87,8 @@
|
||||
import {
|
||||
onShow,
|
||||
onLoad,
|
||||
onUnload
|
||||
onUnload,
|
||||
onBackPress
|
||||
} from '@dcloudio/uni-app';
|
||||
import common from '@/common/common'
|
||||
import Feedback from './components/feedback.vue';
|
||||
@@ -175,6 +176,7 @@
|
||||
filterType.value = info.value
|
||||
}
|
||||
const evalDimens = ref([])
|
||||
const hitBanWords = ref('')
|
||||
const traPartnerExecuteAnswerRecords = ref([])
|
||||
const totalScore = ref(0)
|
||||
const showLoading = ref(true)
|
||||
@@ -199,13 +201,13 @@
|
||||
totalScore.value = res.body.traPartnerExecuteHisVo?.traGrade || '0'
|
||||
positiveList.value = res.body.positiveList || []
|
||||
negativeList.value = res.body.negativeList || []
|
||||
hitBanWords.value = res.body.traPartnerExecuteHisVo?.hitBanWords || ''
|
||||
let _evalDimens = res.body.traPartnerSettlement || []
|
||||
evalDimens.value = _evalDimens.map(t => {
|
||||
return {
|
||||
...t,
|
||||
anlyGrade: t.traGrade,
|
||||
gradeDimensName: t.gradeDimensName || '维度'
|
||||
|
||||
}
|
||||
})
|
||||
let _talkingList = res.body.traPartnerExecuteAnswerRecords || []
|
||||
@@ -275,6 +277,7 @@
|
||||
getData()
|
||||
});
|
||||
onMounted(() => {})
|
||||
onBackPress((res) => res.from === 'backbutton');
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
+176
-4
@@ -1,10 +1,182 @@
|
||||
<template>
|
||||
<!-- 通话 -->
|
||||
<view>通话</view>
|
||||
<view class="container">
|
||||
<button @click="startPush" v-if="!isPushing">开始语音推流</button>
|
||||
<button @click="stopPush" v-else>停止语音推流</button>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
isPushing: false, // 推流状态
|
||||
pusher: null, // 推流实例
|
||||
currentWebview: null // 当前 Webview 实例
|
||||
};
|
||||
},
|
||||
onReady() {
|
||||
// 改用 onReady(页面渲染完成) + 延迟
|
||||
if (uni.getSystemInfoSync().platform === 'android') {
|
||||
// 安卓端延迟 1000ms,且重试 3 次,确保获取到 Webview
|
||||
let retryCount = 0;
|
||||
const getWebview = () => {
|
||||
this.currentWebview = this.$mp.page.$getAppWebview();
|
||||
if (this.currentWebview) {
|
||||
console.log('Webview 获取成功:', this.currentWebview);
|
||||
return;
|
||||
}
|
||||
retryCount++;
|
||||
if (retryCount < 3) {
|
||||
setTimeout(getWebview, 500); // 每次重试间隔 500ms
|
||||
} else {
|
||||
uni.showToast({ title: 'Webview 初始化失败', icon: 'none' });
|
||||
}
|
||||
};
|
||||
setTimeout(getWebview, 1000); // 初始延迟 1 秒
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
// // 仅 App 端初始化 Webview
|
||||
// if (uni.getSystemInfoSync().platform !== 'app-plus') {
|
||||
// uni.showToast({ title: '仅支持 App 端推流', icon: 'none' });
|
||||
// return;
|
||||
// }
|
||||
// this.currentWebview = this.$mp.page.$getAppWebview();
|
||||
},
|
||||
onUnload() {
|
||||
// 页面销毁时停止推流并销毁组件
|
||||
this.stopPush();
|
||||
},
|
||||
methods: {
|
||||
// 申请麦克风权限
|
||||
async requestMicPermission() {
|
||||
return new Promise((resolve, reject) => {
|
||||
plus.android.requestPermissions(
|
||||
['android.permission.RECORD_AUDIO'], // Android 权限
|
||||
(res) => {
|
||||
const granted = res.filter((item) => item.granted).length === 1;
|
||||
granted ? resolve() : reject('麦克风权限申请失败');
|
||||
},
|
||||
(err) => reject(err)
|
||||
);
|
||||
// iOS 权限由系统自动弹窗,无需手动申请,此处可统一处理
|
||||
});
|
||||
},
|
||||
async startPush() {
|
||||
if (uni.getSystemInfoSync().platform !== 'app-plus') return;
|
||||
|
||||
try {
|
||||
await this.requestMicPermission();
|
||||
|
||||
// 优先用原生 API 获取 Webview(兜底)
|
||||
this.currentWebview = plus.webview.currentWebview() || this.$mp.page.$getAppWebview();
|
||||
if (!this.currentWebview) {
|
||||
throw new Error('无法获取页面 Webview 实例');
|
||||
}
|
||||
|
||||
// 后续创建 pusher + append 逻辑
|
||||
this.pusher = plus.video.createLivePusher('', {
|
||||
/* 配置 */
|
||||
});
|
||||
this.currentWebview.append(this.pusher); // 此时不会再为 null
|
||||
// ... 启动推流
|
||||
} catch (err) {
|
||||
console.error('推流启动失败:', err);
|
||||
}
|
||||
},
|
||||
// 开始推流
|
||||
async startPush2() {
|
||||
console.log('11', uni.getSystemInfoSync().platform);
|
||||
// 1. 端判断
|
||||
if (uni.getSystemInfoSync().platform !== 'android') return;
|
||||
console.log('22');
|
||||
try {
|
||||
// 2. 申请麦克风权限
|
||||
// await this.requestMicPermission();
|
||||
console.log('33');
|
||||
// 3. 创建 LivePusher 实例(仅音频,隐藏组件)
|
||||
this.pusher = plus.video.createLivePusher('', {
|
||||
url: 'rtmp://25.18.122.148:9605/voice_in/aa', // 你的 RTMP 推流地址
|
||||
top: '0px',
|
||||
left: '0px',
|
||||
width: '1px', // 隐藏组件(仅音频无需显示)
|
||||
height: '1px',
|
||||
position: 'static',
|
||||
// 核心:仅音频配置
|
||||
video: {
|
||||
enable: false // 关闭视频采集
|
||||
},
|
||||
audio: {
|
||||
enable: true, // 开启音频采集
|
||||
sampleRate: 16000, // 采样率(AI 语音识别常用 16k)
|
||||
bitrate: 64000, // 音频码率
|
||||
codec: 'aac' // 编码格式(RTMP 主流)
|
||||
},
|
||||
// 推流模式:仅音频直播
|
||||
mode: 'rtmp',
|
||||
autopush: false // 不自动推流,手动控制
|
||||
});
|
||||
console.log('44');
|
||||
// 4. 挂载到 Webview
|
||||
this.currentWebview.append(this.pusher);
|
||||
|
||||
// 5. 监听推流状态
|
||||
this.pusher.addEventListener('statechange', (e) => {
|
||||
console.log('推流状态变化:', e);
|
||||
switch (e.state) {
|
||||
case 'connecting':
|
||||
uni.showToast({ title: '正在连接推流服务器', icon: 'none' });
|
||||
break;
|
||||
case 'connected':
|
||||
this.isPushing = true;
|
||||
uni.showToast({ title: '推流成功', icon: 'success' });
|
||||
break;
|
||||
case 'disconnected':
|
||||
this.isPushing = false;
|
||||
uni.showToast({ title: '推流断开', icon: 'none' });
|
||||
break;
|
||||
case 'error':
|
||||
this.isPushing = false;
|
||||
uni.showToast({ title: `推流错误:${e.error}`, icon: 'none' });
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// 6. 启动预览 + 推流
|
||||
this.pusher.startPreview(); // 启动音视频采集(必须调用)
|
||||
this.pusher.start(); // 开始推流
|
||||
} catch (err) {
|
||||
uni.showToast({ title: err, icon: 'none' });
|
||||
console.error('推流启动失败:', err);
|
||||
}
|
||||
},
|
||||
|
||||
// 停止推流
|
||||
stopPush() {
|
||||
if (!this.pusher) return;
|
||||
// 停止推流 + 预览
|
||||
this.pusher.stop();
|
||||
this.pusher.stopPreview();
|
||||
// 销毁组件
|
||||
this.pusher.close();
|
||||
this.pusher = null;
|
||||
this.isPushing = false;
|
||||
uni.showToast({ title: '推流已停止', icon: 'none' });
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
<style scoped>
|
||||
.container {
|
||||
padding: 20px;
|
||||
}
|
||||
button {
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
background: #007aff;
|
||||
color: #fff;
|
||||
border-radius: 10rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
<!-- <template>
|
||||
<view>通话</view>
|
||||
<live-pusher
|
||||
url="rtmp://25.18.122.148:9605/voice_in/aa"
|
||||
:enable-camera="true"
|
||||
@statechange="statechange"
|
||||
@netstatus="netstatus"
|
||||
@error="errorFnc"
|
||||
></live-pusher>
|
||||
</template> -->
|
||||
<template>
|
||||
<div>
|
||||
<video :is-live="true" :src="videoSrc" :autoplay="true"></video>
|
||||
<live-pusher id="livePusher" ref="livePusher" class="livePusher" url="rtmp://25.18.122.148:9605/voice_in/aa" mode="SD" :muted="true" :enable-camera="false" :auto-focus="true" :beauty="1" whiteness="2" aspect="9:16" @statechange="statechange" @netstatus="netstatus" @error="error"></live-pusher>
|
||||
<text class="btn" @click="start">开始推流</text>
|
||||
<text class="btn" @click="pause">暂停推流</text>
|
||||
<text class="btn" @click="resume">resume</text>
|
||||
<text class="btn" @click="stop">停止推流</text>
|
||||
<text class="btn" @click="snapshot">快照</text>
|
||||
<text class="btn" @click="startPreview">开启摄像头预览1</text>
|
||||
<text class="btn" @click="stopPreview">关闭摄像头预览</text>
|
||||
<text class="btn" @click="switchCamera">切换摄像头</text>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
videoSrc: 'rtmp://25.18.122.148:9605/voice_out/aa'
|
||||
}
|
||||
},
|
||||
onReady() {
|
||||
// 注意:需要在onReady中 或 onLoad 延时
|
||||
this.context = uni.createLivePusherContext('livePusher', this)
|
||||
},
|
||||
methods: {
|
||||
statechange(e) {
|
||||
console.log('statechange:', e, JSON.stringify(e))
|
||||
},
|
||||
netstatus(e) {
|
||||
console.log('netstatus:' + JSON.stringify(e))
|
||||
},
|
||||
error(e) {
|
||||
console.log('error:' + JSON.stringify(e))
|
||||
},
|
||||
start: function () {
|
||||
this.context.start({
|
||||
success: a => {
|
||||
console.log('livePusher.start:' + JSON.stringify(a))
|
||||
}
|
||||
})
|
||||
},
|
||||
close: function () {
|
||||
this.context.close({
|
||||
success: a => {
|
||||
console.log('livePusher.close:' + JSON.stringify(a))
|
||||
}
|
||||
})
|
||||
},
|
||||
snapshot: function () {
|
||||
this.context.snapshot({
|
||||
success: e => {
|
||||
console.log(JSON.stringify(e))
|
||||
}
|
||||
})
|
||||
},
|
||||
resume: function () {
|
||||
this.context.resume({
|
||||
success: a => {
|
||||
console.log('livePusher.resume:' + JSON.stringify(a))
|
||||
}
|
||||
})
|
||||
},
|
||||
pause: function () {
|
||||
this.context.pause({
|
||||
success: a => {
|
||||
console.log('livePusher.pause:' + JSON.stringify(a))
|
||||
}
|
||||
})
|
||||
},
|
||||
stop: function () {
|
||||
this.context.stop({
|
||||
success: a => {
|
||||
console.log(JSON.stringify(a))
|
||||
}
|
||||
})
|
||||
},
|
||||
switchCamera: function () {
|
||||
this.context.switchCamera({
|
||||
success: a => {
|
||||
console.log('livePusher.switchCamera:' + JSON.stringify(a))
|
||||
}
|
||||
})
|
||||
},
|
||||
startPreview: function () {
|
||||
this.context.startPreview({
|
||||
success: a => {
|
||||
console.log('livePusher.startPreview:' + JSON.stringify(a))
|
||||
}
|
||||
})
|
||||
},
|
||||
stopPreview: function () {
|
||||
this.context.stopPreview({
|
||||
success: a => {
|
||||
console.log('livePusher.stopPreview:' + JSON.stringify(a))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style></style>
|
||||
+27
-34
@@ -7,7 +7,7 @@
|
||||
<view class="sparring-detail-body">
|
||||
<view class="top-box">
|
||||
<view class="top-title">
|
||||
<view class="back-icon" @click="common.navigateBack()"></view>
|
||||
<view class="back-icon" @click="goBack()"></view>
|
||||
{{ detailInfo.traName }}
|
||||
</view>
|
||||
<view class="top-desc">内容由AI生成</view>
|
||||
@@ -100,7 +100,8 @@
|
||||
import {
|
||||
onShow,
|
||||
onLoad,
|
||||
onUnload
|
||||
onUnload,
|
||||
onBackPress
|
||||
} from '@dcloudio/uni-app';
|
||||
import common from '@/common/common';
|
||||
import TouchBtn from './components/touchBtn.vue';
|
||||
@@ -226,7 +227,7 @@
|
||||
// #endif
|
||||
}
|
||||
const toTalking = () => {
|
||||
common.navigateTo('/pages/sparring/chooseRole?traId=' + traId.value + '&chaId=' + chaId)
|
||||
common.navigateTo('/pages/sparring/talk?traId=' + traId.value + '&chaId=' + chaId)
|
||||
}
|
||||
const activeVoiceTalkingItemId = ref('')
|
||||
// 关闭播放状态
|
||||
@@ -404,40 +405,31 @@
|
||||
});
|
||||
watchFlag.value += 1;
|
||||
};
|
||||
|
||||
const goBack = () => {
|
||||
if (detailInfo.value.traInterTyp === '01') {
|
||||
overTalking()
|
||||
}else{
|
||||
common.navigateBack()
|
||||
}
|
||||
}
|
||||
const overTalking = () => {
|
||||
partnerChatReportTrigger({
|
||||
execId: execId.value,
|
||||
traId: traId.value,
|
||||
talkingType: isPreview.value? 'preview' : 'practice'
|
||||
}).then(res=>{
|
||||
watchFlag.value = 1;
|
||||
socketStore?.closeSocket();
|
||||
changePlayItemId('')
|
||||
pointAndBadgesRun(talkingType.value === '01'? '07': '08', null, ()=>{
|
||||
common.navigateTo('/pages/sparring/result?isOver=1&traId=' + traId.value + '&execId=' + execId.value + '&type=' + talkingType.value + '&isPreview=' + (isPreview.value ?'1':''))
|
||||
})
|
||||
common.show('提示','确定结束陪练吗?').then(res => {
|
||||
if (res) {
|
||||
partnerChatReportTrigger({
|
||||
execId: execId.value,
|
||||
traId: traId.value,
|
||||
talkingType: isPreview.value? 'preview' : 'practice'
|
||||
}).then(res=>{
|
||||
watchFlag.value = 1;
|
||||
socketStore?.closeSocket();
|
||||
changePlayItemId('')
|
||||
pointAndBadgesRun(talkingType.value === '01'? '07': '08', null, ()=>{
|
||||
common.navigateTo('/pages/sparring/result?isOver=1&traId=' + traId.value + '&execId=' + execId.value + '&type=' + talkingType.value + '&isPreview=' + (isPreview.value ?'1':''))
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
const getPointsList = (pointsList = [], badgesList = []) => {
|
||||
pointsRef.value.open(pointsList, badgesList);
|
||||
|
||||
}
|
||||
const badgeConfirm = (status, pointsList = [], badgesList = []) => {
|
||||
badgeRef.value.close();
|
||||
overTalking()
|
||||
};
|
||||
// 积分确认
|
||||
const pointsConfirm = (status, pointsList = [], badgesList = []) => {
|
||||
pointsRef.value.close();
|
||||
if (badgesList.length > 0) {
|
||||
nextTick(() => {
|
||||
setTimeout(() => {
|
||||
badgeRef.value.open(pointsList, badgesList);
|
||||
}, 500);
|
||||
});
|
||||
}
|
||||
};
|
||||
const sendMessage = (data) => {
|
||||
unref(SocketObj).send(data);
|
||||
};
|
||||
@@ -458,6 +450,7 @@
|
||||
onMounted(() => {
|
||||
// getDetailInfo()
|
||||
})
|
||||
onBackPress((res) => res.from === 'backbutton');
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@@ -76,6 +76,7 @@
|
||||
"path": "pages/sparring/tip",
|
||||
"style": {
|
||||
"navigationBarTitleText": "AI陪练提示",
|
||||
"disableSwipeBack": true,
|
||||
"app-plus": {
|
||||
"titleNView": false
|
||||
}
|
||||
@@ -103,6 +104,7 @@
|
||||
"path": "pages/sparring/result",
|
||||
"style": {
|
||||
"navigationBarTitleText": "AI陪练报告",
|
||||
"disableSwipeBack": true,
|
||||
"app-plus": {
|
||||
"titleNView": false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user