Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
wangxiaolu-sfa-ui
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
sfa
wangxiaolu-sfa-ui
Commits
d759592f
提交
d759592f
authored
5月 13, 2025
作者:
lidongxu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor(login): 尝试合并登录几种方法
上级
d6fa43d0
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
68 行增加
和
81 行删除
+68
-81
.env.development
.env.development
+2
-1
user.js
src/store/modules/user.js
+2
-2
login.vue
src/views/login.vue
+64
-78
没有找到文件。
.env.development
浏览文件 @
d759592f
...
@@ -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:808
0
'
VITE_APP_REDIRECT_URL = 'http://localhost:808
5
'
# 积木报表服务地址
# 积木报表服务地址
VITE_APP_REPORT_URL = 'https://sfa-qa.wxl66.cn'
VITE_APP_REPORT_URL = 'https://sfa-qa.wxl66.cn'
\ No newline at end of file
src/store/modules/user.js
浏览文件 @
d759592f
...
@@ -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
)
...
@@ -46,7 +46,7 @@ export default defineStore(
...
@@ -46,7 +46,7 @@ export default defineStore(
qcLogin
(
data
).
then
(
res
=>
{
qcLogin
(
data
).
then
(
res
=>
{
setToken
(
res
.
access_token
)
setToken
(
res
.
access_token
)
this
.
token
=
res
.
access_token
this
.
token
=
res
.
access_token
resolve
()
resolve
()
}).
catch
(
error
=>
{
}).
catch
(
error
=>
{
reject
(
error
)
reject
(
error
)
})
})
...
...
src/views/login.vue
浏览文件 @
d759592f
<
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=
"
l
oading"
<el-button
:loading=
"
accountPassL
oading"
size=
"large"
size=
"large"
type=
"primary"
type=
"primary"
@
click
.
prevent=
"handleLogin"
@
click
.
prevent=
"handleLogin"
class=
"login_btn"
>
class=
"login_btn"
>
<span
v-if=
"!
l
oading"
>
登 录
</span>
<span
v-if=
"!
accountPassL
oading"
>
登 录
</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
()
getCookie
()
// 检查-是否勤策回跳,并客户端登录
// 账号密码登录
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
()
// 工号密码登录
function
handleLogin
()
{
function
handleLogin
()
{
proxy
.
$refs
.
loginRef
.
validate
(
valid
=>
{
proxy
.
$refs
.
loginRef
.
validate
(
valid
=>
{
if
(
valid
)
{
if
(
valid
)
{
l
oading
.
value
=
true
;
accountPassL
oading
.
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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论