wangxy 7 mesi fa
parent
commit
b26b4e425e

+ 30 - 1
api/exam.js

@@ -1,7 +1,7 @@
 import request from '@/utils/request'
 export function getExamList(data = {}) {
   return request({
-    'url': '/app/kaoshi/list',
+    'url': '/app/shiti/list',
     headers: {
       isToken: true
     },
@@ -10,3 +10,32 @@ export function getExamList(data = {}) {
     timeout: 20000
   })
 }
+
+export function getExamAnswerList(data = {}) {
+  return request({
+    'url': '/app/shiti/answer/list',
+    headers: {
+      isToken: true
+    },
+    method: 'post',
+    data,
+    timeout: 20000
+  })
+}
+
+
+function initScript() {
+	// 动态加载第三方JS文件
+	const script = document.createElement('script');
+	script.src = 'https://cdn.example.com/third-party-library.js';
+	script.onload = () => {
+		// JS文件加载完成后的回调
+		console.log('Third-party library loaded.');
+		// 你可以在这里调用第三方库的方法
+	};
+	script.onerror = () => {
+		// 处理加载错误
+		console.error('Failed to load third-party library.');
+	};
+	document.head.appendChild(script); // 或者使用 document.body.appendChild(script);
+}

+ 21 - 9
api/unitTest.js

@@ -1,12 +1,24 @@
 import request from '@/utils/request'
 export function getExamData(data = {}) {
-	return request({
-		url: "/common/zhangjie/list",
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
+  return request({
+    'url': '/app/shiti/list',
+    headers: {
+      isToken: true
+    },
+    method: 'post',
+    data,
+    timeout: 20000
+  })
+}
+
+export function getExamSubmit(data = {}) {
+  return request({
+    'url': '/app/shiti/list/submit',
+    headers: {
+      isToken: true
+    },
+    method: 'post',
+    data,
+    timeout: 20000
+  })
 }

+ 22 - 3
components/catalogue/catalogue.vue

@@ -11,7 +11,7 @@
 			</template>
 			<!-- 目录区域 -->
 			<uni-collapse v-model="activeCollapse" class="collapse-container" accordion>
-				<uni-collapse-item title-border="none" :border="false" v-for="(item,index) in list">
+				<uni-collapse-item title-border="none" :border="false" :name="index" v-for="(item,index) in list">
 					<template v-slot:title>
 						<view class="title-layout">
 							<view @click.stop="handleSelectZhang(item)" class="text-container">
@@ -19,6 +19,10 @@
 								<!-- 章名 -->
 								<text class="text-white">{{item.zhangName}}</text>
 							</view>
+							<!-- 三角图标 双色激活不同图标 -->
+							<uni-icons v-if="activeCollapse === index" type="right" size="16" style="justify-self: flex-end;"></uni-icons>
+							<uni-icons v-else type="right" size="16" style="justify-self: flex-end;"></uni-icons>
+							<!-- 三角图标完结 -->
 							<uni-icons :class="['right-icon']" @click="handleExpand" type="locked-filled" size="16" style="justify-self: flex-end;"></uni-icons>
 						</view>
 					</template>
@@ -90,13 +94,23 @@
 	function handleClose() {
 		popupRef.value.close();
 	}
-
+	function getNextZhangData(data) {
+		const index = list.value.findIndex(item => item.zhangId === data.zhangId);
+		console.log(index);
+		if (index === list.value.length -1) {
+			return {}
+		} else {
+			return list.value[index+1]
+		}
+	}
 	/**
 	 * @summary 选中
 	 * @param({zhangId:string}) data
 	 */ 
 	function handleSelectZhang(data) {
-		$emit('change-zhang', Object.assign({},data));
+		const nextZhang = getNextZhangData(data);
+		console.log('nextZhang',nextZhang)
+		$emit('change-zhang', Object.assign({},data, {nextZhang}));
 		handleClose();
 	}
 
@@ -174,4 +188,9 @@
 	.jie-index {
 		margin-right: 5px;
 	}
+	
+	.active {
+		rotate: 90deg;
+		color: red;
+	}
 </style>

+ 55 - 6
components/points/uni-points.vue

@@ -1,13 +1,62 @@
 <template>
-	<view>
-		
-	</view>
+	<uni-popup ref="popupRef" :mask-background-color="popup_background_color">
+		答对: {{data.right}}题,
+		答错:{{data.wrong}}题
+		已成功获得 {{data.jifen}}积分
+
+		<button @click="checkAnswer">查看试题</button>
+		<button @click="goStudyContinue">继续学习</button>
+	</uni-popup>
 </template>
 
 <script setup>
-	
+	import {
+		ref,
+		reactive
+	} from "vue"
+	const popupRef = ref(null)
+	const popup_background_color = `rgba(0,0,0,0.2)`; // 【弹出框模态层背景颜色】
+
+	const emits = defineEmits(['checkAnswer', 'goStudy']);
+
+	const data = reactive({
+		right: 0,
+		wrong: 0,
+		jifen: 0
+	})
+
+	// 切换成绩
+	function showPopup({
+		right,
+		wrong,
+		jifen
+	}) {
+		data.right = right;
+		data.wrong = wrong;
+		data.jifen = jifen;
+		popupRef.value.open()
+	}
+
+	function closePopup() {
+		popupRef.value.close()
+	}
+
+	// 查看答案
+	function checkAnswer() {
+		emits('checkAnswer');
+		closePopup();
+	}
+	// 继续学习
+	function goStudyContinue() {
+		emits('goStudy');
+		closePopup();
+	}
+
+	defineExpose({
+		showPopup
+	})
 </script>
 
 <style>
-	       
-</style>
+
+</style>

+ 1 - 1
index.html

@@ -2,7 +2,7 @@
 <html lang="en">
 	<head>
 		<meta charset="UTF-8" />
-		<script src="https://g.alicdn.com/AWSC/AWSC/awsc.js"></script>
+		<!-- <script src="https://g.alicdn.com/AWSC/AWSC/awsc.js"></script> -->
 		<script>
 			var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
 				CSS.supports('top: constant(a)'))

+ 13 - 13
pages/login/index.vue

@@ -37,15 +37,15 @@
 		telStatus:'',
 		isAgreed: false,
 		sliderObj:{},
-	})
+	})
 	let sliderObj = reactive({
-		sessionId:'',
-		sig:'',
+		sessionId:'',
+		sig:'',
 		token:'',
 	})
 	
 	const agreeDialogRef = ref(null);
-	
+
 	onLoad((options) => {
 		console.log(options,'options66666');
 		getAWSC();
@@ -63,13 +63,13 @@
 		            // 声明滑动验证需要渲染的目标ID。
 		            renderTo: "yzm-slider",
 		            //前端滑动验证通过时会触发该回调参数。您可以在该回调参数中将会话ID(sessionId)、签名串(sig)、请求唯一标识(token)字段记录下来,随业务请求一同发送至您的服务端调用验签。
-		            success: function (item) {
-						console.log(item)
-					
-						// sliderObj.sessionId = item.sessionId
-						// sliderObj.sig = item.sig
+		            success: function (item) {
+						console.log(item)
+					
+						// sliderObj.sessionId = item.sessionId
+						// sliderObj.sig = item.sig
 						// sliderObj.token = item.token
-						Object.assign(sliderObj,item)
+						Object.assign(sliderObj,item)
 						console.log(sliderObj)
 		            },
 		            // 滑动验证失败时触发该回调参数。
@@ -83,7 +83,7 @@
 		        });
 		    })
 	}
-	
+
 	const getYzmBtn = () => {
 			
 		uni.navigateTo({
@@ -121,9 +121,9 @@
 	const agreeBtn = () => {
 		agreeDialogRef.value.handleShow();
 	};
-	
+
 	const handleAgreementChange= (event) => {
-		console.log(event,'event');	
+		console.log(event,'event');
 
 		/* if(indexData.isAgreed){
 			indexData.isAgreed = !indexData.isAgreed;

+ 12 - 3
pages/selectGradesTerms/useSelectGrade.js

@@ -1,8 +1,11 @@
 import { reactive, toRefs } from "vue";
 import { nianji_list, xueqi_list } from "@/utils/constant.js";
 import { onLoad } from "@dcloudio/uni-app";
+import {useStudyRouteParams} from "@/utils/emitEvents.js"
 
 export function useSelectGrade() {
+  const {setStudyStorage} = useStudyRouteParams();		
+	
   const data = reactive({
     activeNianji: null, // 当前年级
     activeXueqi: null, // 当前学期
@@ -48,9 +51,15 @@ export function useSelectGrade() {
 
   // 跳转 岛 学习
   function goDAOToStudy({ nianji, xueqi, text }) {
-    uni.navigateTo({
-      url: `/pages/study/index?nianji=${nianji}&xueqi=${xueqi}&text=${text}`,
-    });
+	  
+	  // 从 单元测试 到 岛 的路由参数
+	 setStudyStorage({
+	  	xueqi: data.activeXueqi,
+	  	nianji: data.activeNianji,
+	  });
+	  uni.switchTab({
+	  	url: `/pages/study/index`
+	  })
   }
 
   return {

+ 39 - 12
pages/study/index.vue

@@ -1,15 +1,18 @@
 <template>
 	<view>
 		<view @click="goBack">{{gradeTerm.text}}</view>
+
+		<view>缓存数据1:{{routeParams}}</view>
 		<view>
 			<view v-for="item in data.list" :key="item.index" @click="listClick"> {{item.index}} {{item.label}} </view>
 		</view>
 		<view>
 			<uni-button @click="handleCheckCatalogue">go catalogue</uni-button>
+			<uni-button @click="goKaoshi">goKaoshi</uni-button>
 			<navigator :url="`/pages/study/catalogue?gradeId=1&termId=1&text=一年级上册`" hover-class="navigator-hover">
 				<button type="default">学习计划</button>
 			</navigator>
-			<navigator url="/pages/selectGradesTerms/index" hover-class="navigator-hover">
+			<navigator url="/pages/unitTest/index" hover-class="navigator-hover">
 				<button type="default">成长</button>
 			</navigator>
 			<navigator url="navigate/navigate?title=navigate" hover-class="navigator-hover">
@@ -21,7 +24,7 @@
 		</view>
 
 		<!-- 蛋 -->
-		<view class="ezy-popup" >蛋</view>
+		<view class="ezy-popup">蛋</view>
 
 
 		<catalogue ref="catalogueRef" @change-zhang="handleChangeZhang"></catalogue>
@@ -30,18 +33,33 @@
 
 <script setup>
 	import {
-		reactive,ref,onMounted
+		reactive,
+		ref,
+		onMounted
 	} from "vue";
-	import { onLoad,onReady } from '@dcloudio/uni-app';
+	import {
+		onLoad,
+		onReady
+	} from '@dcloudio/uni-app';
 	import catalogue from "@/components/catalogue/catalogue.vue";
-
-
+	import {
+		useStudyRouteParams
+	} from "@/utils/emitEvents.js"
+	
+	// 缓存操作
+	const {getStudyStorage,removeStudyStorage} = useStudyRouteParams();
 	const catalogueRef = ref(null);
-
-	const gradeTerm = ref('')
+	const gradeTerm = ref('');
+	const selectZhang = ref(null);
+	// 来自单元测试的路由参数缓存
+	const routeParams = ref(null);
 
 	onLoad((options) => {
 		gradeTerm.value = options;
+		// 获取路由参数
+		routeParams.value = getStudyStorage();
+		// 移除缓存
+		removeStudyStorage();
 	})
 
 	const data = reactive({
@@ -65,13 +83,22 @@
 	})
 
 	function handleChangeZhang(data) {
-		console.log('章:', data);
-	}
+		console.log("章", data);
+		selectZhang.value = data;
+	}
+
+	function goKaoshi() {
+		uni.navigateTo({
+			url: `/pages/unitTest/index?jieId=1&nextZhangId=${selectZhang.value.nextZhang.zhangId}&zhangId=${selectZhang.value.zhangId}`
+		})
+	}
+
 	function listClick(data) {
-		uni.navigateTo({
-			url:'/pages/study/lookShipin'
+		uni.navigateTo({
+			url: '/pages/study/lookShipin'
 		})
 	}
+
 	function handleCheckCatalogue() {
 		catalogueRef.value.showPopup();
 	}

+ 62 - 19
pages/unitTest/index.vue

@@ -1,22 +1,43 @@
 <template>
 	<view>
-		<uni-icons type="left" size="30"></uni-icons>
-		<text>单元测试</text>
-		<view><text>{{count}}</text>/<text>{{total}}</text></view>
+		<view>
+			<uni-icons type="left" size="30" @click=""></uni-icons>
+			<text>单元测试</text>
+			<view><text>{{count}}</text>/<text>{{total}}</text></view>
+		</view>
+		<w-swiper :list="list" :swiperHeight="300" :positionIndex="current">
+			<template v-slot:default="{item}">
+				<view class="body" v-if="item.mta_show">
+					<danxuan :question="item" v-if="item.type == '1'"></danxuan>
+					<panduan :question="item" v-if="item.type == '2'"></panduan>
+					<tiankong :question="item" v-if="item.type == '3'"></tiankong>
+				</view>
+			</template>
+		</w-swiper>
+		<button class="transition-button" v-if="isLast" type="primary"
+			@click="handleSubmit(uniPointsRef)">submit</button>
+
+		<!-- 答卷 -->
+		<chengji ref="chengjiRef" :list="list" :jieId="jieId" :zhangId="zhangId" :nextZhangId="nextZhangId"
+			:nianji="nianji"></chengji>
+
+		<!-- 分数弹窗 -->
+		<uniPointsVue ref="uniPointsRef" @checkAnswer="checkAnswer" @goStudy="goStudyContinue"></uniPointsVue>
 	</view>
-	<swiper class="swiper-box" @change="onChange" @animationfinish="onAnimationfinish" :current="current">
-		<swiper-item v-for="(item ,index) in list" :key="index">
-			<view class="swiper-item">
-				{{item}}
-			</view>
-		</swiper-item>
-	</swiper>
-	<button class="transition-button" v-if="!isLast" type="primary" @click="nextQuestion">next</button>
-	<button class="transition-button" v-if="!isFirst" type="primary" @click="prevQuestion">prev</button>
-	<button class="transition-button" v-if="isLast" type="primary" @click="handleSubmit">submit</button>
+
 </template>
 
 <script setup>
+	import questionJiexi from '@/components/questionJiexi/questionJiexi.vue';
+	import wSwiper from '@/components/wSwiper/wSwiper.vue';
+	import danxuan from "@/components/question/danxuan.vue";
+	import panduan from "@/components/question/panduan.vue";
+	import tiankong from "@/components/question/tiankong.vue";
+	import chengji from "@/components/chengji/chengji.vue";
+	import uniPointsVue from '@/components/points/uni-points.vue';
+	import {
+		useStudyRouteParams
+	} from "@/utils/emitEvents.js"
 	import {
 		useExam
 	} from './useUnit';
@@ -25,6 +46,8 @@
 		onMounted
 	} from "vue";
 
+	const {setStudyStorage} = useStudyRouteParams();
+
 	const {
 		isFirst,
 		isLast,
@@ -35,21 +58,41 @@
 		rightAnswer,
 		wrongAnswer,
 		jifen,
+		zhangId,
+		jieId,
+		nextZhangId,
+		nianji,
 
 		nextQuestion,
 		prevQuestion,
 		handleSubmit,
 		initPage
 	} = useExam();
-	
-	// swiper change 回调
-	function onChange(e) {
-		current.value = e.detail.current;
+
+	const uniPointsRef = ref(null);
+	const chengjiRef = ref(null);
+
+	function sendDataToStudyPage() {
+		// 设置 从单元测试 到 岛 的路由参数
+		setStudyStorage({
+			zhangId: zhangId.value,
+			nianji: nianji.value,
+			jieId: jieId.value,
+			nextZhangId: nextZhangId.value
+		});
 	}
+
 	// 查看答案
-	function checkAnswer() {}
+	function checkAnswer() {
+		chengjiRef.value.showPopup();
+	}
 	// 继续学习
-	function goStudyContinue() {}
+	function goStudyContinue() {
+		sendDataToStudyPage();
+		uni.switchTab({
+			url: `/pages/study/index?zhangId`
+		})
+	}
 </script>
 
 <style lang="scss" scoped>

+ 48 - 23
pages/unitTest/useUnit.js

@@ -8,6 +8,7 @@ import {
 	computed,
 	toRefs,
 	onMounted,
+	watch
 } from "vue";
 import {
 	catchError,
@@ -35,7 +36,7 @@ function useJifen() {
 	}
 }
 
-export function useExam(dom) {
+export function useExam() {
 	const {rightAnswer,wrongAnswer,jifen, updateJifen} = useJifen();
 	
 	const data = reactive({
@@ -44,6 +45,24 @@ export function useExam(dom) {
 		current: 0, // 当前试题序列
 		list: [], // 试题列表
 		jieId: null, // 节Id
+		zhangId: null,
+		nextZhangId: null,
+		nianji: null,
+	})
+	
+	onLoad((options) => {
+		const {
+			jieId,zhangId,nextZhangId,nianji
+		} = options;
+		data.jieId = jieId; // 需要路由参数 节Id
+		data.zhangId = zhangId;// 需要路由参数 章Id
+		data.nextZhangId = nextZhangId; // 需要下一张id 来执行返回页面
+		data.nianji = nianji; // 需要年纪Id 来执行返回页面
+		
+		uni.$on('from.pages.study.index',(val) => {console.log('cccc',val)})
+		
+		// 初始化页面数据
+		initPage();
 	})
 	
 	// 当前试题
@@ -59,16 +78,11 @@ export function useExam(dom) {
 		const clength = data.list.length;
 		return activeQa.value.id === data.list[clength - 1].id;
 	})
+	watch(() => data.list, (val) => {
+		const list = data.list.filter(item => item.reply!==null);
+		data.count = list.length;
+	},{deep: true})
 
-	onLoad((options) => {
-		const {
-			jieId
-		} = options;
-		data.jieId = jieId;
-
-		// 初始化页面数据
-		initPage();
-	})
 
 	// 下一题
 	function nextQuestion() {
@@ -82,27 +96,40 @@ export function useExam(dom) {
 
 	// 初始化页面数据
 	async function initPage() {
-		const [err, data] = await catchError(httpUnit.getExamData({
-			nianji: 1,
-			xueqi: 1
+		const [err, cdata] = await catchError(httpUnit.getExamData({
+			jieId: data.jieId
 		}));
 		if (err) {
 			toast("单元测试数据获取异常");
 			return;
 		}
-		refreshExam(data);
+		refreshExam(cdata);
+	}
+
+	function formatListToUse(list) {
+		list.forEach((item, index) => {
+			item.mta_show = false;
+			item.reply = null;
+		})
 	}
 
 	// 数据赋值
 	function refreshExam(list) {
-		// FIXME 模拟id 待删除
-		list.forEach((item, index) => item.id = index)
-		data.list = list;
-		data.total = list.length;
+		const cList = list;
+		formatListToUse(cList)
+		data.list = cList;
+		data.total = cList.length;
 	}
 
 	// 交卷
-	function handleSubmit() {}
+	function handleSubmit(dom) {
+		// const [error, data] =await catchError(httpUnit.getExamSubmit({}));
+		dom.showPopup({
+			right:1,
+			wrong:0,
+			jifen:20
+		});
+	}
 
 
 	return {
@@ -110,9 +137,6 @@ export function useExam(dom) {
 		activeQa,
 		isFirst,
 		isLast,
-		isFirst,
-		isLast,
-		
 		rightAnswer,
 		wrongAnswer,
 		jifen,
@@ -122,4 +146,5 @@ export function useExam(dom) {
 		handleSubmit,
 		initPage
 	}
-}
+}
+