<!-- @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="vertical" :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-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: 'originPassword', label: '原密码', component: 'NsInputPassword', componentProps: { autocomplete: 'new-password', placeholder: '请输入原密码', }, rules: [ { required: true, message: '原密码不能为空', trigger: 'blur', }, ], }, { field: 'password', 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.password) { 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.replace('/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>