提交 76e6d010 authored 作者: 王鹏飞's avatar 王鹏飞

移除无用代码和文件

上级 adbc24de
......@@ -104,13 +104,9 @@ export default {
// 章节列表
chapters() {
const chapters = this.detail.chapters || []
// if (!chapters.length) {
// return []
// }
const customeChapter = {
name: this.$t('viewerMain.workData'),
children: [
// { name: this.$t('viewerMain.courseWork'), id: 'course_work', type: 99 },
{ name: this.$t('viewerMain.courseData'), id: 'course_info', type: 100 },
{ name: this.$t('viewerMain.teachingEvaluation'), id: 'teach_evaluation', type: 102 }
]
......
......@@ -128,15 +128,6 @@ export default {
},
beforeMount() {
this.getDetail()
},
mounted() {
// this.VueEvent.$off('command-tablelist-x').$on('command-tablelist-x', data => {
// if (data.command.command === 're-start') {
// const _data = data.tableData[data.index - 1]
// window.localStorage.setItem('rebuild', JSON.stringify(_data))
// this.$router.push({ path: '/app/grade/rebuild' })
// }
// })
}
}
</script>
......
<template>
<li class="course-list-item">
<div class="course-list-item-pic" @click="handleClick">
<img :src="data.src" v-if="data.src" />
<div class="no-img" v-else><i class="el-icon-self-13"></i></div>
</div>
<div class="course-list-item-main">
<div class="title" @click="handleClick">{{ data.title }}</div>
<div class="tags">
<template v-for="(item1, index) in data.arrTab">
<span v-bind:key="index">{{ item1 }}</span>
</template>
</div>
<div class="time">
{{ data.status }}<em>{{ data.time }}</em>
</div>
<div class="progress">
{{ $t('pages.learn.course.progress') }}
<el-progress :percentage="data.progress" color="#b49441"></el-progress>
</div>
</div>
<div class="course-list-item-aside">
<p>{{ data.myStatus }}</p>
<el-button type="primary" size="small" round @click="handleClick">
{{ $t('pages.learn.course.showCourse') }}
</el-button>
</div>
</li>
</template>
<script>
export default {
name: 'CourseListItem',
props: {
data: { type: Object, required: true },
showProgress: { type: Boolean, default: true }
},
data() {
return {}
},
methods: {
handleClick() {
this.$router.push({ path: `/app/learn/course-detail/${this.data.sid}/${this.data.id}` })
}
}
}
</script>
<style lang="scss">
.course-list-item {
display: flex;
padding: 0.2rem 0;
list-style: none;
}
.course-list-item + .course-list-item {
border-top: 1px solid #dcdcdc;
}
.course-list-item-pic {
position: relative;
width: 1.8rem;
height: 1rem;
cursor: pointer;
.no-img {
width: 100%;
height: 1rem;
text-align: center;
line-height: 1.1rem;
border: 1px solid #e2e2e2;
i {
font-size: 0.4rem;
color: #e2e2e2;
}
}
img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
}
.course-list-item-main {
flex: 1;
position: relative;
padding-left: 0.2rem;
.title {
width: 80%;
line-height: 1.5;
font-weight: 700;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
}
.tags {
margin: 0.05rem 0;
font-size: 0.14rem;
span {
padding: 0 0.1rem;
margin: 0;
border-right: 1px solid #313131;
&:first-child {
padding-left: 0;
}
&:last-child {
border: none;
}
}
}
.time {
font-size: 0.12rem;
em {
font-style: normal;
color: #898989;
}
}
.progress {
margin-top: 0.05rem;
font-size: 14px;
.el-progress {
width: 50%;
display: inline-block;
vertical-align: text-bottom;
}
}
}
.course-list-item-aside {
display: flex;
flex-direction: column;
justify-content: space-between;
p {
padding: 0 0.1rem;
font-size: 0.14rem;
text-align: right;
}
}
</style>
<template>
<div class="detail">
<div class="detail-rich">
<div class="h1">一、最终成绩计算</div>
<div class="p">
<template v-for="(item, index) in checkList">
<span :key="index">{{ index ? '+' : '' }}{{ item.name }}得分*{{ item.percent }}%</span>
</template>
= 该门课程总得分,满分100分,低于{{ data.course_check_pass_score }}分为不及格,需重修此门课程。
</div>
<v-chart class="chart" :option="option" :autoresize="true" />
</div>
<div class="detail-rich">
<div class="h1">二、具体细则</div>
<template v-for="(item, index) in checkList">
<div :key="index">
<div class="h2">{{ `${item.name} 总分${item.score}分(占科目总成绩的${item.percent}%)` }}</div>
<template v-if="item.key === 'video'">
<div class="p">课程视频观看完成度:以后台数据统计为准,全部看完视频满分100分。</div>
<div class="em">
注:视频观看考核的是实际播放时长,不是进度条的显示状态,进度条满格并不一定表示观看完这个视频。以下方每日学习时长为准。
</div>
</template>
<template v-if="item.key === 'week_report'">
<div class="p">报告作业总分{{ item.score }}分,报告得分以老师批改的分数为准。</div>
<div class="p">课程反馈建设性问题老师可酌情加分,每周的课程提问加分以老师批改的分数为准。</div>
</template>
<div class="p" v-if="item.key === 'week_test'">
本课程所有测试的平均正确率*{{ item.score }}*占总成绩{{ item.percent }}%=此项得分
</div>
<div class="p" v-if="item.key === 'essay'">结业大作业满分为{{ item.score }}分,以老师批改的分数为准。</div>
<div class="p" v-if="item.key === 'attendance'">
互动课出勤满分{{ item.score }}分,以老师每次导出的参会记录进行打分。
</div>
<div class="p" v-if="item.key === 'question'">
课程提问满分{{ item.score }}分, 老师根据提问情况酌情给分。
</div>
</div>
</template>
</div>
</div>
</template>
<script>
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { PieChart } from 'echarts/charts'
import { TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components'
import VChart from 'vue-echarts'
use([CanvasRenderer, PieChart, TitleComponent, TooltipComponent, LegendComponent])
export default {
props: { data: { type: Object, default: () => {} } },
components: { VChart },
data() {
return {}
},
computed: {
checkList() {
return this.data.course_check.filter(item => parseInt(item.percent))
},
option() {
const data = this.checkList.map(item => {
return { name: item.name, value: item.percent }
})
return {
tooltip: { trigger: 'item', formatter: '{a} <br/>{b} 占比{c}%' },
series: [{ name: '课程考核', type: 'pie', data }]
}
}
}
}
</script>
<style scoped>
.chart {
height: 300px;
}
</style>
<template>
<div class="detail">
<div class="detail-rich">
<div class="h1">一、最终成绩计算</div>
<div class="p">美方课程最终成绩请参考每学期初教务邮箱老师发到大家邮箱中的课程考核大纲进行计算。</div>
<v-chart class="chart" :option="option" :autoresize="true" />
</div>
<div class="detail-rich">
<div class="h1">二、具体细则</div>
<template v-for="(item, index) in checkList">
<div :key="index">
<div class="h2">{{ `${item.name} 总分${item.score}分(占科目总成绩的${item.percent}%)` }}</div>
<template v-if="item.key === 'video'">
<div class="p">
课程视频观看完成度:以后台数据统计为准,全部看完视频满分100分。(实际视频观看分数以课程考核大纲为准)
</div>
<div class="em">
注:视频观看考核的是实际播放时长,不是进度条的显示状态,进度条满格并不一定表示观看完这个视频。以下方每日学习时长为准。
</div>
</template>
<template v-if="item.key === 'week_report'">
<div class="p">报告作业总分{{ item.score }}分,报告得分以老师批改的分数为准。</div>
<div class="p">课程反馈建设性问题老师可酌情加分,每周的课程提问加分以老师批改的分数为准。</div>
</template>
<div class="p" v-if="item.key === 'week_test'">
本课程所有测试的平均正确率*{{ item.score }}*占总成绩{{ item.percent }}%=此项得分。
(实际章节测试占比以课程考核大纲为准)。
</div>
<div class="p" v-if="item.key === 'essay'">结业大作业满分为{{ item.score }}分,以老师批改的分数为准。</div>
<div class="p" v-if="item.key === 'attendance'">
互动课出勤满分{{ item.score }}分,以老师每次导出的参会记录进行打分。
</div>
<div class="p" v-if="item.key === 'question'">
课程提问满分{{ item.score }}分, 老师根据提问情况酌情给分。
</div>
</div>
</template>
</div>
</div>
</template>
<script>
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { PieChart } from 'echarts/charts'
import { TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components'
import VChart from 'vue-echarts'
use([CanvasRenderer, PieChart, TitleComponent, TooltipComponent, LegendComponent])
export default {
props: { data: { type: Object, default: () => {} } },
components: { VChart },
data() {
return {}
},
computed: {
checkList() {
return this.data.course_check.filter(item => parseInt(item.percent))
},
option() {
const data = this.checkList.map(item => {
return { name: item.name, value: item.percent }
})
return {
tooltip: { trigger: 'item', formatter: '{a} <br/>{b} 占比{c}%' },
series: [{ name: '课程考核', type: 'pie', data }]
}
}
}
}
</script>
<style scoped>
.chart {
height: 300px;
}
</style>
......@@ -56,7 +56,7 @@
<script>
import cAction from '@action'
import CourseLatestLive from './course/components/CourseLatestLive.vue'
import CourseListItem from './components/CourseListItem'
import CourseListItem from './course/components/CourseListItem'
export default {
components: { CourseLatestLive, CourseListItem },
data() {
......
......@@ -47,7 +47,6 @@ export default {
chapters() {
const chapters = this.course.chapters || []
const customeChapter = [
// { name: this.$t('viewerMain.courseWork'), id: 'course_work', type: 99 },
{ name: this.$t('viewerMain.courseData'), id: 'course_info', type: 100 },
{ name: this.$t('viewerMain.teachingEvaluation'), id: 'teach_evaluation', type: 102 }
]
......
......@@ -70,9 +70,9 @@ export default {
margin: 0.3rem;
background-color: #fff;
.txt {
padding: 5px 100px 5px 0;
font-size: 16px;
font-weight: bold;
padding-right: 100px;
}
.in-btn {
position: absolute;
......
<template>
<div>
<!-- 最新直播 -->
<course-latest-live />
<div class="con-title">{{ $t('pages.learn.course.title') }}</div>
<!-- 筛选 -->
<div class="con-box">
<template v-for="(item, index) in find">
<ul v-bind:key="index" class="tabs-list">
<template v-if="find[index].arrItem.length">
<li class="tabs-hd">{{ item.name }}</li>
<template v-for="(item1, index1) in item.arrItem">
<li v-bind:key="index1">
<div
:class="['tab', item.selectIndex == index1 ? 'on' : '']"
@click="selFindSelect"
:data-index="index1"
:data-i="index"
:data-key="item.key"
:data-val="item1.val"
>
{{ item1.name }}
</div>
</li>
</template>
</template>
</ul>
</template>
</div>
<!-- 排序 -->
<div class="switch-box">
<el-button type="info" size="medium" plain @click="studyEarlyUpdate">
{{ $t('pages.learn.course.lastLearn') }}
<i :class="['el-icon-caret-' + (filter.studyEarly == 'down' ? 'bottom' : 'top'), 'icon']"></i>
</el-button>
<el-button type="info" size="medium" plain @click="selectTimeUpdate">
{{ $t('pages.learn.course.updateTime') }}
<i :class="['el-icon-caret-' + (filter.selectTime == 'down' ? 'bottom' : 'top'), 'icon']"></i>
</el-button>
<!--
<el-button class="rbtn" type="primary" size="medium" icon="el-icon-self-cc-book icon" @click="goCourseAll">
{{ $t('pages.learn.course.changeCourse') }}
</el-button>
-->
</div>
<!-- 课程列表 -->
<div class="con-box" v-loading="loading">
<ul class="course-list" v-if="homeList.length">
<course-list-item v-for="(item, index) in homeList" :data="item" :key="index"></course-list-item>
</ul>
<div class="no-data" v-else>{{ $t('pages.learn.course.noCourseStr') }}</div>
</div>
</div>
</template>
<script>
import cAction from '@action'
import CourseLatestLive from './course/components/CourseLatestLive.vue'
import CourseListItem from './components/CourseListItem'
export default {
components: { CourseLatestLive, CourseListItem },
data() {
return {
filter: {
studyEarly: 'down',
selectTime: 'down'
},
find: [
{
name: this.$t('pages.learn.course.semeter'),
isShow: false,
selectIndex: 0,
key: 'semester_id',
arrItem: [] // 从后台请求
},
{
name: this.$t('pages.learn.course.courseType'),
isShow: false,
selectIndex: 0,
key: 'course_type',
arrItem: [
{
val: '-1',
name: this.$t('pages.learn.course.allLearn')
},
{
val: '1',
name: this.$t('pages.learn.course.mustLearn')
},
{
val: '2',
name: this.$t('pages.learn.course.changeLearn')
},
{
val: '3',
name: this.$t('pages.learn.course.repeatLearn')
}
]
}
],
homeList: [], // 从后台请求
param: {},
loading: false
}
},
mounted() {
cAction.Course.getLearnFind()
.then(data => {
this.find[0].arrItem = data
this.getAjaxList(true, this.$t('pages.learn.course.goCourseAllStr'))
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {})
},
methods: {
goCourseAll() {
this.$router.push({
path: '/app/learn/course-all'
})
},
getAjaxList(bool, str) {
this.loading = true
cAction.Course.getCourseList(bool, this.param)
.then(json => {
this.homeList = json
})
.finally(() => {
this.loading = false
})
},
/**
* 分类选择 - 选中某一项
*/
selFindSelect(e) {
const _data = e.currentTarget.dataset
const index = _data.index
const json = this.find
const i = _data.i
json[i].selectIndex = index
json[i].isShow = false
if (_data.val === '-1') {
delete this.param[_data.key]
} else {
this.param[_data.key] = _data.val
}
/* 调用接口 */
this.getAjaxList(true, this.$t('pages.learn.course.noFitCourseStr'))
},
/**
* 筛选 - 最近学习顺序
*/
studyEarlyUpdate() {
const na = this.filter.studyEarly === 'up' ? 'down' : 'up'
this.filter.studyEarly = na
if (na === 'down') {
this.param.order_type = 'learn_time'
} else if (na === 'up') {
this.param.order_type = '-learn_time'
}
this.getAjaxList(true, this.$t('pages.learn.course.goCourseAllStr'))
},
/**
* 筛选 - 选修时间顺序
*/
selectTimeUpdate() {
const na = this.filter.selectTime === 'up' ? 'down' : 'up'
this.filter.selectTime = na
if (na === 'down') {
this.param.order_type = 'join_time'
} else if (na === 'up') {
this.param.order_type = '-join_time'
}
this.getAjaxList(true, this.$t('pages.learn.course.goCourseAllStr'))
}
}
}
</script>
<style lang="scss" scoped>
/* 列表 筛选 */
ul.tabs-list {
float: left;
width: 100%;
margin: 0 0 0.15rem 0;
padding: 0;
font-size: 0.16rem;
line-height: 1.5;
border-top: 1px solid #e8e8e8;
&:last-child {
margin-bottom: 0;
}
.tabs-hd {
display: inline-block;
color: #fff;
padding: 5px 0 9px;
margin-top: -5px;
width: 94px;
text-align: center;
background: url('~@/assets/images/type.png') no-repeat 0 0;
}
li {
float: left;
list-style: none;
padding: 0.1rem 0;
margin-right: 0.2rem;
.tab {
padding: 0 0.1rem;
cursor: pointer;
&.on {
background: #b49441;
color: #ffffff;
}
&:focus,
&:hover {
color: #b49441;
background: #eeeeee;
}
}
}
}
/* 筛选按钮 */
.switch-box {
margin: 0 0.3rem;
.icon {
margin-left: 0.1rem;
}
.rbtn {
float: right;
}
}
/* 课程列表 */
ul.course-list {
margin: 0;
padding: 0;
font-size: 0.18rem;
color: #313131;
}
.no-data {
text-align: center;
line-height: 2rem;
}
@media (max-width: 767px) {
.switch-box {
margin: 0;
}
}
</style>
<template>
<div>
<div class="con-title">{{ $t('pages.learn.courseDetail.title') }}</div>
<div class="detail-box">
<div class="box-thd">
<div class="title" @click="noWantThisCourse">
{{ headerInfo.title }}
<template v-if="headerInfo.isStart && tabs[1].chapterList.currentChapter">
<el-button
class="rbtn"
type="primary"
size="mini"
@click="startLearn(tabs[1].chapterList.currentChapter)"
>{{ $t('pages.learn.courseDetail.Keeplearning') }}</el-button
>
</template>
<template v-else-if="headerInfo.isStart">
<el-button class="rbtn" type="primary" size="mini" @click="startLearn(firstVideo)">{{
$t('pages.learn.courseDetail.Startlearning')
}}</el-button>
</template>
<template v-else>
<el-button class="rbtn" type="primary" size="mini" @click="wantThisCourse">{{
$t('pages.learn.courseDetail.Courseselection')
}}</el-button>
</template>
</div>
<div class="tags">
<template v-for="(item1, index) in headerInfo.arrTab">
<span v-bind:key="index" class="tabs-item">{{ item1 }}</span>
</template>
</div>
<div class="time">{{ headerInfo.time }} {{ headerInfo.status }}</div>
<div style="float: left; width: 100%; height: 1px"></div>
<div class="progress">
{{ $t('pages.learn.courseDetail.Videoviewingprogress') }}&emsp;<el-progress
:percentage="headerInfo.progress"
color="#b49441"
></el-progress>
</div>
</div>
<div class="box-tbd">
<div class="left-pic">
<template v-if="headerInfo.bgSrc">
<img :src="headerInfo.bgSrc" alt="" />
</template>
<template v-else>
<div class="no-img"><i class="el-icon-self-13"></i></div>
</template>
</div>
<div class="right-content" v-html="tabs[0].content.text"></div>
</div>
<el-row :gutter="20">
<el-col :xs="24" :sm="15" :md="17" :lg="18" :xl="20">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane :label="$t('pages.learn.courseDetail.Coursecontent')" name="1">
<div class="course-list">
<template v-for="(_item, index) in tabs[1].chapterList.course">
<div
v-bind:key="index"
:class="['content-group', !_item.chapters.length ? 'no-child' : '', _item.isUp ? 'up' : '']"
>
<div class="title" @click="clickJumpOrStatus(index, _item)">
{{ _item.title }}
<i
:class="[
'side',
_item.chapters.length ? '' : 'none',
_item.isUp ? 'el-icon-arrow-down' : 'el-icon-arrow-up'
]"
></i>
</div>
<template v-for="(item1, index1) in _item.chapters">
<div
v-bind:key="index1"
:class="['body', item1.id === tabs[1].chapterList.currentChapterId && 'on']"
>
<div
class="name"
:data-vid="item1.vid"
:data-cid="item1.cid"
:data-sid="item1.sid"
:data-hasVA="item1.time"
:data-type="item1.video_provider"
:data-name="item1.name"
:data-index="index"
:data-count="index1"
@click="jumpToOtherVA(item1)"
>
{{ item1.name }}
<template v-if="[5, 8].includes(item1.type)">
<div class="time">
{{ item1.live.start_time }}
{{ item1.live.statusStr }}
</div>
</template>
<template v-else>
<div class="time">{{ item1.time }}</div>
</template>
</div>
</div>
</template>
</div>
</template>
</div>
</el-tab-pane>
<el-tab-pane :label="$t('pages.learn.courseDetail.Coursediscussion')" name="2">
<template v-if="!isPublicShow">
<div class="pub-ques">
<div class="ask">
<i class="el-icon-edit img"></i>
<div class="txt" @click="publishDiscuss">
{{ $t('pages.learn.courseDetail.Publishingissues') }}
</div>
</div>
<div
:class="['item-order', sort[0].isShow ? 'on' : '']"
@click="sortFn"
:data-index="0"
:data-str="sort[0].str"
>
{{ $t('pages.learn.courseDetail.Sortbytime') }}
</div>
<div
:class="['item-order', sort[1].isShow ? 'on' : '']"
@click="sortFn"
:data-index="1"
:data-str="sort[1].str"
>
{{ $t('pages.learn.courseDetail.Sortbyvote') }}
</div>
</div>
<div class="discuss-scroll" bindscrolltolower="loadmore" bindscrolltoupper="updatenew">
<discuss :params="params"></discuss>
</div>
</template>
<template v-else>
<div class="publish">
<div style="overflow: hidden">
<div class="right-goback-txt">
{{ $t('pages.learn.courseDetail.Releaseissues') }}
</div>
<el-button type="text" @click="gobackDiscuss">{{
$t('pages.learn.courseDetail.Returntoquestionlist')
}}</el-button>
</div>
<el-form ref="setPublishform" :model="publish" :rules="publishRules" label-position="top">
<el-form-item :label="$t('pages.learn.courseDetail.title1')" prop="title">
<el-input
v-model="publish.title"
type="text"
:placeholder="$t('pages.learn.courseDetail.inputtitle1')"
></el-input>
</el-form-item>
<el-form-item :label="$t('pages.learn.courseDetail.Textcontent')" prop="contents">
<v-editor v-model="publish.contents"></v-editor>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmitPublish">{{
$t('pages.learn.courseDetail.Releaseissues')
}}</el-button>
</el-form-item>
</el-form>
</div>
</template>
</el-tab-pane>
<el-tab-pane :label="$t('pages.learn.courseDetail.Courseassessment')" name="3" :lazy="true">
<div class="course-assess">
<div class="title">
{{ $t('pages.learn.courseDetail.Finalresult') }}
{{
(tabs[3].assess.score && tabs[3].assess.score + $t('pages.learn.courseDetail.point')) ||
$t('pages.learn.courseDetail.no')
}}
</div>
<div class="topic">
<div class="line"></div>
<div class="tit">
{{ $t('pages.learn.courseDetail.Courseassessmentstandard') }}
</div>
</div>
<course-assessment-cn :data="courseAssessment" v-if="courseCheckType === 1"></course-assessment-cn>
<course-assessment-en :data="courseAssessment" v-else></course-assessment-en>
<!-- <div class="detail">
<div class="detail-rich" v-html="tabs[3].richText"></div>
</div> -->
<div class="topic">
<div class="line"></div>
<div class="tit">
{{ $t('pages.learn.courseDetail.Learningprogressachievements') }}
</div>
</div>
<div class="table-title">
{{ $t('pages.learn.courseDetail.title2') }}{{ tabs[3].assess.duration
}}{{ $t('pages.learn.courseDetail.Completionrate') }}{{ tabs[3].assess.progress }} )
</div>
<div class="table">
<div class="th">
<div class="col3-td1">
{{ $t('pages.learn.courseDetail.chapter') }}
</div>
<div class="col3-td2">
{{ $t('pages.learn.courseDetail.Lengthofstudy') }}
</div>
<div class="col3-td3">
{{ $t('pages.learn.courseDetail.percent') }}
</div>
</div>
<template v-for="(item1, index) in tabs[3].assess.video">
<div v-bind:key="index" class="tb">
<div class="tt">{{ item1.title }}</div>
<template v-for="(item2, index) in item1.arr">
<div v-bind:key="index" class="rd">
<div
class="col3-td1"
:data-sid="item1.sid"
:data-cid="item1.cid"
:data-vid="item2.vid"
:data-id="item2.id"
:data-type="item2.type"
:data-duration="item2.duration"
@mousedown="jumpVAOrfinishVA($event)"
>
{{ item2.name }}
</div>
<div class="col3-td2">{{ item2.time }}</div>
<div class="col3-td3">{{ item2.progress }}</div>
</div>
</template>
</div>
</template>
<template v-if="!tabs[3].assess.video.length">
<div style="width: 100%; font-size: 30rpx; margin: 40rpx auto 10rpx auto; text-align: center">
{{ $t('pages.learn.courseDetail.Nodataavailable') }}
</div>
</template>
</div>
<div class="table-title">
{{ $t('pages.learn.courseDetail.subjectivequestions') }}
</div>
<div class="table">
<div class="th">
<div class="col3-td1">
{{ $t('pages.learn.courseDetail.chapter') }}
</div>
<div class="col3-td2">
{{ $t('pages.learn.courseDetail.Submissiontime') }}
</div>
<div class="col3-td3">
{{ $t('pages.learn.courseDetail.score') }}
</div>
</div>
<template v-for="(item1, index) in tabs[3].assess.homewrok">
<div v-bind:key="index" class="tb">
<div class="tt">{{ item1.title }}</div>
<template v-for="(item2, index) in item1.arr">
<div v-bind:key="index" class="rd">
<div class="col3-td1">{{ item2.name }}</div>
<div class="col3-td2">
{{ item2.created_time || '暂无提交' }}
</div>
<div class="col3-td3">{{ item2.score }}</div>
</div>
</template>
</div>
</template>
<template v-if="!tabs[3].assess.homewrok.length">
<div style="width: 100%; font-size: 30rpx; margin: 40rpx auto 10rpx auto; text-align: center">
{{ $t('pages.learn.courseDetail.Nodataavailable') }}
</div>
</template>
</div>
<div class="table-title">{{ $t('pages.learn.courseDetail.Bighomework') }}</div>
<div class="status-text">
{{ $t('pages.learn.courseDetail.Status') }}{{ tabs[3].assess.essay.status }}
</div>
<div class="status-text" v-if="tabs[3].assess.essay.created_time">
{{ $t('pages.learn.courseDetail.Submissiontime') }}:{{ tabs[3].assess.essay.created_time }}
</div>
<div class="status-text">
{{ $t('pages.learn.courseDetail.score2') }}{{ tabs[3].assess.essay.score }}
</div>
</div>
</el-tab-pane>
</el-tabs>
</el-col>
<el-col :xs="24" :sm="9" :md="7" :lg="6" :xl="4">
<template v-if="tabs[0].content && tabs[0].content.teachers && tabs[0].content.teachers.length">
<el-tabs v-model="activeName1" @tab-click="handleClick">
<el-tab-pane :label="$t('pages.learn.courseDetail.Courselecturer')" name="1">
<template v-for="(item1, index) in tabs[0].content.teachers">
<div v-bind:key="index" class="list-teacher">
<img class="img" :src="item1.src" alt="" />
<div class="ctx">
<div class="top-ctx">
<div class="name">{{ item1.name }}</div>
</div>
<div class="bottom-ctx">
<div class="t1">{{ item1.edu }}</div>
<div class="t2">{{ item1.job }}</div>
<div class="t3">{{ item1.unit }}</div>
</div>
</div>
</div>
</template>
</el-tab-pane>
</el-tabs>
</template>
</el-col>
</el-row>
</div>
</div>
</template>
<script>
import cAction from '@action'
import cTool from '@tool'
import VEditor from '@/components/ckeditor'
import CourseAssessmentCn from './components/course_assessment_cn'
import CourseAssessmentEn from './components/course_assessment_en'
export default {
components: { VEditor, CourseAssessmentCn, CourseAssessmentEn },
props: {
sid: {
type: String,
require: false
},
cid: {
type: String,
require: false
}
},
data() {
return {
params: {
path: `/${this.sid}/${this.cid}`,
request: 'getCourseDiscussList',
page: {
limit: 10,
offset: 0
}
},
activeName: '1',
activeName1: '1',
passCount: 0, // 隐藏功能, 退课专用
headerInfo: {}, // 后台数据返回
tabs: [
{
title: '课程简介',
isShow: true,
content: {
text: '<p><b>视频课程没有加载出来,请检查自己的网络环境,并重新刷新。</b>',
teachers: [
{
src: '',
name: '讲师姓名',
edu: '学历',
job: '职称',
unit: '讲师所在单位'
}
]
}
},
{
title: '课程内容',
isShow: false,
chapterList: {
currentChapterId: '11', // 当前章节id
course: []
}
},
{
title: '课程讨论',
isShow: false
},
{
title: '课程考核',
isShow: false,
richText:
"<div class='h1'>一、最终成绩计算</div> <div class='p'>课程表现得分*30%+每章试题得分*30%+结业大作业得分*40%=该门课程总得分,满分100分,低于80分为不及格,需重修此门课程。84分以上方可申请学位。</div> <img class='b1' src='https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/static/build/www/course-check.png' mode='aspectFill' /> <div class='h1'>二、具体细则</div> <div class='h2'>课程表现:总分100分(占科目总成绩的30%)</div> <div class='p'>1、每个视频观看完成度50分:以后台数据统计为准,全部看完视频满分50分,其它酌情给分。</div> <div class='em'>注:视频观看考核的是实际播放时长,不是进度条的显示状态,进度条满格并不一定表示观看完这个视频。以下方每日学习时长为准。</div> <div class='p'>2、课程反馈建设性问题及课程完成情况50分:反馈问题以教务老师统计为准,课程完成情况以后台数据为准,是否按时完成视频观看、测试、作业提交,满分50分,酌情给分。</div> <div class='h2'>每章试题:总分100分(占科目总成绩的30%)</div> <div class='p'>本课程所有试题的平均正确率*100分*占总成绩30%=此项得分。(比如正确度为80%,则此项得分:80%*100*30%=24分)</div> <div class='h2'>结业大作业:总分100分(占科目总成绩的40%)</div> <div class='p'>结业大作业满分为100分,以助教老师给分为准。</div>",
assess: {
score: '20',
duration: '00:01:20',
progress: '0/10',
video: [
{
title: '第一章 市场营销原理导论',
sid: '',
cid: '',
arr: [
{
name: '1.1 什么是市场营销什么是市场营销市场营销什么是市场营销什么是市场营销',
time: '12:08',
progress: '100%',
vid: ''
}
]
}
],
homewrok: [
{
title: '第一章 市场营销原理导论',
arr: [
{
name: '1.1 什么是市场营销什么是市场营销市场营销什么是市场营销什么是市场营销',
score: 20
}
]
}
],
essay: {
created_time: '',
status: '未提交',
score: '暂无'
}
}
}
],
sort: [
{
isShow: false,
str: ''
},
{
isShow: false,
str: 'tag'
}
],
discussList: [], // 后台数据返回
param: {
limit: 10, // 默认每页显示10条
offset: 0, // 偏移量(未考虑传输时,产生新问题情况)
sort: '' // 排序方式
},
publish: {
course_id: this.cid,
semester_id: this.sid,
title: '',
contents: ''
},
isPublicShow: false, // 是否显示发布问题
publishRules: {
title: [{ required: true, message: this.$t('pages.learn.courseDetail.inputtitle1'), trigger: 'blur' }],
contents: [{ required: true, message: this.$t('pages.learn.courseDetail.inputTextcontent'), trigger: 'blur' }]
},
isOpenNewTabFlag: false,
arrFn: [],
cloudClassUrls: {},
timeHeart: null,
firstVideo: {},
courseCheckType: 2,
courseAssessment: {}
}
},
mounted() {
/* 获取云课堂所有地址 */
cAction.Player.getCloudUrl().then(json => {
this.cloudClassUrls = json
})
const loading = this.$loading({
lock: true,
text: '',
spinner: '',
background: 'rgba(255, 255, 255, 0.9)'
})
if (this.cid === '0' && this.sid === '0') {
this.$message({
message: 'URL异常,请点击“返回首页”,重新选择课程学习!!',
type: 'info',
duration: 10000
})
loading.close()
return
}
cAction.Course.getCourseDetail(this.cid, this.sid)
.then(json => {
this.courseCheckType = json.course_check_type
this.headerInfo = json.headerInfo
this.tabs[0].content = json.tabs0Content
this.tabs[1].chapterList = json.tabs1ChapterList
json.tabs3richTest && (this.tabs[3].richText = json.tabs3richTest)
// 设置开始学习的视频
const courseList = json.tabs1ChapterList.course
for (let i = 0; i < courseList.length; i++) {
const children = courseList[i].chapters || []
if (this.firstVideo && this.firstVideo.vid) {
break
}
for (let k = 0; k < children.length; k++) {
const item = children[k]
if (item.vid && item.video_provider) {
this.firstVideo = item
break
}
}
}
cAction.Course.getCourseAssess(this.cid, this.sid)
.then(json1 => {
this.courseAssessment = json1.raw
// const _courseArr = json.tabs1ChapterList.course
// /* 进行一次 对照,将 视频 vid 赋值 */
// /* BUG: 如果有某一章 都没有视频时,对照失败,从没有的那一章开始,后面全部没有vid */
// for (let i = 0; i < json1.video.length; i++) {
// const _tmp = json1.video[i].arr
// const _tmp1 = _courseArr[i].chapters
// for (let j = 0; j < _tmp.length; j++) {
// for (let k = j; k < _tmp1.length; k++) {
// if (_tmp[j].id === _tmp1[k].id) {
// _tmp[j].vid = _tmp1[k].vid
// _tmp[j].duration = _tmp1[k].duration
// break
// }
// }
// }
// }
this.tabs[3].assess = json1
loading.close()
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {})
// cAction.Discuss.getCourseDiscussList(this.cid, this.sid, this.param).then(json2 => {
// this.discussList = json2
// }).catch(e => { this.$message.error(e.message) }).finally(() => { })
})
.catch(e => {
this.$message.error(e.message)
loading.close()
})
.finally(() => {})
window.addEventListener('resize', this.resizeRoot.bind(this), false)
/* 实时刷新数据 */
if (this.timeHeart) {
clearInterval(this.timeHeart)
this.timeHeart = null
}
// this.timeHeart = setInterval(this.updatePages(), 3000)
this.arrFn = this.initBindKeyfn()
},
destroyed() {
window.removeEventListener('resize', this.resizeRoot.bind(this), false)
if (this.timeHeart) {
clearInterval(this.timeHeart)
this.timeHeart = null
}
if (this.arrFn.length) {
this.destroyKeyfn(this.arrFn)
}
},
updated() {
this.resizeRoot()
},
methods: {
handleClick(tab, event) {
/* console.log(tab, event) */
},
updatePages() {
cAction.Course.getCourseDetail(this.cid, this.sid).then(json => {
/* 更新直播状态 */
this.tabs[1].chapterList.course = json.tabs1ChapterList.course.map(item => {
const found = this.tabs[1].chapterList.course.find(rawItem => rawItem.id === item.id)
item.isUp = found ? found.isUp : item.isUp
return item
})
})
// 暂不处理,新增章节不能实时更新,需要手动刷新
// .catch(e => { this.$message.error(e.message) }).finally(() => { })
},
/**
* 课程内容 - 列表展开或者跳转
*/
clickJumpOrStatus(index, data) {
const flag = !!data.chapters.length
if (flag) {
const json = this.tabs
const temp = json[1].chapterList.course[index]
temp.isUp = !temp.isUp
} else {
/* 进入详情页,不管是哪个,都存localstorage */
window.localStorage.setItem('headerInfo', JSON.stringify(this.headerInfo))
const { sid, cid } = data
// 课程大作业
if (data.id === 'course_work' && !this.headerInfo.survey) {
this.$message('请先填写教学评估,然后完成大作业。')
return
}
// 教学评估
if (data.id === 'teach_evaluation') {
const { sid, cid } = this.$route.params
this.$router.push({
name: 'survey',
params: {
sid,
cid
}
})
return
}
this.$router.push({
name: 'viewerCourseChapter',
params: {
sid,
cid,
id: data.id
}
})
}
},
/* 直接跳转打开新页面 */
openNewTab(sid, cid, _id) {
cAction.Player.getChapterList(cid, sid, _id)
.then(json => {
this.live = (json.curJson && json.curJson.live) || {}
if (this.live.id) {
if (this.live.live_status === 3 && this.live.enable_record && this.live.record_url) {
this.live.url = this.live.record_url
} else {
this.live.viewer_name = window.G.UserInfo.student_info.personal_name || window.G.UserInfo.nickname
this.live.url =
'https://view.csslcloud.net/api/view/index?roomid=' +
this.live.room_id +
'&userid=' +
this.live.user_id +
'&autoLogin=true&viewername=' +
(this.live.viewer_name || '匿名') +
'&viewertoken=' +
this.live.viewer_token // + '&groupid=xxx'
}
// this.CCLiveInit(this.live)
this.isOpenNewTabFlag = false
window.open(this.live.url)
}
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {})
},
initBindKeyfn() {
const _fn1 = e => {
if (e.keyCode === 70) {
this.isOpenNewTabFlag = true
}
}
const _fn2 = e => {
if (e.keyCode === 70) {
this.isOpenNewTabFlag = false
}
}
document.addEventListener('keydown', _fn1, false)
document.addEventListener('keyup', _fn2, false)
return [_fn1, _fn2]
},
destroyKeyfn(arr) {
document.removeEventListener('keydown', arr[0])
document.removeEventListener('keyup', arr[1])
},
/**
* 跳转到对应音视频播放页
*/
jumpToOtherVA(data) {
/* 如果未选课,不能查看课程内容 */
if (!this.headerInfo.isStart) {
this.$message.error('先选课,才能学习')
return
}
const { sid, cid, vid, type } = data
/* 进入详情页,不管是哪个,都存localstorage */
window.localStorage.setItem('headerInfo', JSON.stringify(this.headerInfo))
if (type === 1) {
return
}
// cc直播
if (type === 5) {
const live = data.live
const hasRecordUrl = live.enable_record && live.record_url
if ([3, 5].includes(live.live_status) && !hasRecordUrl) {
this.$message.error(live.statusStr)
return
}
/* 判别如果为 云课堂记录 id 则直接进入 云课堂 */
if (this.cloudClassUrls[vid]) {
const viewerName = window.G.UserInfo.student_info.personal_name || window.G.UserInfo.nickname
const url = this.cloudClassUrls[vid] + '&viewername=' + viewerName + '&autoLogin=true'
window.open(url)
return
}
// 新窗口打开
if (this.isOpenNewTabFlag) {
this.openNewTab(sid, cid, vid)
return
}
}
// zoom直播
if (type === 8) {
const live = data.live
const hasRecordUrl = live.enable_record && live.record_url
if ([3, 5].includes(live.live_status) && !hasRecordUrl) {
this.$message.error(live.statusStr)
return
}
window.open(data.live.record_url || data.live.join_url)
return
}
this.$router.push({
name: 'viewerCourseChapter',
params: {
sid,
cid,
id: data.id
},
query: {
offset: data.offset
}
})
},
/**
* 开始学习或继续学习 - 跳转到对应音视频播放页
*/
startLearn(data) {
if (data.id) {
this.$router.push({
name: 'viewerCourseChapter',
params: {
sid: this.sid,
cid: this.cid,
id: data.id
}
})
} else {
this.$message.error('当前暂无点播课程')
}
},
/**
* 退课 - 隐藏功能,点击 标题15次,进行退课
*/
noWantThisCourse() {
this.passCountTimeout && clearTimeout(this.passCountTimeout)
this.passCountTimeout = setTimeout(() => {
this.passCount = 0
}, 500)
if (this.passCount < 15) {
this.passCount++
return
}
const loading = this.$loading({
lock: true,
text: '',
spinner: '',
background: 'rgba(255, 255, 255, 0.9)'
})
cAction.Course.outSelectCourse(this.cid, this.sid)
.then(json => {
this.headerInfo.isStart = false
loading.close()
this.$message({
type: 'success',
message: '退课成功'
})
this.passCount = 0
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {
loading.close()
})
},
/**
* 隐藏功能 - 在课程统计页 直接 点击进入视频学习页 或者 直接完成该课程的视频挂载
*/
jumpVAOrfinishVA(e) {
const data = e.currentTarget.dataset
const _fn1 = this._keydownfn.bind(this, data)
document.addEventListener('keydown', _fn1, false)
const _fn3 = function () {
document.removeEventListener('keydown', _fn1)
document.removeEventListener('mouseup', _fn3)
}
document.addEventListener('mouseup', _fn3, false)
},
_keydownfn(data, e) {
const _sid = data.sid
const _cid = data.cid
const _vid = data.vid
const _duration = data.duration
const _id = data.id
/* 字母 o */
if (e.keyCode === 79) {
/* 直接跳转 进入 继续学习 */
this.$router.push({
name: 'viewerCourseChapter',
params: {
sid: _sid,
cid: _cid,
id: _id
}
})
}
/* 字母 f */
if (e.keyCode === 70) {
/* 直接 调用接口 完成 本课程学习 */
cAction.Player.updateProgress({
d: cTool.other.getIdt(),
i: cTool.other.getIdt(),
c: _cid,
s: _sid,
v: _vid,
_p: parseInt(_duration) + 11, // 累计时间
_m: parseInt(_duration), // 当前播放最大时间
_c: parseInt(_duration), // 当前播放位置
ps: '0,0' // 播放时,播放过的 帧
})
.then(json => {
if (json.success) {
this.$message.success('补课成功,刷新查看结果')
}
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {})
}
},
/**
* 选课
*/
wantThisCourse() {
const loading = this.$loading({
lock: true,
text: '',
spinner: '',
background: 'rgba(255, 255, 255, 0.9)'
})
cAction.Course.selectCourse(this.cid, this.sid)
.then(json => {
this.headerInfo.isStart = true
loading.close()
this.$message({
type: 'success',
message: '选课成功'
})
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {
loading.close()
})
},
resizeRoot() {
const elems = document.querySelectorAll('.ellipsis')
const fs = getComputedStyle(window.document.documentElement)['font-size'].replace('px', '') // eslint-disable-line
elems.forEach((_, i) => {
_.previousSibling.style.height = 'auto'
const height = _.previousSibling.offsetHeight
const realHeight = fs * 0.18 * 1.5 * 2
if (height > realHeight) {
this.discussList[i] && (this.discussList[i].isShow = true)
_.previousSibling.style.height = realHeight + 'px'
} else {
this.discussList[i] && (this.discussList[i].isShow = false)
}
})
},
/**
* 发布问题 - 页面打开
*/
publishDiscuss() {
this.isPublicShow = true
},
/**
* 返回问题列表
*/
gobackDiscuss() {
this.isPublicShow = false
},
/**
* 问题发布 - 接口提交
*/
onSubmitPublish() {
this.$refs.setPublishform.validate(valid => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '',
spinner: '',
background: 'rgba(255, 255, 255, 0.9)'
})
cAction.Discuss.publishQues(this.publish)
.then(json => {
this.$message({ type: 'success', message: this.$t('pages.learn.courseDetail.publishSuccessTips') })
this.isPublicShow = false
this.params = {
path: `/${this.sid}/${this.cid}`,
request: 'getCourseDiscussList',
page: { limit: 10, offset: 0 }
}
this.$refs.setPublishform.resetFields()
// cAction.Discuss.getCourseDiscussList(this.cid, this.sid, this.param).then(json2 => {
// this.discussList = json2
// }).catch(e => { this.$message.error(e.message) }).finally(() => { })
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {
loading.close()
})
}
})
},
/**
* 跳转到对应 问题详情页
*/
goDiscussDetail(e) {
const qid = e.currentTarget.dataset.id
this.$router.push({
path: `/app/learn/discuss-detail/${this.sid}/${this.cid}/${qid}`
})
},
/**
* 排序方式
*/
sortFn(e) {
const index = e.currentTarget.dataset.index
const str = e.currentTarget.dataset.str
this.sort[index].isShow = !this.sort[index].isShow
this.sort[(parseInt(index) + 1) % 2].isShow = false
this.param.sort = this.sort[index].isShow ? str : ''
this.param.offset = 0
// const loading = this.$loading({ lock: true, text: '', spinner: '', background: 'rgba(255, 255, 255, 0.9)' })
this.params = {
path: `/${this.sid}/${this.cid}`,
request: 'getCourseDiscussList',
dataJson: {
limit: 10,
offset: 0,
sort: this.sort[index].isShow ? str : ''
}
}
// cAction.Discuss.getCourseDiscussList(this.cid, this.sid, this.param).then(json => {
// this.discussList = json
// }).catch(e => { this.$message.error(e.message) }).finally(() => { loading.close() })
}
}
}
</script>
<style lang="scss" scoped>
body .el-tab-pane {
padding-top: 0;
}
.detail-box {
margin: 0.3rem;
color: #313131;
overflow: hidden;
.box-thd {
margin-bottom: 0.1rem;
overflow: hidden;
.title {
font-size: 0.22rem;
line-height: 1.5;
font-weight: 700;
.rbtn {
float: right;
}
}
.tags {
float: left;
margin: 0.1rem 0.2rem 0.05rem 0;
font-size: 0.14rem;
span {
padding: 0 0.1rem;
margin: 0;
border-right: 1px solid #313131;
&:first-child {
padding-left: 0;
}
&:last-child {
border: none;
}
}
}
.time {
float: left;
margin: 0.1rem 0 0.05rem 0;
font-size: 0.14rem;
}
.progress {
float: left;
width: 100%;
font-size: 14px;
.el-progress {
width: 45%;
display: inline-block;
vertical-align: text-bottom;
}
}
}
.box-tbd {
margin-bottom: 0.2rem;
overflow: hidden;
.left-pic {
float: left;
width: 1.8rem;
overflow: hidden;
.no-img {
width: 100%;
height: 1rem;
text-align: center;
line-height: 1.1rem;
border: 1px solid #c9c9c9;
i {
font-size: 0.4rem;
color: #c9c9c9;
}
}
img {
display: block;
width: 100%;
}
}
.right-content {
margin-left: 2rem;
line-height: 1.5;
font-size: 14px;
}
}
/* 课程列表内容 直接用 wx统一样式 修改单位 并 整体 缩小了 */
.course-list {
padding: 0.2rem 0 0.1rem 0;
background: #ffffff;
}
.course-list .none {
display: none;
}
.course-list .content-group {
padding: 0 0.2rem;
}
.course-list .content-group.no-child {
margin-bottom: 0.1rem;
}
.course-list .content-group.up {
margin-bottom: 0.1rem;
}
.course-list .content-group.up .body {
display: none;
}
.course-list .content-group .title {
position: relative;
padding: 0.1rem 0.54rem 0.1rem 0.2rem;
color: #313131;
font-size: 0.16rem;
line-height: 0.24rem;
background: #e5e5e5;
user-select: none;
cursor: pointer;
}
.course-list .content-group .title .side {
position: absolute;
top: 50%;
right: 0.24rem;
transform: translateY(-50%);
}
.course-list .content-group .body {
position: relative;
padding: 0 0.2rem;
font-size: 0.16rem;
line-height: 0.24rem;
color: #505050;
cursor: pointer;
}
.course-list .content-group .body:hover {
background: #f3f3f3;
}
.course-list .content-group .body.on .name {
color: #b2183e;
}
.course-list .content-group .body .name {
padding: 0.1rem 0.8rem 0.1rem 0.2rem;
border-left: 0.02rem solid #c9c9c9;
}
.course-list .content-group .body .name:before {
width: 0.2rem;
height: 0.2rem;
border-radius: 0.32rem;
border: 0.02rem solid #c9c9c9;
background: #e5e5e5;
position: absolute;
left: 0.11rem;
top: 0.12rem;
content: '';
display: block;
z-index: 10;
}
.course-list .content-group .body .name .time {
position: absolute;
right: 0.16rem;
top: 0.1rem;
}
/* 老师列表内容 直接用 wx统一样式 修改单位 并 整体 缩小了 */
.list-teacher {
margin-bottom: 0.2rem;
overflow: hidden;
}
.list-teacher .img {
float: left;
width: 30%;
min-height: 0.8rem;
background: #c9c9c9;
}
.list-teacher .ctx {
position: relative;
margin-left: 32%;
min-height: 0.5rem;
}
.list-teacher .ctx .top-ctx {
overflow: hidden;
}
.list-teacher .ctx .top-ctx .tit {
font-size: 14px;
color: #313131;
line-height: 1.5;
overflow: hidden;
word-break: break-all;
}
.list-teacher .ctx .bottom-ctx {
overflow: hidden;
}
.list-teacher .ctx .bottom-ctx .t1 {
font-size: 12px;
line-height: 1.5;
color: #707070;
overflow: hidden;
word-break: break-all;
}
.list-teacher .ctx .bottom-ctx .t2 {
font-size: 12px;
line-height: 1.5;
color: #707070;
overflow: hidden;
word-break: break-all;
}
.list-teacher .ctx .bottom-ctx .t3 {
font-size: 12px;
color: #707070;
text-overflow: ellipsis;
overflow: hidden;
word-break: break-all;
}
/* 课程讨论 */
.pub-ques {
padding: 0 0.26rem;
overflow: hidden;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.pub-ques .ask {
position: relative;
float: left;
margin-top: 0.22rem;
width: 40%;
min-width: 1rem;
height: 0.42rem;
border-radius: 0.28rem;
border: 1rpx solid #dcdcdc;
background: #ffffff;
-webkit-box-sizing: border-box;
box-sizing: border-box;
cursor: pointer;
}
.pub-ques .ask .img {
position: absolute;
left: 0.15rem;
font-size: 0.24rem;
line-height: 0.42rem;
}
.pub-ques .ask .txt {
position: absolute;
left: 0.45rem;
top: 0.01rem;
height: 0.4rem;
width: 80%;
border: none;
line-height: 0.4rem;
font-size: 0.2rem;
color: #313131;
}
.pub-ques .item-order {
float: right;
margin-top: 0.22rem;
padding: 0 0.3rem;
margin-left: 0.2rem;
font-size: 0.2rem;
color: #313131;
text-align: center;
line-height: 0.42rem;
border-radius: 0.28rem;
background: #ffffff;
cursor: pointer;
}
.pub-ques .item-order.on {
background: #b49441;
color: #ffffff;
}
// .discuss-scroll { }
.discuss-scroll .item-list:first-child {
margin-top: 0.3rem;
}
.discuss-scroll .item-list {
position: relative;
padding: 0.3rem 0.26rem;
margin-bottom: 0.2rem;
background: #fff;
box-shadow: 0 2px 4px rgba(10, 4, 6, 0.1);
cursor: pointer;
}
.discuss-scroll .item-list .user {
position: relative;
overflow: hidden;
}
.discuss-scroll .item-list .user .img {
float: left;
width: 0.6rem;
height: 0.6rem;
background: #e5e5e5;
border-radius: 50%;
}
.discuss-scroll .item-list .user .right {
position: absolute;
left: 0.72rem;
top: 50%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
.discuss-scroll .item-list .user .right .name {
font-size: 0.18rem;
color: #313131;
text-overflow: ellipsis;
overflow: hidden;
word-break: break-all;
}
.discuss-scroll .item-list .user .right .time {
margin-top: 0.05rem;
font-size: 0.16rem;
color: #a0a0a0;
}
.discuss-scroll .item-list .title {
margin: 0.15rem 0;
font-size: 0.22rem;
color: #313131;
font-weight: 700;
line-height: 1.5;
text-align: justify;
}
.discuss-scroll .item-list .text {
font-size: 0.18rem;
color: #535353;
line-height: 1.5;
text-align: justify;
/* display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; text-overflow: ellipsis; overflow: hidden; */
word-break: break-all;
overflow: hidden;
}
.discuss-scroll .item-list .ellipsis {
display: none;
position: absolute;
right: 0.24rem;
bottom: 0.68rem;
padding: 0 0.15rem 0 0.05rem;
color: #535353;
background: #fff;
font-size: 0.18rem;
}
.discuss-scroll .item-list .ellipsis.on {
display: block;
}
.discuss-scroll .item-list .result {
margin-top: 0.15rem;
font-size: 0.16rem;
color: #313131;
}
.discuss-scroll .item-list .course-name {
position: absolute;
right: 0.32rem;
bottom: 0.28rem;
font-size: 0.16rem;
color: #b49441;
}
.discuss-scroll .no-data {
margin: 0.2rem 0;
font-size: 0.24rem;
color: #112c42;
line-height: 2rem;
text-align: center;
background: #fff;
}
/* 问题发布 */
.publish {
margin-bottom: 0.5rem;
padding: 0.3rem;
background: #f7f7f7;
overflow: hidden;
}
.publish .right-goback-txt {
float: right;
font-size: 0.2rem;
color: #000000;
line-height: 40px;
}
/* 课程考核内容 直接用 wx统一样式 修改单位 并 整体 缩小了 */
.course-assess {
padding: 0.2rem;
margin-bottom: 1rem;
background: #ffffff;
overflow: hidden;
}
.course-assess .title {
color: #313131;
font-size: 0.2rem;
margin: 0.4rem auto 0.2rem auto;
text-align: center;
}
.course-assess .topic {
position: relative;
width: 100%;
height: 0.5rem;
overflow: hidden;
}
.course-assess .topic .line {
width: 3rem;
height: 1px;
margin: 0.25rem auto 0 auto;
background: #313131;
}
.course-assess .topic .tit {
position: absolute;
top: 50%;
left: 50%;
padding: 0.1rem 0.22rem;
font-size: 0.14rem;
font-weight: 700;
color: #313131;
background: #fff;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
.course-assess .detail {
margin-bottom: 0.4rem;
padding: 0 0.2rem;
}
/* 富文本不定义在这 */
/* 统计表格 */
.course-assess .table-title {
font-size: 0.16rem;
font-weight: 700;
margin: 0.2rem 0.26rem 0.2rem 0.26rem;
text-align: justify;
color: #b49441;
}
.course-assess .table {
padding: 0 0.2rem;
color: #313131;
padding-bottom: 0.3rem;
border-bottom: 0.02rem solid #c9c9c9;
}
.course-assess .table .col3-td1 {
float: left;
padding-left: 0.15rem;
width: 65%;
text-align: left;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.course-assess .table .col3-td2 {
float: left;
width: 21%;
text-align: center;
}
.course-assess .table .col3-td3 {
float: left;
width: 14%;
text-align: right;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.course-assess .table .col2-td1 {
float: left;
padding-left: 0.15rem;
width: 86%;
text-align: left;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.course-assess .table .col2-td2 {
float: left;
width: 14%;
text-align: right;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.course-assess .table .th {
padding: 0 0.2rem;
font-size: 0.16rem;
overflow: hidden;
border-bottom: 0.02rem solid #e5e5e5;
line-height: 1.5;
font-weight: 700;
}
.course-assess .table .tb {
padding: 0 0 0 0.2rem;
font-size: 0.14rem;
overflow: hidden;
}
.course-assess .table .tb .tt {
padding: 0.1rem 0 0.02rem 0;
line-height: 0.24rem;
font-weight: 700;
}
.course-assess .table .tb .rd {
padding-right: 0.2rem;
overflow: hidden;
/* border-bottom: 1rpx solid #e5e5e5; */
line-height: 0.26rem;
/* padding: 10rpx 0; */
}
.course-assess .table .tb .rd:hover {
background: #efefef;
}
/* .course-assess .table .tb .rd:last-child { border-bottom: none; } */
.course-assess .status-text {
padding-left: 0.3rem;
font-size: 0.14rem;
color: #000000;
line-height: 1.5;
}
}
@media (max-width: 767px) {
.detail-box {
margin: 0.2rem;
}
.detail-box .box-thd .progress .el-progress {
width: 80%;
}
.detail-box .box-tbd .left-pic {
width: 100%;
margin-bottom: 0.2rem;
}
.detail-box .box-tbd .right-content {
margin-left: 0;
display: block;
}
/* 课程考核样式 */
.detail-box .course-assess .detail {
padding: 0;
}
.detail-box .course-assess .table {
padding: 0 0 0.3rem 0;
}
}
</style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论