Files
SaaS-lib/nervui-party-construction/src/view/login/register.vue
xuziqiang d0155dbe3c push
2024-05-15 17:29:42 +08:00

285 lines
7.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- @format -->
<template>
<div style="height: 100%">
<a-layout style="height: 100%">
<a-layout-content class="center-content">
<div class="lg_card">
<a-page-header style="border: 1px solid rgb(235, 237, 240)" @back="$router.back()">
<template #backIcon>
<div class="back_icon"><left-outlined style="font-size: 20px" /><h1>返回</h1></div>
</template>
<template #title>
<h1 class="lg_card_title">注册党建知识答题平台</h1>
</template>
</a-page-header>
<ns-form
:labelWrap="true"
style="margin: 32px auto 0; width: 50%"
ref="mainRef"
formLayout="vertical"
:schemas="formSchema"
:model="data"
v-bind="$attrs" />
<a-button
@click="submit"
:loading="loading"
:disabled="!mainRef?.validateResult"
type="primary"
style="
width: 420px;
height: 52px;
border-radius: 4px;
position: absolute;
left: 50%;
transform: translateX(-50%);
"
>注册</a-button
>
<div class="login_link" @click="$router.push({ name: 'login' })">
登录已有账号<right-outlined style="font-size: 14px" />
</div>
</div>
<div class="footer">Copyright 2021 鼎云科技 All Rights Reserved</div>
</a-layout-content>
</a-layout>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, watch } from 'vue';
import { LeftOutlined, RightOutlined } from '@ant-design/icons-vue';
import { useRouter } from 'vue-router';
import { NsMessage } from '/nerv-lib/component/message';
import { http } from '/nerv-lib/util/http';
import { router } from '/nerv-lib/saas/router';
export default defineComponent({
name: 'UserRegister',
components: {
LeftOutlined,
RightOutlined,
},
setup() {
const mainRef = ref();
let data = ref({});
let loading = ref(false);
watch(
() => data.value.password,
() => {
if (data.value.confirmPassword) mainRef.value.formElRef.validateFields('confirmPassword');
},
{ deep: true },
);
let formSchema = ref([
{
field: 'telNum',
},
{
label: '手机号码',
field: 'accountName',
component: 'NsInput',
componentProps: {
placeholder: '请输入手机号作为登录账号',
},
rules: [
{
required: true,
validator: async (rule, value) => {
data.value.telNum = value;
if (!value) return Promise.reject('请输入手机号码');
if (!/^[1][3456789][\d]{9}$/.test(value))
return Promise.reject('请输入正确的手机号码');
},
},
],
},
{
label: '学员姓名',
field: 'userName',
component: 'NsInput',
componentProps: {
placeholder: '请输入真实姓名',
},
rules: [
{
required: true,
validator: async (rule, value) => {
const _reg = /^[^\x00-\xff]$/;
if (!value) return Promise.reject('请输入真实姓名');
if (value.includes(' ')) return Promise.reject('不支持空格');
if (value) {
let strLength = 0;
let strArray = value.split('');
strArray.forEach((item) => {
if (_reg.test(item)) {
strLength += 2;
} else {
strLength += 1;
}
});
if (strLength > 32) {
return Promise.reject('不支持空格长度不得超过32个字符中文占两个字符');
}
}
},
},
],
},
{
label: '用户密码',
field: 'password',
component: 'NsInputPassword',
componentProps: {
placeholder: '请输入登录密码密码6~18位支持字母、数字、特殊字符!@#$%^&*',
},
rules: [
{
required: true,
validator: async (rule, value) => {
let reg = /^[0-9a-zA-Z!@#$%^&*]{6,18}$/;
if (!value) return Promise.reject('请输入登录密码');
if (!reg.test(value))
return Promise.reject('支持数字、字母、特殊字符!@#$%^&*6~18位字符');
},
},
],
},
{
label: '确认密码',
field: 'confirmPassword',
component: 'NsInputPassword',
componentProps: {
placeholder: '请再次输入密码',
},
rules: [
{
required: true,
validator: async (rule, value) => {
if (value !== data.value.password) return Promise.reject('两次密码输入不一致');
},
},
],
},
]);
const submit = () => {
loading.value = true;
mainRef.value
.triggerSubmit()
.then((data) => {
http
.post('/api/exam_op/objs/admin/WorkUser/register', data)
.then((res) => {
loading.value = false;
NsMessage.success('注册成功', 1, () => {
router.push({ path: '/login' });
});
})
.catch((err) => {
loading.value = false;
});
})
.catch((err) => {
loading.value = false;
});
};
return {
data,
formSchema,
mainRef,
submit,
loading,
};
},
});
</script>
<style lang="less" scoped>
:deep(.center-content) {
background: url('./img/background.png') center center no-repeat;
background-size: cover;
// background-position-y: -120px;
margin: 0;
}
.ant-layout-content {
height: calc(100vh - 112px);
width: 100%;
min-height: 400px;
}
.lg_card {
width: 1200px;
height: 560px;
position: absolute;
left: 50%;
top: 23%;
transform: translateX(-50%);
background: #ffffff;
border: 1px solid rgba(0, 0, 0, 0.06);
}
.ant-page-header {
border: none !important;
border-bottom: 1px solid rgb(235, 237, 240) !important;
height: 84px;
}
.back_icon {
display: flex;
align-items: center;
h1 {
margin: 0;
font-weight: 400;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
}
}
.lg_card_title {
font-family: 'PingFang SC';
font-style: normal;
font-weight: 400;
font-size: 32px;
line-height: 36px;
text-align: center;
color: #172e3d;
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: 8px;
}
:deep(.ant-page-header-heading) {
height: 100%;
align-items: center;
}
.login_link {
cursor: pointer;
display: flex;
align-items: center;
border-radius: 4px;
position: absolute;
bottom: 32px;
left: 50%;
transform: translateX(-50%);
&:hover {
color: #c50001;
}
}
.footer {
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: 48px;
color: rgba(0, 0, 0, 0.4);
font-family: 'PingFang';
font-style: normal;
font-weight: 400;
font-size: 14px;
}
:deep(.ant-input-affix-wrapper) {
height: 52px;
}
:deep(.ant-form-item-label-wrap) {
line-height: 52px;
}
:deep(.ant-col-6) {
flex: 0 0 20%;
}
</style>