Commit 9f3fbe3f authored by Mac's avatar Mac

我的学习页面

parent 95fff39c
......@@ -9,4 +9,38 @@ export function getMyStudyCourseList(data) {
method: 'post',
data
})
}
/**
* 获取学习中心详情
* @param {JSON参数} data
*/
export function getMyStudyCourseInfo(data) {
return request({
url: '/AppletIndex/GetMyStudyCourseInfo',
method: 'post',
data
})
}
/**
* 获取视频地址id
* @param {JSON参数} data
*/
export function getVideoPlayAuth(data) {
return request({
url: '/Video/GetVideoPlayAuth',
method: 'post',
data
})
}
/**
* 获取视频地址
* @param {JSON参数} data
*/
export function getPlayInfo(data) {
return request({
url: '/Video/GetPlayInfo',
method: 'post',
data
})
}
\ No newline at end of file
......@@ -133,7 +133,7 @@
})
if (res && res.Data.phoneNumber) {
data.obj.phoneNum = res.Data.phoneNumber
// data.obj.phoneNum = '19138490577'
// data.obj.phoneNum = '18328620563'
data.obj.openid = res.Data.openid
data.obj.unionid = res.Data.unionid
that.phoneNumLogin()
......
<template>
<swiper class="image-container" previous-margin="45rpx" next-margin="45rpx" :indicator-dots="true" indicator-active-color='#4C50E7' @change="swiperChange">
<swiper-item :class="currentIndex == index ? 'swiper-item' : 'swiper-item-side'" v-for="(item, index) in imgList" :key="item[urlKey]">
<!-- <image @click="clickImg(item)" :class="currentIndex == index ? 'item-img' : 'item-img-side'" :src="item[urlKey]" lazy-load :style="dontFirstAnimation ? 'animation: none;' : ''" mode="aspectFill"></image> -->
<view class="box" :class="currentIndex == index ? 'item-img' : 'item-img-side'" :style="{background:item.B2BBackground ? getOpacityColor(item.B2BBackground,0.3):'#FFF',}">
<view class="box-state">
<span v-if="item.ClassStatus==1">未开班</span>
<span v-if="item.ClassStatus==2">学习中</span>
<span v-if="item.ClassStatus==3">已结课</span>
</view>
<view class="box-center">
<view class="box-center-l" :style="{background:item.B2BBackground ? getOpacityColor(item.B2BBackground,0.7):'#FFF',}">
<image mode='widthFix' :src="item.B2BIcon"></image>
</view>
<view class="box-center-r">
<view>
<view style="font-size: 15px;font-weight: bold;">{{item.CourseName}}</view>
<view style="font-size: 12px;font-weight: 500;margin-top: 5px;">{{item.ClassName}}</view>
<view class="row" style="font-size: 12px;margin-top: 5px;">
<view class="row">总计<span style="color: #4C50E7;margin:0 3px;font-weight: bold;">{{item.TotalHours}}</span>课时</view>
<view style="width: 1px;height: 15px;background-color:#999999;margin: 0 10px;"></view>
<view class="row">剩余<span style="color: #4C50E7;margin:0 3px;font-weight: bold;">{{item.SurplusHours}}</span>课时</view>
</view>
</view>
<view>
<view class="row" style="justify-content: space-between;font-size: 11px;">
<span>已学课程</span>
<span>{{item.CompleteHours}}/{{item.TotalHours}}</span>
</view>
<van-progress :percentage="(item.CompleteHours/item.TotalHours)*100" :showPivot='false'/>
</view>
</view>
</view>
</view>
</swiper-item>
</swiper>
</template>
<script>
export default {
props: {
imgList: {
type: Array,
default() {
return []
}
},
urlKey: {
type: String,
default() {
return ''
}
},
},
data() {
return {
currentIndex: 0,
dontFirstAnimation: true
}
},
methods: {
swiperChange(e) {
this.dontFirstAnimation = false
this.currentIndex = e.detail.current;
this.$emit('selected', this.currentIndex)
},
clickImg(item) {
this.$emit('selected', item, this.currentIndex)
},
getOpacityColor(thisColor, thisOpacity){
var theColor = thisColor.toLowerCase();
//十六进制颜色值的正则表达式
var r = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
// 如果是16进制颜色
if (theColor && r.test(theColor)) {
if (theColor.length === 4) {
var sColorNew = "#";
for (var i = 1; i < 4; i += 1) {
sColorNew += theColor.slice(i, i + 1).concat(theColor.slice(i, i + 1));
}
theColor = sColorNew;
}
//处理六位的颜色值
var sColorChange = [];
for (var i = 1; i < 7; i += 2) {
sColorChange.push(parseInt("0x" + theColor.slice(i, i + 2)));
}
return "rgba(" + sColorChange.join(",") + "," + thisOpacity + ")";
// return "rgba(" + sColorChange.join(",") + ", 0.7)";
}
return theColor;
}
}
}
</script>
<style scoped>
.image-container {
width: 750rpx;
height: 350rpx;
}
.item-img {
width: 630rpx;
height: 300rpx;
border-radius: 14rpx;
animation: to-big .3s;
}
.swiper-item {
width: 630rpx;
height: 300rpx;
display: flex;
justify-content: center;
align-items: center;
}
.item-img-side {
width: 630rpx;
height: 260rpx;
border-radius: 14rpx;
animation: to-mini .3s;
}
.swiper-item-side {
width: 630rpx;
height: 260rpx;
display: flex;
justify-content: center;
align-items: center;
}
.box{
position: relative;
display: flex;
align-items: center;
justify-content: center;
/* padding: 0 20rpx; */
}
.box-center{
display: flex;
align-items: center;
justify-content: space-between;
width: calc(100% - 36rpx);
}
.box-center-l{
width: 162rpx;
height: 208rpx;
border-radius: 6px;
position: relative;
}
.box-center-l image{
position: absolute;
bottom: 10rpx;
right: 10rpx;
max-width: 100rpx;
height: auto;
}
.box-center-r{
flex:1;
margin-left: 12px;
min-height: 208rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.row{
display: flex;align-items: center;
}
.box-state{
width: 36rpx;
height: 88rpx;
position: absolute;
right:17px ;
top: 0;
background: #5DE3A6;
font-size: 20rpx;
color: #333333;
text-align: center;
}
@keyframes to-mini
{
from {
height: 300rpx;
}
to {
height: 260rpx;
}
}
@keyframes to-big
{
from {
height: 260rpx;
}
to {
height: 300rpx;
}
}
</style>
......@@ -3,23 +3,178 @@
width: 100%;
height: 100vh;
background: #F5F5F5;
overflow-y: auto;
}
.row{
display: flex;align-items: center;
}
.page-title {
font-size: 44rpx;
font-family: PingFang SC;
font-weight: bold;
color: #0f1b35;
}
.curriculum{
width: 100%;
}
.box{
padding: 100rpx 0rpx 50rpx;
}
.box-top{
width: 100%;
}
.box_t{
padding: 18px;
}
.box_tb{
height: 388rpx;
background: #FFFFFF;
border-radius: 12px;
padding: 15px;
}
.box_tb_c{
width: 50%;
display: flex;
flex-direction: column;
align-items: center;
padding: 46rpx;
}
.box_tb_c span{
font-size: 12px;
color: #666666;
}
.box_tb_c text{
font-size: 11px;
color: #111111;
font-weight: bold;
}
.box_tb_b{
display: flex;
flex-direction: column;
align-items: center;
margin-top: 5px;
}
.box_tb_b .btn{
width: 130rpx;
height: 50rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 11px;
border-radius: 26rpx;
background: #4C50E7;
color: #FFFFFF;
margin-top: 7px;
}
.box_review{
background: #EBEBEB;
padding: 18px;
margin-top: 10px;
}
.box_review_date_item{
width: calc((100vw - 36px)/7);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: 17px;
color: #999999;
height: 140rpx;
border-radius: 12px 12px 0px 0px;
}
.box_review_date_item2{
background: #4C50E7;
color: #FFF;
font-weight: bold;
}
.box_review_sp{
height: 420rpx;
border-radius: 12px;
background: linear-gradient(to bottom, #4C50E7, #FFFFFF);
padding: 5px;
margin-top: -5px;
}
.box_review_box{
background: #000000;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
color: #FFF;
height: 100%;
border-radius: 12px;
}
.box_review_swiper{
width: calc(100vw - 36px - 10px);
height: 380rpx;
}
.myVideo{
width: 100%;
height: 100%;
}
.examination{
margin-top: 25px;
}
.examination-box{
background: #FFF;
margin: 10px 0;
}
.examination-box-c{
height: 170rpx;
background: #F9F9F9;
display: flex;
padding: 10px 0;
}
.examination-box-c-item{
width: 200rpx;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
font-size: 12px;
color: #8F8F92;
}
.examination-box-c-item .item_o{
color: #A3A3A3;
}
.examination-box-c-item .item_t{
color: #A3A3A3;
font-size: 19px;
font-weight: bold;
}
.shuxian{
width: 1px;
padding: 20px 0 ;
}
.examination-box-btnbox{
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.examination-btn{
width: 150rpx;
height: 60rpx;
border-radius: 30rpx;
background: #4C50E7;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: bold;
color: #FFF;
margin: 20px 0;
}
</style>
<template>
<view class="studyindex">
......@@ -28,40 +183,272 @@
</van-nav-bar>
<view class="curriculum">
<template v-if="CourseList.length==0">
<!-- 无数据的显示 -->
<indexNo></indexNo>
</template>
<template v-if="CourseList.length>0">
<view class="box" :style="{ 'margin-top': `${statusBarHeight}px` }">
<view class="box-top">
<carousel :img-list="CourseList" url-key="B2BIcon" @selected='selectedBanner'></carousel>
</view>
</view>
<view class="box_t">
<view class="box_tb">
<view class="row" style="justify-content: space-between;">
<view class="row" style="color: #111111;font-size: 14px;font-weight: bold;">
<view >单词积分 </view>
<view style="margin-left: 5px;">80 </view>
<image style="width: 17px;height: 16px;margin-left: 10px;" src="../../static/image/xingxing.png"></image>
</view>
<view style="font-size: 11px;color: #4C50E7;">所有单词</view>
</view>
<view class="row" style="justify-content: space-around;">
<view class="box_tb_c">
<span>下节单词</span>
<view class="row" style="align-items: flex-end;">
<text style="font-size: 78rpx;font-style: italic">{{InfoData.Words.NextWord}}</text>
<text style="margin-left: 5px;margin-bottom: 10px;"></text>
</view>
</view>
<view class="box_tb_c">
<span>需要复习</span>
<view class="row" style="align-items: flex-end;">
<text style="font-size: 78rpx;font-style: italic">{{InfoData.Words.ReviewWord}}</text>
<text style="margin-left: 5px;margin-bottom: 10px;"></text>
</view>
</view>
</view>
<view class="box_tb_b">
<view style="font-size: 11px;color: #999999;">预计用时10分钟</view>
<view class="btn">立即学习</view>
</view>
</view>
</view>
<view class="box_review" v-if='InfoData'>
<view class="row" style="justify-content: space-between;">
<view class="row" style="color: #111111;font-size: 14px;font-weight: bold;">
<view >课程回顾 </view>
<view style="font-size: 10px;color: #999999;">(最近7天课程)</view>
</view>
<view style="font-size: 11px;color: #4C50E7;">所有课程</view>
</view>
<view class="box_review_date row" style="margin-top: 20px;" v-if='InfoData.Review'>
<view v-for="(x,y) in InfoData.Review" :key='y'>
<view :class="{'box_review_date_item2':current==y}" class="box_review_date_item" @click="goreview(x,y)">
<text>{{getdate(x,1)}}</text>
<text style="font-size: 11px;margin-top: 5px;">{{getdate(x,2)}}</text>
</view>
</view>
</view>
<view class="box_review_sp">
<view class="box_review_box" v-if="loading">
<van-loading size="24px" vertical color="#FFF"text-color="#FFF">加载中...</van-loading>
</view>
<view class="box_review_box" v-if="!loading">
<view v-if="InfoData.Review[current].videolist.length==0">暂无回顾视频...</view>
<template v-if="InfoData.Review[current].videolist.length>0">
<swiper class="box_review_swiper" @change="swiperChange">
<swiper-item style="width: 100%;height: 100%;" v-for="(item, index) in InfoData.Review[current].videolist" :key="index">
<video class="myVideo" :id="'Video'+current+'-'+index" :src="item.URL" controls></video>
</swiper-item>
</swiper>
</template>
</view>
</view>
</view>
<view class="examination" v-if='InfoData'>
<view style="padding: 0 20px;">
<view style="color: #666666;font-size: 14px;">加油哦!</view>
<view class="row" style="justify-content: space-between;margin-top: 9px;">
<view class="row" style="color: #111111;font-size: 23px;font-weight: bold;">
考试
</view>
<view style="font-size: 14px;color: #4C50E7;">更多试题</view>
</view>
</view>
<view v-for="(x,y) in InfoData.ExamList" :key='y'>
<view class="examination-box">
<view style="padding: 20px;">
<view style="font-size: 18px;font-weight: bold;color: #111111;">{{x.PaperName}}</view>
<view style="font-size: 12px;font-weight: 500;color: #999999;margin-top: 9px;">测评次数:5次</view>
</view>
<view style="overflow-x:auto;width:100%;white-space:nowrap;">
<view class="examination-box-c">
<view class="examination-box-c-item">
<text class="item_o">我的排名</text>
<text class="item_t">#{{x.MyRank}}</text>
<text class="">分数</text>
</view>
<view class="shuxian"> <view style="width: 1px;height: 100%;background: #E1E1E1;"></view></view>
<view class="examination-box-c-item">
<text class="item_o">我的得分</text>
<text class="item_t">{{x.TotalScore}}</text>
<text class=""></text>
</view>
<view class="shuxian"> <view style="width: 1px;height: 100%;background: #E1E1E1;"></view></view>
<view class="examination-box-c-item">
<text class="item_o">考试状态</text>
<text class="item_t" style="font-size: 14px;">{{x.ExamStatusStr}}</text>
<text class="" style="opacity: 0;">.</text>
</view>
<view class="shuxian"> <view style="width: 1px;height: 100%;background: #E1E1E1;"></view></view>
<view class="examination-box-c-item">
<text class="item_o">我的耗时</text>
<text class="item_t">#{{x.ExamSecondTime}}</text>
<text class=""></text>
</view>
<view class="shuxian"> <view style="width: 1px;height: 100%;background: #E1E1E1;"></view></view>
<view class="examination-box-c-item">
<text class="item_o">最高等分</text>
<text class="item_t">#{{x.MaxScore}}</text>
<text class=""></text>
</view>
<view class="shuxian"> <view style="width: 1px;height: 100%;background: #E1E1E1;"></view></view>
</view>
</view>
<view class="examination-box-btnbox">
<view class="examination-btn">
开始测试
</view>
</view>
</view>
</view>
</view>
</template>
</view>
<bottom></bottom>
</view>
</template>
<script>
import indexNo from './components/indexNo.vue'
import carousel from './components/vear-carousel/vear-carousel.vue'
import bottom from '../../components/bottom.vue'
import {ref,reactive,toRefs,toRef,getCurrentInstance,watch,computed,onMounted,provide,} from "vue";
import {
getMyStudyCourseList,//课程列表
getMyStudyCourseInfo,//详情
getVideoPlayAuth,//视频id
getPlayInfo,//视频地址
} from "../../api/study.js";
export default {
components: {
indexNo,
bottom,
carousel
},
setup(props) {
let data = reactive({
CourseList:[],//课程列表
statusBarHeight: 0,
CourseInfoMsg:{
ClassId:0,
GuestId:0,
},
InfoData:null,
current:0,
loading:false,//获取视频加载中
})
let methods = {
async getCourseList() {
let res = await getMyStudyCourseList({});
if (res.resultCode == 1) {
console.log(res)
if (res.Code == 1) {
data.CourseList = res.Data
if(data.CourseList.length>0){
data.CourseInfoMsg.ClassId = data.CourseList[0].ClassId;
data.CourseInfoMsg.GuestId = data.CourseList[0].GuestId;
that.getCourseInfo()
}
}
},
async getCourseInfo() {//详情
let res = await getMyStudyCourseInfo(data.CourseInfoMsg);
if (res.Code == 1) {
data.InfoData = res.Data
if(res.Data && res.Data.Review.length>0){
data.InfoData.Review.forEach(x=>{
x.videolist = []
})
that.getvideo()
}
}
},
selectedBanner(index){//切换轮播图的时候 调取接口
data.CourseInfoMsg.ClassId = data.CourseList[index].ClassId;
that.getCourseInfo()
},
goreview(x,y){//回顾选择
that.swiperChange()//让当前页面的视频暂停
data.current = y;
that.getvideo()
},
getvideo(){
if(data.InfoData.Review[data.current].videolist.length==0){
let datalist = data.InfoData.Review[data.current].List
if(datalist.length>0){
data.loading = true
datalist.forEach((x,y)=>{
that.getvideoId(x,y)
})
}
}
},
async getvideoId(x,y) {//获取视频id
if(x.VideoUrl){//判断是否有视频id
let res = await getVideoPlayAuth({strVid:x.VideoUrl});
if (res.Code == 1) {
that.getvideourl(res.Data,y)
}
}else{
data.loading = false
}
},
async getvideourl(x,y) {//获取视频地址
let res = await getPlayInfo({strVid:x.VideoMeta.VideoId});
if (res.Code == 1) {//地址赋值
data.InfoData.Review[data.current].videolist.push(res.Data)
data.InfoData.Review[data.current].videolist.push(res.Data)
if(y+1 == data.InfoData.Review[data.current].List.length){
data.loading = false
}
}
},
swiperChange(){//当前选择视频全部暂停
let trailer = data.InfoData.Review[data.current].videolist // 获取视频列表
if(trailer.length>0){
trailer.forEach((item, index) => {
if(item.URL != null && item.URL != ''){
let temp = 'Video'+data.current+'-'+index;
// 暂停其他视频
uni.createVideoContext(temp, this).pause()
}
})
}
},
getdate(x,type){//获取月和天
let day = '',month='';
if(type==1){
day = x.ClassDate.split('-')[2]
return day
}else{
month = x.ClassDate.split('-')[1]
month = Number(month)+'月'
return month
}
}
}
onMounted(()=>{
that.getCourseList()//我的课程列表
data.statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
})
let that = methods;
......@@ -69,7 +456,11 @@
...toRefs(data),
...methods,
};
}
},
onShow() {
this.getCourseList()//我的课程列表
},
}
</script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment