volunteerLogin.vue
3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<template>
<div class="volunteer-login-page">
<div class="logo-section">
<img :src="logo" alt="logo" class="logo" />
<div class="app-name">义工登录</div>
</div>
<div class="login-card">
<van-field v-model="username" label="账号" placeholder="请输入账号" clearable />
<van-field v-model="password" label="密码" type="password" placeholder="请输入密码" clearable />
<div class="btn-wrap">
<van-button block color="#A67939" :loading="loading" :disabled="loading" @click="handle_login">
立即登录
</van-button>
</div>
</div>
</div>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import { useRouter } from 'vue-router'
import { showToast, showSuccessToast } from 'vant'
import { mainStore } from '@/store'
import { checkRedeemPermissionAPI, volunteerLoginAPI } from '@/api/redeem'
import logo from '@/assets/images/logo_01.png'
const store = mainStore()
const $router = useRouter()
const username = ref('')
const password = ref('')
const loading = ref(false)
/**
* @description 进入页面时先做权限校验,已有核销权限则直接跳转核销页
* @returns {Promise<void>}
*/
const check_permission_and_redirect = async () => {
const permission_res = await checkRedeemPermissionAPI()
if (!permission_res) return
if (permission_res?.data) store.changeUserInfo(permission_res.data)
if (permission_res?.data?.can_redeem === true) {
$router.replace({ path: '/verificationResult' })
}
}
onMounted(check_permission_and_redirect)
/**
* @description 义工登录
* - 先登录获取会话/权限凭证
* - 再调用权限校验接口,确认具备核销权限
* - 成功后跳转核销页
* @returns {Promise<void>}
*/
const handle_login = async () => {
if (!username.value || !password.value) {
showToast('请输入账号密码')
return
}
loading.value = true
const login_res = await volunteerLoginAPI({ uuid: username.value, password: password.value })
loading.value = false
if (!login_res || login_res?.code !== 1) {
showToast(login_res?.msg || '登录失败')
return
}
// 登录成功后做一次权限校验,避免“登录成功但无核销权限”的误导
const permission_res = await checkRedeemPermissionAPI()
if (!permission_res || permission_res?.code !== 1) {
showToast(permission_res?.msg || '权限校验失败')
return
}
if (permission_res?.data) store.changeUserInfo(permission_res.data)
if (permission_res?.data?.can_redeem === true) {
showSuccessToast(permission_res?.msg || login_res?.msg || '登录成功')
// 延迟跳转,确保用户能看到成功提示
setTimeout(() => $router.replace({ path: '/verificationResult' }), 800)
return
}
showToast(permission_res?.msg || '暂无核销权限')
}
</script>
<style lang="less" scoped>
.volunteer-login-page {
min-height: 100vh;
background-color: #F6F6F6;
display: flex;
flex-direction: column;
align-items: center;
padding: 80px 16px 16px;
box-sizing: border-box;
.logo-section {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 20px;
.logo {
width: 80px;
height: 80px;
border-radius: 50%;
background-color: #fff;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
object-fit: contain;
}
.app-name {
margin-top: 12px;
font-size: 20px;
font-weight: 600;
color: #333;
letter-spacing: 2px;
}
}
.login-card {
width: 100%;
max-width: 420px;
background: #fff;
border-radius: 12px;
padding: 12px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.04);
box-sizing: border-box;
.btn-wrap {
margin-top: 16px;
}
}
}
</style>