Browse Source

适配我的收藏页面

shmily1213 12 hours ago
parent
commit
043dece500

+ 9 - 0
src/api/modules/major.ts

@@ -54,4 +54,13 @@ export function collectMajor(code: string) {
  */
 export function cancelCollectMajor(code: string) {
   return flyio.get('/front/customer/marjors/remove', { code }) as Promise<ApiResponse<any>>;
+}
+
+/**
+ * 获取收藏的专业
+ * @param params 
+ * @returns 
+ */
+export function getCollectedMajors(params: any) {
+  return flyio.get('/front/customer/marjors/list', params) as Promise<ApiResponseList<Major.CollectedMajor>>;
 }

+ 11 - 1
src/api/modules/university.ts

@@ -1,6 +1,7 @@
 import { ApiResponse, ApiResponseList } from "@/types";
 import flyio from "../flyio";
 import { University, UniversityDetail, UniversityFilter, UniversityTier } from "@/types/university";
+import { Major } from "@/types";
 // import {sleep} from "@/uni_modules/uv-ui-tools/libs/function";
 
 // 院校库 01 院校列表
@@ -478,4 +479,13 @@ export function removeConcernedUniversity(params: any) {
 
 export function getUniversitiesEnrollBrochureDetail(params: any) {
   return flyio.get('/front/university/getUniversitiesEnrollBrochureDetail', params)
-}
+}
+
+/**
+ * 获取关注院校列表
+ * @param params 
+ * @returns 
+ */
+export function getCollectedUniversities(params: any) {
+  return flyio.get('/front/customer/university/list', params) as Promise<ApiResponseList<Major.University>>;
+}

+ 1 - 1
src/pagesMain/pages/index/index.vue

@@ -11,7 +11,7 @@
       <template #headerRight="{ isTransparent }">
         <view v-if="userStore.getLocation" class="ml-10 flex items-center gap-x-4" @click="handleChangeLocation">
           <uv-icon name="map" size="16" :color="isTransparent ? '#333' : 'var(--primary-color)'" />
-          <text class="text-30 transition-colors duration-300 font-medium"
+          <text class="text-30 font-medium"
             :class="[isTransparent ? 'text-fore-title' : 'text-primary']">
             {{ userStore.getLocation }}
           </text>

+ 0 - 0
src/pagesOther/pages/major/detail/components/university-item.vue → src/pagesOther/components/university-item.vue


+ 4 - 2
src/pagesOther/pages/collect/collect.vue

@@ -4,10 +4,10 @@
     <ie-auto-resizer>
       <ie-tabs-swiper v-model="current" :list="tabs" :scrollable="false">
         <template #university>
-          123
+          <collect-university />
         </template>
         <template #major>
-          234
+          <collect-major />
         </template>
       </ie-tabs-swiper>
     </ie-auto-resizer>
@@ -16,6 +16,8 @@
 
 <script lang="ts" setup>
 import type { SwiperTabItem } from '@/types';
+import CollectUniversity from './components/collect-university.vue';
+import CollectMajor from './components/collect-major.vue';
 
 const current = ref(0);
 const tabs = ref<SwiperTabItem[]>([

+ 74 - 0
src/pagesOther/pages/collect/components/collect-major.vue

@@ -0,0 +1,74 @@
+<template>
+  <z-paging ref="paging" :auto="false" v-model="list" :safe-area-inset-bottom="true" :hide-no-more-by-limit="10" @query="handleQuery">
+    <uv-cell-group>
+      <uv-cell v-for="item in list" :key="item.id" :title="item.name" :label="item.code" @click="handleClick(item)">
+        <template #title>
+          <text class="text-30 text-fore-title">{{ item.name }}</text>
+        </template>
+        <template #label>
+          <text class="text-26 text-fore-light mt-10">{{ getParentName(item.ancestors) }}</text>
+        </template>
+        <template #value>
+          <uv-icon name="arrow-right" size="18" color="var(--fore-light)" />
+        </template>
+      </uv-cell>
+    </uv-cell-group>
+  </z-paging>
+</template>
+<script lang="ts" setup>
+import type { Major } from '@/types';
+import { getMajorTree, getCollectedMajors } from '@/api/modules/major';
+import { useTransferPage } from '@/hooks/useTransferPage';
+
+const { transferTo, routes } = useTransferPage();
+
+const list = ref<Major.CollectedMajor[]>([]);
+const paging = ref<ZPagingInstance>();
+const tree = ref<Major.MajorItem[]>([]);
+
+/**
+ * 从树中获取指定code的对象,深度优先
+ * @param ancestors 
+ */
+const getDataByCode = (code: string, tree: Major.MajorItem[]): Major.MajorItem | null => {
+  for (const item of tree) {
+    if (item.code === code) {
+      return item;
+    }
+    if (item.children) {
+      const data = getDataByCode(code, item.children);
+      if (data) {
+        return data;
+      }
+    }
+  }
+  return null;
+}
+
+const getParentName = (ancestors: string) => {
+  const codes = ancestors.split(',');
+  return codes.filter(code => code !== '0').map(code => {
+    const item = getDataByCode(code, tree.value);
+    return item?.name;
+  }).join(' > ');
+}
+
+const handleClick = (item: Major.CollectedMajor) => {
+  transferTo(routes.majorDetail, {
+    data: { code: item.code }
+  });
+}
+
+const handleQuery = (page: number, size: number) => {
+  getCollectedMajors({ pageNum: page, pageSize: size }).then(res => {
+    paging.value?.completeByTotal(res.rows, res.total);
+  }).catch(() => paging.value?.complete(false));
+}
+onLoad(() => {
+  getMajorTree({}).then(res => {
+    tree.value = res.data;
+    paging.value?.reload();
+  });
+});
+</script>
+<style lang="scss" scoped></style>

+ 20 - 0
src/pagesOther/pages/collect/components/collect-university.vue

@@ -0,0 +1,20 @@
+<template>
+  <z-paging ref="paging" v-model="list" :safe-area-inset-bottom="true" :hide-no-more-by-limit="10" @query="handleQuery">
+    <university-item v-for="item in list" :key="item.id" :data="item" />
+  </z-paging>
+</template>
+<script lang="ts" setup>
+import type { Major } from '@/types';
+import { getCollectedUniversities } from '@/api/modules/university';
+import UniversityItem from '@/pagesOther/components/university-item.vue';
+
+const list = ref<Major.University[]>([]);
+const paging = ref<ZPagingInstance>();
+
+const handleQuery = (page: number, size: number) => {
+  getCollectedUniversities({ pageNum: page, pageSize: size }).then(res => {
+    paging.value?.completeByTotal(res.rows, res.total);
+  }).catch(() => paging.value?.complete(false));
+}
+</script>
+<style lang="scss" scoped></style>

+ 18 - 18
src/pagesOther/pages/major/detail/components/related-university.vue

@@ -1,35 +1,35 @@
 <template>
-    <z-paging ref="paging" v-model="list" :safe-area-inset-bottom="true" @query="handleQuery">
-        <view v-for="item in list" :key="item.id">
-            <university-item :data="item" @click="handleClick(item)"/>
-        </view>
-    </z-paging>
+  <z-paging ref="paging" v-model="list" :safe-area-inset-bottom="true" @query="handleQuery">
+    <view v-for="item in list" :key="item.id">
+      <university-item :data="item" @click="handleClick(item)" />
+    </view>
+  </z-paging>
 </template>
 <script lang="ts" setup>
-import {getUniversityByMajorCode} from '@/api/modules/major';
-import UniversityItem from './university-item.vue';
-import {Major} from '@/types';
-import {useTransferPage} from '@/hooks/useTransferPage';
+import { getUniversityByMajorCode } from '@/api/modules/major';
+import UniversityItem from '@/pagesOther/components/university-item.vue';
+import { Major } from '@/types';
+import { useTransferPage } from '@/hooks/useTransferPage';
 
-const {transferTo, routes} = useTransferPage();
+const { transferTo, routes } = useTransferPage();
 
 const props = defineProps<{
-    data: Major.MajorOverview;
+  data: Major.MajorOverview;
 }>();
 const list = ref<Major.University[]>([]);
 const paging = ref<ZPagingInstance>();
 
 const handleQuery = (page: number, size: number) => {
-    getUniversityByMajorCode({code: props.data.code, pageNum: page, pageSize: size}).then(res => {
-        paging.value?.completeByTotal(res.rows, res.total);
-    }).catch(() => paging.value?.complete(false));
+  getUniversityByMajorCode({ code: props.data.code, pageNum: page, pageSize: size }).then(res => {
+    paging.value?.completeByTotal(res.rows, res.total);
+  }).catch(() => paging.value?.complete(false));
 }
 
 const handleClick = (item: Major.University) => {
-    const {id, code, name} = item
-    transferTo(routes.universityDetail, {
-        data: {id, code, name}
-    });
+  const { id, code, name } = item
+  transferTo(routes.universityDetail, {
+    data: { id, code, name }
+  });
 }
 </script>
 <style lang="scss" scoped></style>

+ 15 - 0
src/types/major.ts

@@ -150,4 +150,19 @@ export interface University {
     type: string;
     webSite: string;
     introduction: string;
+}
+
+export interface CollectedMajor {
+    ancestors: string;
+    name: string;
+    type: string;
+    level: boolean;
+    code: string;
+    child_count: number;
+    customerCode: string;
+    id: number;
+    learn_year_arab: string;
+    majorId: string;
+    parent_code: string;
+    status: number;
 }