CEES-H5-New/src/views/waiTeacher.vue

494 lines
15 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.

<template>
<div class="father">
<!--<van-cell-group inset class="mar-auto15">
<van-field class="van-field__label_rectangle" label-width="400px" label="哈尔滨师范大学评卷信息填报" type="hidden" />
</van-cell-group>-->
<van-form @submit="onSubmit">
<div class="head-cg">
<img src="@/assets/Ui/信息/个人信息/个人信息.svg" />
</div>
<van-cell-group inset style="background-color: transparent;">
<van-field
v-model="notLocalTeacher.userName"
name="userName"
label="姓名"
type="text"
placeholder="请输入姓名"
:rules="[{ validator: userName, message: '请正确输入姓名' }]"
>
<template #left-icon>
<img
src= "@/assets/Ui/信息/个人信息/图标/姓名.svg"
style="width: 16px; height: 16px;"
/>
</template>
</van-field>
<van-field
v-model="notLocalTeacher.identityId"
name="userCardId"
label="身份证号"
type="text"
placeholder="请输入身份证号"
:rules="[{ validator: userCardId, message: '请输入身份证号' }]"
>
<template #left-icon>
<img
src= "@/assets/Ui/信息/个人信息/图标/身份证号.svg"
style="width: 16px; height: 16px;"
/>
</template>
</van-field>
<van-field v-model="notLocalTeacher.sex" readonly name="picker" label="性别">
<template #left-icon>
<img
src= "@/assets/Ui/信息/个人信息/图标/性别.svg"
style="width: 16px; height: 16px;"
/>
</template>
</van-field>
<van-field readonly v-model="notLocalTeacher.age" name="age" label="年龄" type="text">
<template #left-icon>
<img
src= "@/assets/Ui/信息/个人信息/图标/年龄.svg"
style="width: 16px; height: 16px;"
/>
</template>
</van-field>
<!-- <van-field-->
<!-- v-model="notLocalTeacher.identityId"-->
<!-- name="userCardId"-->
<!-- label="身份证号"-->
<!-- type="text"-->
<!-- placeholder="请输入身份证号"-->
<!-- :rules="[{ validator:userCardId, message: '请输入身份证号' }]"-->
<!-- />-->
<van-field
v-model="notLocalTeacher.phone"
name="phone"
label="手机号"
type="number"
placeholder="请输入手机号"
:rules="[{ validator: phoneNum, message: '请输入手机号' }]"
>
<template #left-icon>
<img
src= "@/assets/Ui/信息/个人信息/图标/手机号.svg"
style="width: 16px; height: 16px;"
/>
</template>
</van-field>
<van-field
v-model="notLocalTeacher.jobTitle"
is-link
readonly
name="picker"
label="职称"
placeholder="点击选择职称"
@click="showPicker = true"
:rules="[{ required: true, message: '请选择职称' }]"
>
<template #left-icon>
<img
src= "@/assets/Ui/信息/个人信息/图标/职称.svg"
style="width: 16px; height: 16px;"
/>
</template>
</van-field>
<van-popup v-model:show="showPicker" position="bottom">
<van-picker :columns="columns" @confirm="onConfirm" @cancel="showPicker = false" />
</van-popup>
<van-field
v-model="notLocalTeacher.office"
name="office"
label="职务"
type="text"
placeholder="请输入职务(如教师,教务主任)"
:rules="[{ required: true, message: '请输入职务' }]"
>
<template #left-icon>
<img
src= "@/assets/Ui/信息/个人信息/图标/职务.svg"
style="width: 16px; height: 16px;"
/>
</template>
</van-field>
</van-cell-group>
<div class="head-cg">
<img src="@/assets/Ui/信息/个人信息/工作单位.svg" />
</div>
<van-cell-group inset class="mar-auto15" style="background-color: transparent;">
<!--<van-field class="van-field__label1——circle" label-width="400px" label="工作单位" type="hidden" />-->
<van-field
v-model="notLocalTeacher.workName"
name="workName"
label="单位名称"
type="text"
placeholder="请输入单位名称"
:rules="[{ required: true, message: '请输入单位名称' }]"
>
<template #left-icon>
<img
src= "@/assets/Ui/信息/个人信息/图标/单位名称.svg"
style="width: 16px; height: 16px;"
/>
</template>
</van-field>
<van-field v-model="notLocalTeacher.workPhone" name="workPhoen" label="单位电话" type="text" placeholder="电话/固定电话(选填)" >
<template #left-icon>
<img
src= "@/assets/Ui/信息/个人信息/图标/单位电话.svg"
style="width: 16px; height: 16px;"
/>
</template>
</van-field>
</van-cell-group>
<div style="margin: 16px">
<!--<van-button style="background-color: #8d2328; border: none; font-weight: 600" round block type="primary" native-type="submit">-->
<!--下一步
</van-button>-->
<button style="background-color: transparent; width: 100%; border: none; display: flex; justify-content: flex-end;" native-type="submit">
<img
src="@/assets/Ui/信息/个人信息/下一页.svg"
style="width: 35%; "
alt="下一步">
</button>
</div>
</van-form>
</div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref } from 'vue';
import { useRouter } from 'vue-router';
import { useUserStore } from '@/store';
const router = useRouter();
const store = useUserStore();
let notLocalTeacher = reactive({
userName: '',
phone: '',
sex: '',
age: '',
identityId: '',
jobTitle: '',
office: '',
workName: '',
workPhone: '',
openId: store.getOpenId,
userId: store.getUserId,
});
const showPicker = ref(false);
const showSex = ref(false);
const columns = [
{ text: '正高级教师', value: 'Hangzhou' },
{ text: '高级教师', value: 'Ningbo' },
{ text: '一级教师', value: 'Wenzhou' },
{ text: '二级教师', value: 'Shaoxing' },
];
// 校验表单
const userName = (value: any) => {
const reg = /^.{2,12}$/;
return reg.test(value);
};
const jobTitleTest = (value: any) => {
if (value.length > 0) {
return false;
}
return true;
};
// 身份证验证
// const userCardId = (value: any) => {
// const reg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
// let birthday = value.substring(6, 10) + "-" + value.substring(10, 12) + "-" + value.substring(12, 14)
// let age = calculateAge(birthday);
// notLocalTeacher.age=age
// notLocalTeacher.sex=getSex(value)
// return reg.test(value);
// };
// 计算年龄的函数
function calculateAge(birthday: string) {
const today = new Date();
const birthDate = new Date(birthday);
let age = today.getFullYear() - birthDate.getFullYear();
const monthDiff = today.getMonth() - birthDate.getMonth();
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
return age || '';
}
/**
* @description : 校验身份证号是否合规18位、15位
* @param {String|Number} value
* @return {Boolean} true-合规 false-不合规
*/
function userCardId(value) {
let psidno = String(value);
psidno = psidno.toUpperCase();
// 1.校验身份证号格式和长度
const regPsidno =
/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[X])$)$/;
if (!regPsidno.test(psidno)) {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
// 2.校验前两位的省份编码是否正确
const province = {
11: '北京',
12: '天津',
13: '河北',
14: '山西',
15: '内蒙古',
21: '辽宁',
22: '吉林',
23: '黑龙江 ',
31: '上海',
32: '江苏',
33: '浙江',
34: '安徽',
35: '福建',
36: '江西',
37: '山东',
41: '河南',
42: '湖北 ',
43: '湖南',
44: '广东',
45: '广西',
46: '海南',
50: '重庆',
51: '四川',
52: '贵州',
53: '云南',
54: '西藏 ',
61: '陕西',
62: '甘肃',
63: '青海',
64: '宁夏',
65: '新疆',
71: '台湾',
81: '香港',
82: '澳门',
91: '国外',
};
if (!province[Number(psidno.slice(0, 2))]) {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
// 3.校验出生日期
if (psidno.length === 15) {
// 15位号码 省2位2位2位2位2位2位校验码3位
const reg = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
const arrSplit = psidno.match(reg);
// 15位号码在年份前补 19 或 20
const year = Number(arrSplit[2].charAt(0)) > 0 ? '19' + arrSplit[2] : '20' + arrSplit[2];
const month = arrSplit[3];
const day = arrSplit[4];
if (!validateBirthday(year, month, day)) {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
} else if (psidno.length === 18) {
// 18位号码 省2位2位2位4位2位2位校验码4位
const reg = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
const arrSplit = psidno.match(reg);
const year = arrSplit[2];
const month = arrSplit[3];
const day = arrSplit[4];
if (!validateBirthday(year, month, day)) {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
} else {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
// 校验出生日期是否合理
function validateBirthday(year, month, day) {
year = Number(year); // 年
month = Number(month); // 月
day = Number(day); // 日
const nowTime = new Date().getTime(); // 当前时间戳
const birthTime = new Date(`${year}-${month}-${day}`).getTime(); // 获取出生日期的时间戳
// 不能是明天出生的吧
if (birthTime > nowTime) {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
// 一般人活不到150岁吧
const nowYear = new Date().getFullYear();
if (nowYear - year > 150) {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
// 不能是13月出生的吧
if (month < 1 || month > 12) {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
// 不能是2月30号、4月31号、5月32号出生的吧
const date = new Date(year, month, 0); // 获取当月的最后一天
if (day < 1 || day > date.getDate()) {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
return true;
}
// 4.18位号码校验生成的校验码
if (psidno.length === 18) {
const Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 加权因子
const parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; // 校验码
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += Number(psidno.charAt(i)) * Wi[i];
}
if (parity[sum % 11] !== psidno[17]) {
notLocalTeacher.age = '';
notLocalTeacher.sex = '';
return false;
}
}
let birthday = value.substring(6, 10) + '-' + value.substring(10, 12) + '-' + value.substring(12, 14);
let age = calculateAge(birthday);
notLocalTeacher.age = age;
notLocalTeacher.sex = getSex(value);
return true;
}
// 获取性别
function getSex(value: string) {
if (value.length < 17) {
return '';
}
let sex = value.substr(16, 1);
if (sex !== '' || sex !== undefined) {
if (parseInt(sex) % 2 == 1) {
return '男';
} else {
return '女';
}
}
}
const phoneNum = (value: string) => {
const reg = /^.{11}$/;
return reg.test(value);
};
const onConfirm = ({ selectedOptions }) => {
notLocalTeacher.jobTitle = selectedOptions[0]?.text;
showPicker.value = false;
};
const onConfirmSex = ({ selectedOptions }) => {
notLocalTeacher.sex = selectedOptions[0]?.text;
showSex.value = false;
};
const onSubmit = (values: object) => {
console.log('submit', values);
localStorage.setItem('notLocalTeacher', JSON.stringify(notLocalTeacher));
router.push('/waiTeacherTwo');
};
//
// eslint-disable-next-line no-undef
onMounted(() => {
// console.log("组件挂在了")
const notLocalTeacherStr = localStorage.getItem('notLocalTeacher');
if (notLocalTeacherStr == null) {
// console.log("数据空")
} else {
const storedData = JSON.parse(notLocalTeacherStr);
Object.assign(notLocalTeacher, storedData);
console.log(notLocalTeacher);
}
});
</script>
<style scoped lang="scss">
.father {
height: 100vh;
background-color: #efefef;
padding-top: 20px;
background-image: url('@/assets/Ui/信息/个人信息/背景.svg');
background-repeat: no-repeat;
background-size: cover; /* 修改这里 */
}
.mar-auto15 {
margin: 15px 30px;
}
.van-field__label_rectangle {
position: relative;
font-size: 1rem; /* 调整为您所需的字体大小 */
}
.van-field__label1circle {
position: relative;
font-size: 1rem; /* 调整为您所需的字体大小 */
}
.van-field__label_rectangle:before {
content: '';
position: absolute;
top: 30%;
left: 5px;
display: inline-block;
height: 20px;
width: 5px;
background-color: #8d2328;
border-radius: 8px;
}
.van-field__label1circle:before {
content: '';
position: absolute;
top: 50%;
left: 5px;
display: inline-block;
height: 5px;
width: 5px;
background-color: #8d2328;
border-radius: 50%;
}
.head-cg {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
img {
width: 50%;
margin-top: 5vh;
margin-bottom: 2vh;
}
}
</style>