|
@@ -1,5 +1,23 @@
|
|
|
<template>
|
|
|
<view class="d-flex flex-col bg-base">
|
|
|
+
|
|
|
+ <u-tabs
|
|
|
+ :list="tabs"
|
|
|
+ lineWidth="30"
|
|
|
+ lineColor="#d9492e"
|
|
|
+ :activeStyle="{
|
|
|
+ color: '#000',
|
|
|
+ fontWeight: 'bold',
|
|
|
+ transform: 'scale(1.05)'
|
|
|
+ }"
|
|
|
+ :inactiveStyle="{
|
|
|
+ color: '#606266',
|
|
|
+ transform: 'scale(1)'
|
|
|
+ }"
|
|
|
+ :scrollable="false"
|
|
|
+ class="top-tab"
|
|
|
+ @click="(e: any) => tab = e.index"
|
|
|
+ />
|
|
|
<view class="d-flex flex-col p-2">
|
|
|
<uni-search-bar
|
|
|
v-model="searchValue"
|
|
@@ -12,16 +30,17 @@
|
|
|
/>
|
|
|
</view>
|
|
|
<view class="d-flex flex-row justify-around p-2 pt-0">
|
|
|
- <SimpleDropDownPicker v-model="selectedTag" :columns="categoryData.content.value" />
|
|
|
+ <SimpleDropDownPicker v-if="tab == 0" v-model="selectedTag" :columns="categoryData.content.value" />
|
|
|
<SimpleDropDownPicker v-model="selectedLevel" :columns="levelData.content.value" />
|
|
|
<SimpleDropDownPicker v-model="selectedRegion" :columns="regionData.content.value" />
|
|
|
</view>
|
|
|
<view class="d-flex flex-row flex-wrap justify-between">
|
|
|
<map
|
|
|
id="map"
|
|
|
- class="w-100 h-100vh"
|
|
|
- :markers="listLoader.list.value || []"
|
|
|
- :scale="15"
|
|
|
+ class="w-100"
|
|
|
+ style="height:80vh"
|
|
|
+ :makers="[]"
|
|
|
+ :scale="13"
|
|
|
@markertap="onMarkerTap"
|
|
|
/>
|
|
|
</view>
|
|
@@ -29,14 +48,29 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { onMounted, ref, watch } from 'vue';
|
|
|
-import CommonContent, { GetContentListParams } from '@/api/CommonContent';
|
|
|
+import { ref, watch } from 'vue';
|
|
|
import { useSimplePageListLoader } from '@/common/composeabe/SimplePageListLoader';
|
|
|
import { navTo } from '@/common/utils/PageAction';
|
|
|
-import UnmoveableContent from '@/api/inheritor/UnmoveableContent';
|
|
|
-import SimpleDropDownPicker from '@/common/components/SimpleDropDownPicker.vue';
|
|
|
import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
|
|
|
+import SimpleDropDownPicker from '@/common/components/SimpleDropDownPicker.vue';
|
|
|
+import SeminarContent from '@/api/inheritor/SeminarContent';
|
|
|
+import CommonContent, { GetContentListParams } from '@/api/CommonContent';
|
|
|
+import UnmoveableContent from '@/api/inheritor/UnmoveableContent';
|
|
|
+import ProjectsContent from '@/api/inheritor/ProjectsContent';
|
|
|
+import { onLoad } from '@dcloudio/uni-app';
|
|
|
|
|
|
+const tab = ref(0)
|
|
|
+const tabs = [
|
|
|
+ {
|
|
|
+ name: '文物'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: '非遗'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: '非遗传习所'
|
|
|
+ },
|
|
|
+];
|
|
|
const mapCtx = uni.createMapContext('map');
|
|
|
const categoryData = useSimpleDataLoader(async () =>
|
|
|
[{
|
|
@@ -69,21 +103,44 @@ const selectedTag = ref(0);
|
|
|
const selectedLevel = ref(0);
|
|
|
const selectedRegion = ref(0);
|
|
|
const searchValue = ref('');
|
|
|
-const listLoader = useSimplePageListLoader(8, async (page, pageSize) => {
|
|
|
- const res = (await UnmoveableContent.getContentList(new GetContentListParams().setSelfValues({
|
|
|
- crType: selectedTag.value == 0 ? undefined: selectedTag.value,
|
|
|
- level: selectedLevel.value == 0 ? undefined: selectedLevel.value,
|
|
|
- region: selectedRegion.value == 0 ? undefined: selectedRegion.value,
|
|
|
- keywords: searchValue.value,
|
|
|
- }), page, pageSize)).list.map((p) => {
|
|
|
+const listLoader = useSimplePageListLoader(50, async (page, pageSize) => {
|
|
|
+ let list;
|
|
|
+ switch (tab.value) {
|
|
|
+ default:
|
|
|
+ case 0:
|
|
|
+ list = (await UnmoveableContent.getContentList(new GetContentListParams().setSelfValues({
|
|
|
+ crType: selectedTag.value == 0 ? undefined: selectedTag.value,
|
|
|
+ level: selectedLevel.value == 0 ? undefined: selectedLevel.value,
|
|
|
+ region: selectedRegion.value == 0 ? undefined: selectedRegion.value,
|
|
|
+ keywords: searchValue.value,
|
|
|
+ }), page, pageSize)).list;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ list = (await ProjectsContent.getContentList(new GetContentListParams().setSelfValues({
|
|
|
+ level: selectedLevel.value == 0 ? undefined: selectedLevel.value,
|
|
|
+ region: selectedRegion.value == 0 ? undefined: selectedRegion.value,
|
|
|
+ keywords: searchValue.value,
|
|
|
+ }), page, pageSize)).list;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ list = (await SeminarContent.getContentList(new GetContentListParams().setSelfValues({
|
|
|
+ level: selectedLevel.value == 0 ? undefined: selectedLevel.value,
|
|
|
+ region: selectedRegion.value == 0 ? undefined: selectedRegion.value,
|
|
|
+ keywords: searchValue.value,
|
|
|
+ }), page, pageSize)).list;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ const res = list.map((p) => {
|
|
|
return {
|
|
|
- ...p,
|
|
|
+ //...p,
|
|
|
id: p.id,
|
|
|
longitude: Number(p.longitude),
|
|
|
latitude: Number(p.latitude),
|
|
|
iconPath: p.thumbnail,
|
|
|
width: 40,
|
|
|
height: 40,
|
|
|
+ joinCluster: true,
|
|
|
callout: {
|
|
|
content: p.title,
|
|
|
color: "#ffffff",
|
|
@@ -95,7 +152,6 @@ const listLoader = useSimplePageListLoader(8, async (page, pageSize) => {
|
|
|
},
|
|
|
}
|
|
|
})
|
|
|
-
|
|
|
mapCtx.includePoints({
|
|
|
points: res.map(p => ({
|
|
|
latitude: p.latitude,
|
|
@@ -103,6 +159,10 @@ const listLoader = useSimplePageListLoader(8, async (page, pageSize) => {
|
|
|
})),
|
|
|
padding: [20, 20, 20, 20],
|
|
|
});
|
|
|
+ mapCtx.addMarkers({
|
|
|
+ clear: true,
|
|
|
+ markers: res,
|
|
|
+ })
|
|
|
|
|
|
return res;
|
|
|
}, true);
|
|
@@ -116,10 +176,9 @@ watch(selectedRegion, () => {
|
|
|
watch(selectedTag, () => {
|
|
|
listLoader.loadData(undefined, true);
|
|
|
});
|
|
|
-
|
|
|
-onMounted(() => {
|
|
|
+watch(tab, () => {
|
|
|
listLoader.loadData(undefined, true);
|
|
|
-})
|
|
|
+});
|
|
|
|
|
|
function doSearch() {
|
|
|
listLoader.loadData(undefined, true);
|
|
@@ -130,4 +189,40 @@ function onMarkerTap(e: { markerId: number }) {
|
|
|
function goDetails(id: number) {
|
|
|
navTo('/pages/inhert/artifact/details', { id })
|
|
|
}
|
|
|
+
|
|
|
+onLoad(() => {
|
|
|
+ mapCtx.initMarkerCluster({
|
|
|
+ enableDefaultStyle: false,
|
|
|
+ zoomOnClick: true,
|
|
|
+ gridSize: 60,
|
|
|
+ });
|
|
|
+ mapCtx.on('markerClusterCreate', (e: { clusters: any[] }) => {
|
|
|
+ const customClusters = e.clusters.map((cluster) => {
|
|
|
+ const { center, clusterId, markerIds } = cluster;
|
|
|
+ return {
|
|
|
+ ...center,
|
|
|
+ width: 0,
|
|
|
+ height: 0,
|
|
|
+ clusterId,
|
|
|
+ label: {
|
|
|
+ content: markerIds.length.toString(), // 聚合点的数量
|
|
|
+ fontSize: 16,
|
|
|
+ color: '#fff',
|
|
|
+ width: 50,
|
|
|
+ height: 50,
|
|
|
+ bgColor: '#419afcD9', // 背景颜色
|
|
|
+ borderRadius: 25,
|
|
|
+ textAlign: 'center',
|
|
|
+ anchorX: -10,
|
|
|
+ anchorY: -35,
|
|
|
+ },
|
|
|
+ };
|
|
|
+ });
|
|
|
+ mapCtx.addMarkers({
|
|
|
+ markers: customClusters,
|
|
|
+ clear: false,
|
|
|
+ });
|
|
|
+ })
|
|
|
+ listLoader.loadData(undefined, true);
|
|
|
+})
|
|
|
</script>
|