wangrong
2026-09-29 8d3e9c9480ebc4ae95bdb5854de80d068c467343
src/modules/maps/hooks/use-map.ts
@@ -4,6 +4,52 @@
export const MAP_TK = '51915011aa0997aa2ddd7e38504fa8bc';
export const MAP_LOAD = { v: '4.0', tk: MAP_TK };
export const DEFAULT_CENTER: LngLat = [121.280637, 32.125178];
export const DEFAULT_ZOOM = 16;
export const MAP_ZOOM_KEY = 'map.zoomlevel';
export const MAP_COORD_KEY = 'map.coordinates';
function paramText(raw: unknown): string {
   if (raw == null) return '';
   if (typeof raw === 'string' || typeof raw === 'number') return String(raw).trim();
   if (Array.isArray(raw)) return raw.map(e => String(e).trim()).join(',');
   return '';
}
export function parseMapZoom(raw: unknown, fallback = DEFAULT_ZOOM) {
   const n = Number(paramText(raw));
   return Number.isFinite(n) && n > 0 ? n : fallback;
}
export function parseMapCenter(raw: unknown, fallback: LngLat = DEFAULT_CENTER): LngLat {
   const text = paramText(raw);
   const parts = text.split(/[,,]/).map(s => Number(s.trim()));
   if (parts.length >= 2 && Number.isFinite(parts[0]) && Number.isFinite(parts[1])) {
      return [parts[0], parts[1]];
   }
   return fallback;
}
/** 从 base_sys_param 读取学校地图默认视角:map.zoomlevel、map.coordinates(lon,lat) */
export async function loadMapView(service: any): Promise<{ center: LngLat; zoom: number }> {
   const read = async (key: string) => {
      try {
         if (service?.base?.sys?.param?.stringbykey) {
            return await service.base.sys.param.stringbykey({ key });
         }
         return await service.request({
            url: 'admin/base/sys/param/stringbykey',
            params: { key }
         });
      } catch {
         return '';
      }
   };
   const [zoomRaw, coordRaw] = await Promise.all([read(MAP_ZOOM_KEY), read(MAP_COORD_KEY)]);
   return {
      center: parseMapCenter(coordRaw),
      zoom: parseMapZoom(zoomRaw)
   };
}
export function pinIcon(color: string) {
   const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="28" height="40" viewBox="0 0 28 40"><path fill="${color}" stroke="#fff" stroke-width="1.5" d="M14 1C7.4 1 2 6.4 2 13c0 8.8 12 25 12 25s12-16.2 12-25C26 6.4 20.6 1 14 1z"/><circle cx="14" cy="13" r="5" fill="#fff"/></svg>`;