285 lines
7.8 KiB
Vue
285 lines
7.8 KiB
Vue
<!-- @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>
|