wangguoyu 1 vecka sedan
förälder
incheckning
75e48d4cc4

+ 5 - 0
pages/studyBk/readme.txt

@@ -0,0 +1,5 @@
+created by  wgy
+备份!!!!!
+此文件夹下内容是 岛的逻辑 使用缓存修改
+
+新的逻辑为不使用缓存逻辑 

+ 34 - 0
pages/studyBk/study/daoTipDialog.vue

@@ -0,0 +1,34 @@
+<template>
+	<uni-popup ref="daoTipPopup" type="bottom" :is-mask-click="false">
+		<view class="dao-popup-box">
+			<view class="dao-popup-img" :style="{backgroundImage: 'url(' + productTip + ')'}"></view>
+			<view class="dao-popup-btn" @click="handleClose"></view>
+		</view>
+	</uni-popup>
+</template>
+
+<script setup>
+	import {ref} from "vue";
+	const props = defineProps({
+	  productTip: {
+	    type: String,
+	    default: ''
+	  },
+	});
+	const daoTipPopup = ref(null);
+	const $emit = defineEmits(['dao-tip-close'])
+	function handleShow() {
+		daoTipPopup.value.open();
+	}
+	function handleClose() {
+		daoTipPopup.value.close();
+		$emit('dao-tip-close');
+	}
+	
+	defineExpose({
+		handleShow
+	})
+</script>
+
+<style>
+</style>

+ 29 - 0
pages/studyBk/study/eggDialog.vue

@@ -0,0 +1,29 @@
+<template>
+	<uni-popup ref="eggPopup" :animation="false" :is-mask-click="false"
+	 mask-background-color="rgba(51, 137, 217, 0.65);">
+	 <view class="study-egg-dialog">
+			<view class="egg-content-box">
+				<view class="egg-img"></view>
+				<view class="egg-btn" @click="eggBtn"></view>
+			</view>
+	 </view>
+	</uni-popup>
+</template>
+
+<script setup>
+	import { ref } from 'vue';
+	 const $emit = defineEmits(['eggBtn'])
+	const eggPopup = ref(null); // 索引
+	// 打开弹窗
+	function eggShow() {
+		eggPopup.value.open();
+	}
+	// 开启提分之旅按钮
+	function eggBtn(){
+		eggPopup.value.close();
+		$emit('eggBtn')
+	}
+	defineExpose({
+			eggShow
+		})
+</script>

+ 397 - 0
pages/studyBk/study/index.vue

@@ -0,0 +1,397 @@
+<template>
+	<view>
+	<swiper :circular="true"  @change="onChangeTab" :duration="currentDuration"
+		:current="current" class="ezy-study-swiper" :class="'ezy-study-swiper'+ currentProduct" >
+		<swiper-item v-for="(item,index) in zhangList" :key="index">
+			<shuxueZhangjie v-if="currentProduct ==1" @clickGradeTerm="clickGradeTerm"
+				@handleCheckCatalogue="handleCheckCatalogue(item)" @listClick="listClick" :gradeTerm='gradeTerm'
+				:options="item">
+			</shuxueZhangjie>
+			<yingyuZhangjie v-if="currentProduct ==2" @clickGradeTerm="clickGradeTerm"
+				@handleCheckCatalogue="handleCheckCatalogue(item)" @listClick="listClick" :gradeTerm='gradeTerm' :options="item">
+			</yingyuZhangjie>
+		</swiper-item>
+	</swiper>
+	<!-- 蛋 -->
+	<egg-dialog ref="eggDialogRef" @eggBtn="eggBtn"></egg-dialog>
+	<catalogue ref="catalogueRef" :list=zhangList @change-zhang="handleChangeZhang" @listSelectJieClick="listSelectJieClick"></catalogue>
+	<CustomTabBar :cardId="cardId" :currentTabNumber="0" :nianji="nianji" :zhangId="zhangId" :tipFlag="tipFlag"></CustomTabBar>
+	<tip-small-dialog ref="goPayDialogRef" @confirm-btn="goPayPage" :content="tipContent"></tip-small-dialog>
+	<tip-big-dialog ref="youkeDialogRef" @confirm-btn="ykConfirm" :imgShow="true"></tip-big-dialog>
+	<dao-tip-dialog ref="daoTipDialogRef" v-if="showDaoTip" :productTip="productTipImg" @dao-tip-close="daoTipClose"></dao-tip-dialog>
+	</view>
+</template>
+<script setup>
+	import daoTipDialog from './daoTipDialog.vue';
+	import {
+		userZhangInfo,
+		userLocate,
+		userZhangForntInfo,
+		userZhangNextInfo,
+		getCommonZhangInfo
+	} from "@/api/learnPlan.js"
+	import {
+		reactive,
+		ref,
+		nextTick,
+		getCurrentInstance,
+		onMounted
+	} from "vue";
+	import {
+		onLoad
+	} from '@dcloudio/uni-app';
+	import catalogue from "@/components/catalogue/catalogue.vue";
+	import CustomTabBar from '@/components/custom-tabbar/custom-tabbar.vue';
+	import tipSmallDialog from '@/components/dialog/tipSmallDialog.vue'
+	import tipBigDialog from '@/components/dialog/tipBigDialog.vue';
+	import tipMiddleDialog from '@/components/dialog/tipMiddleDialog.vue';
+	import dSwiper from '@/components/wSwiper/DSwiper.vue';
+
+	import shuxueZhangjie from './product/shuxue.vue';
+	import yingyuZhangjie from './product/yingyu.vue';
+
+	import {
+		useTabBarHistory
+	} from '@/utils/emitEvents.js';
+	import eggDialog from './eggDialog.vue'
+	import {
+		toast,
+		getUserIdentity
+	} from "@/utils/common";
+	import cacheManager from "@/utils/cacheManager.js";
+	const tipContent = '付费章节,是否前往开通付费?'; //当前产品
+	const goPayDialogRef = ref(null);
+	const youkeDialogRef = ref(null);
+	const dSwiperRef = ref(null);
+	const eggDialogRef = ref(null);
+	const current = ref(0);
+	const currentDuration = ref(500)
+	const YouKeContent = '您当前的身份是游客,想要体验完整内容需注册成用户!';
+	const zhangId = ref(null); //游客使用
+	const nianji = ref(null); //游客使用
+	const cardId = ref(null); //游客使用
+	const tipFlag = ref(null) //游客使用
+	const catalogueRef = ref(null);
+	const youkeZhangInfoData = ref(null);
+	const currentProduct = ref(null);
+	const selectZhang = ref(null);
+	const zhangList = ref(null);
+	const gradeTerm = ref(null);
+	let infoData = reactive({
+		jieList: [],
+		haveFlag: '',
+		nianji: '',
+		number: '',
+		cardId: '',
+		zhangId: '',
+		zhangName: '',
+		numberStr: '',
+	});
+	const gradeMapping = {
+		1: 'L1',
+		2: 'L2',
+		3: 'L3',
+		4: 'L4',
+		5: 'L5',
+		6: 'L6'
+	};
+
+	const termMapping = {
+		1: ' 数学',
+		2: ' 英语'
+	};
+	
+	const daoTipDialogRef = ref(null);
+	const showDaoTip = ref(true);
+	const productTipImg = ref('');
+		
+	onLoad((options) => {
+		init(options);
+	})
+	
+	function listSelectJieClick(item,data,index) {
+		
+		if( cacheManager.get('auth')){
+			cacheManager.updateObject('auth', {
+				currentZhang: zhangList.value.findIndex(citem => citem.zhangId == item.zhangId),
+				zhangId: item.zhangId
+			})
+		}
+		
+		listClick(data,item,index );
+	}
+	
+	function getProjectImg(){
+		if(currentProduct.value ==1){
+			// 数学
+			productTipImg.value = 'static/images/study/shuxue/shuxue-tip.gif';
+			getBj('shuxue')
+		}else if(currentProduct.value ==2){
+			// 英语
+			productTipImg.value = 'static/images/study/yingyu/yingyu-tip.gif'
+			getBj('yingyu');
+		}
+	}
+	function getBj(data){
+		let bjType =cacheManager.get('dao-tip')[data];
+		if(cacheManager.get('auth')){
+			// 非游客
+			if(bjType!=='has'){
+				nextTick(() => {
+					daoTipDialogRef.value.handleShow();
+				})
+			}
+		}else{
+			// 游客
+			if(tipFlag.value==='0'){
+				nextTick(() => {
+					daoTipDialogRef.value.handleShow();
+				})
+			}
+		}
+	}
+	function daoTipClose(){
+		if(cacheManager.get('auth')){
+			// 非游客 记缓存
+			if(currentProduct.value ==1){
+				// 数学
+				cacheManager.updateObject('dao-tip',{shuxue:'has'})
+			}else if(currentProduct.value ==2){
+				// 英语
+				cacheManager.updateObject('dao-tip',{yingyu:'has'})
+			}
+		}else{
+			//游客
+			tipFlag.value = '1';
+		}
+	}
+	function onChangeTab(e) {
+		console.log('e',e);	
+		console.log(e.detail.current);
+		if( cacheManager.get('auth')){
+			infoData.zhangId = cacheManager.get('zhangInfo').zhangList[e.detail.current].zhangId
+			cacheManager.updateObject('auth', {
+				currentZhang: e.detail.current,
+				zhangId: infoData.zhangId
+			})
+		}
+	}
+
+	function init(options) {
+		if (cacheManager.get('auth')) {
+			//会员 取auth
+			selectZhang.value = cacheManager.get('auth');
+			currentProduct.value = cacheManager.get('auth').cardId;
+			//let currentObject = this.cacheZhangInfo.jieList.find(item => item.jieId == this.jieId);
+			console.log(selectZhang.value);
+			// 已登录
+			if (selectZhang.value.firstLogin) {
+				nextTick(() => {
+					eggDialogRef.value.eggShow();
+				})
+			}
+			// cacheManager.set('daoPageCache',{isCache:true})
+			if(!cacheManager.get('daoPageCache').isCache){
+					getZhangInfo()
+				
+			}else{
+					console.log('shiyonghuancun');
+					translateData(cacheManager.get('auth'))
+					zhangList.value = cacheManager.get('zhangInfo').zhangList
+					current.value = cacheManager.get('auth').currentZhang
+					infoData.zhangId = cacheManager.get('zhangInfo').zhangList[current.value].zhangId
+					recordZhangJie()	
+			}
+			
+			// 已登录付费未支付选择返回 -> 恢复弹窗
+			if (options.studyWithCatalgue) {
+				// 展开弹窗
+				nextTick(() => {
+					catalogueRef.value.showPopup({zhangId: infoData.zhangId});
+				}) 
+			}
+		} else {
+			zhangId.value = options.zhangId
+			nianji.value = options.nianji
+			cardId.value = options.cardId
+			tipFlag.value = options.tipFlag;
+			currentProduct.value = options.cardId
+			// 未登录 游客 
+			getCommonZhang(options)
+			getProjectImg()
+		}
+	}
+
+	function getZhangInfo(data) {
+		let req = {
+			nianji: selectZhang.value.nianji,
+			cardId: selectZhang.value.cardId,
+			zhangId: selectZhang.value.zhangId,
+		}
+		userZhangInfo(req).then(res => {
+			cacheManager.set('zhangInfo', res.data)
+			let zhang = cacheManager.get('zhangInfo').zhangList.findIndex(zhang => zhang.zhangId == selectZhang
+				.value.zhangId);
+			if (zhang != -1) {
+				cacheManager.updateObject('auth', {
+					currentZhang: zhang
+				})
+			} else {
+				cacheManager.updateObject('auth', {
+					currentZhang: 0
+				})
+			}
+			cacheManager.set('daoPageCache',{isCache:true})
+			
+			nextTick(() => {
+				translateData(res.data)
+				zhangList.value = res.data.zhangList
+				current.value = cacheManager.get('auth').currentZhang
+				infoData.zhangId = res.data.zhangList[current.value].zhangId
+				recordZhangJie()
+			})
+
+		})
+	}
+
+	function getCommonZhang(data) {
+
+		let req = {
+			nianji: data.nianji,
+			cardId: data.cardId,
+			zhangId: data.zhangId,
+		}
+		getCommonZhangInfo(req).then(res => {
+			translateData(res.data)
+			youkeZhangInfoData.value =  res.data
+			zhangList.value = res.data.zhangList
+			current.value = 0
+		})
+	}
+
+	function recordZhangJie() {
+		let req = {
+			nianji: selectZhang.value.nianji,
+			userId: cacheManager.get('auth').userId,
+			zhangId: infoData.zhangId,
+			cardId: selectZhang.value.cardId,
+
+		}
+		userLocate(req).then(res => {
+
+		})
+	}
+
+	function goPayPage() {
+		uni.redirectTo({
+			url: '/pages/pay/svip?cardId='+currentProduct.value
+		})
+	}
+
+	function handleChangeZhang(data) {
+		console.log(data);
+		selectZhang.value = data;
+		const authCode = getUserIdentity();
+		if (authCode !== 'Visitor') {
+			cacheManager.updateObject('auth', {
+				zhangId: data.zhangId,
+        currentZhang: zhangList.value.findIndex(citem => citem.zhangId == data.zhangId),
+			})
+		}
+		currentDuration.value = 0
+		setTimeout(() => {
+			current.value = data.number - 1
+			nextTick(() => {
+				currentDuration.value = 500
+			})
+		}, 100)
+		//	init()
+	}
+
+	function goKaoshi(data) {
+		uni.redirectTo({
+			// url: `/pages/unitTest/index?jieNumber=` + data.number
+			url: `/pages/unitTest/index?jieId=` + data.jieId
+		})
+	}
+
+	function goLookShipin(data,index) {
+		if (!cacheManager.get('auth')) {
+			console.log('zhangList.value[0].jieList',zhangList.value[0].jieList);
+			console.log('zhangList.value[0].jieList.index',zhangList.value[0].jieList[index]);
+		
+			let youkeData = {
+				cardId:cardId.value,
+				nianji:nianji.value,
+				zhangId:zhangId.value,
+				tipFlag:tipFlag.value,
+				jieList:zhangList.value[0].jieList[index],
+				jieName:zhangList.value[0].jieList[index].jieName
+			}
+			uni.redirectTo({
+				url: '/pages/study/lookShipin?youkePageData=' + JSON.stringify(youkeData)
+			})
+		} else {
+			uni.redirectTo({
+				url: '/pages/study/lookShipin?jieId=' + data.jieId
+			})
+		}
+	}
+
+	function translateData(data) {
+		gradeTerm.value = termMapping[data.cardId] +' · '+ gradeMapping[data.nianji]
+	}
+
+	function listClick(data,data2,index) {
+		//debugger
+		console.log('data',data);
+		console.log('data2',data2);
+		if ((!cacheManager.get('auth') && data2.number != 1)||(!cacheManager.get('auth') && data.type == 2) ) {
+			youkeDialogRef.value.handleShow();
+			return;
+		}
+		const authCode = getUserIdentity();
+		console.log('authCode', authCode);
+		if (!(authCode == 'VIP' || data2.number == 1)) {
+		//	debugger
+			goPayDialogRef.value.handleShow();
+			return false
+		}
+		if (data.type == 2) {
+			// 最后一项
+			goKaoshi(data,index)
+		} else {
+			goLookShipin(data,index)
+		}
+	}
+
+	function handleCheckCatalogue(item) {
+		catalogueRef.value.showPopup(item);
+	}
+
+	function clickGradeTerm() {
+		// if(cacheManager.get('auth')){
+		// 	cacheManager.updateObject('auth', {
+		// 		currentZhang: 0
+		// 	})
+		// }
+		uni.navigateTo({
+			url: `/pages/selectGradesTerms/index?tipFlag=${tipFlag.value}`,
+		})
+	}
+	// 游客弹窗---确定
+	function ykConfirm() {
+		uni.redirectTo({
+			url: '/pages/login/index'
+		});
+	}
+	function eggBtn() {
+		console.log('点击:开启提分之旅');
+		getProjectImg();
+		cacheManager.updateObject('auth', {
+			firstLogin: false
+		})
+	}
+</script>
+<style>
+</style>

+ 538 - 0
pages/studyBk/study/lookShipin.vue

@@ -0,0 +1,538 @@
+<template>
+	<view class="ezy-course-page" :style="{backgroundImage: 'url(' + courseBjFun() + ')'}">
+		<view class="icon-title-navBar-box">
+			<view @click="goUpPage" class="nav-bar-icon"></view>
+			<text class="nav-bar-title">{{shipinTitle}}</text>
+		</view>
+		<view class="ezy-video-box course-video-box">
+			<view ref="videoContent" id="wgy-player-test" :playAuth="playAuth"
+				:change:playAuth="renderScript.receiveMsg" :videoId="videoId" :change:videoId="renderScript.videoIdFun"
+				:hideFlag="hideFlag" :change:hideFlag="renderScript.hideFlagFun" :progressMarkers="progressMarkers"
+				:change:progressMarkers="renderScript.progressMarkersMsg" :seekTime="seekTime"
+				:change:seekTime="renderScript.seekTimeFun" class="ezy-video">
+			</view>
+		</view>
+		<view class="course-content-border">
+			<view class="course-content-box">
+				<!-- <view class="course-title">{{jieName}}</view> -->
+				<view v-for="(item,index) in progressMarkers" :key="index" @click="markersClick(item)">
+					<view class="title-play-box">
+						<icon class="course-icon" :style="{backgroundImage: 'url(' + courseIconFun() + ')'}"></icon>
+						<view class="course-title">{{item.title}}</view>
+						<view class="course-play-btn" @click="markersClick(item)">视频讲解</view>
+					</view>
+					<rich-text :nodes="item.describe" class="course-content-item"></rich-text>
+				</view>
+			</view>
+		</view>
+		<uni-popup ref="popupRef" :animation="false" :is-mask-click="false"
+			mask-background-color="rgba(51, 137, 217, 0.95);">
+			<view :class="courseClass">
+				<view class="text-score">{{credit}}</view>
+				<view class="course-btn-box">
+					<view @click="goBack" class="return-btn"></view>
+					<view @click="goNext" class="continue-btn"></view>
+				</view>
+			</view>
+		</uni-popup>
+		<tip-big-dialog ref="youkeDialogRef" @confirm-btn="ykConfirm" :imgShow="true"></tip-big-dialog>
+		<svip-dialog ref="svipDialogRef" @confirm-btn="svipConfirm"></svip-dialog>
+	</view>
+
+</template>
+
+<script>
+	import {
+		ref
+	} from 'vue';
+	import {
+		onLoad,
+		onReady
+	} from '@dcloudio/uni-app';
+	import {
+		getVideoAuth,
+		getVideoAuthYk,
+		videoWancheng
+	} from "@/api/shipin.js"
+	import tipMiddleDialog from '@/components/dialog/tipMiddleDialog.vue';
+	import tipBigDialog from '@/components/dialog/tipBigDialog.vue';
+	import svipDialog from './svipDialog.vue';
+	import {
+		toast,
+		getUserIdentity
+	} from "@/utils/common";
+	import {
+		userZhangNextInfo,
+	} from "@/api/learnPlan.js"
+	import cacheManager from "@/utils/cacheManager.js";
+
+	export default {
+		data() {
+			return {
+				pageData: null, //上个页面获取的视频参数(视频id)
+				playAuth: "", //播放凭证
+				progressMarkers: [],
+				jieName: '',
+				hideFlag: 'show',
+				videoId: "", //阿里云视频id
+				cardId: '',
+				credit: '',
+				nianji: '',
+				zhangId: '',
+				seekTime: '',
+				jieId: '',
+				courseClass: '',
+				shipinTitle: '',
+				cacheZhangInfo: {},
+				cacheCurrentZhangIndex: '',
+				YouKeContent: '您当前的身份是游客,想要体验完整内容需注册成用户!'
+			}
+		},
+		components: {
+			tipMiddleDialog,
+			tipBigDialog,
+			svipDialog
+		},
+		onLoad(options) {
+			if (!cacheManager.get('auth')) {
+				const youkeData = JSON.parse(options.youkePageData)
+				// 游客
+				this.videoId = youkeData.jieList.videoId
+				this.nianji = youkeData.nianji
+				this.zhangId = youkeData.zhangId
+				this.cardId = youkeData.cardId
+				this.tipFlag = youkeData.tipFlag
+				this.shipinTitle = youkeData.jieName
+				this.progressMarkers = youkeData.jieList.jiedianList || []
+				this.getLiveYk(); //获取播放凭证
+			} else {
+				this.init(options)
+			}
+		},
+
+		onHide() {
+			console.log('onHideonHideonHideonHide');
+			this.hideFlag = 'hide'
+		},
+		onUnload() {
+			console.log('onUnloadonUnloadonUnloadonUnloadonUnload');
+			this.hideFlag = 'hide'
+		},
+		methods: {
+			courseBjFun() {
+				switch (Number(cacheManager.get('auth').cardId)) {
+					case 1:
+						return 'static/images/course/couse-shuxue-bj.png'
+						break;
+					case 2:
+						return 'static/images/course/course-yingyu-bj.png'
+						break;
+					default:
+						break;
+				}
+			},
+			courseIconFun() {
+				switch (Number(cacheManager.get('auth').cardId)) {
+					case 1:
+						return 'static/images/course/shuxue-icon.png'
+						break;
+					case 2:
+						return 'static/images/course/yingyu-icon.png'
+						break;
+					default:
+						break;
+				}
+			},
+			init(options) {
+				this.jieId = options.jieId
+				if (!(cacheManager.get('zhangInfo') && options.jieId)) {
+					toast('数据错误,缓存丢失/ jieId丢失')
+					return false
+				}
+				this.cacheCurrentZhangIndex = cacheManager.get('auth').currentZhang
+				this.cacheZhangInfo = cacheManager.get('zhangInfo')
+
+				// let zhang = this.cacheZhangInfo.zhangList.find(zhang => zhang.zhangId == this.zhangId);
+				// if (!zhang) {
+				// 	return
+				// }
+				let zhang = this.cacheZhangInfo.zhangList[this.cacheCurrentZhangIndex]
+				let currentObject = zhang.jieList.find(item => item.jieId == options.jieId);
+				console.log(currentObject);
+				this.shipinTitle = currentObject.jieName
+				this.pageData = {
+					...currentObject
+				}
+				console.log(this.pageData);
+				this.videoId = this.pageData.videoId
+				this.jieName = this.pageData.jieName
+				this.credit = this.pageData.credit
+				this.progressMarkers = this.pageData.jiedianList || []
+				this.getLive(); //获取播放凭证
+			},
+			goNextZhang() {
+				let that = this
+				cacheManager.updateObject('auth', {
+					currentZhang: this.cacheCurrentZhangIndex + 1
+				})
+				this.cacheZhangInfo = cacheManager.get('zhangInfo')
+				let zhang = this.cacheZhangInfo.zhangList[this.cacheCurrentZhangIndex + 1]
+				uni.redirectTo({
+					url: '/pages/study/lookShipin?jieId=' + zhang.jieList[0].jieId
+				})
+			},
+			playEnd(data) {
+				console.log('data', data);
+				console.log('111111');
+				plus.screen.lockOrientation('portrait-primary');
+				const AuthCode = getUserIdentity();
+				console.log(AuthCode);
+				if (AuthCode == 'Visitor') {
+					return false
+				} else {
+
+					let currentJieData = cacheManager.getCurrentJieData('zhangInfo', this.cacheCurrentZhangIndex, this
+						.jieId)
+					if (currentJieData.studyFlag == 1) {
+						// 学完一遍
+						this.courseClass = 'course-finish-dialog'
+						this.$refs.popupRef.open();
+					} else {
+						cacheManager.updateJieStatus('zhangInfo', this.cacheCurrentZhangIndex, this.jieId)
+						this.courseClass = 'course-score-dialog'
+						this.$refs.popupRef.open();
+						let req = {
+							credit: this.credit,
+							jieId: this.jieId,
+						}
+						videoWancheng(req).then(res => {
+
+						})
+					}
+				}
+
+			},
+			goBack() {
+				plus.screen.unlockOrientation(); 
+				this.$refs.popupRef.close();
+				this.goUpPage()
+			},
+			goNext() {
+				plus.screen.unlockOrientation(); 
+				this.$refs.popupRef.close();
+				if (!cacheManager.get('auth')) {
+					console.log(this);
+					this.$refs.youkeDialogRef.handleShow();
+				} else {
+					const AuthCode = getUserIdentity();
+					console.log(AuthCode);
+					// if (AuthCode == 'Not-Vip') {
+					// 	this.$refs.svipDialogRef.handleShow();
+					// 	return false
+					// }
+					//	debugger
+					Number(this.jieId++)
+					console.log('this.pageData', this.pageData);
+					let currentObject = this.cacheZhangInfo.zhangList[this.cacheCurrentZhangIndex].jieList.find(item =>
+						item.jieId == this.jieId);
+					if (currentObject) {
+						this.pageData = {
+							...currentObject
+						}
+					}
+					// lastFlag是否是本章最后一节,0否1是  type,1视频,2试题
+					if (this.pageData.lastFlag == 1 && this.pageData.type == 2) {
+						uni.redirectTo({
+							url: `/pages/unitTest/index?jieId=` + this.pageData.jieId
+						})
+					} else if (this.pageData.lastFlag == 1 && this.pageData.type == 1) {
+						// 当前是本章最后一节,并且是 视频 切换下一章
+						this.goNextZhang()
+					} else {
+						uni.redirectTo({
+							//url: '/pages/study/lookShipin?studyData=' + JSON.stringify(pageData)
+							url: '/pages/study/lookShipin?jieId=' + this.jieId
+						})
+					}
+				}
+			},
+			getLiveYk() {
+				let req = {
+					videoId: this.videoId
+				}
+				getVideoAuthYk(req).then(res => {
+					this.playAuth = res.data
+				})
+			},
+			getLive() {
+				let req = {
+					videoId: this.videoId
+				}
+				getVideoAuth(req).then(res => {
+					this.playAuth = res.data
+				})
+			},
+			markersClick(data) {
+				this.seekTime = ""
+				this.$nextTick(() => {
+					this.seekTime = data.offset
+				});
+			},
+			goUpPage() {
+				if (!cacheManager.get('auth')) {
+					uni.redirectTo({
+						url: '/pages/study/index?cardId=' + this.cardId + '&nianji=' + this.nianji + '&zhangId=' +
+							this.zhangId + '&tipFlag=' + this.tipFlag
+					})
+				} else {
+					uni.redirectTo({
+						url: `/pages/study/index`
+
+					})
+				}
+
+
+
+			},
+			svipConfirm() {
+				uni.redirectTo({
+					url: '/pages/pay/svip?cardId=' + cacheManager.get('auth').cardId
+				})
+			},
+			ykConfirm() {
+				uni.redirectTo({
+					url: '/pages/login/index'
+				});
+			}
+		},
+		created() {
+			// console.log("getLive")
+			// this.getLive(); //获取播放凭证
+
+		},
+
+	}
+</script>
+
+
+
+<script module="renderScript" lang="renderjs">
+	export default {
+		mounted() {
+			console.log("renderScript1")
+			// 在适合的生命周期,通过script和link标签引入播放器sdk、css
+			//	this.loadWebPlayerSDK()
+		},
+		data() {
+			return {
+				player: null,
+				playAuth: '',
+				videoId: '',
+				progressMarkers: [],
+				isFullScreen: false,
+				seekTime: ''
+
+			}
+		},
+		methods: {
+
+			receiveMsg(newValue, oldValue, ownerInstance, instance) {
+				// console.log('service层中的options发生变化')
+				// console.log('新值', newValue)
+				// console.log('旧值', oldValue)
+				// ownerInstance和this.$ownerInstance一样,可用来向service层通信
+				// instance和ownerInstance的区别是:
+				// instance.$el指向的是触发事件的那个节点;ownerInstance.$el指向当前vue文件中的根节点;
+				// instance的作用目前尚不明确,官方没有给出用法
+				if (newValue) {
+					this.playAuth = ''
+					this.playAuth = newValue
+					this.loadWebPlayerSDK()
+
+				}
+			},
+			videoIdFun(newValue, oldValue, ownerInstance, instance) {
+				if (newValue) {
+					this.videoId = ''
+					this.videoId = newValue
+				}
+			},
+			hideFlagFun(newValue, oldValue, ownerInstance, instance) {
+				if (this.player) {
+					this.player.pause()
+				}
+			},
+			progressMarkersMsg(newValue, oldValue, ownerInstance, instance) {
+
+				if (newValue) {
+					this.progressMarkers = newValue
+				}
+			},
+			seekTimeFun(newValue, oldValue, ownerInstance, instance) {
+				if (newValue) {
+					this.player.play()
+					this.player.seek(newValue)
+					// switch (this.player.getStatus()) {
+					// 	case 'init':
+					// 		break;
+					// 	case 'ready':
+					// 		break;
+					// 	case 'loading':
+					// 	this.player.play()
+					// 	this.player.seek(newValue)
+					// 		break;
+					// 	case 'play':
+					// 		this.player.seek(newValue)
+					// 		break;
+					// 	case 'pause':
+					// 	this.player.play()
+					// 	this.player.seek(newValue)
+					// 		break;
+					// 	case 'playing':
+					// 	this.player.seek(newValue)
+					// 		break;
+					// 	case 'waiting':
+					// 		break;
+					// 	case 'error':
+					// 		break;
+					// 	case 'ended':
+					// 		break;
+					// 	default:
+					// 		break;
+					// }
+					//	this.player.seek(newValue)
+				}
+			},
+			playAli() {
+				let that = this
+				// console.log(this.videoId);
+				// console.log(this.playAuth);
+				//配置播放器
+				if (!this.playAuth) {
+					return false;
+				}
+				var player = new Aliplayer({
+					id: "wgy-player-test",
+					"vid": this.videoId,
+					"playauth": this.playAuth,
+					extraInfo: {
+						poster: 'noposter'
+					},
+					fullscreenEvents: {
+						fullscreenChange: (isFull) => {
+							this.isFullScreen = isFull
+						}
+					},
+					//cover: 'https://img.alicdn.com/tps/TB1EXIhOFXXXXcIaXXXXXXXXXXX-760-340.jpg',
+					// "vid": '',
+					// "playauth": '',
+					// "playConfig": {
+					// 	"EncryptType": 'AliyunVoDEncryption'
+					// },
+					"skinLayout": [{
+							"name": "bigPlayButton",
+							"align": "blabs",
+							"x": 30,
+							"y": 80
+						},
+						{
+							"name": "H5Loading",
+							"align": "cc"
+						},
+						{
+							"name": "controlBar",
+							"align": "blabs",
+							"x": 0,
+							"y": 0,
+							"children": [{
+									"name": "progress",
+									"align": "blabs",
+									"x": 0,
+									"y": 44
+								},
+								{
+									"name": "playButton",
+									"align": "tl",
+									"x": 15,
+									"y": 12
+								},
+								{
+									"name": "fullScreenButton",
+									"align": "tr",
+									"x": 10,
+									"y": 12
+								},
+								{
+									"name": "timeDisplay",
+									"align": "tr",
+									"x": 10,
+									"y": 5
+								}
+							]
+						}
+					],
+					"qualitySort": "asc",
+					"format": "mp4",
+					"mediaType": "video",
+					"encryptType": 1,
+					"progressMarkers": this.progressMarkers,
+					"autoplay": false,
+					"isLive": false,
+					"rePlay": false,
+					"playsinline": true,
+					"preload": false,
+					"controlBarVisibility": "hover",
+					"useH5Prism": true
+
+				}, function(player) {});
+				this.player = player;
+				player.on('canplay', function() {
+					console.log('canplay', this.player.tag);
+					player.tag.play();
+
+				});
+
+				player.on('ended', function(data) {
+					that.exitFullScreen();
+					that.$ownerInstance.callMethod('playEnd', {
+						data: 'end'
+					})
+					// uni.$emit('playEnd', {
+					// 	data: 'end'
+					// });
+				});
+			},
+			exitFullScreen() {
+				if (document.exitFullscreen) {
+					document.exitFullscreen(); // 标准方法
+				} else if (document.mozCancelFullScreen) { // Firefox
+					document.mozCancelFullScreen();
+				} else if (document.webkitExitFullscreen) { // Chrome, Safari & Opera
+					document.webkitExitFullscreen();
+				} else if (document.msExitFullscreen) { // IE/Edge
+					document.msExitFullscreen();
+				}
+			},
+
+			loadWebPlayerSDK() {
+				return new Promise((resolve, reject) => {
+					const s_tag = document.createElement('script'); // 引入播放器js
+					s_tag.type = 'text/javascript';
+					s_tag.src = 'https://g.alicdn.com/de/prismplayer/2.9.6/aliplayer-min.js';
+					s_tag.charset = 'utf-8';
+					s_tag.onload = () => {
+						//	console.log(this.playAuth);
+						this.playAli()
+						resolve();
+					}
+					document.body.appendChild(s_tag);
+					const l_tag = document.createElement('link'); // 引入播放器css
+					l_tag.rel = 'stylesheet';
+					l_tag.href =
+						'https://g.alicdn.com/de/prismplayer/2.9.6/skins/default/aliplayer-min.css';
+					document.body.appendChild(l_tag);
+				});
+			},
+		}
+	}
+</script>

+ 284 - 0
pages/studyBk/study/product/shuxue.vue

@@ -0,0 +1,284 @@
+<template>
+	<view class="ezy-study-page ezy-shuxue-study-page">
+		<view class="study-school-year" @click="clickGradeTerm">{{gradeTerm}}</view>
+		<view class="ezy-study-wrap">
+			<view class="chapter-box" @click="handleCheckCatalogue">{{options.numberStr}}</view>
+			<view @click="handleCheckCatalogue" :class="getTitleClass(options.zhangName)">
+				{{getZhangName(options.zhangName)}}
+			</view>
+			<!-- 动物类型 -->
+			<view v-if="growthType!=null" :class="currentGrowth()"></view>
+			<view>
+				<!-- 小岛 -->
+				<view class="brand-item" v-for="(item, index) in options.jieList" :key="item.jieId"
+					@click="listClick(item, index,options)" :class="getClass(options,index,isVip,item)">
+					<view v-if="isVip === 'VIP'">
+						<!-- 序号 -->
+						<view class="brand-icon" v-if="item.studyFlag===0">{{ item.number }}</view>
+						<!-- 星星 -->
+						<view class="brand-finish-icon" v-if="item.studyFlag===1"></view>
+						<!-- 箭头 -->
+						<view v-if="item.daeFlag &&animalNum == index" class="brand-arrow"></view>
+						<!-- 节名称 -->
+						<view class="brand-content">{{ item.jieName }}</view>
+					</view>
+					<view v-if="isVip == 'Not-Vip'">
+						<!-- 序号或锁 -->
+						<view   class="brand-icon">{{ item.number }}
+						</view>
+						<!-- 锁 -->
+						<view   v-if="options.number !='1'" class="brand-lock"></view>
+						<!-- 箭头 -->
+						<view v-if="item.daeFlag  &&  animalNum == index &&isVip != 'Visitor'" class="brand-arrow">
+						</view>
+						<!-- 节名称 -->
+						<view class="brand-content"> {{ item.jieName }} </view>
+					</view>
+					
+					<view v-if="isVip == 'Visitor'">
+						<!-- 序号或锁 -->
+						<view   class="brand-icon">{{ item.number }}
+						</view>
+						<!-- 锁 -->
+						<view  v-if="options.number !='1' || item.type==2"  class="brand-lock"></view>
+						<!-- 箭头 -->
+						<view v-if="item.daeFlag  &&  animalNum == index &&isVip != 'Visitor'" class="brand-arrow">
+						</view>
+						<!-- 节名称 -->
+						<view class="brand-content"> {{ item.jieName }} </view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script setup>
+	import {
+		reactive,
+		ref,
+		watch,
+		getCurrentInstance,
+		onMounted,
+		nextTick
+	} from "vue";
+	import cacheManager from "@/utils/cacheManager.js";
+	import {
+		toast,
+		getUserIdentity
+	} from "@/utils/common";
+	import {
+		onShow
+	} from '@dcloudio/uni-app';
+	const growthType = ref(null);
+	onShow(() => {
+		growthType.value = cacheManager.get('auth') ? cacheManager.get('auth').growthType : null
+	})
+
+	const $emit = defineEmits(['clickGradeTerm', 'onLeft', 'onRight', 'handleCheckCatalogue', 'listClick'])
+	const props = defineProps({
+		options: {
+			type: Object,
+		},
+		gradeTerm: {
+			type: String,
+		},
+	})
+	const isVip = getUserIdentity();
+	console.log('isVip', isVip);
+	const gradeMapping = {
+		1: '一年级',
+		2: '二年级',
+		3: '三年级',
+		4: '四年级',
+		5: '五年级',
+		6: '六年级'
+	};
+
+	const termMapping = {
+		1: ' 数学',
+		2: ' 英语'
+	};
+
+	let startX = ref(0);
+	let isSliding = ref(false);
+	let endX = ref(0);
+	let gradeTerm = ref('');
+	let animalNum = ref(0);
+
+	function clickGradeTerm() {
+		$emit('clickGradeTerm');
+	}
+
+	function listClick(data, index, data2) {
+		data.daeFlag = true
+		nextTick(() => {
+			animalNum.value = index
+		})
+		setTimeout(() => {
+			$emit('listClick', data, data2, index);
+		}, 300)
+
+	}
+	// 获取章name
+	function getZhangName(data) {
+		if (data.length <= 9) {
+			return data
+		} else {
+			return getZhangContent(data);
+		}
+	}
+
+	function currentGrowth(data) {
+		if (growthType.value == 0) {
+			return 'animal-img dan-img'
+		} else if (growthType.value == 1) {
+			return 'animal-img xiao-e-img'
+		} else if (growthType.value == 2) {
+			return 'animal-img zhong-e-img'
+		} else {
+			return 'animal-img da-e-img'
+		}
+	}
+
+	// 章换行显示
+	function getZhangContent(data) {
+
+		let length = data.length;
+		// 初始将字符串平分成两半
+		let halfLength = Math.floor(length / 2);
+
+		// 插入换行符
+		let firstLine = data.slice(0, halfLength);
+		let secondLine = data.slice(halfLength);
+		//console.log(firstLine + '\n' + secondLine, 'firstLine + + secondLine');
+		return firstLine + '\n' + secondLine;
+	}
+
+	// 章class
+	function getTitleClass(data) {
+
+		if (data.length <= 5) {
+			return 'chapter-title-box chapter-small-title-box'
+		} else if (data.length <= 9) {
+			return 'chapter-title-box chapter-middle-title-box'
+		} else if (data.length > 9) {
+			return 'chapter-title-box chapter-big-title-box'
+		}
+	}
+
+	// 获取节class
+	function getClass(data, index, isVip,item) {
+		//	console.log('data',data);
+		let brandActive = '';
+		if (isVip === 'VIP') {
+			brandActive = 'brand-active';
+		} else if (data.number == 1 && isVip =='Not-Vip') {
+			brandActive = 'brand-active';
+		} else if (data.number == 1 && isVip =='Visitor' &&item.type ==1) {
+			brandActive = 'brand-active';
+		} else {
+			brandActive = '';
+		}
+		let indexLast = data.jieList.length - 1;
+		// 判断最后一个为名称是否为单元测试,是单元测试则返回ceshi-jie
+		if (index === indexLast && data.jieList[data.jieList.length - 1].jieName == '单元测试') {
+			return 'ceshi-brand-item' + ' ' + brandActive;
+		} else {
+			return getJieClass(data, index, brandActive)
+		}
+	}
+	// 根据获取节字数获取class
+	function getJieClass(data, index, active) {
+		let itemJieName = data.jieList[index].jieName.length;
+		if (itemJieName > 7) {
+			return 'big-brand-item' + ' ' + active;
+		} else {
+			return 'small-brand-item' + ' ' + active;
+		}
+	}
+
+
+
+	function handleCheckCatalogue() {
+		$emit('handleCheckCatalogue');
+	}
+
+	function onTouchStart(event) {
+		console.log(event.touches.length);
+		isSliding.value = false
+		if (event.touches.length === 1) {
+			isSliding.value = true;
+			startX.value = event.touches[0].pageX;
+		} else {
+			isSliding.value = false;
+			event.preventDefault()
+			return
+		}
+	}
+
+	function onSwipeLeft(event) {
+		console.log('11111');
+		if (cacheManager.get('auth')) {
+			$emit('onLeft');
+		}
+	}
+
+	function onSwipeRight(event) {
+		console.log('22222');
+		console.log(cacheManager.get('auth'));
+		if (cacheManager.get('auth')) {
+			console.log('啊啊啊啊啊');
+			$emit('onRight');
+		}
+
+	}
+
+	function onTouchEnd(event) {
+		if (isSliding.value) {
+			const distanceX = event.changedTouches[0].clientX - startX.value
+			if (distanceX > 200) {
+				onSwipeLeft();
+			} else if (distanceX < -200) {
+				onSwipeRight();
+			}
+			isSliding.value = false
+		} else {
+			console.log('error');
+		}
+	}
+
+	function dataRecom(data) {
+
+		const index = data.jieList.findIndex(item => item.studyFlag == 0);
+
+		if (index !== -1) {
+			data.jieList[index].daeFlag = true;
+			animalNum.value = index
+		}
+	}
+	watch(() => props.options, (newVal, oldVal) => {
+		//	console.log('New options:', newVal);
+		//	console.log('Old options:', oldVal);
+		// 在这里可以根据新的 options 做一些操作,比如发起请求等
+
+		dataRecom(newVal)
+	}, {
+		deep: true,
+		immediate: true
+	});
+	watch(() => props.gradeTerm, (newVal, oldVal) => {
+		//	console.log('New options:', newVal);
+		//	console.log('Old options:', oldVal);
+		// 在这里可以根据新的 options 做一些操作,比如发起请求等
+		gradeTerm.value = newVal
+
+	}, {
+		deep: true,
+		immediate: true
+	});
+</script>
+
+<style>
+
+</style>

