diff --git a/package.json b/package.json index 739b49f..f9f1a55 100644 --- a/package.json +++ b/package.json @@ -1,114 +1,115 @@ -{ - "name": "vue-element-admin", - "version": "4.4.0", - "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features", - "author": "Pan ", - "scripts": { - "dev": "vue-cli-service serve", - "lint": "eslint --ext .js,.vue src", - "build:prod": "vue-cli-service build", - "build:stage": "vue-cli-service build --mode staging", - "preview": "node build/index.js --preview", - "new": "plop", - "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", - "test:unit": "jest --clearCache && vue-cli-service test:unit", - "test:ci": "npm run lint && npm run test:unit" - }, - "dependencies": { - "axios": "0.18.1", - "clipboard": "2.0.4", - "codemirror": "5.45.0", - "core-js": "3.6.5", - "driver.js": "0.9.5", - "dropzone": "5.5.1", - "echarts": "4.2.1", - "element-ui": "2.13.2", - "file-saver": "2.0.1", - "fuse.js": "3.4.4", - "js-cookie": "2.2.0", - "jsonlint": "1.6.3", - "jszip": "3.2.1", - "normalize.css": "7.0.0", - "nprogress": "0.2.0", - "path-to-regexp": "2.4.0", - "pinyin": "2.9.0", - "screenfull": "4.2.0", - "script-loader": "0.7.2", - "sortablejs": "1.8.4", - "tui-editor": "1.3.3", - "vue": "2.6.10", - "vue-count-to": "1.0.13", - "vue-i18n": "7.3.2", - "vue-router": "3.0.2", - "vue-splitpane": "1.0.4", - "vuedraggable": "2.20.0", - "vuex": "3.1.0", - "xlsx": "0.14.1" - }, - "devDependencies": { - "@vue/cli-plugin-babel": "4.4.4", - "@vue/cli-plugin-eslint": "4.4.4", - "@vue/cli-plugin-unit-jest": "4.4.4", - "@vue/cli-service": "4.4.4", - "@vue/test-utils": "1.0.0-beta.29", - "autoprefixer": "9.5.1", - "babel-eslint": "10.1.0", - "babel-jest": "23.6.0", - "babel-plugin-dynamic-import-node": "2.3.3", - "chalk": "2.4.2", - "chokidar": "2.1.5", - "connect": "3.6.6", - "eslint": "6.7.2", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-vue": "6.2.2", - "html-webpack-plugin": "3.2.0", - "husky": "1.3.1", - "lint-staged": "8.1.5", - "mockjs": "1.0.1-beta3", - "plop": "2.3.0", - "runjs": "4.3.2", - "sass": "1.26.2", - "sass-loader": "8.0.2", - "script-ext-html-webpack-plugin": "2.1.3", - "serve-static": "1.13.2", - "svg-sprite-loader": "4.1.3", - "svgo": "1.2.0", - "vue-template-compiler": "2.6.10" - }, - "browserslist": [ - "> 1%", - "last 2 versions" - ], - "bugs": { - "url": "https://github.com/PanJiaChen/vue-element-admin/issues" - }, - "engines": { - "node": ">=8.9", - "npm": ">= 3.0.0" - }, - "keywords": [ - "vue", - "admin", - "dashboard", - "element-ui", - "boilerplate", - "admin-template", - "management-system" - ], - "license": "MIT", - "lint-staged": { - "src/**/*.{js,vue}": [ - "eslint --fix", - "git add" - ] - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, - "repository": { - "type": "git", - "url": "git+https://github.com/PanJiaChen/vue-element-admin.git" - } -} +{ + "name": "vue-element-admin", + "version": "4.4.0", + "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features", + "author": "Pan ", + "scripts": { + "dev": "vue-cli-service serve", + "lint": "eslint --ext .js,.vue src", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "new": "plop", + "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", + "test:unit": "jest --clearCache && vue-cli-service test:unit", + "test:ci": "npm run lint && npm run test:unit" + }, + "dependencies": { + "axios": "0.18.1", + "clipboard": "2.0.4", + "codemirror": "5.45.0", + "core-js": "3.6.5", + "driver.js": "0.9.5", + "dropzone": "5.5.1", + "echarts": "4.2.1", + "element-ui": "2.13.2", + "file-saver": "2.0.1", + "fuse.js": "3.4.4", + "js-cookie": "2.2.0", + "jsonlint": "1.6.3", + "jszip": "3.2.1", + "normalize.css": "7.0.0", + "nprogress": "0.2.0", + "path-to-regexp": "2.4.0", + "pinyin": "2.9.0", + "screenfull": "4.2.0", + "script-loader": "0.7.2", + "sortablejs": "1.8.4", + "tui-editor": "1.3.3", + "vue": "2.6.10", + "vue-count-to": "1.0.13", + "vue-i18n": "7.3.2", + "vue-router": "3.0.2", + "vue-splitpane": "1.0.4", + "vuedraggable": "2.20.0", + "vuex": "3.1.0", + "web3": "^1.7.4", + "xlsx": "0.14.1" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.4", + "@vue/cli-plugin-eslint": "4.4.4", + "@vue/cli-plugin-unit-jest": "4.4.4", + "@vue/cli-service": "4.4.4", + "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "9.5.1", + "babel-eslint": "10.1.0", + "babel-jest": "23.6.0", + "babel-plugin-dynamic-import-node": "2.3.3", + "chalk": "2.4.2", + "chokidar": "2.1.5", + "connect": "3.6.6", + "eslint": "6.7.2", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-vue": "6.2.2", + "html-webpack-plugin": "3.2.0", + "husky": "1.3.1", + "lint-staged": "8.1.5", + "mockjs": "1.0.1-beta3", + "plop": "2.3.0", + "runjs": "4.3.2", + "sass": "1.26.2", + "sass-loader": "8.0.2", + "script-ext-html-webpack-plugin": "2.1.3", + "serve-static": "1.13.2", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.0", + "vue-template-compiler": "2.6.10" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ], + "bugs": { + "url": "https://github.com/PanJiaChen/vue-element-admin/issues" + }, + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "keywords": [ + "vue", + "admin", + "dashboard", + "element-ui", + "boilerplate", + "admin-template", + "management-system" + ], + "license": "MIT", + "lint-staged": { + "src/**/*.{js,vue}": [ + "eslint --fix", + "git add" + ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/PanJiaChen/vue-element-admin.git" + } +} diff --git a/src/api/user.js b/src/api/user.js index d8dda66..d3db98a 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -1,23 +1,38 @@ -import request from '@/utils/request' - -export function login(data) { - return request({ - url: '/user/login', - method: 'post', - data - }) -} - -export function getInfo(token) { - return request({ - url: '/user/info', - method: 'get' - }) -} - -export function logout() { - return request({ - url: '/user/logout', - method: 'get' - }) -} +import request from '@/utils/request' + +export function login(data) { + return request({ + url: '/user/login', + method: 'post', + data + }) +} +export function metamaskLogin(data) { + return request({ + url: '/user/metamask-login', + method: 'post', + data + }) +} + +export function getInfo(token) { + return request({ + url: '/user/info', + method: 'get' + }) +} + +export function logout() { + return request({ + url: '/user/logout', + method: 'get' + }) +} + +export function getNonce(account) { + return request({ + url: '/user/getNonce?account=' + account, + method: 'get' + }) +} + diff --git a/src/icons/svg/MetaMask.svg b/src/icons/svg/MetaMask.svg new file mode 100644 index 0000000..047b4f5 --- /dev/null +++ b/src/icons/svg/MetaMask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/store/getters.js b/src/store/getters.js index 2b88b89..9a7de6f 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -1,16 +1,17 @@ -const getters = { - sidebar: state => state.app.sidebar, - language: state => state.app.language, - size: state => state.app.size, - device: state => state.app.device, - visitedViews: state => state.tagsView.visitedViews, - cachedViews: state => state.tagsView.cachedViews, - token: state => state.user.token, - name: state => state.user.name, - introduction: state => state.user.introduction, - roles: state => state.user.roles, - permission_routes: state => state.permission.routes, - errorLogs: state => state.errorLog.logs, - email: state => state.emailView.email -} -export default getters +const getters = { + sidebar: state => state.app.sidebar, + language: state => state.app.language, + size: state => state.app.size, + device: state => state.app.device, + visitedViews: state => state.tagsView.visitedViews, + cachedViews: state => state.tagsView.cachedViews, + token: state => state.user.token, + name: state => state.user.name, + nonce: state => state.user.nonce, + introduction: state => state.user.introduction, + roles: state => state.user.roles, + permission_routes: state => state.permission.routes, + errorLogs: state => state.errorLog.logs, + email: state => state.emailView.email +} +export default getters diff --git a/src/store/modules/user.js b/src/store/modules/user.js index e0eb128..1e27a86 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,127 +1,138 @@ -import { login, logout, getInfo } from '@/api/user' -import { getToken, setToken, removeToken } from '@/utils/auth' -import router, { resetRouter } from '@/router' - -const state = { - token: getToken(), - name: '', - introduction: '', - roles: [] -} - -const mutations = { - SET_TOKEN: (state, token) => { - state.token = token - }, - SET_INTRODUCTION: (state, introduction) => { - state.introduction = introduction - }, - SET_NAME: (state, name) => { - state.name = name - }, - SET_ROLES: (state, roles) => { - state.roles = roles - } -} - -const actions = { - // user login - login({ commit }, userInfo) { - const { username, password } = userInfo - return new Promise((resolve, reject) => { - login({ username: username.trim(), password: password }).then(response => { - const { token } = response - commit('SET_TOKEN', token) - setToken(token) - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - - // get user info - getInfo({ commit, state }) { - return new Promise((resolve, reject) => { - getInfo().then(response => { - const { data } = response - - if (!data) { - reject('Verification failed, please Login again.') - } - - const { roles } = data - - // roles must be a non-empty array - if (!roles || roles.length <= 0) { - reject('getInfo: roles must be a non-null array!') - } - - commit('SET_ROLES', roles) - // commit('SET_NAME', name) - // - // commit('SET_INTRODUCTION', introduction) - resolve(data) - }).catch(error => { - reject(error) - }) - }) - }, - - // user logout - logout({ commit, state, dispatch }) { - return new Promise((resolve, reject) => { - logout(state.token).then(() => { - commit('SET_TOKEN', '') - commit('SET_ROLES', []) - removeToken() - resetRouter() - - // reset visited views and cached views - // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485 - dispatch('tagsView/delAllViews', null, { root: true }) - - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - - // remove token - resetToken({ commit }) { - return new Promise(resolve => { - commit('SET_TOKEN', '') - commit('SET_ROLES', []) - removeToken() - resolve() - }) - }, - - // dynamically modify permissions - async changeRoles({ commit, dispatch }, role) { - const token = role + '-token' - - commit('SET_TOKEN', token) - setToken(token) - - const { roles } = await dispatch('getInfo') - - resetRouter() - - // generate accessible routes map based on roles - const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true }) - // dynamically add accessible routes - router.addRoutes(accessRoutes) - - // reset visited views and cached views - dispatch('tagsView/delAllViews', null, { root: true }) - } -} - -export default { - namespaced: true, - state, - mutations, - actions -} +import { login, logout, getInfo } from '@/api/user' +import { getToken, setToken, removeToken } from '@/utils/auth' +import router, { resetRouter } from '@/router' + +const state = { + token: getToken(), + name: '', + introduction: '', + roles: [], + nonce: '' +} + +const mutations = { + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_INTRODUCTION: (state, introduction) => { + state.introduction = introduction + }, + SET_NAME: (state, name) => { + state.name = name + }, + SET_ROLES: (state, roles) => { + state.roles = roles + }, + SET_NONCE: (state, nonce) => { + state.nonce = nonce + } +} + +const actions = { + // user login + login({ commit }, userInfo) { + const { username, password } = userInfo + return new Promise((resolve, reject) => { + login({ username: username.trim(), password: password }).then(response => { + const { token } = response + commit('SET_TOKEN', token) + setToken(token) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // get user info + getInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo().then(response => { + const { data } = response + + if (!data) { + reject('Verification failed, please Login again.') + } + + const { roles } = data + + // roles must be a non-empty array + if (!roles || roles.length <= 0) { + reject('getInfo: roles must be a non-null array!') + } + + commit('SET_ROLES', roles) + // commit('SET_NAME', name) + // + // commit('SET_INTRODUCTION', introduction) + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + + // user logout + logout({ commit, state, dispatch }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + removeToken() + resetRouter() + + // reset visited views and cached views + // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485 + dispatch('tagsView/delAllViews', null, { root: true }) + + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // remove token + resetToken({ commit }) { + return new Promise(resolve => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + removeToken() + resolve() + }) + }, + // get nonce + getNonce({ commit }, nonce) { + return new Promise(resolve => { + commit('SET_NONCE', nonce) + resolve() + }) + }, + + // dynamically modify permissions + async changeRoles({ commit, dispatch }, role) { + const token = role + '-token' + + commit('SET_TOKEN', token) + setToken(token) + + const { roles } = await dispatch('getInfo') + + resetRouter() + + // generate accessible routes map based on roles + const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true }) + // dynamically add accessible routes + router.addRoutes(accessRoutes) + + // reset visited views and cached views + dispatch('tagsView/delAllViews', null, { root: true }) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/src/views/login/components/SocialSignin.vue b/src/views/login/components/SocialSignin.vue index e9bf4f2..ead7360 100644 --- a/src/views/login/components/SocialSignin.vue +++ b/src/views/login/components/SocialSignin.vue @@ -1,22 +1,58 @@ - - - - + + + + + + +