Compare commits

..

40 Commits

Author SHA1 Message Date
Caojr
782bcc31e5 szx-1282 超时清空展示文件 2025-11-04 15:54:23 +08:00
Caojr
1a95852912 szx-1282 超时清空展示文件 2025-11-04 14:55:16 +08:00
Caojr
f5d865ccc3 szx-1282 增加超时配置 2025-11-04 13:47:02 +08:00
Caojr
65673561d8 szx-1280 编辑时长无效问题修复 2025-10-31 16:16:29 +08:00
Caojr
2cbb379fa6 样式修改 2025-10-29 18:10:07 +08:00
670788339
6d4af3aa2d 还原视频状态 调试 2025-10-24 13:29:09 +08:00
joshen
5ebee96ce4 Merge remote-tracking branch 'yx/202599-da' 2025-09-29 17:42:32 +08:00
408d6a1612 修复视频 status 状态 2025-09-29 17:26:53 +08:00
b1508ad226 更新精品课图片 2025-09-26 09:18:51 +08:00
a9764bf2f8 更新精品课图片 2025-09-26 09:15:55 +08:00
joshen
c3f53515b9 Merge branch '202599-da' 2025-09-19 18:58:47 +08:00
087be5dd38 fix: 修复分数异常展示的问题 2025-09-19 13:43:23 +08:00
joshen
1772c972b9 Merge branch '202599-da' 2025-09-18 18:51:50 +08:00
dong.ai
91bafcb5b9 调整字体展示位置 2025-09-15 17:15:47 +08:00
dong.ai
8c533c5f3a 修改字体大小 2025-09-15 17:02:45 +08:00
dong.ai
bb17784501 修改图片大小,背景图片 2025-09-15 16:32:23 +08:00
dong.ai
69530fe6ad 标题展示隐藏判断2 2025-09-15 14:01:32 +08:00
dong.ai
b1cd8e2f63 标题展示隐藏判断 2025-09-15 13:57:19 +08:00
dong.ai
7335dd4eba 首页教师名称展示 2025-09-15 13:45:35 +08:00
3860087fac feat: 增加搜索标签展示,修复样式问题,提示语修改 2025-09-15 11:36:08 +08:00
046509f70d fix: 修复课程名称展示异常的问题 2025-09-15 10:06:35 +08:00
bf0ae91184 feat: 优化调用显示方案 2025-09-15 10:06:35 +08:00
f61742a0b9 fix: 修复教师无法展示的问题 2025-09-14 22:09:03 +08:00
dong.ai
c886a80193 教师展示 2025-09-14 21:30:12 +08:00
05ad90b025 fix: 修复标签无法正常高亮的问题 2025-09-14 21:23:56 +08:00
f3833a23fa style: 优化选择年份和边距 2025-09-14 21:16:02 +08:00
d957a8d44b fix: 修复 主页图片无法正常展示的问题 2025-09-14 21:16:01 +08:00
dong.ai
89ed79828f 修复跳转详情2 2025-09-14 21:09:57 +08:00
dong.ai
b926590edc 修改跳转详情 2025-09-14 21:04:21 +08:00
19bc757dc2 fix: 修复 systype 错误的问题 2025-09-14 20:59:38 +08:00
f3a1036b64 feat: 样式修改,功能修复 2025-09-14 20:50:42 +08:00
3c1650b751 Merge branch '2025-912-hz' into 202599-da
# Conflicts:
#	src/api/phase2/index.js
2025-09-14 20:30:44 +08:00
ff2bdb4ae5 fix: 修复获取课程精品课标记时间年份列表
# Conflicts:
#	src/api/phase2/index.js
2025-09-14 20:29:53 +08:00
dong.ai
14fb53ccd3 解决冲突 2025-09-14 20:10:29 +08:00
dong.ai
72f9661150 Merge branch '202599-da' of https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/learning-system-portal into 202599-da 2025-09-14 19:43:10 +08:00
dong.ai
7806afc5f7 还原代码 2025-09-14 19:40:05 +08:00
e1af233c5f feat: 完成精品课程专区的内容 2025-09-14 19:39:41 +08:00
2738493030 fix: 修复刷新页面自动调整错误的问题 2025-09-14 19:39:08 +08:00
480a4f5564 chore: 修正路由名称拼写错误 2025-09-14 19:39:06 +08:00
dong.ai
205bf5469f 字段展示 2025-09-14 19:08:21 +08:00
10 changed files with 164 additions and 2296 deletions

