Selaa lähdekoodia

提交小程序

puyao 1 viikko sitten
vanhempi
commit
e89a1127f0
57 muutettua tiedostoa jossa 6032 lisäystä ja 0 poistoa
  1. 277 0
      pages_course/components/appPopup.vue
  2. 169 0
      pages_course/components/goodsList.vue
  3. 297 0
      pages_course/components/treasureChest.vue
  4. 399 0
      pages_course/components/turntableOne.vue
  5. 318 0
      pages_course/components/turntableTwo.vue
  6. 141 0
      pages_course/register.vue
  7. 2416 0
      pages_course/videoDetail.vue
  8. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/appPopup.js.map
  9. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/goodsList.js.map
  10. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/treasureChest.js.map
  11. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/turntableOne.js.map
  12. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/turntableTwo.js.map
  13. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/register.js.map
  14. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/videoDetail.js.map
  15. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.js.map
  16. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.js.map
  17. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.js.map
  18. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/components/appPopup.js
  19. 6 0
      unpackage/dist/dev/mp-weixin/pages_course/components/appPopup.json
  20. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/components/appPopup.wxml
  21. 194 0
      unpackage/dist/dev/mp-weixin/pages_course/components/appPopup.wxss
  22. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/components/goodsList.js
  23. 4 0
      unpackage/dist/dev/mp-weixin/pages_course/components/goodsList.json
  24. 1 0
      unpackage/dist/dev/mp-weixin/pages_course/components/goodsList.wxml
  25. 122 0
      unpackage/dist/dev/mp-weixin/pages_course/components/goodsList.wxss
  26. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/components/treasureChest.js
  27. 4 0
      unpackage/dist/dev/mp-weixin/pages_course/components/treasureChest.json
  28. 1 0
      unpackage/dist/dev/mp-weixin/pages_course/components/treasureChest.wxml
  29. 196 0
      unpackage/dist/dev/mp-weixin/pages_course/components/treasureChest.wxss
  30. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/components/turntableOne.js
  31. 6 0
      unpackage/dist/dev/mp-weixin/pages_course/components/turntableOne.json
  32. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/components/turntableOne.wxml
  33. 205 0
      unpackage/dist/dev/mp-weixin/pages_course/components/turntableOne.wxss
  34. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/components/turntableTwo.js
  35. 6 0
      unpackage/dist/dev/mp-weixin/pages_course/components/turntableTwo.json
  36. 1 0
      unpackage/dist/dev/mp-weixin/pages_course/components/turntableTwo.wxml
  37. 121 0
      unpackage/dist/dev/mp-weixin/pages_course/components/turntableTwo.wxss
  38. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/register.js
  39. 6 0
      unpackage/dist/dev/mp-weixin/pages_course/register.json
  40. 1 0
      unpackage/dist/dev/mp-weixin/pages_course/register.wxml
  41. 60 0
      unpackage/dist/dev/mp-weixin/pages_course/register.wxss
  42. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/videoDetail.js
  43. 24 0
      unpackage/dist/dev/mp-weixin/pages_course/videoDetail.json
  44. 0 0
      unpackage/dist/dev/mp-weixin/pages_course/videoDetail.wxml
  45. 838 0
      unpackage/dist/dev/mp-weixin/pages_course/videoDetail.wxss
  46. 0 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.js
  47. 6 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.json
  48. 1 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.wxml
  49. 67 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.wxss
  50. 0 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.js
  51. 7 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.json
  52. 1 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.wxml
  53. 41 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.wxss
  54. 0 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.js
  55. 6 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.json
  56. 1 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.wxml
  57. 89 0
      unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.wxss

+ 277 - 0
pages_course/components/appPopup.vue

