XSLu08042 пре 6 месеци
родитељ
комит
fa72cc6eeb

+ 0 - 3
common/request.js

@@ -9,8 +9,6 @@ export default class Request {
 		// });
 		return new Promise((resolve, reject) => {
 			let token = uni.getStorageSync('AppToken');
-			console.log(1111)
-			console.log(token)
 			var httpContentType='application/x-www-form-urlencoded';
 			if(contentType!=undefined){
 				//application/json;charset=UTF-8
@@ -32,7 +30,6 @@ export default class Request {
 					if(res.data.code==401){//没有权限直接退出到登录界面
 						let pages = getCurrentPages();
 						let url = pages[ pages.length - 1]; //当前页页面实例
-						console.log(url)
 						//如果登录界面已打开,自动关闭
 						if(url!=undefined&&url.route=="pages/auth/login"){
 							resolve(res.data)

+ 2 - 2
package.json

@@ -14,9 +14,9 @@
   "license": "",
   "keywords": [],
   "dependencies": {
-    "version": "1.11.7",
     "uni-read-pages": "^1.0.5",
-    "uni-simple-router": "^1.5.5"
+    "uni-simple-router": "^1.5.5",
+    "version": "1.11.7"
   },
   "devDependencies": {
     "sass-loader": "^13.2.0"

+ 27 - 0
pages.json

@@ -251,10 +251,37 @@
 		        "enablePullDownRefresh": false
 		    }
 		    
+		},{
+		    "path" : "pages/courseManage/index",
+		    "style" :                                                                                    
+		    {
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false,
+				"navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
+		    } 
+		},{
+		    "path" : "pages/courseManage/statistics",
+		    "style" :                                                                                    
+		    {
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false,
+				"navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
+		    } 
 		}
 		 
     ],
 	"globalStyle": {
+		// "navigationStyle": "custom", // 设置成 custom 即可解决微信H5双标题的问题
 		"navigationBarTitleText": "销售管理端",
 		"navigationBarBackgroundColor": "#115296",
 		"backgroundColor": "#ffffff"

+ 250 - 0
pages/courseManage/components/courseItem.vue

@@ -0,0 +1,250 @@
+<template>
+	<view class="courselist-item">
+		<view class="courselist-con x-start">
+			<view class="courselist-img">
+				<view class="status">进行中</view>
+				<image src="https://sg-mmyy-oss.yjfzy.com/sgs/image/20241102/e07b38daf749cb02e9f5ce69c57b44ea.png" mode="aspectFill"></image>
+			</view>
+			<view class="courselist-con-r">
+				<view>
+					<text class="more-t">7.明医有话说-杜老师给您讲讲抑郁</text>
+					<view class="btn_icon" style="margin-left: 5px;">ID
+						<image src="@/static/images/copy_icon.png" mode="aspectFill"></image>
+					</view>
+				</view>
+				<view class="courselist-desc one-t" v-show="from != 'course'">明医有话说 2.0-2.0-明医10301111111111</view>
+				<view :class="from == 'course' ? 'courselist-con-timebox ':'courselist-con-timebox x-f'">
+					<view class="x-f acea-row"><u-icon class="icon" name="file-text" color="#999" size="20"></u-icon>12月28日 00:00-23:59</view>
+					<view class="x-f acea-row"><u-icon class="icon" name="clock" color="#999" size="16"></u-icon>44分36秒</view>
+				</view>
+			</view>
+		</view>
+		<view class="courselist-footer x-f">
+			<view class="courselist-footer-item x-c" v-show="activeTab !=2" @click="handleShare"><u-icon name="share-square" color="#1677ff" size="18"></u-icon>分享课程</view>
+			<view class="courselist-footer-item x-c shishi" v-show="activeTab == 1" @click="handleStatistics"><u-icon name="share-square" color="#1677ff" size="18"></u-icon>实时统计</view>
+			<view class="courselist-footer-item x-c shuju" v-show="activeTab == 2" @click="handleStatistics"><u-icon name="share-square" color="#1677ff" size="18"></u-icon>数据统计</view>
+		</view>
+		<!-- 分享弹窗 -->
+		<u-popup :show="showShare" :closeOnClickOverlay="true" :round='20' @close="closeShare" @open="openShare">
+			<view class="sharePop x-ac">
+				<view class="sharePop-item y-f">
+					<image src="@/static/images/poster_icon.png" mode="aspectFill"></image>
+					<view style="font-weight: bold;margin-bottom: 4px;">生成海报</view>
+					<view style="font-size: 12px;color: #888;">保存海报美观宣传</view>
+				</view>
+				<view class="sharePop-item y-f" @click="copyLink">
+					<image src="@/static/images/link_icon.png" mode="aspectFill"></image>
+					<view style="font-weight: bold;margin-bottom: 4px;">复制链接</view>
+					<view style="font-size: 12px;color: #888;">生成链接一键复制</view>
+				</view>
+			</view>
+		</u-popup>
+		<!-- 设置链接有效时长弹窗 -->
+		<u-modal :show="setTimeShow"content='content' class="model" @confirm="confirmTime">
+			<view class="setTimebox">
+				<view class="timetip">不传默认以系统参数为准</view>
+				<view class="x-f">
+					<text style="margin-right: 20px;">链接有效时长(分钟)</text>
+					<u-input
+						fontSize="14px"
+						placeholder="链接有效时长"
+						border="none"
+						v-model="time"
+						maxlength="5"
+					  ></u-input>
+				</view>
+			</view>
+		</u-modal>
+		<!-- <u-popup :show="setTimeShow" :round="10" mode="center" @close="close" @open="open" :zIndex="10078">
+			<view class="timePop">
+				<view>不传默认以系统参数为准</view>
+				<text>人生若只如初见,何事秋风悲画扇</text>
+			</view>
+		</u-popup> -->
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			activeTab: {
+				type: [Number,String],
+				default: 0
+			},
+			// 来源
+			from: {
+				type: String,
+				default: 'live'
+			},
+		},
+		data() {
+			return {
+				showShare: false,
+				setTimeShow: false,
+				time: "",
+			}
+		},
+		methods: {
+			handleShare() {
+				this.showShare = true
+			},
+			closeShare() {
+				this.showShare = false
+			  // console.log('open');
+			},
+			openShare() {
+			  // this.showShare = false
+			  // console.log('close');
+			},
+			copyLink(){
+				this.setTimeShow = true
+			},
+			confirmTime() {
+				this.setTimeShow = false
+				this.showShare = false
+			},
+			handleStatistics() {
+				uni.navigateTo({
+					url: '/pages/courseManage/statistics'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	::v-deep {
+		.model .u-fade-enter-active {
+			z-index: 10075 !important;
+		}
+	}
+	.sharePop{
+		background-color: #fff;
+		padding: 50px 0;
+		border-radius: 20px 20px 0 0;
+		&-item {
+			padding: 0 10px;
+			box-sizing: border-box;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			display: inline-flex !important;
+			image {
+				height: 48px;
+				width: 48px;
+				margin-bottom: 10px;
+			}
+		}
+	}
+	.setTimebox {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+	}
+	.timetip {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #2979ff;
+		text-align: center;
+		margin-bottom: 5px;
+	}
+	.courselist{
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		&-item {
+			width: 100%;
+			border-radius: 14px;
+			background-color: #fff;
+			overflow: hidden;
+			margin-bottom: 10px;
+		}
+		&-con {
+			padding: 10px 10px 5px 10px;
+			font-size: 12px;
+			color: #777;
+		}
+		&-con-r{
+			flex: 1;
+			overflow: hidden;
+			.more-t {
+				flex: 1;
+				font-size: 14px;
+				color: #222;
+				display: inline;
+			}
+			image {
+				width: 20px;
+				height: 20px;
+			}
+			.btn_icon {
+				font-size: 14px;
+				color: #1677ff;
+				display: inline-flex;
+				align-items: center;
+			}
+		}
+		&-img {
+			width: 110px;
+			height: 70px;
+			border-radius: 10px;
+			overflow: hidden;
+			flex-shrink: 0;
+			margin-right: 10px;
+			position: relative;
+			image {
+				height: 100%;
+				width: 100%;
+			}
+			.status {
+				position: absolute;
+				top: 0;
+				left: 0;
+				z-index: 2;
+				height: 21px;
+				padding: 0 5px;
+				box-sizing: border-box;
+				line-height: 21px;
+				border-radius: 10px 0 10px 0;
+				text-align: center;
+				color: #fff;
+				background-color: #08ce36;
+			}
+		}
+		&-desc {
+			flex: 1;
+			margin-top: 7px;
+		}
+		&-con-timebox {
+			margin-top: 7px;
+			flex-wrap: wrap;
+			.acea-row {
+				margin-right: 12px;
+				margin-bottom: 5px;
+				flex-wrap: nowrap;
+			}
+			.icon {
+				margin-right: 5px;
+			}
+		}
+		&-footer {
+			padding: 5px;
+			font-size: 14px;
+			&-item {
+				flex: 1;
+				text-align: center;
+				color: #1677ff;
+				padding: 6px;
+				box-sizing: border-box;
+			}
+			.shishi {
+				border-left: 1px solid #f5f5f5;
+			}
+			.shuju {
+				border-radius: 5px;
+				border: 1px solid #1677ff;
+			}
+		}
+	}
+</style>

+ 180 - 0
pages/courseManage/course/index.vue

@@ -0,0 +1,180 @@
+<template>
+	<view>
+		<view class="training-camp">
+			<view class="training-camp-btn" @click="choose">请选择训练营</view>
+		</view>
+		<u-picker :show="show" :columns="columns" title="训练营选择" @confirm="confirm" @cancel="cancel"></u-picker>
+		<view class="container-body x-start" :style="{height: contentH}">
+			<view class="container-left">
+				<view class="classification active">全部</view>
+				<view class="classification">测试</view>
+			</view>
+			<view class="container-right">
+				<!-- <mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback"> -->
+					<view class="list">
+						<courseItem :from="'course'" :activeTab="0" v-for="i in 9" />
+					</view>
+				<!-- </mescroll-body> -->
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import courseItem from "../components/courseItem.vue"
+	export default {
+		components: {
+			courseItem
+		},
+		data() {
+			return {
+				contentH: 0,
+				show: false,
+				columns: [
+					['中国', '美国', '日本']
+				],
+				mescroll:null,
+				downOption: {
+					auto:false//不要自动加载
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'/static/images/empty.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			}
+		},
+		mounted() {
+			const windowHeight = uni.getSystemInfoSync().windowHeight
+			this.contentH = `calc(${windowHeight}px - 52px - 56px)`
+		},
+		methods: {
+			choose() {
+				this.show = true
+			},
+			cancel() {
+				this.show = false
+			},
+			confirm(e) {
+				console.log('confirm', e)
+				this.show = false
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				// //联网加载数据
+				// var that = this;
+				// var data={
+				// 	customerName:this.searchKey,
+				// 	pageNum: page.num,
+				// 	pageSize: page.size
+				// };
+				// uni.showLoading({
+				// 	title:"加载中..."
+				// })
+				// getMyCustomerList(data).then(res => {
+				// 	uni.hideLoading()
+				// 	if(res.code==200){
+				// 		//设置列表数据
+				// 		if (page.num == 1) {
+				// 			that.dataList = res.data.list; 
+							
+				// 		} else {
+				// 			that.dataList = that.dataList.concat(res.data.list);
+							 
+				// 		}
+				// 		that.mescroll.endBySize(res.data.list.length, res.data.total);
+						
+				// 	}else{
+				// 		uni.showToast({
+				// 			icon:'none',
+				// 			title: "请求失败",
+				// 		});
+				// 		that.dataList = null;
+				// 		that.mescroll.endErr();
+				// 	}
+				// });
+			},
+		}
+	}
+</script>
+
+<style>
+	page {
+		background-color: #f5f4f5;
+	}
+</style>
+<style lang="scss" scoped>
+	.training-camp {
+		padding: 10px;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #222222;
+		&-btn {
+			font-size: 15px;
+			width: 100%;
+			height: 32px;
+			line-height: 32px;
+			text-align: center;
+			background-color: #fff;
+			border-radius: 50px;
+			border: 1px solid #ccc;
+		}
+	}
+	.container-left {
+		flex-shrink: 0;
+		background-color: #fff;
+		width: 80px;
+		height: 100%;
+		overflow-y: auto;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #222222;
+		.active {
+			background-color: #f5f4f5;
+			font-weight: bold;
+			position: relative;
+			&::after {
+				content: "";
+				height: 15px;
+				width: 4px;
+				background-color: #1677ff;
+				position: absolute;
+				top: 50%;
+				left: 0;
+				transform: translateY(-50%);
+			}
+		}
+		.classification {
+			padding: 20px 16px;
+			box-sizing: border-box;
+		}
+	}
+	.container-right {
+		flex: 1;
+		height: 100%;
+		overflow-y: auto;
+		.list {
+			padding: 10px;
+			box-sizing: border-box;
+			width: 100%;
+		}
+	}
+</style>

+ 267 - 0
pages/courseManage/dataIndex/index.vue

@@ -0,0 +1,267 @@
+<!-- 数据组件页面 -->
+<template>
+	<view class="container">
+		<view class="topdata">
+			<view class="topdata-box">
+				<view>数据汇总</view>
+				<view class="x-bc">
+					<view class="topdata-item">
+						<view class="topdata-item-num"><text>0</text>人</view>
+						<view>会员总数</view>
+					</view>
+					<view class="topdata-item">
+						<view class="topdata-item-num"><text>0</text>人</view>
+						<view>今日新增会员</view>
+					</view>
+				</view>
+			</view>
+			<view class="searchbox">
+				<view class="searchbox-bar x-ac">
+					<view :class="queryParam.type == index ? 'searchbox-item searchbox-active':'searchbox-item'"
+						v-for="(item,index) in typeOption" :key="index" @click="handleType(index)">{{item.label}}</view>
+				</view>
+			</view>
+		</view>
+		<view class="statistics" :style="{height: contentH}">
+			<u-collapse :border='false' :value='collapseValue' @change="changeCollapse">
+				<u-collapse-item name="course">
+					<text slot="title" class="statistics-title">课程统计</text>
+					<text slot="value" class="statistics-slot-title">{{collapseValue.includes('course')?'收回':'展开'}}</text>
+					<text slot="right-icon">
+						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+					</text>
+					<view class="collapse-content x-ac">
+						<view class="collapse-content-item">
+							<view class="collapse-content-title">观看人数</view>
+							<view class="collapse-content-num"><text>0</text>人</view>
+							<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0</view>
+							<view v-show="queryParam.type == 0">昨天0</view>
+						</view>
+						<view class="collapse-content-item">
+							<view class="collapse-content-title">完播人数</view>
+							<view class="collapse-content-num"><text>0</text>人</view>
+							<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0</view>
+							<view v-show="queryParam.type == 0">昨天0</view>
+						</view>
+						<view class="collapse-content-item">
+							<view class="collapse-content-title">完播率</view>
+							<view class="collapse-content-num"><text>0</text>%</view>
+							<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0</view>
+							<view v-show="queryParam.type == 0">昨天0</view>
+						</view>
+					</view>
+				</u-collapse-item>
+				<u-collapse-item name="questions">
+					<text slot="title" class="statistics-title">答题统计</text>
+					<text slot="value" class="statistics-slot-title">{{collapseValue.includes('questions')?'收回':'展开'}}</text>
+					<text slot="right-icon">
+						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+					</text>
+					<view class="collapse-content x-ac">
+						<view class="collapse-content-item">
+							<view class="collapse-content-title">答题人数</view>
+							<view class="collapse-content-num"><text>0</text>人</view>
+							<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0</view>
+							<view v-show="queryParam.type == 0">昨天0</view>
+						</view>
+						<view class="collapse-content-item">
+							<view class="collapse-content-title">正确人数</view>
+							<view class="collapse-content-num"><text>0</text>人</view>
+							<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0</view>
+							<view v-show="queryParam.type == 0">昨天0</view>
+						</view>
+						<view class="collapse-content-item">
+							<view class="collapse-content-title">正确率</view>
+							<view class="collapse-content-num"><text>0</text>%</view>
+							<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0</view>
+							<view v-show="queryParam.type == 0">昨天0</view>
+						</view>
+					</view>
+				</u-collapse-item>
+				<u-collapse-item name="redenvelope">
+					<text slot="title" class="statistics-title">红包统计</text>
+					<text slot="value" class="statistics-slot-title">{{collapseValue.includes('redenvelope')?'收回':'展开'}}</text>
+					<text slot="right-icon">
+						<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+					</text>
+					<view>
+						<view class="collapse-content x-ac">
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">答题红包数</view>
+								<view class="collapse-content-num"><text>0</text>个</view>
+								<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0</view>
+								<view v-show="queryParam.type == 0">昨天0</view>
+							</view>
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">答题红包金额</view>
+								<view class="collapse-content-num"><text>0.00</text>元</view>
+								<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0.00</view>
+								<view v-show="queryParam.type == 0">昨天0.00</view>
+							</view>
+						</view>
+						<view class="collapse-content x-ac" style="padding: 8px 0;">
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">新会员奖励数</view>
+								<view class="collapse-content-num"><text>0</text>个</view>
+								<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0</view>
+								<view v-show="queryParam.type == 0">昨天0</view>
+							</view>
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">新会员奖励金额</view>
+								<view class="collapse-content-num"><text>0.00</text>元</view>
+								<view style="color: #1677ff;" v-show="queryParam.type == 0">较昨天持平0.00</view>
+								<view v-show="queryParam.type == 0">昨天0.00</view>
+							</view>
+						</view>
+					</view>
+				</u-collapse-item>
+			</u-collapse>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				typeOption: [{
+					label: '今日',
+					value: 0
+				}, {
+					label: '昨日',
+					value: 1
+				}, {
+					label: '本月',
+					value: 2
+				}, {
+					label: '自定义',
+					value: 3
+				}],
+				queryParam: {
+					type: 0
+				},
+				contentH: 0,
+				collapseValue:['course','questions','redenvelope']
+			}
+		},
+		mounted() {
+			const windowHeight = uni.getSystemInfoSync().windowHeight
+			this.contentH = `calc(${windowHeight}px - 180px - 56px)`
+		},
+		methods: {
+			handleType(type) {
+				this.queryParam.type = type
+			},
+			changeCollapse(e) {
+				this.collapseValue = e.filter(item=>item.status == 'open').map(it=>it.name)
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.container {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #222222;
+	}
+	.topdata {
+		padding-top: 25px;
+		background-color: rgb(216, 232, 255);
+
+		&-box {
+			padding: 12px;
+			margin: 0 12px 0 12px;
+			background-color: rgba(255, 255, 255, 0.5);
+			border-radius: 8px 8px 0 0;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #222222;
+		}
+
+		&-item {
+			width: 50%;
+			text-align: center;
+			padding: 8px;
+			box-sizing: border-box;
+
+			&-num {
+				color: #1677ff;
+				text {
+					font-family: DIN, DIN;
+					font-weight: bold;
+					font-size: 25px;
+				}
+			}
+		}
+
+		.searchbox {
+			background-color: #fff;
+			border-radius: 8rpx 8rpx 0 0;
+			padding: 15px;
+
+			&-item {
+				height: 23px;
+				line-height: 23px;
+				width: 65px;
+				background: #f5f5f5;
+				text-align: center;
+				border-radius: 5px;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 12px;
+				color: #888;
+			}
+
+			&-active {
+				color: #fff !important;
+				background-color: #1677ff !important;
+			}
+		}
+	}
+	.statistics {
+		background-color: #fff;
+		overflow-y: auto;
+		box-sizing: border-box;
+		&-title {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: bold;
+			font-size: 16px;
+			color: #222222;
+		}
+		&-slot-title {
+			font-size: 12px;
+			color: #1677ff;
+		}
+		.collapse-content {
+			margin: 0 -8px -8rpx 0;
+			&-item {
+				flex: 1;
+				padding: 12px;
+				box-sizing: border-box;
+				border-radius: 10px;
+				background: #f5f5f5;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 10px;
+				color: #222222;
+				margin: 0 8px 8rpx 0;
+			}
+			&-title {
+				font-size: 14px;
+				margin-bottom: 10px;
+			}
+			&-num {
+				color: #1677ff;
+				font-size: 10px;
+				text {
+					font-family: DIN, DIN;
+					font-weight: bold;
+					font-size: 25px;
+				}
+			}
+		}
+	}
+</style>

+ 87 - 0
pages/courseManage/index.vue

@@ -0,0 +1,87 @@
+<template>
+	<view>
+		<view class="app-wrapper" :style="{height: bodyHeight}">
+			<dataIndex v-if="templateView == 'dataIndex'"></dataIndex>
+			<liveIndex v-show="templateView == 'liveIndex'"></liveIndex>
+			<courseIndex v-show="templateView == 'courseIndex'"></courseIndex>
+			<vipIndex v-show="templateView == 'vipIndex'"></vipIndex>
+		</view>
+		<view class="myTabBar x-f x-bc">
+			<view class="myTabBar-item x-f y-f" @click="handleTab('dataIndex')">
+				<image src="../../static/logo.png" mode="aspectFill"></image>
+				<text>数据</text>
+			</view>
+			<view class="myTabBar-item x-f y-f" @click="handleTab('liveIndex')">
+				<image src="../../static/logo.png" mode="aspectFill"></image>
+				<text>直播课</text>
+			</view>
+			<view class="myTabBar-item x-f y-f" @click="handleTab('courseIndex')">
+				<image src="../../static/logo.png" mode="aspectFill"></image>
+				<text>训练营</text>
+			</view>
+			<view class="myTabBar-item x-f y-f" @click="handleTab('vipIndex')">
+				<image src="../../static/logo.png" mode="aspectFill"></image>
+				<text>会员</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import dataIndex from "./dataIndex/index.vue"
+	import liveIndex from "./live/index.vue"
+	import courseIndex from "./course/index.vue"
+	import vipIndex from "./vip/index.vue"
+	export default {
+		components: {
+			dataIndex,
+			liveIndex,
+			courseIndex,
+			vipIndex
+		},
+		data() {
+			return {
+				templateView: 'vipIndex',
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				windowHeight: uni.getSystemInfoSync().windowHeight,
+				bodyHeight: 0,
+			}
+		},
+		onLoad() {
+			this.bodyHeight = `calc(${this.windowHeight}px - 56px)` 
+			uni.setNavigationBarTitle({
+				title: '数据'
+			});
+		},
+		methods: {
+			handleTab(tem) {
+				this.templateView = tem
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.app-wrapper {
+		width: 100%;
+	}
+	.myTabBar {
+		height: 56px;
+		border-top: 1px solid #f5f5f5;
+		box-sizing: border-box;
+		width: 100%;
+		background-color: #fff;
+		position: fixed;
+		bottom: var(--window-bottom);
+		left: 0;
+		font-size: 10px;
+		image {
+			width: 24px;
+			height: 24px;
+			margin-bottom: 3px;
+		}
+		&-item {
+			flex: 1;
+		}
+	}
+</style>

+ 205 - 0
pages/courseManage/live/index.vue

@@ -0,0 +1,205 @@
+<template>
+	<view class="container">
+		<view class="headbox">
+			<view class="headnav x-bc">
+				<view :class="activeTab == 0 ? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(0)">
+					<view>直播计划</view>
+					<view class="headnav-num">3</view>
+					<image src="@/static/images/idle.png" mode="aspectFill"></image>
+				</view>
+				<view :class="activeTab == 1? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(1)">
+					<view>今日直播</view>
+					<view class="headnav-num">3</view>
+					<image src="@/static/images/streaming.png" mode="aspectFill"></image>
+				</view>
+				<view :class="activeTab == 2 ? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(2)">
+					<view>往日直播</view>
+					<view class="headnav-num">3</view>
+					<image src="@/static/images/finished.png" mode="aspectFill"></image>
+				</view>
+			</view>
+			<view class="x-bc">
+				<view :class="searchbarNav == index ? 'searchbar x-c searchbar-active':'searchbar x-c'" v-for="(item,index) in searchbar" :key="index" @click="clickSearchbar(index)">
+					<text>{{item.name}}</text><u-icon class="arrow-down" name="arrow-down" :color="searchbarNav == index ?'#1677ff':'#999'" size="12"></u-icon>
+				</view>
+			</view>
+		</view>
+		<view class="coursebox" :style="{height: contentH}">
+			<!-- <mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback"> -->
+				<view class="courselist">
+					<courseItem :activeTab="activeTab" />
+				</view>
+			<!-- </mescroll-body> -->
+		</view>
+	</view>
+</template>
+
+<script>
+	import courseItem from "../components/courseItem.vue"
+	export default {
+		components: {
+			courseItem
+		},
+		data() {
+			return {
+				contentH: 0,
+				activeTab: 0,
+				searchbarNav: 'colse',
+				searchbar: [{
+					name: '训练营-营期'
+				},
+				{
+					name: '课程状态'
+				}],
+				mescroll:null,
+				downOption: {
+					auto:false//不要自动加载
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'/static/images/empty.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			}
+		},
+		mounted() {
+			const windowHeight = uni.getSystemInfoSync().windowHeight
+			this.contentH = `calc(${windowHeight}px - 132px - 56px)`
+		},
+		methods: {
+			handleNav(type) {
+				this.activeTab = type
+			},
+			clickSearchbar(type) {
+				this.searchbarNav = type == this.searchbarNav ? 'colse' : type
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				// //联网加载数据
+				// var that = this;
+				// var data={
+				// 	customerName:this.searchKey,
+				// 	pageNum: page.num,
+				// 	pageSize: page.size
+				// };
+				// uni.showLoading({
+				// 	title:"加载中..."
+				// })
+				// getMyCustomerList(data).then(res => {
+				// 	uni.hideLoading()
+				// 	if(res.code==200){
+				// 		//设置列表数据
+				// 		if (page.num == 1) {
+				// 			that.dataList = res.data.list; 
+							
+				// 		} else {
+				// 			that.dataList = that.dataList.concat(res.data.list);
+							 
+				// 		}
+				// 		that.mescroll.endBySize(res.data.list.length, res.data.total);
+						
+				// 	}else{
+				// 		uni.showToast({
+				// 			icon:'none',
+				// 			title: "请求失败",
+				// 		});
+				// 		that.dataList = null;
+				// 		that.mescroll.endErr();
+				// 	}
+				// });
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.container {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #222;
+	}
+	.headbox {
+		background-color: #fff;
+	}
+	.headnav {
+		padding: 15px 12px;
+		margin: 0 -10px -10px 0;
+		box-sizing: border-box;
+		image {
+			height: 60px;
+			width: 50px;
+			position: absolute;
+			z-index: 0;
+			bottom: 0;
+			right: 0;
+			display: none;
+		}
+		&-item {
+			flex: 1;
+			font-size: 16px;
+			padding: 10px;
+			border-radius: 10px;
+			background: #f5f5f5;
+			margin: 0 10px 10px 0;
+			position: relative;
+			z-index: 1;
+			overflow: hidden;
+			color: #555;
+		}
+		&-active {
+			background-color:  rgb(231, 241, 255) !important;
+			.headnav-num {
+				color: #1677ff !important;
+			}
+			image {
+				display: block !important;
+			}
+		}
+		&-num {
+			font-family: DIN, DIN;
+			font-weight: bold;
+			font-size: 25px;
+			margin: 5px 0;
+		}
+	}
+	.searchbar {
+		flex: 1;
+		padding-bottom: 10px;
+		.arrow-down {
+			margin-left: 5px;
+		}
+		&-active {
+			color: #1677ff !important;
+			.arrow-down {
+				transform: rotate(180deg);
+			}
+		}
+	}
+	.coursebox {
+		position: relative;
+		overflow-y: auto;
+		box-sizing: border-box;
+	}
+	.courselist {
+		padding: 12px;
+		box-sizing: border-box;
+		
+	}
+</style>

+ 526 - 0
pages/courseManage/statistics.vue

@@ -0,0 +1,526 @@
+<template>
+	<view class="container">
+		<image class="topbg" src="https://sg-mmyy-oss.yjfzy.com/sgs/image/20241102/e07b38daf749cb02e9f5ce69c57b44ea.png" mode="scaleToFill"></image>
+		<view class="container-body">
+			<view class="coursebox">
+				<view class="coursebox-info">
+					<view class="status">进行中</view>
+					<!-- <view class="status" style="background-color: #ff4746;">已结束</view> -->
+					<view class="coursebox-name">
+						<text class="more-t">7.明医有话说-杜老师给您讲讲抑郁杜老师给您讲讲抑郁</text>
+						<view class="btn_icon">ID
+							<image src="@/static/images/copy_icon.png" mode="aspectFill"></image>
+						</view>
+					</view>
+					<!-- <view class="coursebox-name">7.明医有话说-杜老师给您讲讲抑郁杜老师给您讲讲抑郁</view> -->
+					<view style="margin-top: 5px;">明医有话说-七天先导课(长期有效,自行选择)简约课程</view>
+					<view class="coursebox-time x-start">
+						<view class="coursebox-time-item" style="margin-right: 14px;">
+							<view>直播时间</view>
+							<view class="coursebox-time-t">2024-08-20 00:00:00-2029-09-30 23:59:59</view>
+						</view>
+						<view class="coursebox-time-item duration">
+							<view>课程时长</view>
+							<view class="coursebox-time-t">12分18秒</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="statistics">
+				<u-tabs :list="list1" :current='current' :scrollable="false" :lineWidth="40" lineColor="#1677ff" :activeStyle="activeStyle" :inactiveStyle="inactiveStyle" @click="clickTab"></u-tabs>
+				<u-collapse :border='false' :value='collapseValue' @change="changeCollapse" v-if="current == 0">
+					<u-collapse-item name="live">
+						<view slot="title" class="statistics-title">直播数据<text class="statistics-title-tip">2分钟自动更新</text></view>
+						<text slot="value" class="statistics-slot-title">{{collapseValue.includes('live')?'收回':'展开'}}</text>
+						<text slot="right-icon">
+							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+						</text>
+						<view class="collapse-content x-ac">
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">观看人数</view>
+								<view class="collapse-content-num"><text>0</text>人</view>
+							</view>
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">完播人数</view>
+								<view class="collapse-content-num"><text>0</text>人</view>
+							</view>
+							<view class="collapse-content-item">
+								<view class="collapse-content-title">完播率</view>
+								<view class="collapse-content-num"><text>0</text>%</view>
+							</view>
+						</view>
+					</u-collapse-item>
+					<u-collapse-item name="questions">
+						<text slot="title" class="statistics-title">答题数据<text class="statistics-title-tip">2分钟自动更新</text></text>
+						<text slot="value" class="statistics-slot-title">{{collapseValue.includes('questions')?'收回':'展开'}}</text>
+						<text slot="right-icon">
+							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+						</text>
+						<view class="collapse-content">
+							<view class="x-ac">
+								<view class="collapse-content-item">
+									<view class="collapse-content-title">答题人数</view>
+									<view class="collapse-content-num"><text>0</text>人</view>
+								</view>
+								<view class="collapse-content-item">
+									<view class="collapse-content-title">正确人数</view>
+									<view class="collapse-content-num"><text>0</text>人</view>
+								</view>
+								<view class="collapse-content-item">
+									<view class="collapse-content-title">答题红包数</view>
+									<view class="collapse-content-num"><text>0</text>个</view>
+								</view>
+							</view>
+							<view class="redenvelope x-bc">
+								<view class="x-f">
+									<image src="@/static/images/redenvelope.png" mode="aspectFill"></image>
+									<text>答题红包金额</text>
+								</view>
+								<view class="collapse-content-num"><text>0.00</text>元</view>
+							</view>
+						</view>
+					</u-collapse-item>
+					<u-collapse-item name="funnelplot">
+						<text slot="title" class="statistics-title">转化漏斗图<text class="statistics-title-tip">2分钟自动更新</text></text>
+						<text slot="value" class="statistics-slot-title">{{collapseValue.includes('funnelplot')?'收回':'展开'}}</text>
+						<text slot="right-icon">
+							<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+						</text>
+						<view>
+							ddd
+						</view>
+					</u-collapse-item>
+				</u-collapse>
+			</view>
+			<!-- 参与记录 -->
+			<view>
+				<view class="participate-search">
+					<view class="x-bc">
+						<u-search placeholder="会员ID、昵称、姓名、手机" v-model="keyword" :showAction="false" height="30px"></u-search>
+						<u-button type="primary" class="refresh" color='#1677ff' size="small" :disabled="disabled" text="刷新"></u-button>
+					</view>
+					<view class="x-bc">
+						<u-tabs :list="list2" :current='currentType' :lineWidth="40" lineColor="#1677ff" :activeStyle="activeStyle" :inactiveStyle="inactiveStyle" @click="clickTypeTab"></u-tabs>
+						<view class="participate-order x-f">
+							<image src="@/static/images/order_icon2.png" mode="aspectFill" v-if="searchTypeIndex == 3"></image>
+							<image src="@/static/images/order_icon.png" mode="aspectFill" v-else></image>
+							<picker @change="bindPickerChange" :value="searchTypeIndex" :range="typeArray">
+								{{typeoption[searchTypeIndex]}}
+							</picker>
+						</view>
+					</view>
+				</view>
+				<!-- <mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback"> -->
+					<view class="list">
+						<view class="list-item">
+							<view class="list-item-head x-bc">
+								<view class="x-f" style="flex: 1;overflow: hidden;">
+									<u-avatar src='http://pic2.sc.chinaz.com/Files/pic/pic9/202002/hpic2119_s.jpg'></u-avatar>
+									<view class="list-item-head-l">
+										<view style="flex: 1;overflow: hidden;display: flex;">
+											<text class="list-item-name one-t">7.明医有话说-杜老师给您讲讲抑郁杜老师给您讲讲抑郁</text>
+											<image class="list-item-copy" src="@/static/images/copy_icon.png" mode="aspectFill"></image>
+										</view>
+										<view class="list-item-re">注册时间:2022-12-12</view>
+									</view>
+								</view>
+								<image class="phone" src="@/static/logo.png" mode="aspectFill"></image>
+							</view>
+							<view class="list-item-desc">
+								<view class="taglist">
+									<view>测试</view>
+								</view>
+								<view style="margin-top: 5px;">
+									<text class="label">观看次数</text><text class="value-num">1</text>
+									<text class="label">完播次数</text><text class="value-num">2</text>
+									<text class="label">累计时长</text><text class="value-num">04分50秒</text>
+								</view>
+								<view style="margin-top: 5px;"><text class="label">红包领取状态</text><text class="value-num">1</text></view>
+								<view style="margin-top: 5px;"><text class="label">观看时间</text><text class="value-num">2023-12-01 12:33</text></view>
+							</view>
+							<view class="list-item-footer x-f">
+								<view class="list-item-footer-btn x-f">改姓名</view>
+								<view class="list-item-footer-btn x-f">改备注</view>
+								<view class="list-item-footer-btn footer-tagbtn x-f">改标签</view>
+							</view>
+						</view>
+					</view>
+				<!-- </mescroll-body> -->
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		data() {
+			return {
+				list1: [{
+					name: '课程数据',
+				}, {
+					name: '参与记录',
+				}, {
+					name: '活动节目'
+				}],
+				current: 1,
+				list2: [{
+					name: '答题正确',
+				}, {
+					name: '仅播完',
+				}, {
+					name: '未完播'
+				}, {
+					name: '未播放'
+				}],
+				currentType: 0,
+				activeStyle:{
+					color: '#1677ff',
+					fontSize: '14px',
+					fontWeight: 'bold'
+				},
+				inactiveStyle:{
+					fontSize: '14px'
+				},
+				collapseValue:['live','questions','funnelplot'],
+				keyword: '',
+				disabled: false,
+				searchTypeIndex: 0,
+				typeArray: ['按看课时间从晚到早', '按完播时间从晚到早', '按观看次数从多到少', '按注册时间从晚到早','按会员姓名0-9-A-Z'],
+				typeoption: ['看课时间', '完播时间', '观看次数', '注册时间','会员姓名'],
+				mescroll:null,
+				downOption: {
+					auto:false//不要自动加载
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'/static/images/empty.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			}
+		},
+		onLoad() {
+			uni.setNavigationBarTitle({
+				title: '数据统计'
+			});
+		},
+		methods: {
+			clickTab(e) {
+				this.current = e.index
+			},
+			clickTypeTab(e) {
+				this.currentType = e.index
+			},
+			bindPickerChange(e) {
+				console.log('picker发送选择改变,携带值为', e.detail.value)
+				this.searchTypeIndex = e.detail.value
+			},
+			changeCollapse(e) {
+				this.collapseValue = e.filter(item=>item.status == 'open').map(it=>it.name)
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				// //联网加载数据
+				// var that = this;
+				// var data={
+				// 	customerName:this.searchKey,
+				// 	pageNum: page.num,
+				// 	pageSize: page.size
+				// };
+				// uni.showLoading({
+				// 	title:"加载中..."
+				// })
+				// getMyCustomerList(data).then(res => {
+				// 	uni.hideLoading()
+				// 	if(res.code==200){
+				// 		//设置列表数据
+				// 		if (page.num == 1) {
+				// 			that.dataList = res.data.list; 
+							
+				// 		} else {
+				// 			that.dataList = that.dataList.concat(res.data.list);
+							 
+				// 		}
+				// 		that.mescroll.endBySize(res.data.list.length, res.data.total);
+						
+				// 	}else{
+				// 		uni.showToast({
+				// 			icon:'none',
+				// 			title: "请求失败",
+				// 		});
+				// 		that.dataList = null;
+				// 		that.mescroll.endErr();
+				// 	}
+				// });
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.container {
+	position: relative;
+	z-index: 2;
+	font-family: PingFang SC, PingFang SC;
+	font-weight: 400;
+	font-size: 14px;
+	color: #222;
+	.topbg {
+		position: absolute;
+		z-index: -1;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 210px;
+	}
+	&-body {
+		
+	}
+	.coursebox {
+		padding: 120px 50rpx 20px 50rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #999;
+		.status {
+			position: absolute;
+			top: 0;
+			right: 0;
+			z-index: 2;
+			height: 30px;
+			padding: 0 8px;
+			box-sizing: border-box;
+			line-height: 30px;
+			border-radius: 0 12px 0 12px;
+			text-align: center;
+			color: #fff;
+			background-color: #08ce36;
+		}
+		&-info {
+			padding: 12px;
+			background-color: rgba(255,255,255,0.88);
+			border-radius: 12px;
+			overflow: hidden;
+			position: relative;
+		}
+		&-name {
+			color: #222;
+			font-weight: bold;
+			font-size: 16px;
+			padding-right: 50px;
+			.more-t {
+				flex: 1;
+				font-size: 14px;
+				color: #222;
+				display: inline;
+			}
+		}
+		&-time-item {
+			flex: 1;
+			margin-top: 5px;
+		}
+		&-time-t {
+			color: #222;
+			font-weight: bold;
+			margin-top: 5px;
+			font-size: 12px;
+		}
+		.duration {
+			position: relative;
+			padding-left: 14px;
+			&::after {
+				content: "";
+				height: 30px;
+				width: 1px;
+				background-color: #f5f5f5;
+				position: absolute;
+				left: 0;
+				top: 5px;
+			}
+		}
+	}
+}
+.statistics {
+	background-color: #fff;
+	&-title {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: bold;
+		font-size: 16px;
+		color: #222222;
+	}
+	&-title-tip {
+		font-weight: 400;
+		font-size: 11px;
+		color: #999;
+		padding-left: 10px;
+	}
+	&-slot-title {
+		font-size: 12px;
+		color: #1677ff;
+	}
+	.collapse-content {
+		margin: 0 -8px -8rpx 0;
+		&-item {
+			flex: 1;
+			padding: 12px;
+			box-sizing: border-box;
+			border-radius: 10px;
+			background: #f5f5f5;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 10px;
+			color: #222222;
+			margin: 0 8px 8rpx 0;
+		}
+		&-title {
+			font-size: 14px;
+			margin-bottom: 10px;
+		}
+		&-num {
+			color: #1677ff;
+			font-size: 10px;
+			text {
+				font-family: DIN, DIN;
+				font-weight: bold;
+				font-size: 25px;
+			}
+		}
+	}
+	.redenvelope {
+		background-color: #f5f5f5;
+		margin-right: 8px;
+		margin-top: 4px;
+		padding: 15px;
+		box-sizing: border-box;
+		border-radius: 10px;
+		color: #222222;
+		image {
+			width: 50px;
+			height: 50px;
+			margin-right: 10px;
+		}
+	}
+}
+.participate-search {
+	background-color: #fff;
+	padding: 10px 15px;
+	.refresh {
+		height: 26px;
+		min-width: 40px;
+		width: 40px;
+		padding: 0;
+		display: inline-flex;
+		margin-left: 15px;
+		border-radius: 5px;
+		overflow: hidden;
+	}
+}
+.participate-order {
+	font-size: 12px;
+	image {
+		width: 15px;
+		height: 15px;
+	}
+}
+.btn_icon {
+	font-weight: 400;
+	font-size: 14px;
+	color: #1677ff;
+	display: inline-flex;
+	align-items: center;
+	margin-left: 5px;
+	image {
+		width: 20px;
+		height: 20px;
+	}
+}
+.list {
+	padding: 20px 10px;
+}
+.list-item{
+	padding: 10px;
+	margin-bottom: 10px;
+	background-color: #fff;
+	border-radius: 12px;
+	&-head {
+		.phone {
+			flex-shrink: 0;
+			width: 30px;
+			height: 30px;
+		}
+		&-l {
+			flex: 1;
+			overflow: hidden;
+			margin-left: 10px;
+			margin-right: 10px;
+		}
+	}
+	&-copy {
+		width: 20px;
+		height: 20px;
+	}
+	&-re {
+		font-size: 10px;
+		margin-top: 5px;
+	}
+	&-desc {
+		padding: 5px;
+		color: #999;
+		font-size: 12px;
+	}
+	.label {
+		margin-right: 4px;
+	}
+	.value-num {
+		margin-right: 18px;
+		color: #222;
+		font-weight: bold;
+	}
+	.taglist {
+		display: flex;
+		align-items: center;
+		flex-wrap: wrap;
+		color: #555;
+		padding-top: 5px;
+		view {
+			margin: 0 5px 5px 0;
+		}
+	}
+	&-footer {
+		justify-content: flex-end;
+		padding: 6px 0;
+		.footer-tagbtn {
+			color: #1677ff;
+			background-color: #e7f2fe;
+			border: 1px solid #c9e1fb;
+		}
+		&-btn {
+			height: 26px;
+			padding: 0 10px;
+			margin-left: 10px;
+			background-color: #f5f5f5;
+			border-radius: 25px;
+			font-weight: 400;
+			font-size: 10px;
+			line-height: 26px;
+			border: 1px solid #f5f5f5;
+			box-sizing: border-box;
+		}
+	}
+}
+</style>

+ 378 - 0
pages/courseManage/vip/index.vue

@@ -0,0 +1,378 @@
+<template>
+	<view class="container">
+		<view class="headbox">
+			<u-subsection class="subsection" :list="list" :current="current" bgColor="#e7f1fe" activeColor="#1677ff" :fontSize="15" :bold="false" @change="sectionChange"></u-subsection>
+			<view style="margin-top: 10px;">
+				<u-search placeholder="会员ID、昵称、姓名、手机" v-model="keyword" :showAction="false" height="30px"></u-search>
+			</view>
+			<view class="x-bc">
+				<u-tabs :list="list2" :current='currentType' :lineWidth="40" lineColor="#1677ff" :activeStyle="activeStyle" :inactiveStyle="inactiveStyle" @click="clickTypeTab"></u-tabs>
+				<view class="participate-order x-f">
+					<image src="@/static/images/order_icon2.png" mode="aspectFill" v-if="searchTypeIndex == 0 || searchTypeIndex == 2"></image>
+					<image src="@/static/images/order_icon.png" mode="aspectFill" v-else></image>
+					<picker @change="bindPickerChange" :value="searchTypeIndex" :range="typeArray">
+						{{typeoption[searchTypeIndex]}}
+					</picker>
+				</view>
+			</view>
+			<view class="tagbox x-bc">
+				<view class="tagbox-left x-f">
+					<view class="x-f" @click="openPop('search')">{{array[queryParam.typeIndex].name}}<u-icon name="arrow-down-fill" color="#2979ff" size="11" style="margin: 0 3px;"></u-icon></view>
+					<view class="tagbox-list x-f">
+						<view class="tagbox-item x-f">未打标签</view>
+						<view class="tagbox-item x-f">未打标签</view>
+					</view>
+				</view>
+				<view class="tagbox-right x-f" @click="openPop('tag')">筛选<u-icon name="arrow-down" color="#1677ff" size="12"></u-icon></view>
+			</view>
+		</view>
+		<!-- 搜索选择弹窗/标签筛选 -->
+		<u-popup :show="showPop" :round="12" @close="closePop" class="model" :zIndex="10076">
+			<view class="popbox">
+				<view class="popbox-head">
+					<u-icon class="close-circle" name="close-circle" color="#ccc" size="24" @click="closePop"></u-icon>
+					{{popTitle}}
+				</view>
+				<view class="popbox-body">
+					<view class="radiobox" v-show="popTitle == '搜索选择'">
+						<label class="radiobox-item x-bc mbline" v-for="(item, index) in array" :key="item.value" @click="bindTypeChange(index)">
+							<view>{{item.name}}</view>
+							<radio :value="item.value" :checked="index === typeIndex" style="transform:scale(0.75)" />
+						</label>
+					</view>
+					<view class="tagbox-list x-f">
+						<view class="tagbox-item x-f" @click="chooseTag">未打标签</view>
+						<view class="tagbox-item x-f tag-active">未打标签</view>
+					</view>
+				</view>
+				<view class="popbox-footer x-bc">
+					<button class="popbox-footer-btn" @click="resetPop" v-show="popTitle == '标签筛选'">重置</button>
+					<button class="popbox-footer-btn" @click="closePop" v-show="popTitle == '搜索选择'">取消</button>
+					<button class="popbox-footer-btn con-btn" @click="confirmPop">确定</button>
+				</view>
+			</view>
+		</u-popup>
+		<image class="invite-member" src="@/static/images/invite-member-icon.png" mode="aspectFill" @click="vipInvite"></image>
+		<!-- 邀请弹窗 -->
+		<u-popup :show="invitePop" :round="12" @close="invitePop = false" :zIndex="10074">
+			<view class="popbox">
+				<view class="popbox-head">
+					<u-icon class="close-circle" name="close-circle" color="#ccc" size="24" @click="invitePop = false"></u-icon>
+					分享方式
+				</view>
+				<view class="popbox-body">
+					<view class="choosetitle x-bc">
+						<view>选择标签</view>
+						<view class="x-f" style="color:#1677ff;" @click="openPop('tag')">
+							<u-icon name="plus" color="#1677ff" size="14" style="margin-right: 5px;"></u-icon>添加标签</view>
+					</view>
+					<view class="invitetip">选择标签,当会员注册成功后,即可自动打标签</view>
+					<!-- <view class="tagbox-list x-f" style="margin-top: 10px;margin-left: 0px;">
+						<view class="tagbox-item x-f" @click="chooseTag">未打标签</view>
+						<view class="tagbox-item x-f tag-active">未打标签</view>
+					</view> -->
+					<view class="x-bc" style="margin-top: 30px;">
+						<view class="sharePop-item y-f">
+							<image src="@/static/images/poster_icon.png" mode="aspectFill"></image>
+							<view style="font-weight: bold;margin-bottom: 4px;">生成海报</view>
+							<view style="font-size: 12px;color: #888;">保存海报美观宣传</view>
+						</view>
+						<view class="sharePop-item y-f" @click="copyLink">
+							<image src="@/static/images/link_icon.png" mode="aspectFill"></image>
+							<view style="font-weight: bold;margin-bottom: 4px;">复制链接</view>
+							<view style="font-size: 12px;color: #888;">生成链接一键复制</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+		<!-- 设置链接有效时长弹窗 -->
+		<u-modal :show="setTimeShow"content='content' class="model" @confirm="confirmTime">
+			<view class="setTimebox">
+				<view class="timetip">不传默认以系统参数为准</view>
+				<view class="x-f">
+					<text style="margin-right: 20px;">链接有效时长(分钟)</text>
+					<u-input
+						fontSize="14px"
+						placeholder="链接有效时长"
+						border="none"
+						v-model="time"
+						maxlength="5"
+					  ></u-input>
+				</view>
+			</view>
+		</u-modal>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				list: [{name: '会员(0)'}, {name: '小黑屋(0)'}],
+				current: 0,
+				keyword: "",
+				list2: [{
+					name: '全部',
+				}, {
+					name: '今日新增',
+				}, {
+					name: '今日完播'
+				}, {
+					name: '未看过课'
+				}],
+				currentType: 0,
+				activeStyle:{
+					color: '#1677ff',
+					fontSize: '14px',
+					fontWeight: 'bold'
+				},
+				inactiveStyle:{
+					fontSize: '14px'
+				},
+				searchTypeIndex: 0,
+				typeArray: ['连续缺课天数多到少', '连续缺课天数少到多', '按注册时间晚到早','会员姓名0-9-A-Z'],
+				typeoption: ['连续缺课', '连续缺课', '注册时间','会员姓名'],
+				array: [{
+					value: '0',
+					name: '关联搜索',
+				},{
+					value: '1',
+					name: '精准搜索'
+				}],
+				typeIndex: 0,
+				popTitle: '搜索选择',
+				showPop: false,
+				queryParam: {
+					typeIndex: 0,
+				},
+				mescroll:null,
+				downOption: {
+					auto:false//不要自动加载
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'/static/images/empty.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: [],
+				invitePop: false,
+				setTimeShow: false,
+				time: "",
+			}
+		},
+		onLoad() {
+			uni.setNavigationBarTitle({
+				title: '数据统计'
+			});
+		},
+		methods: {
+			sectionChange(index) {
+				this.current = index;
+			},
+			clickTypeTab(e) {
+				this.currentType = e.index
+			},
+			bindPickerChange(e) {
+				console.log('picker发送选择改变,携带值为', e.detail.value)
+				this.searchTypeIndex = e.detail.value
+			},
+			openPop(type) {
+				this.popTitle = type == 'search' ? '搜索选择' : type == 'tag' ?'标签筛选' : ''
+				this.typeIndex = this.queryParam.typeIndex
+				this.showPop = true
+			},
+			closePop() {
+				this.showPop = false
+			},
+			resetPop() {
+				
+			},
+			bindTypeChange(i) {
+				this.typeIndex = i
+			},
+			confirmPop() {
+				this.queryParam.typeIndex = this.typeIndex
+				this.showPop = false
+			},
+			chooseTag() {
+				
+			},
+			vipInvite() {
+				this.invitePop = true
+			},
+			copyLink(){
+				this.setTimeShow = true
+			},
+			confirmTime() {
+				this.setTimeShow = false
+				this.showShare = false
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	::v-deep {
+		.model .u-fade-enter-active {
+			z-index: 10075 !important;
+		}
+	}
+	.container {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #222222;
+	}
+	.setTimebox {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+	}
+	.timetip {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #2979ff;
+		text-align: center;
+		margin-bottom: 5px;
+	}
+	.popbox{
+		background-color: #fff;
+		border-radius: 12px;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 14px;
+		color: #333;
+		&-head {
+			padding: 15px;
+			font-weight: bold;
+			font-size: 15px;
+			text-align: center;
+			position: relative;
+		}
+		.close-circle {
+			position: absolute;
+			right: 10px;
+			top: 50%;
+			transform: translateY(-50%);
+		}
+		&-body {
+			padding: 10px 15px;
+		}
+		.radiobox {
+			&-item{
+				padding: 10px 0;
+				border-bottom: 1px solid #f5f5f5;
+				&:last-child {
+					border-bottom: none;
+				}
+			}
+		}
+		&-footer {
+			padding: 15px 0;
+		}
+		&-footer-btn {
+			flex: 1;
+			height: 44px;
+			line-height: 44px;
+			margin: 0 10px;
+			border-radius: 50px;
+			border: none;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #333;
+			&::after {
+				border: none;
+			}
+		}
+		.con-btn {
+			background-color: #1677ff;
+			color: #fff;
+		}
+		.choosetitle {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 15px;
+			color: #333;
+		}
+		.invitetip {
+			margin-top: 10px;
+			background-color: #ebf5fb;
+			color: #1677ff;
+			padding: 5px 10px;
+			border-radius: 5px;
+		}
+		.sharePop-item {
+			padding: 0 10px;
+			box-sizing: border-box;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			display: inline-flex !important;
+			image {
+				height: 48px;
+				width: 48px;
+				margin-bottom: 10px;
+			}
+		}
+	}
+	.headbox {
+		padding: 10px;
+		background-color: #fff;
+		.subsection {
+			height: 45px;
+			padding: 4px;
+		}
+		.participate-order {
+			font-size: 12px;
+			image {
+				width: 15px;
+				height: 15px;
+			}
+		}
+	}
+	.tag-active {
+		background-color: #ffeceb !important;
+		color: #f93e3e !important;
+		border: 1px solid #f93e3e !important;
+	}
+	.tagbox {
+		padding: 10px 0;
+		font-size: 12px;
+		color: #1677ff;
+		&-list {
+			margin: 0 0 -6px 6px;
+			flex-wrap: wrap;
+		}
+		&-item {
+			height: 26px;
+			padding: 0 8px;
+			margin: 0 6px 6px 0;
+			border-radius: 4px;
+			background-color: #f5f5f5;
+			color: #999;
+			border: 1px solid #f5f5f5;
+			box-sizing: border-box;
+			font-size: 12px;
+		}
+	}
+	.invite-member {
+		height: 55px;
+		width: 50px;
+		position: fixed;
+		bottom: 80px;
+		right: 10px;
+		cursor: pointer;
+	}
+</style>

+ 4 - 0
pages/user/index.vue

@@ -40,6 +40,10 @@
 						<image src="../../static/images/menu_info.png"></image>
 						<view class="m-name">课程群发SOP</view>
 					</view> -->
+					<view class="menu-item" @click="navTo('/pages/courseManage/index')">
+						<image src="../../static/images/menu_info.png"></image>
+						<view class="m-name">看课管理</view>
+					</view>
 				</view>
 				
 			</view>

BIN
static/images/copy_icon.png


BIN
static/images/down_icon.png


BIN
static/images/finished.png


BIN
static/images/idle.png


BIN
static/images/invite-member-icon.png


BIN
static/images/link_icon.png


BIN
static/images/order_icon.png


BIN
static/images/order_icon2.png


BIN
static/images/poster_icon.png


BIN
static/images/redenvelope.png


BIN
static/images/streaming.png


BIN
static/images/time_icon.png