diff --git a/cmd/webserver.go b/cmd/webserver.go index 67785754..f223b285 100644 --- a/cmd/webserver.go +++ b/cmd/webserver.go @@ -147,7 +147,7 @@ func startWebServer(c *cli.Context) error { { if config.EnableMapDataFetchProxy { if config.MapProvider == settings.OpenStreetMapProvider { - proxyRoute.GET("/openstreetmap/tile/:zoomLevel/:coordinateX/:fileName", bindProxy(api.MapImages.OpenStreetMapTileImageProxyHandler)) + proxyRoute.GET("/map/tile/:zoomLevel/:coordinateX/:fileName", bindProxy(api.MapImages.MapTileImageProxyHandler)) } } } @@ -332,7 +332,12 @@ func bindCsv(fn core.DataHandlerFunc) gin.HandlerFunc { func bindProxy(fn core.ProxyHandlerFunc) gin.HandlerFunc { return func(ginCtx *gin.Context) { c := core.WrapContext(ginCtx) - proxy := fn(c) - proxy.ServeHTTP(c.Writer, c.Request) + proxy, err := fn(c) + + if err != nil { + utils.PrintDataErrorResult(c, "text/text", err) + } else { + proxy.ServeHTTP(c.Writer, c.Request) + } } } diff --git a/pkg/api/amap_api_proxies.go b/pkg/api/amap_api_proxies.go index 004c7ec0..09c30676 100644 --- a/pkg/api/amap_api_proxies.go +++ b/pkg/api/amap_api_proxies.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/mayswind/ezbookkeeping/pkg/core" + "github.com/mayswind/ezbookkeeping/pkg/errs" "github.com/mayswind/ezbookkeeping/pkg/settings" ) @@ -25,7 +26,7 @@ var ( ) // AmapApiProxyHandler returns amap api response -func (p *AmapApiProxy) AmapApiProxyHandler(c *core.Context) *httputil.ReverseProxy { +func (p *AmapApiProxy) AmapApiProxyHandler(c *core.Context) (*httputil.ReverseProxy, *errs.Error) { var targetUrl string if strings.HasPrefix(c.Request.RequestURI, "/_AMapService/v4/map/styles") { @@ -56,5 +57,5 @@ func (p *AmapApiProxy) AmapApiProxyHandler(c *core.Context) *httputil.ReversePro req.Host = targetUrl.Host } - return &httputil.ReverseProxy{Director: director} + return &httputil.ReverseProxy{Director: director}, nil } diff --git a/pkg/api/map_image_proxies.go b/pkg/api/map_image_proxies.go index 733aacbd..c2a7277b 100644 --- a/pkg/api/map_image_proxies.go +++ b/pkg/api/map_image_proxies.go @@ -7,6 +7,8 @@ import ( "net/url" "github.com/mayswind/ezbookkeeping/pkg/core" + "github.com/mayswind/ezbookkeeping/pkg/errs" + "github.com/mayswind/ezbookkeeping/pkg/settings" ) const openStreetMapTileImageUrlFormat = "https://tile.openstreetmap.org/%s/%s/%s" // https://tile.openstreetmap.org/{z}/{x}/{y}.png @@ -20,14 +22,23 @@ var ( MapImages = &MapImageProxy{} ) -// OpenStreetMapTileImageProxyHandler returns open street map tile image -func (p *MapImageProxy) OpenStreetMapTileImageProxyHandler(c *core.Context) *httputil.ReverseProxy { +// MapTileImageProxyHandler returns map tile image +func (p *MapImageProxy) MapTileImageProxyHandler(c *core.Context) (*httputil.ReverseProxy, *errs.Error) { + mapProvider := c.Query("provider") + targetUrl := "" + + if mapProvider == settings.OpenStreetMapProvider { + targetUrl = openStreetMapTileImageUrlFormat + } else { + return nil, errs.ErrParameterInvalid + } + director := func(req *http.Request) { zoomLevel := c.Param("zoomLevel") coordinateX := c.Param("coordinateX") fileName := c.Param("fileName") - imageRawUrl := fmt.Sprintf(openStreetMapTileImageUrlFormat, zoomLevel, coordinateX, fileName) + imageRawUrl := fmt.Sprintf(targetUrl, zoomLevel, coordinateX, fileName) imageUrl, _ := url.Parse(imageRawUrl) req.URL = imageUrl @@ -35,5 +46,5 @@ func (p *MapImageProxy) OpenStreetMapTileImageProxyHandler(c *core.Context) *htt req.Host = imageUrl.Host } - return &httputil.ReverseProxy{Director: director} + return &httputil.ReverseProxy{Director: director}, nil } diff --git a/pkg/core/handler.go b/pkg/core/handler.go index 9dfbe5e0..9a88140a 100644 --- a/pkg/core/handler.go +++ b/pkg/core/handler.go @@ -16,4 +16,4 @@ type ApiHandlerFunc func(*Context) (interface{}, *errs.Error) type DataHandlerFunc func(*Context) ([]byte, string, *errs.Error) // ProxyHandlerFunc represents the reverse proxy handler function -type ProxyHandlerFunc func(*Context) *httputil.ReverseProxy +type ProxyHandlerFunc func(*Context) (*httputil.ReverseProxy, *errs.Error) diff --git a/src/consts/map.js b/src/consts/map.js new file mode 100644 index 00000000..43139ec2 --- /dev/null +++ b/src/consts/map.js @@ -0,0 +1,11 @@ +const leafletTileSources = { + 'openstreetmap': { + tileUrlFormat: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + tileUrlSubDomains: 'abc', + attribution : '© OpenStreetMap' + } +} + +export default { + leafletTileSources: leafletTileSources +} diff --git a/src/lib/map/index.js b/src/lib/map/index.js index f9b2d12a..19b031f6 100644 --- a/src/lib/map/index.js +++ b/src/lib/map/index.js @@ -1,4 +1,5 @@ -import settings from "@/lib/settings.js"; +import mapConstants from '@/consts/map.js'; +import settings from '@/lib/settings.js'; import { loadLeafletMapAssets, @@ -7,7 +8,7 @@ import { setLeafletMapCenterTo, setLeafletMapCenterMaker, removeLeafletMapCenterMaker -} from './openstreetmap.js'; +} from './leaflet.js'; import { loadGoogleMapAssets, @@ -37,7 +38,7 @@ import { } from './amap.js'; export function loadMapAssets(language) { - if (settings.getMapProvider() === 'openstreetmap') { + if (mapConstants.leafletTileSources[settings.getMapProvider()]) { return loadLeafletMapAssets(language); } else if (settings.getMapProvider() === 'googlemap') { return loadGoogleMapAssets(language); @@ -49,14 +50,14 @@ export function loadMapAssets(language) { } export function createMapHolder() { - if (settings.getMapProvider() === 'openstreetmap') { - return createLeafletMapHolder(); + if (mapConstants.leafletTileSources[settings.getMapProvider()]) { + return createLeafletMapHolder(settings.getMapProvider()); } else if (settings.getMapProvider() === 'googlemap') { - return createGoogleMapHolder(); + return createGoogleMapHolder(settings.getMapProvider()); } else if (settings.getMapProvider() === 'baidumap') { - return createBaiduMapHolder(); + return createBaiduMapHolder(settings.getMapProvider()); } else if (settings.getMapProvider() === 'amap') { - return createAmapHolder(); + return createAmapHolder(settings.getMapProvider()); } else { return null; } @@ -67,7 +68,7 @@ export function initMapInstance(mapHolder, mapContainer, options) { return; } - if (mapHolder.mapProvider === 'openstreetmap') { + if (mapConstants.leafletTileSources[settings.getMapProvider()]) { createLeafletMapInstance(mapHolder, mapContainer, options); } else if (mapHolder.mapProvider === 'googlemap') { createGoogleMapInstance(mapHolder, mapContainer, options); @@ -83,7 +84,7 @@ export function setMapCenterTo(mapHolder, center, zoomLevel) { return; } - if (mapHolder.mapProvider === 'openstreetmap') { + if (mapConstants.leafletTileSources[settings.getMapProvider()]) { setLeafletMapCenterTo(mapHolder, center, zoomLevel); } else if (mapHolder.mapProvider === 'googlemap') { setGoogleMapCenterTo(mapHolder, center, zoomLevel); @@ -99,7 +100,7 @@ export function setMapCenterMarker(mapHolder, position) { return; } - if (mapHolder.mapProvider === 'openstreetmap') { + if (mapConstants.leafletTileSources[settings.getMapProvider()]) { setLeafletMapCenterMaker(mapHolder, position); } else if (mapHolder.mapProvider === 'googlemap') { setGoogleMapCenterMaker(mapHolder, position); @@ -115,7 +116,7 @@ export function removeMapCenterMarker(mapHolder) { return; } - if (mapHolder.mapProvider === 'openstreetmap') { + if (mapConstants.leafletTileSources[settings.getMapProvider()]) { removeLeafletMapCenterMaker(mapHolder); } else if (mapHolder.mapProvider === 'googlemap') { removeGoogleMapCenterMaker(mapHolder); diff --git a/src/lib/map/openstreetmap.js b/src/lib/map/leaflet.js similarity index 72% rename from src/lib/map/openstreetmap.js rename to src/lib/map/leaflet.js index 06280f71..720382dc 100644 --- a/src/lib/map/openstreetmap.js +++ b/src/lib/map/leaflet.js @@ -1,4 +1,6 @@ -import services from "@/lib/services.js"; +import mapConstants from '@/consts/map.js'; +import settings from '@/lib/settings.js'; +import services from '@/lib/services.js'; const leafletHolder = { leaflet: null @@ -11,9 +13,9 @@ export function loadLeafletMapAssets() { ]); } -export function createLeafletMapHolder() { +export function createLeafletMapHolder(mapProvider) { return { - mapProvider: 'openstreetmap', + mapProvider: mapProvider, dependencyLoaded: !!leafletHolder.leaflet, inited: false, defaultZoomLevel: 14, @@ -38,11 +40,18 @@ export function createLeafletMapInstance(mapHolder, mapContainer, options) { attributionControl: false, zoomControl: false }); + let mapTileSource = mapConstants.leafletTileSources[mapHolder.mapProvider]; - const mapTileImageUrl = services.generateOpenStreetMapTileImageUrl(); + if (settings.isMapDataFetchProxyEnabled()) { + const mapProxyTileImageUrl = services.generateMapProxyTileImageUrl(mapHolder.mapProvider); + mapTileSource = Object.assign({}, mapTileSource, { + tileUrlFormat: mapProxyTileImageUrl, + tileUrlSubDomains: '' + }); + } - const tileLayer = leaflet.tileLayer(mapTileImageUrl.url, { - subdomains: mapTileImageUrl.subDomains, + const tileLayer = leaflet.tileLayer(mapTileSource.tileUrlFormat, { + subdomains: mapTileSource.tileUrlSubDomains, maxZoom: 19 }); tileLayer.addTo(leafletInstance); @@ -53,16 +62,18 @@ export function createLeafletMapInstance(mapHolder, mapContainer, options) { }); zoomControl.addTo(leafletInstance); - const attribution = leaflet.control.attribution({ - prefix: false - }); - attribution.addAttribution('© OpenStreetMap'); - attribution.addTo(leafletInstance); + if (mapTileSource.attribution) { + const attribution = leaflet.control.attribution({ + prefix: false + }); + attribution.addAttribution(mapTileSource.attribution); + attribution.addTo(leafletInstance); + mapHolder.leafletAttribution = attribution; + } mapHolder.leafletInstance = leafletInstance; mapHolder.leafletTileLayer = tileLayer; mapHolder.leafletZoomControl = zoomControl; - mapHolder.leafletAttribution = attribution; mapHolder.inited = true; } diff --git a/src/lib/services.js b/src/lib/services.js index b52862ea..da5eaa93 100644 --- a/src/lib/services.js +++ b/src/lib/services.js @@ -396,20 +396,9 @@ export default { ignoreError: !!ignoreError }); }, - generateOpenStreetMapTileImageUrl: () => { - if (settings.isMapDataFetchProxyEnabled()) { - const token = userState.getToken(); - - return { - url: api.baseProxyUrlPath + '/openstreetmap/tile/{z}/{x}/{y}.png?token=' + token, - subDomains: '' - }; - } else { - return { - url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - subDomains: 'abc' - }; - } + generateMapProxyTileImageUrl: (mapProvider) => { + const token = userState.getToken(); + return `${api.baseProxyUrlPath}/map/tile/{z}/{x}/{y}.png?provider=${mapProvider}&token=${token}`; }, generateGoogleMapJavascriptUrl: (language, callbackFnName) => { if (language) {