diff --git a/src/api/login.js b/src/api/login.js index 9f333cb..8b25dde 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -19,6 +19,19 @@ export function login(username, password, code, uuid) { }) } +// 手机号登录方法 +export function loginByPhoneApi(data) { + return request({ + url: '/loginByPhone', + headers: { + isToken: false, + repeatSubmit: false + }, + method: 'post', + data: data + }) +} + // 注册方法 export function register(data) { return request({ @@ -57,4 +70,4 @@ export function getCodeImg() { method: 'get', timeout: 20000 }) -} \ No newline at end of file +} diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 0f54c2d..6acc805 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,49 +1,67 @@ import router from '@/router' -import { ElMessageBox, } from 'element-plus' -import { login, logout, getInfo } from '@/api/login' +import { ElMessageBox } from 'element-plus' +import { login, logout, getInfo, loginByPhoneApi } from '@/api/login' import { getToken, setToken, removeToken } from '@/utils/auth' -import { isHttp, isEmpty } from "@/utils/validate" +import { isHttp, isEmpty } from '@/utils/validate' import defAva from '@/assets/images/profile.jpg' -const useUserStore = defineStore( - 'user', - { - state: () => ({ - token: getToken(), - id: '', - name: '', - nickName: '', - avatar: '', - roles: [], - permissions: [] - }), - actions: { - // 登录 - login(userInfo) { - const username = userInfo.username.trim() - const password = userInfo.password - const code = userInfo.code - const uuid = userInfo.uuid - return new Promise((resolve, reject) => { - login(username, password, code, uuid).then(res => { +const useUserStore = defineStore('user', { + state: () => ({ + token: getToken(), + id: '', + name: '', + nickName: '', + avatar: '', + roles: [], + permissions: [] + }), + actions: { + // 登录 + login(userInfo) { + const username = userInfo.username.trim() + const password = userInfo.password + const code = userInfo.code + const uuid = userInfo.uuid + return new Promise((resolve, reject) => { + login(username, password, code, uuid) + .then(res => { setToken(res.token) this.token = res.token resolve() - }).catch(error => { + }) + .catch(error => { reject(error) }) - }) - }, - // 获取用户信息 - getInfo() { - return new Promise((resolve, reject) => { - getInfo().then(res => { + }) + }, + // 手机号登录 + loginByPhone(phoneInfo) { + const phone = phoneInfo.phone.trim() + const code = phoneInfo.code.trim() + return new Promise((resolve, reject) => { + loginByPhoneApi({ phone, code }) + .then(res => { + setToken(res.token) + this.token = res.token + resolve() + }) + .catch(error => { + reject(error) + }) + }) + }, + // 获取用户信息 + getInfo() { + return new Promise((resolve, reject) => { + getInfo() + .then(res => { const user = res.user - let avatar = user.avatar || "" + let avatar = user.avatar || '' if (!isHttp(avatar)) { - avatar = (isEmpty(avatar)) ? defAva : import.meta.env.VITE_APP_BASE_API + avatar + avatar = isEmpty(avatar) ? defAva : import.meta.env.VITE_APP_BASE_API + avatar } - if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 + if (res.roles && res.roles.length > 0) { + // 验证返回的roles是否是一个非空数组 this.roles = res.roles this.permissions = res.permissions } else { @@ -54,38 +72,53 @@ const useUserStore = defineStore( this.nickName = user.nickName this.avatar = avatar /* 初始密码提示 */ - if(res.isDefaultModifyPwd) { - ElMessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { - router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) - }).catch(() => {}) + if (res.isDefaultModifyPwd) { + ElMessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) + }) + .catch(() => {}) } /* 过期密码提示 */ - if(!res.isDefaultModifyPwd && res.isPasswordExpired) { - ElMessageBox.confirm('您的密码已过期,请尽快修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { - router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) - }).catch(() => {}) + if (!res.isDefaultModifyPwd && res.isPasswordExpired) { + ElMessageBox.confirm('您的密码已过期,请尽快修改密码!', '安全提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) + }) + .catch(() => {}) } resolve(res) - }).catch(error => { + }) + .catch(error => { reject(error) }) - }) - }, - // 退出系统 - logOut() { - return new Promise((resolve, reject) => { - logout(this.token).then(() => { + }) + }, + // 退出系统 + logOut() { + return new Promise((resolve, reject) => { + logout(this.token) + .then(() => { this.token = '' this.roles = [] this.permissions = [] removeToken() resolve() - }).catch(error => { + }) + .catch(error => { reject(error) }) - }) - } + }) } - }) + } +}) export default useUserStore diff --git a/src/utils/request.js b/src/utils/request.js index 7434f45..73a8ce1 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -7,6 +7,7 @@ import cache from '@/plugins/cache' import { saveAs } from 'file-saver' import useUserStore from '@/store/modules/user' import { decryptWithSM4, encryptWithSM4, hashWithSM3AndSalt } from '@/utils/sm' +import router from '@/router' let downloadLoadingInstance // 是否显示重新登录 @@ -106,7 +107,10 @@ service.interceptors.response.use( return res.data } if (code === 401) { - if (!isRelogin.show) { + // 判断当前是否在 login 页面 + const isLogin = router.currentRoute.value.path == '/login' + console.log('🚀 ~ isLogin:', isLogin) + if (!isRelogin.show && !isLogin) { isRelogin.show = true ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', @@ -118,7 +122,7 @@ service.interceptors.response.use( useUserStore() .logOut() .then(() => { - location.href = '/index' + location.href = '/login' }) }) .catch(() => { diff --git a/src/views/login.vue b/src/views/login.vue index 4ac6e3e..e6dbb53 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -2,73 +2,106 @@

{{ title }}

- - - - - - - - - - - - - - - - - 记住密码 - - + + + + + + + + + 记住密码 + + + + + 登 录 登 录 中... -
+ +
立即注册
+ + + + + {{ isPhoneLogin ? '使用账号登录' : '使用手机号登录' }} + + - +
-