diff --git a/package-lock.json b/package-lock.json index e1148873..2f809b4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2483,6 +2483,14 @@ "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", "dev": true }, + "axios": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", + "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, "babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", @@ -5484,8 +5492,7 @@ "follow-redirects": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", - "dev": true + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" }, "for-in": { "version": "1.0.2", diff --git a/package.json b/package.json index 99925b13..3df1a2a7 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "lint": "vue-cli-service lint" }, "dependencies": { + "axios": "^0.20.0", "core-js": "^3.6.5", "framework7": "^5.7.13", "framework7-icons": "^3.0.1", diff --git a/src/common/i18n.js b/src/common/i18n.js index e3da9cf4..399e62c3 100644 --- a/src/common/i18n.js +++ b/src/common/i18n.js @@ -8,4 +8,4 @@ export default { 'en': en, 'zh_Hans': zhHans } -} +}; diff --git a/src/common/langs/en.js b/src/common/langs/en.js index d8fbd06f..4bf8e391 100644 --- a/src/common/langs/en.js +++ b/src/common/langs/en.js @@ -4,9 +4,33 @@ export default { 'title': 'lightweight account book' } }, + 'error': { + 'user id is invalid': 'User id is invalid', + 'username is empty': 'Username is empty', + 'email is empty': 'Email is empty', + 'password is empty': 'Password is empty', + 'user not found': 'User not found', + 'password is wrong': 'Password is wrong', + 'username already exists': 'Username already exists', + 'email already exists': 'Email already exists', + 'login name is invalid': 'Login name is invalid', + 'login name or password is invalid': 'Login name or password is invalid', + 'login name or password is wrong': 'Login name or password is wrong' + }, 'Home': 'Home', 'Journals': 'Journals', 'Accounts': 'Accounts', 'Charts': 'Charts', - 'Settings': 'Settings' -} + 'Settings': 'Settings', + 'Back': 'Back', + 'Username': 'Username', + 'Username or Email': 'Username or Email', + 'Password': 'Password', + 'Log In': 'Log In', + 'Don\'t have an account?': 'Don\'t have an account?', + 'Sign up': 'Sign up', + 'Have problem with login?': 'Have problem with login?', + 'Forget Password': 'Forget Password', + 'Unable to login': 'Unable to login', + 'Logout': 'Logout' +}; diff --git a/src/common/langs/zh_Hans.js b/src/common/langs/zh_Hans.js index d6265595..a221ebf4 100644 --- a/src/common/langs/zh_Hans.js +++ b/src/common/langs/zh_Hans.js @@ -4,9 +4,33 @@ export default { 'title': 'lab 轻记账' } }, + 'error': { + 'user id is invalid': '用户ID无效', + 'username is empty': '用户名为空', + 'email is empty': '电子邮箱为空', + 'password is empty': '密码为空', + 'user not found': '找不到该用户', + 'password is wrong': '密码错误', + 'username already exists': '用户名已经存在', + 'email already exists': '邮箱已经存在', + 'login name is invalid': '登录名无效', + 'login name or password is invalid': '登录名或密码无效', + 'login name or password is wrong': '登录名或密码错误' + }, 'Home': '首页', 'Journals': '流水', 'Accounts': '账户', 'Charts': '图表', - 'Settings': '设置' -} + 'Settings': '设置', + 'Back': '返回', + 'Username': '用户名', + 'Username or Email': '用户名或注册邮箱', + 'Password': '密码', + 'Log In': '登录', + 'Don\'t have an account?': '还没有账号?', + 'Sign up': '注册', + 'Have problem with login?': '登录遇到问题?', + 'Forget Password': '找回密码', + 'Unable to login': '无法登录', + 'Logout': '退出登录' +}; diff --git a/src/common/services.js b/src/common/services.js new file mode 100644 index 00000000..e0cc7461 --- /dev/null +++ b/src/common/services.js @@ -0,0 +1,27 @@ +import axios from 'axios'; +import userState from "./userstate.js"; + +axios.defaults.baseURL = '/api'; +axios.interceptors.request.use(config => { + const token = userState.getToken(); + + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + + return config; +}, error => { + return Promise.reject(error); +}); + +axios.interceptors.response.use(response => { + return response; +}, error => { + return Promise.reject(error); +}); + +export default { + authorize: (params) => { + return axios.post('authorize.json', params); + } +}; diff --git a/src/common/userstate.js b/src/common/userstate.js new file mode 100644 index 00000000..3394bec4 --- /dev/null +++ b/src/common/userstate.js @@ -0,0 +1,24 @@ +const tokenLocalStorageKey = 'UserToken'; + +function getToken() { + return localStorage.getItem(tokenLocalStorageKey); +} + +function isUserLogined() { + return !!getToken(); +} + +function updateToken(token) { + return localStorage.setItem(tokenLocalStorageKey, token); +} + +function clearToken() { + return localStorage.removeItem(tokenLocalStorageKey); +} + +export default { + getToken, + isUserLogined, + updateToken, + clearToken +}; diff --git a/src/mobile/components/Login.vue b/src/mobile/components/Login.vue new file mode 100644 index 00000000..a5198ef5 --- /dev/null +++ b/src/mobile/components/Login.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/mobile/components/Settings.vue b/src/mobile/components/Settings.vue new file mode 100644 index 00000000..7cf39f79 --- /dev/null +++ b/src/mobile/components/Settings.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/mobile/main.js b/src/mobile/main.js index 4ca18869..852d3206 100644 --- a/src/mobile/main.js +++ b/src/mobile/main.js @@ -1,21 +1,33 @@ -import Vue from 'vue' -import VueI18n from 'vue-i18n' -import Framework7 from 'framework7/framework7.esm.bundle.js' -import Framework7Vue from 'framework7-vue/framework7-vue.esm.bundle.js' -import 'framework7/css/framework7.bundle.css' -import 'framework7-icons'; -import './assets/css/custom.css' +import Vue from 'vue'; +import VueI18n from 'vue-i18n'; +import axios from 'axios'; +import Framework7 from 'framework7/framework7.esm.bundle.js'; +import Framework7Vue from 'framework7-vue/framework7-vue.esm.bundle.js'; -Vue.use(VueI18n) -Framework7.use(Framework7Vue); +import 'framework7/css/framework7.bundle.css'; +import 'framework7-icons'; + +import './assets/css/custom.css'; import i18nOptions from '../common/i18n.js'; -import App from './App.vue' +import App from './App.vue'; -const i18n = new VueI18n(i18nOptions) +Vue.use(VueI18n); +Framework7.use(Framework7Vue); + +const i18n = new VueI18n(i18nOptions); + +Vue.prototype.languages = { + setI18nLanguage: lang => { + i18n.locale = lang; + axios.defaults.headers.common['Accept-Language'] = lang; + document.querySelector('html').setAttribute('lang', lang); + return lang; + } +} new Vue({ el: '#app', i18n: i18n, render: h => h(App), -}) +}); diff --git a/src/mobile/router.js b/src/mobile/router.js index d13fc07e..0a6a5bda 100644 --- a/src/mobile/router.js +++ b/src/mobile/router.js @@ -1,7 +1,24 @@ -import MainPage from './components/Main.vue' -import MainPageHomeTab from './components/main/Home.vue' +import userState from "../common/userstate.js"; -const router = [ +import MainPage from './components/Main.vue'; +import MainPageHomeTab from './components/main/Home.vue'; + +import LoginPage from './components/Login.vue'; +import SettingsPage from './components/Settings.vue'; + +function checkLogin(to, from, resolve, reject) { + const router = this; + + if (userState.isUserLogined()) { + resolve(); + return; + } + + reject(); + router.navigate('/login'); +} + +const routes = [ { path: '/', component: MainPage, @@ -10,13 +27,24 @@ const router = [ path: '/', id: 'main-tab-home', component: MainPageHomeTab, + beforeEnter: checkLogin } - ] + ], + beforeEnter: checkLogin + }, + { + path: '/login', + component: LoginPage + }, + { + path: '/settings', + component: SettingsPage, + beforeEnter: checkLogin }, { path: '(.*)', redirect: '/' } -] +]; -export default router +export default routes;