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) {