+ 241 - 0
pages/studyBk/study/product/yingyu.vue

@@ -0,0 +1,241 @@
+<template>
+	<view class="ezy-study-page ezy-yingyu-study-page">
+		<view class="study-school-year" @click="clickGradeTerm">{{gradeTerm}}</view>
+		<view class="ezy-study-wrap" @touchstart="onTouchStart" @touchend="onTouchEnd">
+			<view @click="handleCheckCatalogue" class="chapter-title-box">{{options.zhangName}}</view>
+			<!-- 动物类型 -->
+			<view v-if="growthType!=null" :class="currentGrowth()"></view>
+			<view>
+				<!-- 小岛 -->
+				<view class="brand-item" v-for="(item, index) in options.jieList" :key="item.jieId"
+					@click="listClick(item, index,options)" :class="getClass(options,index,isVip,item)">
+					<view v-if="isVip === 'VIP'">
+						<!-- 序号 -->
+						<view class="brand-icon">{{ item.number }}</view>
+						<!-- 星星 -->
+						<view class="brand-finish-icon" v-if="item.studyFlag===1"></view>
+						<!-- 箭头 -->
+						<view class="brand-arrow" v-if="item.daeFlag &&animalNum == index"></view>
+						<!-- 节名称 -->
+						<view class="brand-content">{{ item.jieName }}</view>
+					</view>
+					<view v-if="isVip == 'Not-Vip'">
+						<!-- 序号 -->
+						<view  class="brand-icon">{{ item.number }}</view>
+						<!-- 锁 -->
+						<view v-if="options.number !='1'" class="brand-lock"></view>
+						<!-- 箭头 -->
+						<view v-if="item.daeFlag  &&  animalNum == index && isVip != 'Visitor'" class="brand-arrow"></view>
+						<!-- 节名称 -->
+						<view class="brand-content"> {{ item.jieName }} </view>
+
+					</view>
+					<view v-if="isVip == 'Visitor'">
+						<!-- 序号 -->
+						<view  class="brand-icon">{{ item.number }}</view>
+						<!-- 锁 -->
+						<view v-if="options.number !='1' || item.type==2"  class="brand-lock"></view>
+						<!-- 箭头 -->
+						<view v-if="item.daeFlag  &&  animalNum == index && isVip != 'Visitor'" class="brand-arrow"></view>
+						<!-- 节名称 -->
+						<view class="brand-content"> {{ item.jieName }} </view>
+					
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script setup>
+	import {
+		reactive,
+		ref,
+		watch,
+		getCurrentInstance,
+		nextTick,
+		onMounted
+	} from "vue";
+	import cacheManager from "@/utils/cacheManager.js";
+	import {
+		toast,
+		getUserIdentity
+	} from "@/utils/common";
+	import {
+		onShow
+	} from '@dcloudio/uni-app';
+	const growthType = ref(null);
+	onShow(() => {
+		growthType.value = cacheManager.get('auth')?cacheManager.get('auth').growthType:null
+	})
+	const $emit = defineEmits(['clickGradeTerm', 'onLeft', 'onRight', 'handleCheckCatalogue', 'listClick'])
+	const props = defineProps({
+		options: {
+			type: Object,
+		},
+		gradeTerm: {
+			type: String,
+		},
+	})
+	const isVip = getUserIdentity();
+	console.log('isVip',);
+	const gradeMapping = {
+		1: '一年级',
+		2: '二年级',
+		3: '三年级',
+		4: '四年级',
+		5: '五年级',
+		6: '六年级'
+	};
+
+	const termMapping = {
+		1: ' 数学',
+		2: ' 英语'
+	};
+
+	let startX = ref(0);
+	let isSliding = ref(false);
+	let endX = ref(0);
+	let gradeTerm = ref('');
+	let animalNum = ref(0);
+
+	function clickGradeTerm() {
+		$emit('clickGradeTerm');
+	}
+
+	function listClick(data,index,data2) {
+		data.daeFlag = true
+		nextTick(() => {
+			animalNum.value = index
+		})
+		setTimeout(() => {
+			$emit('listClick', data,data2,index);
+		}, 300)
+		
+	}
+
+	function currentGrowth(data) {
+		if (growthType.value == 0) {
+			return 'animal-img dan-img'
+		} else if (growthType.value == 1) {
+			return 'animal-img xiao-e-img'
+		} else if (growthType.value == 2) {
+			return 'animal-img zhong-e-img'
+		} else {
+			return 'animal-img da-e-img'
+		}
+	}
+	// 章换行显示
+	function getZhangContent(data) {
+		console.log(data.length, 'data.length');
+		let length = data.length;
+		// 初始将字符串平分成两半
+		let halfLength = Math.floor(length / 2);
+
+		// 插入换行符
+		let firstLine = data.slice(0, halfLength);
+		let secondLine = data.slice(halfLength);
+		console.log(firstLine + '\n' + secondLine, 'firstLine + + secondLine');
+		return firstLine + '\n' + secondLine;
+	}
+
+	// 获取节class
+	function getClass(data, index, isVip,item) {
+		let brandActive = '';
+		if (isVip === 'VIP') {
+			brandActive = 'brand-active';
+		} else if (data.number == 1 && isVip =='Not-Vip') {
+			brandActive = 'brand-active';
+		}else if (data.number == 1 && isVip =='Visitor' &&item.type ==1){
+			brandActive = 'brand-active';
+		} else {
+			brandActive = '';
+		}
+		let indexLast = data.jieList.length - 1;
+		// 判断最后一个为名称是否为单元测试,是单元测试则返回ceshi-jie
+		if (index === indexLast && data.jieList[data.jieList.length - 1].jieName == 'Testing') {
+			return 'ceshi-brand-item' + ' ' + brandActive;
+		} else {
+			return brandActive;
+		}
+	}
+
+	function handleCheckCatalogue() {
+		$emit('handleCheckCatalogue');
+	}
+
+	function onTouchStart(event) {
+		console.log(event.touches.length);
+		isSliding.value = false
+		if (event.touches.length === 1) {
+			isSliding.value = true;
+			startX.value = event.touches[0].pageX;
+		} else {
+			isSliding.value = false;
+			event.preventDefault()
+			return
+		}
+	}
+
+	function onSwipeLeft(event) {
+		console.log('11111');
+		if (cacheManager.get('auth')) {
+			$emit('onLeft');
+		}
+	}
+
+	function onSwipeRight(event) {
+		console.log('22222');
+		if (cacheManager.get('auth')) {
+			$emit('onRight');
+		}
+
+	}
+
+	function onTouchEnd(event) {
+		if (isSliding.value) {
+			const distanceX = event.changedTouches[0].clientX - startX.value
+			if (distanceX > 0) {
+				onSwipeLeft();
+			} else if (distanceX < 0) {
+				onSwipeRight();
+			}
+			isSliding.value = false
+		} else {
+			console.log('error');
+		}
+	}
+
+	function dataRecom(data) {
+		const index = data.jieList.findIndex(item => item.studyFlag == 0);
+
+		if (index !== -1) {
+			data.jieList[index].daeFlag = true;
+			animalNum.value = index
+		}
+	}
+	watch(() => props.options, (newVal, oldVal) => {
+		//	console.log('New options:', newVal);
+		//	console.log('Old options:', oldVal);
+		// 在这里可以根据新的 options 做一些操作,比如发起请求等
+
+		dataRecom(newVal)
+	}, {
+		deep: true,
+		immediate: true
+	});
+	watch(() => props.gradeTerm, (newVal, oldVal) => {
+		//	console.log('New options:', newVal);
+		//	console.log('Old options:', oldVal);
+		// 在这里可以根据新的 options 做一些操作,比如发起请求等
+		gradeTerm.value = newVal
+
+	}, {
+		deep: true,
+		immediate: true
+	});
+</script>
+
+<style>
+
+</style>

