Forráskód Böngészése

college lib - init cc

abpcoder 1 hete
szülő
commit
f4cf65978c

+ 23 - 4
src/pagesOther/pages/university/index/components/college-list.vue

@@ -1,11 +1,14 @@
 <template>
     <view class="h-full">
-        <z-paging ref="paging" @query="handleQuery">
+        <z-paging ref="paging" v-model="list" @query="handleQuery">
             <template #top>
                 <college-conditions-picker :options="filter"/>
                 <ie-search v-model="queryParams.name" placeholder="输入院校名称" @search="handleSearch"
                            @clear="handleSearch"/>
             </template>
+            <view class="p-20 flex flex-col gap-20">
+                <college-item v-for="i in list" :key="i.code" :item="i" class="mx-card" @click="handleDetail(i)"/>
+            </view>
         </z-paging>
     </view>
 </template>
@@ -13,13 +16,23 @@
 <script setup lang="ts">
 import {useTransferPage} from "@/hooks/useTransferPage";
 import {getUniversityFilters, universityList} from "@/api/modules/university";
-import {UniversityQueryDto} from "@/types/university";
+import {University, UniversityQueryDto} from "@/types/university";
 import {UNIVERSITY_FILTER} from "@/types/injectionSymbols";
 import CollegeConditionsPicker from "@/pagesOther/pages/university/index/components/plus/college-conditions-picker.vue";
+import CollegeItem from "@/pagesOther/pages/university/index/components/plus/college-item.vue";
+
+const props = withDefaults(defineProps<{
+    customItemClick: boolean;
+    extraFilter: Record<string, any>;
+}>(), {
+    customItemClick: false,
+    extraFilter: () => ({})
+})
+const emits = defineEmits(['item-click'])
 
 const {transferTo} = useTransferPage()
 const paging = ref<ZPagingInstance>()
