Files
SaaS-lib/nervui-party-construction/src/view/login/register.vue

285 lines
7.8 KiB
Vue
Raw Normal View History

2024-05-15 17:29:42 +08:00
<!-- @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>