408249787@qq.com 1 Minggu lalu
induk
melakukan
6802d37c30
4 mengubah file dengan 86 tambahan dan 51 penghapusan
  1. 24 8
      components/lock.uvue
  2. 49 38
      pages/catalog/index.uvue
  3. 4 0
      services/subject/catalog.ts
  4. 9 5
      services/subject/course.ts

+ 24 - 8
components/lock.uvue

@@ -17,25 +17,34 @@ const props = defineProps({
   finish: {
     type: Boolean,
     default: true
+  },
+  studyUnitLock: {
+    type: Boolean,
+    default: false
   }
 })
 const visible = ref(false)
 const visible2 = ref(false)
 const visible3 = ref(false)
+const visible4 = ref(false)
 function handleOpen() {
   console.log(1)
   if (!props.finish) {
     visible2.value = true
     return
   }
-switch (props.type) {
-  case 'course':
-    visible.value = true
-    break;
-  case 'vip':
-    visible3.value = true
-    break;
-}
+  if (props.studyUnitLock) {
+    visible4.value = true
+    return
+  }
+  switch (props.type) {
+    case 'course':
+      visible.value = true
+      break;
+    case 'vip':
+      visible3.value = true
+      break;
+  }
 
 }
 async function getPayStatus(outTradeNo: string) {
@@ -118,6 +127,7 @@ const handlePay = async () => {
       <cl-button class="mt-4" size="large" type="warn" block @tap="visible2 = false"> 返回 </cl-button>
     </view>
   </cl-popup>
+
   <cl-popup v-model="visible3" showClose :size="400" :show-header="false" direction="center">
     <view class="p-[40px] ">
       <cl-text class="text-center" color="#000" :size="20"> 小朋友,快叫爸爸妈妈帮忙成为会员,解锁更多精彩内容吧! </cl-text>
@@ -125,6 +135,12 @@ const handlePay = async () => {
       <cl-button class="mt-4" size="large" type="warn" block @tap="handlePay"> 前往购课 </cl-button>
     </view>
   </cl-popup>
+  <cl-popup v-model="visible4" showClose :size="400" :show-header="false" direction="center">
+    <view class="p-[40px] ">
+      <cl-text class="text-center" color="#000" :size="20"> 一周后解锁! </cl-text>
+      <cl-button class="mt-4" size="large" type="warn" block @tap="visible4 = false"> 返回 </cl-button>
+    </view>
+  </cl-popup>
 </template>
 <style lang="scss" scoped>
 .bg1 {

+ 49 - 38
pages/catalog/index.uvue

@@ -1,8 +1,8 @@
 <script lang="ts" setup>
 import { ref, onMounted } from 'vue'
 import { fetchSubjectAppInfo } from '@/services/subject/info'
-import type { SubjectCatalogResult } from '@/services/subject/catalog'
-import type { SubjectCourseResult } from '@/services/subject/course'
+import { type SubjectCatalogResult, querySubjectCatalog } from '@/services/subject/catalog'
+import { type SubjectCourseResult, getSubjectCoursePage } from '@/services/subject/course'
 import Lock from '@/components/lock.uvue'
 import Progress from './components/progress.uvue'
 import Back from '@/components/back.uvue'
@@ -19,11 +19,16 @@ const courseList = ref<SubjectCourseResult[]>()
 const record = ref<any>()
 async function getDataList() {
   const id = dict.getValueByLabelMapByType('index_subject_id')['物理']
-  const res = await fetchSubjectAppInfo({ id })
-  record.value = res
-  dataList.value = res.catalogList || []
-  catalog.value = res?.catalogList?.[0]
-  courseList.value = res?.courseList || []
+  const res = await querySubjectCatalog({
+    subjectId: id, dataScope: {
+      sortBy: 'asc',
+      sortName: 'sortNum',
+    },
+  })
+  dataList.value = res || []
+  catalog.value = res?.[0] as SubjectCatalogResult
+  handleSelect(catalog.value)
+  // courseList.value = res?.courseList || []
 }
 onShow(async () => {
   isLoading.value = true
@@ -52,18 +57,25 @@ function handleDetail(item: SubjectCatalogResult) {
     }
   });
 }
-const scrollLeft = ref<any>(0)
+// const scrollLeft = ref<any>(0)
 async function handleSelect(val: SubjectCatalogResult) {
   catalog.value = val
   visible.value = false
-  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
-      })
-    }
+  const res = await getSubjectCoursePage({
+    catalogId: val.id, dataScope: {
+      sortBy: 'asc',
+      sortName: 'sortNum',
+    },
   })
+  courseList.value = res.rows || []
+  // 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
+  //     })
+  //   }
+  // })
 }
 // const debouncedOnScroll = debounce(async () => {
 //   if(isScrolling.value){
