|
@@ -2,56 +2,58 @@
|
|
|
<div v-loading="loading" class="cloud-museum">
|
|
|
<BackBtn />
|
|
|
|
|
|
- <DragView :scrollX="false" :maxTranslateYLength="maxHeight">
|
|
|
- <div ref="scrollRef">
|
|
|
- <div class="cloud-museum__title">云上博物</div>
|
|
|
-
|
|
|
- <div class="cloud-museum__search">
|
|
|
- <el-input
|
|
|
- v-model="searchKey"
|
|
|
- clearable
|
|
|
- placeholder="请输入关键词"
|
|
|
- @clear="getCityMuseumList"
|
|
|
- />
|
|
|
- <div class="btn" @click="getCityMuseumList" />
|
|
|
- </div>
|
|
|
+ <div v-infinite-scroll="load" :infinite-scroll-delay="500" class="list">
|
|
|
+ <div class="cloud-museum__title">云上博物</div>
|
|
|
+
|
|
|
+ <div class="cloud-museum__search">
|
|
|
+ <el-input
|
|
|
+ v-model="searchKey"
|
|
|
+ clearable
|
|
|
+ placeholder="请输入关键词"
|
|
|
+ @clear="getCityMuseumList"
|
|
|
+ />
|
|
|
+ <div class="btn" @click="handleSearch" />
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="cloud-museum-city">
|
|
|
- <div
|
|
|
- v-for="item in cityList"
|
|
|
- :key="item.id"
|
|
|
- :class="[
|
|
|
- 'cloud-museum-city__item',
|
|
|
- curCity === item.id && 'active',
|
|
|
- ]"
|
|
|
- @click="handleCity(item.id)"
|
|
|
- >
|
|
|
- {{ item.name }}
|
|
|
- </div>
|
|
|
+ <div class="cloud-museum-city">
|
|
|
+ <div
|
|
|
+ v-for="item in cityList"
|
|
|
+ :key="item.id"
|
|
|
+ :class="['cloud-museum-city__item', curCity === item.id && 'active']"
|
|
|
+ @click="handleCity(item.id)"
|
|
|
+ >
|
|
|
+ {{ item.name }}
|
|
|
</div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="cloud-museum-type">
|
|
|
- <div
|
|
|
- v-for="label in DEFAULT_TYPE"
|
|
|
- :key="label"
|
|
|
- :class="['cloud-museum-type__item', curType === label && 'active']"
|
|
|
- @click="handleType(label)"
|
|
|
- >
|
|
|
- {{ label }}
|
|
|
- </div>
|
|
|
+ <div class="cloud-museum-type">
|
|
|
+ <div
|
|
|
+ v-for="label in DEFAULT_TYPE"
|
|
|
+ :key="label"
|
|
|
+ :class="['cloud-museum-type__item', curType === label && 'active']"
|
|
|
+ @click="handleType(label)"
|
|
|
+ >
|
|
|
+ {{ label }}
|
|
|
</div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="cloud-museum-scroll">
|
|
|
- <div class="cloud-museum-scroll__container">
|
|
|
- <Card v-for="item in list" :key="item.id" :item="item" />
|
|
|
- </div>
|
|
|
+ <div class="cloud-museum-scroll">
|
|
|
+ <div class="cloud-museum-scroll__container">
|
|
|
+ <Card v-for="item in list" :key="item.id" :item="item" />
|
|
|
</div>
|
|
|
-
|
|
|
- <!-- <div v-loading="true" class="page-loading" style="height: 40px" /> -->
|
|
|
-
|
|
|
- <div v-if="!list.length" class="empty">暂无博物馆</div>
|
|
|
</div>
|
|
|
- </DragView>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div
|
|
|
+ v-if="pLoading"
|
|
|
+ v-loading="true"
|
|
|
+ class="page-loading"
|
|
|
+ style="height: 40px"
|
|
|
+ />
|
|
|
+ <div v-if="noMore && list.length" class="empty">没有更多了</div>
|
|
|
+ <div v-if="!list.length" class="empty">暂无博物馆</div>
|
|
|
+
|
|
|
+ <div class="cloud-museum__bg" />
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -62,33 +64,46 @@ import {
|
|
|
CityMuseumItemType,
|
|
|
GetCityMuseumListApiRequest,
|
|
|
} from "@/api/types";
|
|
|
-import { BackBtn, DragView } from "@/components";
|
|
|
-import { nextTick, onActivated, ref } from "vue";
|
|
|
+import { BackBtn } from "@/components";
|
|
|
+import { onActivated, ref } from "vue";
|
|
|
import Card from "./components/card.vue";
|
|
|
import { useRoute, useRouter } from "vue-router";
|
|
|
import "./index.scss";
|
|
|
|
|
|
-const scrollRef = ref<null | HTMLElement>(null);
|
|
|
-const maxHeight = ref(0);
|
|
|
const loading = ref(false);
|
|
|
+const pLoading = ref(false);
|
|
|
const cityList = ref<CityItem[]>([]);
|
|
|
-const curCity = ref(0);
|
|
|
+const curCity = ref();
|
|
|
const searchKey = ref("");
|
|
|
const DEFAULT_TYPE = ["全部类型", "基本陈列", "临时展览", "专题展览"];
|
|
|
const curType = ref(DEFAULT_TYPE[0]);
|
|
|
const route = useRoute();
|
|
|
const router = useRouter();
|
|
|
+
|
|
|
+const noMore = ref(false);
|
|
|
+let total = 0;
|
|
|
+let pageNum = 1;
|
|
|
+let pageSize = 10;
|
|
|
const list = ref<CityMuseumItemType[]>([]);
|
|
|
+const load = async () => {
|
|
|
+ if (pLoading.value || loading.value || noMore.value || total === 0) return;
|
|
|
+
|
|
|
+ pLoading.value = true;
|
|
|
+ try {
|
|
|
+ pageNum++;
|
|
|
+ await getCityMuseumList(true);
|
|
|
+ } finally {
|
|
|
+ pLoading.value = false;
|
|
|
+ }
|
|
|
+};
|
|
|
|
|
|
onActivated(() => {
|
|
|
loading.value = true;
|
|
|
+ resetPage();
|
|
|
curCity.value = Number(route.params.id);
|
|
|
curType.value = DEFAULT_TYPE[0];
|
|
|
Promise.all([getCity(), getCityMuseumList()]).finally(() => {
|
|
|
loading.value = false;
|
|
|
- nextTick(() => {
|
|
|
- getScrollArea();
|
|
|
- });
|
|
|
});
|
|
|
});
|
|
|
|
|
@@ -96,47 +111,52 @@ const getCity = async () => {
|
|
|
if (cityList.value.length) return;
|
|
|
|
|
|
const { data } = await getCityApi();
|
|
|
- data.unshift({
|
|
|
- id: 0,
|
|
|
- name: "江苏省",
|
|
|
- });
|
|
|
cityList.value = data;
|
|
|
};
|
|
|
|
|
|
-const getScrollArea = async () => {
|
|
|
- if (!scrollRef.value) return;
|
|
|
- maxHeight.value = scrollRef.value.clientHeight - window.innerHeight + 60;
|
|
|
-};
|
|
|
-
|
|
|
const handleCity = (id: number) => {
|
|
|
+ resetPage();
|
|
|
curCity.value = id;
|
|
|
router.replace({ name: "cloudMuseum", params: { id } });
|
|
|
getCityMuseumList();
|
|
|
};
|
|
|
|
|
|
const handleType = (name: string) => {
|
|
|
+ resetPage();
|
|
|
curType.value = name;
|
|
|
getCityMuseumList();
|
|
|
};
|
|
|
|
|
|
-const getCityMuseumList = async () => {
|
|
|
+const handleSearch = () => {
|
|
|
+ resetPage();
|
|
|
+ getCityMuseumList();
|
|
|
+};
|
|
|
+
|
|
|
+const resetPage = () => {
|
|
|
+ noMore.value = false;
|
|
|
+ pageNum = 1;
|
|
|
+ total = 0;
|
|
|
+};
|
|
|
+
|
|
|
+const getCityMuseumList = async (load?: boolean) => {
|
|
|
const params: GetCityMuseumListApiRequest = {
|
|
|
- pageSize: 0,
|
|
|
- pageNum: 0,
|
|
|
+ pageSize,
|
|
|
+ pageNum,
|
|
|
searchKey: searchKey.value,
|
|
|
};
|
|
|
if (curType.value !== "全部类型") params.type = curType.value;
|
|
|
if (curCity.value) params.cityId = curCity.value;
|
|
|
- loading.value = true;
|
|
|
- try {
|
|
|
- const { data } = await getCityMuseumListApi(params);
|
|
|
+
|
|
|
+ const { data } = await getCityMuseumListApi(params);
|
|
|
+ if (load) {
|
|
|
+ list.value = list.value.concat(data.records);
|
|
|
+ } else {
|
|
|
list.value = data.records;
|
|
|
- } finally {
|
|
|
- loading.value = false;
|
|
|
}
|
|
|
+ total = data.total;
|
|
|
|
|
|
- nextTick(() => {
|
|
|
- getScrollArea();
|
|
|
- });
|
|
|
+ if (pageNum * pageSize >= total) {
|
|
|
+ noMore.value = true;
|
|
|
+ }
|
|
|
};
|
|
|
</script>
|