diff --git a/cmd/webserver.go b/cmd/webserver.go index 5598f820..c20595d3 100644 --- a/cmd/webserver.go +++ b/cmd/webserver.go @@ -78,8 +78,9 @@ func startWebServer(c *cli.Context) error { router.NoRoute(bindApi(api.Default.ApiNotFound)) router.NoMethod(bindApi(api.Default.MethodNotAllowed)) - router.StaticFile("/mobile", filepath.Join(config.StaticRootPath, "mobile.html")) - router.StaticFile("/desktop", filepath.Join(config.StaticRootPath, "desktop.html")) + router.GET("/", func(c *gin.Context) { + c.Redirect(http.StatusMovedPermanently, "/mobile/") + }) router.StaticFile("robots.txt", filepath.Join(config.StaticRootPath, "robots.txt")) router.Static("/js", filepath.Join(config.StaticRootPath, "js")) @@ -87,9 +88,17 @@ func startWebServer(c *cli.Context) error { router.Static("/img", filepath.Join(config.StaticRootPath, "img")) router.Static("/fonts", filepath.Join(config.StaticRootPath, "fonts")) - router.GET("/", func(c *gin.Context) { - c.Redirect(http.StatusMovedPermanently, "/mobile") - }) + mobileEntryRoute := router.Group("/mobile") + mobileEntryRoute.Use(bindMiddleware(middlewares.ServerSettingsCookie(config))) + { + mobileEntryRoute.StaticFile("/", filepath.Join(config.StaticRootPath, "mobile.html")) + } + + desktopEntryRoute := router.Group("/desktop") + desktopEntryRoute.Use(bindMiddleware(middlewares.ServerSettingsCookie(config))) + { + desktopEntryRoute.StaticFile("/", filepath.Join(config.StaticRootPath, "desktop.html")) + } apiRoute := router.Group("/api") diff --git a/package-lock.json b/package-lock.json index 2f809b4c..c8669648 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6755,6 +6755,11 @@ } } }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, "js-message": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.5.tgz", diff --git a/package.json b/package.json index 3df1a2a7..e2fd559b 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "framework7": "^5.7.13", "framework7-icons": "^3.0.1", "framework7-vue": "^5.7.13", + "js-cookie": "^2.2.1", "vue": "^2.6.11", "vue-i18n": "^8.22.0" }, diff --git a/pkg/middlewares/server_settings_cookie.go b/pkg/middlewares/server_settings_cookie.go new file mode 100644 index 00000000..24a925f7 --- /dev/null +++ b/pkg/middlewares/server_settings_cookie.go @@ -0,0 +1,32 @@ +package middlewares + +import ( + "fmt" + "strings" + + "github.com/mayswind/lab/pkg/core" + "github.com/mayswind/lab/pkg/settings" +) + +const SETTINGS_COOKIE_NAME = "ACP_SETTINGS" + +func ServerSettingsCookie(config *settings.Config) core.MiddlewareHandlerFunc { + return func(c *core.Context) { + settingsArr := []string{ + buildBooleanSetting("r", config.EnableUserRegister), + } + + bundledSettings := strings.Join(settingsArr, "_") + c.SetCookie(SETTINGS_COOKIE_NAME, bundledSettings, config.TokenExpiredTime, "", "", false, false) + + c.Next() + } +} + +func buildBooleanSetting(key string, value bool) string { + if value { + return fmt.Sprintf("%s.1", key) + } else { + return fmt.Sprintf("%s.0", key) + } +} diff --git a/src/lib/settings.js b/src/lib/settings.js index 2ef7c8c9..bc442c41 100644 --- a/src/lib/settings.js +++ b/src/lib/settings.js @@ -1,4 +1,8 @@ +import Cookies from 'js-cookie' + const settingsLocalStorageKey = 'lab_user_settings'; +const serverSettingsCookieKey = 'ACP_SETTINGS'; + const defaultSettings = { lang: 'en' }; @@ -37,7 +41,23 @@ function setOption(key, value) { return setSettings(settings); } +function getServerSetting(key) { + const settings = Cookies.get(serverSettingsCookieKey) || ''; + const settingsArr = settings.split('_'); + + for (let i = 0; i < settingsArr.length; i++) { + const pairs = settingsArr[i].split('.'); + + if (pairs[0] === key) { + return pairs[1]; + } + } + + return undefined; +} + export default { getLanguage: () => getOriginalOption('lang'), - setLanguage: value => setOption('lang', value) + setLanguage: value => setOption('lang', value), + isUserRegistrationEnabled: () => getServerSetting('r') === '1' }; diff --git a/src/mobile-main.js b/src/mobile-main.js index 2715a1cc..1729609a 100644 --- a/src/mobile-main.js +++ b/src/mobile-main.js @@ -31,6 +31,8 @@ Vue.prototype.$setLanguage = function (locale) { document.querySelector('html').setAttribute('lang', locale); return locale; }; +Vue.prototype.$isUserRegistrationEnabled = settings.isUserRegistrationEnabled; + Vue.prototype.$alert = function (message, confirmCallback) { let parameters = {}; @@ -84,6 +86,7 @@ Vue.prototype.$toast = function (message, timeout) { closeTimeout: timeout || 1500 }).open(); }; + Vue.prototype.$services = services; Vue.prototype.$user = userstate; diff --git a/src/views/mobile/Login.vue b/src/views/mobile/Login.vue index 9b24c154..d5c300ec 100644 --- a/src/views/mobile/Login.vue +++ b/src/views/mobile/Login.vue @@ -23,7 +23,7 @@   - +
@@ -98,6 +98,9 @@ export default { }; }, computed: { + isUserRegistrationEnabled() { + return this.$isUserRegistrationEnabled(); + }, inputIsEmpty() { return !this.username || !this.password; },