You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
zhishifufei_uniapp/pages/special/details.vue

3529 lines
106 KiB

<template>
<BaseContainer class="thematic-details">
<NavBar :title="navTitle" />
<template v-if="infoLoading">
<view class="base-wrap">
<view class="swiper-details">
<view class="special-coverimg">
<image :src="swiperlist[0]" mode="aspectFill"></image>
</view>
<!-- <swiper class="banner slider-banner">
<swiper-item>
<view class="swiper-slide" v-for="(src, key) in swiperlist" :key="key">
<image :src="src" mode="aspectFill" />
</view>
</swiper-item>
</swiper> -->
<view class="successTip" v-if="barrageStatus">
<template v-for="(item, index) of Barragelist">
<view class="picTxt acea-row row-middle" v-if="num == index" :key="index">
<view class="pictrue">
<image mode="aspectFill" :src="item.avatar" />
</view>
<view class="acea-row row-middle" style="flex: 1; overflow: hidden; white-space: nowrap;">
<view class="name line1">{{ item.nickname }}</view>
<view style="flex: 1; overflow: hidden; text-overflow: ellipsis">{{ item.status_name }}</view>
</view>
</view>
</template>
</view>
<view class="swiper" style="padding-bottom: 40rpx;">
<!-- <view v-if="special_validity == -1" class="validity">
<template v-if="special.validity">课程有效期为{{
special.validity
}}天,过期后需重新购买哦!</template>
<template v-else>课程永久有效哦!</template>
</view>
<view v-else-if="special_validity == 0" class="validity">课程永久有效哦!</view>
<view v-else-if="special_validity > 0" class="validity">
课程有效期剩余{{
special_validity | validityFormat
}},过期后需重新购买哦!
</view> -->
<view class="name txp1">
{{ special.title || "加载中" }}
</view>
<view class="swiper-int">
<view class="swiper-int-top">
<!-- <view class="swiper-int-top-left">
<view v-if="special.label.length" class="attr">
<view v-for="(item, idx) of special.label" :key="idx">{{
item
}}</view>
</view>
</view> -->
<view class="acea-row" style="flex-direction: column;line-height: 22rpx;">
<view class="pin-money" v-if="is_pay">
<text class="price">
<text>
{{ special.is_pink ? special.pink_money : special.money }}
</text>
</text>
<text class="vip-price" style="margin-left: 13rpx;">¥{{ special.member_money }}</text>
<img class="vip-price-icon" :src="getImgPath('/wap/first/zsff/images/vip.png')" />
</view>
<view class="pin-money" v-if="special.is_pink">
拼课价<text class="money">¥{{ special.pink_money }}</text>
</view>
<view class="study-count" style="color: #999999;font-size: 20rpx;margin-top: 16rpx;">{{ record.recordCoujnt }}人已学习</view>
</view>
</view>
<view class="collect" @click="handleCreateSharePoster">
<view class="iconfont">
<image :src="getImgPath('/wap/first/zsff/images/fenxiang.png')"></image>
</view>
<view>分享</view>
</view>
<view class="collect" @click="collect">
<view :class="[
'iconfont',
special.collect ? 'iconshoucang2' : 'iconshoucang11',
]"></view>
<view>{{ special.collect ? "已收藏" : "收藏" }}</view>
</view>
</view>
<join-vip></join-vip>
</view>
<!-- <view class="share">
<view v-if="special.service_code" class="share_wechat">
<view class="pinTip2 acea-row row-between-wrapper"
v-if="is_pay || (isMember && special.member_pay_type == 0)">
<view class="reminder line1">和小伙伴一起学习,有老师答疑哦~</view>
<view class="chatBnt acea-row row-center-wrapper" @click="open = false">
加入群聊
</view>
</view>
</view>
<view class="teacher-section">
<view class="teacher-table">
<view class="item">
<view class="num">{{ count }}</view>
<view>总节数</view>
</view>
<view class="item">
<view>
<template v-for="(item, index) in record.record">
<image mode="aspectFill" v-if="index < 5" :key="index" :src="item.avatar" />
</template>
</view>
<view class="learn">
<text class="child">已有</text>
<text class="child">{{ record.recordCoujnt }}</text>
<text class="child">人学习</text>
</view>
</view>
</view>
<view v-if="lecturer" class="teacher-detail-wrap">
<navigator class="a" :url="`/pages/merchant/teacher_detail?id=${special.lecturer_id}`">
<view class="detail-hd">
<view class="head">
<image class="image" mode="aspectFill" :src="lecturer.lecturer_head" />
</view>
<view class="text">
<view>{{ lecturer.lecturer_name }}</view>
<view v-if="lecturer.label.length">
<template v-for="(item, index) in lecturer.label">
<text class="text" v-if="index < 3" :key="index">{{ item }}</text>
</template>
</view>
</view>
<view class="iconfont iconxiangyou"></view>
</view>
</navigator>
</view>
</view>
</view> -->
<navigator v-if="lecturer" class="lecturer-info flex" :url="`/pages/merchant/teacher_detail?id=${special.lecturer_id}`">
<view class="info-avatar">
<image :src="lecturer && lecturer.lecturer_head" mode="aspectFill"></image>
</view>
<view class="info-box">
<view class="info-name">
{{ lecturer.lecturer_name }} <text>{{ lecturer.explain }}</text>
</view>
<view class="info-desc">{{ lecturer.explain }}</view>
</view>
<text class="more"></text>
</navigator>
<view v-if="materialList.length" class="material">
<navigator v-for="item in materialList" :key="item.id" :url="`/pages/special/data_details?id=${item.id}`">
<view>
<image mode="aspectFill" :src="item.image" alt="" />
</view>
<view>
<view>{{ item.title }}</view>
<view v-if="item.pay_type" class="money">
¥<text>{{ item.money }}</text>
</view>
<view v-else>免费</view>
<view>
<view>{{ item.ficti + item.sales }}人已下载</view>
<button type="button">去下载</button>
</view>
</view>
</navigator>
</view>
<view v-if="pinkIngList.length && is_pay == false" class="scroll-section">
<view class="label">已拼{{ scrollData.length }}件</view>
<swiper class="swiper-container" :autoplay="true" interval="2000" circular vertical>
<swiper-item class="swiper-wrapper">
<view v-for="(item, index) in scrollData" :key="index" class="swiper-slide">
{{ item.nickname }}拼团成功
</view>
</swiper-item>
</swiper>
</view>
<view class="list" v-if="pinkIngList.length && is_pay == false">
<view class="item acea-row row-middle" v-for="(item, k) of pinkIngList" :key="k">
<view class="pictrue">
<image mode="aspectFill" :src="item.avatar" />
</view>
<view class="name line1">{{ item.nickname }}</view>
<view class="left">
<view>
还差<text>{{ item.num }}人</text>成团
</view>
<view class="time">
剩余{{ item.difftime.hour }}:{{ item.difftime.minute }}:{{
item.difftime.second
}}
</view>
</view>
<view class="acea-row row-center-wrapper link" @click="goPink(item.id, item.uid, item.order_id)">
去拼单
<text class="iconfont iconxiangyou"></text>
</view>
</view>
</view>
<view v-if="special.is_pink" class="process-section">
<view class="title">拼团玩法</view>
<view class="list">
<view class="item">
<text>1</text>
<text>开团/参团</text>
</view>
<view class="item">
<text>2</text>
<text>邀请好友</text>
</view>
<view class="item">
<text>3</text>
<text>满员成团</text>
</view>
</view>
</view>
<!-- 导航栏 -->
<view ref="list" class="swiper-nav">
<view class="navCon acea-row row-middle">
<template v-if="special.type === 4">
<view v-for="nav in liveNavlist" :key="nav.value" :class="{ on: active === nav.value }" class="item"
@click="active = nav.value">
{{ nav.title }}
</view>
</template>
<!-- <template v-else-if="special.type === 5">
<view v-for="nav in cloumnNavlist" :key="nav.value" :class="{ on: active === nav.value }" class="item"
@click="active = nav.value">
{{ nav.title
}}<text v-if="nav.value === 5">({{ evaluateWhole }})</text>
</view>
</template> -->
<template v-else>
<view v-for="nav in otherNavlist" :key="nav.value" :class="{ on: active === nav.value }" class="item"
@click="active = nav.value">
{{ nav.title
}}<text v-if="nav.value === 5">({{ evaluateWhole }})</text>
</view>
</template>
</view>
</view>
<!-- 详情 -->
<mp-html v-if="active === 2" class="swiper-conter" container-style="padding: 0 30rpx;background: #ffffff;width: 690rpx; margin: 0 auto;"
:content="special.content"></mp-html>
<template v-if="special.type === 4">
<!-- 回放目录 -->
<view v-if="active === 1" class="replay-directory">
<view v-if="liveTaskList.length">
<view v-for="(item, index) in liveTaskList" :key="index" :class="{ active: RecordId === item.RecordId }"
class="item" @click="playBackRecord(item.RecordId)">
<view class="label">回放</view>
<view class="name">
{{ index | serial }} |
{{ item.playback_name || special.title }}
</view>
<view></view>
</view>
</view>
<view class="foot">
<text v-if="liveLoading" class="fa fa-spinner loadingpic"></text>
</view>
</view>
</template>
<view v-else class="mulu">
<view v-if="active === 1">
<view ref="list">
<!-- 专栏目录 -->
<view v-if="special.type === 5" class="parent-catalogue">
<view v-for="specialItem of otherTaskList" :key="specialItem.id"
:class="{ active: specialItem.active }" @click="show(specialItem)">
<view class="parent-title">
<view class="name">{{ specialItem.title }}</view>
<view :class="[
specialItem.active ? 'iconxiangshang' : 'iconxiangxia',
'iconfont',
]"></view>
</view>
<view v-if="specialItem.special_task.length" class="catalogue">
<view v-for="(item, index) of specialItem.special_task" :key="item.id" @click.stop="play(item)">
<view>
<image src="@/static/images/special/video.png" />
</view>
<view class="text">
<view class="title">
{{ index >= 9 ? index + 1 : "0" + (index + 1) }}.
{{ item.title }}
</view>
<view class="try-progress">
<view v-if="
!is_pay &&
(special.member_pay_type || !isMember) &&
item.is_free &&
item.is_try
" class="try">
试看
</view>
<template v-if="
isLogin &&
(is_pay || (!special.member_pay_type && isMember))
">
<view v-if="item.watch && item.watch.percentage" class="progress">
已学习
</view>
<view v-else class="progress no">未学习</view>
</template>
</view>
</view>
<view class="status">
<i v-if="item.is_free" :class="[
item.pay_status ? 'iconsuozi' : 'iconziyuan2',
'iconfont',
]"></i>
<text v-else class="free">免费</text>
</view>
</view>
</view>
</view>
</view>
<!-- 专题目录 -->
<view v-else class="catalogue">
<view v-for="(item, index) in otherTaskList" :key="item.id" @click="play(item)">
<view>
<image src="@/static/images/special/video.png" />
</view>
<view class="text">
<view class="title">
{{ index >= 9 ? index + 1 : "0" + (index + 1) }}.
{{ item.title }}
</view>
<view class="try-progress">
<view v-if="
!is_pay &&
(special.member_pay_type || !isMember) &&
item.is_free &&
item.is_try
" class="try">
试看
</view>
<template v-if="
isLogin &&
(is_pay || (!special.member_pay_type && isMember))
">
<view v-if="item.watch && item.watch.percentage" class="progress">
已学习
</view>
<view v-else class="progress no">未学习</view>
</template>
</view>
</view>
<view class="status">
<i v-if="item.is_free" :class="[
item.pay_status ? 'iconsuozi' : 'iconziyuan2',
'iconfont',
]"></i>
<text v-else class="free">免费</text>
</view>
</view>
</view>
</view>
<view class="loading-line" style="background-color: #ffffff">
<text v-if="otherLoading == true" class="fa fa-spinner loadingpic" style="font-size: 40rpx"></text>
<text>{{ otherLoadTitle || "加载更多" }}</text>
</view>
</view>
</view>
<!-- 专栏套餐 -->
<template v-if="special.type === 5">
<view v-if="active === 6" class="video-list" style="-webkit-overflow-scrolling: touch">
<view v-if="columnTaskList.length" ref="list">
<view class="video-listn" style="padding: 30rpx 0">
<view class="item acea-row row-between-wrapper" :key="idx" v-for="(vo, idx) in columnTaskList"
@click="setMeal(vo)">
<view class="pictrue" @click="play(vo)" style="position: relative">
<image :src="vo.image" mode="aspectFill" />
<view class="label">{{ specialType[vo.type] }}</view>
</view>
<view class="underline">
<view class="text acea-row row-between row-column">
<view class="name line1" v-text="vo.title" @click="setMeal(vo)"></view>
<view v-if="vo.label.length" class="attr">
<view v-for="(item, idx) in vo.label" :key="idx">{{
item
}}</view>
</view>
<template v-if="special.pay_type">
<template v-if="vo.pay_status">
<template v-if="isMember">
<view v-if="vo.member_pay_type" class="price">
¥{{
vo.member_money === "0.00"
? vo.money
: vo.member_money
}}
</view>
<view v-else class="free">去学习</view>
</template>
<view v-else class="price">
¥<text>{{ vo.money }}</text>
</view>
</template>
<view v-else class="free">去学习</view>
</template>
<view v-else class="free">去学习</view>
</view>
</view>
</view>
</view>
</view>
<view class="loading-line" style="background-color: #ffffff">
<text v-if="columnLoading == true" class="fa fa-spinner loadingpic" style="font-size: 40rpx"></text>
<text>{{ columnLoadTitle || "加载更多" }}</text>
</view>
</view>
</template>
<template v-if="special.type !== 4">
<!-- 练习 -->
<view v-if="active === 3" class="problem-section">
<view v-if="problemList.length" class="problem-list">
<view v-for="item of problemList" :key="item.id" class="item">
<view :class="{ lock: !is_pay }" class="title">{{
item.title
}}</view>
<view class="group">
<view class="progress">
<view :style="{ width: item.rate + '%' }"></view>
</view>
<view class="people">
<text>{{ item.rate + "%" }}</text>{{ item.answer }}人已答题
</view>
<view class="exercise-btn" @click="goQuestion(item)">
<image mode="widthFix" :src="getImgPath('/wap/first/zsff/images/question07.png')" />练习
</view>
</view>
</view>
</view>
</view>
<!-- 考试 -->
<view v-if="active === 4" class="question-section">
<view v-if="questionList.length" class="list">
<view v-for="item in questionList" :key="item.id" @click="goQuestion(item)" class="item">
<view>
<image :src="item.image" mode="aspectFill" />
</view>
<view>
<view>{{ item.title }}</view>
<view>
<view>共{{ item.item_number }}题</view>
<view v-if="is_pay" class="btn">
<image :src="
getImgPath(`/wap/first/zsff/images/question07.png`)
" />答题
</view>
<view v-else>
<image class="lock" :src="
getImgPath(`/wap/first/zsff/images/question06.png`)
" />
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 评价 -->
<view v-if="active === 5" class="evaluate-section">
<view class="head">
<view class="score">
<view>
<text>{{ evaluateScore }}</text>分
</view>
<view>课程评分</view>
</view>
<button type="button" class="flex-center flex" @click="userEvaluate">
我要评价
</button>
</view>
<EvaluateList :evaluate-list="evaluateList" />
<view v-if="evaluateLoading" class="loading">
<i class="fa fa-spinner fa-spin"></i>
</view>
<view v-if="evaluateFinished && evaluateList.length" class="finished">
已全部加载完
</view>
<view v-if="evaluateFinished && !evaluateList.length" class="empty">
<image :src="getImgPath('/wap/first/zsff/images/empty.png')" alt="暂无评价" />
<view>暂无评价</view>
</view>
</view>
</template>
</view>
</view>
<view class="acea-row row-middle footer" ref="storeMenu"
v-if="is_pay == false && is_gift == false && isPink == false">
<navigator class="link" url="/pages/index/index" open-type="switchTab">
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/home.png')" />
<view>首页</view>
</view>
</navigator>
<!-- 抖音客服 -->
<view class="link" v-if="TOUTIAO_STATUS">
<view class="cont">
<view>
<button class="im" open-type="im" :data-im-id="imId" bindim="imCallback" binderror="onimError">
<image :src="getImgPath('/wap/first/zsff/images/chat.png')" />
客服</button>
</view>
</view>
</view>
<!-- 系统客服 -->
<view class="link" v-else @click="customerService">
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/chat.png')" />
<view>客服</view>
</view>
</view>
<view v-if="(special.pay_type == 1 && special.type == 4) || special.money > 0" class="link" @click="OpenPay(1)">
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/link.png')" />
<view>送朋友</view>
</view>
</view>
<view class="wrap">
<view class="video_footer_btn acea-row" :class="special.pay_type == 1 ? '' : 'item2'">
<view class="video_footer_btn_left acea-row row-column row-center-wrapper" v-if="
special.is_pink &&
((special.member_pay_type == 1 && isMember == 1) || isMember == 0)
" @click="OpenPay(3)">
<text class="video_footer_btn_left_pic">¥{{ special.pink_money }}</text>
<text class="video_footer_btn_left_num">{{ special.pink_number }}人团</text>
</view>
<view class="video_footer_btn_right acea-row" :class="
special.is_pink == 0 ||
(special.is_pink && isMember == 1 && special.member_pay_type == 0)
? 'on'
: ''
" v-if="special.type == 4">
<text :class="xtt_class" @click="OpenPay(6)" v-if="
special.pay_type == 0 ||
(special.member_pay_type == 0 && isMember) ||
is_pay
">进入直播间</text>
<text :class="xtt_class" @click="OpenPay(2)" v-if="isMember == 1 && special.member_pay_type == 1">¥{{
special.member_money }}</text>
<text :class="xtt_class" @click="OpenPay(2)" v-if="isMember == 0 && special.pay_type == 1">¥{{
special.money
}}</text>
</view>
<view class="video_footer_btn_right acea-row" :class="
special.is_pink == 0 ||
(special.is_pink && isMember == 1 && special.member_pay_type == 0)
? 'on'
: ''
" v-if="special.type != 4">
<text v-if="
special.pay_type == 0 ||
(special.member_pay_type == 0 && isMember) ||
is_pay
" @click="OpenPay(5)" :class="xtt_class">免费学习</text>
<text v-if="isMember == 1 && special.member_pay_type == 1" @click="OpenPay(2)" :class="xtt_class">¥{{
special.member_money }}</text>
<text v-if="isMember == 0 && special.pay_type == 1" @click="OpenPay(2)" :class="xtt_class">{{
special.money
}}</text>
</view>
</view>
</view>
</view>
<view class="acea-row row-wrap-all footer" ref="storeMenu"
v-if="is_pay == true && is_gift == false && paid && isPink == false">
<navigator class="link" open-type="switchTab" url="/pages/index/index">
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/home.png')" />
<view>首页</view>
</view>
</navigator>
<!-- 抖音客服 -->
<view class="link" v-if="TOUTIAO_STATUS">
<view class="cont">
<view>
<button class="im" open-type="im" :data-im-id="imId" bindim="imCallback" binderror="onimError">
<image :src="getImgPath('/wap/first/zsff/images/chat.png')" />
客服</button>
</view>
</view>
</view>
<!-- 系统客服 -->
<view class="link" @click="customerService" v-else>
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/chat.png')" />
<view>客服</view>
</view>
</view>
<view v-if="(special.pay_type == 1 && special.type == 4) || special.money > 0" class="link" @click="OpenPay(1)">
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/link.png')" />
<view>送朋友</view>
</view>
</view>
<view class="wrap">
<view class="video_footer_btn acea-row">
<view :class="xtt_class2" v-if="special.type != 4" @click="OpenPay(5)">
<text class="video_footer_btn_left_pic">去学习</text>
</view>
<view :class="xtt_class2" v-if="special.type == 4" @click="OpenPay(6)">
<text class="video_footer_btn_left_pic">进入直播间</text>
</view>
</view>
</view>
</view>
<view class="acea-row row-wrap-all footer" v-if="isPink" ref="storeMenu">
<navigator class="link" open-type="switchTab" url="/pages/index/index">
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/home.png')" />
<view>首页</view>
</view>
</navigator>
<!-- 抖音客服 -->
<view class="link" v-if="TOUTIAO_STATUS">
<view class="cont">
<view>
<button class="im" open-type="im" :data-im-id="imId" bindim="imCallback" binderror="onimError">
<image :src="getImgPath('/wap/first/zsff/images/chat.png')" />
客服</button>
</view>
</view>
</view>
<!-- 系统客服 -->
<view class="link" @click="customerService" v-else>
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/chat.png')" />
<view>客服</view>
</view>
</view>
<view class="link" @click="OpenPay(1)">
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/link.png')" />
<view>送朋友</view>
</view>
</view>
<view class="wrap">
<view class="video_footer_btn acea-row">
<view :class="xtt_class2" @click="goPink(0, uid, pinkOrderId, oid)">
<text class="video_footer_btn_left_pic">查看拼课详情</text>
</view>
</view>
</view>
</view>
<view class="acea-row row-middle footer" v-if="is_gift" ref="storeMenu">
<navigator class="link" open-type="switchTab" url="/pages/index/index">
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/special01.png')" />
<view>首页</view>
</view>
</navigator>
<!-- 抖音客服 -->
<view class="link" v-if="TOUTIAO_STATUS">
<view class="cont">
<view>
<button class="im" open-type="im" :data-im-id="imId" bindim="imCallback" binderror="onimError">
<image :src="getImgPath('/wap/first/zsff/images/chat.png')" />
客服</button>
</view>
</view>
</view>
<!-- 系统客服 -->
<view class="link" @click="customerService" v-else>
<view class="cont">
<image :src="getImgPath('/wap/first/zsff/images/special02.png')" />
<view>客服</view>
</view>
</view>
<view class="wrap">
<view class="video_footer_btn acea-row">
<view :class="xtt_class2" @click="OpenPay(4)">
<text class="video_footer_btn_left_pic">领取课程</text>
</view>
</view>
</view>
</view>
</template>
<!-- 遮罩层 -->
<view :class="{ mask: dialogShow || password || is_poster || imgSrc || !open }" @touchmove.prevent
@click.self="maskClick"></view>
<!-- 加入群聊弹窗 -->
<view :class="{ show: !open }" class="dialog" v-if="!open">
<image :src="special.service_code" />
<view>长按扫一扫</view>
<view>加客服好友进群哦</view>
</view>
<!-- 关注公众号弹窗 -->
<view class="mask flex flex-center-x" @touchmove.prevent v-if="is_code" @click="is_code = false">
<image :src="wechat_qrcode" alt="" style="width: 500rpx; height: 500rpx; margin: 0 auto" />
</view>
<!-- 兑换码 -->
<view class="exchange-guide" v-if="isBatch && !is_pay" @click="getexchange">
<i class="iconfont iconicon-life-gift"></i> 兑换码 <i class="iconfont iconxiangyou"></i>
</view>
<!-- 直播间密码弹窗 -->
<view :class="{ on: password }" class="password">
<view class="title">请输入密码</view>
<input type="password" v-model="qr_password" autocomplete="off" />
<input type="hidden" v-model="studio_pwd" autocomplete="off" />
<view class="psdBnt" @click="goLive">确定</view>
</view>
<!-- 分享海报 -->
<view v-if="is_poster" class="poster">
<image mode="widthFix" :src="filename" />
<view v-if="filename">长按保存,分享朋友</view>
</view>
<!-- 完课证书 -->
<view v-if="imgSrc" class="certificate-image">
<image mode="widthFix" :src="imgSrc" />
</view>
<PayDialog v-if="init" :open.sync="payDialogOpen" :money="money" :now_money="now_money"
:memberMoney="Number(special.member_money)" :memberLink="memberLink" :isMember="!!isMember"
:special_id="special_id" :link_pay_uid="link_pay_uid" :pay_type_num="pay_type_num" :pink-id="pinkId"
:is-wechat="isWechat" :is-alipay="is_alipay" :is-balance="is_yue" :isMembership="true"
@fatherMethod="fatherMethod" :template-id="templateId" :wxpay-h5="wxpayH5" @change="changeVal" />
<!-- 评价弹窗 -->
<EvaluateDialog :dialog-show="dialogShow" :rate-value="rateValue" :image-list="imageList" @rate-change="rateChange"
@image-upload="imageUpload" @image-delete="imageDelete" @evaluate-submit="evaluateSubmit" />
<!-- 分享返佣 -->
<RebateGuide v-if="rebateMoney && isShareDisplaySwitch" :rebate-money="rebateMoney" @rebate-action="rebateAction" />
<TkiQrcode loadMake v-if="infoLoading && isQrcodeCanvasVisable" ref="qrcode" :showLoading="false" :val="qrcodeText"
@result="handleQrcodeCreateSuccess" />
<canvas canvas-id="poster" v-if="isPosterCanvasVisable" class="poster-canvas" />
<canvas canvas-id="poster2" v-if="isPosterCanvasVisable2" class="poster-canvas2" />
</BaseContainer>
</template>
<script>
import {
validitySpecial,
getSpecialNumberCourse,
addLearningRecords,
getLearningRecords,
getSpecialInfo,
getSpecialList,
getTopicSpecialTestPaper,
getSpecialTemplateIds,
getSpecialMaterial,
getSpecialReplyData,
getSpecialReplyList,
getGroupList,
getInspectData,
getSpecialCertificate,
getSpecialCertificateInfo,
getCourseList,
getColumnTask,
getLiveRecordList,
submitSpecialComment,
getBarrageList,
// setBarrageIndex,
getTaskLink,
getSpecialPlayNum,
collectSpecial,
receiveGift,
getSpecialPinkList,
aliPayApp,
aliPayWap,
delSpecialOrder,
getGiftToken,
getMemberRechargeApi
} from "@/api/special";
import { getLecturer, getRebateAmount } from "@/api/auth";
import specialType from "@/constants/special-type";
import mpHtml from "mp-html/dist/uni-app/components/mp-html/mp-html.vue";
import EvaluateList from "@/components/EvaluateList/index.vue";
import RebateGuide from "@/components/RebateGuide/index.vue";
import EvaluateDialog from "@/components/EvaluateDialog/index.vue";
import userInfoMixins from "@/mixins/userInfo";
import PayDialog from "@/components/PayDialog/index.vue";
import posterMixin from "@/mixins/poster";
import JoinVip from '@/components/JoinVip/index.vue';
import config from "@/config/index";
import { precheckLive } from "@/api/live";
import dayjs from "dayjs";
import { CUSTOMER_DETAIL_TYPE, CUSTOMER_SUPPORT_TYPE } from '@/constants/customer-type';
const { BASE_LIVE_URL } = config;
export default {
mixins: [userInfoMixins, posterMixin],
components: {
mpHtml,
EvaluateList,
RebateGuide,
EvaluateDialog,
PayDialog,
JoinVip,
},
filters: {
serial(value) {
return value < 9 ? "0" + (value + 1) : value + 1;
},
validityFormat(value) {
let result = "";
let days = Math.floor(value / 60 / 60 / 24);
let hours = Math.floor((value / 60 / 60) % 24);
let minutes = Math.floor((value / 60) % 60);
if (days) {
result += days + "天";
}
if (hours) {
result += hours + "小时";
}
return result + minutes + "分钟";
},
},
data() {
return {
imId:"",
memberLink: '',
memberMoney: '',
xtt_class:
"acea-row row-center-wrapper video_footer_btn_left_pic flex-auto",
xtt_class2:
"video_footer_btn_right acea-row row-column row-center-wrapper on",
init: false,
poster_image: "",
navTitle: "",
BarrageShowTime: 5,
infoLoading: false,
comment_switch: false,
special_id: 0,
parentActive: 0,
site_name: "",
RecordId: "",
count: 0,
special: {},
swiperlist: [],
pinkIngList: [],
otherTaskList: [],
columnTaskList: [],
liveTaskList: [],
cloumnNavlist: [
{
title: "目录",
value: 1,
},
{
title: "套餐",
value: 6,
},
{
title: "详情",
value: 2,
},
{
title: "评价",
value: 5,
},
],
otherNavlist: [
{
title: "目录",
value: 1,
},
{
title: "详情",
value: 2,
},
{
title: "评价",
value: 5,
},
],
liveNavlist: [
{
title: "回放目录",
value: 1,
},
{
title: "直播介绍",
value: 2,
},
],
active: 1,
open: true,
payDialogOpen: false, // 是否显示支付弹窗
loginShow: false,
is_pay: false,
isMember: 0,
otherLoading: false,
columnLoading: false,
liveLoading: false,
otherLoadend: false,
columnLoadend: false,
liveLoadend: false,
otherLoaded: false,
columnLoaded: false,
liveLoaded: false,
pay_type_num: -1,
pinkId: 0,
pinkInfo: {
pinkT: {
difftime: { hour: "00", minute: "00", second: "00" },
},
},
Barragelist: [],
otherLoadTitle: "上拉加载更多",
columnLoadTitle: "上拉加载更多",
liveLoadTitle: "上拉加载更多",
money: 0,
where: {
page: 1,
limit: 16,
special_id: 0,
source_id: 0,
},
where2: {
page: 1,
limit: 16,
special_id: 0,
source_id: 0,
},
orderId: null,
is_gift: false,
paid: false,
link_pay: false,
link_pay_uid: 0,
uid: 0,
wechat_qrcode: "",
is_code: false,
isWechat: false,
is_live: false,
url: "/pages/index/login",
isPink: false,
pinkOrderId: '',
oid: 0,
barrageStatus: true,
num: null,
stream_name: "",
password: false,
liveInfo: {},
qr_password: "",
studio_pwd: null,
is_alipay: false, //支付宝是否开启
is_yue: false, //余额是否开启
now_money: 0, //余额
lecturer: null,
specialType,
topFocus: true,
record: {
recordCoujnt: 0,
},
scrollData: [],
templateId: "",
problemList: [],
questionList: [],
is_poster: false,
filename: "",
imgSrc: "",
wxpayH5: false,
dialogShow: false,
rateValue: 5, // 评价打分
imageList: [], // 评价上传图片
evaluateList: [],
evaluateLoading: false,
evaluateFinished: false,
evaluatePage: 1,
evaluateLimit: 10,
evaluateWhole: 0,
evaluateScore: 0,
isBatch: false,
materialList: [],
special_validity: -1, // -1 未购买显示课程有效期 0 已购买并永久 >0 已购买并有有效期
rebateMoney: 0,
isShareDisplaySwitch: false,
isOpenWeixing: false,
gift_uid: 0,
gift_order_id: 0,
gift: 0,
spread_uid: 0,
isPosterCanvasVisable2: false,
site_url: '',
TOUTIAO_STATUS:false
};
},
watch: {
pay_type_num() {
this.getSubscribeId();
},
},
onShow() {
if (this.isOpenWeixing && this.orderId) {
this.$util.wxh5PayIsSuccess(this.orderId, 1, this);
this.isOpenWeixing = false;
}
this.getSpecialInfo();
},
onUnload() {
clearInterval(this.timerFlag);
},
onLoad(options) {
let id = 0;
const parmData = this.$util.mergeLaunchParams(options)
if (parmData.id) id = parmData.id;
if (parmData.goid) {
this.gift = 1
this.spread_uid = parmData.guid
this.gift_order_id = parmData.goid
this.gift_uid = parmData.guid
}
this.special_id = Number(id);
if (this.special_id) {
this.where.special_id = this.special_id;
this.where2.special_id = this.special_id;
}
this.getSpecialInfo().then(() => {
this.getLecturer();
this.getPinkIngLists();
this.getProblem();
this.getPinkInfo();
if (this.special.type != 4) {
this.getInspect();
if (this.comment_switch) {
this.getEvaluateStatus();
this.getEvaluateList();
} else {
if (this.special == 5) {
for (let i = 0; i < this.cloumnNavlist.length; i++) {
if (this.cloumnNavlist[i].value == 5) {
this.cloumnNavlist.splice(i, 1);
break;
}
}
} else {
for (let j = 0; j < this.otherNavlist.length; j++) {
if (this.otherNavlist[j].value == 5) {
this.otherNavlist.splice(j, 1);
break;
}
}
}
}
}
this.getCourseLiveData();
});
this.validitySpecial();
this.getNumberCourses();
this.addLearningRecords();
this.getSubscribeId();
this.specialMaterial();
this.rebateAmount();
this.getGroupList();
this.getMemberRecharge();
/* #ifdef MP-TOUTIAO */
this.TOUTIAO_STATUS = true;
/* #endif */
},
created() {
//#ifdef MP-WEIXIN
wx.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline']
});
//#endif
},
// 分享朋友
onShareAppMessage() {
console.log();
return { title: this.special.title, path: '/pages/special/details?id=' + this.special_id+'&spread_uid='+(this.userInfo.uid??0) }
},
onShareTimeline() {
return {
title: this.special.title,
imageUrl: this.swiperlist[0]
};
},
onReachBottom() {
if (this.active === 1) {
if (this.special.type === 4) {
this.getLiveTask();
} else {
this.getCourseList();
}
}
if (this.active === 6) {
this.getCloumnTask();
}
if (this.active === 5) {
this.getEvaluateList();
}
},
computed: {
shareQrcodeData() {
return {
spread_uid: this.userInfo?.uid,
id: this.special_id,
};
},
},
methods: {
imCallback(e) {
console.log("跳转IM客服成功", e.detail);
},
onimError(e) {
console.log("拉起IM客服失败", e.detail);
},
fatherMethod() {
this.init = false;
},
getMemberRecharge() {
getMemberRechargeApi().then(res => {
this.memberLink = res.data.url;
}).catch(err => {
// console.log(err)
})
},
getGroupList() {
getGroupList(this.special_id).then((res) => {
this.scrollData = res.data;
});
},
async getPinkInfo() {
if (!this.pinkId) return;
try {
const { data } = await this.getPinkInfo(this.pinkId);
this.pinkInfo = data;
this.CountDown({ name: "pinkInfo.pinkT", time_name: "stop_time" });
} catch (err) { }
},
getCourseLiveData() {
switch (this.special.type) {
case 5:
this.getCourseList();
this.getCloumnTask();
break;
case 4:
this.getLiveTask();
break;
case 1:
case 2:
case 3:
case 6:
this.getCourseList();
break;
}
},
validitySpecial() {
validitySpecial(this.special_id).then(({ data }) => {
this.special_validity = data.validity;
});
},
// 点击我要评价
userEvaluate() {
this.$util.checkLogin(() => {
if (
!(this.is_pay || (!this.special.member_pay_type && this.isMember))
) {
uni.showModal({
title: "提示",
content: "购买后即可进行评价,是否购买?",
confirmText: "购买",
success: ({ confirm }) => {
if (!confirm) return;
this.payDialogOpen = true;
this.init = true;
},
});
} else {
this.dialogShow = true;
}
}, true);
},
getexchange() {
this.$util.checkLogin(() => {
uni.navigateTo({
url: `/pages/special/exchange?special_id=${this.special_id}`
});
}, true);
},
// 获取评价状态
getEvaluateStatus() {
getSpecialReplyData(this.special_id).then((resData) => {
if (resData.code === 200) {
let data = resData.data;
this.evaluateWhole = data.whole;
this.evaluateScore = data.score;
} else {
this.$util.showMsg(resData.msg);
}
});
},
// 获取评价列表
async getEvaluateList() {
if (this.evaluateLoading || this.evaluateFinished) {
return;
}
this.evaluateLoading = true;
try {
const resData = await getSpecialReplyList(
this.special_id,
this.evaluatePage++,
this.evaluateLimit
);
if (resData.code === 200) {
let data = resData.data;
this.evaluateList = this.evaluateList.concat(data);
this.evaluateFinished = this.evaluateLimit > data.length;
} else {
this.$util.showMsg(resData.msg);
}
} catch (err) { }
this.evaluateLoading = false;
},
// 点击遮罩层
maskClick() {
this.dialogShow = false;
this.password = false;
this.is_poster = false;
this.open = true;
this.imgSrc = "";
},
// 提交评价
async evaluateSubmit(text) {
uni.showLoading({ mask: true });
try {
const { msg } = await submitSpecialComment(this.special_id, {
satisfied_score: this.rateValue,
comment: text.trim(),
pics: this.imageList,
});
uni.hideLoading();
this.$util.showMsg(msg);
this.dialogShow = false;
this.getEvaluateStatus();
this.evaluateFinished = false;
this.evaluatePage = 1;
this.evaluateList = [];
this.getEvaluateList();
} catch (err) {
uni.hideLoading();
this.$util.showMsg(err.msg);
}
},
// 删除图片
imageDelete(index) {
this.imageList.splice(index, 1);
},
// 上传图片
imageUpload(path) {
this.imageList.push(path);
},
// 评分
rateChange(value) {
this.rateValue = value;
},
handleQrcodeCreateSuccess(path) {
this.x_cb(path);
},
handleCreateSharePoster() {
this.$util.checkLogin(() => {
this.poster_image = this.special.poster_image;
this.createSharePoster("poster", {
id: this.special_id,
spread_uid: this.userInfo?.uid,
url: 'pages/special/details'
});
}, true);
},
// 是否可以发放证书
getInspect() {
getInspectData(this.special_id)
.then((res) => {
if (200 == res.code) {
uni.showModal({
title: "提示",
content: "恭喜您已达到证书发放标准,是否领取?",
confirmText: "领取",
cancelText: "取消",
success: ({ confirm }) => {
if (!confirm) return;
this.getCertificate();
},
});
}
})
.catch((err) => {
// console.log(err);
});
},
async renderProductPoster2(data) {
this.isPosterCanvasVisable2 = true
let id = "poster2"
let task1 = this.$util.getImagePath(data.certificate.background);
let task2 = this.$util.getImagePath(data.certificate.qr_code);
const [bgPath, codePath] = await Promise.all([task1, task2]);
let WIDTH = 600;
let HEIGHT = 850;
let site_name = "知识付费"
let context = uni.createCanvasContext(id);
context.drawImage(bgPath, 0, 0);
context.drawImage(codePath, 220, 557, 160, 160);
context.fillStyle = "rgba(255, 255, 255, 0.8)";
context.fillRect(220, 724, 160, 36);
context.font = "bold 34px sans-serif";
context.textAlign = "center";
context.fillStyle = "#29466D";
context.fillText(data.nickname, 300, 296);
context.font = "24px sans-serif";
context.fillText(
"颁发时间:" +
dayjs(data.add_time * 1000).format("YYYY.MM.DD"),
300,
490
);
context.font = "20px sans-serif";
context.fillStyle = "#666666";
context.fillText("长按二维码查看", 300, 748);
context.font = "28px sans-serif";
context.textAlign = "start";
context.fillStyle = "#333333";
let lineWidth = 0;
let substringFrom = 0;
let offsetTop = 364;
for (let i = 0; i < data.certificate.explain.length; i++) {
lineWidth += context.measureText(
data.certificate.explain[i]
).width;
if (lineWidth > 434) {
context.fillText(
data.certificate.explain.substring(substringFrom, i),
83,
offsetTop
);
lineWidth = 0;
substringFrom = i;
offsetTop += 50;
}
if (i == data.certificate.explain.length - 1) {
context.fillText(
data.certificate.explain.substring(substringFrom, i),
83,
offsetTop
);
}
}
context.draw(true, () => {
uni.canvasToTempFilePath(
{
canvasId: id,
fileType: "png",
destWidth: WIDTH,
destHeight: HEIGHT,
success: (res) => {
this.isPosterCanvasVisable2 = false
uni.previewImage({
current: 0,
urls: [res.tempFilePath],
})
context = null;
},
fail: (err) => {
this.isPosterCanvasVisable2 = false
context = null;
},
}
);
});
},
// 领取证书
getCertificate() {
getSpecialCertificate(this.special_id).then((res) => {
this.$util.showMsg("领取成功,证书制作中…");
this.getCertificateInfo(res.msg);
});
},
// 获取证书信息
getCertificateInfo(id) {
getSpecialCertificateInfo(id).then((res) => {
this.renderProductPoster2(res.data);
});
},
// 去练习、答题
goQuestion(question) {
this.$util.checkLogin(() => {
if (question.is_pay || this.is_pay) {
if (question.type == 1) {
uni.navigateTo({
url: `/pages/topic/problem_index?id=${question.id}`,
});
} else {
uni.navigateTo({
url: `/pages/special/question_index?id=${question.id}`,
});
}
} else {
this.init = true;
this.pay_type_num = 2;
this.payDialogOpen = true;
}
}, true);
},
// 获取练习
async getProblem() {
try {
const { data: questions } = await getTopicSpecialTestPaper(
this.special_id
);
if (questions.length) {
if (this.special.type === 5) {
this.cloumnNavlist.splice(this.cloumnNavlist.length - 1, 0, {
title: "练习",
value: 3,
});
} else {
this.otherNavlist.splice(this.otherNavlist.length - 1, 0, {
title: "练习",
value: 3,
});
}
for (var i = questions.length; i--;) {
questions[i].rate = Math.floor(
(questions[i].done / questions[i].item_number) * 100
);
}
this.problemList = questions;
}
} catch (err) { }
this.getQuestion();
},
// 获取考试
getQuestion() {
getTopicSpecialTestPaper(this.special_id, 2).then(
({ data: questions }) => {
if (questions.length) {
console.log(this.special.type, 1472);
if (this.special.type === 5) {
this.cloumnNavlist.splice(this.cloumnNavlist.length - 1, 0, {
title: "考试",
value: 4,
});
} else {
this.otherNavlist.splice(this.otherNavlist.length - 1, 0, {
title: "考试",
value: 4,
});
console.log(this.otherNavlist);
}
}
this.questionList = questions;
}
);
},
// 获取订阅通知模板id
getSubscribeId() {
if (!this.isWechat) {
return;
}
getSpecialTemplateIds(this.pay_type_num, this.special_id).then((res) => {
this.templateId = res.msg;
});
},
show(special) {
// if (special.is_light) {
// window.location.href = "{:url('special/single_details')}?id=" + special.id;
// } else {
// special.active = !special.active;
// }
special.active = !special.active;
},
// 讲师详情
getLecturer() {
getLecturer(this.special.mer_id).then(({ data }) => {
this.lecturer = data;
});
},
getSpecialInfo() {
return getSpecialInfo(this.special_id, this.gift_uid, this.gift_order_id, this.gift, this.spread_uid)
.then(({ data }) => {
const {
special,
orderId,
isPay,
gift,
is_member,
link_pay,
pinkId,
wechat_qrcode,
link_pay_uid,
isWechat,
BarrageShowTime,
isPink,
pinkOrderId,
oid,
barrage_index,
liveInfo,
is_alipay,
site_url,
is_yue,
now_money,
wxpayH5,
share_display,
uid,
isBatch,
comment_switch,
d_im
} = data;
Object.assign(this, {
navTitle: special.title,
infoLoading: true,
orderId,
is_gift: !!gift,
link_pay: !!link_pay,
link_pay_uid: link_pay ? link_pay_uid : 0,
comment_switch,
isBatch,
uid,
BarrageShowTime,
special: special.special,
swiperlist: special.swiperlist,
is_pay: isPay,
paid: isPay,
isMember: is_member,
pinkId,
money: Number(special.special.money),
wechat_qrcode,
isWechat,
is_live: special.special.is_live,
url: isWechat ? "/pages/index/login" : "/pages/login/phone_check",
isPink,
pinkOrderId,
oid,
num: barrage_index,
stream_name: liveInfo.stream_name || "",
liveInfo,
studio_pwd: liveInfo.studio_pwd,
is_alipay: !!is_alipay,
site_url: site_url,
is_yue: !!is_yue,
now_money: Number(now_money),
wxpayH5,
isShareDisplaySwitch: share_display,
imId:d_im
});
this.barrage();
})
.catch((err) => {
this.$util.showMsg(err.msg);
setTimeout(() => {
// #ifndef MP
uni.reLaunch({
url: '/pages/index/index'
})
// #endif
// #ifdef MP
uni.navigateBack({
fail: (err) => {
uni.switchTab({
url: '/pages/index/index'
});
}
})
// #endif
}, 2000);
});
},
// 获取浏览人数
getLearningRecords() {
getLearningRecords(this.special_id).then(({ data }) => {
this.record = data;
});
},
// 记录浏览人数
addLearningRecords() {
addLearningRecords(this.special_id).then(() => {
this.getLearningRecords();
});
},
// 拼团列表
getPinkIngLists() {
if (!this.special.is_pink) return;
getSpecialPinkList(this.special_id, 0).then(({ data }) => {
this.pinkIngList = data;
this.CountDown({ name: "pinkIngList", time_name: "stop_time" });
});
},
// 专题下章节数量
getNumberCourses() {
getSpecialNumberCourse(this.special_id).then(({ data }) => {
this.count = data;
});
},
goLive() {
if (!this.qr_password) return this.$util.showMsg("请输入密码");
if (this.qr_password != this.studio_pwd)
return this.$util.showMsg("密码不正确");
uni.navigateTo({
url: `/pages/live/index?${this.$util.objToParam({
stream_name: this.stream_name,
record_id: this.RecordId,
})}`,
});
// document.cookie =
// this.stream_name +
// "studio_pwd" +
// "=" +
// this.studio_pwd +
// ";expires=7200" +
// ";path=/";
// window.location.href = $h.U({
// c: "live",
// a: "index",
// q: { stream_name: this.stream_name, record_id: this.RecordId },
// });
},
barrage() {
if (typeof this.BarrageShowTime == "string")
this.BarrageShowTime = parseInt(this.BarrageShowTime);
this.BarrageShowTime = this.BarrageShowTime * 1000;
getBarrageList(this.special_id).then(({ data }) => {
this.$set(this, "Barragelist", data);
this.Barragelist = this.Barragelist || [];
let len = this.Barragelist.length;
if (!len) return;
// this.timerFlag = setInterval(() => {
// this.num = this.num + 1;
// this.num = this.num >= len ? 0 : this.num;
// this.num = this.num < 0 ? 0 : this.num;
// this.barrageStatus = !this.barrageStatus;
// setBarrageIndex(this.num);
// }, this.BarrageShowTime);
});
},
goPink(pink_id, uid, orderId, oid = 0) {
if (uid == this.uid && this.isPink) {
uni.navigateTo({
url:
"/pages/special/pink?" +
this.$util.objToParam({
orderId: orderId,
pink_id: this.pinkId,
special_id: this.special.id,
is_help: 0,
oid: oid
}),
});
} else {
uni.navigateTo({
url:
"/pages/special/pink?" +
this.$util.objToParam({
orderId: orderId,
pink_id: pink_id > 0 ? pink_id : this.pinkId,
special_id: this.special.id,
is_help: 1,
}),
});
}
},
follow() {
uni.previewImage({
current: 0,
urls: [this.wechat_qrcode],
});
},
getPartakePinkUrl() {
return `/pages/special/details?id=${this.special_id}`;
},
pay_order(data) {
this.orderId = data.data.result.orderId || "";
switch (data.data.status) {
case "PAY_ERROR":
case "ORDER_EXIST":
case "ORDER_ERROR":
this.extendOrder(data.msg);
break;
case "WECHAT_PAY":
this.wechatPay(data.data.result.jsConfig);
break;
case "WECHAT_H5_PAY":
this.payDialogOpen = false;
this.$util.wechatH5Pay(data.data.result.jsConfig, this);
break;
case "WECHAT_ROUTINE_PAY":
this.$util.wechatRoutinePay(data.data.result.jsConfig, this);
break;
case "SUCCESS":
this.successOrder(data.msg);
break;
case "ZHIFUBAO_PAY":
this.aliPay(data.data.result, "special");
break;
case 'TOUTIAO_PAY':
this.$util.toutiaoPay(data.data.result.jsConfig, this);
break;
case 'KUAISHOU_PAY':
this.$util.kuaishouPay(data.data.result.jsConfig, this);
break
}
},
aliPay(msn, type) {
this.$util.aliPay(msn, type, this);
},
wechatPay: function (config) {
this.$util.weixinpay(config, this);
},
successOrder(msg) {
this.$util.showMsg(msg ? msg : "支付成功");
switch (parseInt(this.pay_type_num)) {
case 1:
uni.navigateTo({
url: `/pages/special/gift_special?orderId=${this.orderId}`,
});
break;
case 2:
this.paid = true;
this.is_pay = true;
this.payDialogOpen = false;
this.updateMaterialStatus();
break;
case 3:
uni.navigateTo({
url: `/pages/special/pink?orderId=${this.orderId}`,
});
break;
}
validitySpecial(this.special_id).then((res) => {
this.special_validity = res.data.validity;
});
},
updateMaterialStatus() {
this.otherLoading = false;
this.otherLoaded = false;
this.where.page = 1;
this.$set(this, "otherTaskList", []);
this.getCourseList();
},
extendOrder(msg) {
let that = this;
if (typeof msg === "object") {
if (msg.errMsg === "chooseWXPay:cancel") {
msg = "微信支付取消";
} else {
msg = "支付失败";
}
} else {
msg = "支付失败";
}
this.$util.showMsg(msg);
this.payDialogOpen = false;
if (this.orderId) {
delSpecialOrder(this.orderId).then((res) => {
console.log(res);
});
}
},
setMeal(item) {
if (this.special.type == 5) {
uni.navigateTo({
url: item.is_light
? "/pages/special/single_details"
: "/pages/special/details" + `?id=${item.id}`,
});
}
},
// 点击专题目录
play(item) {
if (this.active == 6) {
uni.navigateTo({
url: `/pages/special/details?id=${item.id}`,
});
} else {
this.$util.checkLogin(() => {
if (
!item.is_free ||
item.is_try ||
this.is_pay ||
(!this.special.member_pay_type && this.isMember)
) {
this.goPlayTask(item);
} else {
uni.showModal({
title: "提示",
content: "购买后可操作,是否购买?",
confirmText: "购买",
success: ({ confirm }) => {
if (!confirm) return;
this.payDialogOpen = true;
this.init = true
this.pay_type_num = 2;
},
});
}
}, true)
}
},
// 专题列表
async getCourseList() {
if (this.otherLoading) return;
if (this.otherLoaded) return;
this.otherLoadTitle = "";
this.otherLoading = true;
try {
const { data } = await getCourseList(this.where);
let list = data.list || [],
taskList = [];
list.forEach((item) => {
item.active = false;
});
taskList = this.$util.SplitArray(list, this.otherTaskList);
taskList.forEach((item, index) => {
item.active = !index;
});
this.where.page = data.page;
this.otherLoaded = list.length < this.where.limit;
this.otherLoadTitle = this.otherLoaded
? "我也是有底线的"
: "上拉加载更多";
this.otherLoading = false;
console.log(taskList);
this.$set(this, "otherTaskList", taskList);
} catch (error) {
this.otherLoading = false;
this.otherLoadTitle = "加载更多";
}
},
// 套餐列表
async getCloumnTask() {
if (this.columnLoading) return;
if (this.columnLoaded) return;
this.columnLoadTitle = "";
this.columnLoading = true;
try {
const { data } = await getColumnTask(this.where2);
let list = data.list || [];
let taskList = this.$util.SplitArray(list, this.columnTaskList);
this.where2.page = data.page;
this.columnLoaded = list.length < this.where2.limit;
this.columnLoadTitle = this.columnLoaded
? "我也是有底线的"
: "上拉加载更多";
this.columnLoading = false;
this.$set(this, "columnTaskList", taskList);
} catch (error) {
this.columnLoading = false;
this.columnLoadTitle = "加载更多";
}
},
// 直播回放列表
async getLiveTask() {
let that = this;
if (this.liveLoading) return;
if (this.liveLoaded) return;
this.liveLoadTitle = "";
this.liveLoading = true;
try {
const res = await getLiveRecordList(
this.special_id,
this.where.page,
this.where.limit
);
let data = res.data.data;
let list = data || [];
let taskList = this.$util.SplitArray(list, this.liveTaskList);
this.where.page = this.where.page + 1;
this.liveLoaded = list.length < this.where.limit;
this.liveLoadTitle = this.liveLoaded
? "我也是有底线的"
: "上拉加载更多";
this.liveLoading = false;
this.$set(this, "liveTaskList", taskList);
} catch (error) {
this.liveLoading = false;
this.liveLoadTitle = "加载更多";
}
},
//播放素材
async goPlayTask(item) {
if (item.is_light) {
return uni.navigateTo({
url: `/pages/special/single_details?id=${item.id}`,
});
}
uni.showLoading({ mask: true });
try {
await getTaskLink(item.id, item.special_id);
await getSpecialPlayNum(item.id, item.special_id);
uni.hideLoading();
const url =
"/pages/special/" +
(this.special.type == 1 || this.type == 1
? "task_text_info"
: "task_info") +
"?" +
this.$util.objToParam({
id: item.id,
specialId: item.special_id,
viewing_time: (item.watch && item.watch.viewing_time) ? item.watch.viewing_time : 0,
isWechat: this.isWechat,
is_alipay: this.is_alipay,
is_yue: this.is_yue,
wxpayH5: this.wxpayH5,
memberLink: this.memberLink,
now_money: this.now_money,
templateIds: this.templateIds
});
uni.hideLoading();
uni.navigateTo({
url,
});
} catch (err) {
uni.hideLoading();
}
},
//滑动底部加载
bScrollInit: function () {
let that = this;
$h.EventUtil.listenTouchDirection(
document,
function () {
if (that.special.type == 5) {
that.columnLoading == false && that.getCloumnTask();
} else {
that.otherLoading == false && that.getCourseList();
}
},
false
);
},
// 点击收藏
collect() {
this.$util.checkLogin(() => {
collectSpecial(this.special_id)
.then(() => {
this.special.collect = !this.special.collect;
this.$util.showMsg(
this.special.collect ? "收藏成功" : "取消收藏成功"
);
})
.catch((err) => {
console.log(err);
});
}, true);
},
// 点击客服
customerService() {
this.$util.goSupport(CUSTOMER_DETAIL_TYPE.GOOD, CUSTOMER_SUPPORT_TYPE.SPECIAL, this.special_id, this.special.mer_id);
},
//打开支付插件,并检测登录状态,没有登录,打开登录插件
OpenPay(is_pink) {
this.init = true;
this.pay_type_num = is_pink;
this.$util.checkLogin(() => {
switch (is_pink) {
case 1:
if (!this.special.pay_type) {
return this.$util.showMsg("免费的不可以赠送哦");
}
if (this.isMember && !this.special.member_pay_type) {
return this.$util.showMsg("会员价免费的不可以赠送哦");
}
this.money = Number(this.special.money);
this.payDialogOpen = true;
break;
case 2:
if (this.isMember) {
this.money = Number(
this.special.member_pay_type ? this.special.member_money : 0
);
} else {
this.money = Number(this.special.money);
}
this.payDialogOpen = true;
break;
case 3:
this.money = Number(this.special.pink_money);
this.payDialogOpen = true;
break;
case 4:
this.payDialogOpen = false;
receiveGift(this.orderId).then(({ msg }) => {
this.$util.showMsg(msg);
uni.navigateTo({
url: "/pages/special/grade_special",
});
}).catch(({ msg }) => {
this.$util.showMsg(msg);
});
break;
case 5:
// location.hash = '#tash';
// $('body,html').animate({scrollTop: $(this.$refs.list).offset().top}, 800);
// this.is_pay = true;
// this.paid = false;
// this.active = 1;
let url = "/pages/special/";
const params = {
id: 0,
};
let task = this.otherTaskList[0];
if (task.special_task) {
task = task.special_task[0];
}
if (task.is_light) {
if (task.light_type === 1) {
url += "single_text_detail";
}
} else {
url += task.type === 1 ? "task_text_info" : "task_info";
params.specialId = task.special_id;
params.viewing_time =
(task.watch && task.watch.viewing_time) || 0;
}
params.id = task.id;
url += "?" + this.$util.objToParam(params);
uni.navigateTo({
url,
});
break;
case 6:
this.handleToLivePage();
break;
}
}, true);
},
async handleToLivePage() {
if (this.liveInfo.studio_pwd && this.special.pay_type == 2) {
this.password = true;
return;
}
const params = {
stream_name: this.stream_name,
record_id: this.RecordId,
};
const xparams = this.$util.objToParam(params);
uni.showLoading({ mask: true });
try {
await precheckLive(params);
uni.hideLoading();
} catch (err) {
uni.hideLoading();
return this.$util.showMsg(err.msg);
}
uni.navigateTo({
url: "/pages/live/index?" + xparams,
});
},
ReceiveGift() {
if (!this.orderId) return;
receiveGift(this.orderId).then(({ msg }) => {
this.$util.showMsg(msg);
uni.navigateTo({
url: "/pages/index/index",
});
});
},
//关闭登录
loginClose: function (val) {
this.loginShow = false;
val && this.logComplete();
},
//登录完成回调事件
logComplete: function () {
let that = this;
that.isLogin = true;
that.otherLoaded = false;
that.where.page = false;
that.otherTaskList = [];
that.getCourseList();
app.baseGet($h.U({ c: "special", a: "isMember" }), function (res) {
let isMember = res.data.data.is_member;
that.isMember = isMember;
that.now_money = res.data.data.now_money;
switch (that.pay_type_num) {
case 1:
that.money =
isMember && that.special.member_pay_type == 1
? that.special.member_money
: that.special.money;
break;
case 2:
if (isMember) {
that.money = that.special.member_pay_type
? that.special.member_money
: 0;
} else {
that.money = that.special.money;
}
break;
case 3:
that.money = that.special.pink_money;
break;
}
});
app.baseGet(
$h.U({
c: "special",
a: "special_validity",
q: {
id: special.id,
},
}),
function (res) {
that.special_validity = res.data.data.validity;
},
function () { },
true
);
},
//所有插件回调处理事件
changeVal(opt) {
if (typeof opt != "object") opt = {};
let action = opt.action || "";
let value = opt.value || "";
this[action] && this[action](value);
},
CountDown(opt, that) {
if (typeof opt != "object") opt = {};
let name = opt.name || "",
value = null;
that = that ? that : this;
if (name.indexOf(".") === -1) value = that[name];
else {
let nameArray = name.split(".");
value = that[nameArray[0]][nameArray[1]];
}
let tiem = opt.time || 1000,
timeName = opt.time_name || "datatime",
strName = { hour: "00", minute: "00", second: "00" },
outputName = opt.output || "difftime";
if (!name) return false;
if (value === undefined) return false;
opt.nowTime = function () {
if (Array.isArray(value)) {
for (var i = 0; i < value.length; i++) {
let intDiff = value[i][timeName] - Date.parse(new Date()) / 1000; //获取数据中的时间戳的时间差;
let days = 0,
hour = 0,
minute = 0,
second = 0;
if (intDiff > 0) {
hour = Math.floor(intDiff / (60 * 60)) - days * 24;
minute = Math.floor(intDiff / 60) - hour * 60;
second = Math.floor(intDiff) - hour * 60 * 60 - minute * 60;
if (hour <= 9) hour = "0" + hour;
if (minute <= 9) minute = "0" + minute;
if (second <= 9) second = "0" + second;
strName = {
hour: hour,
minute: minute,
second: second,
};
} else {
strName = {
hour: "00",
minute: "00",
second: "00",
};
}
value[i][outputName] = strName;
}
that.$set(that, name, value);
} else {
let intDiff = value[timeName] - Date.parse(new Date()) / 1000;
let days = 0,
hour = 0,
minute = 0,
second = 0;
if (intDiff > 0) {
hour = Math.floor(intDiff / (60 * 60)) - days * 24;
minute = Math.floor(intDiff / 60) - hour * 60;
second = Math.floor(intDiff) - hour * 60 * 60 - minute * 60;
if (hour <= 9) hour = "0" + hour;
if (minute <= 9) minute = "0" + minute;
if (second <= 9) second = "0" + second;
strName = {
hour: hour,
minute: minute,
second: second,
};
} else {
strName = {
hour: "00",
minute: "00",
second: "00",
};
}
if (name.indexOf(".") === -1)
that.$set(that[name], outputName, strName);
else {
let nameArray = name.split(".");
that.$set(that[nameArray[0]][nameArray[1]], outputName, strName);
}
}
};
opt.nowTime();
setInterval(opt.nowTime, tiem);
},
//播放回放
playBackRecord: function (item) {
this.RecordId = item;
this.OpenPay(6);
},
// 关联资料
specialMaterial() {
getSpecialMaterial(this.special_id).then((res) => {
this.materialList = res.data;
});
},
// 获取返佣金额
rebateAmount() {
getRebateAmount(this.special_id).then((res) => {
this.rebateMoney = parseFloat(res.data.brokeragePrice);
});
},
rebateAction(value) {
switch (value) {
case "close":
this.rebateMoney = 0;
break;
case "share":
this.handleCreateSharePoster();
break;
}
},
},
};
</script>
<style>
page {
background: #f5f5f5;
}
/* #ifdef MP-WEIXIN */
.swiper-conter {
padding: 0!important;
}
/* #endif */
</style>
<style scoped lang="scss">
.teacher-section {
// border-top: 14rpx solid #f5f5f5;
background: #F6F6F6;
}
.thematic-details .swiper-details .share {
background-color: #ffffff;
.share_wechat {
padding: 20rpx 0 0 0;
}
}
.swiper-details .special-coverimg {
width: 100%;
height: 390rpx;
> image {
width: 100%;
height: 100%;
}
}
.teacher-table {
display: flex;
align-items: center;
height: 150rpx;
}
.teacher-table .item {
-webkit-box-flex: 1;
-webkit-flex: 1;
flex: 1;
position: relative;
min-width: 0;
font-size: 24rpx;
text-align: center;
color: #999999;
}
.teacher-table .item:last-child::before {
content: "";
position: absolute;
top: 50%;
left: 0;
width: 2rpx;
height: 40rpx;
background-color: #e8e8e8;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
.teacher-table .item .learn {
font-size: 0;
}
.teacher-table .item .learn .child {
font-size: 24rpx;
}
.teacher-table .item .learn .child:nth-child(2) {
font-weight: bold;
font-size: 28rpx;
}
.teacher-table>view:last-child>view:first-child {
margin-bottom: 6rpx;
}
.teacher-table .num {
font-size: 38rpx;
color: #333333;
}
.teacher-table image {
width: 50rpx;
height: 50rpx;
border: 2px solid #ffffff;
border-radius: 50%;
margin-left: -15rpx;
-webkit-box-sizing: border-box;
box-sizing: border-box;
background-color: #2c8eff;
vertical-align: middle;
object-fit: cover;
pointer-events: none;
-webkit-touch-callout: none;
}
.teacher-detail-wrap {
padding: 0 30rpx 30rpx;
}
.teacher-detail-wrap .a {
display: block;
padding: 30rpx;
border-radius: 4rpx;
background-color: #f9fafc;
}
.teacher-detail-wrap .iconfont {
color: #666666;
}
.teacher-detail-wrap .detail-hd {
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
}
.teacher-detail-wrap .detail-hd .head {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
overflow: hidden;
}
.teacher-detail-wrap .detail-hd .head .image {
display: block;
width: 100rpx;
height: 100rpx;
object-fit: cover;
}
.teacher-detail-wrap .detail-hd .text {
-webkit-box-flex: 1;
-webkit-flex: 1;
flex: 1;
min-width: 0;
margin: 0 18rpx;
font-weight: bold;
font-size: 30rpx;
color: #282828;
}
.teacher-detail-wrap .detail-hd .text .text {
display: inline-block;
height: 34rpx;
padding: 0 12rpx;
border-radius: 10rpx;
background-color: #fff0e5;
font-weight: normal;
font-size: 20rpx;
line-height: 34rpx;
color: #ff6b00;
}
.teacher-detail-wrap .detail-hd .text {
margin-left: 10rpx;
}
.teacher-detail-wrap .detail-bd {
margin-top: 20rpx;
font-size: 26rpx;
line-height: 38rpx;
color: #666666;
}
.scroll-section {
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
margin-top: 14rpx;
background-color: #fffcf6;
font-size: 24rpx;
}
.scroll-section .label {
width: 200rpx;
padding-left: 75rpx;
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAYAAAAehFoBAAADgklEQVRYR+2ZQXbaMBCG/zFdkFXJCaqcoOkJCpu+mk3TE4ScoOQEISdIcoLQE6Td4Pe6SXKCkhNEvQFZNRuYPsmykRQbY6CVF2UHNvKn8a9/RiPCX/hwIrrMuADhEMAdtXBKH+R0F4+iXQxij8GJOGNg5IzLmNEeDqgnZ9s+b2fAfCs6/IwbAN0iKGJ8pr781ghgI4EbEDoZEANfoSJL+KJ+Y+C8FUs38hvQbx3hAgk8ETCkWI7niRgRcNYI4BIJPFALg2yBNQa4TAJRG0N7YdUF5kQMGLgGY0p76BUt0tqSWCUBX5J1gRcTcQfCez1OCbQG5kQcMzCoXAOMjvHW7FZHAtsC80QcMWmnSZkZV62+HNrjEk/EkAkXlbDeDcoFfAlsC6z+P5+Iy8xZ1HffDmmRiEcAogZw7gJV/6kriWw8RxqAjGJ5kF1TwJx/AXpVEAAkxVKucR82BTYOpJ7x2rdEBziKZe1FuAp8U2AtDcvDVQKK+nJfS8SO8L8C5kQIVRwxYdaK5UnRpHWUf2MKwhsNCpyoZBQE2Il8gRPkLpH5cvrD9yiWR0GAffsqK4z0mwCUKegPtbEfBNhodEzAsWFxnMCWyCIRqo5+m1tcCA1b9iV9jVZ5ebAIa7uyNKoSUSuWL7KtrluAWz0Rxn1o4KVGLeuyo+wBT4MCK7DFROSyKLNVJ7mF1LABzis0auFd0Wb1P3BZel4nNdvFV+Ml4SWGpyiW+SbWynZLlwAegi467w0029ZMcfOYtQbK0rNd0KtWQbAIzxNxTdm2jHEf9WVhA2YxET+zbZmeVAhbszOcKR17FMs7f/E2pviZJyIvfFZ1hJwiPmh5+UMc8hwjZkh/V5y7Q1rALzUesoBfta3KrnlbpF9RX+qNchANVwG/cBAT3cYC284ARh7dFNiqlqpmbmrSGUUY0Ud5VXX/Oqm5oGBf2l26+XQcZOPOjz4KSF9VaY+iLrBvd0UOkvXWBsxr9NbShrXeX+XRJlxSLM+Lol0X2GsGFiaT2o0T04tTnXTdlTHgU3qFE7+WrQts9fkeqI3uTtqtZi+mGiHjvDVquAkY2dGuC6zHvhWdVYc3tSPs7LfSzufLaBNOVardBLhqIW8FnEWEnzEG8MmZDONSLfLGHcrkMk6b0Qp8qW1rBo069nLyf0G0ATxRG6JRB4uOHNLmh5KEssCVxwpVmvWv/wGVY//ZbDJkGgAAAABJRU5ErkJggg==") 30rpx center/26rpx 22rpx no-repeat;
color: #feb720;
}
.scroll-section .swiper-container {
position: relative;
-webkit-box-flex: 1;
-webkit-flex: 1;
flex: 1;
min-width: 0;
height: 62rpx;
padding-left: 16rpx;
line-height: 62rpx;
}
.scroll-section .swiper-container::before {
content: "";
position: absolute;
top: 50%;
left: 0;
width: 1px;
height: 24rpx;
border-left: 1px solid #999999;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
.process-section {
margin-top: 14rpx;
background-color: #ffffff;
}
.process-section .title {
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
height: 86rpx;
padding-right: 30rpx;
padding-left: 30rpx;
font-size: 28rpx;
color: #282828;
}
.process-section .list {
display: -webkit-box;
display: flex;
-webkit-box-pack: justify;
justify-content: space-between;
-webkit-box-align: center;
align-items: center;
height: 110rpx;
padding-right: 30rpx;
padding-left: 30rpx;
border-top: 1px solid #eeeeee;
}
.process-section .list .item {
padding-right: 0 !important;
}
.process-section .list .item~.item {
padding-left: 67rpx;
border: none !important;
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAoCAYAAACrUDmFAAAGKklEQVRoQ91a3W8U1xX/nXvvrGcnXhwEdgIlKSp22sSO8ceWGKsJS1pBhKhUVeC3PvSp/TP2L8hLnvoQ5SlShJGiSCiv3lAFTDS7yDYmFnaiQojs2vhz2a/ZmXuqY60j4jhpsBdp4nncPXPv/Z3f+b5DiNFz586dRLVaPeC6rtFa16Moqi0tLVXPnj0b7vaYtNsXm/ne2NiYOXLkSLJYLLYrpY4rpVJhGAaO4ywHQfDA87yVq1evhtls1j7tvrEAODMzkyqVSseIqI+ZzzHzrwGUieiutfZTIrrjuu5GT09P8IsEODEx0QGgJ4qiM8z8VwCdAKoA7jLzNQDjxph7xpilp2UyFgz6vv8yEb0J4AyAtwEcBxAx8woRfc3M4wAE6NTTMhkLgIVC4ai19pRS6g8A/sjMXQBaAIjPlffCZCwATkxMPBcEwQtKqd8DuAwgDeAwgCSAcC9MxgIgM6tcLpfwPO+3xpjzzDxMRN0AjuyVyVgAlMgoIG/evPm81volx3HS1to/S1TdK5OxAbgFstlMxgrgs2AydgCbzWQsATaTydgCbBaTsQbYDCYFIGWzWbp48aIuFoucyWQiIuKdilpmpnw+b+S/a9euRT9W3YtcLpfTIpfJZKQa4Z9YU42OjtLly5cxOjqKkZGRTfkn999tniyXyyt05coV3draajo6OtwwDLlSqZR/rP/yfd8B4MnmrutWuru76zsdXNqf9vZ21xhD8/PzdalGdlKcHHxubs5ZX1/XjuNQqVSyDx8+DEZGRqLtCt5NngyC4J4wMmitdYlIkmzAzN8CWFpYWNi4cOFCTTYaGxtzU6nUQSJql+rCWivsPLLWLq2trS2eP3++1DAnMzc351UqlcNRFL0cRdFzjbZnWSn1oK+vb10Uks1m1aVLlwwzH6zVasdlb7EkIloHcD+VSi13dnaK8r7X//1cJoloWowsiqJZAfgegFZmPkpEa9KaWGtva62nBwYGluTgvu8LqLRSqr9RXSSY+WsiKgRBkDt9+vR/RG52dvZAuVwWYP3W2j8R0a8AbACYAPDxxsbGXWFyenraIaLWIAh6rbV/AfAqESlmvsfMn4RhOHHo0KG1rq6uTQVvN9f/V/EAWAYwB2CVfN8vyGYAXiSiR0IYgByA6wMDA/dl8Xw+30lEF5g5A+CUWCgzywIi92E6nZ4SOenroih6Xdoea630dSeI6DGAfzPze8Vi8WYmkwny+bwrJZjW+k1r7T8axbUweBvA+0R03XGc+Z6eHnn3Bw8z68nJSXGpAQB/AyBdiCjzQMOSqg2yasLgQwCJxp8C8AsiyjHzp4ODgwIChULhNQCXGgC7mVmq/HkAnxHRvwYHB/MiNz4+fkxrPaSUkr5OiubfAKgz8+cA3k0mk9dlxpJMJsWPjxljziil/m6tHSDaDOiTRPShrGuM+aq3t3e1GQCvM7P0Xm1KqRVmvk1E0mB+x6Dv+8LEOwCGAPxOGASwII2oMeajvr4+sXlMTU29EASBjB3eICIB+RIzB0opH8AHWmu/t7e3msvlki0tLS8mEolTRCSK6xb6AMwQ0Sda61ue5z3o6uoS896biRYKhX8y8wFmPqaUEpPIh2E4Y639ZmhoaHODycnJg2EYnmBmAdcLQKLpV0T0pdZ66uTJk4sid+PGjaQx5rAx5hVr7TAAGSKJX89GUfR5Op0Wk7eNFOJ6nndCa/2WdPBEpInogSi2ra1tdnV1tZxOpyUCf/fsKsj4vv+6Ukp88GhD2zOlUmmhXq9XttKFjPPET2u1mvhpVyOK3q/VagsAVoaHhytyiq3oGEVRR71ef03ekciotf7vTozcunXrkOM4rzDzYfErIlomopn+/v5H29PPrtOE7/ttURSZlpYWcVrrum5R/OTJvLV18MePH7uJRKJVKUXFYrGsta5uz1sie+7cuRal1OZ8k4jqnudVOzs7ZUr2vfmmKK5UKqW01glZ01obLC4uFrfS0xZ1P5e57aONzUS/kxPH6bfdMPfkcCrWAHfL3JPjxdgC3CtzW1YYS4DNYC62AJvFXCwBNpO52AFsNnOxAvgsmIsVwH0/ut/3ly/7/vps31+A7vsr7H3/EcJWSH8Wn5H8D2fpbyp9zLJtAAAAAElFTkSuQmCC") left center/28rpx 20rpx no-repeat;
}
.process-section .list .item span {
display: inline-block;
box-sizing: border-box;
vertical-align: middle;
font-size: 26rpx;
line-height: 37rpx;
color: #282828;
}
.process-section .list .item span:first-child {
width: 28rpx;
height: 28rpx;
border: 1px solid #282828;
border-radius: 50%;
margin-right: 6rpx;
font-size: 22rpx;
line-height: 24rpx;
text-align: center;
color: #282828;
}
.navCon {
position: relative;
padding: 0 30rpx;
}
.navCon {
.item {
margin: 0 72rpx 0 0!important;
&.on {
font-weight: normal!important;
&:after {
background: linear-gradient(90deg, #24A9E1, #0F74BB);
border-radius: 3rpx;
}
}
&:last-child {
margin-right: 0;
color: #999;
font-size: 28rpx;
}
}
}
.evaluate-section .head {
display: -webkit-box;
display: flex;
-webkit-box-pack: justify;
justify-content: space-between;
-webkit-box-align: center;
align-items: center;
padding: 33rpx 30rpx 13rpx;
}
.evaluate-section .score {
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
}
.evaluate-section .score view:first-child {
font-size: 28rpx;
color: #ff6b00;
}
.evaluate-section .score text {
margin-right: 5rpx;
font-weight: bold;
font-size: 44rpx;
}
.evaluate-section .score view:last-child {
width: 170rpx;
height: 42rpx;
border-radius: 21rpx;
margin-left: 15rpx;
background-color: #f5f5f5;
font-size: 24rpx;
line-height: 42rpx;
text-align: center;
color: #999999;
}
.evaluate-section .head button {
width: 160rpx;
height: 56rpx;
border-radius: 28rpx;
background-image: linear-gradient(90deg, #409dff 0%, #1e85fb 100%);
font-size: 26rpx;
color: #ffffff;
}
.video_footer_btn {
-webkit-flex: 1;
flex: 1;
height: 76rpx;
border-radius: 37px;
}
.video_footer_btn_left {
width: 50%;
height: 100%;
border-radius: 37px 0px 0px 37px;
background: #ff6b00;
}
.video_footer_btn_right {
width: 50%;
height: 100%;
border-radius: 0px 37px 37px 0px;
background: #1D8DFF;
}
.video_footer_btn_left_pic {
font-size: 28rpx;
line-height: 22rpx;
font-weight: 600;
color: #ffffff;
text-align: center;
}
.video_footer_btn_left_num {
font-size: 20rpx;
line-height: 20rpx;
color: #ffffff;
text-align: center;
}
.video_footer_btn_left_pic+.video_footer_btn_left_num {
margin-top: 9rpx;
}
.thematic-details .material button,
.single-special .material button {
padding: 3rpx 20rpx;
border-radius: 30rpx;
background-color: #2c8eff;
font-family: inherit;
font-weight: normal;
font-size: 22rpx;
color: #ffffff;
height: 50rpx;
line-height: 50rpx;
}
.footer .video_footer_btn .on {
width: 100% !important;
border-radius: 37px !important;
}
.thematic-details .poster {
position: fixed;
top: 15%;
left: 15%;
width: 70%;
z-index: 60;
}
.base-wrap {
/* #ifndef MP-WEIXIN */
padding-bottom: calc(100rpx + var(--safe-bottom));
/* #endif */
}
.thematic-details .poster image {
width: 100%;
}
.thematic-details .poster view {
color: #eee;
font-size: 14px;
margin-left: 25%;
}
.thematic-details .footer {
position: fixed;
bottom: 0;
left: 0;
z-index: 9;
width: 100%;
border-top: 1px solid #eee;
padding-bottom: var(--safe-bottom);
background-color: #ffffff;
}
.thematic-details .footer .link {
width: 90rpx;
height: 100rpx;
line-height: 100rpx;
text-align: center;
}
.thematic-details .footer .link .cont {
display: inline-block;
vertical-align: middle;
font-size: 20rpx;
line-height: 36rpx;
color: #666;
}
.thematic-details .footer .link image {
display: block;
width: 44rpx;
height: 44rpx;
margin-right: auto;
margin-left: auto;
}
.thematic-details .footer .wrap {
flex: 1;
min-width: 0;
padding-right: 30rpx;
padding-left: 30rpx;
}
.thematic-details .footer .item {
border: 1rpx solid #d9d9d9;
width: 133rpx;
height: 100rpx;
border-radius: 10rpx;
font-size: 24rpx;
color: #333;
}
.thematic-details .footer .item image {
width: 42rpx;
height: 46rpx;
}
.thematic-details .footer .item.item1 {
width: 187rpx;
}
.thematic-details .footer .item.item2 {
width: 187rpx;
background-color: #f9e067;
border-color: #f9e067;
}
.thematic-details .footer .item .money {
font-size: 36rpx;
color: #333;
font-weight: bold;
margin-bottom: -6rpx;
}
.thematic-details .footer .item.on {
width: 390rpx;
}
.thematic-details .footer .item.on .money {
margin-bottom: 0;
}
.dialog {
position: fixed;
top: 50%;
right: 85rpx;
left: 85rpx;
z-index: 56;
display: none;
max-height: 90%;
padding: 50rpx 0;
border-radius: 12rpx;
background-color: #ffffff;
transform: translateY(-50%);
text-align: center;
font-size: 30rpx;
color: #333333;
opacity: 0;
}
.dialog.show {
display: block;
opacity: 1;
}
.dialog image {
width: 354rpx;
height: 354rpx;
margin-bottom: 20rpx;
vertical-align: middle;
object-fit: contain;
}
.thematic-details .swiper-details .swiper-nav {
background: #ffffff;
width: 690rpx;
margin: 20rpx auto 0;
}
.thematic-details .lecturer-info {
align-items: center;
width: 690rpx;
height: 180rpx;
margin: 20rpx auto 0;
padding: 0 32rpx;
background: #fff;
.info-avatar {
width: 100rpx;
height: 100rpx;
>image {
width: 100%;
height: 100%;
border-radius: 50%;
}
}
.info-box {
margin: 0 24rpx 0 9rpx;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
.info-name {
display: flex;
font-size: 28rpx;
color: #333;
margin-bottom: 14rpx;
line-height: 39rpx;
>text {
padding: 0 14rpx;
height: 39rpx;
background: #FFEDE9;
border-radius: 6rpx;
color: #FF4B33;
font-size: 22rpx;
margin-left: 12rpx;
text-align: center;
}
}
.info-desc {
color: #999999;
font-size: 24rpx;
max-height: 60rpx;
line-height: 30rpx;
-webkit-line-clamp: 2;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
}
}
}
.mulu {
background: #ffffff;
width: 690rpx;
margin: 0 auto;
}
.thematic-details .catalogue {
background: #ffffff !important;
}
.thematic-details .swiper-details .swiper {
background-color: #ffffff;
// border-radius: 40rpx 40rpx 0 0;
// position: relative;
margin: 22rpx auto 0;
width: 690rpx;
}
.thematic-details .swiper-details .swiper .validity {
padding-left: 30rpx;
background: url(getAssetsPath("/wap/first/zsff/images/validity.png")) center/cover no-repeat;
font-size: 26rpx;
border-radius: 40rpx 40rpx 0 0;
line-height: 80rpx;
color: #ff6b00;
}
.thematic-details .swiper-details .swiper .name {
-webkit-line-clamp: 2;
overflow: hidden;
}
.thematic-details .follow {
position: fixed;
top: 0;
left: 0;
z-index: 11;
width: 100%;
height: 80rpx;
padding-right: 30rpx;
padding-left: 30rpx;
background-color: rgba(0, 0, 0, 0.32);
font-size: 26rpx;
color: #ffffff;
}
.thematic-details .follow .picTxt .pictrue {
width: 85rpx;
height: 85rpx;
}
.thematic-details .follow .picTxt .pictrue image {
width: 100%;
height: 100%;
border-radius: 15rpx;
}
.thematic-details .follow .picTxt .text {
width: 365rpx;
font-size: 28rpx;
color: #509efb;
}
.thematic-details .follow .picTxt .text .name {
font-weight: bold;
}
.thematic-details .follow .followBnt {
display: inline-block;
width: 160rpx;
height: 50rpx;
border-radius: 25rpx;
background-color: #2c8eff;
vertical-align: middle;
font-size: 24rpx;
line-height: 50rpx;
text-align: center;
color: #ffffff;
}
.thematic-details .follow .iconguanbi2 {
margin-left: 24rpx;
vertical-align: middle;
font-size: 30rpx;
}
.thematic-details .swiper-details .swiper .swiper-int .pin-money {
flex: 1;
}
.thematic-details .swiper-details .swiper .swiper-int .pin-money .price {
display: inline-block;
font-weight: bold;
font-size: 22rpx;
color: #ff6b00;
}
.thematic-details .swiper-details .swiper .swiper-int .pin-money .price text {
font-weight: bold;
font-size: 32rpx;
line-height: 25rpx;
}
.thematic-details .swiper-details .swiper .swiper-int .pin-money .vip-price {
font-size: 24rpx;
color: #282828;
}
.thematic-details .swiper-details .swiper .swiper-int .pin-money .vip-price+.vip-price-icon {
vertical-align: inherit;
}
.swiper-details .swiper .swiper-int .collect {
align-items: center;
}
.swiper-details .swiper .swiper-int .collect .iconfont.iconshoucang2 {
color: #ff6b00 !important;
}
.swiper-details .swiper .swiper-int .collect .iconfont {
font-weight: 600;
color: #23272E !important;
font-size: 36rpx;
image {
width: 36rpx;
height: 36rpx;
}
}
.thematic-details .swiper-details .swiper .swiper-int .pin-money .total {
margin-left: 10rpx;
font-size: 26rpx;
color: #999999;
}
.thematic-details .swiper-details .pinTip {
height: 70rpx;
padding-left: 33rpx;
font-size: 26rpx;
line-height: 70rpx;
}
.thematic-details .pinTip2 {
height: 70rpx;
padding-right: 30rpx;
padding-left: 30rpx;
border-radius: 12rpx;
margin: 14rpx 20rpx;
background-color: #e2efff;
}
.thematic-details .pinTip2 .chatBnt {
width: 136rpx;
height: 46rpx;
border: 1px solid #3895ff;
border-radius: 23rpx;
background-color: #2c8eff;
font-size: 24rpx;
line-height: 42rpx;
text-align: center;
color: #f5f5f5;
cursor: pointer;
}
.thematic-details .pinTip2 .reminder {
font-size: 26rpx;
color: #2c8dff;
}
.thematic-details .swiper-details .list {
padding-left: 30rpx;
background-color: #ffffff;
}
.thematic-details .swiper-details .list .item {
padding-top: 25rpx;
padding-right: 30rpx;
padding-bottom: 25rpx;
}
.thematic-details .swiper-details .list .item .item {
border-top: 1px solid #f0f0f0;
}
.thematic-details .swiper-details .list .item .pictrue {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
margin-right: 20rpx;
overflow: hidden;
}
.thematic-details .swiper-details .list .item .pictrue image {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
.thematic-details .swiper-details .list .item .name {
flex: 1;
min-width: 0;
}
.thematic-details .swiper-details .list .item .left {
width: 210rpx;
font-size: 24rpx;
line-height: 34rpx;
text-align: center;
}
.thematic-details .swiper-details .list .item .link {
width: 140rpx;
height: 50rpx;
border-radius: 25rpx;
background: linear-gradient(90deg, #409dff 0%, #1e85fb 100%);
font-size: 24rpx;
line-height: 50rpx;
text-align: center;
color: #ffffff;
}
.thematic-details .swiper-details .list .item .link .iconfont {
margin-left: 11rpx;
font-size: 18rpx;
}
.thematic-details .swiper-details .list .item .left text {
color: #feb720;
}
.thematic-details .swiper-details .list .item .left .time {
line-height: 30rpx;
color: #82848f;
}
.thematic-details .groupCode {
width: 640rpx;
height: 574rpx;
background-color: #ffffff;
border-radius: 24rpx;
position: fixed;
left: 50%;
top: 50%;
z-index: 99;
transform: translate(-50%, -50%);
}
.thematic-details .groupCode .code {
width: 310rpx;
height: 310rpx;
margin: 70rpx auto 0 auto;
}
.thematic-details .groupCode .code image {
width: 100%;
height: 100%;
}
.thematic-details .groupCode .codeTip {
text-align: center;
margin-top: 40rpx;
font-size: 37rpx;
color: #333;
}
/* 专题目录 */
.thematic-details .special-tip {
display: inline-block;
height: 50rpx;
padding: 0 22rpx;
border: 1px solid #2c8eff;
border-radius: 25rpx 25rpx 25rpx 0;
margin-top: 30rpx;
margin-left: 30rpx;
font-size: 24rpx;
line-height: 50rpx;
color: #2c8eff;
}
.thematic-details .catalogue {
background-color: #f9fafc;
}
.thematic-details .catalogue>view {
position: relative;
display: flex;
align-items: center;
height: 152rpx;
}
.thematic-details .catalogue>view::before {
content: "";
position: absolute;
top: 0;
right: 0;
left: 91rpx;
border-top: 1px solid #f5f5f5;
}
.thematic-details .catalogue>view:first-child::before {
display: none;
}
.thematic-details .catalogue image {
display: block;
width: 38rpx;
height: 27rpx;
margin: 0 33rpx 0 20rpx;
}
.thematic-details .catalogue .text {
flex: 1;
min-width: 0;
}
.thematic-details .catalogue .title {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 28rpx;
line-height: 40rpx;
color: #333333;
}
.thematic-details .catalogue .try-progress {
font-size: 0;
}
.thematic-details .catalogue .try,
.thematic-details .catalogue .progress {
display: inline-block;
padding: 0 7rpx;
border: 1px solid transparent;
border-radius: 3rpx;
margin-top: 15rpx;
font-size: 18rpx;
line-height: 33rpx;
height: 33rpx;
}
.thematic-details .catalogue .try {
border-color: #2c8eff;
color: #2c8eff;
}
.thematic-details .catalogue .progress {
padding-left: 9rpx;
border-color: #fff0e5;
background-color: #FF9500;
color: #fff;
}
.thematic-details .catalogue .progress.no {
border-color: #FFC067;
background-color: #fff;
color: #FFBF66;
}
.thematic-details .catalogue .try+.progress {
margin-left: 15rpx;
}
.thematic-details .catalogue .status {
width: 130rpx;
font-size: 0;
text-align: center;
}
.thematic-details .catalogue .free {
display: inline-block;
width: 90rpx;
height: 40rpx;
border-radius: 20rpx;
background-color: #fff0e5;
font-size: 22rpx;
line-height: 40rpx;
text-align: center;
color: #ff6b00;
}
.thematic-details .catalogue .iconfont {
font-size: 34rpx;
color: #cccccc;
}
.problem-section,
.question-section,
.evaluate-section {
width: 690rpx;
margin: 0 auto;
}
/* 专题练习题 */
.thematic-details .problem-section .problem-list {
padding: 30rpx;
background-color: #ffffff;
}
.thematic-details .problem-section .item {
padding: 30rpx 30rpx 32rpx;
border-radius: 12rpx;
box-shadow: 0 3rpx 20rpx rgba(0, 0, 0, 0.07);
}
.thematic-details .problem-section .item+.item {
margin-top: 30rpx;
}
.thematic-details .problem-section .title {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 30rpx;
color: #282828;
}
.thematic-details .problem-section .title.lock {
padding-left: 43rpx;
background: url(getAssetsPath("/wap/first/zsff/images/question06.png")) left center/23rpx 30rpx no-repeat;
}
.thematic-details .problem-section .group {
display: flex;
align-items: center;
margin-top: 30rpx;
}
.thematic-details .problem-section .progress {
width: 160rpx;
height: 12rpx;
border-radius: 6rpx;
background-color: #eee;
}
.thematic-details .problem-section .progress view {
width: 50%;
height: 100%;
border-radius: 6rpx;
background-color: #2c8eff;
}
.thematic-details .problem-section .people {
flex: 1;
margin-left: 10rpx;
font-size: 22rpx;
color: #999999;
}
.thematic-details .problem-section .people text {
display: inline-block;
width: 98rpx;
}
.thematic-details .problem-section .exercise-btn {
width: 120rpx;
height: 42rpx;
border-radius: 21rpx;
background-color: #2c8eff;
font-size: 22rpx;
line-height: 42rpx;
text-align: center;
color: #ffffff;
image {
width: 18rpx;
margin-right: 10rpx;
pointer-events: none;
-webkit-touch-callout: none;
}
}
.thematic-details .question-section .list {
padding: 30rpx;
background-color: #ffffff;
}
.thematic-details .question-section .item {
display: flex;
padding: 30rpx 30rpx 36rpx;
border-radius: 12rpx;
box-shadow: 0 3rpx 20rpx rgba(0, 0, 0, 0.07);
cursor: pointer;
}
.thematic-details .question-section .item+.item {
margin-top: 30rpx;
}
.thematic-details .question-section .item>view>image {
display: block;
width: 240rpx;
height: 135rpx;
border-radius: 10rpx;
object-fit: cover;
-webkit-touch-callout: none;
pointer-events: none;
}
.thematic-details .question-section .text {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
margin-left: 20rpx;
}
.thematic-details .question-section .item>view:last-child {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
margin-left: 20rpx;
}
.thematic-details .question-section .item>view>view:first-child {
-webkit-line-clamp: 2;
overflow: hidden;
font-size: 30rpx;
color: #333;
}
.thematic-details .question-section .item>view>view:last-child {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 22rpx;
color: #ff6b00;
}
.thematic-details .question-section .lock {
display: block;
width: 24rpx;
height: 30rpx;
-webkit-touch-callout: none;
pointer-events: none;
}
.thematic-details .question-section .btn {
width: 120rpx;
height: 42rpx;
border-radius: 21rpx;
background-color: #2c8eff;
font-size: 22rpx;
line-height: 42rpx;
text-align: center;
color: #ffffff;
}
.thematic-details .question-section .btn image {
width: 17rpx;
height: 19rpx;
margin-right: 10rpx;
-webkit-touch-callout: none;
pointer-events: none;
}
.thematic-details .finished,
.thematic-details .loading {
font-size: 28rpx;
line-height: 100rpx;
text-align: center;
color: #bbb;
}
.thematic-details .fa-spin {
animation: fa-spin 1s infinite linear;
}
.thematic-details .empty {
padding-top: 50rpx;
padding-bottom: 50rpx;
background-color: #ffffff;
font-size: 28rpx;
text-align: center;
color: #bbb;
}
.thematic-details .empty image {
display: block;
width: 414rpx;
height: 305rpx;
margin: 0 auto;
}
.txp1 {
padding: 25rpx 30rpx 0;
font-size: 32rpx;
line-height: 50rpx;
color: #333333;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.exchange-guide {
position: fixed;
top: 50%;
right: 0;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
height: 62rpx;
padding-right: 21rpx;
padding-left: 28rpx;
border-top-left-radius: 31rpx;
border-bottom-left-radius: 31rpx;
background-color: #2c8eff;
-webkit-box-shadow: 0 2rpx 10rpx rgba(76, 146, 226, 0.25);
box-shadow: 0 2rpx 1rpx rgba(76, 146, 226, 0.25);
font-size: 30rpx;
line-height: normal;
color: #ffffff;
}
.poster-canvas2 {
width: 1200rpx;
height: 1700rpx;
}
.im{
color: #666;
border:none;
}
.im::after{
border:none;
}
</style>