TypeScript代码片段
# 对象数据校验的封装
灵感来源:Element-Plus 当时感觉这个东西在前端校验代码时挺好用的,可以减少很大一部分的代码冗余 自己来后端也试着封装了一个
主要代码部分
typescript
/*
* @Author: 芝士雪豹
* @Date: 2023-12-05 10:55:50
* @LastEditors: your name
* @LastEditTime: 2023-12-20 21:06:35
* @Description:
* @FilePath: /robot-server-ts/src/uitls/verifyRules.ts
*/
import { Rule } from "../interface/rules";
function objectIsEmpty(obj: any): boolean {
for (const key in obj) {
if (!obj[key]) return true;
}
return false;
}
function getValues(obj: any, keys: string) {
return obj[keys];
}
/**
* 用户信息校验
* @param data 要校验的数据
* @param rules 校验规则
* @returns 是否满足规则
*/
function userRules<T>(obj: T|null, rules: Rule[],custom?:Function): boolean {
let isPass: boolean = true;
for (let index = 0; index < rules.length; index++) {
const item = rules[index];
// 获取规则对应的属性名
const data = getValues(obj, item.name);
if (!data && item.require) {
return false
};
// 非空验证
if (item.require && !data && data!=undefined) {
return isPass = false;
};
// 校验最大长度
if (item.maxLength && data.length > item.maxLength && data!=undefined) return isPass = false;
// 校验最小长度
if (item.minLength && data.length < item.minLength && data!=undefined) return isPass = false;
// 特殊字符正则
const specialCharReg = /^[\u4e00-\u9fa5A-Za-z0-9_-]+[\))(,;\(\.\%。\u4e00-\u9fa5A-Za-z0-9_-]?$/;
// 校验是否包含特殊字符
if (item.noSpecialChar && !specialCharReg.test(data) && data!=undefined ) return isPass = false;
// 匹配中文字符的正则表达式
const chineseReg = /[\u4e00-\u9fa5]/g;
if (item.noChinese && chineseReg.test(data) && data!=undefined) return isPass = false;
// 手机号校验
const telReg = /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1589]))\d{8}$/
if(item.isTel && !telReg.test(data) && data!=undefined){
console.log('手机号校验');
return isPass = false;
}
// 邮箱校验
const emailReg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
if(item.isEmail && !emailReg.test(data) && data!=undefined){
console.log('邮箱校验');
return isPass = false;
}
}
if(custom) {
const customRetrun = custom(obj);
if(customRetrun == false) return isPass =false;
}
return isPass;
}
export default userRules;
Rule类型
typescript
/*
* @Author: 芝士雪豹
* @Date: 2023-12-05 18:26:07
* @LastEditors: your name
* @LastEditTime: 2023-12-20 21:04:15
* @Description:
* @FilePath: /robot-server-ts/src/interface/rules.ts
*/
/**
* @description: 校验规则
*/
export interface Rule {
/**
* 字段名称
*/
name:string,
/**
* 是否不能为空
*/
require:boolean,
/**
* 最大长度
*/
maxLength?:number,
/**
* 最小长度
*/
minLength?:number,
/**
* 不包含特殊字符
*/
noSpecialChar?:boolean,
/**
* 不包含中文
*/
noChinese?:boolean,
/**
* 手机号
*/
isTel?:boolean;
/**
* 邮箱
*/
isEmail?:boolean;
}
基础使用方法
typescript
const command: RobotCommand = context.request.body as RobotCommand;
const vertify = userRules<RobotCommand>(command, [
{ name: 'name', require: true },
{ name: 'selKey', require: true },
{ name: 'type', require: true },
{ name: 'command', require: true }
])
if (!vertify) return fail<string>(context, '操作失败!', '数据缺失');
自定义校验
使用custom 方法进行自定义校验
typescript
const user:UserRegister = context.request.body as UserRegister
// 数据校验
const vertify:boolean = userRules<UserRegister>(user, userRegisterRules,(obj:UserRegister)=>{
if(!obj.email && !obj.phone) return false
})
if(!vertify) return fail<null>(context,'注册失败',null);