Kaynağa Gözat

Merge branch 'master' into feature-mycourse

chen 3 yıl önce
ebeveyn
işleme
960178d8a1

+ 3 - 1
common/api.js

@@ -6,6 +6,7 @@ import wxpay from './httpList/wxpay.js'
 import system from './httpList/system.js'
 import goods from './httpList/goods.js'
 import business from './httpList/business.js'
+import course from './httpList/course.js'
 export default {
 	...login,
 	...polyvVideo,
@@ -14,5 +15,6 @@ export default {
 	...system,
 	...wxpay,
 	...goods,
-	...business
+	...business,
+	...course
 }

+ 14 - 0
common/httpList/course.js

@@ -0,0 +1,14 @@
+import {
+	myRequest
+} from '../request.js'
+export default {
+	menuList(data) {
+		return myRequest({
+			url: '/app/common/course/menuList',
+			method: 'get',
+			data: data,
+			noToken: true
+		})
+	},
+	
+}

+ 1 - 1
common/request.js

@@ -4,7 +4,7 @@
 import store from '@/store/index.js'
 import api from './api.js'
 var num = 1
-export const BASE_URL = 'http://192.168.1.24:5055'//接口api
+export const BASE_URL = 'http://42.192.164.187:19005'//接口api
 export const BASE_IMG_URL = 'https://file-dev.xyyxt.net/'//图片上传api  'https://file.xyyxt.net/
 export const tenantId = '867735392558919680'
 export const myRequest = (options) => {

+ 70 - 0
pages.json

@@ -407,6 +407,76 @@
 						"bounce": "none"
 					}
 				}
+			},
+			{
+				"path": "subject/record",
+				"style": {
+					"navigationBarTitleText": "做题记录",
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
+			},
+			{
+				"path": "subject/report",
+				"style": {
+					"navigationBarTitleText": "试卷报告",
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
+			},
+			{
+				"path": "subject/wrong",
+				"style": {
+					"navigationBarTitleText": "错题集",
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
+			},
+			{
+				"path": "subject/collect",
+				"style": {
+					"navigationBarTitleText": "收藏集",
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
+			},
+			{
+				"path": "learn/my_learn",
+				"style": {
+					"navigationBarTitleText": "我的学时",
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
+			},
+			{
+				"path": "learn/details",
+				"style": {
+					"navigationBarTitleText": "详情",
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
+			},
+			{
+				"path": "learn/menu",
+				"style": {
+					"navigationBarTitleText": "目录",
+					"app-plus": {
+						"titleNView": false, //禁用原生导航栏 
+						"bounce": "none"
+					}
+				}
 			}
 		]/*,
 		 "plugins": {

+ 2 - 2
pages/login/login.vue

@@ -144,8 +144,8 @@ export default {
 				return 
 			}
 			//虚拟登录
-			that.fakeLogin()
-			return
+			/* that.fakeLogin()
+			return */
 			that.isUse = true
 			that.$api.accountLogin(this.form).then(
 				res => {

+ 172 - 147
pages/shopping/shoppingCart.vue

@@ -5,148 +5,160 @@
 				<image  src="/static/logo2.png" style="width: 178rpx;height: 31rpx;margin-left: 30rpx;"></image>
 			</view>
 		</u-navbar>
-		<view style="padding: 30rpx;padding-bottom: 98rpx;">
-			<uni-swipe-action>
-			 <u-checkbox-group
-			            v-model="checkboxValue1"
-			            placement="column"
-			            @change="checkboxChange">
-			<uni-swipe-action-item :autoClose="false" @change="swipeChange($event, item)" :show="item.show" v-for="(item,index) in list" :key="index" >
-				<view class="item">
-					<view style="width: 100%;">
-						<view style="display: flex;padding-bottom: 15rpx;">
-							<view style="display: flex;align-items:center;">
-								<u-checkbox
-									v-model="item.checked" 
+		<view v-show="isLogin">
+			<view style="padding: 30rpx;padding-bottom: 98rpx;">
+				<uni-swipe-action>
+				 <u-checkbox-group
+				     placement="column">
+						  <view>
+				<uni-swipe-action-item :autoClose="false" @change="swipeChange($event, item)" :show="item.show" v-for="(item,index) in list" :key="index" >
+					<view class="item">
+						<view style="width: 100%;">
+							
+							<view style="display: flex;padding-bottom: 15rpx;">
+								<view style="display: flex;align-items:center;">
+									<u-checkbox
+									@change="checkboxChange" 
+									v-model="list[index].checked" 
 									shape="circle"
-									:name="item.name">
-								</u-checkbox>
-							</view>
-							<image :src="$method.splitImgHost(item.coverUrl, true)" style="height: 134rpx;width: 278rpx;border-radius: 16rpx;"></image>
-							<view style="margin-left: 20rpx;flex: 1;">
-								<view style="color: #333333;font-size: 30rpx;font-weight: bold;">
-									{{item.goodsName}}
+									:name="index">
+									</u-checkbox>
 								</view>
-								<view class="priceTag">
-									¥ {{item.standPrice}}
+								<view>
+									<image :src="$method.splitImgHost(item.coverUrl, true)" style="width: 278rpx;height: 134rpx;"></image>
 								</view>
+								<view style="margin-left: 20rpx;flex: 1;">
+									<view style="color: #333333;font-size: 30rpx;font-weight: bold;">
+										{{item.goodsName}}
+									</view>
+									<view class="priceTag">
+										¥ {{item.standPrice}}
+									</view>
+								</view>
+								
+							</view>
+							<u-line color="#D6D6DB" />
+							<view style="display: flex;justify-content: space-between;align-items: center;height: 50rpx;" @click="openPopup(index)">
+								<view style="color: #666666;font-size: 24rpx;margin-left: 60rpx;">选择班级</view>
+								<view><u-icon name="arrow-right" color="#999999" size="28"></u-icon></view>
 							</view>
-							
-						</view>
-						<u-line color="#D6D6DB" />
-						<view style="display: flex;justify-content: space-between;align-items: center;height: 50rpx;" @click="openPopup(index)">
-							<view style="color: #666666;font-size: 24rpx;margin-left: 60rpx;">选择班级</view>
-							<view><u-icon name="arrow-right" color="#999999" size="28"></u-icon></view>
 						</view>
 					</view>
+					<template v-slot:right>
+						<view class="operate" @click="delItem(item)">
+							<view ><text>删除</text></view>
+							
+						</view>
+					</template>
+				</uni-swipe-action-item>
 				</view>
-				<template v-slot:right>
-					<view class="operate" @click="delItem(item)">
-						<view ><text>删除</text></view>
-						
-					</view>
-				</template>
-			</uni-swipe-action-item>
-			</u-checkbox-group>
-			</uni-swipe-action>
-		</view>
-		<view class="bottomBox">
-			<view>
-				<u-checkbox
-					label="all"
-					name="all"
-					shape="circle"
-					@change="checkboxAllChange"
-					v-model="allChecked" 
-				>
-				</u-checkbox>
-				<text>全选</text>
+				 </u-checkbox-group>
+				</uni-swipe-action>
 			</view>
-			<view style="display: flex;align-items: center;">
-				<view style="color: #999999;margin-right: 8rpx;">合计</view>
-				<view class="priceTag">¥ 999.00</view>
-				<view style="display: flex;color: #FFFFFF;align-items: center;">
-					<view class="btn2" @click="goBuy()">结算</view>
+			<view class="bottomBox">
+				<view>
+					<u-checkbox
+						label="all"
+						name="all"
+						shape="circle"
+						@change="checkboxAllChange"
+						v-model="allChecked" 
+					>
+					</u-checkbox>
+					<text>全选</text>
 				</view>
-			</view>
-		</view>
-		
-		<u-popup v-model="show" mode="bottom"border-radius="40">
-			<view class="popup_box">
-				<view style="margin-bottom: 20rpx;">
-					<view class="line1"></view>
-					<view class="grade">选择班级</view>
+				<view style="display: flex;align-items: center;">
+					<view style="color: #999999;margin-right: 8rpx;">合计</view>
+					<view class="priceTag">¥ {{totalPrice}}</view>
+					<view style="display: flex;color: #FFFFFF;align-items: center;">
+						<view class="btn2" @click="goBuy()">结算</view>
+					</view>
 				</view>
-				<u-line color="#D6D6DB" />
-				<view>
-					<scroll-view scroll-y="true" style="height: 500rpx;">
-						<view>
-							<u-checkbox-group @change="checkboxGroupChange">
-								<view v-for="(item, index) in list" :key="index" >
-									<view style="display: flex;align-items: center;padding: 20rpx;">
-										<view>
-											<u-checkbox
-												shape="circle"
-												@change="checkboxChange" 
-												v-model="item.checked" 
-												:name="item.name"
-											></u-checkbox>
-										</view>
-										<view :class="item.checked?'white-box blue-box':'white-box'" >
+			</view>
+			
+			<u-popup v-model="show" mode="bottom"border-radius="40">
+				<view class="popup_box">
+					<view style="margin-bottom: 20rpx;">
+						<view class="line1"></view>
+						<view class="grade">选择班级</view>
+					</view>
+					<u-line color="#D6D6DB" />
+					<view>
+						<scroll-view scroll-y="true" style="height: 500rpx;">
+							<view>
+								<u-checkbox-group @change="checkboxGroupChange1">
+									<view v-for="(item, index) in list" :key="index" >
+										<view style="display: flex;align-items: center;padding: 20rpx;">
 											<view>
-												<view class="blackTxt">2021年第1期二级建造师继续教育选修课(市政)标题过长换行显示</view>
-												<view class="redTxt">有效期至:2021/11/30</view>
-												<view class="redTxt">本班还剩41天将结束学习</view>
+												<u-checkbox
+													shape="circle"
+													@change="checkboxChange1" 
+													v-model="item.checked" 
+													:name="item.name"
+												></u-checkbox>
+											</view>
+											<view :class="item.checked?'white-box blue-box':'white-box'" >
+												<view>
+													<view class="blackTxt">2021年第1期二级建造师继续教育选修课(市政)标题过长换行显示</view>
+													<view class="redTxt">有效期至:2021/11/30</view>
+													<view class="redTxt">本班还剩41天将结束学习</view>
+												</view>
 											</view>
 										</view>
 									</view>
-								</view>
-							</u-checkbox-group>
-						</view>
-					</scroll-view>
-				</view>
-				<view class="confrim-btn">
-					<view class="okBtn">确定</view>
-				</view>
-			</view>
-		</u-popup>
-		<u-popup v-model="show1" mode="bottom"border-radius="40">
-			<view class="popup_box">
-				<view style="margin-bottom: 20rpx;">
-					<view class="line1"></view>
-					<view class="grade">选择考期/地区</view>
+								</u-checkbox-group>
+							</view>
+						</scroll-view>
+					</view>
+					<view class="confrim-btn">
+						<view class="okBtn">确定</view>
+					</view>
 				</view>
-				<u-line color="#D6D6DB" />
-				<view style="display: flex;height: 500rpx;">
-					<view style="width: 50%;">
-						<view class="topTxt">考期</view>
-						<view>
-							<picker-view  :indicator-style="indicatorStyle" :value="value" @change="bindChange" class="picker-view">
-								<picker-view-column>
-									<view class="picker-item" v-for="(item,index) in list1" :key="index">{{item.label}}</view>
-								</picker-view-column>
-							</picker-view>
-						</view>
+			</u-popup>
+			<u-popup v-model="show1" mode="bottom"border-radius="40">
+				<view class="popup_box">
+					<view style="margin-bottom: 20rpx;">
+						<view class="line1"></view>
+						<view class="grade">选择考期/地区</view>
 					</view>
-					<view style="width: 50%;">
-						<view class="topTxt">地区</view>
-						<view>
-							<picker-view  :indicator-style="indicatorStyle" :value="value" @change="bindChange" class="picker-view">
-								<picker-view-column>
-									<view class="picker-item" v-for="(item,index) in list2" :key="index">{{item.label}}</view>
-								</picker-view-column>
-								<picker-view-column>
-									<view class="picker-item" v-for="(item,index) in list3" :key="index">{{item.label}}</view>
-								</picker-view-column>
-							</picker-view>
+					<u-line color="#D6D6DB" />
+					<view style="display: flex;height: 500rpx;">
+						<view style="width: 50%;">
+							<view class="topTxt">考期</view>
+							<view>
+								<picker-view  :indicator-style="indicatorStyle" :value="value" @change="bindChange" class="picker-view">
+									<picker-view-column>
+										<view class="picker-item" v-for="(item,index) in list1" :key="index">{{item.label}}</view>
+									</picker-view-column>
+								</picker-view>
+							</view>
+						</view>
+						<view style="width: 50%;">
+							<view class="topTxt">地区</view>
+							<view>
+								<picker-view  :indicator-style="indicatorStyle" :value="value" @change="bindChange" class="picker-view">
+									<picker-view-column>
+										<view class="picker-item" v-for="(item,index) in list2" :key="index">{{item.label}}</view>
+									</picker-view-column>
+									<picker-view-column>
+										<view class="picker-item" v-for="(item,index) in list3" :key="index">{{item.label}}</view>
+									</picker-view-column>
+								</picker-view>
+							</view>
 						</view>
 					</view>
+					<view class="confrim-btn">
+						<view class="okBtn">确定</view>
+					</view>
 				</view>
-				<view class="confrim-btn">
-					<view class="okBtn">确定</view>
-				</view>
+			</u-popup>
+		</view>
+		<view v-show="!isLogin">
+			<view style="display: flex;align-items:center;flex-direction: column;margin-top: 40%;font-size: 32rpx;">
+				<view style="color: #999999;">您还没有登录哦~</view>
+				<view style="margin-top: 30rpx;" ><u-button type="primary" @click="login">去登录</u-button></view>
 			</view>
-		</u-popup>
+		</view>
 	</view>
 </template>
 
@@ -154,26 +166,10 @@
 	export default {
 		data() {
 			return {
+				isLogin:false,
 				allChecked:false,
 				checkboxValue1:[],
-				list: [{
-					name: 'apple',
-					checked: false,
-					disabled: false,
-					show: false
-				},
-				{
-					name: 'banner',
-					checked: false,
-					disabled: false,
-					show: false
-				},
-				{
-					name: 'orange',
-					checked: false,
-					disabled: false,
-					show: false
-				}
+				list: [
 				],
 				list1:[
 						{
@@ -225,31 +221,54 @@
 					],
 					value1:'',
 				show:false,
-				show1:false
+				show1:false,
+				totalPrice:0.00,
+				isOld:false
 			}
 		},
 		onLoad(option) {
 			
 		},
 		onShow() {
-			this.cartList()
+			this.isLogin = this.$method.isLogin()
+			if(this.isLogin){
+				if(uni.getStorageSync('updateCart')||!this.isOld){
+					this.isOld = true
+					this.cartList()
+					uni.removeStorageSync('updateCart')//消费购物车刷新事件
+				}
+				
+			}
+			
 		},
 		methods: {
+			countPrice(list){
+				
+			},
+			checkboxChange1(e) {
+				//console.log(e);
+			},
+			
+			login(){
+				uni.navigateTo({url:'/pages/login/login'});
+			},
 			cartList() {
 				let self = this
+				this.allChecked = false
+				this.totalPrice = 0.00
 				this.$api.cartList().then(res => {
 					if(res.data.code==200){
-						self.list = res.data.rows
-						for (let i = 0; i < self.list.length; i++) {
-							let item = self.list[i]
+						for (let i = 0; i < res.data.rows.length; i++) {
+							let item = res.data.rows[i]
 							item.checked = false
-							if(item.status!=1||item.goodsStatus!=1){
+							 if(item.status!=1||item.goodsStatus!=1){
 								item.disabled = true
 							}else{
 								item.disabled = false
 							}
 							item.show = false
 						}
+						self.list = res.data.rows
 					}
 				});
 			},
@@ -269,6 +288,11 @@
 			},
 			checkboxChange(n) {
 				console.log('change', n);
+				if(n.value){
+					this.totalPrice += this.list[n.name].standPrice
+				}else{
+					this.totalPrice -= this.list[n.name].standPrice
+				}
 			},
 			openPopup(index){
 				if(index==0){
@@ -279,10 +303,11 @@
 				
 			},
 			checkboxAllChange(n){
-				console.log(this.allChecked,n)
+				this.totalPrice = 0.00
 				if(n.value){
 					for(let i =0;i<this.list.length;i++){
 						this.list[i].checked = true
+						this.totalPrice += this.list[i].standPrice
 					}
 				}else{
 					for(let i =0;i<this.list.length;i++){

+ 37 - 6
pages2/course/detail.vue

@@ -28,9 +28,17 @@
 		</view>
 		<view style="padding: 20rpx;" v-show="current==1">
 			<view >
-				<view v-for="(item,index) in courseList" class="courseItem">
-					<view>{{item.courseName}}</view>
-					<view><u-icon name="arrow-down" ></u-icon></view>
+				<view v-for="(item,index) in courseList" >
+					<view class="courseItem" @click="openCourse(item)">
+						<view>{{item.courseName}}</view>
+						<view>
+							<u-icon name="arrow-down" v-if="item.down"></u-icon>
+							<u-icon name="arrow-up" v-if="!item.down"></u-icon>
+						</view>
+					</view>
+					<view v-if="item.down">
+						
+					</view>
 				</view>
 			</view>
 		</view>
@@ -60,8 +68,7 @@ export default {
 			],
 			current:0,
 			detail:{},
-			courseList:[]
-					
+			courseList:[]	
 		};
 	},
 	onUnload() {
@@ -77,10 +84,18 @@ export default {
 		
 	},
 	methods: {
+		openCourse(item){
+			item.down = !item.down
+			if(!item.down){
+				this.menuList(item.courseId)
+			}
+			
+		},
 		addShopCart() {
 			let self = this
 			this.$api.addCart({goodsId:this.id}).then(res => {
 				if(res.data.code==200){
+					uni.setStorageSync('updateCart',1) //提醒刷新购物车
 					uni.showToast({
 					    title: '添加成功'
 					});
@@ -93,10 +108,24 @@ export default {
 			let self = this
 			this.$api.goodsCourseList(this.id).then(res => {
 				if(res.data.code==200){
+					
+					for(let i=0;i<res.data.rows.length;i++){
+						let item = res.data.rows[i]
+						item.down = true
+					}
 					self.courseList = res.data.rows
 				}
 			});
 		},
+		menuList(courseId) {
+			let self = this
+			this.$api.menuList({courseId:courseId}).then(res => {
+				if(res.data.code==200){
+					
+					console.log(res.data)
+				}
+			});
+		},
 		getDetail() {
 			let self = this
 			this.$api.goodsDetail(this.id).then(res => {
@@ -117,7 +146,6 @@ export default {
 				return
 			}
 			this.addShopCart()
-			
 		},
 		open(item){
 			item.showChildren = !item.showChildren
@@ -134,6 +162,9 @@ export default {
 	}
 </style>
 <style scope>
+	.contentBox{
+		
+	}
 	.courseItem{
 		width: 100%;
 		height: 80rpx;

+ 130 - 0
pages2/learn/details.vue

@@ -0,0 +1,130 @@
+<template>
+	<view class="safeArea">
+		<view class="detailsWrap">
+			<view class="detailsItem" v-for="(item,index) in 3" :key="index">
+				<view class="head">
+					<view class="tap">录播</view>
+					<view class="title">这是一个节标这是一个节标题这是一个节标题这是一个节标题这是一个节标题题</view>
+				</view>
+				<u-line color="#EEEEEE" />
+				<view class="info">
+					<view class="item" v-for="item in 7">
+						<view class="imgbox"><image src="@/static/intro.png" style="width:100%" mode="heightFix"></image></view>
+						<view class="time">2021/10/25 14:25:20</view>
+					</view>
+				</view>
+				<u-line color="#EEEEEE" />
+				<view class="reason">
+					<view class="label">原因:</view>
+					<view class="val">拍照异常/时间异常</view>
+				</view>
+			</view>
+		</view>
+		<view class="btn">确认重学</view>
+	</view>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+export default {
+	components: {
+	},
+	data() {
+		return {
+		};
+	},
+	onShow() {
+	},
+	methods: {
+	},
+	onReachBottom() {},
+	computed: { ...mapGetters(['userInfo']) }
+};
+</script>
+<style >
+page {
+	background: #EAEEF1;
+}
+</style>
+<style scoped lang="scss">
+.detailsWrap{
+	padding:8rpx 8rpx 140rpx;
+}
+.detailsItem{
+	background: #FFFFFF;
+	border-radius: 16rpx;
+	margin-bottom: 16rpx;
+	.head{
+		padding: 26rpx 24rpx;
+		display: flex;
+		font-size: 30rpx;
+		font-family: PingFang SC;
+		font-weight: bold;
+		color: #666666;
+		.tap{
+			width: 56rpx;
+			height: 28rpx;
+			line-height: 26rpx;
+			text-align: center;
+			border: 2rpx solid #666666;
+			border-radius: 8rpx;
+			font-size: 20rpx;
+			font-family: PingFang SC;
+			font-weight: 400;
+			color: #666666;
+			margin-right: 8rpx;
+			flex-shrink: 0;
+			position: relative;
+			top: 6rpx;
+		}
+	}
+	.info{
+		padding: 17rpx 24rpx;
+		display: flex;
+		flex-wrap: wrap;
+		.item{
+			width: 160rpx;
+			font-size: 20rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #666666;
+			margin: 0 8rpx 16rpx 0;
+			.imgbox{
+				width:160rpx;
+				height: 160rpx;
+				border-radius: 8px;
+				overflow: hidden;
+				margin-bottom: 7rpx;
+			}
+		}
+	}
+	.reason{
+		display: flex;
+		padding: 21rpx 24rpx;
+		font-size: 30rpx;
+		font-family: PingFang SC;
+		font-weight: 500;
+		color: #333333;
+		.label{
+			color: #666666;
+		}
+	}
+}
+.btn{
+	width: 526rpx;
+	height: 80rpx;
+	background: #007AFF;
+	border-radius: 40rpx;
+	font-size: 30rpx;
+	font-family: PingFang SC;
+	font-weight: bold;
+	color: #FFFFFF;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	position: fixed;
+	left: 50%;
+	margin-left: -263rpx;
+	bottom: 50rpx;
+}
+</style>

+ 247 - 0
pages2/learn/menu.vue

@@ -0,0 +1,247 @@
+<template>
+	<view class="safeArea">
+		<view class="menuWrap">
+			<view class="videoMain">
+				<video id="myVideo" src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20200317.mp4" @error="videoErrorCallback" :danmu-list="danmuList" enable-danmu danmu-btn controls></video>
+				<view class="videoTitle">
+					<view class="left">承发包模式-施工合同与物资采购合...</view>
+					<view class="right">
+						<u-icon class="icon" name="file-text"></u-icon>讲义
+					</view>
+				</view>
+				<u-line color="#EEEEEE" />
+				<view class="tabMain" style="width: 100%;text-align: center;">
+					<u-tabs :list="menuList" sticky :current="current" @change="change" active-color="#333" inactive-color="#999"></u-tabs>
+				</view>
+			</view>
+			<view class="menuMain">
+				<view class="menuItem" v-for="(item,index) in 3" :key="index">
+					<view class="title">2Z106000 施工合同管理-模块标题</view>
+					<u-collapse accordion>
+						<u-collapse-item>
+							<text slot="title" class="u-page__item__title__slot-title">2Z106010 施工承发包的模式-2Z106020 施工合同...</text>
+							<view class="u-collapse-content">
+								<view class="item" v-for="(item,index) in 7" :key="index">
+									<view class="tag">录播</view><!--默认蓝色,红色加red,黄色加yellow-->
+									<!-- <view class="yellow">回放</view> -->
+									<!-- <view class="red">直播</view> -->
+									<view class="info">施工承发包模式-施工合同与物资标题过长...</view>
+									<view class="btn">待重修</view>
+									<view class="status">回放</view>
+								</view>
+							</view>
+						</u-collapse-item>
+					</u-collapse>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+export default {
+	components: {
+	},
+	data() {
+		return {
+			current: 0,
+			menuList: [
+				{
+					name: '重修目录'
+				}, 
+				{
+					name: '目录'
+				}, 
+				{
+					name: '笔记'
+				}, 
+				{
+					name: '答疑'
+				}
+			]
+		};
+	},
+	onShow() {
+	},
+	methods: {
+		change(index){
+			this.current = index;
+		}
+	},
+	onReachBottom() {},
+	computed: { ...mapGetters(['userInfo']) }
+};
+</script>
+<style lang="scss">
+page {
+	background: #EAEEF1;
+}
+.videoMain .u-scroll-box{
+	display: flex;
+}
+.menuItem{
+	.u-collapse-item{
+		position: relative;
+	}
+	.u-arrow-down-icon{
+		position: absolute;
+		left:19rpx;
+	}
+	.u-page__item__title__slot-title{
+		width: 563rpx;
+		font-size: 24rpx;
+		font-family: PingFang SC;
+		font-weight: bold;
+		color: #666666;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		overflow: hidden;
+		padding-left: 90rpx;
+	}
+}
+</style>
+<style scoped lang="scss">
+.videoMain{
+	width:100%;
+	background: #fff;
+	#myVideo{
+		width:100%;
+		height: 461rpx;
+		background: #000000;
+		vertical-align: top;
+	}
+	.videoTitle{
+		height: 80rpx;
+		background: #FFFFFF;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		.left{
+			width: 550rpx;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+			overflow: hidden;
+			padding-left: 32rpx;
+		}
+		.right{
+			width: 100rpx;
+			height: 80rpx;
+			background: #FFFFFF;
+			box-shadow: -4rpx 0 4rpx 0rpx rgba(0, 0, 0, 0.1);
+			text-align: center;
+			line-height: 1.2;
+			font-size: 20rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #333333;
+			padding-top: 4rpx;
+			.icon{
+				display: block;
+				font-size: 36rpx;
+				color:#007AFF;
+				vertical-align: top;
+			}
+		}
+	}
+	.u-scroll-box{
+		display: flex;
+	}
+}
+.menuMain{
+	padding: 16rpx;
+	.menuItem{
+		background: #FFFFFF;
+		border-radius: 16rpx;
+		margin-bottom: 24rpx;
+		padding-bottom: 30rpx;
+		.title{
+			padding: 33rpx 16rpx 0;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+		}
+		.item{
+			display: flex;
+			padding: 28rpx 16rpx;
+			align-items: center;
+			justify-content: space-between;
+			position: relative;
+			&:first-child{
+				&::after{
+					width:686rpx;
+					left:16rpx;
+				}
+			}
+			&::after{
+				content: '';
+				width: 90%;
+				height:1px;
+				background: #EEEEEE;
+				position: absolute;
+				top: 0;
+				right:0;
+			}
+			.tag{
+				width: 56rpx;
+				height: 28rpx;
+				background: #FFFFFF;
+				border: 2rpx solid #007AFF;
+				border-radius: 8rpx;
+				font-size: 20rpx;
+				font-family: PingFang SC;
+				font-weight: 400;
+				color: #007AFF;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+			.info{
+				width: 504rpx;
+				font-size: 26rpx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #007AFF;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+				overflow: hidden;
+			}
+			.btn{
+				width: 80rpx;
+				height: 28rpx;
+				background: #FF3B30;
+				border-radius: 8rpx;
+				font-size: 20rpx;
+				font-family: PingFang SC;
+				font-weight: 400;
+				color: #FFFFFF;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+			.status{
+				position: absolute;
+				bottom: 1rpx;
+				left: 96rpx;
+				font-size: 20rpx;
+				font-family: PingFang SC;
+				font-weight: 400;
+				color: #FF3B30;
+			}
+		}
+	}
+}
+.yellow{
+	color: #FF9500!important;
+	border-color: #FF9500!important;;
+}
+.red{
+	color: #FF3B30!important;
+	border-color: #FF3B30!important;;
+}
+</style>

+ 265 - 0
pages2/learn/my_learn.vue

@@ -0,0 +1,265 @@
+<template>
+	<view class="safeArea">
+		<view style="width: 100%;text-align: center;position: fixed;height: 96rpx;z-index: 999;">
+			<u-tabs :list="list" sticky :current="current" @change="change" active-color="#333" inactive-color="#999"></u-tabs>
+		</view>
+		<view class="learnWrap">
+			<template v-if="current===0">
+				<!-- <view class="noData">您暂无相关学时审核记录哦~</view> -->
+				<view class="learnItem">
+					<view class="title">2020年二建建筑工程管理与实补这是商品名称</view>
+					<view class="status">
+						<view class="label">审核状态:</view>
+						<view class="val red">不可审核</view>
+					</view>
+					<view class="tip">
+						<view class="label">审核提示:</view>
+						<view class="val green">您的学时还未修完,请尽快完成课程学习</view>
+					</view>
+					<u-line color="#EEEEEE" />
+					<view class="btnBox">
+						<view class="btn">课程学习</view>
+					</view>
+				</view>
+				<view class="learnItem">
+					<view class="title">2020年二建建筑工程管理与实补这是商品名称</view>
+					<view class="status">
+						<view class="label">审核状态:</view>
+						<view class="val blue">不可审核</view>
+					</view>
+					<view class="tip">
+						<view class="label">审核提示:</view>
+						<view class="val green">您的学时还未修完,请尽快完成课程学习</view>
+					</view>
+				</view>
+				<view class="learnItem">
+					<view class="title">2020年二建建筑工程管理与实补这是商品名称</view>
+					<view class="status">
+						<view class="label">审核状态:</view>
+						<view class="val green">机构审核完成</view>
+					</view>
+				</view>
+				<view class="learnItem">
+					<view class="title">2020年二建建筑工程管理与实补这是商品名称</view>
+					<view class="status">
+						<view class="label">审核状态:</view>
+						<view class="val green">机构审核完成</view>
+					</view>
+					<u-line color="#EEEEEE" />
+					<view class="subTitle">这是一个考试标题</view>
+					<view class="btnBox">
+						<view class="btn">预约考试</view>
+					</view>
+				</view>
+				<view class="learnItem">
+					<view class="title">2020年二建建筑工程管理与实补这是商品名称</view>
+					<view class="status">
+						<view class="label">审核状态:</view>
+						<view class="val green">机构审核完成</view>
+					</view>
+					<u-line color="#EEEEEE" />
+					<view class="subTitle">这是一个考试标题</view>
+					<view class="btnBox">
+						<view class="btn">进入刷题</view>
+					</view>
+				</view>
+				<view class="learnItem">
+					<view class="title">2020年二建建筑工程管理与实补这是商品名称</view>
+					<view class="status">
+						<view class="label">审核状态:</view>
+						<view class="val green">机构审核完成</view>
+					</view>
+					<view class="tip">
+						<view class="label">审核提示:</view>
+						<view class="val">机构已审核通过,需等待注册中心复审后即可获得继续教育学时。审核时间约15个工作日,届时请前往官网申请证书延期。
+							<view class="link">复制官网链接</view>
+						</view>
+					</view>
+					<u-line color="#EEEEEE" />
+					<view class="btnBox">
+						<view class="btn">课程学习</view>
+					</view>
+				</view>
+				<view class="learnItem">
+					<view class="title">2020年二建建筑工程管理与实补这是商品名称</view>
+					<view class="status">
+						<view class="label">审核状态:</view>
+						<view class="val red">机构审核不通过
+							<view class="remark">有<text class="red">3节</text>需重修</view>
+						</view>
+					</view>
+					<view class="tip">
+						<view class="label">审核提示:</view>
+						<view class="val">请查看需重学记录,并及时重学对应课程,以免延误学时审核进度。
+						</view>
+					</view>
+					<u-line color="#EEEEEE" />
+					<view class="btnBox">
+						<view class="btn">课程学习</view>
+					</view>
+				</view>
+			</template>
+			<template v-if="current===1">
+				<!-- <view class="noData">您暂无相关学习凭证记录哦~</view> -->
+				<view class="learnItem">
+					<view class="title">2020年二建建筑工程管理与实补这是商品名称</view>
+					<view class="number"><text class="label">编号:</text>GZXY123456789</view>
+					<view class="btnBox">
+						<view class="btn">电子照片</view>
+						<view class="btn">下载凭证</view>
+					</view>
+				</view>
+			</template>
+		</view>
+	</view>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+export default {
+	components: {
+	},
+	data() {
+		return {
+			current: 0,
+			list: [
+				{
+					name: '学时审核'
+				}, 
+				{
+					name: '学习凭证'
+				}
+			]
+		};
+	},
+	onShow() {
+	},
+	methods: {
+		change(index){
+			this.current = index;
+		}
+	},
+	onReachBottom() {},
+	computed: { ...mapGetters(['userInfo']) }
+};
+</script>
+<style >
+	page {
+			background: #EAEEF1;
+		}
+</style>
+<style scoped lang="scss">
+.learnWrap{
+	padding:98rpx 8rpx 8rpx;
+}
+.noData{
+	font-size: 32rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+	color: #999999;
+	margin: 160rpx auto;
+	text-align:center;
+}
+.learnItem{
+	background: #FFFFFF;
+	border-radius: 16rpx;
+	padding: 32rpx 32rpx 0;
+	font-family: PingFang SC;
+	margin-bottom: 16rpx;
+	overflow:hidden;
+	.red{
+		color:#FF3B30!important;
+	}
+	.blue{
+		color:#007AFF!important;
+	}
+	.green{
+		color:#34C759!important;
+	}
+	.title{
+		font-size: 30rpx;
+		font-weight: bold;
+		color: #333333;
+		margin-bottom: 68rpx;
+	}
+	.status{
+		font-size: 24rpx;
+		font-weight: 500;
+		color: #666666;
+		margin-bottom: 26rpx;
+		display:flex;
+	}
+	.number{
+		font-size: 24rpx;
+		font-weight: 500;
+		color: #666666;
+		margin-bottom: 26rpx;
+		font-size: 30rpx;
+		font-weight: bold;
+		font-family: PingFang SC;
+		color:#333;
+		.label{
+			font-size: 24rpx;
+			font-weight: 500;
+			color: #666666;
+		}
+	}
+	.val{
+		font-size: 30rpx;
+		font-weight: bold;
+		color:#333;
+		.remark{
+			font-size: 24rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #666666;
+		}
+		.link{
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			text-decoration: underline;
+			color: #007AFF;
+			margin-top: 36rpx;
+			text-decoration: underline;
+		}
+	}
+	.tip{
+		font-size: 24rpx;
+		font-weight: 500;
+		color: #666666;
+		margin: 30rpx 0 27rpx;
+		display:flex;
+	}
+	.label{
+		width: 120rpx;
+		flex-shrink: 0;
+		margin-top: 5rpx;
+	}
+	.subTitle{
+		font-size: 30rpx;
+		font-weight: bold;
+		color: #333333;
+		margin: 15rpx 0 40rpx;
+	}
+	.btnBox{
+		height: 88rpx;
+		display: flex;
+		align-items: center;
+		justify-content: flex-end;
+		.btn{
+			width: 224rpx;
+			height: 56rpx;
+			line-height: 56rpx;
+			text-align: center;
+			background: #007AFF;
+			border-radius: 16rpx;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #FFFFFF;
+			margin-left: 16rpx;
+		}
+	}
+}
+</style>

+ 273 - 0
pages2/subject/collect.vue

@@ -0,0 +1,273 @@
+<template>
+	<view class="safeArea">
+		<view class="sceenBox">
+			<view :class="['item', {'active':sceenType===1} ]" @click="showSceen(1)">全部题库记录<u-icon class="icon" name="arrow-down"></u-icon></view>
+			<view :class="['item', {'active':sceenType===2} ]" @click="showSceen(2)">全部试卷类型<u-icon class="icon" name="arrow-down"></u-icon></view>
+		</view>
+		<view class="sceenModel" v-if="sceenType">
+			<view class="sceenModelBg" @click="hideSceen"></view>
+			<view class="sceenMain">
+				<template v-if="sceenType===1">
+					<view :class="['item',{'active':item.checked}]" v-for="(item, index) in scennList1" :key="index" @click="choSceen(index,'tk')">{{item.name}}</view>
+				</template>
+				<template v-if="sceenType===2">
+					<view :class="['item',{'active':item.checked}]" v-for="(item, index) in scennList2" :key="index" @click="choSceen(index,'sj')">{{item.name}}</view>
+				</template>
+			</view>
+		</view>
+		<view class="wrap">
+			<view class="wrongHead">
+				<view class="title">收藏统计</view>
+				<view class="progress">
+					
+				</view>
+			</view>
+			<view class="wrongTab">
+				<view class="item active">试卷归类</view>
+				<view class="item">题型归类</view>
+			</view>
+			<view class="wrongList">
+				<view class="item" v-for="(item,index) in 5" :key="index">
+					<view class="title">试卷名称可换行我也不知道最多多少个字总之可以换行就对了</view>
+					<view class="bt">
+						<view class="left">错题数<text class="num">23</text></view>
+						<view class="right">
+							<view class="btn">重做</view>
+							<view class="btn">解析</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+export default {
+	components: {},
+	data() {
+		return {
+			sceenType: null,
+			scennList1:[
+				{id: 1, name: '全部题库记录', checked: true},{id: 1, name: '试卷名称可换行并完整显示'},{id: 1, name: '试卷名称可换行并完整显示'},{id: 1, name: '试卷名称可换行并完整显示'}
+			],
+			scennList2:[
+				{id: 1, name: '全部试卷类型', checked: true},{id: 1, name: '模拟卷'},{id: 1, name: '真题'},{id: 1, name: '练习'}
+			],
+		};
+	},
+	onPullDownRefresh() {},
+	onLoad(option) {},
+	methods: {
+		showSceen(type){
+			this.sceenType = type
+		},
+		hideSceen(){
+			this.sceenType = null
+		},
+		choSceen(index,type){
+			if(type==='tk'){
+				this.scennList1.forEach((item,idx)=>{
+					this.$set(item, 'checked',false)
+					if(index===idx){
+						this.$set(item, 'checked',true)
+					}
+				})
+			}
+			if(type==='sj'){
+				this.scennList2.forEach((item,idx)=>{
+					this.$set(item, 'checked',false)
+					if(index===idx){
+						this.$set(item, 'checked',true)
+					}
+				})
+			}
+			this.sceenType = null
+		}
+	}
+};
+</script>
+<style lang="scss">
+page {
+	background: #EAEEF1;
+}
+
+</style>
+<style scoped lang="scss">
+.sceenBox {
+	width:100%;
+	height: 80rpx;
+	background: #FFFFFF;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 32rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+	color: #999999;
+	position: fixed;
+	z-index: 999;
+	border-bottom: 1px solid #eee;
+	.item{
+		flex:1;
+		text-align: center;
+		&.active{
+			color:#333;
+			font-weight: bold;
+			.icon{
+				transform: rotate(180deg);
+			}
+		}
+	}
+}
+.sceenModel{
+	width:100%;
+	height:100%;
+	position: fixed;
+	z-index: 998;
+	.sceenModelBg{
+		width:100%;
+		height:100%;
+		position: fixed;
+		background: rgba(0,0,0,.3);
+		z-index: 998;
+	}
+	.sceenMain{
+		position: relative;
+		z-index: 999;
+		background: #fff;
+		margin-top: 80rpx;
+		display: flex;
+		flex-wrap: wrap;
+		padding: 8rpx;
+		justify-content: space-between;
+		.item{
+			width: 350rpx;
+			background: #F5F5F5;
+			border-radius: 16rpx;
+			padding: 25rpx 19rpx;
+			margin: 8rpx;
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #666666;
+			&.active{
+				background: #007AFF;
+				color:#fff;
+			}
+			&:first-child{
+				width:100%;
+				text-align: center;
+			}
+		}
+	}
+}
+.wrap{
+	padding:96rpx 16rpx 16rpx;
+}
+.wrongHead{
+	background: #FFFFFF;
+	border-radius: 16px;
+	padding:24rpx;
+	.title{
+		font-size: 30rpx;
+		font-family: PingFang SC;
+		font-weight: bold;
+		color: #333333;
+		.sub{
+			font-size: 20rpx;
+			font-weight: 500;
+			color: #999999;
+		}
+	}
+	.progress{
+		width: 180rpx;
+		height: 180rpx;
+		border: 20rpx solid #EEEEEE;
+		border-radius: 50%;
+		margin: 24rpx auto;
+	}
+}
+.wrongTab{
+	display: flex;
+	margin: 24rpx 0;
+	.item{
+		width: 144rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		background: #fff;
+		border-radius: 16px;
+		font-size: 28rpx;
+		font-family: PingFang SC;
+		font-weight: 500;
+		color: #666666;
+		margin-left: 15rpx;
+		&.active{
+			background: #007AFF;
+			color: #fff;
+		}
+	}
+}
+.wrongList{
+	.item{;
+		background: #FFFFFF;
+		border-radius: 16rpx;
+		padding: 0 30rpx;
+		margin-bottom: 16rpx;
+		overflow: hidden;
+		.title{
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+			margin: 40rpx 0 17rpx;
+		}
+		.bt{
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			padding-bottom: 24rpx;
+			.left{
+				width: 176rpx;
+				height: 40rpx;
+				background: #FFFFFF;
+				border: 1px solid #EEEEEE;
+				border-radius: 16rpx;
+				font-size: 26rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #999999;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				.num{
+					font-size: 26rpx;
+					font-weight: bold;
+					color: #FF3B30;
+					margin-left: 16rpx;
+				}
+			}
+			.right{
+				display: flex;
+				.btn{
+					width: 100rpx;
+					height: 48rpx;
+					background: #FFFFFF;
+					border: 1px solid #007AFF;
+					border-radius: 16px;
+					font-size: 24rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #007AFF;
+					margin-left:9rpx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+				}
+			}
+		}
+	}
+}
+</style>

+ 250 - 0
pages2/subject/record.vue

@@ -0,0 +1,250 @@
+<template>
+	<view class="safeArea">
+		<view class="sceenBox">
+			<view :class="['item', {'active':sceenType===1} ]" @click="showSceen(1)">全部题库记录<u-icon class="icon" name="arrow-down"></u-icon></view>
+			<view :class="['item', {'active':sceenType===2} ]" @click="showSceen(2)">全部试卷类型<u-icon class="icon" name="arrow-down"></u-icon></view>
+		</view>
+		<view class="sceenModel" v-if="sceenType">
+			<view class="sceenModelBg" @click="hideSceen"></view>
+			<view class="sceenMain">
+				<template v-if="sceenType===1">
+					<view :class="['item',{'active':item.checked}]" v-for="(item, index) in scennList1" :key="index" @click="choSceen(index,'tk')">{{item.name}}</view>
+				</template>
+				<template v-if="sceenType===2">
+					<view :class="['item',{'active':item.checked}]" v-for="(item, index) in scennList2" :key="index" @click="choSceen(index,'sj')">{{item.name}}</view>
+				</template>
+			</view>
+		</view>
+		<view class="pubuBox">
+			<view class="pubuItem">
+				<view class="item-masonry" v-for="(item, index) in comList" :key="index">
+					<view class="type">{{item.type}}</view>
+					<view class="title">{{ item.title }}</view>
+					<view class="info"><u-icon class="icon" name="file-text"></u-icon>{{ item.time }}</view>
+					<view class="info"><u-icon class="icon" name="file-text"></u-icon>总共 {{ item.count }} 题 做对 {{item.trueNum}} 道</view>
+					<view class="btnBox">
+						<view class="btn">重做</view>
+						<view class="btn">解析</view>
+						<view class="btn">报告</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+export default {
+	components: {},
+	data() {
+		return {
+			sceenType: null,
+			scennList1:[
+				{id: 1, name: '全部题库记录', checked: true},{id: 1, name: '试卷名称可换行并完整显示'},{id: 1, name: '试卷名称可换行并完整显示'},{id: 1, name: '试卷名称可换行并完整显示'}
+			],
+			scennList2:[
+				{id: 1, name: '全部试卷类型', checked: true},{id: 1, name: '模拟卷'},{id: 1, name: '真题'},{id: 1, name: '练习'}
+			],
+			comList: [{
+				type: '模拟卷',
+				title: '试卷名称可换不知道最多多少个字行',
+				time: '2021/12/20  14:30',
+				count: 95,
+				trueNum: 2
+			}, {
+				type: '真题',
+				title: '试卷名称可换不知道最多多少个字行',
+				time: '2021/12/20  14:30',
+				count: 95,
+				trueNum: 2
+			},{
+				type: '练习',
+				title: '试卷名称可换',
+				time: '2021/12/20  14:30',
+				count: 95,
+				trueNum: 2
+			}, {
+				type: '模拟卷',
+				title: '试卷名称可换行我也不知道最多多少个字',
+				time: '2021/12/20  14:30',
+				count: 95,
+				trueNum: 2
+			} ]
+		};
+	},
+	onPullDownRefresh() {},
+	onLoad(option) {},
+	methods: {
+		showSceen(type){
+			this.sceenType = type
+		},
+		hideSceen(){
+			this.sceenType = null
+		},
+		choSceen(index,type){
+			if(type==='tk'){
+				this.scennList1.forEach((item,idx)=>{
+					this.$set(item, 'checked',false)
+					if(index===idx){
+						this.$set(item, 'checked',true)
+					}
+				})
+			}
+			if(type==='sj'){
+				this.scennList2.forEach((item,idx)=>{
+					this.$set(item, 'checked',false)
+					if(index===idx){
+						this.$set(item, 'checked',true)
+					}
+				})
+			}
+			this.sceenType = null
+		}
+	}
+};
+</script>
+<style lang="scss">
+page {
+	background: #EAEEF1;
+}
+</style>
+<style scoped lang="scss">
+.sceenBox {
+	width:100%;
+	height: 80rpx;
+	background: #FFFFFF;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 32rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+	color: #999999;
+	position: fixed;
+	z-index: 999;
+	border-bottom: 1px solid #eee;
+	.item{
+		flex:1;
+		text-align: center;
+		&.active{
+			color:#333;
+			font-weight: bold;
+			.icon{
+				transform: rotate(180deg);
+			}
+		}
+	}
+}
+.sceenModel{
+	width:100%;
+	height:100%;
+	position: fixed;
+	z-index: 998;
+	.sceenModelBg{
+		width:100%;
+		height:100%;
+		position: fixed;
+		background: rgba(0,0,0,.3);
+		z-index: 998;
+	}
+	.sceenMain{
+		position: relative;
+		z-index: 999;
+		background: #fff;
+		margin-top: 80rpx;
+		display: flex;
+		flex-wrap: wrap;
+		padding: 8rpx;
+		justify-content: space-between;
+		.item{
+			width: 350rpx;
+			background: #F5F5F5;
+			border-radius: 16rpx;
+			padding: 25rpx 19rpx;
+			margin: 8rpx;
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #666666;
+			&.active{
+				background: #007AFF;
+				color:#fff;
+			}
+			&:first-child{
+				width:100%;
+				text-align: center;
+			}
+		}
+	}
+}
+.pubuBox {
+	padding: 96rpx 8rpx 30rpx;
+	.pubuItem {
+	    column-count: 2;
+	    column-gap: 16rpx;
+	}
+	.item-masonry {
+	    border-radius: 16rpx;
+	    overflow: hidden;
+	    background-color: #fff;
+	    break-inside: avoid;
+	    box-sizing: border-box;
+	    margin-bottom: 16rpx;
+		position: relative;
+		padding: 0 19rpx;
+		.type{
+			width: 112rpx;
+			height: 40rpx;
+			line-height: 40rpx;
+			background: linear-gradient(0deg, #4FACFE, #007AFF);
+			border-radius: 16rpx 0px 16rpx 0px;
+			position: absolute;
+			top:0;
+			left:0;
+			text-align: center;
+			font-size: 24rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #FFFFFF;
+		}
+		.title{
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+			margin: 65rpx 0 26rpx;
+		}
+		.info{
+			font-size: 24rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #999999;
+			line-height: 36rpx;
+			.icon{
+				color:#007AFF;
+				margin-right: 14rpx;
+			}
+		}
+		.btnBox{
+			display: flex;
+			justify-content: center;
+			margin: 22rpx 0;
+			.btn{
+				width: 100rpx;
+				height: 48rpx;
+				line-height: 48rpx;
+				text-align: center;
+				background: #FFFFFF;
+				border: 1px solid #007AFF;
+				border-radius: 16rpx;
+				font-size: 24rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #007AFF;
+				margin: 0 9rpx;
+			}
+		}
+	}
+}
+</style>

+ 206 - 0
pages2/subject/report.vue

@@ -0,0 +1,206 @@
+<template>
+	<view class="safeArea">
+		<view class="reportWrap">
+			<view class="reportMain">
+				<view class="title">试卷名称可换行我也不知道最多多少个字</view>
+				<view class="time">交卷时间:2021/10/22  17:24</view>
+				<view class="info">
+					<view class="left">
+						<view class="val">100<text>%</text></view>
+						<view class="name">正确率</view>
+						<view class="tip">不含简答/案例题</view>
+					</view>
+					<view class="right">
+						<view class="item">
+							<view class="label">
+								<u-icon class="icon" name="checkmark" color="#16D48B"></u-icon>正确题数
+							</view>
+							<view class="num">3</view>
+						</view>
+						<view class="item">
+							<view class="label">
+								<u-icon class="icon" name="close" color="#FF3B30"></u-icon>错误题数
+							</view>
+							<view class="num1">3</view>
+						</view>
+					</view>
+				</view>
+				<view class="btnBox">
+					<view class="btn">错题解析</view>
+					<view class="btn">全部解析</view>
+					<view class="btn">重新练习</view>
+					<view class="btn no">继续练习</view>
+				</view>
+			</view>
+			<view class="reportBt">
+				<view class="item">
+					<view class="title">试卷得分<text class="sub">(不含简答和案例题)</text></view>
+					<view class="progress">
+						
+					</view>
+				</view>
+				<view class="item">
+					<view class="title">答题时长</view>
+					<view class="progress">
+						
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+export default {
+	components: {},
+	data() {
+		return {
+			
+		};
+	},
+	onPullDownRefresh() {},
+	onLoad(option) {},
+	methods: {
+	}
+};
+</script>
+<style lang="scss">
+page {
+	background: #EAEEF1;
+}
+</style>
+<style scoped lang="scss">
+.reportWrap{
+	padding: 8rpx;
+}
+.reportMain{
+	background: #FFFFFF;
+	border-radius: 16rpx;
+	padding:16rpx;
+	.title{
+		font-size: 32rpx;
+		font-family: PingFang SC;
+		font-weight: bold;
+		color: #333333;
+		margin: 24rpx 0;
+		padding-left: 18rpx;
+	}
+	.time{
+		padding-left: 18rpx;
+		font-size: 24rpx;
+		font-family: PingFang SC;
+		font-weight: 500;
+		color: #999999;
+		margin-bottom: 40rpx;
+	}
+	.info{
+		display: flex;
+		justify-content: space-between;
+		.left{
+			width: 250rpx;
+			height: 176rpx;
+			background: #F5F5F5;
+			border-radius: 16rpx;	
+			font-size: 24rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #999999;
+			text-align: center;
+		}
+		.val{
+			font-size: 60rpx;
+			font-family: PingFang SC;
+			font-weight: 800;
+			color: #007AFF;
+			text{
+				font-size: 30rpx;
+			}
+		}
+		.name{
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+		}
+		.item{
+			width: 420rpx;
+			height: 80rpx;
+			background: #F5F5F5;
+			border-radius: 16rpx;
+			margin-bottom: 16rpx;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 400;
+			color: #666666;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			padding: 0 35rpx 0 45rpx;
+			.label{
+				display: flex;
+				align-items: center;
+			}
+			.icon{
+				margin-right: 28rpx;
+				font-size: 45rpx;
+			}
+			.num{
+				font-size: 48rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #16D48B;
+			}
+			.num1{
+				font-size: 48rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #FF3B30;
+			}
+		}
+	}
+	.btnBox{
+		display: flex;
+		justify-content: center;
+		margin: 25rpx 0 8rpx;
+		.btn{
+			width: 160rpx;
+			height: 48rpx;
+			line-height: 48rpx;
+			background: #FFFFFF;
+			border: 1px solid #007AFF;
+			border-radius: 16rpx;
+			font-size: 24rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #007AFF;
+			text-align: center;
+			margin: 0 15rpx;
+			&.no{
+				opacity: 0.3;
+			}
+		}
+	}
+}
+.reportBt{
+	display: flex;
+	justify-content: space-between;
+	margin-top:16rpx;
+	.item{
+		width: 352rpx;
+		height: 288rpx;
+		background: #FFFFFF;
+		border-radius: 16rpx;
+		padding: 24rpx 16rpx;
+		font-size: 30rpx;
+		font-family: PingFang SC;
+		font-weight: bold;
+		color: #333333;
+		.sub{
+			font-size: 20rpx;
+			font-weight: 500;
+			color: #999999;
+		}
+	}
+}
+</style>

+ 273 - 0
pages2/subject/wrong.vue

@@ -0,0 +1,273 @@
+<template>
+	<view class="safeArea">
+		<view class="sceenBox">
+			<view :class="['item', {'active':sceenType===1} ]" @click="showSceen(1)">全部题库记录<u-icon class="icon" name="arrow-down"></u-icon></view>
+			<view :class="['item', {'active':sceenType===2} ]" @click="showSceen(2)">全部试卷类型<u-icon class="icon" name="arrow-down"></u-icon></view>
+		</view>
+		<view class="sceenModel" v-if="sceenType">
+			<view class="sceenModelBg" @click="hideSceen"></view>
+			<view class="sceenMain">
+				<template v-if="sceenType===1">
+					<view :class="['item',{'active':item.checked}]" v-for="(item, index) in scennList1" :key="index" @click="choSceen(index,'tk')">{{item.name}}</view>
+				</template>
+				<template v-if="sceenType===2">
+					<view :class="['item',{'active':item.checked}]" v-for="(item, index) in scennList2" :key="index" @click="choSceen(index,'sj')">{{item.name}}</view>
+				</template>
+			</view>
+		</view>
+		<view class="wrap">
+			<view class="wrongHead">
+				<view class="title">错题统计<text class="sub">(不含简答和案例题)</text></view>
+				<view class="progress">
+					
+				</view>
+			</view>
+			<view class="wrongTab">
+				<view class="item active">试卷归类</view>
+				<view class="item">题型归类</view>
+			</view>
+			<view class="wrongList">
+				<view class="item" v-for="(item,index) in 5" :key="index">
+					<view class="title">试卷名称可换行我也不知道最多多少个字总之可以换行就对了</view>
+					<view class="bt">
+						<view class="left">错题数<text class="num">23</text></view>
+						<view class="right">
+							<view class="btn">重做</view>
+							<view class="btn">解析</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+export default {
+	components: {},
+	data() {
+		return {
+			sceenType: null,
+			scennList1:[
+				{id: 1, name: '全部题库记录', checked: true},{id: 1, name: '试卷名称可换行并完整显示'},{id: 1, name: '试卷名称可换行并完整显示'},{id: 1, name: '试卷名称可换行并完整显示'}
+			],
+			scennList2:[
+				{id: 1, name: '全部试卷类型', checked: true},{id: 1, name: '模拟卷'},{id: 1, name: '真题'},{id: 1, name: '练习'}
+			],
+		};
+	},
+	onPullDownRefresh() {},
+	onLoad(option) {},
+	methods: {
+		showSceen(type){
+			this.sceenType = type
+		},
+		hideSceen(){
+			this.sceenType = null
+		},
+		choSceen(index,type){
+			if(type==='tk'){
+				this.scennList1.forEach((item,idx)=>{
+					this.$set(item, 'checked',false)
+					if(index===idx){
+						this.$set(item, 'checked',true)
+					}
+				})
+			}
+			if(type==='sj'){
+				this.scennList2.forEach((item,idx)=>{
+					this.$set(item, 'checked',false)
+					if(index===idx){
+						this.$set(item, 'checked',true)
+					}
+				})
+			}
+			this.sceenType = null
+		}
+	}
+};
+</script>
+<style lang="scss">
+page {
+	background: #EAEEF1;
+}
+
+</style>
+<style scoped lang="scss">
+.sceenBox {
+	width:100%;
+	height: 80rpx;
+	background: #FFFFFF;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 32rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+	color: #999999;
+	position: fixed;
+	z-index: 999;
+	border-bottom: 1px solid #eee;
+	.item{
+		flex:1;
+		text-align: center;
+		&.active{
+			color:#333;
+			font-weight: bold;
+			.icon{
+				transform: rotate(180deg);
+			}
+		}
+	}
+}
+.sceenModel{
+	width:100%;
+	height:100%;
+	position: fixed;
+	z-index: 998;
+	.sceenModelBg{
+		width:100%;
+		height:100%;
+		position: fixed;
+		background: rgba(0,0,0,.3);
+		z-index: 998;
+	}
+	.sceenMain{
+		position: relative;
+		z-index: 999;
+		background: #fff;
+		margin-top: 80rpx;
+		display: flex;
+		flex-wrap: wrap;
+		padding: 8rpx;
+		justify-content: space-between;
+		.item{
+			width: 350rpx;
+			background: #F5F5F5;
+			border-radius: 16rpx;
+			padding: 25rpx 19rpx;
+			margin: 8rpx;
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #666666;
+			&.active{
+				background: #007AFF;
+				color:#fff;
+			}
+			&:first-child{
+				width:100%;
+				text-align: center;
+			}
+		}
+	}
+}
+.wrap{
+	padding:96rpx 16rpx 16rpx;
+}
+.wrongHead{
+	background: #FFFFFF;
+	border-radius: 16px;
+	padding:24rpx;
+	.title{
+		font-size: 30rpx;
+		font-family: PingFang SC;
+		font-weight: bold;
+		color: #333333;
+		.sub{
+			font-size: 20rpx;
+			font-weight: 500;
+			color: #999999;
+		}
+	}
+	.progress{
+		width: 180rpx;
+		height: 180rpx;
+		border: 20rpx solid #EEEEEE;
+		border-radius: 50%;
+		margin: 24rpx auto;
+	}
+}
+.wrongTab{
+	display: flex;
+	margin: 24rpx 0;
+	.item{
+		width: 144rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		background: #fff;
+		border-radius: 16px;
+		font-size: 28rpx;
+		font-family: PingFang SC;
+		font-weight: 500;
+		color: #666666;
+		margin-left: 15rpx;
+		&.active{
+			background: #007AFF;
+			color: #fff;
+		}
+	}
+}
+.wrongList{
+	.item{;
+		background: #FFFFFF;
+		border-radius: 16rpx;
+		padding: 0 30rpx;
+		margin-bottom: 16rpx;
+		overflow: hidden;
+		.title{
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+			margin: 40rpx 0 17rpx;
+		}
+		.bt{
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			padding-bottom: 24rpx;
+			.left{
+				width: 176rpx;
+				height: 40rpx;
+				background: #FFFFFF;
+				border: 1px solid #EEEEEE;
+				border-radius: 16rpx;
+				font-size: 26rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #999999;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				.num{
+					font-size: 26rpx;
+					font-weight: bold;
+					color: #FF3B30;
+					margin-left: 16rpx;
+				}
+			}
+			.right{
+				display: flex;
+				.btn{
+					width: 100rpx;
+					height: 48rpx;
+					background: #FFFFFF;
+					border: 1px solid #007AFF;
+					border-radius: 16px;
+					font-size: 24rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #007AFF;
+					margin-left:9rpx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+				}
+			}
+		}
+	}
+}
+</style>