+ 55 - 0
pages/studyBk/study/svipDialog.vue

@@ -0,0 +1,55 @@
+<!-- 中弹窗 二行文字 -->
+<template>
+	<uni-popup ref="svipPopup" :animation="false" :is-mask-click="false"
+	 mask-background-color="rgba(255, 255, 255, 0.6);">
+	 <view class="ezy-svip-dialog">
+		<view class="tip-content-box">
+		
+			<icon :class="'svip-img'+cardId"></icon>
+			<view class="tip-content">开通SVIP会员解锁学习关卡</view>
+			<view class="tip-btn-box">
+				<view class="not-confirm-btn" @click="handleClose"></view>
+				<view class="confirm-btn" @click="confirmBtn"></view>
+			</view>
+		</view>
+	 </view>
+	</uni-popup>
+</template>
+
+<script setup>
+	import { ref } from 'vue';
+	import cacheManager from "@/utils/cacheManager.js";
+	const props = defineProps({
+	  title: {
+	    type: String,
+	    default: '提示'
+	  },
+	  content: {
+	    type: String,
+		require: true,
+	    default: ''
+	  },
+	});
+	const cardId =cacheManager.get('auth').cardId
+	const svipPopup = ref(null); // 索引
+	const $emit = defineEmits(['confirm-btn'])
+	// 打开弹窗
+	function handleShow() {
+		svipPopup.value.open();
+	}
+	// 取消
+	function handleClose() {
+		svipPopup.value.close();
+	}
+	// 确认
+	function confirmBtn(){
+		$emit('confirm-btn');
+		svipPopup.value.close();
+	}
+	defineExpose({
+			handleShow
+		})
+</script>
+
+<style>
+</style>