Merge branch 'dev-20250930' of http://25.13.9.101:9000/K17_AITS/tra-app into dev-20250930

This commit is contained in:
杨航
2025-08-22 17:44:57 +08:00
15 changed files with 251 additions and 110 deletions
@@ -40,6 +40,7 @@
if (props.analysisVo.correctFlag === 'R') return 'success';
// 是错误答案但是被用户错误选中的为红
const my_answer_array = props.my_answer;
console.log('my_answer_array', my_answer_array);
if(my_answer_array.includes(props.analysisVo.itemId) && props.analysisVo.correctFlag === 'E') return 'error';
// 只有被我选中,不知是正确还是错误的为蓝
+4 -1
View File
@@ -109,7 +109,10 @@
get: () => props.modelValue,
set: (val) => emit('update:modelValue', val)
});
let answerText = props.item?.my_answer;
// result.anserResult
let answerText = props.item?.my_answer || props.item.anserResult || [];
console.log('answerText', props.item.anserResult);
const item_answer = ref(typeof answerText === 'string' ? answerText.split(',') : []);
const feedback_click = () => {
emit('subject_click', 'feedback', props.item);
+4 -1
View File
@@ -114,11 +114,14 @@
const popupRef = ref(null);
const inputText = ref('');
let startTime = 0;
// not_started 未开始, preparing 准备中, in_recording 录音中,ending 结束中
const recordingStatus = ref('not_started');
// 获取全局唯一的录音管理器 recorderManager
// #ifdef APP-PLUS
const recorderManager = uni.getRecorderManager();
// #endif
// const innerAudioContext = uni.createInnerAudioContext();
const startTimer = ref(null); // 延迟启动的定时器ID
const startFlag = ref(1);
+1 -3
View File
@@ -103,7 +103,7 @@
<text class="rank-other-last-sty rank-uni-sty">{{tableLastName}}</text>
</template>
</uni-list-item>
<uni-list-item :key="index" v-if="chartsList.length < 4">
<uni-list-item v-if="chartsList.length < 4">
<template v-slot:header>
<text style="width:100%;text-align: center;color: #999999;">暂无数据</text>
</template>
@@ -330,8 +330,6 @@
allChartsList.value = learnTimeList.value;
chartsList.value = allChartsList.value.annual?allChartsList.value.annual.list:[];
myselfObj.value = allChartsList.value.annual?allChartsList.value.annual.self:{};
chartsList.value[0].dept = "吉林银行吉林分行"
myselfObj.value.dept = "吉林银行吉林分行"
console.log(chartsList.value,'chartsList.value')
console.log(myselfObj.value,myselfObj.value,'myselfObj.value')
chartsList.value.forEach(item => item.score = item.annlStdyTmLen);
@@ -98,7 +98,7 @@
flex-wrap: wrap;
}
.label-item {
text-align: center;
text-align: left;
border-radius: 22rpx;
padding: 2rpx 14rpx;
font-size: 22rpx;
+4 -7
View File
@@ -1,7 +1,7 @@
<template>
<view class="max_page">
<nav-bar :is_seat="false" :backgroundColor="bgOpacity"></nav-bar>
<scroll-view :scroll-y="true" class="scroll detail-main" @scroll="scroll_fun" @scrolltolower="scrolltolower">
<scroll-view :scroll-y="true" class="scroll detail-main" @scroll="scroll_fun" @scrolltolower="scrolltolower" :show-scrollbar="false">
<view class="bg_div">
<image-preview class="img_100" :imgId="form.imgId" mode="widthFix"></image-preview>
</view>
@@ -276,7 +276,6 @@
.detail-main {
background-color: #f5f5f5;
position: relative;
height: 100%;
overflow: hidden;
}
@@ -285,8 +284,6 @@
}
.detail-body {
box-sizing: border-box;
// min-height: calc(100vh - 256rpx);
position: absolute;
top: 256rpx;
border-radius: 23rpx 23rpx 0rpx 0rpx;
@@ -303,10 +300,8 @@
.bg_div {
position: fixed;
width: 100%;
width: calc(100% + 4rpx);
left: -4rpx;
.back-image {
width: 100%;
}
@@ -321,7 +316,9 @@
padding-top: 36rpx;
padding-left: 42rpx;
padding-bottom: 24rpx;
}
min-height: 158rpx;
justify-content: space-between;
}
.title-text {
font-size: 34rpx;
+90 -52
View File
@@ -1,6 +1,6 @@
<template>
<view class="max_page detail-main">
<nav-bar :is_seat="false"></nav-bar>
<!-- <nav-bar :is_seat="false"></nav-bar> -->
<view class="fixed_search_div">
<view class="back_div" @click="common.navigateBack()">
<view class="back-icon"></view>
@@ -24,20 +24,43 @@
<view class="num-box">
<view class="font_pf fz-28 c-666">综合评分(1-10)</view>
<view class="slider-box">
<slider :min="0" :max="10" :value="10" @change="sliderChange" :step="0.1" :show-value="true"
:blockSize="14"></slider>
<slider
:min="0"
:max="10"
:value="10"
@change="sliderChange"
:step="0.1"
:show-value="true"
:blockSize="14"
></slider>
</view>
</view>
</view>
<view class="tab">
<view class="tab-btn" :class="{'is-active':formData.bbsTag=='SUG'}" @click="formData.bbsTag='SUG'">
建议</view>
<view class="tab-btn" :class="{'is-active':formData.bbsTag=='ASK'}" @click="formData.bbsTag='ASK'">
提问</view>
<view
class="tab-btn"
:class="{ 'is-active': formData.bbsTag == 'SUG' }"
@click="formData.bbsTag = 'SUG'"
>
建议
</view>
<view
class="tab-btn"
:class="{ 'is-active': formData.bbsTag == 'ASK' }"
@click="formData.bbsTag = 'ASK'"
>
提问
</view>
</view>
<view class="input-textarea">
<uv-textarea v-model="formData.bbsContent" height="124" count :maxlength="100"
:placeholder="formData.bbsTag == 'SUG'?'请输入你的建议...':'请输入你的问题...'"></uv-textarea>
<uv-textarea
v-model="formData.bbsContent"
height="124"
count
:maxlength="100"
:adjustPosition="false"
:placeholder="formData.bbsTag == 'SUG' ? '请输入你的建议...' : '请输入你的问题...'"
></uv-textarea>
</view>
</view>
</view>
@@ -48,49 +71,55 @@
</template>
<script setup>
import {
reactive,
ref
} from 'vue';
import { reactive, ref, nextTick } from 'vue';
import {
onLoad
} from '@dcloudio/uni-app';
import {
publishCrsEvaluation
} from '@/api/courseDetail.js';
import { onLoad } from '@dcloudio/uni-app';
import { publishCrsEvaluation } from '@/api/courseDetail.js';
import common from '@/common/common';
const formData = reactive({
"crsId": null,
"imgIdList": [], // 发表图片ID列表,文件ID集
"bbsGrade": 10, // 综合评分(最高10分)
"bbsTag": 'SUG', // 评价标签 (SUG 建议 ASK 提问 )
"bbsContent": '', // 评价内容
})
const imgId = ref('')
const from = ref('')
crsId: null,
imgIdList: [], // 发表图片ID列表,文件ID集
bbsGrade: 10, // 综合评分(最高10分)
bbsTag: 'SUG', // 评价标签 (SUG 建议 ASK 提问 )
bbsContent: '' // 评价内容
});
const imgId = ref('');
const from = ref('');
const sliderChange = (event) => {
formData.bbsGrade = event.detail.value
}
formData.bbsGrade = event.detail.value;
};
const submit = () => {
if (formData.bbsContent === '') {
if (formData.bbsTag == 'SUG') {
return common.msg('请输入你的建议')
return common.msg('请输入你的建议');
} else {
return common.msg('请输入你的问题')
return common.msg('请输入你的问题');
}
}
publishCrsEvaluation(formData).then(res => {
common.msg('发表成功')
const loadingStartTime = Date.now();
common.loading('评价中');
publishCrsEvaluation(formData).then((res) => {
const loadingDuration = Date.now() - loadingStartTime;
const minLoadingTime = 700;
console.log(loadingStartTime, loadingDuration);
const delayTime = Math.max(0, minLoadingTime - loadingDuration);
console.log('delayTime', delayTime);
setTimeout(() => {
uni.$emit('refresh_comment_data')
if (from.value === 'study') {} else {}
common.navigateBack()
}, 500)
})
}
common.hideLoading();
nextTick(() => common.msg('发表成功'));
setTimeout(() => {
uni.$emit('refresh_comment_data');
if (from.value === 'study') {
} else {
}
common.navigateBack();
}, 500);
}, delayTime);
});
};
onLoad((params) => {
formData.crsId = params.crsId;
from.value = params.from;
@@ -101,15 +130,21 @@
<style lang="scss" scoped>
.detail-main {
background-color: #f6f8ff;
overflow: hidden;
display: flex;
flex-direction: column;
}
.detail-body {
flex: 1;
box-sizing: border-box;
min-height: calc(100vh - (var(--status-bar-height) + 50rpx));
padding: 29rpx 37rpx;
// min-height: calc(100vh - (var(--status-bar-height) + 50rpx));
padding: 0 37rpx 29rpx 37rpx;
margin-bottom: 152rpx;
width: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
}
.title {
@@ -125,12 +160,9 @@
background-color: #ffffff;
border-radius: 15rpx;
padding: 36rpx;
overflow: auto;
}
.tips {
color: #666666;
font-size: 24rpx;
@@ -183,7 +215,7 @@
}
:deep(.uni-slider-value) {
color: #0066FF;
color: #0066ff;
font-size: 15px;
margin-left: 1em;
font-weight: 600;
@@ -226,6 +258,16 @@
padding-bottom: 30rpx;
justify-content: space-evenly;
position: fixed;
bottom: 0;
width: 100%;
display: flex;
padding-top: 37rpx;
justify-content: space-around;
background-color: #ffffff;
border-top: 2rpx solid #e5e5e5;
z-index: 1000;
:deep(.uv-button) {
border-radius: 14rpx;
width: 616rpx;
@@ -243,15 +285,11 @@
}
.fixed_search_div {
padding: calc(10rpx + var(--status-bar-height)) 15rpx 24rpx 30rpx;
padding: calc(var(--status-bar-height)) 15rpx 14rpx 30rpx;
display: flex;
align-items: center;
.back_div {
// margin-right: 10rpx;
padding: 15rpx;
// background-color: red;
.back-icon {
position: relative;
width: 40rpx;
@@ -277,4 +315,4 @@
}
}
}
</style>
</style>
+10 -1
View File
@@ -41,7 +41,13 @@
<view class="content">
<view class="expose_shadow"></view>
<scroll-view :scroll-y="true" class="scroll-Y" :show-scrollbar="false" :refresher-threshold="0">
<Subject :item="item" :mode="mode" @subject_click="subject_click" :clearResult="true" v-model="item.my_answer"></Subject>
<Subject
:item="item"
:mode="mode"
@subject_click="subject_click"
:clearResult="true"
v-model="item.my_answer"
></Subject>
<!-- <CharactersSubject :item="item" v-if="item.qnsTyp === 'ES'" :mode="mode"
:activeVoiceId="activeVoiceId" :voicePathValue="voicePathValue"
@subject_click="subject_click">
@@ -269,6 +275,8 @@
my_answer: []
}))
);
// #ifdef APP-PLUS
// 安全区域底部到屏幕底部的高度(即底部安全区域高度)
const safeAreaBottomHeight = systemInfo.screenHeight - systemInfo.safeArea.bottom;
uni.onKeyboardHeightChange((res) => {
@@ -280,6 +288,7 @@
popup_input_bottom.value = `${keyboardHeight}px`;
console.log('端补偿安全区域高度', popup_input_bottom.value);
});
// #endif
});
const result_click = ({ key }) => {
@@ -3,8 +3,8 @@
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower" :show-scrollbar="false">
<uv-swipe-action :autoClose="true">
<uv-swipe-action-item class="item-swipe-action" :options="options" :threshold="40" :index="index"
:name="index" v-for="(item,index) in data_list" @click="swipeActionClick">
<view class="item" @touchmove.stop>
:name="index" v-for="(item,index) in data_list" @click="swipeActionClick" >
<view class="item" @touchmove.stop @click="click_item(item)">
<view class="img_div">
<image-preview class="img" :src="item?.ossAddr" mode="scaleToFill"></image-preview>
<view class="subscript">
@@ -91,6 +91,10 @@
})
}, 200)
}
// 进入课程详情页
const click_item = (item) => {
common.navigateTo('/pages/courseDetail/index?crsId=' + item.crsId)
};
const swipeActionClick = (click_item) => {
const index = click_item['name']
const item = data_list[index]
@@ -1,18 +1,11 @@
<template>
<view class="scroll_div">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower">
<view class="item" :class="getStatusClass(index)" v-for="(item,index) in data_list">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower" :show-scrollbar="false">
<view class="item" :class="getStatusClass(index)" v-for="(item,index) in data_list" @click="click_item(item)" >
<view class="img_div">
<image-preview class="img" :src="item?.ossAddr" mode="scaleToFill"></image-preview>
<view class="subscript" v-if="index % 3==0">
进行中
</view>
<view class="subscript" v-if="index % 3==1">
已完成
</view>
<view class="subscript" v-if="index % 3==2">
已超时
</view>
<view class="subscript" v-if="item.isFinish === '00'">未完成</view>
<view class="subscript" v-if="item.isFinish === '01'">已完成</view>
</view>
<view class="right_div">
<view class="title ellipsis-text">
@@ -83,6 +76,20 @@
})
}, 200)
}
// 跳转到详情
const click_item = (item) => {
// tudo
// if(item.isTimeOut === '00') {
// common.msg('任务已结束')
// return ;
// }
// setPageCache('learning_tasks_details', item);
// common.navigateTo('/pages/learningTasks/details');
};
const getStatusClass = (index) => {
const remainder = index % 3;
if (remainder === 0) return 'in_progress';
+1 -1
View File
@@ -89,7 +89,7 @@
<view class="title">AI问答</view>
</view>
<view class="item" @click="common.navigateTo('/pages/learningTasks/details')">
<view class="item">
<image class="icon" src="@/static/images/index/navigation_ai.png"></image>
<view class="title">AI陪练</view>
</view>
@@ -1,7 +1,12 @@
<template>
<view class="scroll_div">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower" :show-scrollbar="false">
<view class="item" :class="getStatusClass(item.isFinish)" v-for="(item, index) in data_list" @click="click_item(item)">
<view
class="item"
:class="getStatusClass(item.isFinish)"
v-for="(item, index) in data_list"
@click="click_item(item)"
>
<view class="img_div">
<image-preview class="img" :src="item.ossAddr" mode="scaleToFill"></image-preview>
<view class="subscript" v-if="item.isFinish === '00'">未完成</view>
@@ -38,9 +43,7 @@
const total = ref(-1);
const page = ref(0);
const data_list = reactive([]);
import {
setPageCache
} from '@/common/common';
import { setPageCache } from '@/common/common';
import common from '@/common/common';
import { ref, reactive, onMounted, nextTick } from 'vue';
@@ -83,7 +86,6 @@
} else {
status.value = 'loadmore';
}
console.log(status.value, '阿斯顿撒');
});
}, 200);
};
@@ -93,12 +95,16 @@
if (isFinish === '01') return 'completed';
return 'expired';
};
// 跳转到详情
const click_item = (item) => {
setPageCache('learning_tasks_details', item)
if(item.isTimeOut === '00') {
common.msg('任务已结束')
return ;
}
setPageCache('learning_tasks_details', item);
common.navigateTo('/pages/learningTasks/details');
}
};
const scrolltolower = (item) => {
getData();
};
@@ -223,7 +229,6 @@
flex-wrap: nowrap;
height: 23rpx;
overflow: hidden;
}
.people_progress_div {
+95 -19
View File
@@ -7,7 +7,7 @@
</view>
<view>任务详情</view>
</view>
<view class="detail_div" :class="'completed'">
<view class="detail_div">
<view class="left">
<image src="/src/static/images/test/2.png" mode="aspectFill" class="img"></image>
</view>
@@ -62,10 +62,11 @@
:show-scrollbar="false"
@scrolltolower="scrolltolower"
>
<view class="item" v-for="item in data_list" @click="item_click(item)">
<view class="item" v-for="item in data_list" @click="item_click(item)" :class="getStatusClass(item.status)">
<view class="progress_div">
<view class="circle_div"></view>
<view class="line_div"></view>
<view class="plug"></view>
</view>
<view class="content_div">
<view class="status_div">
@@ -78,17 +79,21 @@
{{ item.crsName }}
</view>
<view class="button_div">
<template v-if="item.isFinishStudy === '01' && item.isFinishExam === '01'">
<template v-if="item.isFinishStudy === '01' && item.isFinishExam === '01' && item.status !== '02'">
<image class="img" :src="lockIcon('#999999')"></image>
<view class="button_text">暂无通过条件可自动解锁</view>
<view class="button_text error">暂无通过条件可自动解锁</view>
</template>
<template v-if="item.isFinishStudy === '01' && item.isFinishExam === '01' && item.status === '02'">
<image class="img" :src="lockIcon('#0066FF')"></image>
<view class="button_text success">已自动解锁</view>
</template>
<template v-if="item.isFinishStudy !== '01'">
<image class="img" :src="passTheExamIcon('#0066FF')"></image>
<view class="button_text">完成练习</view>
<image class="img" :src="passTheExamIcon(item.isFinishStudy==='02'?'#0066FF':'#999999')"></image>
<view class="button_text" :class="item.isFinishStudy==='02'?'success':'error'">完成练习</view>
</template>
<template v-if="item.isFinishExam !== '01'">
<image class="img" :src="completeTheExercisesIcon('#0066FF')"></image>
<view class="button_text">通过考试</view>
<image class="img" :src="completeTheExercisesIcon(item.isFinishExam==='02'?'#0066FF':'#999999')"></image>
<view class="button_text" :class="item.isFinishExam==='02'?'success':'error'">通过考试</view>
</template>
</view>
</view>
@@ -127,7 +132,12 @@
const total = ref(-1);
const status = ref('loading'); // loadmore - 加载前,loading - 加载中,nomore - 没有数据
const data_list = reactive([]);
const getStatusClass = (isFinish) => {
// 00进行中、01已完成、02已超时
if (isFinish === '01') return 'unfinished';
if (isFinish === '02') return 'completed';
return 'not_unlocked';
};
const getData = () => {
status.value = 'loading';
@@ -149,7 +159,13 @@
};
const scrolltolower = () => {};
const item_click = (item) => {};
const item_click = (item) => {
if (item.status === '03') {
common.msg('任务未解锁');
return;
}
common.navigateTo('/pages/courseDetail/index?crsId=' + item.crsId);
};
const collect_click = async (collectId) => {
console.log('学习', collectId);
try {
@@ -189,29 +205,83 @@
<style scoped lang="scss">
$bg-margin-left: 30rpx;
.scroll-Y .item {
margin: 0 $bg-margin-left 0 $bg-margin-left;
display: flex;
justify-content: space-between;
// 已完成
&.completed {
.circle_div {
border: 4rpx solid #bdc7e6;
background-color: #bdc7e6;
}
.line_div {
border-left: 4rpx solid #e1e8f0;
}
.status_div {
color: #adb4c3;
background-color: #F3F5F5;
}
.plug{
border-top: 4rpx solid #e1e8f0;
}
}
//未完成
&.unfinished {
.circle_div {
border: 4rpx solid #0066FF;
// background-color: #bdc7e6;
}
.line_div {
border-left: 4rpx solid #0066FF;
}
.status_div {
color: #FFFFFF;
background-color: #4C93FF;
}
.plug{
border-top: 4rpx solid #0066FF;
}
}
// 未解锁
&.not_unlocked {
.circle_div {
border: 4rpx solid #ADB4C3;
}
.line_div {
border-left: 4rpx dashed #ADB4C3;
}
.status_div {
color: #6C9CE4;
background-color: #EFF6FF;
}
.plug{
border-top: 4rpx solid #ADB4C3;
}
}
// 最后一项
&:last-child .plug{
width: 80%;
height: 40rpx;
margin-top: -6rpx;
}
.progress_div {
width: 30rpx;
display: flex;
align-items: center;
flex-direction: column;
.circle_div {
width: 20rpx;
height: 20rpx;
border-radius: 100%;
border: 4rpx solid #0066ff;
background-color: #0066ff;
}
.line_div {
flex: 1;
height: calc(100% - 20rpx);
width: 4rpx;
// border-left: 3rpx solid #0066FF;
// border-left: 4rpx dashed gold;
border-left: 4rpx dashed #0066ff;
margin: 6rpx 0;
}
}
@@ -229,8 +299,6 @@
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 30rpx;
color: #ffffff;
background-color: #4c93ff;
writing-mode: vertical-rl;
border-radius: 12rpx;
display: flex;
@@ -270,10 +338,18 @@
.button_text {
font-weight: 400;
font-size: 24rpx;
color: #0066ff;
text-align: left;
margin-right: 50rpx;
&.success{
color: #0066FF;
}
&.error{
color: #999999;
}
}
}
}
}
@@ -1,6 +1,6 @@
<template>
<view class="scroll_div">
<scroll-view class="scroll-Y" @scrolltolower="scrolltolower">
<scroll-view class="scroll-Y" @scrolltolower="scrolltolower" :show-scrollbar="false">
<view class="item">
<image src="/src/static/images/common/default_img_2.png" mode="aspectFit"></image>
</view>
@@ -1,6 +1,6 @@
<template>
<view class="scroll_div">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower">
<scroll-view scroll-y="true" class="scroll-Y" @scrolltolower="scrolltolower" :show-scrollbar="false">
<view class="item" v-for="item in data_list">
<view class="img_div">
<image class="img" src="@/static/images/test/4.png" mode="scaleToFill"></image>