新增评卷地点字段,优化教师账号添加逻辑

This commit is contained in:
Xubx 2025-05-23 16:03:50 +08:00
parent d3594e1546
commit 760d4f08c5
2 changed files with 168 additions and 9 deletions

View File

@ -33,6 +33,12 @@ export const columns: BasicColumn[] = [
// return '加载失败';
// });
//},
},
{
title: '评卷地点',
align: "center",
dataIndex: 'markingLocation',
width: 200
}
// {
// title: '专业id',
@ -63,6 +69,11 @@ export const searchFormSchema: FormSchema[] = [
ifShow: ({ values }) => {
return hasPermission('group:majorId:select');
},
},
{
label: '评卷地点',
field: 'markingLocation',
component: 'Input',
}
];
//表单数据
@ -97,6 +108,11 @@ export const formSchema: FormSchema[] = [
show: ({ values }) => {
return hasPermission('majorId:edit');
}
},
{
label: '评卷地点',
field: 'markingLocation',
component: 'Input',
},
// TODO 主键隐藏字段目前写死为ID
{

View File

@ -15,6 +15,132 @@ export const updateGroupOptions = reactive({
},
});
// 计算年龄的函数
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 || '';
}
// 获取性别
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 0; // 男
} else {
return 1; // 女
}
}
return '';
}
// 校验出生日期是否合理
function validateBirthday(year: number, month: number, day: number) {
const nowTime = new Date().getTime();
const birthTime = new Date(`${year}-${month}-${day}`).getTime();
if (birthTime > nowTime) {
return false;
}
const nowYear = new Date().getFullYear();
if (nowYear - year > 150) {
return false;
}
if (month < 1 || month > 12) {
return false;
}
const date = new Date(year, month, 0);
if (day < 1 || day > date.getDate()) {
return false;
}
return true;
}
// 身份证验证函数
function validateIdCard(value: string) {
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)) {
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))]) {
return false;
}
// 3.校验出生日期
if (psidno.length === 15) {
const reg = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
const arrSplit = psidno.match(reg);
if (!arrSplit) {
return false;
}
const year = Number(arrSplit[2].charAt(0)) > 0 ? '19' + arrSplit[2] : '20' + arrSplit[2];
const month = arrSplit[3];
const day = arrSplit[4];
if (!validateBirthday(Number(year), Number(month), Number(day))) {
return false;
}
} else if (psidno.length === 18) {
const reg = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
const arrSplit = psidno.match(reg);
if (!arrSplit) {
return false;
}
const year = arrSplit[2];
const month = arrSplit[3];
const day = arrSplit[4];
if (!validateBirthday(Number(year), Number(month), Number(day))) {
return false;
}
} else {
return false;
}
// 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]) {
return false;
}
}
return true;
}
//列表数据
export const columns: BasicColumn[] = [
{
@ -116,14 +242,14 @@ export const searchFormSchema: FormSchema[] = [
];
//表单数据
export const formSchema: FormSchema[] = [
{
label: '用户ID',
field: 'userId',
component: 'Input',
dynamicRules: ({ model, schema }) => {
return [{ required: true, message: '请输入用户ID!' }];
},
},
// {
// label: '用户ID',
// field: 'userId',
// component: 'Input',
// dynamicRules: ({ model, schema }) => {
// return [{ required: true, message: '请输入用户ID!' }];
// },
// },
{
label: '姓名',
field: 'userName',
@ -137,13 +263,29 @@ export const formSchema: FormSchema[] = [
field: 'identityId',
component: 'Input',
dynamicRules: ({ model, schema }) => {
return [{ required: true, message: '请输入身份证!' }];
return [
{ required: true, message: '请输入身份证!' },
{
validator: (rule, value) => {
if (!value) return Promise.resolve();
if (!validateIdCard(value)) {
return Promise.reject('请输入正确的身份证号码!');
}
// 自动填入年龄和性别
const birthday = value.substring(6, 10) + '-' + value.substring(10, 12) + '-' + value.substring(12, 14);
model.age = calculateAge(birthday);
model.sex = getSex(value);
return Promise.resolve();
},
},
];
},
},
{
label: '年龄',
field: 'age',
component: 'InputNumber',
dynamicDisabled: true,
},
{
label: '性别',
@ -155,6 +297,7 @@ export const formSchema: FormSchema[] = [
{ label: '女', value: 1 },
],
},
dynamicDisabled: true,
},
{
label: '学科',