From a9f622f211fdf7a1c17c12c103afeda7a2769d76 Mon Sep 17 00:00:00 2001 From: zhuangzhuang2000 <73012624+zhuangzhuang2000@users.noreply.github.com> Date: Mon, 27 Apr 2026 14:51:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B0=B4=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/api.ts | 18 +++ src/api/reservoirs.ts | 20 +++ src/assets/images/icon/reservoir.png | Bin 0 -> 3438 bytes src/assets/images/icon/subway.png | Bin 0 -> 1702 bytes src/assets/index.ts | 2 + .../ControlShowDetailComponent.vue | 9 ++ .../detail-panels/ReservoirComponent.vue | 114 ++++++++++++++++++ src/config/config.json | 3 +- .../earthquake/useEarthquakeDisasterChain.ts | 4 +- src/hooks/map/useMap.ts | 5 + src/hooks/rain-earthquake/useLayerControl.ts | 8 ++ .../rain-earthquake/useReservoirPoint.ts | 28 +++++ src/hooks/rainstorm/useRainDisasterChain.ts | 4 +- src/stores/useLoadingInformation.ts | 13 ++ src/types/base/XianReservoirList.ts | 17 +++ src/types/common/LoadingResourceType.ts | 5 + 16 files changed, 243 insertions(+), 7 deletions(-) create mode 100644 src/api/reservoirs.ts create mode 100644 src/assets/images/icon/reservoir.png create mode 100644 src/assets/images/icon/subway.png create mode 100644 src/component/rain-earthquake/detail-panels/ReservoirComponent.vue create mode 100644 src/hooks/rain-earthquake/useReservoirPoint.ts create mode 100644 src/types/base/XianReservoirList.ts diff --git a/src/api/api.ts b/src/api/api.ts index 3e16d7f..32821e8 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -9,6 +9,7 @@ import { getBasePoints as getFirefighterBasePoints, getPointDetailById as getFir import { getBasePoints as getStorePointsBasePoints, getPointDetailById as getStorePointsPointDetailById} from './store-points' import { getBasePoints as getSchoolsBasePoints, getPointDetailById as getSchoolsPointDetailById} from './schools' import { getBasePoints as getBridgesBasePoints, getPointDetailById as getBridgesPointDetailById} from './bridges' +import { getBasePoints as getReservoirsBasePoints, getPointDetailById as getReservoirsPointDetailById} from './reservoirs' import type { ApiResponse } from '@/types/ApiResponse' import type { XianHiddenDangerSpots } from '@/types/base/XianHiddenDangerSpots' import type { XianRiskSpots } from '@/types/base/XianRiskSpots' @@ -19,6 +20,7 @@ import type { XianFirefighter } from '@/types/base/XianFirefighter' import type { XianStorePoints } from '@/types/base/XianStorePoints' import type { XianSchool } from '@/types/base/XianSchool' import type { XianBridge } from '@/types/base/XianBridge.ts'; +import type { XianReservoirList } from '@/types/base/XianReservoirList'; /** * API接口统一导出对象 @@ -178,4 +180,20 @@ export const $api = { */ getPointDetailById: (id: number): Promise> => getBridgesPointDetailById(id), }, + + // 水库信息 + reservoirs: { + /** + * 获取所有基础水库 + * @returns 水库数据数组 + */ + getBasePoints: (): Promise> => getReservoirsBasePoints(), + + /** + * 根据id获取水库详情 + * @param id - 水库id + * @returns 水库详情 + */ + getPointDetailById: (id: number): Promise> => getReservoirsPointDetailById(id), + }, } diff --git a/src/api/reservoirs.ts b/src/api/reservoirs.ts new file mode 100644 index 0000000..9dd05cd --- /dev/null +++ b/src/api/reservoirs.ts @@ -0,0 +1,20 @@ +import type { ApiResponse } from "@/types/ApiResponse" +import type { XianReservoirList } from "@/types/base/XianReservoirList" +import httpInstance from "@/utils/request/http" + +/** + * 获取水库基础数据 + * @returns 水库数据数组 + */ +export const getBasePoints = (): Promise> => { + return httpInstance.get('/reservoir/base-points') +} + +/** + * 根据id获取水库详情 + * @param id - 水库id + * @returns 水库详情 + */ +export const getPointDetailById = (id: number): Promise> => { + return httpInstance.get(`/reservoir/point-detail/${id}`) +} diff --git a/src/assets/images/icon/reservoir.png b/src/assets/images/icon/reservoir.png new file mode 100644 index 0000000000000000000000000000000000000000..b04c9f6ded5bc83fa09d3d834a0fef9b3bff382e GIT binary patch literal 3438 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 Q^#A|>07*qoM6N<$f|~$p1poj5 literal 0 HcmV?d00001 diff --git a/src/assets/images/icon/subway.png b/src/assets/images/icon/subway.png new file mode 100644 index 0000000000000000000000000000000000000000..859ed6b28b739c474c09bdfdd185e7291b48d2c5 GIT binary patch literal 1702 zcmV;X23h%uP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D20KYaK~z{r&6saU zl~)|cf0||`X=;C#Q;MlcY%E9iM+KX$#P%XwV&R*>Ui3z2guNKTa;;$2z!(^eXm2VJ zG*+P!!B7dB&fEsN$QmgX=v|Af)RZ)T`~J>z?sK2}_&nEpuLk?T_de%2=lsr}-#O3u zb0a7Wm^lHDEGP#mgp#0SC?1kBUqbhxLFiBDmxzc6dA?iFuxzLf8iGRQ0aOJg>f#m- z6#5C&0*ylRWd^E&qIL1%gF@nl}o!%&7(_Uqu99baa$F9uJL- zjL_S+Zz(P=j#5%m)Dv@0=W?YMc`9`{IMBEcp?=7b@$qr)?Cj*@$B*--O`CY>(xn_3 z8Of-K#ay1EwQJY%fddEl;>C-MhHGm_nv9x*0GZ!|9x5{%Q&Usi)YQb;+1VTw6=gOk z7$qbmaCLPx!`r&FSzJTDz#vmBbW3HoAieMI?&fXVwkc0Z)^N3a`EqV-Y;^PJ_sHW8 zGW=xZ^D#3sqY7NLYE?)cbCY-Y%gf7odU{&dVj`{HgM23D3`WA|c>D~-s0bhv{?w^c zbmq(%nwXf7JUYby6%pniWoBklZf-8ET)C2>qoZkZa+3P{`>Cg=haNq8r1Co1ZrQSh zT3cI{odpk+j`VTk6~K5I^ao@jo;z{k1TR{&$n3Rb6-jvG#*KXT>{)*N__3OsGGt;S z@*?5ew{P>|!-xIst&(!a#>TXT$#+Qefrv6A-arbjtE+RIZ!1=;;M1p1^Rs8qbZ&zi zH*PRI!pDvsTNCZp8@X+i~!6M@4Je+S=4tCrMVN zrlvB6WR|CduC6ZLyLT^Nx^#&T9XiCA5<10)H1y!XgMJe?~4~NR!^@DhTRM&B_+|hbLZ6JEphwy z?W1eg{8tsRy?XU3p_3{MhN1Vxpc*oH{`|S>kyWv=v3%vq6+f@Zl7oU&dO<+}4-F0R z)2B~O)zs9O!zmu?=;+Xv%&%X+=B%tN)84BiM~>J>CPTa?9`r+cfJFU9R9ad}#l^+m zo++&9^0kVG@ImPqA`H2i$6nr&B}?f1`SXNM>KGr^IzVwGe)5d4J85ZY1TW|}1F3Ms zh7EN6`gOW|`7&+Yx|KF>-fXI(qC%w|J$h7CYOPqpSXcF1Kt7g={E#6=0m|iGojiF` zr}{vH)RyO6Ufig!uUF-@x3}vUgTcW;$04?H$KNesVD*d}s7QxG=7R-kU@(mgllXZz z@Li+UzHq@dN7xPn4&mLqcjx2bm-G5aB%eL6lO#`=AIV=b#4}LHz}VC~rVJw08g1cmhU2O|j3^LR)d zk)4(qIr`g?{TFwYIhUG@j0_$a7|>Qe=2&K0@ve{|7Wd1)QC~|qSYSiR$;s-8vmNc+ zxs!J7+NC}Wk%VPlif6qC)gXBVePsk~ppf5#^`PXFL#NzB(;H~#Kc7I>+938?udP1VWDcI+!n3KNJs}U8V@iUX}a#< zfN=pdZl62i(W0Uvb!oRZ-VKk(!}w^pq@+asGiIX)b)@KOLj%T{(0x^m1NO$dA^E(r zFbVw#&F?Q^6c7o02~9x@fwWToDELfQu`r-O`8)U<$ODCgbg&aDhnDGL=OnD7E-H}! wmUE#Z=p%`9VFc=hI-o{q0AK1Po<{9 literal 0 HcmV?d00001 diff --git a/src/assets/index.ts b/src/assets/index.ts index 0f78aef..f6f58e6 100644 --- a/src/assets/index.ts +++ b/src/assets/index.ts @@ -13,6 +13,8 @@ export { default as firefighterIcon } from '@/assets/images/icon/firefighter.png export { default as storePointsIcon } from '@/assets/images/icon/store-points.jpg'; export { default as schoolIcon } from '@/assets/images/icon/school.png'; export { default as bridgeIcon } from '@/assets/images/icon/bridge.png'; +export { default as reservoirIcon } from '@/assets/images/icon/reservoir.png'; +export { default as subwayIcon } from '@/assets/images/icon/subway.png'; // 图片 export { default as backgroundImage } from '@/assets/images/background-image.png'; diff --git a/src/component/rain-earthquake/ControlShowDetailComponent.vue b/src/component/rain-earthquake/ControlShowDetailComponent.vue index 1aeb96f..b367771 100644 --- a/src/component/rain-earthquake/ControlShowDetailComponent.vue +++ b/src/component/rain-earthquake/ControlShowDetailComponent.vue @@ -91,6 +91,14 @@ useStatusStore().infrastructureLayers.showBridge.loading " /> + + + diff --git a/src/component/rain-earthquake/detail-panels/ReservoirComponent.vue b/src/component/rain-earthquake/detail-panels/ReservoirComponent.vue new file mode 100644 index 0000000..dae4aef --- /dev/null +++ b/src/component/rain-earthquake/detail-panels/ReservoirComponent.vue @@ -0,0 +1,114 @@ + + + + + + diff --git a/src/config/config.json b/src/config/config.json index efce1dd..15b9ebb 100644 --- a/src/config/config.json +++ b/src/config/config.json @@ -42,6 +42,7 @@ "fireStationPointId": "fire-station-point-", "storePointsPointId": "store-points-point-", "schoolPointId": "school-point-", - "bridgePointId": "bridge-point-" + "bridgePointId": "bridge-point-", + "reservoirPointId": "reservoir-point-" } } \ No newline at end of file diff --git a/src/hooks/earthquake/useEarthquakeDisasterChain.ts b/src/hooks/earthquake/useEarthquakeDisasterChain.ts index 57eae3e..91c7743 100644 --- a/src/hooks/earthquake/useEarthquakeDisasterChain.ts +++ b/src/hooks/earthquake/useEarthquakeDisasterChain.ts @@ -259,9 +259,7 @@ export const useEarthquakeDisasterChain = () => { name: '显示水库', statusStore: statusStore.infrastructureLayers, statusKey: 'showReservoir' as const, - callback: (status: unknown) => { - console.log('显示水库', status); - }, + callback: layerControl.clickReservoir, }, { name: '显示地铁站', diff --git a/src/hooks/map/useMap.ts b/src/hooks/map/useMap.ts index fa3e8aa..3ee884e 100644 --- a/src/hooks/map/useMap.ts +++ b/src/hooks/map/useMap.ts @@ -84,6 +84,11 @@ export const useMap = () => { useLoadingInformationStore().bridge.id = id; } + // 水库 + else if (pickedObject.id.startsWith(config.prefix.reservoirPointId)) { + useLoadingInformationStore().reservoir.id = id; + } + // 其他 else { // 重置状态 diff --git a/src/hooks/rain-earthquake/useLayerControl.ts b/src/hooks/rain-earthquake/useLayerControl.ts index 761e7ac..bab1c21 100644 --- a/src/hooks/rain-earthquake/useLayerControl.ts +++ b/src/hooks/rain-earthquake/useLayerControl.ts @@ -102,6 +102,13 @@ export const useLayerControl = () => { useStatusStore().infrastructureLayers.showBridge.loading = true; }; + /** + * 显示水库 + */ + const clickReservoir = () => { + useStatusStore().infrastructureLayers.showReservoir.loading = true; + }; + return { clickHiddenDangerPoint, clickHospital, @@ -116,5 +123,6 @@ export const useLayerControl = () => { clickHighway, clickNationRoad, clickBridge, + clickReservoir, }; }; diff --git a/src/hooks/rain-earthquake/useReservoirPoint.ts b/src/hooks/rain-earthquake/useReservoirPoint.ts new file mode 100644 index 0000000..75e79ba --- /dev/null +++ b/src/hooks/rain-earthquake/useReservoirPoint.ts @@ -0,0 +1,28 @@ +import { reservoirIcon } from '@/assets'; + +/** + * 水库相关钩子函数 + * @returns 字段映射和获取图标方法 + */ +export const useReservoirPoint = () => { + /** + * 字段映射配置 + */ + const field = { + reservoirName: '水库名称', + location: '地理位置', + safetyAssessResult: '安全等级', + lon: '经度', + lat: '纬度', + }; + + /** + * 获取水库图标 + * @returns 图标路径 + */ + function getDisasterIcon(): string { + return reservoirIcon; + } + + return { field, getDisasterIcon }; +}; diff --git a/src/hooks/rainstorm/useRainDisasterChain.ts b/src/hooks/rainstorm/useRainDisasterChain.ts index 32a0143..0c408c1 100644 --- a/src/hooks/rainstorm/useRainDisasterChain.ts +++ b/src/hooks/rainstorm/useRainDisasterChain.ts @@ -282,9 +282,7 @@ export const useRainDisasterChain = () => { name: '显示水库', statusStore: statusStore.infrastructureLayers, statusKey: 'showReservoir' as const, - callback: (status: unknown) => { - console.log('显示水库', status); - }, + callback: layerControl.clickReservoir, }, { name: '显示地铁站', diff --git a/src/stores/useLoadingInformation.ts b/src/stores/useLoadingInformation.ts index bd0d3bd..676e738 100644 --- a/src/stores/useLoadingInformation.ts +++ b/src/stores/useLoadingInformation.ts @@ -100,6 +100,14 @@ export const useLoadingInformationStore = defineStore( id: -1, }); + // ============================== 水库状态 ================================ + const reservoir = reactive({ + /** 加载状态 */ + loading: false, + /** 水库ID */ + id: -1, + }); + /** * 重置所有状态 */ @@ -143,6 +151,10 @@ export const useLoadingInformationStore = defineStore( // 桥梁状态重置 bridge.loading = false; bridge.id = -1; + + // 水库状态重置 + reservoir.loading = false; + reservoir.id = -1; }; return { @@ -156,6 +168,7 @@ export const useLoadingInformationStore = defineStore( storePoints, school, bridge, + reservoir, resetStatue, }; diff --git a/src/types/base/XianReservoirList.ts b/src/types/base/XianReservoirList.ts new file mode 100644 index 0000000..9279e99 --- /dev/null +++ b/src/types/base/XianReservoirList.ts @@ -0,0 +1,17 @@ +import type { Point } from './Point'; + +/** + * 西安市水库数据接口 + */ +export interface XianReservoirList extends Point { + /** 水库名称 */ + reservoirName?: string; + /** 水库位置 */ + location?: string; + /** 安全评定结果 */ + safetyAssessResult?: string; + /** 经度 */ + lon?: number; + /** 纬度 */ + lat?: number; +} diff --git a/src/types/common/LoadingResourceType.ts b/src/types/common/LoadingResourceType.ts index 734c338..26b62bd 100644 --- a/src/types/common/LoadingResourceType.ts +++ b/src/types/common/LoadingResourceType.ts @@ -37,5 +37,10 @@ export enum LoadingResource { */ BRIDGE = 'BRIDGE', + /** + * 水库 + */ + RESERVOIR = 'RESERVOIR', + }