| | |
| | | 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>`; |