408249787@qq.com 2 weeks ago
parent
commit
6a1153d93e
5 changed files with 73 additions and 93 deletions
  1. 15 12
      .cool/service/index.ts
  2. 5 1
      pages/catalog/detail.uvue
  3. 21 50
      pages/catalog/index.uvue
  4. 9 11
      pages/index/home.uvue
  5. 23 19
      pages/user/login.uvue

+ 15 - 12
.cool/service/index.ts

@@ -18,9 +18,9 @@ export type RequestOptions = {
 
 
 // 响应数据类型定义
 // 响应数据类型定义
 export type Response = {
 export type Response = {
-	code?: number;
-	message?: string;
-	data?: any;
+	code: number;
+	message: string;
+	data: any;
 };
 };
 const ui = useUi();
 const ui = useUi();
 // 请求队列(用于等待token刷新后继续请求)
 // 请求队列(用于等待token刷新后继续请求)
@@ -80,6 +80,12 @@ export function request(options: RequestOptions): Promise<any | null> {
 				timeout,
 				timeout,
 
 
 				success(res) {
 				success(res) {
+					if (isNull(res.data)) {
+						res.data = {};
+					}
+					const { code, message, data } = parse<Response>(
+						(res.data as Response)
+					)!
 
 
 					// 401 无权限
 					// 401 无权限
 					if (res.statusCode == 401) {
 					if (res.statusCode == 401) {
@@ -94,11 +100,11 @@ export function request(options: RequestOptions): Promise<any | null> {
 					// 502 服务异常
 					// 502 服务异常
 					else if (res.statusCode == 502 || res.statusCode == 405) {
 					else if (res.statusCode == 502 || res.statusCode == 405) {
 						ui.showToast({
 						ui.showToast({
-							message: "服务异常",
+							message: message || "服务异常",
 							type: "warn",
 							type: "warn",
 						})
 						})
 						reject({
 						reject({
-							message: t("服务异常")
+							message: message || t("服务异常")
 						} as Response);
 						} as Response);
 					}
 					}
 
 
@@ -121,15 +127,12 @@ export function request(options: RequestOptions): Promise<any | null> {
 							resolve(res.data);
 							resolve(res.data);
 						} else {
 						} else {
 							// 解析响应数据
 							// 解析响应数据
-							const { code, message, data } = parse<Response>(
-								res.data ?? { code: 0 }
-							)!;
 							if (code == 200 || code == 0) {
 							if (code == 200 || code == 0) {
 								resolve(data);
 								resolve(data);
-							}else if(code==1){
+							} else if (code == 1) {
 								reject(res.data);
 								reject(res.data);
 							}
 							}
-							 else {
+							else {
 								ui.showToast({
 								ui.showToast({
 									message: message ?? t("服务异常"),
 									message: message ?? t("服务异常"),
 									type: "warn",
 									type: "warn",
@@ -139,10 +142,10 @@ export function request(options: RequestOptions): Promise<any | null> {
 						}
 						}
 					} else {
 					} else {
 						ui.showToast({
 						ui.showToast({
-							message: t("服务异常"),
+							message: message || "服务异常",
 							type: "warn",
 							type: "warn",
 						})
 						})
-						reject({ message: t("服务异常") } as Response);
+						reject({ message: message || "服务异常" } as Response);
 					}
 					}
 				},
 				},
 
 

+ 5 - 1
pages/catalog/detail.uvue

@@ -151,6 +151,7 @@ watch(() => progress2.value, (newVal, oldVal) => {
       }, 2000)
       }, 2000)
       break
       break
     case 4:
     case 4:
+      data.value.videoSrc = ''
       setTimeout(() => {
       setTimeout(() => {
         isLoading.value = false
         isLoading.value = false
         playVoice(course.value?.detailItem?.assumeAnimationPath)
         playVoice(course.value?.detailItem?.assumeAnimationPath)
@@ -274,7 +275,10 @@ onUnmounted(() => {
           </button>
           </button>
           <button
           <button
             class="bg-[#71C73D] text-white w-[80px] h-[80px] flex items-center justify-center rounded-full font-bold text-[25px] shadow-md active:opacity-80 border-[4px] border-white border-solid"
             class="bg-[#71C73D] text-white w-[80px] h-[80px] flex items-center justify-center rounded-full font-bold text-[25px] shadow-md active:opacity-80 border-[4px] border-white border-solid"
-            @tap="handleTop">√</button>
+            @tap="handleTop">
+            <cl-image src="https://oss.xiaoxiongcode.com/static/home/6241.png" mode="heightFix"
+              class="!h-[25px]"></cl-image>
+          </button>
         </view>
         </view>
       </view>
       </view>
       <view class="video-fullscreen_title" v-show="showControls">
       <view class="video-fullscreen_title" v-show="showControls">

+ 21 - 50
pages/catalog/index.uvue

@@ -1,5 +1,5 @@
 <script lang="ts" setup>
 <script lang="ts" setup>
-import { ref, onMounted } from 'vue'
+import { ref, onMounted, nextTick } from 'vue'
 import { fetchSubjectAppInfo } from '@/services/subject/info'
 import { fetchSubjectAppInfo } from '@/services/subject/info'
 import { type SubjectCatalogResult, querySubjectCatalog, querySubjectCatalogNoLogin } from '@/services/subject/catalog'
 import { type SubjectCatalogResult, querySubjectCatalog, querySubjectCatalogNoLogin } from '@/services/subject/catalog'
 import { type SubjectCourseResult, getSubjectCoursePage, getSubjectCoursePageNoLogin } from '@/services/subject/course'
 import { type SubjectCourseResult, getSubjectCoursePage, getSubjectCoursePageNoLogin } from '@/services/subject/course'
@@ -18,6 +18,8 @@ const dataList = ref<SubjectCatalogResult[]>([])
 const catalog = ref<SubjectCatalogResult>()
 const catalog = ref<SubjectCatalogResult>()
 const courseList = ref<SubjectCourseResult[]>()
 const courseList = ref<SubjectCourseResult[]>()
 const record = ref<any>()
 const record = ref<any>()
+const cardsScrollView = ref<any>(null)
+const scrollLeft = ref<number>(0)
 async function getDataList() {
 async function getDataList() {
   console.log(user.token)
   console.log(user.token)
   let res: SubjectCatalogResult[] = []
   let res: SubjectCatalogResult[] = []
@@ -35,10 +37,14 @@ async function getDataList() {
   console.log(res)
   console.log(res)
   dataList.value = res || []
   dataList.value = res || []
   catalog.value = catalog.value || res?.[0] as SubjectCatalogResult
   catalog.value = catalog.value || res?.[0] as SubjectCatalogResult
-  handleSelect(catalog.value)
+  await getDetailList(catalog.value)
+  console.log('scrollLeft', scrollLeft.value)
+  // setTimeout(() => {
+  //   cardsScrollView.value.scrollTo(scrollLeft.value, 0)
+  // }, 3000)
   // courseList.value = res?.courseList || []
   // courseList.value = res?.courseList || []
 }
 }
-onMounted(async () => {
+onShow(async () => {
   isLoading.value = true
   isLoading.value = true
   try {
   try {
     await getDataList()
     await getDataList()
@@ -47,7 +53,6 @@ onMounted(async () => {
     isLoading.value = false
     isLoading.value = false
   }
   }
 })
 })
-const cardsScrollView = ref<any>(null)
 
 
 function handleDetail(item: SubjectCourseResult) {
 function handleDetail(item: SubjectCourseResult) {
   if ((!item.trialPlay && !item.payFlag) || !item.platFormLock || item.studyUnitLock) return
   if ((!item.trialPlay && !item.payFlag) || !item.platFormLock || item.studyUnitLock) return
@@ -65,11 +70,13 @@ function handleDetail(item: SubjectCourseResult) {
     }
     }
   });
   });
 }
 }
-// const scrollLeft = ref<any>(0)
 async function handleSelect(val: SubjectCatalogResult) {
 async function handleSelect(val: SubjectCatalogResult) {
   catalog.value = val
   catalog.value = val
   visible.value = false
   visible.value = false
-  // courseList.value = []
+  await getDetailList(val)
+  cardsScrollView.value.scrollTo(0, 0)
+}
+async function getDetailList(val: SubjectCatalogResult) {
   let res: GetPage<SubjectCourseResult> = {
   let res: GetPage<SubjectCourseResult> = {
     total: 0,
     total: 0,
     rows: [],
     rows: [],
@@ -86,50 +93,13 @@ async function handleSelect(val: SubjectCatalogResult) {
       catalogId: val.id, pageSize: 20
       catalogId: val.id, pageSize: 20
     })
     })
   }
   }
-  courseList.value = res.rows || []
-  cardsScrollView.value.scrollTo({
-    left: 0, // 减去顶部偏移
-    animated: true
-  })
-  // uni.createSelectorQuery().select(`.category-${val.id}`).boundingClientRect().exec(async (rect) => {
-  //   if (cardsScrollView.value && rect[0]) {
-  //     cardsScrollView.value.scrollTo({
-  //       left: scrollLeft.value + rect[0].left - dict.getWindowHeight() / 2, // 减去顶部偏移
-  //       animated: true
-  //     })
-  //   }
-  // })
+  courseList.value = res.rows as SubjectCourseResult[]
 }
 }
-// const debouncedOnScroll = debounce(async () => {
-//   if(isScrolling.value){
-//     return
-//   }
-//   dataList.value.forEach(async (category) => {
-//     const selector = `.category-${category.id}`
-//     await uni.createSelectorQuery().selectAll(selector).boundingClientRect().exec((rects) => {
-//       for (const rect of rects[0]) {
-//         if (rect.left <= (dict.getWindowHeight() / 2)&&rect.left>0) {
-//           catalog.value = category
-//           return
-//         }
-//       }
-//     })
-//   })
-// }, 300)
-// function debouncedOnScroll(e: any) {
-//   scrollLeft.value = e.detail.scrollLeft
-//   dataList.value.forEach(async (category) => {
-//     const selector = `.category-${category.id}`
-//     await uni.createSelectorQuery().selectAll(selector).boundingClientRect().exec((rects) => {
-//       for (const rect of rects[0]) {
-//         if (rect.left <= (dict.getWindowHeight() / 2) && rect.left > 0) {
-//           catalog.value = category
-//           return
-//         }
-//       }
-//     })
-//   })
-// }
+function handleScrollEnd(e: any) {
+  console.log('scrollend', e)
+  scrollLeft.value = e.detail.scrollLeft
+}
+
 function handleClose(val: boolean) {
 function handleClose(val: boolean) {
   if (val) {
   if (val) {
     getDataList()
     getDataList()
@@ -155,7 +125,8 @@ function handleClose(val: boolean) {
       <cl-icon name="arrow-left-right-line" color="primary"></cl-icon>
       <cl-icon name="arrow-left-right-line" color="primary"></cl-icon>
     </view>
     </view>
     <view class="boxs">
     <view class="boxs">
-      <scroll-view class="scroll-view_H" direction="horizontal" :show-scrollbar="false" ref="cardsScrollView">
+      <scroll-view class="scroll-view_H" direction="horizontal" :show-scrollbar="false" ref="cardsScrollView"
+        @dragend="handleScrollEnd">
         <view class="scroll-view-item_H bg-[white]" v-for="course in courseList || []" :key="course.id"
         <view class="scroll-view-item_H bg-[white]" v-for="course in courseList || []" :key="course.id"
           @tap="handleDetail(course)">
           @tap="handleDetail(course)">
           <cl-image lazy-load :src="course?.ossIconPath" mode="scaleToFill"
           <cl-image lazy-load :src="course?.ossIconPath" mode="scaleToFill"

+ 9 - 11
pages/index/home.uvue

@@ -120,12 +120,7 @@ function handleClosePopup2() {
 function copyUrl() {
 function copyUrl() {
 	uni.setClipboardData({
 	uni.setClipboardData({
 		data: 'www.xiaoxiongcode.com',
 		data: 'www.xiaoxiongcode.com',
-		success: (res) => {
-			uni.showToast({
-				title: '复制成功',
-				icon: 'success'
-			});
-		}
+		showToast: true
 	});
 	});
 }
 }
 const handleBind = async () => {
 const handleBind = async () => {
@@ -202,7 +197,8 @@ async function handleExchange() {
 		<cl-popup v-model="visible" :size="400" :show-header="false" direction="center">
 		<cl-popup v-model="visible" :size="400" :show-header="false" direction="center">
 			<view class="flex flex-col items-center justify-center gap-4 py-7 bg-slate-50">
 			<view class="flex flex-col items-center justify-center gap-4 py-7 bg-slate-50">
 				<cl-text class="text-center " color="#09ba07" :size="30"> ——专属服务内容—— </cl-text>
 				<cl-text class="text-center " color="#09ba07" :size="30"> ——专属服务内容—— </cl-text>
-				<image src="https://oss.xiaoxiongcode.com/static/home/qr.png" show-menu-by-longpress class="w-32 h-32" />
+				<image src="https://oss.xiaoxiongcode.com/static/home/qr.png" show-menu-by-longpress
+					class="w-32 h-32" />
 				<view class="text-center "> <cl-text class="text-center" color="#999" :size="14"> 长按识别二维码 </cl-text>
 				<view class="text-center "> <cl-text class="text-center" color="#999" :size="14"> 长按识别二维码 </cl-text>
 					<cl-text class="text-center" color="#999" :size="14"> 添加微信,享专业老师服务 </cl-text>
 					<cl-text class="text-center" color="#999" :size="14"> 添加微信,享专业老师服务 </cl-text>
 				</view>
 				</view>
@@ -215,8 +211,8 @@ async function handleExchange() {
 				<view class="text-center " v-if="userInfo && userInfo?.memberLevel !== 'default'">
 				<view class="text-center " v-if="userInfo && userInfo?.memberLevel !== 'default'">
 					<cl-text class="text-center" color="#999" :size="14">账号:小程序登录手机账号 </cl-text>
 					<cl-text class="text-center" color="#999" :size="14">账号:小程序登录手机账号 </cl-text>
 					<cl-text class="text-center" color="#999" :size="14"> 密码:初始密码为123456 </cl-text>
 					<cl-text class="text-center" color="#999" :size="14"> 密码:初始密码为123456 </cl-text>
-					<cl-text class="text-center" v-if="userInfo && !userInfo.roleCodes?.includes('show_time')" color="#999"
-						:size="14">少儿编程网址: www.xiaoxiongcode.com </cl-text>
+					<cl-text class="text-center" v-if="userInfo && !userInfo.roleCodes?.includes('show_time')"
+						color="#999" :size="14">少儿编程网址: www.xiaoxiongcode.com </cl-text>
 					<cl-text class="text-center" v-else color="#999" :size="14">少儿编程网址: ************* </cl-text>
 					<cl-text class="text-center" v-else color="#999" :size="14">少儿编程网址: ************* </cl-text>
 					<cl-button type="primary" size="small" @tap="copyUrl"> 复制网址 </cl-button>
 					<cl-button type="primary" size="small" @tap="copyUrl"> 复制网址 </cl-button>
 				</view>
 				</view>
@@ -229,7 +225,8 @@ async function handleExchange() {
 			<view class="flex flex-col items-center justify-center gap-4 py-7 bg-slate-50">
 			<view class="flex flex-col items-center justify-center gap-4 py-7 bg-slate-50">
 				<cl-text class="text-center " color="#333" :size="25"> ——激活会员—— </cl-text>
 				<cl-text class="text-center " color="#333" :size="25"> ——激活会员—— </cl-text>
 
 
-				<input class="w-[200px] h-[40px] bg-[#F5F5F5] border-[1px] border-[#333] border-solid rounded-[20px] px-[10px]"
+				<input
+					class="w-[200px] h-[40px] bg-[#F5F5F5] border-[1px] border-[#333] border-solid rounded-[20px] px-[10px]"
 					v-model="code" placeholder="请输入兑换码"></input>
 					v-model="code" placeholder="请输入兑换码"></input>
 
 
 				<cl-button class="mt-4" size="large" type="primary" block @tap="handleExchange"> 兑换 </cl-button>
 				<cl-button class="mt-4" size="large" type="primary" block @tap="handleExchange"> 兑换 </cl-button>
@@ -242,7 +239,8 @@ async function handleExchange() {
 			}
 			}
 		}">
 		}">
 			<view class="w-[360px]  relative">
 			<view class="w-[360px]  relative">
-				<image src="https://oss.xiaoxiongcode.com/static/home/6171.png" mode="widthFix" class="w-[360px]  relative ">
+				<image src="https://oss.xiaoxiongcode.com/static/home/6171.png" mode="widthFix"
+					class="w-[360px]  relative ">
 				</image>
 				</image>
 				<view class=" wz-1  ">
 				<view class=" wz-1  ">
 					您当前未绑定微信,是否绑定微信?
 					您当前未绑定微信,是否绑定微信?

+ 23 - 19
pages/user/login.uvue

@@ -28,22 +28,25 @@
 						</view>
 						</view>
 
 
 						<view class="flex flex-row items-center justify-center mb-5">
 						<view class="flex flex-row items-center justify-center mb-5">
-							<cl-button v-if="val === 'weixin'" :pt="{ className: '!h-[45px] !rounded-full w-[200px] mx-auto' }"
-								type="success" @tap="toWechatLogin">
+							<cl-button v-if="val === 'weixin'"
+								:pt="{ className: '!h-[45px] !rounded-full w-[200px] mx-auto' }" type="success"
+								@tap="toWechatLogin">
 								<view class="flex flex-row items-center justify-center">
 								<view class="flex flex-row items-center justify-center">
-									<cl-image src="https://oss.xiaoxiongcode.com/static/个人中心/微信.png" mode="heightFix" height="20px"
-										width="auto"></cl-image>
+									<cl-image src="https://oss.xiaoxiongcode.com/static/个人中心/微信.png" mode="heightFix"
+										height="20px" width="auto"></cl-image>
 									<view class="ml-2">
 									<view class="ml-2">
 										微信快捷登录
 										微信快捷登录
 									</view>
 									</view>
 								</view>
 								</view>
 							</cl-button>
 							</cl-button>
 							<cl-button v-else-if="val === 'register'" :disabled="!agree || !agree2"
 							<cl-button v-else-if="val === 'register'" :disabled="!agree || !agree2"
-								:pt="{ className: '!h-[45px] !rounded-full w-[200px] mx-auto' }" :loading="loading" @tap="toRegister">
+								:pt="{ className: '!h-[45px] !rounded-full w-[200px] mx-auto' }" :loading="loading"
+								@tap="toRegister">
 								注册并登录
 								注册并登录
 							</cl-button>
 							</cl-button>
 							<cl-button v-else :disabled="!agree || !agree2"
 							<cl-button v-else :disabled="!agree || !agree2"
-								:pt="{ className: '!h-[45px] !rounded-full w-[200px] mx-auto' }" :loading="loading" @tap="toLogin">
+								:pt="{ className: '!h-[45px] !rounded-full w-[200px] mx-auto' }" :loading="loading"
+								@tap="toLogin">
 								登录
 								登录
 							</cl-button>
 							</cl-button>
 						</view>
 						</view>
@@ -69,10 +72,11 @@
 				<view>
 				<view>
 					<view class=" w-full flex flex-row  gap-4 items-center justify-center mb-4">
 					<view class=" w-full flex flex-row  gap-4 items-center justify-center mb-4">
 						<view v-if="val !== 'weixin'">
 						<view v-if="val !== 'weixin'">
-							<cl-button type="success" :pt="{ className: '!h-[40px] !rounded-full w-[40px] mx-auto !p-1' }"
-								:loading="loading" @tap="tabsChange('weixin')">
-								<cl-image src="https://oss.xiaoxiongcode.com/static/个人中心/微信.png" mode="heightFix" height="20px"
-									width="auto"></cl-image>
+							<cl-button type="success"
+								:pt="{ className: '!h-[40px] !rounded-full w-[40px] mx-auto !p-1' }" :loading="loading"
+								@tap="tabsChange('weixin')">
+								<cl-image src="https://oss.xiaoxiongcode.com/static/个人中心/微信.png" mode="heightFix"
+									height="20px" width="auto"></cl-image>
 							</cl-button>
 							</cl-button>
 							<view class="mt-1">
 							<view class="mt-1">
 								<cl-text :size="14" color="#666">
 								<cl-text :size="14" color="#666">
@@ -83,8 +87,8 @@
 						<view v-if="val !== 'quickly_login'">
 						<view v-if="val !== 'quickly_login'">
 							<cl-button type="info" :pt="{ className: '!h-[40px] !rounded-full w-[40px] mx-auto !p-1' }"
 							<cl-button type="info" :pt="{ className: '!h-[40px] !rounded-full w-[40px] mx-auto !p-1' }"
 								:loading="loading" @tap="tabsChange('quickly_login')">
 								:loading="loading" @tap="tabsChange('quickly_login')">
-								<cl-image src="https://oss.xiaoxiongcode.com/static/home/phone.svg" mode="heightFix" height="20px"
-									width="auto"></cl-image>
+								<cl-image src="https://oss.xiaoxiongcode.com/static/home/phone.svg" mode="heightFix"
+									height="20px" width="auto"></cl-image>
 							</cl-button>
 							</cl-button>
 							<view class="mt-1">
 							<view class="mt-1">
 								<cl-text :size="14" color="#666">
 								<cl-text :size="14" color="#666">
@@ -95,8 +99,8 @@
 						<view v-if="val !== 'password'">
 						<view v-if="val !== 'password'">
 							<cl-button type="info" :pt="{ className: '!h-[40px] !rounded-full w-[40px] mx-auto !p-1' }"
 							<cl-button type="info" :pt="{ className: '!h-[40px] !rounded-full w-[40px] mx-auto !p-1' }"
 								:loading="loading" @tap="tabsChange('password')">
 								:loading="loading" @tap="tabsChange('password')">
-								<cl-image src="https://oss.xiaoxiongcode.com/static/home/password.svg" mode="heightFix" height="20px"
-									width="auto"></cl-image>
+								<cl-image src="https://oss.xiaoxiongcode.com/static/home/password.svg" mode="heightFix"
+									height="20px" width="auto"></cl-image>
 							</cl-button>
 							</cl-button>
 							<view class="mt-1">
 							<view class="mt-1">
 								<cl-text :size="14" color="#666">
 								<cl-text :size="14" color="#666">
@@ -129,7 +133,8 @@
 			}
 			}
 		}">
 		}">
 			<view class="w-[330px]  relative">
 			<view class="w-[330px]  relative">
-				<image src="https://oss.xiaoxiongcode.com/static/home/6172.png" mode="widthFix" class="w-[330px]  relative ">
+				<image src="https://oss.xiaoxiongcode.com/static/home/6172.png" mode="widthFix"
+					class="w-[330px]  relative ">
 				</image>
 				</image>
 				<view class=" wz-1  ">
 				<view class=" wz-1  ">
 					当前微信账号,<br />尚未绑定,<br />无法快捷登录
 					当前微信账号,<br />尚未绑定,<br />无法快捷登录
@@ -206,6 +211,7 @@ function tabsChange(type: string) {
 async function toRegister() {
 async function toRegister() {
 	validate(async (valid, errors) => {
 	validate(async (valid, errors) => {
 		if (valid) {
 		if (valid) {
+			loading.value = true
 			try {
 			try {
 				await selfRegister(formData.value)
 				await selfRegister(formData.value)
 				uni.showToast({
 				uni.showToast({
@@ -213,11 +219,9 @@ async function toRegister() {
 					icon: 'success'
 					icon: 'success'
 				})
 				})
 				handleSelect(formData.value.username)
 				handleSelect(formData.value.username)
+				loading.value = false
 			} catch (error) {
 			} catch (error) {
-				uni.showToast({
-					title: '注册失败',
-					icon: 'none'
-				})
+				loading.value = false
 			}
 			}
 		} else {
 		} else {
 			// 验证不通过,可以提示错误信息 errors
 			// 验证不通过,可以提示错误信息 errors