BIN
public/images/qualityBg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -22,7 +22,7 @@ const pageList = function(data) {
/**
* 选择课件的查询,这里也是分页查询,只是返回的内容,字段会很少,用于课件制作那选择已有课件内容。
*
*
* @param {Object} data
* 查询参数如上面pageList方法
*/
@@ -47,7 +47,9 @@ const findList = function(data) {
}
*/
const saveUpload = function(data) {
return ajax.post('/xboe/m/course/file/upload/save', data);
return ajax.post('/xboe/m/course/file/upload/save', data, {
timeout: 60000
});
}
/**
@@ -88,4 +90,4 @@ export default {
batchUpdate,
detail,
delFile
}
}

View File

@@ -59,7 +59,7 @@ export const qualityPageList=function (data){
}
// 课程精品课标记时间年份列表
export const qualityCourseTimeMark=function (){
return httpAjax.post(baseURL,'/quality/manage/createYearList',{});
return httpAjax.post(baseURL,'/quality/manage/qualityYearList',{});
}
/**
* 首页新课程推荐列表

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -50,7 +50,7 @@
<el-input-number v-model="duration" size="mini" :min="1" :max="100"></el-input-number>
</span>
</div>
<el-upload class="upload-demo" :headers="headers" :data="data" drag :action="uploadFileUrl" :on-success="handleUploadSuccess" :before-upload="handleBeforeUpload">
<el-upload ref="uploadRef" class="upload-demo" :headers="headers" :data="data" drag :action="uploadFileUrl" :on-success="handleUploadSuccess" :before-upload="handleBeforeUpload">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">文件大小限制{{curComType.maxSizeName}},支持的文件类型{{curComType.fileTypes.join(',')}}</div>
@@ -195,6 +195,7 @@
// this.cware.content.content=result.filePath;
}else{
this.$message.error(rs.message);
this.$refs.uploadRef.clearFiles();
}
});
}else{

View File

@@ -153,28 +153,28 @@
</div>
</div>
<div class="xindex-content">
<!-- 推荐课程 -->
<div class="modules xcontent2">
<!-- <div class="xcontent2-main"> -->
<!--内容块-->
<!-- </div> -->
<!-- 精品课模块 -->
<div class="xcontent2-main">
<div class="modules-title xindex-main" v-if="this.qusisityList.list.length>0">
<div class="modules-title xindex-main" v-if="this.qusisityList.list.length > 0">
<!-- <span class="modules-text" style="color: #3D86F4;">精品课</span> -->
<span class="quyer-tag" style="margin-left: 0px;">
<!-- <img src="../assets/images/tutoring1.pn" alt=""> -->
<img class="modules-text" style="height: 24px;" src="../assets/images/course/courseTitle.png" alt="">
<img class="modules-text" style="height: 28px;" src="../assets/images/course/courseTitle.png" alt="">
</span>
<span class="more">
<router-link to="/quailtyCourse">查看更多>></router-link>
<router-link to="/qualityCourse">查看更多>></router-link>
</span>
</div>
<div
v-for="(course, eIndex) in exquisiteList"
:key="'cc' + eIndex"
@@ -212,7 +212,7 @@
</div>
<div class="course-author">
<div class="course-author-left">
{{ course.authorInfo.teacherName }}
{{ course.authorInfo.name }}
<span class="study-num"
>{{ formatNum(course.studyNum) }}人学习</span
@@ -231,9 +231,9 @@
</div>
<!--内容块-->
<div class="modules-title xindex-main" v-if="courseComputedOneList.length > 0">
<div class="modules-title xindex-main">
<span class="modules-text">推荐课程</span>
<span class="quyer-tag">
<a
@@ -1308,7 +1308,7 @@ export default {
return this.courseList.list.slice(3)
},
// 精品课展示
exquisiteList() {
exquisiteList() {
return this.qusisityList.list.slice(0,3)
},
},
@@ -1505,21 +1505,27 @@ export default {
//二期调整,直接改成一个地址
//return this.webBaseUrl + '/course/detail?id=' + item.id;
let $this = this;
let cId = "";
if (item.id) {
cId = item.id;
} else {
cId = item.courseId;
}
if (item.type == 10) {
//return this.webBaseUrl + "/course/studyindex?id=" + item.id;
//console.log("直接进入学习页面");
this.$router.push("/course/studyindex?id=" + item.id?item.id:item.courseId);
this.$router.push("/course/studyindex?id=" + cId);
} else if (item.type == 20) {
apiCourseStudy.hasSignup(item.id?item.id:item.courseId).then((rs) => {
apiCourseStudy.hasSignup(cId).then((rs) => {
if (rs.status == 200) {
//return $this.webBaseUrl + "/course/studyindex?id=" + item.id;
this.$router.push("/course/studyindex?id=" + item.id?item.id:item.courseId);
//return $this.webBaseUrl + "/course/studyindex?id=" + cId;
this.$router.push("/course/studyindex?id=" + cId);
} else {
//return $this.webBaseUrl + "/course/detail?id=" + item.id;
this.$router.push("/course/detail?id=" + item.id?item.id:item.courseId);
//return $this.webBaseUrl + "/course/detail?id=" + cId;
this.$router.push("/course/detail?id=" + cId);
}
});
//return $this.webBaseUrl + "/course/detail?id=" + item.id;
//return $this.webBaseUrl + "/course/detail?id=" + cId;
}
},
orderTypeFilter(val) {
@@ -1561,8 +1567,21 @@ export default {
let course = {
aid: this.userInfo.aid,
}
apiIndex.qualitylist(course).then((res) => {
console.log(res,'jinpinsjfhhfjash--------------------------');
apiIndex.qualitylist(course).then((res) => {
let courseIds = [];
res.data.result.forEach((item) => {
item.authorInfo = {
aid: "",
name: "",
orgInfo: "",
avatar: "",
code: "",
sex: null,
};
courseIds.push(item.courseId);
});
this.loadCouserTeacher(res.data.result, courseIds);
console.log(res.data.result,'--------------------------');
this.qusisityList.list = res.data.result;
})
},
@@ -1765,7 +1784,7 @@ export default {
let userIds = [];
list.forEach((item, index) => {
cres.result.some((courseTeahcer) => {
if (courseTeahcer.courseId == item.id) {
if (courseTeahcer.courseId == (item.id||item.courseId)) {
if (courseTeahcer.teacherIds) {
userIds.push(courseTeahcer.teacherIds[0]);
item.authorInfo.aid = courseTeahcer.teacherIds[0];
@@ -3115,6 +3134,6 @@ export default {
background: linear-gradient(135deg, #e6f7ff, #f0f8ff, #ffffff);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
border: 1px solid #d9edf7;
overflow: hidden;
//overflow: hidden;
}
</style>

View File

@@ -483,8 +483,11 @@ export default {
} else if (this.form.device2 === true) {
this.form.device = 2;
}
//时长,秒与分钟的转化
//if(this.form.)
// 时长,秒与分钟的转化
if (this.form.minute) {
this.form.duration = this.form.minute * 60;
}
try {
const { status,message} = await coueseFile.batchUpdate([this.form]);
if (status === 200) {

File diff suppressed because it is too large Load Diff

View File

@@ -28,7 +28,7 @@
<div class="course-title-style">
<div class="imgTilte">
<div>精品课程</div>
<div>COURSE</div>
<!-- <div>COURSE</div> -->
</div>
</div>
<div class="course-list">
@@ -67,31 +67,36 @@
</div>
<!-- 右侧 -->
<div class="xcontent2-main content-div">
<!-- 内容导航 -->
<div class="topNav" v-if="!newData">
<div class="search-div nav" style="height: 100px;flex: 1;">
<div @click="handleTypeClick(ctypeList[0], ctypeList)" class="option-item"
:class="{ 'option-active': ctypeList[0].checked }">
<a>全部</a>
<span :class="ctypeList[0].checked ? 'nav-bottbor' : ''"></span>
</div>
<div @click="handleTypeClick(ctypeList[1], ctypeList)" class="option-item"
:class="{ 'option-active': ctypeList[1].checked }">
<a>内部专享</a>
<span :class="ctypeList[1].checked ? 'nav-bottbor' : ''"></span>
<!-- 内容导航 -->
<div class="topNav" v-if="!newData" style="display: flex; flex-direction: row;background-color:#fff;">
<div>
<div class="search-div nav" style="height: 100px;flex: 1;">
<div @click="handleTypeClick(ctypeList[0], ctypeList)" class="option-item"
:class="{ 'option-active': ctypeList[0].checked }">
<a>全部</a>
<span :class="ctypeList[0].checked ? 'nav-bottbor' : ''"></span>
</div>
<div @click="handleTypeClick(ctypeList[1], ctypeList)" class="option-item"
:class="{ 'option-active': ctypeList[1].checked }">
<a>内部专享</a>
<span :class="ctypeList[1].checked ? 'nav-bottbor' : ''"></span>
</div>
<div @click="handleTypeClick(ctypeList[2], ctypeList)" class="option-item"
:class="{ 'option-active': ctypeList[2].checked }">
<a>外部精选</a>
<span :class="ctypeList[2].checked ? 'nav-bottbor' : ''"></span>
</div>
</div>
<div @click="handleTypeClick(ctypeList[2], ctypeList)" class="option-item"
:class="{ 'option-active': ctypeList[2].checked }">
<a>外部精选</a>
<span :class="ctypeList[2].checked ? 'nav-bottbor' : ''"></span>
</div>
<div style="display: flex;justify-content: space-between; align-items: center">
<span>请选择年份</span>
</div>
<div style="display: flex;justify-content: space-between; align-items: center;">
<span style="margin-right: 10px;" class="option-item">请选择年份 </span>
<el-select v-model="yearChosen" multiple>
<el-option
v-for="year in years"
v-if="year"
:key="year"
:label="year"
:value="year">
@@ -99,11 +104,10 @@
</el-select>
</div>
</div>
</div>
<!-- 清除 -->
<!-- <div v-if="stagList.length > 0 && !newData" class="search-div" style="padding: 0;margin-bottom: 20px;">
<div v-if="stagList.length > 0 && !newData" class="search-div" style="padding: 0;margin-bottom: 20px;">
<div class="searchbar" style="background-color:#f6f7fb;display: flex;justify-content: space-between;">
<div style="line-height: 30px;">
<span class="item-title"> 搜索条件</span>
@@ -114,20 +118,20 @@
<el-button type="primary" size="mini" @click="handleClearTags">清除</el-button>
</div>
</div>
</div> -->
</div>
<!-- 标题最新最热好评率 -->
<div class="xcourse-list" style="background-color: #fff;border-radius: 8px;padding:0 25px;">
<div class="order-div" v-if="!newData">
<span class="quyer-tag">
<el-button type="text" class="order-class" @click="orderChange('DEFAULT')"
:class="{ actice: course.orderField == 'studys' }">全部课程</el-button>
:class="{ actice: course.orderField == 'DEFAULT' }">全部课程</el-button>
<el-button type="text" class="order-class" @click="orderChange('HOT')"
:class="{ actice: course.orderField == 'studys1' }">最热</el-button>
:class="{ actice: course.orderField == 'HOT' }">最热</el-button>
<el-button type="text" class="order-class" @click="orderChange('NEW')"
:class="{ actice: course.orderField == 'publishTime' }">最新</el-button>
:class="{ actice: course.orderField == 'NEW' }">最新</el-button>
<el-button type="text" class="order-class" @click="orderChange('GOOD')"
:class="{ actice: course.orderField == 'score' }">好评率</el-button>
:class="{ actice: course.orderField == 'GOOD' }">好评率</el-button>
</span>
<span class="order-count">
共找到<span>{{ count }}</span>个结果
@@ -143,7 +147,7 @@
<span v-if="cinfo.type == 30" class="course-type-left">线下课</span>
<span v-if="cinfo.type == 40" class="course-type-left">学习项目</span>
</div>
<div class="course-title two-line-ellipsis" :title="cinfo.title" v-html="cinfo.name"></div>
<div class="course-title two-line-ellipsis" :title="cinfo.title" v-html="cinfo.courseName"></div>
<!-- 关键字 -->
<div class="keywordInfo-every">
<div class="keywordInfo" v-for="(keyword, index) in cinfo.keywordsActive" :key="index">
@@ -156,14 +160,14 @@
</el-tooltip>
</div>
</div>
<!-- {{cinfo}}-->
<div class="couresstartTime">
<span v-if="cinfo.type == 30 && cinfo.startTime">开课时间{{ cinfo.startTime }}</span>
</div>
<div class="course-info">
<div class="course-info-user" style="max-width: 100px;" v-if="cinfo.teacher">
<el-tooltip :content="cinfo.teacher" placement="bottom" effect="light">
<span class="course-info-author">{{ cinfo.teacher }}</span>
<div class="course-info-user" style="max-width: 100px;" v-if="cinfo.teacherName">
<el-tooltip :content="cinfo.teacherName.split(',')[0]" placement="bottom" effect="light">
<span class="course-info-author">{{ cinfo.teacherName.split(',')[0] }}</span>
</el-tooltip>
</div>
<div class="course-info-user">
@@ -173,7 +177,7 @@
<div style="display: flex;">
<interactBar :type="1" nodeWidth="20px" :data="cinfo" :courseExclusive="true" :comments="false"
:praises="false" :shares="false" :views="false"></interactBar>
<div v-if="Number(cinfo.hasCollect)">
<div v-if="cinfo.courseScore">
<span class="course-score-value">{{ toScore(cinfo.courseScore) }}</span>
</div>
<div v-else class="course-score-no">未评分</div>
@@ -213,7 +217,7 @@
<!-- <span class="pag-text-msg" v-else-if="moreState == 3 && courseList.length > 0">没有更多数据了</span> -->
<span class="notcoures" v-if="moreState == 3 && courseList.length == 0">
<img :src="`${webBaseUrl}/images/nocouresimg.png`" alt="">
<h5>暂无课程请优先学习其它课程吧</h5>
<h5>当前分类下暂未标记精品课</h5>
</span>
<div v-if="courseList.length > 0">
<pagination :size="course.pageSize" :total="Number(count)" :page="course.pageIndex"
@@ -273,7 +277,7 @@
</div>
</template>
<script>
import { mapGetters, mapActions } from "vuex";
import {mapActions, mapGetters} from "vuex";
import couresinteract from '@/components/Portal/course/couresinteract.vue';
import portalHeader from "@/components/PortalHeader.vue";
import portalFooter from "@/components/PortalFooter.vue";
@@ -288,11 +292,11 @@ import scene from "@/api/modules/scene.js";
import apiUserbasic from "@/api/boe/userbasic.js";
import interactBar from "@/components/Portal/interactBar.vue";
import courseImage from "@/components/Course/courseImage.vue";
import { courseType, getType, toScore, formatDate, formatUserNumber, formatDateByFmt } from "@/utils/tools.js";
import { deepClone, param } from "../../../utils";
import {formatDate, formatUserNumber, toScore} from "@/utils/tools.js";
import apiSearchterm from "@/api/modules/searchterm.js";
import apiPlace from "@/api/phase2/place.js"
import {qualityCourseTimeMark, qualityPageList} from "@/api/phase2"
export default {
name: "index",
components: {
@@ -312,6 +316,7 @@ export default {
let list = [];
},
// 取消搜索条件标签展示
stagList() { //计算出选择的内容
let list = [];
if (this.keyword) {
@@ -322,11 +327,12 @@ export default {
checked: true
})
}
this.ctypeList.forEach(item => {
if (item.checked) {
list.push(item);
}
});
// 取消 全部 内部专享 外部精选 三种的显示
// this.ctypeList.forEach(item => {
// if (item.checked) {
// list.push(item);
// }
// });
this.oneList.forEach(one => {
var twoChildChecked = false;//是否有下级
one.children.forEach(two => {
@@ -393,6 +399,8 @@ export default {
},
data() {
return {
/** 被选择的精品课程*/
courseChosen: void 0,
yearChosen: [],
years: [],
newData: false,//线上品牌系列隐藏
@@ -473,10 +481,9 @@ export default {
mounted() {
qualityCourseTimeMark().then(response=>{
console.log(`qualityCourseTimeMark`, response)
this.years = response.data.result
})
let screenWidth = window.screen.availWidth;
// let screenWidth = window.screen.availWidth;
// if (screenWidth < 1280) {
// this.course.pageSize = 9;
// this.columns = 3;
@@ -638,6 +645,7 @@ export default {
},
//搜索条件
stagClose(tag, tagIndex) {
this.courseChosen = void 0;
tag.checked = false;
if (tag.type == 0) {
this.keyword = '';
@@ -683,9 +691,10 @@ export default {
handleClearTags() {
//清空所有的条件
this.keyword = '';
this.ctypeList.forEach(item => {
item.checked = false;
});
// 取消搜索条件标签展示
// this.ctypeList.forEach(item => {
// item.checked = false;
// });
this.oneList.forEach(one => {
one.checked = false;
one.children.forEach(two => {
@@ -695,6 +704,8 @@ export default {
})
})
});
// 清除左侧被选中的内容
this.courseChosen = void 0;
this.twoList = [];
this.threeList = [];
this.navTitle = [];
@@ -716,7 +727,8 @@ export default {
handleOptionClick(item, level, list) {
// 线上品牌展示效果
this.newData = item.newData;
console.log(this.newData);
this.courseChosen = item.id
console.log(item, "---------");
// 单选,排除法
this.oneList.forEach(one => {
one.checked = false;
@@ -914,7 +926,6 @@ export default {
// 头部
emitInput(val) {
this.keyword = val;
//this.stagList;
this.searchData();
},
@@ -1176,14 +1187,18 @@ export default {
// 请求参数预处理
const params = JSON.parse(JSON.stringify(this.course))
// 清除多余的参数
const {pageIndex, orderField} = params
const {pageIndex, orderField, userId} = params
params.pageNum = pageIndex
params.orderByType = orderField
params.courseSource = this.ctypeList.findIndex(e=>e.checked)
params.courseSource = this.ctypeList.findIndex(e => e.checked)
this.yearChosen.length && (params.years = this.yearChosen)
params.courseName = this.keyword
delete params.userId
params.aid = userId
params.sysType = this.courseChosen
await qualityPageList(params).then(res=>{
console.log(`params`, params)
await qualityPageList(params).then(res => {
this.searching = false;
console.log(res.status)
if (res.status === 200) {
@@ -1216,7 +1231,18 @@ export default {
// }
// });
this.courseList = res.data.result.records ?? []
const list = res.data.result.records ?? []
// list.forEach(course=>{
// const id = course.courseId
//
// apiCourse.getTeacherByCourseIDs([id]).then(res=>{
// console.log(res, "ids res")
// course.teacher = res.result[0].names[0]
// console.log(`course.teacher`, course.teacher)
// })
// })
this.courseList = list
if (this.newData) {
this.courseList = [
{
@@ -1269,6 +1295,7 @@ export default {
} else {
this.moreState = 2;
}
})
.catch(err => {
this.moreState = 2;
@@ -1406,7 +1433,7 @@ export default {
.course-title-style {
position: relative;
height: 100px;
background-image: url('../../../../public/images/courseBg.png');
background-image: url('../../../../public/images/qualityBg.png');
background-repeat: no-repeat;
background-size: 100% 100%;
display: flex;
@@ -1414,19 +1441,20 @@ export default {
.imgTilte {
& div:first-child {
padding-left: 40px;
font-size: 30px;
div {
padding-left: 20px;
font-size: 50px;
color: #FFFFFF;
font-weight: 500;
}
& div:last-child {
padding-left: 40px;
font-size: 20px;
color: #FFFFFF;
opacity: .5;
font-family: ArialMT !important;
}
// & div:last-child {
// padding-left: 40px;
// font-size: 20px;
// color: #FFFFFF;
// opacity: .5;
// font-family: ArialMT !important;
// }
}
}
@@ -2085,13 +2113,13 @@ export default {
.search-div {
background: #fff;
padding: 10px 25px;
padding: 10px 15px;
border-radius: 8px;
::v-deep .el-input {
width: 420px;
height: 38px;
margin-bottom: 13px;
//margin-bottom: 13px;
.el-input__inner {
height: 38px;

View File

@@ -480,6 +480,7 @@
defaultMaxTime:1800, //非音频默认最大时间
warn:"测试内容",
warnTitle:"测试标题",
isFinishingStudyItem: false, // 防止重复调用完成状态更新接口
}
},
mounted() {
@@ -1684,12 +1685,17 @@
//这种可能没有不过这里也是为了万中那个1
!this.tentative && this.saveStudyInfo();
} else {
// 如果正在处理完成请求,则直接返回,避免重复调用
if (this.isFinishingStudyItem) {
return;
}
let params = {
itemId: this.contentData.studyItemId,
studyId: this.studyId,
courseId: this.courseId,
cnum: this.totalContent
}
this.isFinishingStudyItem = true; // 设置标志位
apiVideoStudy.finishStudyItem(params).then(res => {
if (res.status == 200) {
this.contentData.status = 9;
@@ -1697,6 +1703,10 @@
} else {
console.log("记录完成学习失败:" + res.message + "" + res.error);
}
this.isFinishingStudyItem = false; // 重置标志位
}).catch(error => {
console.error("记录完成学习出错:", error);
this.isFinishingStudyItem = false; // 出错时也重置标志位
});
}
},
@@ -1960,16 +1970,19 @@
}
.player-box {
position: relative;
position: absolute;
width: 100%;
max-width: 300px;
margin: 20px auto;
height: 187px;
background: rgba(74, 74, 74, .5);
background: rgba(74, 74, 74, .8);
border-radius: 33px;
text-align: center;
padding: 20px;
top: 50%;
box-sizing: border-box;
left: 50%;
transform: translate(-50%, -50%);
.player-praise {
margin-top: 25px;