<template>
|
<div class="pwd-body" v-loading="loading">
|
<div class="pwd-wrapper">
|
<div class="pwd-content">
|
<div class="span-header">
|
<div class="bi-text">
|
<span style="text-align: center">{{ t('pblink.key_pwd') }} </span>
|
</div>
|
</div>
|
|
<div class="input-layout">
|
<div class="input-main">
|
<div class="div-input">
|
<el-form ref="pwdForm" :model="form" :rules="rule" size="small" @submit.stop.prevent>
|
<el-form-item label="" prop="password">
|
<CustomPassword
|
v-model="form.password"
|
maxlength="10"
|
minlength="4"
|
show-password
|
class="real-input"
|
:placeholder="t('pblink.input_placeholder')"
|
/>
|
</el-form-item>
|
</el-form>
|
</div>
|
</div>
|
<div class="abs-input">
|
<div class="input-text">{{ msg }}</div>
|
</div>
|
</div>
|
|
<div class="auth-root-class">
|
<el-button size="small" type="primary" @click="refresh(pwdForm)">{{
|
t('pblink.sure_bt')
|
}}</el-button>
|
</div>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script lang="ts" setup>
|
import { ref, reactive, onMounted } from 'vue'
|
import { useI18n } from '@/hooks/web/useI18n'
|
import type { FormInstance, FormRules } from 'element-plus-secondary'
|
import request from '@/config/axios'
|
import { useAppStoreWithOut } from '@/store/modules/app'
|
import { rsaEncryp } from '@/utils/encryption'
|
import { useCache } from '@/hooks/web/useCache'
|
import { queryDekey } from '@/api/login'
|
import { CustomPassword } from '@/components/custom-password'
|
const { wsCache } = useCache()
|
const appStore = useAppStoreWithOut()
|
|
const { t } = useI18n()
|
const msg = ref('')
|
const loading = ref(true)
|
const pwdForm = ref<FormInstance>()
|
const vid = ref('')
|
const form = ref({
|
password: ''
|
})
|
const rule = reactive<FormRules>({
|
password: [
|
{ required: true, message: t('pblink.key_pwd'), trigger: 'blur' },
|
{
|
required: true,
|
pattern: /^[A-Za-z\d!@#$%^&*()_+]{4,10}$/,
|
message: t('pblink.pwd_format_error'),
|
trigger: 'blur'
|
}
|
]
|
})
|
|
const refresh = async (formEl: FormInstance | undefined) => {
|
if (!formEl) return
|
await formEl.validate((valid, fields) => {
|
if (valid) {
|
const uuid = vid.value
|
const pwd = form.value.password
|
const text = `${uuid},${pwd}`
|
const ciphertext = rsaEncryp(text)
|
request.post({ url: '/share/validate', data: { ciphertext } }).then(res => {
|
if (res.data) {
|
wsCache.set(`link-${uuid}`, ciphertext)
|
window.location.reload()
|
} else {
|
msg.value = '密码错误'
|
}
|
})
|
} else {
|
console.error('error submit!', fields)
|
}
|
})
|
}
|
const formatPwd = (pwdText: string) => {
|
try {
|
return decodeURIComponent(pwdText)
|
} catch (e) {
|
return pwdText
|
}
|
}
|
const prepare = () => {
|
const curLocation = window.location.href
|
const pmIndex = curLocation.lastIndexOf('?')
|
const uuidObj = curLocation.substring(
|
curLocation.lastIndexOf('de-link/') + 8,
|
pmIndex > 0 ? pmIndex : curLocation.length
|
)
|
let uuid = null
|
let pwd = null
|
if (uuidObj?.includes(',')) {
|
const index = uuidObj.indexOf(',')
|
uuid = uuidObj.substring(0, index)
|
if (uuidObj.length > index + 1) {
|
pwd = uuidObj.substring(index + 1)
|
}
|
} else {
|
uuid = uuidObj
|
}
|
vid.value = uuid
|
if (pwd) {
|
pwd = formatPwd(pwd)
|
form.value.password = pwd
|
refresh(pwdForm.value)
|
}
|
}
|
onMounted(() => {
|
if (!wsCache.get(appStore.getDekey)) {
|
queryDekey()
|
.then(res => {
|
wsCache.set(appStore.getDekey, res.data)
|
prepare()
|
})
|
.finally(() => {
|
loading.value = false
|
})
|
} else {
|
prepare()
|
loading.value = false
|
}
|
})
|
</script>
|
|
<style lang="less" scoped>
|
.pwd-body {
|
position: absolute;
|
width: 100%;
|
margin: 0;
|
padding: 0;
|
top: 0;
|
left: 0;
|
background-repeat: repeat;
|
-webkit-user-select: none;
|
-moz-user-select: none;
|
-ms-user-select: none;
|
-o-user-select: none;
|
user-select: none;
|
color: #3d4d66;
|
-webkit-font-smoothing: antialiased;
|
-moz-osx-font-smoothing: grayscale;
|
text-decoration: none;
|
-kthml-user-focus: normal;
|
-moz-user-focus: normal;
|
-moz-outline: 0 none;
|
outline: 0 none;
|
height: 100%;
|
display: block;
|
}
|
.pwd-wrapper {
|
background-color: #f7f8fa;
|
height: 100%;
|
justify-content: center !important;
|
align-items: center !important;
|
min-height: 25px;
|
display: flex;
|
-moz-flex-direction: row;
|
-o-flex-direction: row;
|
flex-direction: row;
|
-moz-justify-content: flex-start;
|
-ms-justify-content: flex-start;
|
-o-justify-content: flex-start;
|
justify-content: flex-start;
|
-moz-align-items: flex-start;
|
-ms-align-items: flex-start;
|
-o-align-items: flex-start;
|
align-items: flex-start;
|
-o-flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
}
|
.pwd-content {
|
width: 450px;
|
height: 250px;
|
position: relative;
|
flex-shrink: 0;
|
background-color: #ffffff;
|
display: block;
|
}
|
.span-header {
|
position: relative;
|
margin: 57px auto 0px;
|
justify-content: center !important;
|
align-items: center !important;
|
}
|
.bi-text {
|
max-width: 100%;
|
text-align: center;
|
white-space: pre;
|
text-overflow: ellipsis;
|
position: relative;
|
flex-shrink: 0;
|
box-sizing: border-box;
|
overflow: hidden;
|
overflow-x: hidden;
|
overflow-y: hidden;
|
word-break: break-all;
|
display: block;
|
}
|
.input-layout {
|
width: 200px;
|
position: relative;
|
margin: 0px auto;
|
padding: 0;
|
display: block;
|
}
|
.input-main {
|
width: 192px;
|
height: 35px;
|
position: relative;
|
margin-top: 30px;
|
// border: 1px solid #e8eaed;
|
display: block;
|
}
|
.abs-input {
|
height: 20px;
|
position: relative;
|
margin-top: 5px;
|
display: block;
|
}
|
.input-text {
|
height: 20px;
|
line-height: 20px;
|
text-align: center;
|
white-space: pre;
|
text-overflow: ellipsis;
|
left: 0px;
|
top: 0px;
|
bottom: 0px;
|
position: absolute;
|
color: #e65251;
|
box-sizing: border-box;
|
}
|
.auth-root-class {
|
margin: 15px 0px 5px;
|
text-align: center;
|
}
|
</style>
|