@@ -0,0 +1,277 @@
+<template>
+	<!-- 礼品弹窗 -->
+	<uni-popup ref="appPopup" type="center" :is-mask-click="false">
+		<view class="appPopup-mask">
+			<image class="tipimg" src="https://cos.his.cdwjyyh.com/fs/20250909/d5736027b6ac4255bfa2415cf400969c.png"></image>
+			<image class="close_icon" src="https://cos.his.cdwjyyh.com/fs/20250909/c8a5a9f34e5a4bd786f9fd2a380508dd.png" mode="aspectFill" @click="closePop"></image>
+			<view class="appPopup-box">
+				<view class="appPopup-title">恭喜你,<text style="color: #FF5C03;">回答正确</text></view>
+				<view>百种好礼等你兑换</view>
+				<view class="goodslist">
+					<!-- <view class="goodsitem" v-for="(item,index) in products" :key="index" @click="handleItem(item,index)"> -->
+					<view class="goodsitem" v-for="(item,index) in products" :key="index" >
+						<image class="bg" src="https://cos.his.cdwjyyh.com/fs/20250909/13630e9a4a054fa487e5c50b7d5ab1d2.png" mode="widthFix"></image>
+						<image class="img" :src="item.imageUrl" mode="aspectFill"></image>
+						<view class="goodsitem-name ellipsis">{{item.productName}}</view>
+						<view class="goodsitem-integral">
+							<text class="goodsitem-integral-num">{{item.requiredPoints}}</text>
+							<text>芳华币</text>
+						</view>
+						<view class="goodsitem-price">原价{{item.otPrice&&item.otPrice.toFixed(2)}}元</view>
+					</view>
+				</view>
+				<view class="changebtn" @click="getInfo">换一批</view>
+				<view class="progress">
+					<text>奖品兑换进度</text><text class="num">{{goodsInfo.exchangeProgress || 0}}%</text>
+					<progress style="margin-top: 30rpx;" active-color="#FAA97F" backgroundColor="#F5F7FA" border-radius="12" :percent="goodsInfo.exchangeProgress" stroke-width="12"></progress>
+				</view>
+				<view class="my-integral">我的芳华币:<text>{{goodsInfo.currentPoints || 0}}</text> </view>
+				<view class="x-bc" style="padding: 0 24rpx;">
+					<!-- <view class="appPopup-btn" style="margin-right: 12px;" @click="navTo('/pages_user/user/storeOrder?status=0')">查看芳华币订单</view> -->
+					<view class="appPopup-btn" >打开芳华未来APP兑换礼品</view>
+				</view>
+				<!-- <view class="appPopup-tips">放弃芳华币,领取红包></view> -->
+			</view>
+		</view>
+	</uni-popup>
+</template>
+
+<script>
+	import { getCourseIntegralGoods } from "@/api/course.js"
+	export default {
+		data() {
+			return {
+				goodsInfo: {},
+				products:  []
+			}
+		},
+		methods: {
+			openPop() {
+				this.$refs.appPopup.open("center")
+				this.getInfo()
+			},
+			closePop() {
+				this.$refs.appPopup.close()	
+			},
+			navTo(url) {
+				uni.navigateTo({
+					url: url
+				})
+				// this.postMessage({
+				// 	isFullscreen: false,
+				// 	login: 1,
+				// 	productId: '',
+				// 	pagesUrl:'/pages/user/integral/integralGoodsList'
+				// })
+			},
+			//app礼品列表
+			getInfo() {
+				uni.showLoading({
+					title: '加载中'
+				})
+				getCourseIntegralGoods().then(res=>{
+					uni.hideLoading()
+					if(res.code == 200) {
+						this.goodsInfo = res.data
+						this.products = res.data && res.data.products? res.data.products:[]
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						})
+					}
+				}).catch(()=>{
+					uni.hideLoading()
+				})
+			},
+			postMessage(data) {
+				this.uniReady(() => {
+					uni.webView.postMessage({
+					    data: data
+					});  
+				})	
+			},
+			uniReady(callback) {
+			  if (uni.webView) {
+				callback()
+			  } else {
+				document.addEventListener('UniAppJSBridgeReady', callback, { once: true })
+			  }
+			},
+			handleItem(item,index) {
+				uni.navigateTo({
+					url: '/pages/shopping/productList?cateId=320&pid=321&isCourse=1'
+				})
+				// this.postMessage({
+				// 	isFullscreen: false,
+				// 	login: 1,
+				// 	productId: item.productId,
+				// 	pagesUrl:''
+				// })
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.num {
+		margin-left: 12rpx;
+		font-family: DINPro, DINPro;
+		font-size: 40rpx;
+	}
+	.appPopup-mask {
+		margin-top: -88rpx;
+		width: 670rpx;
+		@include u-flex(column, center, center);
+		.tipimg {
+			height: 206rpx;
+			width: 206rpx;
+			z-index: 99;
+		}
+		.close_icon {
+			height: 48rpx;
+			width: 48rpx;
+			position: absolute;
+			top: 34rpx;
+			right: 20rpx;
+		}
+		.appPopup-box {
+			width: 670rpx;
+			padding-bottom: 32rpx;
+			background: linear-gradient( 180deg, #FFEBBD 0%, #FFFFFF 9%, #FFFFFF 100%);
+			border-radius: 32rpx 32rpx 32rpx 32rpx;
+			overflow: hidden;
+			margin-top: -103rpx;
+			padding-top: 103rpx;
+			box-sizing: border-box;
+			font-family: PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #757575;
+			text-align: center;
+		}
+		.appPopup-title {
+			margin-bottom: 10rpx;
+			font-family: PingFang SC;
+			font-weight: 600;
+			font-size: 40rpx;
+			color: #222222;
+		}
+	}
+	.goodslist {
+		margin-top: 58rpx;
+		padding: 24rpx 10rpx;
+		@include u-flex(row, center, space-evenly);
+	}
+	.bg {
+		width: 100%;
+		height: 100%;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		z-index: -1;
+	}
+	.goodsitem {
+		flex: 1;
+		max-width: 200rpx;
+		min-height: 124rpx;
+		border-radius: 10rpx;
+		@include u-flex(column, center, flex-start);
+		font-family: PingFang SC;
+		font-weight: 400;
+		font-size: 22rpx;
+		color: #999999;
+		position: relative;
+		z-index: 2;
+		.img {
+			width: 153rpx;
+			height: 126rpx;
+			margin-top: -44rpx;
+			border-radius: 10rpx;
+		}
+		&-name {
+			width: 100%;
+			padding: 8rpx 14rpx;
+			text-align: center;
+			font-family: PingFang SC;
+			font-weight: 500;
+			font-size: 24rpx;
+			color: #222222;
+			box-sizing: border-box;
+		}
+		&-integral {
+			min-width: 80%;
+			padding-bottom: 16rpx;
+			box-sizing: border-box;
+			font-family: PingFang SC;
+			font-weight: 400;
+			font-size: 22rpx;
+			color: #FF5C03;
+			border-bottom: 2px #999999 dotted;
+			&-num {
+				font-family: DINPro, DINPro;
+				font-weight: 500;
+				font-size: 36rpx;
+			}
+		}
+		&-price {
+			padding: 10rpx 0;
+		}
+	}
+	.appPopup-btn {
+		width: 560rpx;
+		height: 84rpx;
+		margin: 0 auto;
+		background: #FF5C03;
+		border-radius: 42rpx 42rpx 42rpx 42rpx;
+		@include u-flex(row, center, center);
+		font-family: PingFang SC;
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #FFFFFF;
+	}
+	.changebtn {
+		width: 152rpx;
+		height: 64rpx;
+		margin: 0 auto;
+		border-radius: 32rpx 32rpx 32rpx 32rpx;
+		border: 1rpx solid #FF5C03;
+		@include u-flex(row, center, center);
+		font-family: PingFang SC;
+		font-weight: 400;
+		font-size: 24rpx;
+		color: #FF5C03;
+	}
+	.progress {
+		padding: 0 90rpx;
+		margin-top: 40rpx;
+		font-family: PingFang SC;
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #222222;
+	}
+	::v-deep {
+		.uni-progress-bar, .uni-progress-inner-bar {
+			border-radius: 6px;
+		}
+	}
+	.my-integral {
+		margin: 32rpx 0;
+		font-family: PingFang SC;
+		font-weight: 400;
+		font-size: 28rpx;
+		color: #222222;
+		text {
+			color: #FF5C03;
+		}
+	}
+	.appPopup-tips {
+		margin-top: 32rpx;
+	}
+</style>

+ 169 - 0
pages_course/components/goodsList.vue

@@ -0,0 +1,169 @@
+<template>
+	<view>
+		<view v-for="(item,index) in treatmentPackage" :key="index">
+			<view class="goodsitem">
+				<view class="goodsitem-img">
+					<image :src="item.imgUrl" mode="aspectFill" style="height: 100%;width: 100%"></image>
+					<!-- <view class="goodsitem-status">讲解中</view> -->
+				</view>
+				<view class="goodsitem-r">
+					<view>
+						<view class="goodsitem-title" :style="{ fontSize: fontSize(32)}">{{item.packageName}}</view>
+						<view class="goodsitem-desc ellipsis2" :style="{ fontSize: fontSize(30)}">{{item.secondName}}</view>
+					</view>
+					<view class="goodsitem-btnbox" @click="goBuy(item)">
+						<view class="goodsitem-price">
+							<view class="unit">¥</view>
+							<text class="price">{{item.totalPrice&&item.totalPrice.toFixed(2)}}</text>
+						</view>
+						<view class="btn">去购买</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view v-if="treatmentPackage.length==0">
+			<view class="empty">
+				<text>暂未上新活动</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props:['treatmentPackage','urlOption'],
+		data() {
+			return {
+				list: []
+			}
+		},
+		computed: {
+			fontSize() {
+				return size=>{
+					const value = uni.upx2px(size)
+					const scale = uni.getStorageSync('fontScale') || 1;
+					if(scale<1){
+						return value + 'px';
+					}else {
+						return value * scale + 'px';
+					}
+				}
+			}
+		},
+		methods: {
+			goBuy(item) {
+				if(getApp().globalData.appId == 'wxc3f0a952b7bc2b94') {
+					uni.navigateTo({
+						url: '/pages_index/packageDetails?packageId='+item.packageId+'&companyId='+this.urlOption.companyId+ '&companyUserId='+this.urlOption.companyUserId,
+					})
+				} else {
+					uni.navigateToMiniProgram({
+					  appId: 'wxc3f0a952b7bc2b94',
+					  path: '/pages_index/packageDetails?packageId='+item.packageId+'&companyId='+this.urlOption.companyId+ '&companyUserId='+this.urlOption.companyUserId,
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.empty {
+		padding: 40rpx 24rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		color: #999;
+		&-btn {
+			margin-top: 24rpx;
+			padding: 20rpx 60rpx;
+			border-radius: 44rpx 44rpx 44rpx 44rpx;
+			border: 2rpx solid #FF5C03;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			color: #FF5C03;
+		}
+	}
+	.empty-btn-min {
+		flex-direction: column;
+		padding: 8rpx 15rpx !important;
+		font-size: 28rpx !important;
+	}
+	.goodsitem {
+		display: flex;
+		padding: 24rpx;
+		overflow: hidden;
+		min-height: 200rpx;
+		&-img {
+			overflow: hidden;
+			flex-shrink: 0;
+			width: 200rpx;
+			height: 200rpx;
+			border-radius: 14rpx;
+			position: relative;
+		}
+		&-status {
+			position: absolute;
+			left: 0;
+			top: 0;
+			padding: 8rpx 15rpx;
+			background: #FF5C03;
+			border-radius: 14rpx 0 14rpx 0;
+			font-size: 20rpx;
+			color: #fff;
+			box-sizing: border-box;
+			text-align: center;
+		}
+		&-r {
+			flex: 1;
+			overflow: hidden;
+			margin-left: 16rpx;
+			display: flex;
+			flex-direction: column;
+			justify-content: space-between;
+		}
+		&-title {
+			font-weight: bold;
+			// font-size: 32rpx;
+			color: #191A1B;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			display: -webkit-box;
+			-webkit-line-clamp: 1;
+			-webkit-box-orient: vertical;
+		}
+		&-desc {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			// font-size: 30rpx;
+			color: #939599;
+			margin-top: 20rpx;
+		}
+		&-btnbox {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			.btn {
+				display: inline-block;
+				padding: 10rpx 38rpx;
+				border-radius: 12rpx;
+				border: 3rpx solid #FF5C03;
+				font-weight: bold;
+				// font-size: 30rpx;
+				color: #FF5C03;
+				text-align: center;
+			}
+		}
+		.unit {
+			font-size: 32rpx;
+		}
+		&-price {
+			font-family: Roboto, Roboto;
+			font-weight: bold;
+			font-size: 40rpx;
+			color: #FF5C03;
+			display: flex;
+			align-items: flex-end;
+		}
+	}
+</style>

+ 297 - 0
pages_course/components/treasureChest.vue

@@ -0,0 +1,297 @@
+<template>
+	<cover-view key="treasureBox" class="treasure-box" :style="{display: showBox&&isfull?'flex':'none'}"
+		:class="[{opening}, {fadeOut}, {dropIn},{swing}]" @click="open">
+		<cover-image :class="opening ? 'box-img openingGif' : 'box-img boxPng'"
+			:src="currentIdx >=0 ? opening ? boxList[currentIdx].openChestUrl : boxList[currentIdx].closeChestUrl :''"></cover-image>
+		<cover-view class="countdown" v-if="!opening">{{count}}s</cover-view>
+	</cover-view>
+</template>
+
+<script>
+	export default {
+		props: {
+			boxList: {
+				type: Array,
+				default: []
+			},
+			isfull: {
+				type: Boolean,
+				default: false
+			},
+			onHide: {
+				type: Boolean,
+				default: false
+			},
+		},
+		data() {
+			return {
+				showBox: false, // 控制宝箱显隐
+				opening: false, // 是否正在打开
+				fadeOut: false, // 控制自动消失的动画类
+				dropIn: false,
+				swing: false,
+				count: 20, // 倒计时
+				timer: null, // 倒计时句柄
+				timeout: null, // 20s 未点击自动消失句柄
+				currentIdx: -1,
+				flagTime: 0,
+				winAudio: null
+			}
+		},
+		watch: {
+			onHide(val) {
+				if (!this.showBox) return
+				if (val) { // 暂停
+					clearInterval(this.timer)
+					clearTimeout(this.timeout)
+					this.timer = null
+					this.timeout = null
+				} else { // 继续
+					if (!this.opening) {
+						const flag = this.boxList.some(item => this.flagTime >= item.time && this.flagTime <= item.time + 20);
+						if(flag) {
+							this.countDown()
+							this.setAutoHide() // 重新计算剩余时长
+						} else {
+							this.count = 20
+							clearInterval(this.timer)
+							clearTimeout(this.timeout)
+							this.timer = null
+							this.timeout = null
+						}
+					}
+				}
+			},
+		},
+		mounted() {
+			this.initAudio();
+		},
+		methods: {
+			initAudio() {
+			    this.winAudio = uni.createInnerAudioContext();
+			    this.winAudio.src = 'https://fs-1319721001.cos.ap-chongqing.myqcloud.com/audio/treasureChest.mp3';
+			    this.winAudio.volume = 0.6;
+			},
+			close() {
+				this.swing = false
+				this.opening = true
+				this.showBox = false
+			},
+			showTreasure(flagTime) {
+				this.flagTime = flagTime
+				const idx = this.boxList.findIndex(v => v.time == flagTime && v.status == 0)
+				if (idx == -1) return
+
+				this.currentIdx = idx
+				this.showBox = true
+				this.opening = false
+				this.swing = false
+				this.fadeOut = false
+				this.dropIn = true
+				this.count = 20
+				if(this.isfull) {
+					uni.vibrateLong()
+				}
+				clearInterval(this.timer)
+				clearTimeout(this.timeout)
+				this.countDown()
+				this.setAutoHide()
+			},
+
+			/* 倒计时 */
+			countDown() {
+				clearInterval(this.timer) // 防止重复启动
+				this.timer = setInterval(() => {
+					if (this.count > 0) {
+						this.count--
+					} else {
+						clearInterval(this.timer)
+						this.timer = null
+					}
+				}, 1000)
+			},
+
+			/* 用户点击宝箱 */
+			open() {
+				if (this.opening || this.swing) return
+				clearTimeout(this.timeout)
+				clearInterval(this.timer)
+				this.swing = true
+				this.claim(1)
+			},
+			claimSuccess(status) {
+				setTimeout(()=>{
+					this.swing = false
+					this.opening = true
+					if(status == 1) {
+						this.winAudio.play();
+					}
+				},400)
+				this.boxList[this.currentIdx].status = status
+				setTimeout(() => {
+					this.winAudio?.stop();
+					this.showBox = false
+				}, 3000)
+			},
+			/* 设置/重置 autoHide 定时器 */
+			setAutoHide() {
+				clearTimeout(this.timeout)
+				const remainMs = this.count * 1000
+				if (remainMs <= 0) { // 已经过期
+					this.autoHide()
+					return
+				}
+				this.timeout = setTimeout(() => this.autoHide(), remainMs)
+			},
+			/* 20s 未点击,自动消失 */
+			autoHide() {
+				clearInterval(this.timer)
+				this.fadeOut = true
+				if(this.isfull) {
+					this.claim(2)
+				} else {
+					this.claim(0)
+				}
+				setTimeout(() => {
+					this.showBox = false
+				}, 600)
+			},
+			claim(status) {
+				this.$emit('claimFun', {
+					rewardId: this.boxList[this.currentIdx].rewardVideoRelation.rewardId,
+					status: status,
+					time: this.boxList[this.currentIdx].time
+				})
+			}
+		},
+		beforeDestroy() {
+			if (this.winAudio) {
+				this.winAudio.stop();
+				this.winAudio.destroy();
+				this.winAudio = null;
+			}
+			clearInterval(this.timer)
+			clearTimeout(this.timeout)
+		}
+	}
+</script>
+
+
+<style lang="scss" scoped>
+	@keyframes dropIn {
+		0% {
+			opacity: 0;
+			transform: translateY(-160px);
+		}
+
+		60% {
+			opacity: 1;
+			transform: translateY(12px);
+		}
+
+		100% {
+			opacity: 1;
+			transform: translateY(0);
+		}
+	}
+
+	.treasure-box.dropIn {
+		animation: dropIn 0.7s cubic-bezier(.25, .85, .45, 1.25) forwards,
+			pulse 1s ease-in-out infinite 0.7s;
+	}
+
+	@keyframes swing {
+		20% {
+			transform: rotate(-8deg);
+		}
+
+		40% {
+			transform: rotate(8deg);
+		}
+
+		60% {
+			transform: rotate(-6deg);
+		}
+
+		80% {
+			transform: rotate(6deg);
+		}
+
+		100% {
+			transform: rotate(0deg);
+		}
+	}
+
+	.treasure-box.swing {
+		animation: swing 0.4s ease-in-out infinite forwards; 
+	}
+
+	/* 宝箱 */
+	.treasure-box {
+		position: fixed;
+		left: 100px;
+		bottom: 80px;
+		width: 192px;
+		/* 128 × 1.5 */
+		height: 138px;
+		/* 92 × 1.5 */
+		animation: pulse 0.4s ease-in-out infinite;
+		// z-index: 999;
+		display: flex;
+		align-items: flex-end;
+	}
+
+	.openingGif {
+		width: 192px;
+		/* 128 × 1.5 */
+		height: 138px;
+		/* 92 × 1.5 */
+	}
+
+	.boxPng {
+		width: 135px;
+		height: 96px;
+		margin-left: 20px;
+	}
+
+	.countdown {
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+		color: #fff;
+		font-size: 20px;
+		font-weight: bold;
+		text-shadow: 0 1px 3px rgba(0, 0, 0, .6);
+	}
+
+	/* 动画 */
+	@keyframes pulse {
+
+		0%,
+		100% {
+			transform: scale(1);
+		}
+
+		50% {
+			transform: scale(1.15);
+		}
+	}
+
+	/* 打开后停止 pulse */
+	.treasure-box.opening {
+		animation: none;
+	}
+
+	/* 自动消失 */
+	.treasure-box.fadeOut {
+		animation: fadeOutUp .6s ease-out forwards;
+	}
+
+	@keyframes fadeOutUp {
+		to {
+			opacity: 0;
+			transform: translate(-50%, -40px);
+		}
+	}
+</style>

+ 399 - 0
pages_course/components/turntableOne.vue

@@ -0,0 +1,399 @@
+<template>
+	<uni-popup ref="turntablePopup" type="center" :is-mask-click="false">
+		<view class="turntable">
+			<image class="bg" src="https://cos.his.cdwjyyh.com/fs/20250910/9a6263291ec0429ea5828a15b2b490dc.png" mode="aspectFit"></image>
+			<view class="turntable-con">
+				<image class="text" src="https://cos.his.cdwjyyh.com/fs/20250910/fc08b64307a344b4948568fa0f81401e.png" mode="heightFix"></image>
+				<image class="base" src="https://cos.his.cdwjyyh.com/fs/20250910/9385e4a6d5e245dfb86f425f49235589.png" mode="aspectFit"></image>
+				<image class="decoration_img" src="https://cos.his.cdwjyyh.com/fs/20250910/86577ed4fc50420d99b1153e2dd6e1df.png" mode="aspectFit"></image>
+				<view class="ring">
+					<view class="canvas-content" :class="{'infinite-spin': spinning}">
+						<view :animation="animationData" class="canvas-content" id="zhuanpano" style="">
+							<view class="canvas-line">
+								<!-- <canvas canvas-id="sector" style="width:502rpx;height:502rpx" /> -->
+								<view class="canvas-litem" v-for="(item,index) in list" :key="index"
+									:style="{transform:'rotate('+(index * width + width / 2)+'deg)'}"></view>
+							</view>
+
+							<view class="canvas-list">
+								<view class="canvas-item"
+									:style="{transform: 'rotate('+((index) * width)+'deg)', zIndex:index}"
+									v-for="(iteml,index) in list" :key="index">
+									<view class="canvas-item-text" :style="'transform:rotate('+(index)+')'">
+										<view class="b">{{iteml.name}}</view>
+										<image class="icon-awrad iconfont" :src="iteml.iconUrl" mode="aspectFit">
+										</image>
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+					<image class="button" src="https://cos.his.cdwjyyh.com/fs/20250910/d05462c59e7f4ab98e5205b7f8172325.png" mode="aspectFit" @click="playReward">
+					</image>
+				</view>
+				<image class="ring_bg" src="https://cos.his.cdwjyyh.com/fs/20250910/41bea8eda62e484d94a19f18316e509b.png" mode="aspectFit"></image>
+			</view>
+		</view>
+		<image class="close" src="https://cos.his.cdwjyyh.com/fs/20250910/93608bad8ad1479a854ec26e8eaaacea.png" @click="close"></image>
+	</uni-popup>
+</template>
+
+<script>
+	import {
+		getVideoRewardRules
+	} from "@/api/course.js"
+	export default {
+		data() {
+			return {
+				running: false,
+				spinning: false, // 是否处于无限旋转
+				list: [],
+				width: 0,
+				animationData: {},
+				btnDisabled: '',
+				runDeg: 0,
+				targetIdx: -1,
+				duration: 1000,
+				currentDeg: 0, // 实时角度
+				idleTimer: null,
+				animationRun: null,
+				winAudio: null,
+			}
+		},
+		methods: {
+			initAudio() {
+				this.winAudio = uni.createInnerAudioContext();
+				this.winAudio.src = 'https://fs-1319721001.cos.ap-chongqing.myqcloud.com/audio/win2.mp3';
+				this.winAudio.volume = 0.6;
+			},
+			getVideoRewardRules(urlOption) {
+				const param = {
+					type: 3,
+					...urlOption
+				}
+				getVideoRewardRules(param).then(res => {
+					if (res.code == 200) {
+						this.list = res.data || []
+						this.width = 360 / this.list.length;
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						})
+					}
+				})
+			},
+			open(urlOption) {
+				this.animationRun = uni.createAnimation({
+					duration: 0
+				});
+				this.animationRun.rotate(0).step();
+				this.animationData = this.animationRun.export();
+				this.running = false
+				this.spinning = false;
+				clearInterval(this.idleTimer);
+				this.runDeg = 0
+				this.targetIdx = -1
+				this.$refs.turntablePopup.open()
+				this.getVideoRewardRules(urlOption)
+			},
+			close(type) {
+				if (type == 'close') {
+					this.running = false
+					this.spinning = false;
+					clearInterval(this.idleTimer);
+				}
+				if (this.running) {
+					uni.showToast({
+						title: '抽取中,请勿关闭',
+						icon: 'none'
+					})
+					return
+				}
+				this.$refs.turntablePopup.close()
+			},
+			drawFanWithAlternateColor(id, x, y, r, count) {
+				const ctx = uni.createCanvasContext(id, this);
+				const sweep = 360 / count; // 每份角度
+				let start = -90 - sweep / 2; // 第一个扇形起始角度(deg)
+
+				for (let i = 0; i < count; i++) {
+					const end = start + sweep; // 结束角度
+					let color;
+					color = i % 2 === 0 ? '#FFDFD3' : '#FFF';
+
+					ctx.beginPath();
+					ctx.moveTo(x, y);
+					ctx.arc(
+						x, y, r,
+						(start * Math.PI) / 180,
+						(end * Math.PI) / 180
+					);
+					ctx.closePath();
+					ctx.setFillStyle(color);
+					ctx.fill();
+
+					start = end; // 下一个扇形接着画
+				}
+
+				ctx.draw();
+			},
+			animation(index = null) {
+				//中奖index
+				let list = this.list;
+				let runNum = 1; //旋转8周
+
+				// 旋转角度
+				this.runDeg = this.runDeg || 0;
+				this.runDeg = this.runDeg + (360 - this.runDeg % 360) + (360 * runNum - index * (360 / list.length)) + 1
+				
+				// const a = 360 / list.length;
+				//    this.runDeg = this.currentDeg + 360 * 4  + (360 - this.currentDeg % 360)  - index * a + 1;      
+				//创建动画
+				this.animationRun = uni.createAnimation({
+					duration: this.duration,
+					timingFunction: 'ease'
+				})
+				console.log("=====animationRun=", this.animationRun)
+				this.animationRun.rotate(this.runDeg).step();
+				this.animationData = this.animationRun.export();
+			},
+			//发起抽奖
+			playReward() {
+				if (this.running) {
+					uni.showToast({
+						title: '抽取中',
+						icon: 'none'
+					})
+					return
+				}
+				this.running = true
+				this.startIdle();
+				this.$emit('sendRewardFun',3)
+			},
+			startIdle() {
+				this.spinning = true; // 打开 CSS 动画
+				// 同时用定时器记录角度,方便后面衔接
+				this.idleTimer = setInterval(() => {
+					this.runDeg = (this.runDeg + 36) % 360; // 每 100ms 走 6°
+				}, 100);
+			},
+			endSuccess(code) {
+				this.targetIdx = this.list.findIndex(it=>it.code == code)
+				const that = this
+				this.spinning = false;
+				clearInterval(this.idleTimer);
+				if (this.targetIdx == -1) {
+					uni.showToast({
+						title: '抽奖失败',
+						icon: 'none'
+					})
+					this.running = false;
+					return
+				}
+				this.animation(this.targetIdx)
+				this.winAudio?.play();
+				setTimeout(() => {
+					this.running = false;
+					uni.showModal({
+						title: '恭喜,中奖',
+						content: this.list[this.targetIdx].name,
+						showCancel: false,
+						success: function(res) {
+							if (res.confirm) {
+								that.winAudio?.stop();
+								that.winAudio?.destroy();
+								that.$refs.turntablePopup.close()
+								that.$emit("openAppPop")
+							}
+						}
+					});
+				}, this.duration + 1000)
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@keyframes spin {
+		from {
+			transform: rotate(0deg);
+		}
+
+		to {
+			transform: rotate(360deg);
+		}
+	}
+
+	.infinite-spin {
+		animation: spin 1s linear infinite;
+	}
+
+	.close {
+		width: 64rpx;
+		height: 64rpx;
+		margin: 24rpx auto 0 auto;
+		display: block;
+	}
+
+	.turntable {
+		position: relative;
+		width: 660rpx;
+		height: 880rpx;
+
+		.bg {
+			width: 660rpx;
+			height: 880rpx;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+
+		&-con {
+			width: 660rpx;
+			height: 880rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			position: relative;
+			z-index: 2;
+		}
+
+		.text {
+			width: 520rpx;
+			height: 104rpx;
+			margin-top: 47rpx;
+		}
+
+		.base {
+			width: 451rpx;
+			height: 177rpx;
+			position: absolute;
+			bottom: 55rpx;
+			left: 50%;
+			transform: translateX(-50%);
+			z-index: 3;
+		}
+
+		.decoration_img {
+			width: 637rpx;
+			height: 592rpx;
+			position: absolute;
+			bottom: 85rpx;
+			left: 50%;
+			transform: translateX(-50%);
+			z-index: 4;
+		}
+
+		.ring {
+			width: 502rpx;
+			height: 502rpx;
+			background: #FFFDFD;
+			border-radius: 50%;
+			position: relative;
+			margin-top: 79rpx;
+			z-index: 9;
+		}
+
+		.button {
+			width: 158rpx;
+			height: 200rpx;
+			position: absolute;
+			top: calc(50% - 21rpx);
+			left: 50%;
+			transform: translate(-50%, -50%);
+			z-index: 99;
+		}
+
+		.ring_bg {
+			width: 620rpx;
+			height: 620rpx;
+			position: absolute;
+			bottom: 74rpx;
+			left: 50%;
+			transform: translateX(-50%);
+			z-index: 6;
+		}
+
+		.canvas-content {
+			position: absolute;
+			left: 0;
+			top: 0;
+			z-index: 1;
+			display: block;
+			width: 502rpx;
+			height: 502rpx;
+			border-radius: inherit;
+			/* background-clip: padding-box; */
+			/* background-color: #ffcb3f; */
+		}
+
+		.icon-awrad {
+			width: 72rpx;
+			height: 72rpx;
+			margin-top: 10rpx;
+			object-fit: contain;
+		}
+
+		.canvas-list {
+			position: absolute;
+			left: 0;
+			top: 0;
+			width: inherit;
+			height: inherit;
+			z-index: 99;
+		}
+
+		.canvas-item {
+			position: absolute;
+			left: 0;
+			top: 0;
+			width: 100%;
+			height: 100%;
+			color: #e4370e;
+			/* text-shadow: 0 1rpx 1rpx rgba(255, 255, 255, 0.6); */
+		}
+
+		.canvas-item-text {
+			position: relative;
+			display: block;
+			padding-top: 14rpx;
+			margin: 0 auto;
+			text-align: center;
+			-webkit-transform-origin: 50% 251rpx;
+			transform-origin: 50% 251rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			color: #F72F26;
+			font-weight: 500;
+			font-size: 24rpx;
+		}
+
+		.canvas-item-text text {
+			font-size: 30rpx;
+		}
+
+		/* 分隔线 */
+		.canvas-line {
+			position: absolute;
+			left: 0;
+			top: 0;
+			width: inherit;
+			height: inherit;
+			z-index: 99;
+		}
+
+		.canvas-litem {
+			position: absolute;
+			left: 251rpx;
+			top: 0;
+			width: 1rpx;
+			height: 251rpx;
+			background-color: #FF4D2C;
+			overflow: hidden;
+			-webkit-transform-origin: 50% 251rpx;
+			transform-origin: 50% 251rpx;
+		}
+	}
+</style>

+ 318 - 0
pages_course/components/turntableTwo.vue

@@ -0,0 +1,318 @@
+<template>
+	<uni-popup ref="turntablePopup" type="center" :is-mask-click="false">
+		<view class="turntable">
+			<image class="turntable-bg" src="https://cos.his.cdwjyyh.com/fs/20250910/de386927c5f44e02ab3ecc480ddb9797.png" mode="aspectFit"></image>
+			<view class="turntable-box">
+				<view class="turntable-wrap">
+					<view class="turntable-item" :class="{ active: idx == light,disabled: item.isReceive }"
+						v-for="(item,idx) in cells" :key="idx">
+						<image :src="item.iconUrl" mode="aspectFit"></image>
+						<view class="ellipsis">{{item.name}}</view>
+					</view>
+				</view>
+			</view>
+			<image class="close" src="https://cos.his.cdwjyyh.com/fs/20250910/93608bad8ad1479a854ec26e8eaaacea.png" @click="close"></image>
+			<view class="btn-box">
+				<image src="https://cos.his.cdwjyyh.com/fs/20250910/fe230bfdf74f4f0dac88af53f709d6c5.png" mode="widthFix" :class="isReceive==1 ?'gray':''" @click="start"></image>
+			</view>
+		</view>
+	</uni-popup>
+</template>
+
+<script>
+	import {getVideoRewardRules} from "@/api/course.js"
+	export default {
+		data() {
+			return {
+				baseUrl: uni.getStorageSync('requestImagesPath'),
+				light: -1,
+				running: false,
+				targetIdx: -1,
+				total: 0,
+				speed: 100,
+				cells:[],
+				timer: null,
+				isReceive: 0,
+				stepAudio: null,   // 跳动音
+				winAudio: null     // 中奖音
+			}
+		},
+		computed: {
+			// 剩余可用索引
+			availIdx() {
+				return this.cells.map((_, i) => i).filter(i => !this.cells[i].isReceive)
+			},
+			// 是否全部抽完
+			allDone() {
+				return this.availIdx.length === 0
+			}
+		},
+		methods: {
+			initAudio() {
+			    this.stepAudio = uni.createInnerAudioContext();
+			    this.stepAudio.src = 'https://fs-1319721001.cos.ap-chongqing.myqcloud.com/audio/spin.mp3';
+			    this.stepAudio.volume = 0.6;
+			
+			    this.winAudio = uni.createInnerAudioContext();
+			    this.winAudio.src = 'https://fs-1319721001.cos.ap-chongqing.myqcloud.com/audio/win.mp3';
+			    this.winAudio.volume = 1;
+			},
+			getVideoRewardRules(urlOption) {
+				const param = {
+					type: 4,
+					...urlOption
+				}
+				getVideoRewardRules(param).then(res=>{
+					if(res.code == 200) {
+						this.cells = res.data || []
+						this.total = this.cells.length
+						this.isReceive = this.cells.every(item => item.isReceive == true)? 1 :0
+					}else {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						})
+					}
+				})
+			},
+			open(urlOption) {
+				this.initAudio();
+				this.$refs.turntablePopup.open()
+				this.getVideoRewardRules(urlOption)
+			},
+			close(type) {
+				if(type=='close') {
+					this.running = false
+					clearInterval(this.timer)
+				}
+				if (this.running) {
+					uni.showToast({
+						title: '抽取中,请勿关闭',
+						icon: 'none'
+					})
+					return
+				}
+				this.$refs.turntablePopup.close()
+			},
+			start() {
+				if (this.running) {
+					uni.showToast({
+						title: '抽取中',
+						icon: 'none'
+					})
+					return
+				}
+				if(this.isReceive == 1) return
+				this.running = true
+				clearInterval(this.timer)
+				let last = -1
+				if(this.availIdx.length >1) {
+					this.timer = setInterval(() => {
+						let next;
+						do {
+						  next = this.availIdx[Math.floor(Math.random() * this.availIdx.length)];
+						} while (next === last);
+						last = next;
+						this.light = next;
+						this.stepAudio.stop();  // 停掉上一声(防止重叠)
+						this.stepAudio.play();  // 播放跳动音
+					}, this.speed)
+				}
+				this.$emit('sendRewardFun',4)
+			},
+			endSuccess(code) {
+				this.targetIdx = this.cells.findIndex(it=>it.code == code)
+				clearInterval(this.timer)
+				this.timer = null
+				if(this.targetIdx==-1) {
+					uni.showToast({
+						title: '抽奖失败',
+						icon: 'none'
+					})
+					return
+				}
+				const STEP = 100;                          // 每格固定 100 ms
+				const MIN_STEP = 10;                       // 最少 10 步 → 1 s
+				this.speed = STEP;
+				let totalSteps = Math.max(MIN_STEP, this.availIdx.length);
+				// 约 2.5s / 100ms
+				let step = 0
+				let last = -1
+				const that = this
+				if(this.availIdx.length <= 1) {
+					this.light = this.targetIdx
+					this.stepAudio.stop();
+					this.winAudio.play();   // 播放中奖音
+					this.running = false
+					this.isReceive = 1
+					uni.showModal({
+						title: '恭喜,中奖',
+						content: this.cells[this.targetIdx].name,
+						showCancel: false,
+						success: function (res) {
+							if (res.confirm) {
+								if (that.stepAudio) {
+									that.stepAudio.stop();
+									that.stepAudio.destroy();
+									that.stepAudio = null;
+								}
+								if (that.winAudio) {
+									that.winAudio.stop();
+									that.winAudio.destroy();
+									that.winAudio = null;
+								}
+								that.$refs.turntablePopup.close()
+								that.$emit("openAppPop")
+							}
+						}
+					});
+					return
+				}
+				this.timer = setInterval(() => {
+					let next
+					do {
+						next = this.availIdx[Math.floor(Math.random() * this.availIdx.length)]
+					} while (next === last)
+					last = next
+					this.light = next
+					this.stepAudio.stop();  // 停掉上一声(防止重叠)
+					this.stepAudio.play();  // 播放跳动音
+					step++
+				
+					if (step >= totalSteps) {
+						clearInterval(this.timer)
+						this.light = this.targetIdx
+						this.stepAudio.stop();
+						this.winAudio.play();   // 播放中奖音
+						// 置灰
+						this.running = false
+						this.isReceive = 1
+						setTimeout(()=>{
+							uni.showModal({
+								title: '恭喜,中奖',
+								content: this.cells[this.targetIdx].name,
+								showCancel: false,
+								success: function (res) {
+									if (res.confirm) {
+										if (that.stepAudio) {
+											that.stepAudio.stop();
+											that.stepAudio.destroy();
+											that.stepAudio = null;
+										}
+										if (that.winAudio) {
+											that.winAudio.stop();
+											that.winAudio.destroy();
+											that.winAudio = null;
+										}
+										that.$refs.turntablePopup.close()
+										that.$emit("openAppPop")
+									}
+								}
+							});
+						},500)
+						// this.cells[this.targetIdx].isReceive = true
+					}
+				}, this.speed)
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.gray {
+	  filter: grayscale(1);   /* 1 = 100% 灰度 */
+	}
+	.close {
+		width: 64rpx;
+		height: 64rpx;
+		position: absolute;
+		top:  88rpx;
+		right: 20rpx;
+		z-index: 2;
+	}
+
+	.active {
+		transform: scale(1.05);
+		background: linear-gradient(0deg, #FFD44F 0%, #FFFABD 100%) !important;
+		box-shadow: 0rpx 2rpx 0rpx 0rpx #FFFCF5 !important;
+	}
+
+	.disabled {
+		filter: grayscale(1) brightness(0.7);
+		opacity: 0.5;
+	}
+
+	.btn-box {
+		width: 540rpx;
+		height: 104rpx;
+		position: absolute;
+		bottom: 46rpx;
+		left: 50%;
+		transform: translateX(-50%);
+		z-index: 2;
+
+		image {
+			width: 100%;
+			height: auto;
+		}
+	}
+
+	.turntable {
+		width: 750rpx;
+		height: 1056rpx;
+		position: relative;
+		&-bg {
+			width: 100%;
+			height: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: 1;
+		}
+
+		&-box {
+			position: absolute;
+			bottom: 174rpx;
+			left: 50%;
+			transform: translateX(-50%);
+			z-index: 2;
+			width: 623rpx;
+			height: 628rpx;
+			padding: 16rpx 0 8rpx 16rpx;
+			box-sizing: border-box;
+		}
+
+		&-wrap {
+			display: flex;
+			flex-wrap: wrap;
+		}
+
+		&-item {
+			width: 112rpx;
+			height: 112rpx;
+			background: linear-gradient(0deg, #FCEFCA 0%, #FFFFFF 100%);
+			border-radius: 16rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			font-size: 20rpx;
+			color: #333333;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			flex-direction: column;
+			margin: 0 8rpx 8rpx 0;
+			transition: transform 0.2s, box-shadow 0.2s;
+
+			image {
+				width: 45rpx;
+				height: 63rpx;
+			}
+
+			.ellipsis {
+				overflow: hidden;
+				text-overflow: ellipsis;
+				white-space: nowrap;
+			}
+		}
+	}
+</style>

+ 141 - 0
pages_course/register.vue

@@ -0,0 +1,141 @@
+<template>
+	<view class="register_box">
+		<image src="https://image.cdwjyyh.com/images/kc_hb_bg.png" class="imgbg" mode="widthFix"></image>
+		<view class="kc_footer">
+			<image src="https://image.cdwjyyh.com/images/kc_footer_bg.png" class="imgft" mode="widthFix"></image>
+			<view class="kc_footer_btn" @click="goLogin">{{isRegister==1?'注册成功':'立即注册'}}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {loginByMp,getUserPhoneDeviceType} from "@/api/course.js"
+	export default {
+		data() {
+			return {
+				isRegister: 0,
+				isLoading: false
+			}
+		},
+		methods: {
+			goLogin() {
+				if (this.isRegister == 1) {
+					uni.showToast({
+						title: '注册成功',
+						icon: 'none'
+					});
+					return
+				}
+				if (this.isLoading) return;
+				this.utils.getProvider().then(provider => {
+					console.log('当前的环境商', provider)
+					if (!provider) {
+						reject()
+					}
+					uni.login({
+						provider: provider,
+						success: async loginRes => {
+							console.log(loginRes)
+							uni.getUserInfo({
+								provider: provider,
+								success: (infoRes) => {
+									this.isLoading = true
+									uni.showToast({
+										title: '注册中...',
+										icon: 'loading'
+									});
+									loginByMp({
+										code: loginRes.code,
+										encryptedData: infoRes.encryptedData,
+										iv: infoRes.iv,
+										appId: getApp().globalData.appId
+									}).then(res => {
+										uni.hideLoading();
+										this.isLoading = false
+										if (res.code == 200) {
+											this.isRegister = 1
+											this.$store.commit('setCoureLogin', 1);
+											uni.setStorageSync('AppTokenmini_RTCourse', res.token);
+											uni.setStorageSync('auto_userInfo', JSON.stringify(res.user));
+											uni.showToast({
+												title: '注册成功',
+												icon: 'loading'
+											});
+											this.getUserPhoneDeviceType()
+										} else {
+											uni.showToast({
+												title: res.msg,
+												icon: 'none'
+											});
+										}
+									}).catch(err => {
+										this.isLoading = false
+										uni.hideLoading();
+										uni.showToast({
+											icon: 'none',
+											title: "登录失败,请重新登录",
+										});
+									});
+								}
+							});
+						}
+					})
+				}).catch(err => {})
+			},
+			getUserPhoneDeviceType(){
+				uni.getSystemInfo({
+				  	success: (result) => {
+						const param = {
+							os: result.osName || '',
+							deviceId: result.deviceId || '',
+							appId: getApp().globalData.appId
+						}
+						getUserPhoneDeviceType({param:JSON.stringify(param)})
+					},
+					fail: (error) => {
+						console.log('获取型号失败',JSON.stringify(error))
+					}
+				})
+			}, 
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.register_box {
+		position: relative;
+	}
+
+	.imgbg {
+		width: 100%;
+	}
+
+	.kc_footer {
+		width: 100%;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+
+		&_btn {
+			width: 528rpx;
+			height: 96rpx;
+			background: #FF5C03;
+			border-radius: 48rpx 48rpx 48rpx 48rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			position: absolute;
+			bottom: 20%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+		}
+	}
+
+	.imgft {
+		width: 100%;
+	}
+</style>

+ 2416 - 0
pages_course/videoDetail.vue

@@ -0,0 +1,2416 @@
+<template>
+	<view class="content">
+		<view class="header-nav" :style="{height: `calc(88rpx + ${statusBarHeight}px)`,paddingTop: statusBarHeight + 'px'}">
+			<view class="arrow-left-warning" @click="feedback">
+				<image src="/static/images/warning.png"></image>
+				<text>投诉</text>
+			</view>
+			<view class="header-title" :style="{width:menuButtonLeft + 'px',height:menuButtonH+'px',lineHeight:menuButtonH+'px'}">{{courseInfo.title}}</view>
+		</view>
+		<view class="video-box">
+			<image v-if="!isLogin || isAddKf!=1" class="video-poster" :src="courseInfo.imgUrl" mode="aspectFill">
+			</image>
+			<video 
+			@timeupdate="onTimeUpdate" 
+			@progress="progressChange" 
+			@error="videoErrorCallback" 
+			@play="getPlay"
+			@pause="getPause" 
+			@ended="getEnded" 
+			@fullscreenchange="fullscreenchange"
+			@controlstoggle="controlstoggle"
+			@waiting="getWaiting"
+			:title="courseInfo.title"
+			style="width: 100%;height: 420rpx;" 
+			:poster="poster"  
+			id="video-content-box"  
+			controls
+			:show-fullscreen-btn="true"
+			:auto-pause-if-open-native="true"
+			:auto-pause-if-navigate="true"
+			:enable-progress-gesture="false" 
+			:show-progress="true"
+			:picture-in-picture-mode="[]"
+			:show-background-playback-button="false"
+			:src="videoUrl"
+			>
+			<!-- :danmu-list="danmuList"
+			enable-danmu
+			danmu-btn -->
+			<!-- 弹幕展示 -->
+			<template v-if="showDanmu==1&&openCommentStatus==2">
+				<text v-for="(item, index) in activeDanmus" :key="item.commentId" class="danmu-item danmuMove"
+					:style="item.danmustyle" @animationend="animationend(item,index)">
+					{{ item.content }}
+				</text>
+			</template>
+				<cover-view class="video-danmu-btnbox" :style="{display: openCommentStatus==2&&isfull&&crtShow&&isLogin&&isAddKf==1 ? 'block':'none'}">
+					<cover-image class="video-danmu-image"
+					:src="baseUrl+'/images/danmu_set.png'"
+					 @click="openDanmu(1)"></cover-image>
+				</cover-view>
+				<treasureChest ref="treasureChest" :isfull="isfull" :onHide="onHide" :boxList="fsUserCourseRewardRoundStatusVO" @claimFun="claimFun"></treasureChest>
+			</video>
+		</view>
+		<!-- 弹幕方法 -->
+		<commentBox
+			v-if="openCommentStatus==2"
+			ref="danmuBox" 
+			:height="height" 
+			:urlOption="urlOption" 
+			:time="playTime"
+			:showDanmu="showDanmu"
+			:viewCommentNum="viewCommentNum"
+			:openCommentStatus="openCommentStatus"
+			:isSocketOpen="isSocketOpen"
+			@socketSend="socketSend"
+			@initSocket="initSocket"
+			@setInputText="setInputText" 
+			@getScrollTop="getScrollTop"
+			@getMore="getMore"
+			@getActiveDanmus="getActiveDanmus"></commentBox>
+		<view id="title-contentnav">
+			<template v-show="isLogin&&notice">
+				<u-notice-bar :text="notice" color="red" speed='60' fontSize="18"></u-notice-bar>
+			</template>
+			<view class="title-content" v-if="openCommentStatus!=1">
+				<!-- 答题时展示小节课程名,其他展示课程名 -->
+				<!-- 小节课程名 -->
+				<view class="subtitlebox" v-if="isLogin&&isAddKf==1">
+					{{courseInfo.title|| ''}}
+				</view>
+				<!-- 课程名字 -->
+				<view class="miantitlebox" v-else>
+					{{courseInfo.courseName|| ''}}
+				</view>
+				<!-- 投诉 -->
+				<!-- <view class="warning" @click="feedback" v-if="isLogin&&videoId">
+					<image src="/static/images/warning.png"></image>
+					<text>投诉</text>
+				</view> -->
+			</view>
+			<view class="tabbox-bar" v-if="openCommentStatus==1">
+				<view class="tabbox">
+					<view :class="currentTab == nav.id ? 'tabbox-active':''" v-for="nav in navList" :key="nav.id" @click="handleTab(nav.id)">{{nav.name}}</view>
+				</view>
+				<!-- 投诉 -->
+				<!-- <view class="warning" @click="feedback">
+					<image src="/static/images/warning.png"></image>
+					<text>投诉</text>
+				</view> -->
+			</view>
+		</view>
+		<scroll-view
+		class="scroll-view" 
+		:style="{height: height}" 
+		:scroll-top="scrollTop" 
+		:scroll-y="true" 
+		:refresher-enabled="currentTab == 2"
+		:refresher-triggered="triggered"
+		@refresherrefresh="handleRefresher">
+			<template v-if="openCommentStatus==1">
+				<view v-show="currentTab==0">
+					<descInfoNav ref="descInfoNav" :isLogin="isLogin" :isAddKf="isAddKf" :courseInfo="courseInfo"></descInfoNav>
+				</view>
+				<view v-show="currentTab==2">
+					<commentBox 
+					ref="commentBox" 
+					:height="height" 
+					:urlOption="urlOption" 
+					:time="playTime"
+					:flagTime="flagTime"
+					:showDanmu="showDanmu"
+					:viewCommentNum="viewCommentNum"
+					:openCommentStatus="openCommentStatus"
+					:isSocketOpen="isSocketOpen"
+					@socketSend="socketSend"
+					@initSocket="initSocket"
+					@setInputText="setInputText" 
+					@getScrollTop="getScrollTop"
+					@getMore="getMore"></commentBox>
+				</view>
+			</template>
+			<view v-show="currentTab==1">
+				<template v-if="openCommentStatus!=1">
+					<!-- 介绍 -->
+					<descInfo ref="descInfo" :isLogin="isLogin" :isAddKf="isAddKf" :courseInfo="courseInfo"></descInfo>
+				</template>
+				<!-- 问题 -->
+				<template v-if="isLogin&&isAddKf==1">
+					<ques ref="ques" :urlOption="urlOption" :courseNote="courseNote" :showNote="showNote" :treatmentPackage="treatmentPackage" :showTreatment="showTreatment" :quesList="quesList" :openCommentStatus="openCommentStatus" @handleAnswer="handleAnswer" @showBtnType="showBtnType"></ques>
+				</template>
+			</view>
+		</scroll-view>
+		<!-- 线路 -->
+		<view class="video-line" v-if="isLogin&&isAddKf==1" @click="openPop">
+			<image src="https://cos.his.cdwjyyh.com/fs/20250915/04889779f7f44e22a7a378d26823b2e8.png"></image>
+			<text>线路{{numberToChinese(lineIndex + 1)}}</text>
+		</view>
+		<!-- 线路弹窗 -->
+		<uni-popup ref="popup" type="bottom"  class="full-width-popup">
+			<view class="popupbox">
+				<view class="popupbox-head">
+					<text>线路选择</text>
+					<image class="close-icon" src="https://cos.his.cdwjyyh.com/fs/20250915/b950ff20d115453f9d7f908590c9c0e7.png" mode="aspectFill" @click="close">
+					</image>
+				</view>
+				<view class="popupbox-content">
+					<view :class="lineIndex == index ? 'line-item line-active': 'line-item'"
+						v-for="(it,index) in lineList" :key="index" @click="handleLine(index)">
+						线路{{numberToChinese(index + 1)}}</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 发送弹幕 -->
+		<view class="video-line danmu-line" v-if="isLogin&&isAddKf==1&&openCommentStatus==2" @click="openDanmu(0)" >
+			<image class="set_image" src="https://cos.his.cdwjyyh.com/fs/20250418/5e508642737a44169061382566043ac9.png" mode="aspectFill"></image>
+			<text>发弹幕</text>
+		</view>
+		<!-- 发送弹幕弹窗 -->
+		<uni-popup ref="danmuPopup" type="bottom" style="z-index: 999;" @change="changeShowPopup">
+			<view class="danmuPopup" :style="{marginLeft:isfull ? statusBarHeight+'px': 0,marginBottom: danmuboxHeight+'px'}">
+				<view class="danmuPopup-head border-line">
+					<image class="danmu-icon" :src="showDanmu==0?baseUrl+'/images/danmu-off.png':baseUrl+'/images/danmu-on.png'" mode="heightFix" @click="switchDanmu()"></image>
+					<view class="u-border">
+						<u-input 
+						class="danmuPopup-input" 
+						placeholder="发个弹幕吧~" 
+						border="border"
+						:focus="focus"
+						:adjustPosition="false" 
+						:autoBlur="true" 
+						maxlength="50"
+						v-model.trim="inputText">
+						</u-input>
+						<text style="font-size: 24rpx;color: #bbb;margin-left: 10rpx;">{{inputText?inputText.trim().length:0}}/50</text>
+					</view>
+					<button class="danmuPopup-send" @click="handleChatInput">发送</button>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 答题弹窗 -->
+		<uni-popup ref="answerPopup" type="center">
+			<view :class="errTitle == '恭喜你,回答正确' ? 'answerPopup-box bg':'answerPopup-box'">
+				<!-- 正确 -->
+				<image class="tipimg" v-if="errTitle == '恭喜你,回答正确'" src="https://cos.his.cdwjyyh.com/fs/20250915/f7b1075c21b442069ec9721a1a4790ec.png"
+					mode="aspectFill"></image>
+				<!-- 错误 -->
+				<image class="tipimg" v-else src="https://cos.his.cdwjyyh.com/fs/20250915/a4b145c94b684c778c03ad9b52d717f3.png" mode="aspectFill">
+				</image>
+				<view class="answerPopup-title">{{errTitle}}</view>
+				<view class="answerPopup-desc" v-html="errDesc"></view>
+				<view style="color: #FF5C03;">{{currentRewardText}}</view>
+				<!-- 选择奖励 -->
+				<view class="reward-list" v-if="errTitle == '恭喜你,回答正确'">
+					<view :class="item.value == currentReward?'reward-item reward-active':'reward-item'" 
+					v-for="(item, index) in rewardType" :key="item.value" @click="rewardChange(item)">
+						{{item.name}}
+					</view>
+					<!-- <radio-group class="reward-list-group" @change="rewardChange">
+						<label class="reward-list-option" v-for="(item, index) in rewardType" :key="item.value">
+							<radio :value="item.value+ ''" :checked="item.value == currentReward"
+								activeBorderColor="#FF5C03" activeBackgroundColor="#FF5C03"
+								style="transform:scale(0.7)" color="#FF5C03" />
+							<view :style="{color: item.value == currentReward ? '#FF5C03':''}">{{item.name}}</view>
+						</label>
+					</radio-group> -->
+				</view>
+				<!-- 错误题目 -->
+				<view class="errQuesbox" v-if="errQues&&errQues.length>0">
+					<view class="errQuesbox-item textOne" v-for="(it,index) in errQues" :key="index">{{it.title}}</view>
+				</view>
+				<view class="answerPopup-btn" v-if="errTitle == '恭喜你,回答正确'" @click="closeAnswerPopup">确认</view>
+				<view class="tipsPopup-btn-box" v-else
+					:style="{marginTop: errQues&&errQues.length>0 ? '40rpx':'54rpx'}">
+					<view class="tipsPopup-btn" @click="closeAnswerPopup">{{remain > 0 ? '重新答题': '确认'}}</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 展示兑换奖品弹窗 -->
+		<appPopup ref="appPopup"></appPopup>
+		<!-- 客服二维码弹窗 -->
+		<uni-popup ref="kfPopup" type="center" :mask-click="false">
+			<view class="kfqrcode-box">
+				<image class="kfqrcode" :src="qrcode" show-menu-by-longpress="true"></image>
+				<view v-show="qrcodeMsg" style="margin-top: 30rpx;" v-html="qrcodeMsg"></view>
+				<image class="kfqrcode-close" src="https://cos.his.cdwjyyh.com/fs/20250915/97978486cc6c47c6949c5bcc9bc0c4a3.png" mode="aspectFill"
+					@click="closeKFPop"></image>
+			</view>
+		</uni-popup>
+		<!-- 可以答题提示 -->
+		<view class="answerTip" v-if="currentTab!=1&&openCommentStatus==1&&showAnswerTip" @click="handleTab(1)">
+			可以答题啦
+		</view>
+		<!-- footer -->
+		<view class="footer" v-show="currentTab!=2&&videoId">
+			<view class="footer-btn" v-if="!isLogin || isAddKf !=1" @click="submit">
+				<text>立即学习</text>
+			</view>
+			<view v-if="isLogin&&isAddKf==1&&currentTab==1&&quesList&&quesList.length>0&&showBtn==0" class="footer-btn footer-btn-border" @click="submit">
+				<!-- <image class="footer-btn-img" :src="baseUrl+'/images/red_envelope_btnimg.png'" mode="aspectFill"></image> -->
+				<text>提交答案领取奖励</text>
+			</view>
+			<!-- <view @click="checked=!checked" class="agreement" v-if="!isLogin">
+				<radio value="r1" :checked="checked" color="#ff5c03" activeBorderColor="#ff5c03"
+					style="transform:scale(0.6);" />
+				<view>阅读并同意<text style="color: #ff5c03;" @click.stop="goWeb(0)">《用户协议》</text>和<text
+						style="color: #ff5c03;" @click.stop="goWeb(1)">《隐私协议》</text></view>
+			</view> -->
+			<!-- <view class="footer-tips">重庆云联融智提供技术支持</view> -->
+		</view>
+		<view v-show="currentTab==2">
+			<view class="chatinput" :style="{bottom:danmuboxHeight>0?danmuboxHeight+'px':'calc(var(--window-bottom) + 24rpx)'}">
+				<input class="uni-input" v-model.trim="inputText" :adjustPosition="false" :autoBlur="false" maxlength="140" placeholder="发消息···" confirm-type="send" @confirm="handleChatInput" />
+				<button class="send" @click="handleChatInput">发送</button>
+			</view>
+		</view>
+		<turntableOne ref="turntableOne" @sendRewardFun="sendRewardFun" @openAppPop="openAppPop"></turntableOne>
+		<turntableTwo ref="turntableTwo" @sendRewardFun="sendRewardFun" @openAppPop="openAppPop"></turntableTwo>
+	</view>
+</template>
+
+<script>
+	import { mapGetters } from 'vuex';
+	import turntableOne from "./components/turntableOne.vue"
+	import turntableTwo from "./components/turntableTwo.vue"
+	import appPopup from "./components/appPopup.vue"
+	import ques from "./components/ques.vue"
+	import descInfo from "./components/descInfo.vue"
+	import descInfoNav from "./components/descInfoNav.vue"
+	import commentBox from "./components/commentBox.vue"
+	import treasureChest from "./components/treasureChest.vue"
+	import dayjs from 'dayjs';
+	import {
+		getErrMsg,
+		getH5CourseByVideoId,
+		getH5CourseVideoDetails,
+		courseAnswer,
+		getFinishCourseVideo,
+		getIsAddKf,
+		internetTraffic,
+		getIntegralByH5Video,
+		sendReward,
+		loginByMp,
+		getRealLink,
+		getConfigByKey,
+		claim,
+		getVideoRewardTypes,
+		getUserPhoneDeviceType
+	} from "@/api/course.js"
+	export default {
+		components: {
+			descInfoNav,
+			descInfo,
+			commentBox,
+			ques,
+			treasureChest,
+			appPopup,
+			turntableOne,
+			turntableTwo
+		},
+		data() {
+			return {
+				socket: null,
+				isSocketOpen: false,
+				pingpangTimes: null,
+				baseUrl:uni.getStorageSync('requestImagesPath'),
+				// 1 红包 2 芳华币
+				rewardType:[],
+				currentReward: -1,
+				player: null,
+				loading: true,
+				progress: 0,
+				code: null,
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				scrollTop: 0,
+				height: '0px',
+				isLogin: false,
+				videoUrl: "",
+				videoId: "",
+				//现在的时长
+				playTime: 0,
+				//总时长
+				duration: 0,
+				playDuration: 0,
+				// 用于续播
+				playDurationSeek: 0,
+				// 温馨提醒时间节点,
+				tipsTime: 0,
+				tipsOpen: false,
+				config: {},
+				courseInfo: {},
+				quesList: [],
+				lineList: [],
+				// 错题
+				errQues: [],
+				// 答题机会
+				remain: 0,
+				errTitle: "",
+				errDesc: "",
+				showPlay: true,
+				showControls: false,
+				playStatus: "",
+				isfull: false,
+				isAddKf: 0,
+				lineIndex: 0,
+				textHeight: 0, //文本高度
+				qwUserId: "",
+				qrcode: "",
+				corpId: "",
+				qrcodeMsg: "",
+				urlOption: {},
+				bufferRate: 0, // 缓冲时间
+				uuId: "",
+				isEnded: false,
+				// 是否允许拖动进度条
+				linkType: 0,
+				ip: null,
+				checked: true,
+				isFinish: 0, // 是否完课
+				interval: null,
+				intervalIntegral: null, // 芳华币定时
+				options: {
+					sources: [{
+						src: ""
+					}],
+					poster: "",
+					live: false /* 是否直播 */ ,
+					controls: true,
+					autoplay: false,
+					licenseUrl: 'https://license.vod2.myqcloud.com/license/v2/1323137866_1/v_cube.license', // license 地址,参考准备工作部分,在视立方控制台申请 license 后可获得 licenseUrl,
+					LicenseKey: 'bcc5bd9a14b798b48c52ff005a21d926',
+					controlBar: {
+						volumePanel: false,
+						playbackRateMenuButton: false,
+						QualitySwitcherMenuButton: false,
+						// progressControl: false
+					},
+					plugins: {
+						// ProgressMarker: false,
+						ContextMenu: {
+							statistic: false
+						}
+					},
+				},
+				poster: "",
+				// 错误请求次数
+				errorCount: 0,
+				answerPopup: false,
+				sortLink:"",
+				// 课程是否过期
+				isExpire: false,
+				menuButtonLeft: 281,
+				menuButtonH: 45,
+				timer: null,
+				flag: false,
+				focus: false,
+				openDanmuType: 0,
+				danmuboxHeight: 0,
+				user: {},
+				crtShow: true,
+				// 是否获取到对应观看者的真实链接
+				isCheckRealUrl: false,
+				courseLogo: '',
+				isfull: false,
+				navList:[{
+					id: 0,
+					name: '介绍'
+				},{
+					id: 1,
+					name: '答题'
+				},{
+					id: 2,
+					name: '评论'
+				}],
+				currentTab: 1,
+				triggered: false,
+				// 没有更多
+				isMore: false,
+				inputText:"",
+				// 获取最多历史评论条数
+				viewCommentNum: 200,
+				// 1-开启评论;2-开启弹幕;3-关闭
+				openCommentStatus: 3,
+				showAnswerTip: false,
+				showDanmu: 1,
+				activeDanmus:[],
+				flagTime: 0,
+				notice: '',
+				fsUserCourseRewardRoundStatusVO: [],
+				onHide: false,
+				courseNote:'',
+				showBtn: 0,
+				showNote: 0,
+				showTreatment: 1, // 1不展示,0展示
+				treatmentPackage: []
+			}
+		},
+		computed:{
+			...mapGetters(['coureLogin']),
+			currentRewardText(){
+				const index = this.rewardType.findIndex(it=>it.value==this.currentReward)
+				return index > -1 ? this.rewardType[index].text || '':''
+			}
+		},
+		watch: {
+		    coureLogin: {
+		      immediate: true,          // 页面一进入就检查一次
+		      handler(val) {
+		        if (val == 2) {
+					console.log("AppToken失效,请重新登录")
+					this.isLogin = false
+					this.isAddKf = 0
+					this.goLogin()
+		        }
+		      }
+		    }
+		},
+		onLoad(option) {
+			this.code = option.code
+			this.urlOption = option.course ? JSON.parse(decodeURIComponent(option.course)) : {}
+			this.videoId = this.urlOption.videoId || ''
+			this.qwUserId = this.urlOption.qwUserId || ''
+			this.corpId = this.urlOption.corpId || ''
+			this.linkType = this.urlOption.linkType || 0
+			// if (this.code) {
+			// 	this.loginByMp()
+			// }
+			var that=this;
+			if (this.videoId) {
+				this.getH5CourseByVideo()
+				this.getConfigByKey()
+			}
+			this.sortLink = this.urlOption.link || ''
+			this.getMenuButton()
+			// #ifndef H5
+			uni.onKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+		},
+		onShow() {
+			this.onHide = false
+			this.tipsOpen = false
+			// this.isLogin = this.utils.isLoginCourse()
+			this.uuId = this.utils.generateRandomString(16)
+			if(uni.getStorageSync('auto_userInfo') && JSON.stringify(uni.getStorageSync('auto_userInfo'))!='{}') {
+				this.user = JSON.parse(uni.getStorageSync('auto_userInfo'))
+			} else {
+				this.user = {}
+			}
+			if(this.sortLink){
+				this.getLink()
+			} else {
+				uni.showToast({
+					title: 'sortLink is not found',
+					icon: 'none'
+				});
+				if(this.isLogin) {
+					this.getUserPhoneDeviceType()
+				}
+			}
+		},
+		mounted() {
+			this.getIP()
+			this.getHeight()
+		},
+		onHide() {
+			this.onHide = true
+			// this.player = uni.createVideoContext('video-content-box');
+			if (this.player) {
+				this.player.pause()
+			}
+			// if (this.interval != null) {
+			// 	clearInterval(this.interval)
+			// 	this.interval = null
+			// }
+			this.closeSocket()
+		},
+		onUnload() {
+			if (this.interval != null) {
+				clearInterval(this.interval)
+				this.interval = null
+			}
+			this.clearIntegral()
+			// #ifndef H5
+			uni.offKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+			this.closeSocket()
+		},
+		beforeDestroy() {
+			this.player = uni.createVideoContext('video-content-box');
+			if (this.player) {
+				this.player.stop()
+				this.player = null
+			}
+			if (this.interval != null) {
+				clearInterval(this.interval)
+				this.interval = null
+			}
+			this.clearIntegral()
+			// #ifndef H5
+			uni.offKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+			this.closeSocket()
+		},
+		methods: {
+			getVideoRewardTypes() {
+				getVideoRewardTypes({...this.urlOption}).then(res=>{
+					if(res.code == 200) {
+						this.rewardType = res.data
+						this.currentReward = this.rewardType&&this.rewardType.length>0 ? this.rewardType[0].value : -1
+					}
+				})
+			},
+			getConfigByKey(){
+				let param = {key:"course.config"};
+				getConfigByKey(param).then(
+					res => {
+						if(res.code==200){
+							let data=res.data ? JSON.parse(res.data) : {};
+							this.notice = data.notify || ''
+						}
+					},
+					rej => {}
+				);
+			},
+			numberToChinese(number) {
+				if (number) {
+					const chineseNumber = ['一', '二', '三', '四', '五', '六', '七', '八', '九'];
+					return chineseNumber[number - 1];
+				} else {
+					return ''
+				}
+			},
+			keyboardHeightChange(res) {
+				// #ifndef H5
+				console.log("this.danmuboxHeight",this.danmuboxHeight)
+				 this.danmuboxHeight = res.height
+				// #endif
+			},
+			getMenuButton(){
+				const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
+				this.menuButtonLeft = menuButtonInfo.left
+				this.menuButtonH = menuButtonInfo.height
+			},
+			//播放时间更新事件方法
+			onTimeUpdate(e){
+				let currentTime = Math.round(e.detail.currentTime)
+				if (this.playDurationSeek > 0) {
+					this.playTime = this.playDurationSeek
+					this.throttle(() => this.changeTime(this), 1000, false)
+				} else {
+					if (this.linkType != 1 && (currentTime - this.playTime > 3 || currentTime - this.playTime < -3)&&this.isFinish!=1) {
+						uni.showToast({
+							title: '不能快进哦',
+							icon: 'none',
+						});
+						currentTime = this.playTime
+						this.player.seek(this.playTime);
+					}
+					this.playTime = currentTime
+				}
+				if (Math.floor(e.detail.currentTime) != this.flagTime) {
+					this.flagTime = Math.floor(e.detail.currentTime)
+					const isNearEnd = this.playTime >= this.duration - 60;
+					this.showAnswerTip = this.isEnded || isNearEnd;
+				
+					const progress = this.duration ? (this.playTime || 0) / this.duration : 0;
+					const answerRate = Number(this.config.answerRate ?? 1);   // 默认 100%
+					const hitRate = progress >= answerRate;
+					
+					this.showNote = (this.isEnded || this.isFinish === 1 || hitRate) ? 1 : 0;
+					if(this.fsUserCourseRewardRoundStatusVO&&this.fsUserCourseRewardRoundStatusVO.length>0) {
+						this.$refs.treasureChest&&this.$refs.treasureChest.showTreasure(this.flagTime)
+					}
+					if(this.openCommentStatus == 2) {
+						this.$refs.danmuBox&&this.$refs.danmuBox.checkDanmu(this.flagTime)
+					}
+				}
+			},
+			changeTime(that,e) {
+				that.playDurationSeek = 0
+			},
+			videoErrorCallback(e) {
+				this.errorCount++
+				if (this.errorCount > 3) return
+				if (this.interval != null) {
+					clearInterval(this.interval)
+				}
+				this.clearIntegral()
+				console.log(e)
+				this.getErrMsg(e.target.errMsg)
+				this.getH5CourseVideoDetails('error')
+			},
+			// 当开始/继续播放时触发play事件
+			getPlay() {
+				this.errorCount = 0
+				// this.judgeDuration()
+			},
+			getPause() {
+				this.clearIntegral()
+			},
+			getEnded() {
+				this.clearIntegral()
+				this.isEnded = true
+				this.showAnswerTip = true
+				this.isFinish = 1
+				this.showNote = 1
+				this.getFinishCourseVideo()
+			},
+			getWaiting() {
+				this.getErrMsg('','waiting')
+			},
+			fullscreenchange(event) {
+				this.isfull = event.detail.fullScreen
+				if(this.isfull) {
+					this.$refs.danmuBox&&this.$refs.danmuBox.initTracks()
+				}
+			},
+			controlstoggle(event) {
+				this.crtShow =  event.detail.show
+			},
+			getIP() {
+				uni.request({
+					url: 'https://ipinfo.io/json', //仅为示例,并非真实接口地址。
+					method: 'GET',
+					success: (res) => {
+						this.ip = res.data.ip
+					}
+				});
+			},
+			getHeight() {
+				setTimeout(()=>{
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#title-contentnav")
+						.boundingClientRect((data) => {
+							if(data) {
+								const footerH = this.showBtn==0? 80: 0
+								this.height =
+									`calc(100vh - ${data.height}px - 420rpx - ${this.statusBarHeight}px - ${footerH}px - 88rpx)`
+							}
+						})
+						.exec();
+				},200)
+			},
+			numberToLetter(num) {
+				// 将数字转换为字母的 ASCII 码
+				let letterCode = num + 65;
+				// 将 ASCII 码转换为大写字母
+				let letter = String.fromCharCode(letterCode);
+				return letter;
+			},
+			updateTime() {
+				var that = this;
+				if (this.interval != null) {
+					clearInterval(this.interval)
+				}
+				this.interval = setInterval(function() {
+					that.getFinishCourseVideo()
+					that.getInternetTraffic()
+				}, 60000);
+			},
+			judgeDuration() {
+				var that = this;
+				if (this.intervalIntegral != null) {
+					clearInterval(this.intervalIntegral)
+					this.intervalIntegral = null
+				}
+				// 观看10分钟获得芳华币
+				this.intervalIntegral = setInterval(function() {
+					that.getIntegralByH5Video()
+				}, 600000);
+			},
+			clearIntegral() {
+				if (this.intervalIntegral != null) {
+					clearInterval(this.intervalIntegral)
+					this.intervalIntegral = null
+				}
+			},
+			getH5CourseByVideo() {
+				this.loading = true
+				getH5CourseByVideoId({
+					videoId: this.videoId
+				}).then(res => {
+						this.loading = false
+						if (res.code == 200) {
+							this.courseInfo = res.data
+							uni.setNavigationBarTitle({
+								title: this.courseInfo && this.courseInfo.title ? this.courseInfo.title : ''
+							});
+						}
+						this.getHeight()
+						this.$nextTick(()=>{
+							this.$refs.descInfo&&this.$refs.descInfo.getDescHeight()
+							this.$refs.descInfoNav&&this.$refs.descInfoNav.getDescHeight()
+						})
+					},
+					rej => {
+						this.loading = false
+					}
+				).catch(() => {
+					this.loading = false
+				})
+			},
+			getH5CourseVideoDetails(type) {
+				getH5CourseVideoDetails(this.urlOption).then(res => {
+						if (res.code == 200) {
+							this.config = res.config || {}
+							this.courseNote = res.course&&res.course.note
+							this.isFinish = res.isFinish || 0
+							this.showNote = this.isFinish==1 ? 1:0
+							this.duration = res.course && res.course.duration ? res.course.duration : 0
+							this.playDuration = res.playDuration || 0
+							this.tipsTime = res.tipsTime || 0
+							const showTreatmentFlag = res.course&&res.course.showTreatment!=null ? res.course.showTreatment : 1
+							this.treatmentPackage = res.course&&res.course.treatmentPackage ? res.course.treatmentPackage : [],
+							this.showTreatment = showTreatmentFlag==0&&this.treatmentPackage.length>0 ? 0 : 1
+							let lineList = []
+							if (res.course && res.course.lineOne) {
+								lineList.push(res.course.lineOne)
+							}
+							if (res.course && res.course.lineTwo) {
+								lineList.push(res.course.lineTwo)
+							}
+							if (res.course && res.course.lineThree) {
+								lineList.push(res.course.lineThree)
+							}
+							this.lineList = lineList
+							this.courseLogo = res.config&&res.config.courseLogo
+							this.viewCommentNum = res.config&&res.config.viewCommentNum || 200
+					
+							this.openCommentStatus = res.config&&res.config.openCommentStatus || 3;
+							// this.openCommentStatus = source
+							// console.log('socket===',socket,this.openCommentStatus)
+							if(this.openCommentStatus == 3) {
+								this.closeSocket()
+							}else {
+								this.initSocket()
+							}
+							
+							this.currentTab = 1
+							if(this.openCommentStatus!=2 || this.showDanmu!=1) {
+								this.activeDanmus = []
+							}
+							this.fsUserCourseRewardRoundStatusVO = this.getBox(res)
+							if (!this.player || type == 'error') {
+								this.lineIndex = this.config.defaultLine
+								this.videoUrl = lineList[this.lineIndex]
+								this.poster= res.course && res.course.imgUrl ? res.course.imgUrl : ''
+								// this.options.sources = [{
+								// 	src: this.videoUrl
+								// }]
+								// this.options.poster = res.course && res.course.imgUrl ? res.course.imgUrl : ''
+								// this.initVideo()
+								this.playTime = this.playDuration >= this.duration ? 0 : this.playDuration
+								this.playDurationSeek = this.playTime
+								setTimeout(()=>{
+									this.player = uni.createVideoContext('video-content-box');
+									this.player.seek(this.playTime)
+									this.player.play();
+								},500);
+							} else {
+								// let div = document.querySelector(".vjs-progress-control");
+								// if(div) {
+								// 	if (this.isFinish == 1 || this.isEnded || this.linkType == 1) {
+								// 		div.style.pointerEvents = "auto";
+								// 	} else {
+								// 		div.style.pointerEvents = "none"; //禁止所有事件
+								// 	}
+								// }
+								this.playTime = this.playTime > this.playDuration ? this.playTime : this.playDuration >= this.duration ? 0 : this.playDuration
+								this.playDurationSeek = this.playTime
+								this.player.seek(this.playTime)
+								this.player.play();
+							}
+							this.updateTime();
+							this.quesList = res.questions && res.questions.length > 0 ? res.questions : [],
+								this.quesList = this.quesList.map(item => ({
+									...item,
+									questionOption: JSON.parse(item.question),
+									answer: ''
+								}))
+						}
+						this.getHeight()
+						this.$nextTick(()=>{
+							this.$refs.descInfo&&this.$refs.descInfo.getDescHeight()
+							this.$refs.descInfoNav&&this.$refs.descInfoNav.getDescHeight()
+						})
+					},
+					rej => {}
+				)
+			},
+			handleAnswer(val) {
+				let {item, option,index} = val
+				let time = this.playTime
+				if(this.isEnded||this.isFinish==1) {
+					time = this.duration
+				} else {
+					if(time < this.playDuration&&this.isFinish!=1) {
+						// 没完课且小于续播的时间
+						time = this.playDuration
+					}
+				}
+				if(Number(this.duration || 0) == 0 || time < this.duration - 60) {
+					uni.showToast({
+						title: "请先观看完整课程再答题哦~",
+						icon: "none"
+					})
+					return
+				}
+
+				if (this.quesList[index].type == 1) {
+					// 单选option
+					this.quesList[index].answer = option.name
+				} else if (this.quesList[index].type == 2) {
+					// 多选
+					let answer = this.quesList[index].answer ? this.quesList[index].answer.split(',') : []
+					if (answer.indexOf(option.name) === -1) {
+						answer.push(option.name)
+						this.quesList[index].answer = answer.join(',')
+					} else {
+						answer.splice(answer.indexOf(option.name), 1)
+						this.quesList[index].answer = answer.join(',')
+					}
+				}
+			},
+			submit() {
+				if(this.isExpire){
+					uni.showToast({
+						title: '课程已过期或链接无效',
+						icon: 'none'
+					});
+					return
+				}
+				// 登录
+				this.utils.isLoginCourse().then(
+					res => {
+						if(res){
+							if (this.isAddKf == 1&&this.isCheckRealUrl) {
+								// 答题
+								// 您已提交过答案,请领取红包
+								this.courseAnswer()
+							} else {
+								// 添加客服
+								if (this.videoId && this.qwUserId) {
+									this.getIsAddKf()
+								} else {
+									uni.showToast({
+										title: '请添加客服',
+										icon: 'none'
+									})
+								}
+							} 
+						} else{
+							this.goLogin()
+						}
+					},
+					rej => {}
+				);
+			},
+			// 答题
+			courseAnswer() {
+				let time = this.playTime
+				if (this.isEnded || this.isFinish==1) {
+					time = this.duration
+				} else {
+					if (time < this.playDuration && this.isFinish != 1) {
+						// 没完课且小于续播的时间
+						time = this.playDuration
+					}
+				}
+				if (Number(this.duration || 0) == 0 || time < this.duration - 60) {
+					uni.showToast({
+						title: "请先观看完整课程再答题哦~",
+						icon: "none"
+					})
+					return
+				}
+				if (this.quesList.some(item => !item.answer)) {
+					uni.showToast({
+						title: "请确认是否答完所有题目",
+						icon: "none"
+					})
+					return
+				}
+				const questions = this.quesList.map(obj => {
+					const {
+						questionOption,
+						...rest
+					} = obj;
+					return rest;
+				});
+				if(!this.isCheckRealUrl) return;
+				const param = {
+					...this.urlOption,
+					questions: questions,
+					videoId: this.videoId,
+					duration: this.playTime,
+				}
+				this.errTitle = ""
+				this.errDesc = ""
+				this.errQues = []
+				courseAnswer(param).then(res => {
+						if (res.code == 200) {
+							if (res.incorrectQuestions) {
+								// 答题失败
+								if (res.incorrectQuestions.length > 0) {
+									this.errQues = res.incorrectQuestions
+								}
+								this.remain = res.remain || 0
+								if (res.remain > 0) {
+									this.errTitle = "很遗憾答错了"
+									this.errDesc = `<span style="color:#FF5C03">还有${res.remain}次机会,继续加油</span>`
+									this.$refs.answerPopup.open("center")
+								}
+							} else {
+								// 答题成功
+								this.errTitle = "恭喜你,回答正确"
+								this.errDesc = `请选择奖励`
+								this.currentReward = this.rewardType&&this.rewardType.length>0 ? this.rewardType[0].value : -1
+								this.$refs.answerPopup.open("center")
+							}
+						} else {
+							if (res.msg == "该课题到达答错次数限制") {
+								this.errTitle = "答题次数超过限制"
+								this.errDesc = "以后的课程要认真学习哦"
+								this.$refs.answerPopup.open("center")
+							} else {
+								uni.showToast({
+									title: res.msg,
+									icon: "none"
+								})
+							}
+						}
+					},
+					rej => {}
+				)
+			},
+			// 选择
+			rewardChange(e) {
+				this.currentReward = e.value
+			},
+			closeAnswerPopup() {
+				this.$refs.answerPopup.close()
+				if(!this.isCheckRealUrl) return;
+				if (this.errTitle == '恭喜你,回答正确') {
+					if(this.currentReward==4) {
+						this.$refs.turntableTwo.open(this.urlOption)
+					} else if(this.currentReward==3) {
+						this.$refs.turntableOne.open(this.urlOption)
+					} else {
+						this.sendRewardFun(this.currentReward)
+					}
+				}
+			},
+			sendRewardFun(currentReward) {
+				this.currentReward = currentReward
+				const param = {
+					...this.urlOption,
+					rewardType: Number(this.currentReward),
+					source: 2,
+					appId: getApp().globalData.appId
+				}
+				sendReward(param).then(res => {
+					if(res.code == 200) {
+						if(currentReward == 4) {
+							this.$refs.turntableTwo.endSuccess(res.data)
+						}else if(currentReward == 3) {
+							this.$refs.turntableOne.endSuccess(res.data)
+						}else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							})
+							// this.openAppPop()
+						}
+					} else {
+						this.currentReward == 4 ? this.$refs.turntableTwo.close('close') : this.currentReward == 3? this.$refs.turntableOne.close('close'):''
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						})
+					}
+				})
+			},
+			openAppPop() {
+				this.$refs.appPopup.openPop()
+			},
+			// 线路
+			openPop() {
+				this.$refs.popup.open('bottom')
+			},
+			close() {
+				this.$refs.popup.close()
+			},
+			handleLine(index) {
+				var that=this;
+				if (this.lineIndex == index && this.videoUrl == this.lineList[index]) {
+					this.close()
+					return
+				} else {
+					// let div = document.querySelector(".vjs-progress-control");
+					// if(div) {
+					// 	if (this.isFinish == 1 || this.isEnded || this.linkType == 1) {
+					// 		div.style.pointerEvents = "auto";
+					// 	} else {
+					// 		div.style.pointerEvents = "none"; //禁止所有事件
+					// 	}
+					// }
+					this.lineIndex = index
+					this.videoUrl = this.lineList[index]
+					this.tipsOpen = false
+					this.playDurationSeek = this.playTime || 0
+					this.player = uni.createVideoContext('video-content-box');
+					setTimeout(function(){
+						that.player.seek(that.playDurationSeek)
+						that.player.play();
+					},500);
+					// this.player.src(this.lineList[index])
+					// this.player.one('loadedmetadata', () => {
+					// 	this.player.currentTime(this.playDurationSeek);
+					// 	this.player.play();
+					// });
+					this.close()
+				}
+
+			},
+			// 客服
+			getIsAddKf() {
+				this.qrcode = ''
+				this.qrcodeMsg = ''
+				this.isAddKf = 0
+				// {videoId: this.videoId,qwUserId: this.qwUserId,corpId: this.corpId}
+				getIsAddKf(this.urlOption).then(res => {
+						if (res.code == 200) {
+							this.isAddKf = 1
+							this.isCheckRealUrl = true
+							this.getH5CourseVideoDetails()
+						} else if (res.code == 400) {
+							this.isAddKf = 0
+							this.isCheckRealUrl = false
+							this.qrcode = res.qrcode
+							this.qrcodeMsg = res.msg
+							this.$refs.kfPopup.open()
+						} else if (res.code == 504) {
+							// 登录
+							this.isCheckRealUrl = false
+							this.goLogin()
+						} else if (res.code == 566) {
+							// 官方群发通用链接
+							const url = res.courseLink.realLink.split('?course=')[1]
+							this.urlOption = JSON.parse(url)
+							this.isAddKf = 1
+							this.isCheckRealUrl = true
+							this.getH5CourseVideoDetails()
+						} else if (res.code == 567) {
+							// 群聊通用链接
+							this.urlOption = {
+								...this.urlOption,
+								qwExternalId: res.qwExternalId
+							}
+							this.isAddKf = 1
+							this.isCheckRealUrl = true
+							this.getH5CourseVideoDetails()
+						}else {
+							this.isCheckRealUrl = false
+							this.isAddKf = 0
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					err => {}
+				);
+			},
+			closeKFPop() {
+				this.$refs.kfPopup.close()
+			},
+			getFinishCourseVideo() {
+				if (!this.isLogin||!this.playTime || !this.isCheckRealUrl) return
+				// {videoId: this.videoId,duration:this.playTime}
+				const param = {
+					duration: this.playTime,
+					...this.urlOption
+				}
+				getFinishCourseVideo(param)
+			},
+			// 每十分钟获得芳华币
+			getIntegralByH5Video() {
+				if(!this.isLogin||!this.isCheckRealUrl) return
+				const param = {
+					duration: this.playTime,
+					...this.urlOption
+				}
+				getIntegralByH5Video(param).then(res => {
+					if (res.code == 200) {
+						uni.showToast({
+							title: "芳华币+10",
+							icon: "none"
+						})
+					}
+				})
+			},
+			progressChange(e) {
+				this.bufferRate = Math.ceil(e.detail.buffered)
+			},
+			// 缓冲
+			getInternetTraffic() {
+				if(!this.isLogin||!this.isCheckRealUrl) return
+				const playVideoTime = Math.ceil(this.playTime / this.duration * 100) // 播放百分比
+				if(this.bufferRate == 0 || this.bufferRate < playVideoTime) {
+					this.bufferRate = playVideoTime
+				}
+				if(this.bufferRate == 0 || Number(this.bufferRate.toFixed(2)) == 0) return
+				const param = {
+					...this.urlOption,
+					uuId: dayjs().format('YYYYMMDD') + this.uuId,
+					duration: this.playTime,
+					bufferRate: Number(this.bufferRate.toFixed(2)),
+				}
+				if(!param.bufferRate) return
+				internetTraffic(param)
+			},
+			getErrMsg(err,type) {
+				let msgerr = {
+					errType: type || 'error',
+					videoUrl: this.videoUrl,
+					lineIndex: this.lineIndex,
+					errTime: new Date(),
+					ip: this.ip,
+					errMsg: err || ''
+				}
+				getErrMsg({
+					msg: JSON.stringify(msgerr)
+				})
+			},
+			goLogin() {
+				this.utils.getProvider().then(provider=>{
+					console.log('当前的环境商',provider)
+					if (!provider) {
+					  reject()
+					}
+					uni.login({
+						provider: provider,
+						success: async loginRes => {
+							console.log(loginRes)
+							uni.getUserInfo({
+							   provider: provider,
+							   success: (infoRes)=> {
+								    uni.showToast({
+										title: '处理中...',
+										icon: 'loading'
+								    });
+									loginByMp({code: loginRes.code,encryptedData:infoRes.encryptedData,iv:infoRes.iv,appId:getApp().globalData.appId}).then(res=>{
+										 uni.hideLoading();
+										 if (res.code == 200) {
+											this.$store.commit('setCoureLogin', 1);
+											uni.setStorageSync('AppTokenmini_RTCourse', res.token);
+											uni.setStorageSync('auto_userInfo', JSON.stringify(res.user));
+											this.user = res.user
+											this.isLogin = true
+											this.getIsAddKf()
+											this.getVideoRewardTypes()
+											this.getUserPhoneDeviceType()
+										 } else {
+											uni.showToast({
+												title: res.msg,
+												icon: 'none'
+											});
+										 }
+									 }).catch(err=>{
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: "登录失败,请重新登录",
+										});
+									});
+							   }
+							});
+						}
+					})
+				}).catch(err => {})
+			},
+			getLink() {
+				let that = this;
+				getRealLink({sortLink:this.sortLink}).then(res=>{
+					if(res.code == 200) {
+						this.isExpire = false
+						if(this.isLogin) {
+							this.getUserPhoneDeviceType()
+						}
+						// 如果响应中包含真实链接,则跳转到真实链接
+						// window.location.href = res.realLink +"&sortLink="+this.sortLink+"&code="+this.code+"&time="+new Date().getTime()
+						if (this.isLogin && this.isAddKf == 1&&this.isCheckRealUrl) {
+							this.getH5CourseVideoDetails()
+						}
+						if (this.videoId &&(this.isAddKf != 1 || !this.isCheckRealUrl)) {
+							this.utils.isLoginCourse().then(
+								isLogin => {
+									this.isLogin = isLogin
+									if(isLogin){
+										this.getIsAddKf()
+										this.getVideoRewardTypes()
+									} else {
+										this.goLogin()
+									}
+								},
+								rej => {}
+							);
+						}
+					} else {
+						this.isExpire = true
+						uni.showToast({
+							title: '课程已过期或链接无效',
+							icon: 'none'
+						});
+					}
+				}).catch(err=>{
+					this.isExpire = true
+					uni.showToast({
+						title: '发生错误,请稍后再试',
+						icon: 'none'
+					});
+				})
+			},
+			/**
+			 * 节流原理:在一定时间内,只能触发一次
+			 *
+			 * @param {Function} func 要执行的回调函数
+			 * @param {Number} wait 延时的时间
+			 * @param {Boolean} immediate 是否立即执行
+			 * @return null
+			 */
+			throttle(func, wait = 500, immediate = true) {
+			    if (immediate) {
+			        if (!this.flag) {
+			            this.flag = true
+			            // 如果是立即执行,则在wait毫秒内开始时执行
+			            typeof func === 'function' && func()
+			            this.timer = setTimeout(() => {
+			                this.flag = false
+			            }, wait)
+			        }
+			    } else if (!this.flag) {
+			        this.flag = true
+			        // 如果是非立即执行,则在wait毫秒内的结束处执行
+			        this.timer = setTimeout(() => {
+			            this.flag = false
+			            typeof func === 'function' && func()
+			        }, wait)
+			    }
+			},
+			// 弹幕
+			openDanmu(type) {
+				this.openDanmuType = type
+				this.inputText = ''
+				if(type == 1) {
+					this.player.exitFullScreen()
+				}
+				this.$refs.danmuPopup.open()
+			},
+			changeShowPopup(val) {
+				this.focus = val.show
+			},
+			switchDanmu() {
+				this.showDanmu = this.showDanmu == 1 ? 0:1
+				if(this.showDanmu == 0&&this.$refs.danmuBox) {
+					this.$refs.danmuPopup.close()
+					this.activeDanmus = []
+					this.$refs.danmuBox.activeDanmus = []
+					this.$refs.danmuBox.initTracks()
+				}
+			},
+			getScrollTop(res) {
+				if(this.currentTab == 2) {
+					this.scrollTop = res
+				} else {
+					this.scrollTop = 0
+				}
+			},
+			handleTab(index) {
+				this.currentTab = index
+				if(this.currentTab==2) {
+					if(this.$refs.commentBox) {
+						this.$refs.commentBox.msgs = []
+						this.$refs.commentBox.pageNum = 1
+						this.$refs.commentBox.getComments()
+					}
+				} else {
+					setTimeout(()=>{
+						this.scrollTop = 0
+					},100)
+				}
+			},
+			handleRefresher() {
+				this.triggered = true;
+				if (!this.isMore&&this.currentTab==2&&this.openCommentStatus==1) {
+					this.$nextTick(()=>{
+						this.$refs.commentBox&&this.$refs.commentBox.getComments()
+					})
+				}
+				setTimeout(() => {
+					this.triggered = false;
+				}, 500);
+			},
+			getMore(val) {
+				this.triggered = false;
+				this.isMore = val == 1
+			},
+			handleChatInput() {
+				this.inputText = this.inputText.trim()
+				if (this.inputText == "" || this.inputText.trim() == "") {
+					uni.showToast({
+						title: '请输入评论',
+						icon: "none"
+					})
+					return;
+				}
+				if(this.openCommentStatus==1) {
+					this.$refs.commentBox&&this.$refs.commentBox.handleInput(this.inputText)
+				} else if(this.openCommentStatus==2) {
+					this.$refs.danmuBox&&this.$refs.danmuBox.handleInput(this.inputText)
+				}
+			},
+			setInputText() {
+				this.inputText = ""
+				if(this.openCommentStatus==2) {
+					this.$refs.danmuPopup.close()
+				}
+			},
+			getActiveDanmus(val) {
+				this.activeDanmus = val.map(item=>({
+					...item,
+					danmustyle: {
+						top: item.top + 'px',
+						...item.style, 
+						'animation-duration': '8s'
+					}
+				}))
+			},
+			animationend(moveItem, i) {
+				// 移除动画结束的弹幕(性能优化)
+				if(this.openCommentStatus==2) {
+					this.$refs.danmuBox&&this.$refs.danmuBox.animationend(moveItem, i)
+				}
+			},
+			feedback() {
+				const userId = this.user.userId || ''
+				const courseId = this.urlOption.courseId || ''
+				const videoId = this.urlOption.videoId || ''
+				uni.navigateTo({
+					url: './feedback?userId='+userId+'&courseId='+courseId+'&videoId='+videoId
+				})
+			},
+			getBox(data) {
+				if(data.fsUserCourseRewardRoundStatusVO&&data.fsUserCourseRewardRoundStatusVO.length>0) {
+					const list = data.fsUserCourseRewardRoundStatusVO.map(item=>({
+						...item,
+						time: Math.round(this.duration * Number(item.question || 0) * 0.01)
+					}))
+					return list
+				} else {
+					return []
+				}
+			},
+			claimFun(val) {
+				claim({
+					...this.urlOption,
+					second: val.time,
+					rewardId: val.rewardId,
+					status: val.status
+				}).then(res=>{
+					if(res.code == 200) {
+						this.$refs.treasureChest.claimSuccess(val.status)
+					} else {
+						this.$refs.treasureChest.close()
+					}
+					if(res.msg!="success") {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none',
+							duration: 3000
+						})
+					}
+				})
+			},
+			showBtnType(value) {
+				this.showBtn = value
+				this.getHeight()
+			},
+			getUserPhoneDeviceType(){
+				uni.getSystemInfo({
+				  	success: (result) => {
+						const param = {
+							os: result.osName || '',
+							deviceId: result.deviceId || '',
+							appId: getApp().globalData.appId
+						}
+						getUserPhoneDeviceType({param:JSON.stringify(param)})
+					},
+					fail: (error) => {
+						console.log('获取型号失败',JSON.stringify(error))
+					}
+				})
+			},
+			initSocket(type) {
+				const userId = this.user.userId; // 假设你已经获取了用户ID
+				const that = this;
+
+				// 如果已经存在连接,先关闭
+				if (this.socket) {
+					this.socket.onClose(() => {
+					  console.log('旧的 WebSocket 连接已完全关闭');
+					  that.socket = null;
+					  if(that.pingpangTimes) {
+					  	clearInterval(that.pingpangTimes)
+					  	that.pingpangTimes= null
+					  }
+					  that.createNewSocket(type,userId);
+					});
+					this.socket.close();
+					return;
+				}
+				// 创建一个新的 WebSocket 连接
+				this.createNewSocket(type,userId);
+			},
+			createNewSocket(type,userId) {
+				if(this.openCommentStatus == 3) return
+				//创建一个socket连接
+				const that = this;
+				// if (this.socket) {
+				// 	this.socket.close()
+				// }
+				this.socket = uni.connectSocket({
+					url: getApp().globalData.wsUrl + "/app/webSocket/" + userId,
+					multiple: true,
+					success: res => {
+						that.isSocketOpen = true
+						console.log('WebSocket连接已打开1!');
+						// 保持心跳
+						if(that.pingpangTimes) {
+							clearInterval(that.pingpangTimes)
+							that.pingpangTimes= null
+						}
+						that.pingpangTimes=setInterval(()=>{
+							let data={
+								userId: userId || '',
+								userType: 2, // 1-管理员,2-用户
+								courseId: that.urlOption.courseId,
+								videoId: that.urlOption.videoId,
+								type:1, // 评论类型 1:评论,2:回复,目前没有回复,默认传1就行了
+								// msg: that.inputText,
+								cmd:'heartbeat'
+							};
+							that.socket.send({
+								data: JSON.stringify(data),
+								success: () => {
+									// console.log('WebSocket发送心条数据!');
+								},
+								fail: () => {
+									that.isSocketOpen=false
+								}
+							});
+						},15000)
+					},
+					error: res => {
+						console.log(res)
+					},
+				})
+				this.socket.onMessage((res) => {
+					// console.log("收到消息parse",JSON.parse(res.data))
+					const redata = JSON.parse(res.data);
+					if(redata.cmd=="heartbeat"){
+						  //心跳
+						  // console.log("heartbeat")
+					}else if(redata.cmd=="sendMsg"){
+						if(that.openCommentStatus==1) {
+							that.$refs.commentBox.isSend=true;
+							that.$refs.commentBox.addMsg(redata);
+						} else if(that.openCommentStatus==2) {
+							that.$refs.danmuBox.isSend=true;
+							that.$refs.danmuBox.addMsg(redata);
+						}
+						// that.isSend=true;
+						// that.addMsg(redata);
+					}
+				})
+				//监听socket打开
+				this.socket.onOpen(() => {
+					that.isSocketOpen = true
+					console.log('WebSocket连接已打开2!');
+					// that.isSend = true;
+					if(that.openCommentStatus==1) {
+						that.$refs.commentBox.isSend=true;
+					} else if(that.openCommentStatus==2) {
+						that.$refs.danmuBox.isSend=true;
+					}
+					if(type=='reStart') {
+						// 重连的时候重新发消息
+						if(that.openCommentStatus==1) {
+							that.$refs.commentBox.saveMsg()
+						} else if(that.openCommentStatus==2) {
+							that.$refs.danmuBox.saveMsg()
+						}
+						// this.saveMsg()
+					}
+				})
+				//监听socket关闭
+				this.socket.onClose(() => {
+					that.isSocketOpen = false
+					that.socket = null
+					console.log('WebSocket连接已关闭!');
+					if(that.pingpangTimes) {
+						clearInterval(that.pingpangTimes)
+						that.pingpangTimes= null
+					}
+				})
+				//监听socket错误
+				this.socket.onError((err) => {
+					console.log("socket err:",err)
+					that.isSocketOpen = false
+					that.socket = null
+					if(that.pingpangTimes) {
+						clearInterval(that.pingpangTimes)
+						that.pingpangTimes= null
+					}
+				})
+			},
+			socketSend(data) {
+				let that = this
+				this.socket.send({
+					data: JSON.stringify(data),
+					success: () => {
+						console.log("发送成功")
+						// this.isSend = false;
+						if(that.openCommentStatus==1) {
+							that.$refs.commentBox.isSend = false;
+						} else if(that.openCommentStatus==2) {
+							that.$refs.danmuBox.isSend = false;
+						}
+					},
+					fail: () => {
+						console.log("发送失败")
+					}
+				});
+			},
+			closeSocket() {
+				if (this.socket) {
+				  this.socket.close();
+				}
+				if (this.pingpangTimes) {
+				  clearInterval(this.pingpangTimes);
+				  this.pingpangTimes = null;
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+.full-width-popup {
+  width: 100%;
+}
+</style>
+<style lang="scss" scoped>
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.reward-list {
+		display: flex;
+		align-items: center;
+		flex-wrap: wrap;
+		margin-top: 40rpx;
+		margin-bottom: -24rpx;
+	}
+	.reward-item{
+		padding: 16rpx 10rpx;
+		box-sizing: border-box;
+		border-radius: 10rpx;
+		width: calc(50% - 14rpx);
+		overflow: hidden;
+		text-align: center;
+		border-radius: 8rpx;
+		border: 1rpx solid #ededef;
+		// margin: 10rpx 5px;
+		margin-bottom: 24rpx;
+		color: #222;
+		background-color: #fff;
+		&:nth-child(odd) {
+			margin-right: 20rpx;
+		}
+	}
+	.reward-active {
+		border: 1rpx solid #ff5c03 !important;
+		color: #ff5c03 !important;
+		background: #FCF0E7 !important;
+	}
+	.footer-tips {
+		margin-top: 14rpx;
+		text-align: center;
+		font-family: PingFang SC,PingFang SC;
+		font-weight: 500;
+		font-size: 12px;
+		color: #bbb;
+	}
+	.textOne {
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+
+	.textTwo {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		-webkit-box-orient: vertical;
+	}
+	.header-nav {
+		height: 88rpx;
+		@include u-flex(row, center, flex-start);
+		overflow: hidden;
+		background-color: #fff;
+		box-sizing: border-box;
+		.header-title {
+			text-align: center;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+			padding: 0 10rpx 0 100rpx;
+			font-family: PingFang SC,PingFang SC;
+			font-weight: 500;
+			font-size: 15px;
+			color: #000;
+			box-sizing: border-box;
+		}
+	}
+	.reward-list {
+		width: 100%;
+		// margin-top: 20rpx;
+		// margin-bottom: -40rpx;
+
+		&-group {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #222222;
+			@include u-flex(row, center, center);
+		}
+
+		&-option {
+			@include u-flex(row, center, flex-start);
+
+			&:first-child {
+				margin-right: 40rpx;
+			}
+		}
+	}
+
+	.err {
+		color: #f56c6c !important;
+	}
+
+	.kfqrcode-box {
+		background-color: #fff;
+		border-radius: 16rpx;
+		max-width: 560rpx;
+		padding: 60rpx 40rpx;
+		margin-top: -100rpx;
+		box-sizing: border-box;
+		@include u-flex(column, center, flex-start);
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 34rpx;
+		color: #222;
+		position: relative;
+		text-align: center;
+
+		.kfqrcode {
+			height: 460rpx;
+			width: 460rpx;
+		}
+	}
+
+	.kfqrcode-close {
+		width: 64rpx;
+		height: 64rpx;
+		position: absolute;
+		bottom: -100rpx;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+
+	.tipsPopup-mask {
+		position: relative;
+		width: 560rpx;
+		background-color: transparent;
+
+		.red_envelope_top {
+			width: 480rpx;
+			height: 360rpx;
+			margin: 0 auto;
+			display: inherit;
+		}
+	}
+
+	.tipsPopup-btn-box {
+		width: 456rpx;
+		height: 104rpx;
+		padding: 4rpx;
+		box-sizing: border-box;
+		background: linear-gradient(180deg, rgba(252, 209, 94, 1), rgba(254, 253, 251, 1));
+		border-radius: 52rpx;
+	}
+
+	.tipsPopup-btn {
+		width: 100%;
+		height: 100%;
+		background: linear-gradient(180deg, #FF9F22 0%, #FA1E05 100%);
+		border-radius: 52rpx 52rpx 52rpx 52rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 36rpx;
+		color: #FFFFFF;
+		line-height: 96rpx;
+		text-align: center;
+	}
+
+	.tipsPopup {
+		width: 560rpx;
+		padding: 12rpx;
+		margin-top: -72rpx;
+		box-sizing: border-box;
+		background: linear-gradient(180deg, #FFFBEF 0%, #FFFFF5 43%, #F5EAC2 100%);
+		border-radius: 32rpx 32rpx 32rpx 32rpx;
+		position: relative;
+
+		&-close {
+			width: 64rpx;
+			height: 64rpx;
+			position: absolute;
+			right: 0;
+			top: -188rpx;
+		}
+
+		&-line {
+			padding: 3rpx;
+			box-sizing: border-box;
+			background: linear-gradient(180deg, rgba(247, 245, 220, 1), rgba(250, 220, 157, 1));
+			border-radius: 24rpx;
+		}
+
+		&-box {
+			padding: 0 40rpx 40rpx 40rpx;
+			box-sizing: border-box;
+			background: linear-gradient(180deg, #FFFBEF 0%, #FFFFF5 43%, #F5EAC2 100%);
+			border-radius: 24rpx;
+			@include u-flex(column, center, flex-start);
+		}
+
+		&-head {
+			@include u-flex(row, center, center);
+
+			&-title {
+				width: 364rpx;
+				height: auto;
+				margin-top: -22rpx;
+			}
+		}
+
+		&-content {
+			margin: 48rpx 0;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #222222;
+			text-align: center;
+
+			&-title {
+				margin-bottom: 26rpx;
+				font-weight: 600;
+				font-size: 40rpx;
+				color: #FF5C03;
+			}
+		}
+	}
+
+	.video-controls-box {
+		width: 100%;
+		height: 420rpx;
+		overflow: hidden;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		z-index: 2;
+		background: rgba(0, 0, 0, 0.2);
+
+		.video-play {
+			height: 72rpx;
+			width: 72rpx;
+			position: absolute;
+			top: 50%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+		}
+	}
+
+	.video-controls {
+		width: 100%;
+		height: 80rpx;
+		padding: 0 28rpx;
+		box-sizing: border-box;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		background: linear-gradient(to top, #222 0%, transparent 80%);
+
+		.video-icon {
+			height: 44rpx;
+			width: 44rpx;
+		}
+	}
+
+	.errQuesbox {
+		width: 100%;
+		max-height: 260rpx;
+		overflow-y: auto;
+		margin-top: 24rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 30rpx;
+		color: #222222;
+
+		&-item {
+			width: 100%;
+			height: 128rpx;
+			line-height: 128rpx;
+			margin-bottom: 24rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			overflow: hidden;
+			background: #fff;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			position: relative;
+
+			&::after {
+				content: "题目";
+				min-width: 64rpx;
+				height: 36rpx;
+				padding: 0 12rpx;
+				line-height: 36rpx;
+				background: #FF5C03;
+				box-sizing: border-box;
+				border-radius: 0rpx 0rpx 16rpx 0rpx;
+				text-align: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 20rpx;
+				color: #fff;
+				position: absolute;
+				left: 0;
+				top: 0;
+			}
+		}
+	}
+
+	.bg {
+		background: #fff !important;
+	}
+
+	.answerPopup {
+		&-box {
+			width: 560rpx;
+			background: linear-gradient(180deg, #FFFAF6 0%, #FEECD8 100%);
+			border-radius: 32rpx 32rpx 32rpx 32rpx;
+			background-color: #fff;
+			font-weight: 400;
+			padding: 32rpx;
+			box-sizing: border-box;
+			position: relative;
+			@include u-flex(column, center, flex-start);
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+
+			.tipimg {
+				width: 206rpx;
+				height: 206rpx;
+				margin-bottom: 16rpx;
+			}
+		}
+
+		&-title {
+			font-weight: 600;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		&-desc {
+			margin-top: 10rpx;
+			font-size: 28rpx;
+			color: #757575;
+		}
+
+		&-btn {
+			width: 464rpx;
+			height: 84rpx;
+			margin-top: 54rpx;
+			margin-bottom: 16rpx;
+			background: #FF5C03;
+			border-radius: 42rpx;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			text-align: center;
+			line-height: 84rpx;
+		}
+	}
+
+	.popupbox {
+		width: 100%;
+		background-color: #fff;
+		border-radius: 16rpx 16rpx 0 0;
+		padding: 24rpx 32rpx;
+		position: relative;
+
+		&-head {
+			height: 60rpx;
+			margin-bottom: 30rpx;
+			text-align: center;
+			overflow-y: auto;
+			color: #414858;
+			font-size: 32rpx;
+			font-weight: bold;
+			position: relative;
+
+			.close-icon {
+				position: absolute;
+				right: 0;
+				top: 0;
+				height: 40rpx;
+				width: 40rpx;
+			}
+		}
+
+		&-content {
+			height: 20vh;
+			overflow-y: auto;
+			display: flex;
+			align-items: flex-start;
+			flex-wrap: wrap;
+			gap: 32rpx;
+
+			.line-item {
+				display: inline-block;
+				min-width: 200rpx;
+				min-height: 60rpx;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				border-radius: 50rpx;
+				overflow: hidden;
+				background-color: #f7f7f7;
+				text-align: center;
+				color: #414858;
+				font-size: 28rpx;
+				line-height: 60rpx;
+			}
+
+			.line-active {
+				color: #f56c6c !important;
+				background-color: #fef0f0 !important;
+			}
+		}
+	}
+
+	.content {
+		padding-bottom: calc(var(--window-bottom));
+		.video-box {
+			width: 100%;
+			height: 420rpx;
+			overflow: hidden;
+			position: relative;
+
+			#myVideo {
+				width: 100%;
+				height: 100%;
+			}
+		}
+
+		.video-poster {
+			width: 100%;
+			height: 420rpx;
+		}
+
+		.miantitlebox {
+			padding: 30rpx 0;
+			border-bottom: 2rpx solid #F5F7FA;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		.subtitlebox {
+			padding: 30rpx 0;
+			border-bottom: 2rpx solid #F5F7FA;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		.title-content {
+			padding: 0 32rpx;
+			background-color: #fff;
+			font-size: 28rpx;
+			line-height: 1.6;
+			box-sizing: border-box;
+			@include u-flex(row, center, space-between);
+			.title {
+				font-size: 36rpx;
+				font-weight: 500;
+				color: #414858;
+			}
+
+			.time-or-subtitle {
+				margin-top: 12rpx;
+				color: #666666;
+			}
+		}
+		.warning {
+			flex-shrink: 0;
+			color: #888;
+			font-size: 24rpx;
+			@include u-flex(column, center, center);
+			image {
+				flex-shrink: 0;
+				height: 36rpx;
+				width: 36rpx;
+			}
+		}
+		.video-line {
+			min-width: 140rpx;
+			max-width: 200rpx;
+			height: 60rpx;
+			padding: 0 20rpx;
+			box-sizing: border-box;
+			border-radius: 50rpx 0 0 50rpx;
+			overflow: hidden;
+			background-color: #fff;
+			text-align: center;
+			color: #888;
+			font-size: 28rpx;
+			line-height: 60rpx;
+			display: inline-flex;
+			align-items: center;
+			justify-content: center;
+			position: fixed;
+			right: 0;
+			z-index: 9;
+			bottom: calc(var(--window-bottom) + 280rpx);
+			box-shadow: 0 4rpx 10rpx rgba(0, 0, 0, .12);
+
+			image {
+				flex-shrink: 0;
+				height: 34rpx;
+				width: 34rpx;
+				margin-right: 6rpx;
+			}
+		}
+		.danmu-line {
+			bottom: calc(var(--window-bottom) + 370rpx);
+			word-break: keep-all;
+			.set_image {
+				height: 40rpx;
+				width: 40rpx;
+			}
+		}
+		.footer {
+			border-top: 1rpx solid #ededef;
+			background: #fff;
+			width: 100%;
+			position: fixed;
+			bottom: 0;
+			// padding: 32rpx;
+			padding-bottom: calc(var(--window-bottom));
+			box-sizing: border-box;
+			z-index: 9;
+
+			&-btn {
+				width: calc(100% - 64rpx);
+				height: 98rpx;
+				background: #FF5C03;
+				border-radius: 49rpx 49rpx 49rpx 49rpx;
+				line-height: 98rpx;
+				text-align: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 600;
+				font-size: 32rpx;
+				color: #FFFFFF;
+				@include u-flex(row, center, center);
+				margin: 24rpx 32rpx;
+				box-sizing: border-box;
+				&-img {
+					flex-shrink: 0;
+					width: 144rpx;
+					height: 144rpx;
+					margin-right: 8rpx;
+					margin-top: -24rpx;
+				}
+			}
+
+			&-btn-border {
+				position: relative;
+
+				&::after {
+					content: "";
+					background: linear-gradient(180deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
+					position: absolute;
+					top: -2rpx;
+					left: 0;
+					height: 103rpx;
+					width: 100%;
+					z-index: -1;
+					border-radius: 49rpx 49rpx 49rpx 49rpx;
+					box-shadow: 0rpx 8rpx 11rpx 0rpx rgba(255, 92, 3, 0.3);
+					overflow: hidden;
+				}
+			}
+		}
+	}
+
+	.agreement {
+		display: inline-flex;
+		margin-top: 16rpx;
+		font-size: 24rpx;
+		color: #525252;
+		align-items: center;
+		justify-content: center;
+	}
+	.video-danmu-btnbox {
+		width: 50px;
+		height: 50px;
+		border-radius: 50%;
+		overflow: hidden;
+		position: absolute;
+		right: 10px;
+		bottom: calc(50% - 50px);
+		transform: translateY(-50%);
+		padding: 8px;
+		box-sizing: border-box;
+	}
+	.video-danmu-image {
+		width: 100%;
+		height: 100%;
+	}
+	.danmuPopup {
+		background-color: #fff;
+		padding-bottom: calc(var(--window-bottom) + 10px);
+		.u-border {
+			flex: 1;
+			@include u-flex(row,center,flex-start);
+			padding: 0 6rpx;
+			border-radius: 6px;
+		}
+		&-head {
+			width: 100%;
+			padding: 10px;
+			box-sizing: border-box;
+			overflow: hidden;
+			@include u-flex(row,center,flex-start);
+			.danmu-icon {
+				height: 24px;
+				width: 24px;
+				margin-right: 10px;
+			}
+		}
+		&-input {
+			flex: 1;
+			height: 35px;
+		}
+		&-send {
+			flex-shrink: 0;
+			height: 35px;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			padding: 5px 15px;
+			box-sizing: border-box;
+			background: #FF5C03 !important;
+			border-radius: 6px;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 15px;
+			color: #fff !important;
+			margin-left: 12px;
+			&::after {
+				border: none;
+			}
+		}
+		&-con {
+			background-color: #F5F7FA;
+			padding: 24px 12px 48px 12px;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #757575;
+		}
+	}
+	.danmu-icon{
+		height: 24px;
+		width: 24px;
+		margin-right: 12px;
+	}
+	.logo {
+		display: inline-block;
+		width: 30px;
+		height: auto;
+		margin: 20px 0 0 10px;
+		pointer-events: none;
+		object-fit: cover;
+	}
+	.logo-full {
+		display: inline-block;
+		width: 40px;
+		height: auto;
+		margin: 50px 0 0 30px;
+		pointer-events: none;
+		object-fit: cover;
+	}
+	.tabbox-bar {
+		@include u-flex(row, center, flex-start);
+		background-color: #fff;
+		.warning {
+			flex-shrink: 0;
+			padding-right: 20rpx;
+		}
+	}
+	.tabbox {
+		flex: 1;
+		@include u-flex(row, center, center);
+		border-bottom: 2rpx solid #F5F7FA;
+		height: 44px;
+		background-color: #fff;
+		view {
+			flex: 1;
+			padding: 20rpx 0;
+			margin-right: 40rpx;
+			text-align: center;
+		}
+		&-active {
+			position: relative;
+			&::after {
+				position: absolute;
+				bottom: 0;
+				left: 50%;
+				transform: translateX(-50%);
+				content: "";
+				width: 3rem;
+				border-bottom: 4px solid #FF5C03;
+			}
+		}
+	}
+	.chatinput {
+		position: fixed;
+		left: 32rpx;
+		right: 32rpx;
+		z-index: 999;
+		height: 96rpx;
+		background-color: green;
+		background: #FFFFFF;
+		box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		@include u-flex(row, center, center);
+		padding: 0 24rpx;
+		box-sizing: border-box;
+		.uni-input {
+			flex: 1;
+			margin-right: 32rpx;
+			font-size: 30rpx;
+		}
+	
+		.send {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #FFFFFF !important;
+			flex-shrink: 0;
+			padding: 0 20rpx;
+			height: 72rpx;
+			background: #FF5C03 !important;
+			border-radius: 8rpx 8rpx 8rpx 8rpx;
+			&::after {
+				border: none;
+			}
+		}
+	}
+	.answerTip {
+		position: fixed;
+		right: 0;
+		z-index: 9;
+		bottom: calc(var(--window-bottom) + 380rpx);
+		box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		background-color: #ff5c03;
+		color: #fff;
+		border-radius: 50%;
+		height: 100rpx;
+		width: 100rpx;
+		font-size: 25rpx;
+		text-align: center;
+		padding: 10rpx;
+		@include u-flex(row, center, center);
+	}
+	.danmu-item {
+		position: absolute;
+		top: 0;
+		white-space: nowrap;
+		font-size: 16px;
+		height: 20px;
+		display: inline-flex;
+		box-sizing: border-box;
+		align-items: center;
+	}
+	.danmuMove {
+		// animation: mymove 8s linear forwards;
+		// animation-duration: 8s;
+		animation-timing-function: linear;
+		animation-delay: 0s;
+		animation-iteration-count: 1;
+		animation-direction: normal;
+		animation-fill-mode: forwards;
+		animation-play-state: running;
+		animation-name: mymove;
+		will-change: transform;
+	}
+	
+	@keyframes mymove {
+		from {
+			transform: translateX(100vw);
+		}
+	
+		to {
+			transform: translateX(-100%);
+		}
+	}
+	.arrow-left-warning {
+		position: absolute;
+		left: 24rpx;
+		height: 88rpx;
+		overflow: hidden;
+		color: #888;
+		font-size: 24rpx;
+		@include u-flex(column, center, center);
+		image {
+			flex-shrink: 0;
+			height: 36rpx;
+			width: 36rpx;
+		}
+	}
+</style>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/appPopup.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/goodsList.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/treasureChest.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/turntableOne.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/components/turntableTwo.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/register.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages_course/videoDetail.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/appPopup.js


+ 6 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/appPopup.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "uni-popup": "/uni_modules/uni-popup/components/uni-popup/uni-popup"
+  }
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/appPopup.wxml


+ 194 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/appPopup.wxss

@@ -0,0 +1,194 @@
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.num.data-v-85bf954e {
+  margin-left: 12rpx;
+  font-family: DINPro, DINPro;
+  font-size: 40rpx;
+}
+.appPopup-mask.data-v-85bf954e {
+  margin-top: -88rpx;
+  width: 670rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+.appPopup-mask .tipimg.data-v-85bf954e {
+  height: 206rpx;
+  width: 206rpx;
+  z-index: 99;
+}
+.appPopup-mask .close_icon.data-v-85bf954e {
+  height: 48rpx;
+  width: 48rpx;
+  position: absolute;
+  top: 34rpx;
+  right: 20rpx;
+}
+.appPopup-mask .appPopup-box.data-v-85bf954e {
+  width: 670rpx;
+  padding-bottom: 32rpx;
+  background: linear-gradient(180deg, #FFEBBD 0%, #FFFFFF 9%, #FFFFFF 100%);
+  border-radius: 32rpx 32rpx 32rpx 32rpx;
+  overflow: hidden;
+  margin-top: -103rpx;
+  padding-top: 103rpx;
+  box-sizing: border-box;
+  font-family: PingFang SC;
+  font-weight: 400;
+  font-size: 28rpx;
+  color: #757575;
+  text-align: center;
+}
+.appPopup-mask .appPopup-title.data-v-85bf954e {
+  margin-bottom: 10rpx;
+  font-family: PingFang SC;
+  font-weight: 600;
+  font-size: 40rpx;
+  color: #222222;
+}
+.goodslist.data-v-85bf954e {
+  margin-top: 58rpx;
+  padding: 24rpx 10rpx;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-evenly;
+}
+.bg.data-v-85bf954e {
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  z-index: -1;
+}
+.goodsitem.data-v-85bf954e {
+  flex: 1;
+  max-width: 200rpx;
+  min-height: 124rpx;
+  border-radius: 10rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: flex-start;
+  font-family: PingFang SC;
+  font-weight: 400;
+  font-size: 22rpx;
+  color: #999999;
+  position: relative;
+  z-index: 2;
+}
+.goodsitem .img.data-v-85bf954e {
+  width: 153rpx;
+  height: 126rpx;
+  margin-top: -44rpx;
+  border-radius: 10rpx;
+}
+.goodsitem-name.data-v-85bf954e {
+  width: 100%;
+  padding: 8rpx 14rpx;
+  text-align: center;
+  font-family: PingFang SC;
+  font-weight: 500;
+  font-size: 24rpx;
+  color: #222222;
+  box-sizing: border-box;
+}
+.goodsitem-integral.data-v-85bf954e {
+  min-width: 80%;
+  padding-bottom: 16rpx;
+  box-sizing: border-box;
+  font-family: PingFang SC;
+  font-weight: 400;
+  font-size: 22rpx;
+  color: #FF5C03;
+  border-bottom: 2px #999999 dotted;
+}
+.goodsitem-integral-num.data-v-85bf954e {
+  font-family: DINPro, DINPro;
+  font-weight: 500;
+  font-size: 36rpx;
+}
+.goodsitem-price.data-v-85bf954e {
+  padding: 10rpx 0;
+}
+.appPopup-btn.data-v-85bf954e {
+  width: 560rpx;
+  height: 84rpx;
+  margin: 0 auto;
+  background: #FF5C03;
+  border-radius: 42rpx 42rpx 42rpx 42rpx;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  font-family: PingFang SC;
+  font-weight: 500;
+  font-size: 32rpx;
+  color: #FFFFFF;
+}
+.changebtn.data-v-85bf954e {
+  width: 152rpx;
+  height: 64rpx;
+  margin: 0 auto;
+  border-radius: 32rpx 32rpx 32rpx 32rpx;
+  border: 1rpx solid #FF5C03;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  font-family: PingFang SC;
+  font-weight: 400;
+  font-size: 24rpx;
+  color: #FF5C03;
+}
+.progress.data-v-85bf954e {
+  padding: 0 90rpx;
+  margin-top: 40rpx;
+  font-family: PingFang SC;
+  font-weight: 500;
+  font-size: 32rpx;
+  color: #222222;
+}
+.data-v-85bf954e .uni-progress-bar,.data-v-85bf954e .uni-progress-inner-bar {
+  border-radius: 6px;
+}
+.my-integral.data-v-85bf954e {
+  margin: 32rpx 0;
+  font-family: PingFang SC;
+  font-weight: 400;
+  font-size: 28rpx;
+  color: #222222;
+}
+.my-integral text.data-v-85bf954e {
+  color: #FF5C03;
+}
+.appPopup-tips.data-v-85bf954e {
+  margin-top: 32rpx;
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/goodsList.js


+ 4 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/goodsList.json

@@ -0,0 +1,4 @@
+{
+  "usingComponents": {},
+  "component": true
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/goodsList.wxml

@@ -0,0 +1 @@
+<view class="data-v-3a940336"><block wx:for="{{$root.l0}}" wx:for-item="item" wx:for-index="index" wx:key="index"><view class="data-v-3a940336"><view class="goodsitem data-v-3a940336"><view class="goodsitem-img data-v-3a940336"><image style="height:100%;width:100%;" src="{{item.$orig.imgUrl}}" mode="aspectFill" class="data-v-3a940336"></image></view><view class="goodsitem-r data-v-3a940336"><view class="data-v-3a940336"><view class="goodsitem-title data-v-3a940336" style="{{'font-size:'+($root.m0)+';'}}">{{item.$orig.packageName}}</view><view class="goodsitem-desc ellipsis2 data-v-3a940336" style="{{'font-size:'+($root.m1)+';'}}">{{item.$orig.secondName}}</view></view><view data-event-opts="{{[['tap',[['goBuy',['$0'],[[['treatmentPackage','',index]]]]]]]}}" class="goodsitem-btnbox data-v-3a940336" bindtap="__e"><view class="goodsitem-price data-v-3a940336"><view class="unit data-v-3a940336">¥</view><text class="price data-v-3a940336">{{item.g0}}</text></view><view class="btn data-v-3a940336">去购买</view></view></view></view></view></block><block wx:if="{{$root.g1==0}}"><view class="data-v-3a940336"><view class="empty data-v-3a940336"><text class="data-v-3a940336">暂未上新活动</text></view></view></block></view>

+ 122 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/goodsList.wxss

@@ -0,0 +1,122 @@
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.empty.data-v-3a940336 {
+  padding: 40rpx 24rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  color: #999;
+}
+.empty-btn.data-v-3a940336 {
+  margin-top: 24rpx;
+  padding: 20rpx 60rpx;
+  border-radius: 44rpx 44rpx 44rpx 44rpx;
+  border: 2rpx solid #FF5C03;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 400;
+  color: #FF5C03;
+}
+.empty-btn-min.data-v-3a940336 {
+  flex-direction: column;
+  padding: 8rpx 15rpx !important;
+  font-size: 28rpx !important;
+}
+.goodsitem.data-v-3a940336 {
+  display: flex;
+  padding: 24rpx;
+  overflow: hidden;
+  min-height: 200rpx;
+}
+.goodsitem-img.data-v-3a940336 {
+  overflow: hidden;
+  flex-shrink: 0;
+  width: 200rpx;
+  height: 200rpx;
+  border-radius: 14rpx;
+  position: relative;
+}
+.goodsitem-status.data-v-3a940336 {
+  position: absolute;
+  left: 0;
+  top: 0;
+  padding: 8rpx 15rpx;
+  background: #FF5C03;
+  border-radius: 14rpx 0 14rpx 0;
+  font-size: 20rpx;
+  color: #fff;
+  box-sizing: border-box;
+  text-align: center;
+}
+.goodsitem-r.data-v-3a940336 {
+  flex: 1;
+  overflow: hidden;
+  margin-left: 16rpx;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
+.goodsitem-title.data-v-3a940336 {
+  font-weight: bold;
+  color: #191A1B;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: 1;
+  -webkit-box-orient: vertical;
+}
+.goodsitem-desc.data-v-3a940336 {
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 400;
+  color: #939599;
+  margin-top: 20rpx;
+}
+.goodsitem-btnbox.data-v-3a940336 {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.goodsitem-btnbox .btn.data-v-3a940336 {
+  display: inline-block;
+  padding: 10rpx 38rpx;
+  border-radius: 12rpx;
+  border: 3rpx solid #FF5C03;
+  font-weight: bold;
+  color: #FF5C03;
+  text-align: center;
+}
+.goodsitem .unit.data-v-3a940336 {
+  font-size: 32rpx;
+}
+.goodsitem-price.data-v-3a940336 {
+  font-family: Roboto, Roboto;
+  font-weight: bold;
+  font-size: 40rpx;
+  color: #FF5C03;
+  display: flex;
+  align-items: flex-end;
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/treasureChest.js


+ 4 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/treasureChest.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/treasureChest.wxml

@@ -0,0 +1 @@
+<cover-view data-event-opts="{{[['tap',[['open',['$event']]]]]}}" class="{{['treasure-box','data-v-5098c7b4',[(opening)?'opening':''],[(fadeOut)?'fadeOut':''],[(dropIn)?'dropIn':''],[(swing)?'swing':'']]}}" style="{{'display:'+(showBox&&isfull?'flex':'none')+';'}}" bindtap="__e"><cover-image class="{{['data-v-5098c7b4',opening?'box-img openingGif':'box-img boxPng']}}" src="{{currentIdx>=0?opening?boxList[currentIdx].openChestUrl:boxList[currentIdx].closeChestUrl:''}}"></cover-image><block wx:if="{{!opening}}"><cover-view class="countdown data-v-5098c7b4">{{count+"s"}}</cover-view></block></cover-view>

+ 196 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/treasureChest.wxss

@@ -0,0 +1,196 @@
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+@-webkit-keyframes dropIn-data-v-5098c7b4 {
+0% {
+    opacity: 0;
+    -webkit-transform: translateY(-160px);
+            transform: translateY(-160px);
+}
+60% {
+    opacity: 1;
+    -webkit-transform: translateY(12px);
+            transform: translateY(12px);
+}
+100% {
+    opacity: 1;
+    -webkit-transform: translateY(0);
+            transform: translateY(0);
+}
+}
+@keyframes dropIn-data-v-5098c7b4 {
+0% {
+    opacity: 0;
+    -webkit-transform: translateY(-160px);
+            transform: translateY(-160px);
+}
+60% {
+    opacity: 1;
+    -webkit-transform: translateY(12px);
+            transform: translateY(12px);
+}
+100% {
+    opacity: 1;
+    -webkit-transform: translateY(0);
+            transform: translateY(0);
+}
+}
+.treasure-box.dropIn.data-v-5098c7b4 {
+  -webkit-animation: dropIn-data-v-5098c7b4 0.7s cubic-bezier(0.25, 0.85, 0.45, 1.25) forwards,pulse-data-v-5098c7b4 1s ease-in-out infinite 0.7s;
+          animation: dropIn-data-v-5098c7b4 0.7s cubic-bezier(0.25, 0.85, 0.45, 1.25) forwards,pulse-data-v-5098c7b4 1s ease-in-out infinite 0.7s;
+}
+@-webkit-keyframes swing-data-v-5098c7b4 {
+20% {
+    -webkit-transform: rotate(-8deg);
+            transform: rotate(-8deg);
+}
+40% {
+    -webkit-transform: rotate(8deg);
+            transform: rotate(8deg);
+}
+60% {
+    -webkit-transform: rotate(-6deg);
+            transform: rotate(-6deg);
+}
+80% {
+    -webkit-transform: rotate(6deg);
+            transform: rotate(6deg);
+}
+100% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+}
+}
+@keyframes swing-data-v-5098c7b4 {
+20% {
+    -webkit-transform: rotate(-8deg);
+            transform: rotate(-8deg);
+}
+40% {
+    -webkit-transform: rotate(8deg);
+            transform: rotate(8deg);
+}
+60% {
+    -webkit-transform: rotate(-6deg);
+            transform: rotate(-6deg);
+}
+80% {
+    -webkit-transform: rotate(6deg);
+            transform: rotate(6deg);
+}
+100% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+}
+}
+.treasure-box.swing.data-v-5098c7b4 {
+  -webkit-animation: swing-data-v-5098c7b4 0.4s ease-in-out infinite forwards;
+          animation: swing-data-v-5098c7b4 0.4s ease-in-out infinite forwards;
+}
+/* 宝箱 */
+.treasure-box.data-v-5098c7b4 {
+  position: fixed;
+  left: 100px;
+  bottom: 80px;
+  width: 192px;
+  /* 128 × 1.5 */
+  height: 138px;
+  /* 92 × 1.5 */
+  -webkit-animation: pulse-data-v-5098c7b4 0.4s ease-in-out infinite;
+          animation: pulse-data-v-5098c7b4 0.4s ease-in-out infinite;
+  display: flex;
+  align-items: flex-end;
+}
+.openingGif.data-v-5098c7b4 {
+  width: 192px;
+  /* 128 × 1.5 */
+  height: 138px;
+  /* 92 × 1.5 */
+}
+.boxPng.data-v-5098c7b4 {
+  width: 135px;
+  height: 96px;
+  margin-left: 20px;
+}
+.countdown.data-v-5098c7b4 {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  -webkit-transform: translate(-50%, -50%);
+          transform: translate(-50%, -50%);
+  color: #fff;
+  font-size: 20px;
+  font-weight: bold;
+  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
+}
+/* 动画 */
+@-webkit-keyframes pulse-data-v-5098c7b4 {
+0%,
+  100% {
+    -webkit-transform: scale(1);
+            transform: scale(1);
+}
+50% {
+    -webkit-transform: scale(1.15);
+            transform: scale(1.15);
+}
+}
+@keyframes pulse-data-v-5098c7b4 {
+0%,
+  100% {
+    -webkit-transform: scale(1);
+            transform: scale(1);
+}
+50% {
+    -webkit-transform: scale(1.15);
+            transform: scale(1.15);
+}
+}
+/* 打开后停止 pulse */
+.treasure-box.opening.data-v-5098c7b4 {
+  -webkit-animation: none;
+          animation: none;
+}
+/* 自动消失 */
+.treasure-box.fadeOut.data-v-5098c7b4 {
+  -webkit-animation: fadeOutUp-data-v-5098c7b4 .6s ease-out forwards;
+          animation: fadeOutUp-data-v-5098c7b4 .6s ease-out forwards;
+}
+@-webkit-keyframes fadeOutUp-data-v-5098c7b4 {
+to {
+    opacity: 0;
+    -webkit-transform: translate(-50%, -40px);
+            transform: translate(-50%, -40px);
+}
+}
+@keyframes fadeOutUp-data-v-5098c7b4 {
+to {
+    opacity: 0;
+    -webkit-transform: translate(-50%, -40px);
+            transform: translate(-50%, -40px);
+}
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/turntableOne.js


+ 6 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/turntableOne.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "uni-popup": "/uni_modules/uni-popup/components/uni-popup/uni-popup"
+  }
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/turntableOne.wxml


+ 205 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/turntableOne.wxss

@@ -0,0 +1,205 @@
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+@-webkit-keyframes spin-data-v-f7d474fa {
+from {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+}
+to {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+}
+}
+@keyframes spin-data-v-f7d474fa {
+from {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+}
+to {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+}
+}
+.infinite-spin.data-v-f7d474fa {
+  -webkit-animation: spin-data-v-f7d474fa 1s linear infinite;
+          animation: spin-data-v-f7d474fa 1s linear infinite;
+}
+.close.data-v-f7d474fa {
+  width: 64rpx;
+  height: 64rpx;
+  margin: 24rpx auto 0 auto;
+  display: block;
+}
+.turntable.data-v-f7d474fa {
+  position: relative;
+  width: 660rpx;
+  height: 880rpx;
+  /* 分隔线 */
+}
+.turntable .bg.data-v-f7d474fa {
+  width: 660rpx;
+  height: 880rpx;
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.turntable-con.data-v-f7d474fa {
+  width: 660rpx;
+  height: 880rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  position: relative;
+  z-index: 2;
+}
+.turntable .text.data-v-f7d474fa {
+  width: 520rpx;
+  height: 104rpx;
+  margin-top: 47rpx;
+}
+.turntable .base.data-v-f7d474fa {
+  width: 451rpx;
+  height: 177rpx;
+  position: absolute;
+  bottom: 55rpx;
+  left: 50%;
+  -webkit-transform: translateX(-50%);
+          transform: translateX(-50%);
+  z-index: 3;
+}
+.turntable .decoration_img.data-v-f7d474fa {
+  width: 637rpx;
+  height: 592rpx;
+  position: absolute;
+  bottom: 85rpx;
+  left: 50%;
+  -webkit-transform: translateX(-50%);
+          transform: translateX(-50%);
+  z-index: 4;
+}
+.turntable .ring.data-v-f7d474fa {
+  width: 502rpx;
+  height: 502rpx;
+  background: #FFFDFD;
+  border-radius: 50%;
+  position: relative;
+  margin-top: 79rpx;
+  z-index: 9;
+}
+.turntable .button.data-v-f7d474fa {
+  width: 158rpx;
+  height: 200rpx;
+  position: absolute;
+  top: calc(50% - 21rpx);
+  left: 50%;
+  -webkit-transform: translate(-50%, -50%);
+          transform: translate(-50%, -50%);
+  z-index: 99;
+}
+.turntable .ring_bg.data-v-f7d474fa {
+  width: 620rpx;
+  height: 620rpx;
+  position: absolute;
+  bottom: 74rpx;
+  left: 50%;
+  -webkit-transform: translateX(-50%);
+          transform: translateX(-50%);
+  z-index: 6;
+}
+.turntable .canvas-content.data-v-f7d474fa {
+  position: absolute;
+  left: 0;
+  top: 0;
+  z-index: 1;
+  display: block;
+  width: 502rpx;
+  height: 502rpx;
+  border-radius: inherit;
+  /* background-clip: padding-box; */
+  /* background-color: #ffcb3f; */
+}
+.turntable .icon-awrad.data-v-f7d474fa {
+  width: 72rpx;
+  height: 72rpx;
+  margin-top: 10rpx;
+  object-fit: contain;
+}
+.turntable .canvas-list.data-v-f7d474fa {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: inherit;
+  height: inherit;
+  z-index: 99;
+}
+.turntable .canvas-item.data-v-f7d474fa {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  color: #e4370e;
+  /* text-shadow: 0 1rpx 1rpx rgba(255, 255, 255, 0.6); */
+}
+.turntable .canvas-item-text.data-v-f7d474fa {
+  position: relative;
+  display: block;
+  padding-top: 14rpx;
+  margin: 0 auto;
+  text-align: center;
+  -webkit-transform-origin: 50% 251rpx;
+  transform-origin: 50% 251rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  color: #F72F26;
+  font-weight: 500;
+  font-size: 24rpx;
+}
+.turntable .canvas-item-text text.data-v-f7d474fa {
+  font-size: 30rpx;
+}
+.turntable .canvas-line.data-v-f7d474fa {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: inherit;
+  height: inherit;
+  z-index: 99;
+}
+.turntable .canvas-litem.data-v-f7d474fa {
+  position: absolute;
+  left: 251rpx;
+  top: 0;
+  width: 1rpx;
+  height: 251rpx;
+  background-color: #FF4D2C;
+  overflow: hidden;
+  -webkit-transform-origin: 50% 251rpx;
+  transform-origin: 50% 251rpx;
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/turntableTwo.js


+ 6 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/turntableTwo.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "uni-popup": "/uni_modules/uni-popup/components/uni-popup/uni-popup"
+  }
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/turntableTwo.wxml

@@ -0,0 +1 @@
+<uni-popup vue-id="199c5086-1" type="center" is-mask-click="{{false}}" data-ref="turntablePopup" class="data-v-c705132e vue-ref" bind:__l="__l" vue-slots="{{['default']}}"><view class="turntable data-v-c705132e"><image class="turntable-bg data-v-c705132e" src="https://cos.his.cdwjyyh.com/fs/20250910/de386927c5f44e02ab3ecc480ddb9797.png" mode="aspectFit"></image><view class="turntable-box data-v-c705132e"><view class="turntable-wrap data-v-c705132e"><block wx:for="{{cells}}" wx:for-item="item" wx:for-index="idx" wx:key="idx"><view class="{{['turntable-item','data-v-c705132e',(idx==light)?'active':'',(item.isReceive)?'disabled':'']}}"><image src="{{item.iconUrl}}" mode="aspectFit" class="data-v-c705132e"></image><view class="ellipsis data-v-c705132e">{{item.name}}</view></view></block></view></view><image class="close data-v-c705132e" src="https://cos.his.cdwjyyh.com/fs/20250910/93608bad8ad1479a854ec26e8eaaacea.png" data-event-opts="{{[['tap',[['close',['$event']]]]]}}" bindtap="__e"></image><view class="btn-box data-v-c705132e"><image class="{{['data-v-c705132e',isReceive==1?'gray':'']}}" src="https://cos.his.cdwjyyh.com/fs/20250910/fe230bfdf74f4f0dac88af53f709d6c5.png" mode="widthFix" data-event-opts="{{[['tap',[['start',['$event']]]]]}}" bindtap="__e"></image></view></view></uni-popup>

+ 121 - 0
unpackage/dist/dev/mp-weixin/pages_course/components/turntableTwo.wxss

@@ -0,0 +1,121 @@
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.gray.data-v-c705132e {
+  -webkit-filter: grayscale(1);
+          filter: grayscale(1);
+  /* 1 = 100% 灰度 */
+}
+.close.data-v-c705132e {
+  width: 64rpx;
+  height: 64rpx;
+  position: absolute;
+  top: 88rpx;
+  right: 20rpx;
+  z-index: 2;
+}
+.active.data-v-c705132e {
+  -webkit-transform: scale(1.05);
+          transform: scale(1.05);
+  background: linear-gradient(0deg, #FFD44F 0%, #FFFABD 100%) !important;
+  box-shadow: 0rpx 2rpx 0rpx 0rpx #FFFCF5 !important;
+}
+.disabled.data-v-c705132e {
+  -webkit-filter: grayscale(1) brightness(0.7);
+          filter: grayscale(1) brightness(0.7);
+  opacity: 0.5;
+}
+.btn-box.data-v-c705132e {
+  width: 540rpx;
+  height: 104rpx;
+  position: absolute;
+  bottom: 46rpx;
+  left: 50%;
+  -webkit-transform: translateX(-50%);
+          transform: translateX(-50%);
+  z-index: 2;
+}
+.btn-box image.data-v-c705132e {
+  width: 100%;
+  height: auto;
+}
+.turntable.data-v-c705132e {
+  width: 750rpx;
+  height: 1056rpx;
+  position: relative;
+}
+.turntable-bg.data-v-c705132e {
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1;
+}
+.turntable-box.data-v-c705132e {
+  position: absolute;
+  bottom: 174rpx;
+  left: 50%;
+  -webkit-transform: translateX(-50%);
+          transform: translateX(-50%);
+  z-index: 2;
+  width: 623rpx;
+  height: 628rpx;
+  padding: 16rpx 0 8rpx 16rpx;
+  box-sizing: border-box;
+}
+.turntable-wrap.data-v-c705132e {
+  display: flex;
+  flex-wrap: wrap;
+}
+.turntable-item.data-v-c705132e {
+  width: 112rpx;
+  height: 112rpx;
+  background: linear-gradient(0deg, #FCEFCA 0%, #FFFFFF 100%);
+  border-radius: 16rpx;
+  font-family: PingFang SC;
+  font-weight: 500;
+  font-size: 20rpx;
+  color: #333333;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+  margin: 0 8rpx 8rpx 0;
+  transition: box-shadow 0.2s, -webkit-transform 0.2s;
+  transition: transform 0.2s, box-shadow 0.2s;
+  transition: transform 0.2s, box-shadow 0.2s, -webkit-transform 0.2s;
+}
+.turntable-item image.data-v-c705132e {
+  width: 45rpx;
+  height: 63rpx;
+}
+.turntable-item .ellipsis.data-v-c705132e {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/register.js


+ 6 - 0
unpackage/dist/dev/mp-weixin/pages_course/register.json

@@ -0,0 +1,6 @@
+{
+  "navigationBarTitleText": "",
+  "navigationStyle": "custom",
+  "scrollIndicator": "none",
+  "usingComponents": {}
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/pages_course/register.wxml

@@ -0,0 +1 @@
+<view class="register_box data-v-214714fe"><image class="imgbg data-v-214714fe" src="https://image.cdwjyyh.com/images/kc_hb_bg.png" mode="widthFix"></image><view class="kc_footer data-v-214714fe"><image class="imgft data-v-214714fe" src="https://image.cdwjyyh.com/images/kc_footer_bg.png" mode="widthFix"></image><view data-event-opts="{{[['tap',[['goLogin',['$event']]]]]}}" class="kc_footer_btn data-v-214714fe" bindtap="__e">{{isRegister==1?'注册成功':'立即注册'}}</view></view></view>

+ 60 - 0
unpackage/dist/dev/mp-weixin/pages_course/register.wxss

@@ -0,0 +1,60 @@
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.register_box.data-v-214714fe {
+  position: relative;
+}
+.imgbg.data-v-214714fe {
+  width: 100%;
+}
+.kc_footer.data-v-214714fe {
+  width: 100%;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+}
+.kc_footer_btn.data-v-214714fe {
+  width: 528rpx;
+  height: 96rpx;
+  background: #FF5C03;
+  border-radius: 48rpx 48rpx 48rpx 48rpx;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 500;
+  font-size: 32rpx;
+  color: #FFFFFF;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: absolute;
+  bottom: 20%;
+  left: 50%;
+  -webkit-transform: translate(-50%, -50%);
+          transform: translate(-50%, -50%);
+}
+.imgft.data-v-214714fe {
+  width: 100%;
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/videoDetail.js


+ 24 - 0
unpackage/dist/dev/mp-weixin/pages_course/videoDetail.json

@@ -0,0 +1,24 @@
+{
+  "navigationBarTitleText": "课程",
+  "navigationStyle": "custom",
+  "scrollIndicator": "none",
+  "usingComponenets": {
+    "uni-popup": "/uni_modules/uni-popup/components/uni-popup/uni-popup"
+  },
+  "componentPlaceholder": {
+    "uni-popup": "view"
+  },
+  "usingComponents": {
+    "u-notice-bar": "/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar",
+    "uni-popup": "/uni_modules/uni-popup/components/uni-popup/uni-popup",
+    "u-input": "/uni_modules/uview-ui/components/u-input/u-input",
+    "desc-info-nav": "/pages_course/components/descInfoNav",
+    "desc-info": "/pages_course/components/descInfo",
+    "comment-box": "/pages_course/components/commentBox",
+    "ques": "/pages_course/components/ques",
+    "treasure-chest": "/pages_course/components/treasureChest",
+    "app-popup": "/pages_course/components/appPopup",
+    "turntable-one": "/pages_course/components/turntableOne",
+    "turntable-two": "/pages_course/components/turntableTwo"
+  }
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages_course/videoDetail.wxml


+ 838 - 0
unpackage/dist/dev/mp-weixin/pages_course/videoDetail.wxss

@@ -0,0 +1,838 @@
+
+.full-width-popup.data-v-9607b5be {
+  width: 100%;
+}
+
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+.reward-list.data-v-9607b5be {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  margin-top: 40rpx;
+  margin-bottom: -24rpx;
+}
+.reward-item.data-v-9607b5be {
+  padding: 16rpx 10rpx;
+  box-sizing: border-box;
+  border-radius: 10rpx;
+  width: calc(50% - 14rpx);
+  overflow: hidden;
+  text-align: center;
+  border-radius: 8rpx;
+  border: 1rpx solid #ededef;
+  margin-bottom: 24rpx;
+  color: #222;
+  background-color: #fff;
+}
+.reward-item.data-v-9607b5be:nth-child(odd) {
+  margin-right: 20rpx;
+}
+.reward-active.data-v-9607b5be {
+  border: 1rpx solid #ff5c03 !important;
+  color: #ff5c03 !important;
+  background: #FCF0E7 !important;
+}
+.footer-tips.data-v-9607b5be {
+  margin-top: 14rpx;
+  text-align: center;
+  font-family: PingFang SC,PingFang SC;
+  font-weight: 500;
+  font-size: 12px;
+  color: #bbb;
+}
+.textOne.data-v-9607b5be {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+.textTwo.data-v-9607b5be {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+}
+.header-nav.data-v-9607b5be {
+  height: 88rpx;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  overflow: hidden;
+  background-color: #fff;
+  box-sizing: border-box;
+}
+.header-nav .header-title.data-v-9607b5be {
+  text-align: center;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  padding: 0 10rpx 0 100rpx;
+  font-family: PingFang SC,PingFang SC;
+  font-weight: 500;
+  font-size: 15px;
+  color: #000;
+  box-sizing: border-box;
+}
+.reward-list.data-v-9607b5be {
+  width: 100%;
+}
+.reward-list-group.data-v-9607b5be {
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 400;
+  font-size: 14px;
+  color: #222222;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+}
+.reward-list-option.data-v-9607b5be {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+}
+.reward-list-option.data-v-9607b5be:first-child {
+  margin-right: 40rpx;
+}
+.err.data-v-9607b5be {
+  color: #f56c6c !important;
+}
+.kfqrcode-box.data-v-9607b5be {
+  background-color: #fff;
+  border-radius: 16rpx;
+  max-width: 560rpx;
+  padding: 60rpx 40rpx;
+  margin-top: -100rpx;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: flex-start;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 400;
+  font-size: 34rpx;
+  color: #222;
+  position: relative;
+  text-align: center;
+}
+.kfqrcode-box .kfqrcode.data-v-9607b5be {
+  height: 460rpx;
+  width: 460rpx;
+}
+.kfqrcode-close.data-v-9607b5be {
+  width: 64rpx;
+  height: 64rpx;
+  position: absolute;
+  bottom: -100rpx;
+  left: 50%;
+  -webkit-transform: translateX(-50%);
+          transform: translateX(-50%);
+}
+.tipsPopup-mask.data-v-9607b5be {
+  position: relative;
+  width: 560rpx;
+  background-color: transparent;
+}
+.tipsPopup-mask .red_envelope_top.data-v-9607b5be {
+  width: 480rpx;
+  height: 360rpx;
+  margin: 0 auto;
+  display: inherit;
+}
+.tipsPopup-btn-box.data-v-9607b5be {
+  width: 456rpx;
+  height: 104rpx;
+  padding: 4rpx;
+  box-sizing: border-box;
+  background: linear-gradient(180deg, #fcd15e, #fefdfb);
+  border-radius: 52rpx;
+}
+.tipsPopup-btn.data-v-9607b5be {
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(180deg, #FF9F22 0%, #FA1E05 100%);
+  border-radius: 52rpx 52rpx 52rpx 52rpx;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 500;
+  font-size: 36rpx;
+  color: #FFFFFF;
+  line-height: 96rpx;
+  text-align: center;
+}
+.tipsPopup.data-v-9607b5be {
+  width: 560rpx;
+  padding: 12rpx;
+  margin-top: -72rpx;
+  box-sizing: border-box;
+  background: linear-gradient(180deg, #FFFBEF 0%, #FFFFF5 43%, #F5EAC2 100%);
+  border-radius: 32rpx 32rpx 32rpx 32rpx;
+  position: relative;
+}
+.tipsPopup-close.data-v-9607b5be {
+  width: 64rpx;
+  height: 64rpx;
+  position: absolute;
+  right: 0;
+  top: -188rpx;
+}
+.tipsPopup-line.data-v-9607b5be {
+  padding: 3rpx;
+  box-sizing: border-box;
+  background: linear-gradient(180deg, #f7f5dc, #fadc9d);
+  border-radius: 24rpx;
+}
+.tipsPopup-box.data-v-9607b5be {
+  padding: 0 40rpx 40rpx 40rpx;
+  box-sizing: border-box;
+  background: linear-gradient(180deg, #FFFBEF 0%, #FFFFF5 43%, #F5EAC2 100%);
+  border-radius: 24rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: flex-start;
+}
+.tipsPopup-head.data-v-9607b5be {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+}
+.tipsPopup-head-title.data-v-9607b5be {
+  width: 364rpx;
+  height: auto;
+  margin-top: -22rpx;
+}
+.tipsPopup-content.data-v-9607b5be {
+  margin: 48rpx 0;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 500;
+  font-size: 32rpx;
+  color: #222222;
+  text-align: center;
+}
+.tipsPopup-content-title.data-v-9607b5be {
+  margin-bottom: 26rpx;
+  font-weight: 600;
+  font-size: 40rpx;
+  color: #FF5C03;
+}
+.video-controls-box.data-v-9607b5be {
+  width: 100%;
+  height: 420rpx;
+  overflow: hidden;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  z-index: 2;
+  background: rgba(0, 0, 0, 0.2);
+}
+.video-controls-box .video-play.data-v-9607b5be {
+  height: 72rpx;
+  width: 72rpx;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  -webkit-transform: translate(-50%, -50%);
+          transform: translate(-50%, -50%);
+}
+.video-controls.data-v-9607b5be {
+  width: 100%;
+  height: 80rpx;
+  padding: 0 28rpx;
+  box-sizing: border-box;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  background: linear-gradient(to top, #222 0%, transparent 80%);
+}
+.video-controls .video-icon.data-v-9607b5be {
+  height: 44rpx;
+  width: 44rpx;
+}
+.errQuesbox.data-v-9607b5be {
+  width: 100%;
+  max-height: 260rpx;
+  overflow-y: auto;
+  margin-top: 24rpx;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 500;
+  font-size: 30rpx;
+  color: #222222;
+}
+.errQuesbox-item.data-v-9607b5be {
+  width: 100%;
+  height: 128rpx;
+  line-height: 128rpx;
+  margin-bottom: 24rpx;
+  padding: 0 30rpx;
+  box-sizing: border-box;
+  overflow: hidden;
+  background: #fff;
+  border-radius: 16rpx 16rpx 16rpx 16rpx;
+  position: relative;
+}
+.errQuesbox-item.data-v-9607b5be::after {
+  content: "题目";
+  min-width: 64rpx;
+  height: 36rpx;
+  padding: 0 12rpx;
+  line-height: 36rpx;
+  background: #FF5C03;
+  box-sizing: border-box;
+  border-radius: 0rpx 0rpx 16rpx 0rpx;
+  text-align: center;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 500;
+  font-size: 20rpx;
+  color: #fff;
+  position: absolute;
+  left: 0;
+  top: 0;
+}
+.bg.data-v-9607b5be {
+  background: #fff !important;
+}
+.answerPopup-box.data-v-9607b5be {
+  width: 560rpx;
+  background: linear-gradient(180deg, #FFFAF6 0%, #FEECD8 100%);
+  border-radius: 32rpx 32rpx 32rpx 32rpx;
+  background-color: #fff;
+  font-weight: 400;
+  padding: 32rpx;
+  box-sizing: border-box;
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: flex-start;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 400;
+}
+.answerPopup-box .tipimg.data-v-9607b5be {
+  width: 206rpx;
+  height: 206rpx;
+  margin-bottom: 16rpx;
+}
+.answerPopup-title.data-v-9607b5be {
+  font-weight: 600;
+  font-size: 36rpx;
+  color: #222222;
+}
+.answerPopup-desc.data-v-9607b5be {
+  margin-top: 10rpx;
+  font-size: 28rpx;
+  color: #757575;
+}
+.answerPopup-btn.data-v-9607b5be {
+  width: 464rpx;
+  height: 84rpx;
+  margin-top: 54rpx;
+  margin-bottom: 16rpx;
+  background: #FF5C03;
+  border-radius: 42rpx;
+  font-weight: 500;
+  font-size: 32rpx;
+  color: #FFFFFF;
+  text-align: center;
+  line-height: 84rpx;
+}
+.popupbox.data-v-9607b5be {
+  width: 100%;
+  background-color: #fff;
+  border-radius: 16rpx 16rpx 0 0;
+  padding: 24rpx 32rpx;
+  position: relative;
+}
+.popupbox-head.data-v-9607b5be {
+  height: 60rpx;
+  margin-bottom: 30rpx;
+  text-align: center;
+  overflow-y: auto;
+  color: #414858;
+  font-size: 32rpx;
+  font-weight: bold;
+  position: relative;
+}
+.popupbox-head .close-icon.data-v-9607b5be {
+  position: absolute;
+  right: 0;
+  top: 0;
+  height: 40rpx;
+  width: 40rpx;
+}
+.popupbox-content.data-v-9607b5be {
+  height: 20vh;
+  overflow-y: auto;
+  display: flex;
+  align-items: flex-start;
+  flex-wrap: wrap;
+  gap: 32rpx;
+}
+.popupbox-content .line-item.data-v-9607b5be {
+  display: inline-block;
+  min-width: 200rpx;
+  min-height: 60rpx;
+  padding: 0 20rpx;
+  box-sizing: border-box;
+  border-radius: 50rpx;
+  overflow: hidden;
+  background-color: #f7f7f7;
+  text-align: center;
+  color: #414858;
+  font-size: 28rpx;
+  line-height: 60rpx;
+}
+.popupbox-content .line-active.data-v-9607b5be {
+  color: #f56c6c !important;
+  background-color: #fef0f0 !important;
+}
+.content.data-v-9607b5be {
+  padding-bottom: calc(0px);
+}
+.content .video-box.data-v-9607b5be {
+  width: 100%;
+  height: 420rpx;
+  overflow: hidden;
+  position: relative;
+}
+.content .video-box #myVideo.data-v-9607b5be {
+  width: 100%;
+  height: 100%;
+}
+.content .video-poster.data-v-9607b5be {
+  width: 100%;
+  height: 420rpx;
+}
+.content .miantitlebox.data-v-9607b5be {
+  padding: 30rpx 0;
+  border-bottom: 2rpx solid #F5F7FA;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 500;
+  font-size: 36rpx;
+  color: #222222;
+}
+.content .subtitlebox.data-v-9607b5be {
+  padding: 30rpx 0;
+  border-bottom: 2rpx solid #F5F7FA;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 500;
+  font-size: 36rpx;
+  color: #222222;
+}
+.content .title-content.data-v-9607b5be {
+  padding: 0 32rpx;
+  background-color: #fff;
+  font-size: 28rpx;
+  line-height: 1.6;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+}
+.content .title-content .title.data-v-9607b5be {
+  font-size: 36rpx;
+  font-weight: 500;
+  color: #414858;
+}
+.content .title-content .time-or-subtitle.data-v-9607b5be {
+  margin-top: 12rpx;
+  color: #666666;
+}
+.content .warning.data-v-9607b5be {
+  flex-shrink: 0;
+  color: #888;
+  font-size: 24rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+.content .warning image.data-v-9607b5be {
+  flex-shrink: 0;
+  height: 36rpx;
+  width: 36rpx;
+}
+.content .video-line.data-v-9607b5be {
+  min-width: 140rpx;
+  max-width: 200rpx;
+  height: 60rpx;
+  padding: 0 20rpx;
+  box-sizing: border-box;
+  border-radius: 50rpx 0 0 50rpx;
+  overflow: hidden;
+  background-color: #fff;
+  text-align: center;
+  color: #888;
+  font-size: 28rpx;
+  line-height: 60rpx;
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  position: fixed;
+  right: 0;
+  z-index: 9;
+  bottom: calc(0px + 280rpx);
+  box-shadow: 0 4rpx 10rpx rgba(0, 0, 0, 0.12);
+}
+.content .video-line image.data-v-9607b5be {
+  flex-shrink: 0;
+  height: 34rpx;
+  width: 34rpx;
+  margin-right: 6rpx;
+}
+.content .danmu-line.data-v-9607b5be {
+  bottom: calc(0px + 370rpx);
+  word-break: keep-all;
+}
+.content .danmu-line .set_image.data-v-9607b5be {
+  height: 40rpx;
+  width: 40rpx;
+}
+.content .footer.data-v-9607b5be {
+  border-top: 1rpx solid #ededef;
+  background: #fff;
+  width: 100%;
+  position: fixed;
+  bottom: 0;
+  padding-bottom: calc(0px);
+  box-sizing: border-box;
+  z-index: 9;
+}
+.content .footer-btn.data-v-9607b5be {
+  width: calc(100% - 64rpx);
+  height: 98rpx;
+  background: #FF5C03;
+  border-radius: 49rpx 49rpx 49rpx 49rpx;
+  line-height: 98rpx;
+  text-align: center;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 600;
+  font-size: 32rpx;
+  color: #FFFFFF;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  margin: 24rpx 32rpx;
+  box-sizing: border-box;
+}
+.content .footer-btn-img.data-v-9607b5be {
+  flex-shrink: 0;
+  width: 144rpx;
+  height: 144rpx;
+  margin-right: 8rpx;
+  margin-top: -24rpx;
+}
+.content .footer-btn-border.data-v-9607b5be {
+  position: relative;
+}
+.content .footer-btn-border.data-v-9607b5be::after {
+  content: "";
+  background: linear-gradient(180deg, rgba(255, 255, 255, 0), white);
+  position: absolute;
+  top: -2rpx;
+  left: 0;
+  height: 103rpx;
+  width: 100%;
+  z-index: -1;
+  border-radius: 49rpx 49rpx 49rpx 49rpx;
+  box-shadow: 0rpx 8rpx 11rpx 0rpx rgba(255, 92, 3, 0.3);
+  overflow: hidden;
+}
+.agreement.data-v-9607b5be {
+  display: inline-flex;
+  margin-top: 16rpx;
+  font-size: 24rpx;
+  color: #525252;
+  align-items: center;
+  justify-content: center;
+}
+.video-danmu-btnbox.data-v-9607b5be {
+  width: 50px;
+  height: 50px;
+  border-radius: 50%;
+  overflow: hidden;
+  position: absolute;
+  right: 10px;
+  bottom: calc(50% - 50px);
+  -webkit-transform: translateY(-50%);
+          transform: translateY(-50%);
+  padding: 8px;
+  box-sizing: border-box;
+}
+.video-danmu-image.data-v-9607b5be {
+  width: 100%;
+  height: 100%;
+}
+.danmuPopup.data-v-9607b5be {
+  background-color: #fff;
+  padding-bottom: calc(0px + 10px);
+}
+.danmuPopup .u-border.data-v-9607b5be {
+  flex: 1;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  padding: 0 6rpx;
+  border-radius: 6px;
+}
+.danmuPopup-head.data-v-9607b5be {
+  width: 100%;
+  padding: 10px;
+  box-sizing: border-box;
+  overflow: hidden;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+}
+.danmuPopup-head .danmu-icon.data-v-9607b5be {
+  height: 24px;
+  width: 24px;
+  margin-right: 10px;
+}
+.danmuPopup-input.data-v-9607b5be {
+  flex: 1;
+  height: 35px;
+}
+.danmuPopup-send.data-v-9607b5be {
+  flex-shrink: 0;
+  height: 35px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 5px 15px;
+  box-sizing: border-box;
+  background: #FF5C03 !important;
+  border-radius: 6px;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 500;
+  font-size: 15px;
+  color: #fff !important;
+  margin-left: 12px;
+}
+.danmuPopup-send.data-v-9607b5be::after {
+  border: none;
+}
+.danmuPopup-con.data-v-9607b5be {
+  background-color: #F5F7FA;
+  padding: 24px 12px 48px 12px;
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 400;
+  font-size: 14px;
+  color: #757575;
+}
+.danmu-icon.data-v-9607b5be {
+  height: 24px;
+  width: 24px;
+  margin-right: 12px;
+}
+.logo.data-v-9607b5be {
+  display: inline-block;
+  width: 30px;
+  height: auto;
+  margin: 20px 0 0 10px;
+  pointer-events: none;
+  object-fit: cover;
+}
+.logo-full.data-v-9607b5be {
+  display: inline-block;
+  width: 40px;
+  height: auto;
+  margin: 50px 0 0 30px;
+  pointer-events: none;
+  object-fit: cover;
+}
+.tabbox-bar.data-v-9607b5be {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  background-color: #fff;
+}
+.tabbox-bar .warning.data-v-9607b5be {
+  flex-shrink: 0;
+  padding-right: 20rpx;
+}
+.tabbox.data-v-9607b5be {
+  flex: 1;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  border-bottom: 2rpx solid #F5F7FA;
+  height: 44px;
+  background-color: #fff;
+}
+.tabbox view.data-v-9607b5be {
+  flex: 1;
+  padding: 20rpx 0;
+  margin-right: 40rpx;
+  text-align: center;
+}
+.tabbox-active.data-v-9607b5be {
+  position: relative;
+}
+.tabbox-active.data-v-9607b5be::after {
+  position: absolute;
+  bottom: 0;
+  left: 50%;
+  -webkit-transform: translateX(-50%);
+          transform: translateX(-50%);
+  content: "";
+  width: 3rem;
+  border-bottom: 4px solid #FF5C03;
+}
+.chatinput.data-v-9607b5be {
+  position: fixed;
+  left: 32rpx;
+  right: 32rpx;
+  z-index: 999;
+  height: 96rpx;
+  background-color: green;
+  background: #FFFFFF;
+  box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+  border-radius: 24rpx 24rpx 24rpx 24rpx;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  padding: 0 24rpx;
+  box-sizing: border-box;
+}
+.chatinput .uni-input.data-v-9607b5be {
+  flex: 1;
+  margin-right: 32rpx;
+  font-size: 30rpx;
+}
+.chatinput .send.data-v-9607b5be {
+  font-family: PingFang SC, PingFang SC;
+  font-weight: 400;
+  font-size: 28rpx;
+  color: #FFFFFF !important;
+  flex-shrink: 0;
+  padding: 0 20rpx;
+  height: 72rpx;
+  background: #FF5C03 !important;
+  border-radius: 8rpx 8rpx 8rpx 8rpx;
+}
+.chatinput .send.data-v-9607b5be::after {
+  border: none;
+}
+.answerTip.data-v-9607b5be {
+  position: fixed;
+  right: 0;
+  z-index: 9;
+  bottom: calc(0px + 380rpx);
+  box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+  border-radius: 24rpx 24rpx 24rpx 24rpx;
+  background-color: #ff5c03;
+  color: #fff;
+  border-radius: 50%;
+  height: 100rpx;
+  width: 100rpx;
+  font-size: 25rpx;
+  text-align: center;
+  padding: 10rpx;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+}
+.danmu-item.data-v-9607b5be {
+  position: absolute;
+  top: 0;
+  white-space: nowrap;
+  font-size: 16px;
+  height: 20px;
+  display: inline-flex;
+  box-sizing: border-box;
+  align-items: center;
+}
+.danmuMove.data-v-9607b5be {
+  -webkit-animation-timing-function: linear;
+          animation-timing-function: linear;
+  -webkit-animation-delay: 0s;
+          animation-delay: 0s;
+  -webkit-animation-iteration-count: 1;
+          animation-iteration-count: 1;
+  -webkit-animation-direction: normal;
+          animation-direction: normal;
+  -webkit-animation-fill-mode: forwards;
+          animation-fill-mode: forwards;
+  -webkit-animation-play-state: running;
+          animation-play-state: running;
+  -webkit-animation-name: mymove-data-v-9607b5be;
+          animation-name: mymove-data-v-9607b5be;
+  will-change: transform;
+}
+@-webkit-keyframes mymove-data-v-9607b5be {
+from {
+    -webkit-transform: translateX(100vw);
+            transform: translateX(100vw);
+}
+to {
+    -webkit-transform: translateX(-100%);
+            transform: translateX(-100%);
+}
+}
+@keyframes mymove-data-v-9607b5be {
+from {
+    -webkit-transform: translateX(100vw);
+            transform: translateX(100vw);
+}
+to {
+    -webkit-transform: translateX(-100%);
+            transform: translateX(-100%);
+}
+}
+.arrow-left-warning.data-v-9607b5be {
+  position: absolute;
+  left: 24rpx;
+  height: 88rpx;
+  overflow: hidden;
+  color: #888;
+  font-size: 24rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+.arrow-left-warning image.data-v-9607b5be {
+  flex-shrink: 0;
+  height: 36rpx;
+  width: 36rpx;
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.js


+ 6 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-icon": "/uni_modules/uview-ui/components/u-icon/u-icon"
+  }
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.wxml

@@ -0,0 +1 @@
+<view data-event-opts="{{[['tap',[['clickHandler',['$event']]]]]}}" class="u-notice data-v-3bda0f19" bindtap="__e"><block wx:if="{{$slots.icon}}"><slot name="icon"></slot></block><block wx:else><block wx:if="{{icon}}"><view class="u-notice__left-icon data-v-3bda0f19"><u-icon vue-id="3f68550d-1" name="{{icon}}" color="{{color}}" size="19" class="data-v-3bda0f19" bind:__l="__l"></u-icon></view></block></block><swiper class="u-notice__swiper data-v-3bda0f19" disable-touch="{{disableTouch}}" vertical="{{step?false:true}}" circular="{{true}}" interval="{{duration}}" autoplay="{{true}}" data-event-opts="{{[['change',[['noticeChange',['$event']]]]]}}" bindchange="__e"><block wx:for="{{text}}" wx:for-item="item" wx:for-index="index" wx:key="index"><swiper-item class="u-notice__swiper__item data-v-3bda0f19"><text class="u-notice__swiper__item__text u-line-1 data-v-3bda0f19" style="{{$root.s0}}">{{item}}</text></swiper-item></block></swiper><block wx:if="{{$root.g0}}"><view class="u-notice__right-icon data-v-3bda0f19"><block wx:if="{{mode==='link'}}"><u-icon vue-id="3f68550d-2" name="arrow-right" size="{{17}}" color="{{color}}" class="data-v-3bda0f19" bind:__l="__l"></u-icon></block><block wx:if="{{mode==='closable'}}"><u-icon vue-id="3f68550d-3" name="close" size="{{16}}" color="{{color}}" data-event-opts="{{[['^click',[['close']]]]}}" bind:click="__e" class="data-v-3bda0f19" bind:__l="__l"></u-icon></block></view></block></view>

+ 67 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-column-notice/u-column-notice.wxss

@@ -0,0 +1,67 @@
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+view.data-v-3bda0f19, scroll-view.data-v-3bda0f19, swiper-item.data-v-3bda0f19 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-notice.data-v-3bda0f19 {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+}
+.u-notice__left-icon.data-v-3bda0f19 {
+  align-items: center;
+  margin-right: 5px;
+}
+.u-notice__right-icon.data-v-3bda0f19 {
+  margin-left: 5px;
+  align-items: center;
+}
+.u-notice__swiper.data-v-3bda0f19 {
+  height: 16px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  flex: 1;
+}
+.u-notice__swiper__item.data-v-3bda0f19 {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  overflow: hidden;
+}
+.u-notice__swiper__item__text.data-v-3bda0f19 {
+  font-size: 14px;
+  color: #f9ae3d;
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.js


+ 7 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.json

@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-column-notice": "/uni_modules/uview-ui/components/u-column-notice/u-column-notice",
+    "u-row-notice": "/uni_modules/uview-ui/components/u-row-notice/u-row-notice"
+  }
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.wxml

@@ -0,0 +1 @@
+<block wx:if="{{show}}"><view class="u-notice-bar data-v-24c07869" style="{{$root.s0}}"><block wx:if="{{direction==='column'||direction==='row'&&step}}"><u-column-notice vue-id="734f15bd-1" color="{{color}}" bgColor="{{bgColor}}" text="{{text}}" mode="{{mode}}" step="{{step}}" icon="{{icon}}" disable-touch="{{disableTouch}}" fontSize="{{fontSize}}" duration="{{duration}}" data-event-opts="{{[['^close',[['close']]],['^click',[['click']]]]}}" bind:close="__e" bind:click="__e" class="data-v-24c07869" bind:__l="__l"></u-column-notice></block><block wx:else><u-row-notice vue-id="734f15bd-2" color="{{color}}" bgColor="{{bgColor}}" text="{{text}}" mode="{{mode}}" fontSize="{{fontSize}}" speed="{{speed}}" url="{{url}}" linkType="{{linkType}}" icon="{{icon}}" data-event-opts="{{[['^close',[['close']]],['^click',[['click']]]]}}" bind:close="__e" bind:click="__e" class="data-v-24c07869" bind:__l="__l"></u-row-notice></block></view></block>

+ 41 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.wxss

@@ -0,0 +1,41 @@
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+view.data-v-24c07869, scroll-view.data-v-24c07869, swiper-item.data-v-24c07869 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-notice-bar.data-v-24c07869 {
+  overflow: hidden;
+  padding: 9px 12px;
+  flex: 1;
+}
+

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.js


+ 6 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "u-icon": "/uni_modules/uview-ui/components/u-icon/u-icon"
+  }
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.wxml

@@ -0,0 +1 @@
+<view data-event-opts="{{[['tap',[['clickHandler',['$event']]]]]}}" class="u-notice data-v-9adf94ee" bindtap="__e"><block wx:if="{{$slots.icon}}"><slot name="icon"></slot></block><block wx:else><block wx:if="{{icon}}"><view class="u-notice__left-icon data-v-9adf94ee"><u-icon vue-id="c11206c6-1" name="{{icon}}" color="{{color}}" size="19" class="data-v-9adf94ee" bind:__l="__l"></u-icon></view></block></block><view data-ref="u-notice__content" class="u-notice__content data-v-9adf94ee vue-ref"><view data-ref="u-notice__content__text" class="u-notice__content__text data-v-9adf94ee vue-ref" style="{{$root.s0}}"><block wx:for="{{innerText}}" wx:for-item="item" wx:for-index="index" wx:key="index"><text style="{{$root.s1}}" class="data-v-9adf94ee">{{item}}</text></block></view></view><block wx:if="{{$root.g0}}"><view class="u-notice__right-icon data-v-9adf94ee"><block wx:if="{{mode==='link'}}"><u-icon vue-id="c11206c6-2" name="arrow-right" size="{{17}}" color="{{color}}" class="data-v-9adf94ee" bind:__l="__l"></u-icon></block><block wx:if="{{mode==='closable'}}"><u-icon vue-id="c11206c6-3" name="close" size="{{16}}" color="{{color}}" data-event-opts="{{[['^click',[['close']]]]}}" bind:click="__e" class="data-v-9adf94ee" bind:__l="__l"></u-icon></block></view></block></view>

+ 89 - 0
unpackage/dist/dev/mp-weixin/uni_modules/uview-ui/components/u-row-notice/u-row-notice.wxss

@@ -0,0 +1,89 @@
+@charset "UTF-8";
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+/* 颜色变量 */
+/* 行为相关颜色 */
+/* 文字基本颜色 */
+/* 背景颜色 */
+/* 边框颜色 */
+/* 尺寸变量 */
+/* 文字尺寸 */
+/* 图片尺寸 */
+/* Border Radius */
+/* 水平间距 */
+/* 垂直间距 */
+/* 透明度 */
+/* 文章场景相关 */
+view.data-v-9adf94ee, scroll-view.data-v-9adf94ee, swiper-item.data-v-9adf94ee {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.u-notice.data-v-9adf94ee {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+}
+.u-notice__left-icon.data-v-9adf94ee {
+  align-items: center;
+  margin-right: 5px;
+}
+.u-notice__right-icon.data-v-9adf94ee {
+  margin-left: 5px;
+  align-items: center;
+}
+.u-notice__content.data-v-9adf94ee {
+  text-align: right;
+  flex: 1;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  overflow: hidden;
+}
+.u-notice__content__text.data-v-9adf94ee {
+  font-size: 14px;
+  color: #f9ae3d;
+  padding-left: 100%;
+  word-break: keep-all;
+  white-space: nowrap;
+  -webkit-animation: u-loop-animation-data-v-9adf94ee 10s linear infinite both;
+          animation: u-loop-animation-data-v-9adf94ee 10s linear infinite both;
+  display: flex;
+  flex-direction: row;
+}
+@-webkit-keyframes u-loop-animation-data-v-9adf94ee {
+0% {
+    -webkit-transform: translate3d(0, 0, 0);
+            transform: translate3d(0, 0, 0);
+}
+100% {
+    -webkit-transform: translate3d(-100%, 0, 0);
+            transform: translate3d(-100%, 0, 0);
+}
+}
+@keyframes u-loop-animation-data-v-9adf94ee {
+0% {
+    -webkit-transform: translate3d(0, 0, 0);
+            transform: translate3d(0, 0, 0);
+}
+100% {
+    -webkit-transform: translate3d(-100%, 0, 0);
+            transform: translate3d(-100%, 0, 0);
+}
+}
+

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä