Bladeren bron

修改跳转

wangxy 1 maand geleden
bovenliggende
commit
3b2d55cae7

+ 24 - 0
api/selectGradesTerms.js

@@ -0,0 +1,24 @@
+import request from '@/utils/request'
+export function getCommonTree(data = {}) {
+    return request({
+        'url': '/common/tree',
+        headers: {
+            isToken: false
+        },
+        method: 'post',
+        data,
+        timeout: 20000
+    })
+}
+
+export function getIndexTree(data = {}) {
+    return request({
+        'url': '/app/index/tree',
+        headers: {
+            isToken: true
+        },
+        method: 'post',
+        data,
+        timeout: 20000
+    })
+}

+ 15 - 19
components/catalogue/catalogue.vue

@@ -5,14 +5,14 @@
 			:style="{backgroundImage: 'url(' + catalogueBjFun() + ')'}">
 			<uni-icons @click="handleClose" class="catalogue-close-btn"></uni-icons>
 			<!-- 当前上下册只针对数学 -->
-			<view v-if="cardId == 1" class="catalogue-nianji-title">L{{nianji}}上</view>
+			<view v-if="subjectId == 1" class="catalogue-levelId-title">L{{levelId}}上</view>
 			<!-- 目录区域 -->
 			<uni-collapse v-model="activeCollapse" class="ezy-catalogue-collapse"
 				:class="{ 'ezy-catalogue-collapse-vip': AuthCode === 'VIP'}" accordion>
 				<template v-for="(item,index) in list">
 					<!-- 当前上下册只针对数学 -->
-					<view v-if="cardId == 1 && index == shuxueShangxia" class="catalogue-nianji-title catalogue-mt">
-						L{{nianji}}下</view>
+					<view v-if="subjectId == 1 && index == shuxueShangxia" class="catalogue-levelId-title catalogue-mt">
+						L{{levelId}}下</view>
 					<uni-collapse-item title-border="none" :border="false" :name="index+''" class="collapse-item-box"
 						:class="{ 'collapse-active': activeCollapse === index+''}">
 						<template v-slot:title>