@@ -81,21 +93,20 @@ async function handleSelect(val: SubjectCatalogResult) {
 //     })
 //   })
 // }, 300)
-function debouncedOnScroll(e: any) {
-  console.log(e);
-  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 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 handleClose(val: boolean) {
   if (val) {
     getDataList()
@@ -124,11 +135,10 @@ function handleClose(val: boolean) {
       <cl-icon name="arrow-left-right-line" color="primary"></cl-icon>
     </view>
     <view class="boxs">
-      <scroll-view class="scroll-view_H" direction="horizontal" :show-scrollbar="false" ref="cardsScrollView"
-        @scroll="debouncedOnScroll">
-        <view class="scroll-view-item_H bg-[white]" v-for="course in courseList || []"
-          :class="`category-${course.catalogId}`" :key="course.id" @tap="handleDetail(course)">
-          <cl-image lazy-load :src="config.baseUrl + course?.fileList?.[0]?.url" mode="scaleToFill"
+      <scroll-view class="scroll-view_H" direction="horizontal" :show-scrollbar="false">
+        <view class="scroll-view-item_H bg-[white]" v-for="course in courseList || []" :key="course.id"
+          @tap="handleDetail(course)">
+          <cl-image lazy-load :src="course?.ossIconPath" mode="scaleToFill"
             class="!w-full !h-[28vh] mb-[5px] rounded-xl"></cl-image>
           <cl-text ellipsis :pt="{
             className: '!text-[4vh] !font-bold'
@@ -141,8 +151,9 @@ function handleClose(val: boolean) {
             <Progress :num="6" size="12px"
               :percentage="course.courseUserProgress ? course.courseUserProgress?.status == 1 ? 6 : course.courseUserProgress?.assistantProgress : 0" />
           </view>
-          <Lock v-if="(!course.trialPlay && !record.payFlag) || !course.platFormLock" :record="course" type="course"
-            :finish="course.platFormLock" @close="handleClose" />
+          <Lock v-if="(!course.trialPlay && !record.payFlag) || !course.platFormLock || course.studyUnitLock"
+            :record="course" type="course" :studyUnitLock="course.studyUnitLock" :finish="course.platFormLock"
+            @close="handleClose" />
         </view>
       </scroll-view>
     </view>
@@ -170,7 +181,7 @@ function handleClose(val: boolean) {
             className: '!p-2'
           }" @tap="handleSelect(item)">
             <view class="select-item" :class="{ selected: item.id === catalog?.id }">
-              <image :src="config.baseUrl + item?.fileList?.[0]?.url" class="w-[30rpx] h-[30rpx] mb-[2px]"></image>
+              <image :src="item?.ossIconPath" class="w-[30rpx] h-[30rpx] mb-[2px]"></image>
               <text>{{ item.name }}</text>
             </view>
           </cl-col>

+ 4 - 0
services/subject/catalog.ts

@@ -16,6 +16,7 @@ export interface SubjectCatalogResult {
     createdUserName?: string
     createdTime?: string
     updateTime?: string
+    ossIconPath?: string
     fileList?: FileList[]
     courseList?: SubjectCourseResult[]
     payFlag?: boolean
@@ -34,6 +35,9 @@ export interface SubjectCatalogResult {
 export function fetchSubjectCatalog(parameter: any) {
     return useGet(`/subject/catalog/${parameter.id}`) as Promise<SubjectCatalogResult>
 }
+export function querySubjectCatalog(parameter: any) {
+    return useGet(`/subject/catalog`, parameter) as Promise<SubjectCatalogResult[]>
+}
 
 // export function deleteSubjectCatalogs(parameter: string[]) {
 //     return useDelete<any>(`/subject/catalog`, parameter)

+ 9 - 5
services/subject/course.ts

@@ -1,6 +1,5 @@
 import { usePost, stringify, useGet } from "@/.cool";
-import type { FileList } from '../types/index'
-
+import type { FileList, GetPage } from '../types/index'
 
 export interface SubjectCourseResult {
     id?: string
@@ -21,6 +20,8 @@ export interface SubjectCourseResult {
     trialPlay?: boolean
     feeType?: number
     gameHtmlPath?: string
+    platFormLock?: boolean
+    studyUnitLock?: boolean
     videoPath?: string
     detailItem?: any
     practiceList?: any[]
@@ -31,9 +32,9 @@ export interface SubjectCourseResult {
     fileList?: FileList[]
 }
 
-// export function getSubjectCoursePage(parameter: any) {
-//     return useGet<GetPage<any>>(`/subject/course/page`, parameter)
-// }
+export function getSubjectCoursePage(parameter: any) {
+    return useGet(`/subject/course/page`, parameter) as Promise<GetPage<SubjectCourseResult>>
+}
 // export function addSubjectCourse(parameter: SubjectCourseResult) {
 //     return usePost<any>(`/subject/course`, parameter)
 // }
@@ -46,6 +47,9 @@ export interface SubjectCourseResult {
 export function fetchSubjectCourseApp(parameter: any) {
     return useGet(`/subject/course/app/query/${parameter.id}`) as Promise<SubjectCourseResult>
 }
+export function querySubjectCourse(parameter: any) {
+    return useGet(`/subject/course`, parameter) as Promise<SubjectCourseResult[]>
+}
 // export function deleteSubjectCourses(parameter: string[]) {
 //     return useDelete<any>(`/subject/course`, parameter)
 // }