|
|
|
<!-- @format -->
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<div class="signUp ns-view">
|
|
|
|
<a-layout>
|
|
|
|
<a-layout-header class="home_header" style="position: relative">
|
|
|
|
<img
|
|
|
|
v-if="themeConfig.logoUrl"
|
|
|
|
:src="themeConfig.logoUrl"
|
|
|
|
style="width: 192px; height: 48px; object-fit: contain" />
|
|
|
|
<ns-icon v-else name="login" style="width: auto; height: 40px" />
|
|
|
|
</a-layout-header>
|
|
|
|
<a-layout-content>
|
|
|
|
<div class="content">
|
|
|
|
<h1>{{ title }}</h1>
|
|
|
|
<div class="lg_card">
|
|
|
|
<h2>{{ themeConfig.webSiteTitle ? themeConfig.webSiteTitle : subTitle }}</h2>
|
|
|
|
<div class="form">
|
|
|
|
<ns-form
|
|
|
|
style="width: 100%; margin: auto"
|
|
|
|
ref="formOneRef"
|
|
|
|
formLayout="修改"
|
|
|
|
:schemas="formSchema"
|
|
|
|
:model="data" />
|
|
|
|
<div class="step-box">
|
|
|
|
<a-button @click="navigateBack">取消</a-button>
|
|
|
|
<a-button @click="submit" type="primary" :disabled="!formOneRef?.validateResult"
|
|
|
|
>确认修改</a-button
|
|
|
|
>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</a-layout-content>
|
|
|
|
<a class="toLogin" @click="toLogin" v-show="step === 0">登录已有豪恩账号 ></a>
|
|
|
|
<!-- <a-layout-footer>Copyright 2021 xu科技 All Rights Reserved</a-layout-footer> -->
|
|
|
|
</a-layout>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts">
|
|
|
|
import { defineComponent, reactive, ref } from 'vue';
|
|
|
|
import { useRouter } from 'vue-router';
|
|
|
|
import { http } from '/nerv-lib/util/http';
|
|
|
|
import { Cookies } from '/nerv-lib/util/cookie';
|
|
|
|
import { authorizationService } from '/nerv-base/store/modules/authorization-service';
|
|
|
|
import { NsMessage } from '/nerv-lib/component/message';
|
|
|
|
import { appConfigStore } from '/nerv-lib/saas/store/modules/app-config';
|
|
|
|
import { storeToRefs } from 'pinia';
|
|
|
|
import { useNavigate } from '/nerv-lib/use/use-navigate';
|
|
|
|
export default defineComponent({
|
|
|
|
name: 'UpdatePassWord',
|
|
|
|
setup() {
|
|
|
|
const router = useRouter();
|
|
|
|
const imageUrl = ref('/asset/image/login/logo.png');
|
|
|
|
const title = ref('修改密码');
|
|
|
|
const subTitle = ref('sass平台');
|
|
|
|
const { uuid } = router.currentRoute.value.query;
|
|
|
|
const formOneRef = ref();
|
|
|
|
const configStore = appConfigStore();
|
|
|
|
|
|
|
|
const { getThemeConfig: themeConfig } = storeToRefs(configStore);
|
|
|
|
if (configStore.updatePassWordInfo.title) {
|
|
|
|
title.value = configStore.updatePassWordInfo.title;
|
|
|
|
subTitle.value = configStore.updatePassWordInfo.subtitle;
|
|
|
|
}
|
|
|
|
let data = reactive({});
|
|
|
|
const authorizationStore = authorizationService();
|
|
|
|
const { navigateBackV2: navigateBack } = useNavigate();
|
|
|
|
const formSchema = reactive([
|
|
|
|
{
|
|
|
|
field: 'oldPassword',
|
|
|
|
label: '原密码',
|
|
|
|
component: 'NsInputPassword',
|
|
|
|
componentProps: {
|
|
|
|
autocomplete: 'new-password',
|
|
|
|
placeholder: '请输入原密码',
|
|
|
|
},
|
|
|
|
rules: [
|
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: '原密码不能为空',
|
|
|
|
trigger: 'blur',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
field: 'newPassword',
|
|
|
|
label: '新密码',
|
|
|
|
component: 'NsInputPassword',
|
|
|
|
componentProps: {
|
|
|
|
autocomplete: 'new-password',
|
|
|
|
placeholder: '密码不少于6位,支持字母、数字',
|
|
|
|
onchange: () => {
|
|
|
|
data.confirmPassword = '';
|
|
|
|
},
|
|
|
|
},
|
|
|
|
rules: [
|
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: '新密码不能为空',
|
|
|
|
trigger: 'change',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
validator: async (rule, value) => {
|
|
|
|
if (!value) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!/^([a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*])[a-z\d!@#$%^&*]{5,17}$/.test(value)) {
|
|
|
|
let strArray = value.split('');
|
|
|
|
if (strArray.indexOf(' ') !== -1) {
|
|
|
|
return Promise.reject('不能包含空格');
|
|
|
|
} else {
|
|
|
|
if (/[\u4E00-\u9FA5\uF900-\uFA2D]{1,}/.test(value)) {
|
|
|
|
return Promise.reject('不支持中文');
|
|
|
|
} else {
|
|
|
|
return Promise.reject(
|
|
|
|
'需同时包含数字,字母及特殊字符(!@#$%^&*),且只能以字母开头,长度为6-18个字符',
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
trigger: 'change',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
{
|
|
|
|
field: 'confirmPassword',
|
|
|
|
label: '确认密码',
|
|
|
|
component: 'NsInputPassword',
|
|
|
|
viewOnly: true,
|
|
|
|
componentProps: {
|
|
|
|
autocomplete: 'new-password',
|
|
|
|
placeholder: '请再次输入密码',
|
|
|
|
},
|
|
|
|
rules: [
|
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: '不能为空',
|
|
|
|
trigger: 'change',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
trigger: 'change',
|
|
|
|
validator: async (rule, value) => {
|
|
|
|
if (!value) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (value !== data.newPassword) {
|
|
|
|
return Promise.reject('两次密码不一致');
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
|
|
|
|
const loading = ref<boolean>(false);
|
|
|
|
|
|
|
|
// const title = ref<string>('修改密码');
|
|
|
|
|
|
|
|
const submit = (): void => {
|
|
|
|
formOneRef.value.triggerSubmit().then((data) => {
|
|
|
|
loading.value = true;
|
|
|
|
async function update() {
|
|
|
|
try {
|
|
|
|
const res = await http.post(configStore.updatePassWordInfo?.api, data);
|
|
|
|
if (res.success) {
|
|
|
|
NsMessage.success('修改成功,需重新登陆', 1, () => {
|
|
|
|
Cookies.remove(`${import.meta.env.VITE_PUBLIC_PATH}-nervsid`);
|
|
|
|
sessionStorage.clear();
|
|
|
|
router.push('/login');
|
|
|
|
authorizationStore.clearAuthorization();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
loading.value = false;
|
|
|
|
} catch (err) {
|
|
|
|
loading.value = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
return {
|
|
|
|
themeConfig,
|
|
|
|
submit,
|
|
|
|
formSchema,
|
|
|
|
data,
|
|
|
|
subTitle,
|
|
|
|
formOneRef,
|
|
|
|
imageUrl,
|
|
|
|
router,
|
|
|
|
uuid,
|
|
|
|
navigateBack,
|
|
|
|
title,
|
|
|
|
loading,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
created() {
|
|
|
|
const _this = this;
|
|
|
|
window.sessionStorage.clear();
|
|
|
|
document.onkeydown = function (e) {
|
|
|
|
const key = window.event === undefined ? e.keyCode : window.event.keyCode;
|
|
|
|
key === 13 ? _this.submit() : '';
|
|
|
|
};
|
|
|
|
},
|
|
|
|
beforeUnmount() {
|
|
|
|
document.onkeydown = function (e) {};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
.ns-form.ns-vertical-form {
|
|
|
|
width: 80% !important;
|
|
|
|
}
|
|
|
|
.ns-form::after {
|
|
|
|
background-color: #f0f2f5;
|
|
|
|
display: none;
|
|
|
|
margin: 0 16px;
|
|
|
|
width: calc(100% - 32px);
|
|
|
|
}
|
|
|
|
.finalSubmitDiv {
|
|
|
|
width: 100%;
|
|
|
|
margin-top: 45px;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: center;
|
|
|
|
.finalSubmit {
|
|
|
|
width: 90px;
|
|
|
|
height: 32px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
:deep(.verifyImgCode .ant-form-item) {
|
|
|
|
margin-bottom: 12px !important;
|
|
|
|
}
|
|
|
|
|
|
|
|
.signUp {
|
|
|
|
height: 100%;
|
|
|
|
overflow: hidden;
|
|
|
|
}
|
|
|
|
.content {
|
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
|
|
|
padding-top: 40px;
|
|
|
|
|
|
|
|
h1 {
|
|
|
|
text-align: center;
|
|
|
|
font-size: 24px;
|
|
|
|
line-height: 44px;
|
|
|
|
margin-bottom: 40px;
|
|
|
|
}
|
|
|
|
.lg_card {
|
|
|
|
width: 80%;
|
|
|
|
min-width: 800px;
|
|
|
|
height: 70%;
|
|
|
|
min-height: 400px;
|
|
|
|
background: #fff;
|
|
|
|
// box-shadow: 0 2px 2px 0 rgb(0 0 0 / 5%), 0 0 18px 0 rgb(0 0 0 / 8%);
|
|
|
|
border-radius: 6px;
|
|
|
|
margin: auto !important;
|
|
|
|
// padding: 15px 35px 35px;
|
|
|
|
.form {
|
|
|
|
width: 50%;
|
|
|
|
min-width: 400px;
|
|
|
|
margin: auto;
|
|
|
|
padding-top: 40px;
|
|
|
|
}
|
|
|
|
h2 {
|
|
|
|
padding-top: 24px;
|
|
|
|
padding-bottom: 24px;
|
|
|
|
font-size: 16px;
|
|
|
|
text-align: center;
|
|
|
|
border-bottom: 1px solid rgba(23, 46, 61, 0.15);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.toLogin {
|
|
|
|
width: 100%;
|
|
|
|
font-size: 16px;
|
|
|
|
line-height: 22px;
|
|
|
|
text-align: center;
|
|
|
|
color: #3aa7f2;
|
|
|
|
display: block;
|
|
|
|
margin-top: 40px;
|
|
|
|
margin-bottom: 16px;
|
|
|
|
}
|
|
|
|
.icon {
|
|
|
|
color: @primary-color;
|
|
|
|
// background: #000;
|
|
|
|
// min-height: 25px;
|
|
|
|
// min-width: 25px;
|
|
|
|
// display: flex;
|
|
|
|
// justify-content: center;
|
|
|
|
// align-items: center;
|
|
|
|
// border-radius: 50%;
|
|
|
|
}
|
|
|
|
.ant-layout-header {
|
|
|
|
height: 64px !important;
|
|
|
|
background: #fff;
|
|
|
|
line-height: 64px;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
}
|
|
|
|
|
|
|
|
.ant-layout-content {
|
|
|
|
border-top: 1px solid #ecedef;
|
|
|
|
width: 100%;
|
|
|
|
display: flex;
|
|
|
|
// align-items: center;
|
|
|
|
justify-content: center;
|
|
|
|
height: calc(100vh - 128px) !important;
|
|
|
|
}
|
|
|
|
|
|
|
|
.ant-layout-footer {
|
|
|
|
text-align: center;
|
|
|
|
font-size: 14px;
|
|
|
|
font-weight: 400;
|
|
|
|
color: #8f8f8f;
|
|
|
|
}
|
|
|
|
|
|
|
|
.lg_card_title {
|
|
|
|
width: 360px;
|
|
|
|
margin: 60px auto 0;
|
|
|
|
height: 48px;
|
|
|
|
font-size: 20px;
|
|
|
|
font-weight: bold;
|
|
|
|
color: #172e3d;
|
|
|
|
text-align: left;
|
|
|
|
line-height: 20px;
|
|
|
|
span {
|
|
|
|
float: right;
|
|
|
|
font-size: 14px;
|
|
|
|
color: #808d96;
|
|
|
|
font-weight: lighter;
|
|
|
|
strong {
|
|
|
|
color: #1d2d3d;
|
|
|
|
font-weight: 400;
|
|
|
|
display: inline-block;
|
|
|
|
cursor: pointer;
|
|
|
|
&:hover {
|
|
|
|
color: #ff1744;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
:deep(.ant-form-item) {
|
|
|
|
margin-bottom: 24px;
|
|
|
|
}
|
|
|
|
:deep(#app .ant-form-item-label > label) {
|
|
|
|
color: #606060;
|
|
|
|
}
|
|
|
|
:deep(.lg_card .ant-col-5) {
|
|
|
|
width: 30%;
|
|
|
|
flex: 0 0 30%;
|
|
|
|
text-align: right;
|
|
|
|
}
|
|
|
|
:deep(.ant-layout-content) {
|
|
|
|
margin: 0;
|
|
|
|
}
|
|
|
|
.success-box {
|
|
|
|
width: 100%;
|
|
|
|
text-align: center;
|
|
|
|
padding: 50px 0 4px;
|
|
|
|
h3 {
|
|
|
|
margin-top: 30px;
|
|
|
|
font-weight: bold;
|
|
|
|
margin-bottom: 24px;
|
|
|
|
}
|
|
|
|
h3,
|
|
|
|
span {
|
|
|
|
color: #ff4919;
|
|
|
|
}
|
|
|
|
p {
|
|
|
|
margin: auto;
|
|
|
|
font-size: 14px;
|
|
|
|
text-align: left;
|
|
|
|
color: #1d2d3d;
|
|
|
|
width: 50%;
|
|
|
|
white-space: nowrap;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
:deep(.step-box) {
|
|
|
|
width: 80%;
|
|
|
|
display: flex;
|
|
|
|
justify-content: flex-end;
|
|
|
|
|
|
|
|
// margin-right: 50px;
|
|
|
|
position: relative;
|
|
|
|
left: 20px;
|
|
|
|
button {
|
|
|
|
margin-left: 16px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
:deep(.ant-steps-item-title::after) {
|
|
|
|
background: transparent !important;
|
|
|
|
border-top-width: 1px;
|
|
|
|
border-top-style: dashed;
|
|
|
|
border-top-color: #ecedef;
|
|
|
|
}
|
|
|
|
:deep(
|
|
|
|
.ant-steps-item-process
|
|
|
|
> .ant-steps-item-container
|
|
|
|
> .ant-steps-item-content
|
|
|
|
> .ant-steps-item-title::after
|
|
|
|
) {
|
|
|
|
border-top-color: #ff4919;
|
|
|
|
}
|
|
|
|
|
|
|
|
:deep(.ant-layout-header) {
|
|
|
|
max-height: 64px !important;
|
|
|
|
min-height: 64px !important;
|
|
|
|
}
|
|
|
|
|
|
|
|
:deep(.ant-layout-footer) {
|
|
|
|
max-height: 64px !important;
|
|
|
|
min-height: 64px !important;
|
|
|
|
height: 64px !important;
|
|
|
|
}
|
|
|
|
.home_header {
|
|
|
|
height: 64px;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
// img {
|
|
|
|
// height: 32px !important;
|
|
|
|
// width: 220px !important;
|
|
|
|
// transform: translateY(0px) translateX(0px);
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
:deep(.ant-layout) {
|
|
|
|
height: 100%;
|
|
|
|
width: 100%;
|
|
|
|
}
|
|
|
|
</style>
|