5 changed files with 228 additions and 28 deletions
@ -0,0 +1,216 @@ |
|||||
|
<template> |
||||
|
<div class="login-page"> |
||||
|
<div class="login-content"> |
||||
|
<van-nav-bar> |
||||
|
<template #title> |
||||
|
<div class="title"> |
||||
|
执法端登录 |
||||
|
</div> |
||||
|
</template> |
||||
|
</van-nav-bar> |
||||
|
<van-form @submit="onSubmit"> |
||||
|
<van-field v-model="loginParam.secretName" name="secretName" label="用户名" placeholder="用户名" |
||||
|
:rules="[{ required: true, message: '请填写用户名' }]"/> |
||||
|
<van-field v-model="loginParam.secretKey" type="password" name="secretKey" label="密码" |
||||
|
placeholder="密码" |
||||
|
:rules="[{ required: true, message: '请填写密码' }]"/> |
||||
|
<div style="margin: 0.42rem"> |
||||
|
<van-button block type="primary" native-type="submit">登录</van-button> |
||||
|
</div> |
||||
|
</van-form> |
||||
|
<div style="margin: 0.42rem 0.42rem 0; text-align: center;display: none"> |
||||
|
<van-button plain type="default" size="small" @click="showTestPicker = true" |
||||
|
style="background-color: darkred;color: white">选择测试用户 |
||||
|
</van-button> |
||||
|
</div> |
||||
|
<van-action-sheet v-model:show="showTestPicker" title="选择测试用户"> |
||||
|
<div class="test-enterprise-list"> |
||||
|
<van-cell |
||||
|
v-for="(item, index) in testUsers" |
||||
|
:key="index" |
||||
|
:title="item.name+' / '+item.bureauUnitName" |
||||
|
:label="'账号:' + item.account" |
||||
|
is-link |
||||
|
@click="selectTestUser(item)" |
||||
|
/> |
||||
|
</div> |
||||
|
</van-action-sheet> |
||||
|
<van-popup v-model:show="showNavigatePicker" :close-on-click-overlay="false" round style="width: 80%; padding: 0.4rem;"> |
||||
|
<div style="font-size: 0.5rem; font-weight: bold;" class="navigate-title">请选择进入系统</div> |
||||
|
<div class="navigate-list"> |
||||
|
<van-cell |
||||
|
is-link |
||||
|
@click="navigateTo('enforcement')" |
||||
|
style="margin-bottom: 30px" |
||||
|
> |
||||
|
<template #title> |
||||
|
<span style="font-size: 0.5rem; font-weight: bold;">移动执法端</span> |
||||
|
</template> |
||||
|
</van-cell> |
||||
|
<van-cell |
||||
|
is-link |
||||
|
@click="navigateTo('supervision')" |
||||
|
> |
||||
|
<template #title> |
||||
|
<span style="font-size: 0.5rem; font-weight: bold;">移动监督端</span> |
||||
|
</template> |
||||
|
</van-cell> |
||||
|
</div> |
||||
|
</van-popup> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script setup> |
||||
|
import {reactive, ref, onMounted} from 'vue'; |
||||
|
import {enforcementLogin, enforcementLoginByPassword} from '../../api/enforcement'; |
||||
|
import CryptoJS from "crypto-js"; |
||||
|
import {showFailToast} from 'vant'; |
||||
|
import 'vant/es/toast/style'; |
||||
|
|
||||
|
const {useCommon} = $globalStore; |
||||
|
const router = useRouter(); |
||||
|
const route = useRoute(); |
||||
|
const loginParam = reactive({ |
||||
|
secretName: "", |
||||
|
secretKey: "" |
||||
|
}) |
||||
|
|
||||
|
const showTestPicker = ref(false); |
||||
|
const showNavigatePicker = ref(false); |
||||
|
|
||||
|
const navigateTo = (target) => { |
||||
|
showNavigatePicker.value = false; |
||||
|
if (target === 'enforcement') { |
||||
|
router.push({name: "enforcementHome"}); |
||||
|
} else if (target === 'supervision') { |
||||
|
router.push('/enforcement/enforcementRecord'); |
||||
|
} |
||||
|
}; |
||||
|
const testUsers = [ |
||||
|
{loginUserId:"0001002",account: 'cuifengyuan', name: '', password: 'szsf@zfjd',bureauUnitName:""} |
||||
|
]; |
||||
|
|
||||
|
const selectTestUser = (item) => { |
||||
|
loginParam.secretName = item.account; |
||||
|
loginParam.secretKey = item.password; |
||||
|
showTestPicker.value = false; |
||||
|
// 直接触发登录 |
||||
|
doLogin(item.account, item.password); |
||||
|
} |
||||
|
const doLogin = (secretName, secretKey) => { |
||||
|
const encryptedKey = Encrypt(secretKey); |
||||
|
enforcementLoginByPassword({"secretName": secretName, "secretKey": encryptedKey}, response => { |
||||
|
if (response.code === 200) { |
||||
|
// 验证关键组织信息 |
||||
|
if (!response.data.deptId) { |
||||
|
showFailToast("该用户未关联部门,无法登录"); |
||||
|
return; |
||||
|
} |
||||
|
if (!response.data.organId) { |
||||
|
showFailToast("该用户未关联认证机构,无法登录"); |
||||
|
return; |
||||
|
} |
||||
|
if (!response.data.bureauUnitId) { |
||||
|
showFailToast("该用户未关联执法单位,无法登录"); |
||||
|
return; |
||||
|
} |
||||
|
// 执法端登录成功 → 赋值用户基本信息 |
||||
|
useCommon.SET_USER_PHONENUMBER(response.data.phonenumber || ""); |
||||
|
useCommon.SET_USER_ID(response.data.userId); |
||||
|
useCommon.SET_USER_NAME(response.data.userName || ""); |
||||
|
useCommon.SET_NICK_NAME(response.data.nickName || ""); |
||||
|
useCommon.SET_TOKEN(response.data.token); |
||||
|
useCommon.SET_DEPT_ID(response.data.deptId); |
||||
|
useCommon.SET_DEPT_NAME(response.data.deptName || ""); |
||||
|
useCommon.SET_ORGAN_ID(response.data.organId); |
||||
|
useCommon.SET_ORGAN_NAME(response.data.organName || ""); |
||||
|
useCommon.SET_BUREAU_UNIT_ID(response.data.bureauUnitId); |
||||
|
useCommon.SET_BUREAU_UNIT_NAME(response.data.bureauUnitName || ""); |
||||
|
console.log("bureauUnitName", response.data.bureauUnitName); |
||||
|
console.log("enforcement login success", useCommon.userId); |
||||
|
showNavigatePicker.value = true; |
||||
|
} else { |
||||
|
showFailToast(response.msg || "登录失败"); |
||||
|
} |
||||
|
}, error => { |
||||
|
showFailToast(error?.msg || "登录失败,请检查网络"); |
||||
|
}) |
||||
|
}; |
||||
|
|
||||
|
const onSubmit = async () => { |
||||
|
doLogin(loginParam.secretName, loginParam.secretKey); |
||||
|
}; |
||||
|
|
||||
|
// 检测URL中的loginUserId参数,自动登录对应测试用户 |
||||
|
onMounted(() => { |
||||
|
const loginUserId = route.query.loginUserId; |
||||
|
if (loginUserId) { |
||||
|
const targetUser = testUsers.find(u => u.loginUserId === loginUserId); |
||||
|
if (targetUser) { |
||||
|
loginParam.secretName = targetUser.account; |
||||
|
loginParam.secretKey = targetUser.password; |
||||
|
doLogin(targetUser.account, targetUser.password); |
||||
|
} else { |
||||
|
showFailToast(`未找到loginUserId为${loginUserId}的测试用户`); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const Encrypt = (passWord) => { |
||||
|
var keyStr = '1234567898745621'; |
||||
|
var ivStr = keyStr; |
||||
|
var key = CryptoJS.enc.Utf8.parse(keyStr); |
||||
|
var iv = CryptoJS.enc.Utf8.parse(ivStr); |
||||
|
var srcs = CryptoJS.enc.Utf8.parse(passWord); |
||||
|
var encrypted = CryptoJS.AES.encrypt(srcs, key, { |
||||
|
iv: iv, |
||||
|
mode: CryptoJS.mode.CBC, |
||||
|
padding: CryptoJS.pad.ZeroPadding |
||||
|
}); |
||||
|
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext); |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="less" scoped> |
||||
|
.login-page { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
display: flex; |
||||
|
overflow: hidden; |
||||
|
background-image: url("~@/assets/images/login.jpg"); |
||||
|
background-repeat: no-repeat; |
||||
|
background-size: cover; |
||||
|
opacity: 0.9; |
||||
|
|
||||
|
.login-content { |
||||
|
margin: auto; |
||||
|
padding: 0.27rem 0.27rem 0.52rem 0.27rem; |
||||
|
background-color: #fff; |
||||
|
border-radius: 0.27rem; |
||||
|
box-shadow: 0 0 0.27rem rgba(0, 0, 0, 0.2); |
||||
|
opacity: 0.9; |
||||
|
|
||||
|
.title { |
||||
|
font-size: 0.52rem; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.test-enterprise-list { |
||||
|
max-height: 60vh; |
||||
|
overflow-y: auto; |
||||
|
padding: 0.2rem; |
||||
|
} |
||||
|
|
||||
|
.navigate-title { |
||||
|
text-align: center; |
||||
|
font-size: 0.4rem; |
||||
|
font-weight: 600; |
||||
|
padding: 0.2rem 0 0.3rem; |
||||
|
} |
||||
|
|
||||
|
.navigate-list { |
||||
|
padding: 0.2rem; |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue