提交 d759592f authored 作者: lidongxu's avatar lidongxu

refactor(login): 尝试合并登录几种方法

上级 d6fa43d0
...@@ -12,6 +12,6 @@ VITE_APP_BASE_API = '/dev-api' # 小卤 ...@@ -12,6 +12,6 @@ VITE_APP_BASE_API = '/dev-api' # 小卤
VITE_APP_PROMOTION = '/promotion-api' # 促销 VITE_APP_PROMOTION = '/promotion-api' # 促销
# 飞书服务回调地址(本地测试已经通过并上线,后台飞书登录接口重定向地址已经不是 localhost 了所以本地开发无需使用飞书登录,线上已经可用) # 飞书服务回调地址(本地测试已经通过并上线,后台飞书登录接口重定向地址已经不是 localhost 了所以本地开发无需使用飞书登录,线上已经可用)
VITE_APP_REDIRECT_URL = 'http://localhost:8080' VITE_APP_REDIRECT_URL = 'http://localhost:8085'
# 积木报表服务地址 # 积木报表服务地址
VITE_APP_REPORT_URL = 'https://sfa-qa.wxl66.cn' VITE_APP_REPORT_URL = 'https://sfa-qa.wxl66.cn'
\ No newline at end of file
...@@ -26,8 +26,8 @@ export default defineStore( ...@@ -26,8 +26,8 @@ export default defineStore(
if (type === 'upass') { if (type === 'upass') {
const { username, password } = data const { username, password } = data
login({ username, password }).then(res => { login({ username, password }).then(res => {
setToken(res.data.access_token)
this.token = res.data.access_token this.token = res.data.access_token
setToken(res.data.access_token)
resolve() resolve()
}).catch(error => { }).catch(error => {
reject(error) reject(error)
......
<template> <template>
<div class="login" <div class="login"
v-if="isShowLogin"> v-if="!autoLoginLoading">
<el-form ref="loginRef" <el-form ref="loginRef"
:model="loginForm" :model="loginForm"
:rules="loginRules" :rules="loginRules"
...@@ -35,12 +35,12 @@ ...@@ -35,12 +35,12 @@
</el-form-item> </el-form-item>
<el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox> <el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox>
<el-form-item> <el-form-item>
<el-button :loading="loading" <el-button :loading="accountPassLoading"
size="large" size="large"
type="primary" type="primary"
@click.prevent="handleLogin" @click.prevent="handleLogin"
class="login_btn"> class="login_btn">
<span v-if="!loading">登 录</span> <span v-if="!accountPassLoading">登 录</span>
<span v-else>登 录 中...</span> <span v-else>登 录 中...</span>
</el-button> </el-button>
<div class="auth_wrap"> <div class="auth_wrap">
...@@ -64,114 +64,59 @@ ...@@ -64,114 +64,59 @@
</div> </div>
<div class="auth_wait" <div class="auth_wait"
v-else v-else
v-loading="!isShowLogin" v-loading="autoLoginLoading"
element-loading-text="授权登录中..."> element-loading-text="授权登录中...">
</div> </div>
</template> </template>
<script setup> <script setup>
import { fsOAuthUrl, fsClientAuth } from "@/api"; import { fsOAuthUrl, fsClientAuth } from "@/api"
import Cookies from "js-cookie"; import Cookies from "js-cookie"
import { encrypt, decrypt } from "@/utils"; import { encrypt, decrypt } from "@/utils"
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
const userStore = useUserStore() const userStore = useUserStore()
const route = useRoute(); const route = useRoute()
const router = useRouter(); const router = useRouter()
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance()
const loginForm = ref({ const loginForm = ref({
username: "", username: "",
password: "", password: "",
rememberMe: false rememberMe: false
}); })
const loginRules = { const loginRules = {
username: [{ required: true, trigger: "blur", message: "请输入您的工号" }], username: [{ required: true, trigger: "blur", message: "请输入您的工号" }],
password: [{ required: true, trigger: "blur", message: "请输入您的密码" }] password: [{ required: true, trigger: "blur", message: "请输入您的密码" }]
}; }
const loading = ref(false); const accountPassLoading = ref(false) // 账号密码登录状态
const isShowLogin = ref(false); const autoLoginLoading = ref(false) // 自动免登录
const redirect = ref(undefined); const redirect = ref(undefined)
watch(route, (newRoute) => { watch(route, (newRoute) => {
redirect.value = newRoute.query?.redirect; redirect.value = newRoute.query?.redirect
}, { immediate: true }); }, { immediate: true })
// 回显账号密码 // 回显账号密码
function getCookie() { function getCookie() {
const username = Cookies.get("username"); const username = Cookies.get("username")
const password = Cookies.get("password"); const password = Cookies.get("password")
const rememberMe = Cookies.get("rememberMe"); const rememberMe = Cookies.get("rememberMe")
loginForm.value = { loginForm.value = {
username: username === undefined ? loginForm.value.username : username, username: username === undefined ? loginForm.value.username : username,
password: password === undefined ? loginForm.value.password : decrypt(password), password: password === undefined ? loginForm.value.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe) rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
};
}
getCookie();
// code 登录
const loginByType = async (type, data) => {
// 登录
userStore.login({
type,
data
}).then(() => {
router.push({ path: redirect.value || "/" });
}).catch(() => {
loading.value = false;
isShowLogin.value = true;
});
}
// 飞书网页授权登录(授权后会回调我这个网页,执行代码获取 state,进行登录)
const getOAuthState = () => {
const params = new URLSearchParams(window.location.search);
const code = params.get('code');
const state = params.get('state');
if (state === 'fs') {
loginByType('fs', { code })
}
}
getOAuthState()
// 检查-是否飞书回跳,并客户端登录
const checkFsLoginAuth = async () => {
if (window.h5sdk) {
const code = await fsClientAuth()
loginByType('fs', { code })
} else {
isShowLogin.value = true
}
}
checkFsLoginAuth()
// 检查-是否勤策回跳,并客户端登录
const checkQcLoginAuth = async () => {
isShowLogin.value = false
// 参数:?redirect=/m?state=STATE&code=CODE 这个格式
const url = window.location.href.split('?')[2]
if (url) {
const params = new URLSearchParams(url);
const state = params.get('state');
if (state === 'STATE') {
loginByType('qc', url)
} else {
isShowLogin.value = true
}
} else {
isShowLogin.value = true
} }
} }
checkQcLoginAuth() getCookie()
// 号密码登录 // 号密码登录
function handleLogin() { function handleLogin() {
proxy.$refs.loginRef.validate(valid => { proxy.$refs.loginRef.validate(valid => {
if (valid) { if (valid) {
loading.value = true; accountPassLoading.value = true;
// 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码 // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
if (loginForm.value.rememberMe) { if (loginForm.value.rememberMe) {
Cookies.set("username", loginForm.value.username, { expires: 30 }); Cookies.set("username", loginForm.value.username, { expires: 30 });
...@@ -189,6 +134,47 @@ function handleLogin() { ...@@ -189,6 +134,47 @@ function handleLogin() {
}); });
} }
// 自动登录
async function checkAutoLogin() {
// 飞书客户端内-免登录
if (window.h5sdk) {
autoLoginLoading.value = true
const code = await fsClientAuth()
loginByType('fs', { code })
} else {
// 飞书网页授权回调-免登录
const params = new URLSearchParams(window.location.search);
const code = params.get('code');
const state = params.get('state');
if (state === 'fs') {
loginByType('fs', { code })
}
// 勤策
// const url = window.location.href.split('?')[2]
// if (url) {
// const params = new URLSearchParams(url);
// const state = params.get('state');
// state === 'STATE' && loginByType('qc', url)
// }
}
}
checkAutoLogin()
// code 免账号密码登录
const loginByType = async (type, data) => {
// 登录
userStore.login({
type,
data
}).then(() => {
router.push({ path: redirect.value || "/" });
}).catch(() => {
accountPassLoading.value = false;
autoLoginLoading.value = false;
})
}
// 网页回车登录 // 网页回车登录
window.addEventListener('keyup', (ev) => { window.addEventListener('keyup', (ev) => {
if (ev.key === 'Enter') { if (ev.key === 'Enter') {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论