From 16d049d082f34516b957605aab9fff01334a7fd4 Mon Sep 17 00:00:00 2001 From: wzy-warehouse <18135009705@163.com> Date: Tue, 21 Apr 2026 20:56:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=AD=A6=E6=A0=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/api.ts | 18 +++ src/api/schools.ts | 20 +++ src/assets/images/icon/school.png | Bin 0 -> 3647 bytes src/assets/index.ts | 2 + .../ControlShowDetailComponent.vue | 9 ++ .../detail-panels/SchoolComponent.vue | 114 ++++++++++++++++++ src/config/config.json | 3 +- .../earthquake/useEarthquakeDisasterChain.ts | 4 +- src/hooks/map/useMap.ts | 5 + src/hooks/rain-earthquake/useLayerControl.ts | 9 ++ src/hooks/rain-earthquake/useSchoolPoint.ts | 31 +++++ .../rain-earthquake/useStorePointsPoint.ts | 2 +- src/hooks/rainstorm/useRainDisasterChain.ts | 4 +- src/stores/useLoadingInformation.ts | 13 ++ src/types/base/XianSchool.ts | 97 +++++++++++++++ src/types/common/LoadingResourceType.ts | 3 + 16 files changed, 326 insertions(+), 8 deletions(-) create mode 100644 src/api/schools.ts create mode 100644 src/assets/images/icon/school.png create mode 100644 src/component/rain-earthquake/detail-panels/SchoolComponent.vue create mode 100644 src/hooks/rain-earthquake/useSchoolPoint.ts create mode 100644 src/types/base/XianSchool.ts diff --git a/src/api/api.ts b/src/api/api.ts index f689080..30ce189 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -7,6 +7,7 @@ import { getBasePoints as getDangerousSourceBasePoints, getPointDetailById as ge import { getBasePoints as getEmergencyShelterBasePoints, getPointDetailById as getEmergencyShelterPointDetailById} from './emergency-shelter' import { getBasePoints as getFirefighterBasePoints, getPointDetailById as getFirefighterPointDetailById} from './firefighter' import { getBasePoints as getStorePointsBasePoints, getPointDetailById as getStorePointsPointDetailById} from './store-points' +import { getBasePoints as getSchoolsBasePoints, getPointDetailById as getSchoolsPointDetailById} from './schools' import type { ApiResponse } from '@/types/ApiResponse' import type { XianHiddenDangerSpots } from '@/types/base/XianHiddenDangerSpots' import type { XianRiskSpots } from '@/types/base/XianRiskSpots' @@ -15,6 +16,7 @@ import type { XianDangerousSource } from '@/types/base/XianDangerousSource' import type { XianEmergencyShelter } from '@/types/base/XianEmergencyShelter' import type { XianFirefighter } from '@/types/base/XianFirefighter' import type { XianStorePoints } from '@/types/base/XianStorePoints' +import type { XianSchool } from '@/types/base/XianSchool' /** * API接口统一导出对象 @@ -142,4 +144,20 @@ export const $api = { */ getPointDetailById: (id: number): Promise> => getStorePointsPointDetailById(id), }, + + // 学校信息 + schools: { + /** + * 获取所有基础学校 + * @returns 学校数据数组 + */ + getBasePoints: (): Promise> => getSchoolsBasePoints(), + + /** + * 根据id获取学校详情 + * @param id - 学校id + * @returns 学校详情 + */ + getPointDetailById: (id: number): Promise> => getSchoolsPointDetailById(id), + }, } diff --git a/src/api/schools.ts b/src/api/schools.ts new file mode 100644 index 0000000..fb874d0 --- /dev/null +++ b/src/api/schools.ts @@ -0,0 +1,20 @@ +import type { ApiResponse } from "@/types/ApiResponse" +import type { XianSchool } from "@/types/base/XianSchool" +import httpInstance from "@/utils/request/http" + +/** + * 获取学校基础数据 + * @returns 学校数据数组 + */ +export const getBasePoints = (): Promise> => { + return httpInstance.get('/school/base-points') +} + +/** + * 根据id获取学校详情 + * @param id - 学校id + * @returns 学校详情 + */ +export const getPointDetailById = (id: number): Promise> => { + return httpInstance.get(`/school/point-detail/${id}`) +} diff --git a/src/assets/images/icon/school.png b/src/assets/images/icon/school.png new file mode 100644 index 0000000000000000000000000000000000000000..032a87c244c1149e33d0104fc79ee613750c7b91 GIT binary patch literal 3647 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 + + + diff --git a/src/component/rain-earthquake/detail-panels/SchoolComponent.vue b/src/component/rain-earthquake/detail-panels/SchoolComponent.vue new file mode 100644 index 0000000..e9fc78e --- /dev/null +++ b/src/component/rain-earthquake/detail-panels/SchoolComponent.vue @@ -0,0 +1,114 @@ + + + + + + diff --git a/src/config/config.json b/src/config/config.json index ac24a73..3e55fe0 100644 --- a/src/config/config.json +++ b/src/config/config.json @@ -40,6 +40,7 @@ "dangerousSourcePointId": "dangerous-source-point-", "emergencyShelterPointId": "emergency-shelter-point-", "fireStationPointId": "fire-station-point-", - "storePointsPointId": "store-points-point-" + "storePointsPointId": "store-points-point-", + "schoolPointId": "school-point-" } } \ No newline at end of file diff --git a/src/hooks/earthquake/useEarthquakeDisasterChain.ts b/src/hooks/earthquake/useEarthquakeDisasterChain.ts index ad4bfe5..49a310f 100644 --- a/src/hooks/earthquake/useEarthquakeDisasterChain.ts +++ b/src/hooks/earthquake/useEarthquakeDisasterChain.ts @@ -217,9 +217,7 @@ export const useEarthquakeDisasterChain = () => { name: '显示学校', statusStore: statusStore.poiLayers, statusKey: 'showSchool' as const, - callback: (status: unknown) => { - console.log('显示学校', status); - }, + callback: layerControl.clickSchool, }, { name: '显示人口网格', diff --git a/src/hooks/map/useMap.ts b/src/hooks/map/useMap.ts index a6f34a6..c893605 100644 --- a/src/hooks/map/useMap.ts +++ b/src/hooks/map/useMap.ts @@ -74,6 +74,11 @@ export const useMap = () => { useLoadingInformationStore().storePoints.id = id; } + // 学校 + else if (pickedObject.id.startsWith(config.prefix.schoolPointId)) { + useLoadingInformationStore().school.id = id; + } + // 其他 else { // 重置状态 diff --git a/src/hooks/rain-earthquake/useLayerControl.ts b/src/hooks/rain-earthquake/useLayerControl.ts index 86c78d1..a8a2fc7 100644 --- a/src/hooks/rain-earthquake/useLayerControl.ts +++ b/src/hooks/rain-earthquake/useLayerControl.ts @@ -53,6 +53,14 @@ export const useLayerControl = () => { useStatusStore().poiLayers.showReservePoint.loading = true; }; + /** + * 点击显示学校 + */ + const clickSchool = () => { + // 加载状态为true + useStatusStore().poiLayers.showSchool.loading = true; + }; + /** * 点击显示人口网格 */ @@ -75,6 +83,7 @@ export const useLayerControl = () => { clickEmergencyShelter, clickFireStation, clickStorePoints, + clickSchool, clickPopulationGrid, clickWaterPipe, }; diff --git a/src/hooks/rain-earthquake/useSchoolPoint.ts b/src/hooks/rain-earthquake/useSchoolPoint.ts new file mode 100644 index 0000000..88ea2bf --- /dev/null +++ b/src/hooks/rain-earthquake/useSchoolPoint.ts @@ -0,0 +1,31 @@ +import { schoolIcon } from '@/assets'; + +/** + * 学校相关钩子函数 + * @returns 字段映射和获取图标方法 + */ +export const useSchoolPoint = () => { + /** + * 字段映射配置 + */ + const field = { + schoolName: '学校名称', + schoolType: '学校类型', + lon: '经度', + lat: '纬度', + students: '在校学生数', + isImportant: '是否有重点保护目标', + unitHead: '负责人', + telephone: '联系电话', + }; + + /** + * 获取学校图标 + * @returns 图标路径 + */ + function getDisasterIcon(): string { + return schoolIcon; + } + + return { field, getDisasterIcon }; +}; diff --git a/src/hooks/rain-earthquake/useStorePointsPoint.ts b/src/hooks/rain-earthquake/useStorePointsPoint.ts index ebc7073..173508c 100644 --- a/src/hooks/rain-earthquake/useStorePointsPoint.ts +++ b/src/hooks/rain-earthquake/useStorePointsPoint.ts @@ -1,4 +1,4 @@ -import storePointsIcon from '@/assets/images/icon/store-points.jpg'; +import { storePointsIcon } from '@/assets'; /** * 物资储备点相关钩子函数 diff --git a/src/hooks/rainstorm/useRainDisasterChain.ts b/src/hooks/rainstorm/useRainDisasterChain.ts index 8704802..4977d3b 100644 --- a/src/hooks/rainstorm/useRainDisasterChain.ts +++ b/src/hooks/rainstorm/useRainDisasterChain.ts @@ -240,9 +240,7 @@ export const useRainDisasterChain = () => { name: '显示学校', statusStore: statusStore.poiLayers, statusKey: 'showSchool' as const, - callback: (status: unknown) => { - console.log('显示学校', status); - }, + callback: layerControl.clickSchool, }, { name: '显示人口网格', diff --git a/src/stores/useLoadingInformation.ts b/src/stores/useLoadingInformation.ts index bb78b59..4f15c17 100644 --- a/src/stores/useLoadingInformation.ts +++ b/src/stores/useLoadingInformation.ts @@ -84,6 +84,14 @@ export const useLoadingInformationStore = defineStore( id: -1, }); + // ============================== 学校状态 ================================ + const school = reactive({ + /** 加载状态 */ + loading: false, + /** 学校ID */ + id: -1, + }); + /** * 重置所有状态 */ @@ -119,6 +127,10 @@ export const useLoadingInformationStore = defineStore( // 物资储备点状态重置 storePoints.loading = false; storePoints.id = -1; + + // 学校状态重置 + school.loading = false; + school.id = -1; }; return { @@ -130,6 +142,7 @@ export const useLoadingInformationStore = defineStore( emergencyShelter, fireStation, storePoints, + school, resetStatue, }; } diff --git a/src/types/base/XianSchool.ts b/src/types/base/XianSchool.ts new file mode 100644 index 0000000..81e11bc --- /dev/null +++ b/src/types/base/XianSchool.ts @@ -0,0 +1,97 @@ +import type { Point } from './Point'; + +/** + * 西安市学校数据接口 + */ +export interface XianSchool extends Point { + /** 学校名称 */ + schoolName?: string; + /** 学校地址 */ + schoolAddress?: string; + /** 学校编码 */ + schoolCode?: string; + /** 学校类型 */ + schoolType?: string; + /** 所属部门 */ + schoolCreater?: string; + /** 学校面积 */ + area?: number; + /** 建筑物面积 */ + constructionArea?: number; + /** 设施 */ + devices?: number; + /** 是否重点保护目标 */ + isImportant?: string; + /** 工作人员 */ + staff?: number; + /** 学生数 */ + students?: number; + /** 留校生 */ + boarder?: number; + /** 留学生 */ + foreignStudents?: number; + /** 教室数量 */ + classrooms?: number; + /** 避难所面积 */ + shelterArea?: number; + /** 是否有医院 */ + isHaveHospital?: string; + /** 医生数量 */ + doctorNum?: number; + /** 安全员数量 */ + securityStaffNum?: number; + /** 应急电力 */ + emergencyElectric?: string; + /** 供水 */ + waterMethod?: string; + /** 供暖 */ + heatingMethod?: string; + /** 应急通信 */ + emergencyConnectionMethod?: string; + /** 灾害记录 */ + isDisasterType?: string; + /** 灾害预案 */ + haveEmergencyPlanType?: string; + /** 设施编码 */ + institutionCode?: string; + /** 创造时间 */ + createTime?: string; + /** 市 */ + city?: string; + /** 区县 */ + county?: string; + /** 联系电话 */ + telephone?: string; + /** 区县编码 */ + code?: string; + /** 单位负责人 */ + unitHead?: string; + /** 街道/乡镇 */ + country?: string; + /** 负责人 */ + fillName?: string; + /** 承建单位 */ + createName?: string; + /** 省 */ + province?: string; + /** 记录人 */ + statisticsHead?: string; + /** 报告时间 */ + reportTime?: string; + /** 物理主键 */ + physicalKey?: string; + /** 省编码 */ + provinceCode?: number; + /** 市编码 */ + cityCode?: number; + /** 区县编码 */ + countyCode?: number; + /** 更新时间 */ + updateTime?: string; + /** 经度 */ + lon?: number; + /** 纬度 */ + lat?: number; + /** 逻辑删除标识,0未删除,1已删除 */ + isDelete?: number; +} diff --git a/src/types/common/LoadingResourceType.ts b/src/types/common/LoadingResourceType.ts index 0e62af9..ad69a4a 100644 --- a/src/types/common/LoadingResourceType.ts +++ b/src/types/common/LoadingResourceType.ts @@ -28,4 +28,7 @@ export enum LoadingResource { /** 物资储备点 */ STORE_POINTS = 'STORE_POINTS', + + /** 学校 */ + SCHOOL = 'SCHOOL', }