-const list = ref([])
+const list = ref<University[]>([])
 const filter = ref({})
 const queryParams = ref<UniversityQueryDto>({
     name: '',
@@ -36,12 +49,18 @@ const handleSearch = async () => {
 }
 
 const handleQuery = (pageNum: number, pageSize: number) => {
-    const query = {pageNum, pageSize, ...queryParams.value}
+    const query = {pageNum, pageSize, ...props.extraFilter, ...queryParams.value}
     universityList(query)
         .then(res => paging.value?.completeByTotal(res.rows, res.total))
         .catch(e => paging.value?.complete(false))
 }
 
+const handleDetail = (college: University) => {
+    if (props.customItemClick) return emits('item-click', college)
+    const {code} = college
+    transferTo('/pages/college-library/detail/detail', {code})
+}
+
 provide(UNIVERSITY_FILTER, queryParams)
 
 watch([

+ 32 - 1
src/pagesOther/pages/university/index/components/college-rank.vue

@@ -1,8 +1,39 @@
 <template>
-    <view>rank</view>
+    <view class="h-full">
+        <z-paging ref="paging" v-model="list" @query="handleQuery">
+            <view class="p-20 flex flex-col gap-20">
+                <college-item v-for="i in list" :key="i.code" :item="i" class="mx-card" @click="handleDetail(i)"/>
+            </view>
+        </z-paging>
+    </view>
 </template>
 
 <script setup lang="ts">
+import {useTransferPage} from "@/hooks/useTransferPage";
+import {universityList} from "@/api/modules/university";
+import {University} from "@/types/university";
+import {useUserStore} from "@/store/userStore";
+import CollegeItem from "@/pagesOther/pages/university/index/components/plus/college-item.vue";
+
+const {transferTo} = useTransferPage()
+const paging = ref<ZPagingInstance>()
+const list = ref<University[]>([])
+const {getLocation} = useUserStore()
+
+const rankTips = computed(() => `${getLocation || '湖南'}省招生院校竞争力排名`)
+
+const handleQuery = (pageNum: number, pageSize: number) => {
+    const payload = {pageNum, pageSize, filterRank: true}
+    universityList(payload)
+        .then(res => paging.value?.completeByTotal(res.rows, res.total))
+        .catch(e => paging.value?.complete(false))
+}
+
+const handleDetail = (college: University) => {
+    const {code} = college
+    transferTo('/pages/college-library/detail/detail', {code})
+}
+
 </script>
 
 <style scoped>

+ 91 - 0
src/pagesOther/pages/university/index/components/plus/college-item.vue

@@ -0,0 +1,91 @@
+<template>
+    <view class="p-20 bg-white flex justify-between items-start gap-20" @click="emits('click')">
+        <uv-image v-if="!hiddenLogo&&!reverse" :src="item.logo" width="64" height="64" mode="aspectFit"/>
+        <view class="flex-1 flex flex-col gap-10">
+            <view v-if="showName||showStar" class="flex justify-between items-center gap-20">
+                <uv-text v-if="showName" type="main" bold :text="item.name"/>
+                <uv-tags v-if="showStar" v-bind="starBinding" :text="item.star"/>
+            </view>
+            <view v-if="bxTags.length" class="flex flex-wrap gap-8">
+                <uv-tags v-for="t in bxTags" :text="t" v-bind="getHighlightBindings(t)" @click="handleTagClick(t)"/>
+            </view>
+            <slot v-if="!hiddenAddress" name="address">
+                <uv-text type="tips" prefix-icon="empty-address" :lines="addressLines" :icon-style="{color: '#999999'}"
+                         size="12" :text="item.address"/>
+            </slot>
+        </view>
+        <uv-image v-if="!hiddenLogo&&reverse" :src="item.logo" width="64" height="64" mode="aspectFit"/>
+        <slot name="right"/>
+    </view>
+</template>
+
+<script setup lang="ts">
+import _ from 'lodash';
+import {University} from "@/types/university";
+
+const props = withDefaults(defineProps<{
+    item: University;
+    hiddenLogo?: boolean;
+    hiddenName?: boolean;
+    hiddenStar?: boolean;
+    hiddenAddress?: boolean;
+    addressLines?: number;
+    reverse?: boolean;
+}>(), {
+    item: () => ({} as University),
+    addressLines: 2
+})
+const emits = defineEmits(['tag', 'click'])
+
+const isCultural = ref(false) //useUserStore() // 这是早先兼容河南文化类填报时的字段
+const showName = computed(() => !props.hiddenName)
+const showStar = computed(() => !props.hiddenStar && props.item.star)
+
+const tagAttrs = {
+    type: 'info',
+    plain: true,
+    size: 'tiny',
+    'class': 'pointer-events-none'
+}
+const highlights = ['双高']
+const starBinding = {
+    ...tagAttrs,
+    type: 'warning'
+}
+const tagHighlight = {
+    ...tagAttrs,
+    type: 'primary',
+    plainFill: true
+}
+
+const bxTags = computed(() => {
+    const {bxLevel, bxType} = props.item
+    const tags = bxLevel ? bxLevel.split(',') : []
+    if (bxType) {
+        _.pull(tags, '双高')
+        tags.push(bxType)
+    }
+    return tags
+})
+
+const isSpecialTag = (tag: string) => {
+    return !isCultural.value && tag == props.item.bxType
+}
+
+const isHighlight = (tag: string) => {
+    return highlights.includes(tag) || isSpecialTag(tag)
+}
+
+const getHighlightBindings = (tag: string) => {
+    const attrs = isHighlight(tag) ? tagHighlight : tagAttrs
+    return isSpecialTag(tag) ? {...attrs, icon: 'question-circle', reverse: true, 'class': ''} : attrs
+}
+
+const handleTagClick = (tag: string) => {
+    if (isSpecialTag(tag)) emits('tag')
+}
+</script>
+
+<style scoped>
+
+</style>

+ 1 - 0
src/types/university.ts

@@ -2,6 +2,7 @@ export interface University {
     address: string;
     area: string | number;
     bxLevel: string;
+    bxType: string; // 现在似乎没有值
     cityName: string;
     code: string;
     collect: string | number;