@@ -49,12 +49,8 @@
 	} from './useCatalogue';
 	import {
 		ref,
-		nextTick
 	} from "vue";
 	import {
-		toast
-	} from "@/utils/common.js"
-	import {
 		getUserIdentity
 	} from "@/utils/common.js"
 	import {
@@ -84,24 +80,24 @@
 	const growthType = ref(null);
 	const AuthCode = ref(null);
 	const scrollTop = ref(0)
-	const cardId = ref(null)
+	const subjectId = ref(null)
 	const shuxueShangxia = ref(0);
-	const nianji = ref(null);
+	const levelId = ref(null);
 
 	onShow(() => AuthCode.value = getUserIdentity()); // 用户身份
 	onLoad((options) => {
 		if (cacheManager.get('auth')) {
-			cardId.value = cacheManager.get('auth').cardId;
+			subjectId.value = cacheManager.get('auth').subjectId;
 		} else {
-			cardId.value = options.cardId;
+			subjectId.value = options.subjectId;
 		}
-		if (cardId.value == 1) {
+		if (subjectId.value == 1) {
 			if (cacheManager.get('auth')) {
-				nianji.value = cacheManager.get('auth').nianji;
+				levelId.value = cacheManager.get('auth').levelId;
 			} else {
-				nianji.value = options.nianji;
+				levelId.value = options.levelId;
 			}
-			shuxueShangxia.value = ShuxueObj[nianji.value];
+			shuxueShangxia.value = ShuxueObj[levelId.value];
 		}
 
 	})
@@ -148,10 +144,10 @@
 	}
 
 	function catalogueBjFun() {
-		if (cardId.value == 1) {
+		if (subjectId.value == 1) {
 			// 数学
 			return 'static/images/catalog/catalog-shuxue-bj.png'
-		} else if (cardId.value == 2) {
+		} else if (subjectId.value == 2) {
 			// 英语
 			return 'static/images/catalog/catalog-yingyu-bj.png'
 		}
@@ -175,7 +171,7 @@
 			// 滚动高度
 			callback = () => {
 				console.log('uni.getTopWindowStyle()', uni.getSystemInfoSync().screenWidth)
-				if (cardId.value == 2) {
+				if (subjectId.value == 2) {
 					// 英语
 					activeCollapse.value = index + '';
 					scrollTop.value = (uni.getSystemInfoSync().screenWidth / 750) * 50 * index;
@@ -237,7 +233,7 @@
 
 	function handleConfirmPay() {
 		const url =
-			`/pages/pay/svip?cardId=${cardId.value}&formPage=studyWithCatalgue&selectZhangId=${selectZhang.value.zhangId}`
+			`/pages/pay/svip?subjectId=${subjectId.value}&formPage=studyWithCatalgue&selectZhangId=${selectZhang.value.zhangId}`
 		uni.redirectTo({
 			url
 		})

+ 10 - 10
components/catalogue/useCatalogue.js

@@ -15,28 +15,28 @@ import {getUserIdentity} from "@/utils/common.js"
 		
 export function useCatalogue() {
 	const data = reactive({
-		xueke: null,
-		nianji: null
+		levelId: null,
+		subjectId: null
 	})
 	
 	const userCode = getUserIdentity();
 
-	onLoad(({nianji,cardId}) => {
+	onLoad(({subjectId,levelId}) => {
 		if (userCode !== 'Visitor') {
 			const auth = cacheManager.get('auth');
-			const { cardId:cardId_, nianji:nianji_ } = auth
-			data.nianji = nianji_ || null;
-			data.xueke = cardId_ || null;
+			const { levelId:levelId, subjectId:subjectId } = auth
+			data.subjectId = subjectId || null;
+			data.levelId = levelId || null;
 		} else {
-			data.nianji = nianji || null;
-			data.xueke = cardId || null;
+			data.subjectId = subjectId || null;
+			data.levelId = levelId || null;
 		}
 	});
 
 	async function getCatalogue() {
 		return await catchError(httpCatalogue.getCatalogue({
-			nianji: +data.nianji,
-			cardId: +data.xueke
+			subjectId: +data.subjectId,
+			levelId: +data.levelId
 		}));
 	}
 

+ 83 - 64
pages/selectGradesTerms/index.vue

@@ -8,76 +8,79 @@
 			<view class="grades-change-title"></view>
 			<text class="grades-title-desc">我们会根据您选择,为您匹配对应的学习内容</text>
 			<view class="grades-terms-title terms-title-img"></view>
-			<view class="grade-item-box">
-				<view v-for="item in xueke_list" :key="item.id" @click="handleSelectXueke(item)"
-					:class="['grade-item',{active: item.id == activeXueke}]">{{item.label}}</view>
-			</view>
-			<view class="grades-terms-title grades-title-img"></view>
-			<view class="grade-item-box" v-if="activeXueke != 2">
-				<!-- 数学 -->
-				<view v-for="item in nianji_list" :key="item.id" @click="handleSelectGrade(item)"
-					:class="['grade-item', {active: item.id == activeNianji}]">{{item.label}}</view>
-			</view>
-			<view class="grade-item-box" v-else>
-				<!-- 英语 -->
-				<template v-for="item in nianji_list" :key="item.id">
-					<view  @click="handleSelectGrade(item)" v-if="item.id != 6"
-						:class="['grade-item', {active: item.id == activeNianji}]">{{item.label}}</view>
-					<view v-else class="grade-yingyu-item"></view>
-				</template>
-		
-			</view>
-			<view class="grade-line"></view>
+      <view class="grade-item-box">
+        <view :key="xueke.id" @click="handleSelectXueke(xueke)" v-for="xueke in xuekeData"
+              :class="['grade-item',{active: xueke.id == activeXueke}]">{{xueke.lable}}</view>
+      </view>
+      <view class="grades-terms-title grades-title-img"></view>
+      <view class="grade-item-box">
+        <!-- 产品 -->
+        <view v-for="item in xuekeList" :key="item.id" @click="handleSelectGrade(item)"
+              :class="['grade-item', {active: item.id == activeProduct}]">{{item.lable}}</view>
+      </view>
+      <view class="grade-line"></view>
 			<button class="grade-confirm-btn" @click="handleConfirm"></button>
 		</view>
-		<coming-soon-dialog ref="comingSoonDialogRef"></coming-soon-dialog>
 	</view>
 </template>
 
 <script setup>
-	import comingSoonDialog from './comingSoonDialog.vue';
+
 	import {
 		reactive,
 		toRefs,
-		ref,
+    computed
 	} from "vue";
-	import {
-		nianji_list,
-		xueke_list,
-	} from "@/utils/constant.js";
+  import * as httpApi from "@/api/selectGradesTerms.js";
 	import {
 		onLoad
 	} from "@dcloudio/uni-app";
-	import {getUserIdentity} from "@/utils/common.js"
+	import {getUserIdentity,findRootParentId,findTreeNode} from "@/utils/common.js"
 	import cacheManager from "@/utils/cacheManager.js"
-  import {getCardOnline} from "../../api/catalogue";
+  import {getCommonTree, getIndexTree} from "../../api/selectGradesTerms";
 
-	const comingSoonDialogRef = ref(null);
 	function useSelectGrade() {
 		const userCode = getUserIdentity();
+
 		const data = reactive({
-			activeNianji: null, // 当前年级
+			activeProduct: null, // 当前年级
 			activeXueke: null, // 当前学期
 			activeTipFlag: null, // 当前学期
+      xuekeData: [], // 学科总数据
 		});
 
-		onLoad(({nianji,cardId,tipFlag}) => {
-
+		onLoad(({productId,xuekeId,tipFlag}) => {
 			if (userCode !== 'Visitor') {
-				const {
-					nianji: nianji_,
-					cardId: cardId_
-				} = cacheManager.get('auth');
-				data.activeNianji = nianji_;
-				data.activeXueke = cardId_;
+        initUserProducts();
 			} else {
-				data.activeNianji = nianji;
-				data.activeXueke = cardId;
-				data.activeTipFlag = tipFlag || '0';
+        data.activeProduct = productId;
+        data.activeXueke = xuekeId;
+        data.activeTipFlag = tipFlag || '0';
+        initVisitProducts();
 			}
-	
 		});
 
+    // 初始化游客产品数据
+    function initVisitProducts() {
+      httpApi.getCommonTree().then(res => {
+        data.xuekeData = res.data||[];
+      })
+    }
+
+    function initUserProducts() {
+      httpApi.getIndexTree().then(res => {
+        data.xuekeData = res.data||[];
+      })
+
+      const {
+        levelId
+      } = cacheManager.get('auth');
+      const xuekeObj = findRootParentId(data.xuekeData, levelId,'levelId');
+      const productObj = findTreeNode(data.xuekeData, levelId,'levelId');
+      data.activeProduct = productObj.id;
+      data.activeXueke = xuekeObj.id;
+    }
+
 		// 选择 年级+学期
 		function handleConfirm() {
 			if (!data.activeXueke) {
@@ -88,7 +91,7 @@
 				});
 				return;
 			}
-			if (!data.activeNianji) {
+			if (!data.activeProduct) {
 				uni.showToast({
 					title: "请选择课程等级",
 					duration: 2000,
@@ -96,36 +99,41 @@
 				});
 				return;
 			}
-
-      getCardOnline({cardId: data.activeXueke,nianji: data.activeNianji}).then(res => {
-        if (res.data) {
-          goDAOToStudy();
-        } else {
-          comingSoonDialogRef.value.handleShow();
-        }
-      })
+      goDAOToStudy();
 		}
 
 		// 跳转 岛 学习
 		function goDAOToStudy() {
+      const Product = data.xuekeData.find(item => item.id == data.activeXueke).children.find(item => item.id == data.activeProduct)
+      const levelId = Product.levelId;
+      const typeId = Product.typeId;
+      const subjectId = Product.subjectId;
+
 			if (userCode !== 'Visitor') {
 				const auth = cacheManager.get('auth');
 				cacheManager.updateObject('auth', {
-					nianji: data.activeNianji,
-					zhangId: data.activeNianji == auth.nianji && data.activeXueke == auth.cardId ? auth.zhangId: 0,
-					cardId: data.activeXueke,
-					currentZhang: 0
+          typeId: typeId,
+          levelId: levelId,
+          zhangId: data.activeProduct == auth.nianji && data.activeXueke == auth.cardId ? auth.zhangId: 0,
+          currentZhang: 0
 				})
 				cacheManager.remove('daoPageCache')
-				// 数序
 				uni.redirectTo({
 					url: `/pages/study/index`
 				})
 			} else {
-				// 数序
-				uni.redirectTo({
-					url: `/pages/study/index?nianji=${data.activeNianji}&cardId=${data.activeXueke}&zhangId=0&tipFlag=${data.activeTipFlag}`
-				})
+        if (typeId == 1) {
+          // 新岛
+          uni.redirectTo({
+            url: `/pages/study/index?levelId=${levelId}&typeId=${typeId}&subjectId=${subjectId}&tipFlag=${data.activeTipFlag}`
+          })
+        } else {
+          // 旧岛
+          uni.redirectTo({
+            url: `/pages/study/index?levelId=${levelId}&typeId=${typeId}&subjectId=${subjectId}&zhangId=0&tipFlag=${data.activeTipFlag}`
+          })
+        }
+
 			}
 
 		}
@@ -146,18 +154,29 @@
 	}
 
 	const {
-		activeNianji,
+		activeProduct,
 		activeXueke,
+    xuekeData,
 		handleConfirm,
 		handleBack
 	} = useSelectGrade()
 
-	function handleSelectGrade(item) {
-		activeNianji.value = item.id;
+  const xuekeList = computed(() => {
+
+    if (!xuekeData.value.length) {
+      return []
+    }
+    const d_id = activeXueke.value || xuekeData.value[0].id;
+    return xuekeData.value.find(item => item.id == d_id).children
+  })
+
+  function handleSelectGrade(item) {
+		activeProduct.value = item.id;
 	}
 
 	function handleSelectXueke(item) {
 		activeXueke.value = item.id;
+    activeProduct.value = null;
 	}
 	
 

+ 164 - 0
pages/selectGradesTerms/index2.vue

@@ -0,0 +1,164 @@
+<template>
+	<view class="grades-terms-page">
+		<view class="icon-title-navBar-box">
+			<!-- 返回按钮↓ -->
+			<view class="nav-bar-icon"  @click="handleBack"></view>
+		</view>
+		<view class="grades-body">
+			<view class="grades-change-title"></view>
+			<text class="grades-title-desc">我们会根据您选择,为您匹配对应的学习内容</text>
+			<view class="grades-terms-title terms-title-img"></view>
+			<view class="grade-item-box">
+				<view v-for="item in xueke_list" :key="item.id" @click="handleSelectXueke(item)"
+					:class="['grade-item',{active: item.id == activeXueke}]">{{item.label}}</view>
+			</view>
+			<view class="grades-terms-title grades-title-img"></view>
+			<view class="grade-item-box" v-if="activeXueke != 2">
+				<!-- 数学 -->
+				<view v-for="item in nianji_list" :key="item.id" @click="handleSelectGrade(item)"
+					:class="['grade-item', {active: item.id == activeNianji}]">{{item.label}}</view>
+			</view>
+			<view class="grade-item-box" v-else>
+				<!-- 英语 -->
+				<template v-for="item in nianji_list" :key="item.id">
+					<view  @click="handleSelectGrade(item)" v-if="item.id != 6"
+						:class="['grade-item', {active: item.id == activeNianji}]">{{item.label}}</view>
+					<view v-else class="grade-yingyu-item"></view>
+				</template>
+		
+			</view>
+			<view class="grade-line"></view>
+			<button class="grade-confirm-btn" @click="handleConfirm"></button>
+		</view>
+		<coming-soon-dialog ref="comingSoonDialogRef"></coming-soon-dialog>
+	</view>
+</template>
+
+<script setup>
+	import comingSoonDialog from './comingSoonDialog.vue';
+	import {
+		reactive,
+		toRefs,
+		ref,
+	} from "vue";
+	import {
+		nianji_list,
+		xueke_list,
+	} from "@/utils/constant.js";
+	import {
+		onLoad
+	} from "@dcloudio/uni-app";
+	import {getUserIdentity} from "@/utils/common.js"
+	import cacheManager from "@/utils/cacheManager.js"
+  import {getCardOnline} from "../../api/catalogue";
+
+	const comingSoonDialogRef = ref(null);
+	function useSelectGrade() {
+		const userCode = getUserIdentity();
+		const data = reactive({
+			activeNianji: null, // 当前年级
+			activeXueke: null, // 当前学期
+			activeTipFlag: null, // 当前学期
+		});
+
+		onLoad(({nianji,cardId,tipFlag}) => {
+
+			if (userCode !== 'Visitor') {
+				const {
+					nianji: nianji_,
+					cardId: cardId_
+				} = cacheManager.get('auth');
+				data.activeNianji = nianji_;
+				data.activeXueke = cardId_;
+			} else {
+				data.activeNianji = nianji;
+				data.activeXueke = cardId;
+				data.activeTipFlag = tipFlag || '0';
+			}
+	
+		});
+
+		// 选择 年级+学期
+		function handleConfirm() {
+			if (!data.activeXueke) {
+				uni.showToast({
+					title: "请选择课程类别",
+					duration: 2000,
+					icon: 'error'
+				});
+				return;
+			}
+			if (!data.activeNianji) {
+				uni.showToast({
+					title: "请选择课程等级",
+					duration: 2000,
+					icon: 'error'
+				});
+				return;
+			}
+
+      getCardOnline({cardId: data.activeXueke,nianji: data.activeNianji}).then(res => {
+        if (res.data) {
+          goDAOToStudy();
+        } else {
+          comingSoonDialogRef.value.handleShow();
+        }
+      })
+		}
+
+		// 跳转 岛 学习
+		function goDAOToStudy() {
+			if (userCode !== 'Visitor') {
+				const auth = cacheManager.get('auth');
+				cacheManager.updateObject('auth', {
+					nianji: data.activeNianji,
+					zhangId: data.activeNianji == auth.nianji && data.activeXueke == auth.cardId ? auth.zhangId: 0,
+					cardId: data.activeXueke,
+					currentZhang: 0
+				})
+				cacheManager.remove('daoPageCache')
+				// 数序
+				uni.redirectTo({
+					url: `/pages/study/index`
+				})
+			} else {
+				// 数序
+				uni.redirectTo({
+					url: `/pages/study/index?nianji=${data.activeNianji}&cardId=${data.activeXueke}&zhangId=0&tipFlag=${data.activeTipFlag}`
+				})
+			}
+
+		}
+		function handleBack() {
+			if (userCode !== 'Visitor') {
+				uni.redirectTo({ url: `/pages/study/index`})
+			} else {
+				uni.redirectTo({url: '/pages/login/index'})
+			}
+		}
+		
+		return {
+			...toRefs(data),
+			handleBack,
+			// 方法
+			handleConfirm, // 选择年级+学科
+		};
+	}
+
+	const {
+		activeNianji,
+		activeXueke,
+		handleConfirm,
+		handleBack
+	} = useSelectGrade()
+
+	function handleSelectGrade(item) {
+		activeNianji.value = item.id;
+	}
+
+	function handleSelectXueke(item) {
+		activeXueke.value = item.id;
+	}
+	
+
+</script>

+ 33 - 0
utils/common.js

@@ -96,4 +96,37 @@ export function debounce(func, wait) {
       func.apply(this, args);
     }, wait);
   };
+}
+
+
+export function findRootParentId(tree, targetId, idKey = 'id', childrenKey = 'children') {
+	let result = null;
+
+	function traverse(nodes, path = []) {
+		for (const node of nodes) {
+			const currentPath = [...path, node[idKey]]; // 记录当前路径
+			if (node[idKey] === targetId) {
+				result = path[0]; // 取路径首位作为顶层ID
+				return true;
+			}
+			if (node[childrenKey]?.length) {
+				if (traverse(node[childrenKey], currentPath)) return true;
+			}
+		}
+		return false;
+	}
+
+	traverse(tree);
+	return result;
+}
+
+export function findTreeNode(tree, targetId, childrenKey = 'children', idKey = 'id') {
+	for (const node of tree) {
+		if (node[idKey] === targetId) return node;
+		if (node[childrenKey]?.length) {
+			const found = findTreeNode(node[childrenKey], targetId, childrenKey, idKey);
+			if (found) return found;
+		}
+	}
+	return null;
 }