Initial commit: gmTouringMiniApp project

This commit is contained in:
周瑞哲
2026-07-30 16:04:34 +08:00
commit ebcae02d35
201 changed files with 49545 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
export * from './location'
export * from './map'
+58
View File
@@ -0,0 +1,58 @@
import type { GeoPoint } from '@/domain/poi'
import { defineStore } from 'pinia'
export type UserLocationStatus = 'idle' | 'locating' | 'ready' | 'denied' | 'unavailable' | 'error'
export interface UserLocationSnapshot extends GeoPoint {
accuracy: number | null
capturedAt: string
coordinateSystem: 'GCJ02'
}
interface UserLocationState {
status: UserLocationStatus
snapshot: UserLocationSnapshot | null
errorMessage: string
}
function isValidCoordinate(longitude: number, latitude: number): boolean {
return Number.isFinite(longitude)
&& Number.isFinite(latitude)
&& longitude >= -180
&& longitude <= 180
&& latitude >= -90
&& latitude <= 90
}
export const useLocationStore = defineStore('user-location-session', {
state: (): UserLocationState => ({
status: 'idle',
snapshot: null,
errorMessage: '',
}),
actions: {
startLocating() {
this.status = 'locating'
this.errorMessage = ''
},
updateLocation(longitude: number, latitude: number, accuracy?: number | null) {
if (!isValidCoordinate(longitude, latitude))
return false
this.snapshot = {
longitude,
latitude,
accuracy: Number.isFinite(accuracy) && Number(accuracy) >= 0 ? Number(accuracy) : null,
capturedAt: new Date().toISOString(),
coordinateSystem: 'GCJ02',
}
this.status = 'ready'
this.errorMessage = ''
return true
},
failLocation(status: Exclude<UserLocationStatus, 'idle' | 'locating' | 'ready'>, message: string) {
this.status = status
this.errorMessage = message
},
},
})
+48
View File
@@ -0,0 +1,48 @@
import type { GeoPoint, MapViewport } from '@/domain/poi'
import { defineStore } from 'pinia'
export const DEFAULT_GUANGMING_VIEWPORT: MapViewport = {
longitude: 113.935,
latitude: 22.748,
scale: 11,
}
interface MapSessionState {
categoryCode: string | null
selectedPoiId: string | null
viewport: MapViewport
}
function isFinitePoint(point: GeoPoint): boolean {
return Number.isFinite(point.longitude) && Number.isFinite(point.latitude)
}
export const useMapStore = defineStore('map-session', {
state: (): MapSessionState => ({
categoryCode: null,
selectedPoiId: null,
viewport: { ...DEFAULT_GUANGMING_VIEWPORT },
}),
actions: {
setCategory(categoryCode: string | null) {
this.categoryCode = categoryCode
},
selectPoi(poiId: string | null) {
this.selectedPoiId = poiId
},
updateViewport(viewport: MapViewport) {
if (!isFinitePoint(viewport) || !Number.isFinite(viewport.scale) || viewport.scale <= 0)
return
this.viewport = { ...viewport }
},
resetViewport(viewport: MapViewport = DEFAULT_GUANGMING_VIEWPORT) {
this.viewport = { ...viewport }
},
resetSession(viewport: MapViewport = DEFAULT_GUANGMING_VIEWPORT) {
this.categoryCode = null
this.selectedPoiId = null
this.viewport = { ...viewport }
},
},
})