|
|
@@ -13,7 +13,9 @@ export function checkPhoneNumber(rule: any, value: any, callback: any) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// 自定义校验函数:检查是否全是空格或为空
|
|
|
+/**
|
|
|
+ * 自定义校验函数:检查是否全是空格或为空
|
|
|
+ */
|
|
|
export function validateNoEmptySpaces(rule: any, value: any, callback: any) {
|
|
|
// 如果值为空或者去空格后为空字符串,则报错
|
|
|
if (value === null || value === undefined || value.trim() === "") {
|
|
|
@@ -22,3 +24,420 @@ export function validateNoEmptySpaces(rule: any, value: any, callback: any) {
|
|
|
callback(); // 校验通过
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证正整数
|
|
|
+ * @param errorMessage - 错误提示信息,默认为"必须为正整数"
|
|
|
+ * @param options - 配置选项
|
|
|
+ * @param options.required - 是否必填,默认为true
|
|
|
+ * @param options.checkLeadingZero - 是否检查前导零,默认为true(用于字符串输入)
|
|
|
+ * @returns 验证函数
|
|
|
+ */
|
|
|
+export function validatePositiveInteger(
|
|
|
+ errorMessage: string = "必须为正整数",
|
|
|
+ options: { required?: boolean; checkLeadingZero?: boolean } = {}
|
|
|
+) {
|
|
|
+ const { required = true, checkLeadingZero = true } = options;
|
|
|
+
|
|
|
+ return (rule: any, value: any, callback: any) => {
|
|
|
+ // 检查是否为空
|
|
|
+ if (value === null || value === undefined || value === "") {
|
|
|
+ if (required) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 对于数字类型(如 el-input-number),直接验证数字
|
|
|
+ if (typeof value === "number") {
|
|
|
+ if (value <= 0 || !Number.isInteger(value)) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 转换为字符串进行检查
|
|
|
+ const strValue = value.toString().trim();
|
|
|
+ if (strValue === "") {
|
|
|
+ if (required) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否有前导零(除了单独的"0")
|
|
|
+ if (checkLeadingZero && strValue.length > 1 && strValue.startsWith("0")) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否为数字
|
|
|
+ const num = Number(strValue);
|
|
|
+ if (isNaN(num)) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否为正数
|
|
|
+ if (num <= 0) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否为整数
|
|
|
+ if (!Number.isInteger(num)) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ callback();
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证正数(可以是小数)
|
|
|
+ * @param errorMessage - 错误提示信息,默认为"必须为正数"
|
|
|
+ * @returns 验证函数
|
|
|
+ */
|
|
|
+export function validatePositiveNumber(errorMessage: string = "必须为正数") {
|
|
|
+ return (rule: any, value: any, callback: any) => {
|
|
|
+ if (!value || value.toString().trim() === "") {
|
|
|
+ callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const num = Number(value);
|
|
|
+ if (isNaN(num) || num <= 0) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证密码(6-16位,必须包含字母和数字)
|
|
|
+ */
|
|
|
+export function validatePassword(rule: any, value: string, callback: any) {
|
|
|
+ if (!value) {
|
|
|
+ callback(new Error("请输入密码"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (value.length < 6 || value.length > 16) {
|
|
|
+ callback(new Error("密码长度为6-16位,密码必须包含字母和数字"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!/^(?=.*[a-zA-Z])(?=.*\d).+$/.test(value)) {
|
|
|
+ callback(new Error("密码长度为6-16位,密码必须包含字母和数字"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证确认密码(两次输入的密码必须一致)
|
|
|
+ * @param originalPassword - 原始密码值或获取原始密码的函数
|
|
|
+ * @param errorMessage - 错误提示信息,默认为"两次输入的密码不一致"
|
|
|
+ * @returns 验证函数
|
|
|
+ */
|
|
|
+export function validateConfirmPassword(
|
|
|
+ originalPassword: string | (() => string),
|
|
|
+ errorMessage: string = "两次输入的密码不一致"
|
|
|
+) {
|
|
|
+ return (rule: any, value: string, callback: any) => {
|
|
|
+ if (!value) {
|
|
|
+ callback(new Error("请确认密码"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const original = typeof originalPassword === "function" ? originalPassword() : originalPassword;
|
|
|
+ if (value !== original) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证日期不能早于今天
|
|
|
+ * @param errorMessage - 错误提示信息,默认为"日期不能早于当前时间"
|
|
|
+ * @returns 验证函数
|
|
|
+ */
|
|
|
+export function validateDateNotBeforeToday(errorMessage: string = "日期不能早于当前时间") {
|
|
|
+ return (rule: any, value: any, callback: any) => {
|
|
|
+ if (!value) {
|
|
|
+ callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const selectedDate = new Date(value);
|
|
|
+ const today = new Date();
|
|
|
+ today.setHours(0, 0, 0, 0);
|
|
|
+ if (selectedDate < today) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证日期范围(开始时间必须早于结束时间)
|
|
|
+ * @param getStartDate - 获取开始日期的函数
|
|
|
+ * @param getEndDate - 获取结束日期的函数(可选,如果不提供则使用当前值作为结束日期)
|
|
|
+ * @param startErrorMessage - 开始日期错误提示,默认为"开始时间不能早于当前时间"
|
|
|
+ * @param endErrorMessage - 结束日期错误提示,默认为"结束时间不能早于当前时间"
|
|
|
+ * @param rangeErrorMessage - 日期范围错误提示,默认为"开始时间必须早于结束时间"
|
|
|
+ * @param checkToday - 是否检查不能早于今天,默认为true
|
|
|
+ * @returns 验证函数
|
|
|
+ */
|
|
|
+export function validateDateRange(
|
|
|
+ getStartDate: () => any,
|
|
|
+ getEndDate?: () => any,
|
|
|
+ startErrorMessage: string = "开始时间不能早于当前时间",
|
|
|
+ endErrorMessage: string = "结束时间不能早于当前时间",
|
|
|
+ rangeErrorMessage: string = "开始时间必须早于结束时间",
|
|
|
+ checkToday: boolean = true
|
|
|
+) {
|
|
|
+ return (rule: any, value: any, callback: any, isStartDate: boolean = true) => {
|
|
|
+ if (!value) {
|
|
|
+ callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const selectedDate = new Date(value);
|
|
|
+
|
|
|
+ // 验证不能早于今天
|
|
|
+ if (checkToday) {
|
|
|
+ const today = new Date();
|
|
|
+ today.setHours(0, 0, 0, 0);
|
|
|
+ if (selectedDate < today) {
|
|
|
+ callback(new Error(isStartDate ? startErrorMessage : endErrorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证日期范围
|
|
|
+ if (isStartDate && getEndDate) {
|
|
|
+ const endDate = getEndDate();
|
|
|
+ if (endDate) {
|
|
|
+ const end = new Date(endDate);
|
|
|
+ if (selectedDate >= end) {
|
|
|
+ callback(new Error(rangeErrorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (!isStartDate && getStartDate) {
|
|
|
+ const startDate = getStartDate();
|
|
|
+ if (startDate) {
|
|
|
+ const start = new Date(startDate);
|
|
|
+ if (selectedDate <= start) {
|
|
|
+ callback(new Error(rangeErrorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ callback();
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证正整数(简化版,用于库存、数量等字段,允许空值)
|
|
|
+ * @param errorMessage - 错误提示信息,默认为"必须为正整数"
|
|
|
+ * @returns 验证函数
|
|
|
+ * @deprecated 请使用 validatePositiveInteger(errorMessage, { required: false })
|
|
|
+ */
|
|
|
+export function validatePositiveIntegerOptional(errorMessage: string = "必须为正整数") {
|
|
|
+ return validatePositiveInteger(errorMessage, { required: false, checkLeadingZero: true });
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证日期范围(开始时间必须早于结束时间,且不能早于今天)
|
|
|
+ * @param getStartDate - 获取开始日期的函数
|
|
|
+ * @param getEndDate - 获取结束日期的函数(可选,如果不提供则使用当前值作为结束日期)
|
|
|
+ * @param startErrorMessage - 开始日期错误提示,默认为"开始时间不能早于当前时间"
|
|
|
+ * @param endErrorMessage - 结束日期错误提示,默认为"结束时间不能早于当前时间"
|
|
|
+ * @param rangeErrorMessage - 日期范围错误提示,默认为"开始时间必须早于结束时间"
|
|
|
+ * @returns 验证函数
|
|
|
+ * @deprecated 请使用 validateDateRange(..., true) 或 validateDateRange(..., checkToday: true)
|
|
|
+ */
|
|
|
+export function validateDateRangeWithToday(
|
|
|
+ getStartDate: () => any,
|
|
|
+ getEndDate?: () => any,
|
|
|
+ startErrorMessage: string = "开始时间不能早于当前时间",
|
|
|
+ endErrorMessage: string = "结束时间不能早于当前时间",
|
|
|
+ rangeErrorMessage: string = "开始时间必须早于结束时间"
|
|
|
+) {
|
|
|
+ return validateDateRange(getStartDate, getEndDate, startErrorMessage, endErrorMessage, rangeErrorMessage, true);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证日期范围数组(每个日期范围的开始时间必须早于结束时间)
|
|
|
+ * @param errorMessage - 错误提示信息,默认为"开始时间必须早于结束时间"
|
|
|
+ * @param checkToday - 是否检查不能早于今天,默认为false
|
|
|
+ * @param todayErrorMessage - 今天错误提示,默认为"时间不能早于当前时间"
|
|
|
+ * @returns 验证函数
|
|
|
+ */
|
|
|
+export function validateDateRangeArray(
|
|
|
+ errorMessage: string = "开始时间必须早于结束时间",
|
|
|
+ checkToday: boolean = false,
|
|
|
+ todayErrorMessage: string = "时间不能早于当前时间"
|
|
|
+) {
|
|
|
+ return (rule: any, value: any, callback: any) => {
|
|
|
+ if (!value || value.length === 0) {
|
|
|
+ callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!Array.isArray(value) || value.length !== 2) {
|
|
|
+ callback(new Error("请选择完整的日期范围"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const startDate = new Date(value[0]);
|
|
|
+ const endDate = new Date(value[1]);
|
|
|
+
|
|
|
+ // 验证不能早于今天
|
|
|
+ if (checkToday) {
|
|
|
+ const today = new Date();
|
|
|
+ today.setHours(0, 0, 0, 0);
|
|
|
+ if (startDate < today) {
|
|
|
+ callback(new Error("开始" + todayErrorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (endDate < today) {
|
|
|
+ callback(new Error("结束" + todayErrorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证开始时间必须早于结束时间
|
|
|
+ if (startDate >= endDate) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证日期范围数组(带今天检查)
|
|
|
+ * @param checkToday - 是否检查不能早于今天,默认为true
|
|
|
+ * @param rangeErrorMessage - 日期范围错误提示,默认为"开始时间必须早于结束时间"
|
|
|
+ * @param todayErrorMessage - 今天错误提示,默认为"时间不能早于当前时间"
|
|
|
+ * @returns 验证函数
|
|
|
+ * @deprecated 请使用 validateDateRangeArray(rangeErrorMessage, checkToday, todayErrorMessage)
|
|
|
+ */
|
|
|
+export function validateDateRangeArrayWithToday(
|
|
|
+ checkToday: boolean = true,
|
|
|
+ rangeErrorMessage: string = "开始时间必须早于结束时间",
|
|
|
+ todayErrorMessage: string = "时间不能早于当前时间"
|
|
|
+) {
|
|
|
+ return validateDateRangeArray(rangeErrorMessage, checkToday, todayErrorMessage);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 条件必填验证(根据某个条件判断是否必填)
|
|
|
+ * @param condition - 判断条件的函数,返回true表示必填
|
|
|
+ * @param errorMessage - 错误提示信息
|
|
|
+ * @returns 验证函数
|
|
|
+ */
|
|
|
+export function validateConditionalRequired(condition: () => boolean, errorMessage: string) {
|
|
|
+ return (rule: any, value: any, callback: any) => {
|
|
|
+ if (condition()) {
|
|
|
+ if (!value || (Array.isArray(value) && value.length === 0) || (typeof value === "string" && value.trim() === "")) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证数组最小长度
|
|
|
+ * @param minLength - 最小长度
|
|
|
+ * @param errorMessage - 错误提示信息
|
|
|
+ * @returns 验证函数
|
|
|
+ */
|
|
|
+export function validateArrayMinLength(minLength: number, errorMessage: string) {
|
|
|
+ return (rule: any, value: any, callback: any) => {
|
|
|
+ if (!value || !Array.isArray(value) || value.length < minLength) {
|
|
|
+ callback(new Error(errorMessage));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证日期数组列表(每个日期项的开始时间必须早于结束时间)
|
|
|
+ * @param getDateList - 获取日期列表的函数
|
|
|
+ * @param itemErrorMessage - 单个日期项错误提示,默认为"日期项未完整填写"
|
|
|
+ * @param rangeErrorMessage - 日期范围错误提示,默认为"开始时间必须早于结束时间"
|
|
|
+ * @param checkToday - 是否检查不能早于今天,默认为false
|
|
|
+ * @returns 验证函数
|
|
|
+ */
|
|
|
+export function validateDateListArray(
|
|
|
+ getDateList: () => any[],
|
|
|
+ itemErrorMessage: string = "日期项未完整填写",
|
|
|
+ rangeErrorMessage: string = "开始时间必须早于结束时间",
|
|
|
+ checkToday: boolean = false
|
|
|
+) {
|
|
|
+ return (rule: any, value: any, callback: any) => {
|
|
|
+ const dateList = getDateList();
|
|
|
+ if (!dateList || dateList.length === 0) {
|
|
|
+ callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const today = new Date();
|
|
|
+ today.setHours(0, 0, 0, 0);
|
|
|
+
|
|
|
+ for (let i = 0; i < dateList.length; i++) {
|
|
|
+ const dateItem = dateList[i];
|
|
|
+ if (!dateItem || !Array.isArray(dateItem) || dateItem.length !== 2) {
|
|
|
+ callback(new Error(`第${i + 1}个${itemErrorMessage}`));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const startDate = new Date(dateItem[0]);
|
|
|
+ const endDate = new Date(dateItem[1]);
|
|
|
+
|
|
|
+ // 验证不能早于今天
|
|
|
+ if (checkToday) {
|
|
|
+ if (startDate < today) {
|
|
|
+ callback(new Error(`第${i + 1}个日期项的开始时间不能早于当前时间`));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (endDate < today) {
|
|
|
+ callback(new Error(`第${i + 1}个日期项的结束时间不能早于当前时间`));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证开始时间必须早于结束时间
|
|
|
+ if (startDate >= endDate) {
|
|
|
+ callback(new Error(`第${i + 1}个日期项的${rangeErrorMessage}`));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ callback();
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 验证正整数(用于 el-input-number,value 已经是数字类型)
|
|
|
+ * @param errorMessage - 错误提示信息,默认为"必须为正整数"
|
|
|
+ * @returns 验证函数
|
|
|
+ * @deprecated 请使用 validatePositiveInteger(errorMessage, { required: false, checkLeadingZero: false })
|
|
|
+ */
|
|
|
+export function validatePositiveIntegerForNumber(errorMessage: string = "必须为正整数") {
|
|
|
+ return validatePositiveInteger(errorMessage, { required: false, checkLeadingZero: false });
|
|
|
+}
|