如何封装一个自定义错误规则校验

GoFrame——数据校验库之结构体校验 GoFrame——数据校验之结构体校验 GoFrame中gvalid模块实现了非常强大的数据校验功能,内置了40种常用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验、自定义校验规则注册、支持struct tag规则及提示信息绑定等特性,是目前功能最强大的Go数据校验模块。 目前我是使用gin来做路由部分,gin框架可以使用github.com/go-playground/validator进行参数校验,目前已经支持github.com/go-playground/va 阅读详情

如何实现一个自定义的校验规则,当你需要使用form的样式但是不想使用form的校验时,可以自定义一个错误校验

核心代码

Index

import './index.less'
export { default as VForm } from './component/VForm'
export { default as VItem } from './component/VItem'
export { default as VButton } from './component/VButton'

less文件

// 样式根据使用的组件库 自己调整下
@inputErrorBoderColor: #ef5b33, #88333e;
.v-item-wrap {
    position: relative;
    .v-item-message {
        color: @error-color;
        line-height: 20px;
        position: absolute;
        word-break: keep-all;
        white-space: nowrap;
    }
    &.v-error {
        .ant-input,
        .ant-input-number,
        .ant-input-affix-wrapper:hover .ant-input {
            border-color: @error-color !important;
        }
        .ant-select {
            .ant-select-selection {
                border-color: @inputErrorBoderColor;
            }
        }
    }
}

VForm


import PropTypes from 'prop-types'
import React, { Component, Children } from 'react'
import Validator from '../core/validator'
class VForm extends Component {
    static propTypes = {
        conditions: PropTypes.array,
    }
    static childContextTypes = {
        validator: PropTypes.object,
    }
    constructor(props) {
        super(props)
        this.validator = new Validator(props.conditions)
    }
    getChildContext() {
        return { validator: this.validator }
    }
    exec() { // 获取校验结果
        const result = this.validator.execAll()
        const error = result.findIndex(item => item.error) > -1
        return { error, result }
    }
    execSome(ids) { 
        const result = this.validator.execSome(ids)
        const error = result.findIndex(item => item.error) > -1
        return { error, result }
    }
    reset() { // 重置
        this.validator.reset()
    }
    render() {
        let { children, className, tag = 'div' } = this.props
        return React.createElement(tag, { className }, children)
    }
    UNSAFE_componentWillReceiveProps(props) {
        this.validator.setConditions(props.conditions)
    }
}

export default VForm

Validator (核心)

// Validator
import compute from './compute' // 规则实现
import * as Rule from './rule' // 规则定义
class Validator {
    constructor(conditions) {
        // 初始化条件
        this.conditions = this.init(conditions)
        // 监听对象
        this.listeners = Object.create(null)
        // 值对象
        this.values = Object.create(null)
        // 组对象
        this.groups = Object.create(null)
        // 映射验证条件
        this.keys = Object.create(null)
        // 状态对象
        this.states = Object.create(null)
        // 异步验证计数器
        this.counter = 0
    }
    init(conditions) {
        conditions = conditions || []
        conditions.forEach(cond => {
            cond.trigger = cond.trigger || ['change', 'blur'] //触发校验行为
        })
        return conditions
    }
    exec(id, key, value, trigger) {
        // 记录值
        this.values[id] = value
        // 寻找验证条件
        let cond = this.conditions.find(item => item.key == key)
        if (!cond) return
        // 是否被触发
        let isTrigger = cond.trigger.indexOf(trigger) !== -1
        if (!isTrigger) return
        let state = this.states[id]
        let repeatGroup = this.groups[key]
        let repeatRule = cond.rules.find(i => i.test == Rule.REPEAT)
        // 进行重复校验处理
        // 1. 必须有重复验证规则
        // 2. 拥有相同规则的验证项必须有2个及以上
        if (repeatRule && repeatGroup.length > 1) {
            let map = new Map()
            // 根据值计算出相同值的id数据
            repeatGroup.forEach(item => {
                let value = this.values[item]
                let ids = map.get(value) || []
                ids.push(item)
                map.set(value, ids)
            })
            map.forEach(ids => {
                ids.forEach(item => {
                    let itemState = this.states[item]
                    itemState.error = ids.length > 1
                    itemState.message = repeatRule.message
                    itemState.reason = 'repeat'
                    this.listeners[item]()
                })
            })
        }
        if (state.error && state.reason == 'repeat') {
            return
        }
        for (let i = 0; i < cond.rules.length; i++) {
            let result = this.valid(value, cond.rules[i], key, id)
            result.reason = 'valid'
            this.states[id] = result
            this.listeners[id]()
            if (result.error) break
        }
    }
    valid(value, rule, key, id) {
        // 验证结果
        let result = { error: false, message: rule.message, option: null }
        if (rule == Rule.REPEAT) {
            return result
        }
        // 验证方法
        let computeFn = compute[rule.test]
        if (!computeFn) return result
        // 验证参数,目前只有重复和回调验证时需要用到
        let option = null
        // 重复验证时,合成校验参数
        if (rule.test === Rule.REPEAT) {
            let group = this.groups[key]
            option = group.filter(i => i != id).map(i => ({ id: i, value: this.values[i] }))
        }
        result.error = computeFn(value, rule.express, option)
        return result
    }
    get(id) {
        return this.states[id] || { error: false, message: '', option: null }
    }
    add(id, key, value, listener) {
        this.keys[id] = key
        this.values[id] = value
        this.states[id] = { error: false, message: '', option: null }
        this.listeners[id] = listener
        // 重复验证时,将相同验证的条件的项放到一个组里面
        let group = this.groups[key] || []
        group.push(id)
        this.groups[key] = group
    }
    remove(id) {
        delete this.keys[id]
        delete this.values[id]
        delete this.states[id]
        delete this.listeners[id]
    }
    cache(id, value) {
        this.values[id] = value
    }
    reset() {
        for (const id in this.states) {
            let state = this.states[id]
            state.error = false
            this.listeners[id]()
        }
    }
    execAll() {
        const result = []
        for (const id in this.keys) {
            this.exec(id, this.keys[id], this.values[id], 'change')
            result.push(Object.assign({}, this.states[id], { id }))
        }
        return result
    }
    execSome(ids) {
        const result = []
        for (const id of ids) {
            this.exec(id, this.keys[id], this.values[id], 'change')
            result.push(Object.assign({}, this.states[id], { id }))
        }
        return result
    }
    destroy(id, key) {
        delete this.keys[id]
        delete this.values[id]
        delete this.states[id]
        delete this.listeners[id]
        let group = this.groups[key]
        if (group) {
            group = group.filter(item => item != id)
            this.groups[key] = group
        }
    }
    setConditions(conditions) {
        this.conditions = this.init(conditions)
    }
}

export default Validator

rule

// 非空
export const REQUIRED = 'required'
// 数值
export const NUMBER = 'number'
// 正则
export const REG = 'reg'
// 邮箱
export const EMAIL = 'email'
// 网址
export const URL = 'url'
// 手机号
export const PHONE = 'phone'
// 身份证
export const IDCARD = 'idcard'
// ipv4
export const IP = 'ip'
// 长度
export const LENGTH = 'length'
// 范围
export const RANGE = 'range'
// 日期
export const DATE = 'date'
// 重复
export const REPEAT = 'repeat'
// 回调
export const CALLBACK = 'callback'

compute

import * as Rule from './rule'
/*
 * 所有方法均是计算是否合法
 * 如果错误返回true
 */
 
/**
 * 基本校验,校验数据是否为null或者undefined
 * @param value 数据
 */
function baiscValidate(value) {
    if (value === null || typeof value === 'undefined') {
        return true
    }
    return false
}
function baiscStringValidate(value) {
    if (baiscValidate(value)) {
        return true
    }
    if (typeof value !== 'string') {
        return true
    }
    return false
}
function computeRequired(value) {
    if (baiscValidate(value)) {
        return true
    }
    if (typeof value === 'string' && !value) {
        return true
    }
    return false
}
function computeNumber(value) {
    // 如果是number直接通过
    if (typeof value === 'number') {
        return false
    }
    if (baiscStringValidate(value)) {
        return true
    }
    if (!value) {
        return false
    }
    let reg = /^[\+\-]?\d*\.?\d+(?:[Ee][\+\-]?\d+)?$/
    return !reg.test(value)
}
function computeReg(value, express) {
    if (baiscStringValidate(value)) {
        return true
    }
    if (value === '') {
        return false
    }
    return !express.test(value)
}
function computeStringWithReg(value, reg) {
    if (baiscStringValidate(value)) {
        return true
    }
    // 空字符判断通过
    if (!value) {
        return false
    }
    return !reg.test(value)
}
function computeEmail(value) {
    let reg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
    return computeStringWithReg(value, reg)
}
function computeUrl(value) {
    let reg = /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
    return computeStringWithReg(value, reg)
}
function computePhone(value) {
    let reg = /^1[34578]\d{9}$/
    return computeStringWithReg(value, reg)
}
function computeIDCard(value) {
    let 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]$/
    return computeStringWithReg(value, reg)
}
function computeIP(value, express) {
    let reg = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
    if (express == 6) {
        return false
    }
    return computeStringWithReg(value, reg)
}
function computeLength(value, express) {
    if (baiscValidate(value)) {
        return true
    }
    if (!value) {
        return false
    }
    if ((typeof value === 'string' || value instanceof Array) && value.length !== express) {
        return true
    }
    return false
}
function computeRange(value, express) {
    if (typeof value === 'string' || value instanceof Array) {
        if (express.min && express.max && (value.length < express.min || value.length > express.max)) {
            return true
        } else if (express.min && value.length < express.min) {
            return true
        } else if (express.max && value.length > express.max) {
            return true
        }
    }
    if (typeof value === 'number') {
        if (express.min && express.max && (value < express.min || value > express.max)) {
            return true
        } else if (express.min && value < express.min) {
            return true
        } else if (express.max && value > express.max) {
            return true
        }
    }
    if (!value) {
        return false
    }
    return false
}
function computeDate(value) {
    if (baiscStringValidate(value)) {
        return true
    }
    if (!value) {
        return false
    }
    let args = value.split(' ')
    let reg = /^(\d{4})[-\\](\d{2})[-\\](\d{2})$/
    if (args.length == 2) {
        reg = /^(\d{4})[-\\](\d{2})[-\\](\d{2}) (\d{2}):(\d{2}):(\d{2})$/
    }
    if (!reg.test(value)) {
        return true
    }
    try {
        let date = new Date(value).toUTCString()
        if (date == 'Invalid Date') {
            return true
        }
    } catch (e) {
        return true
    }
    return false
}
function computeRepeat(value, express, option) {
    if (baiscStringValidate(value)) {
        return true
    }
    return option.findIndex(item => item.value == value) > 0
}
function computeCallback(value, express) {
    if (baiscValidate(value)) {
        return true
    }
    if (!express || typeof express !== 'function') {
        return false
    }
    let result = express(value)
    if (typeof result === 'undefined') {
        return false
    }
    if (typeof result === 'boolean') {
        return !result
    }
    return false
}
const compute = {}

compute[Rule.REQUIRED] = computeRequired
compute[Rule.NUMBER] = computeNumber
compute[Rule.REG] = computeReg
compute[Rule.EMAIL] = computeEmail
compute[Rule.URL] = computeUrl
compute[Rule.PHONE] = computePhone
compute[Rule.IDCARD] = computeIDCard
compute[Rule.IP] = computeIP
compute[Rule.LENGTH] = computeLength
compute[Rule.RANGE] = computeRange
compute[Rule.DATE] = computeDate
compute[Rule.REPEAT] = computeRepeat
compute[Rule.CALLBACK] = computeCallback

export default compute

VItem

import PropTypes from 'prop-types'
import React, { Component } from 'react'
import uuid from 'uuid'
import Validator from '../core/validator'

class VItem extends Component {
    static propTypes = {
        for: PropTypes.string.isRequired,
        state: PropTypes.object,
    }
    static contextTypes = {
        validator: PropTypes.object,
    }
    id = uuid()
    validator = null
    onBlur = e => {
        this.validator.exec(this.id, this.props.for, this.props.children.props.value, 'blur')
    }
    onFocus = e => {
        this.validator.exec(this.id, this.props.for, this.props.children.props.value, 'focus')
    }
    onChange = e => {
        let value = null
        if (e === undefined || e === null) {
            value = undefined
        } else if (e.target && e.target.value !== undefined) {
            value = e.target.value
        } else {
            value = e
        }
        this.validator.exec(this.id, this.props.for, value, 'change')
    }
    handleStateChange = () => { // 改变状态
        let { state } = this.props
        let { vitem, vmessage } = this.refs
        let { error, message, validating } = this.validator.get(this.id)
        if (state) {
            error = state.error
            message = state.message
        }
        let className = this.getClassName(error, validating)
        vitem.className = className
        vmessage.style.display = error ? 'block' : 'none'
        vmessage.innerHTML = error ? message : ''
    }
    getClassName (error, validating) {
        let classnames = ['v-item-wrap']
        if (validating) {
            classnames.push('v-validating')
        } else if (error) {
            classnames.push('v-error')
        }
        return classnames.join(' ')
    }
    createTwoChains (event) {
        const eventFn = this.props.children.props[event]
        return (a, b, c, d, e, f, g) => {
            this[event].call(this, a)
            eventFn && eventFn(a, b, c, d, e, f, g)
        }
    }
    exec () {
        this.validator.exec(this.id, this.props.for, this.props.children.props.value, 'change')
        let { error } = this.validator.get(this.id)
        return !error
    }
    render () {
        let { style } = this.props
        let child = React.Children.only(this.props.children)
        let newChildProps = {
            onBlur: this.createTwoChains('onBlur'),
            onFocus: this.createTwoChains('onFocus'),
            onChange: this.createTwoChains('onChange'),
        }
        return (
            <div style={style} className={this.getClassName(false, false)} ref="vitem">
                {React.cloneElement(child, newChildProps)}
                <p className="v-item-message" style={{ display: 'none' }} ref="vmessage" />
            </div>
        )
    }
    componentWillMount () {
        if (this.props.id) {
            this.id = this.props.id
        }
        this.validator = this.context.validator || new Validator([this.props.condition])
        this.validator.add(this.id, this.props.for, this.props.children.props.value, this.handleStateChange)
    }
    UNSAFE_componentWillReceiveProps (nextProps) {
        let { children } = nextProps
        this.validator.cache(this.id, children.props.value)
        // 如果for为空就移出验证信息
        if (!nextProps.for) {
            this.validator.remove(this.id)
        } else {
            if (!this.props.for) {
                this.validator.add(this.id, nextProps.for, nextProps.children.props.value, this.handleStateChange)
            }
        }
    }
    componentDidUpdate () {
        this.handleStateChange()
    }
    componentWillUnmount () {
        this.validator.destroy(this.id, this.props.for)
    }
}

export default VItem

VButton

import PropTypes from 'prop-types'
import React, { Component } from 'react'

class VButton extends Component {
    static propTypes = {
        onSubmit: PropTypes.func,
        onBeforSubmit: PropTypes.func,
    }
    static contextTypes = {
        validator: PropTypes.object,
    }
    static defaultProps = {
        disabled: false,
        onSubmit: () => {},
        onBeforSubmit: () => true,
    }
    click(event) {
        let { disabled, onBeforSubmit } = this.props
        if (disabled || !onBeforSubmit()) {
            return
        }
        const result = this.context.validator.execAll()
        const error = result.findIndex(item => item.error) > -1
        this.props.onSubmit({ event, error, result })
    }
    render() {
        let child = React.Children.only(this.props.children)
        let newChildProps = {
            onClick: e => this.click(e),
        }
        return React.cloneElement(child, newChildProps)
    }
}

export default VButton

使用方式

createRule(创建规则)

import __ from '@public/i18n'
/**
 * 创建必要规则
 */
export function createRequiredRule(key, title) {
    return { key, rules: [{ test: 'required', message: title }] }
}
/**
 * 创建字符长度规则
 */
export function createRequiredRangeRule(key, title, required, max) {
    let rule = { key, rules: [] }
    if (required) {
        rule.rules.push({ test: 'required', message: title })
    }
    rule.rules.push({ test: 'range', message: __('valid.range', { max }), express: { max } })
    return rule
}
/**
 * 创建对象非空规则
 */
export function createObjectRule(key, title, pk = 'id') {
    return { key, rules: [{ test: 'callback', message: title, express: value => !!value[pk] }] }
}
/**
 * 创建数组非空规则
 */
export function createArrayRule(key, title) {
    return { key, rules: [{ test: 'callback', message: title, express: value => value.length > 0 }] }
}
/**
 * 创建数值规则
 */
export function createNumberRule(key, required, messages = {}) {
    let rule = { key, rules: [] }
    messages = Object.assign({}, { required: __('field'), valided: __('valid.number') }, messages)
    if (required) {
        rule.rules.push({ test: 'required', message: __('messages.required') })
    }
    rule.rules.push({ test: 'number', message: __('messages.valided') })
    return rule
}

/**
 * 创建编码规则
 */
export function createCodeRule(key = 'code', title) {
    return {
        key,
        rules: [
            { test: 'required', message: title },
            { test: 'reg', express: /^[a-zA-Z0-9_]*$/, message: __('placeholder.code') },
        ],
    }
}

import React, { Component } from 'react'
import { Modal, Form, Input } from 'antd'
import { VForm, VItem } from '@components/ui/validator'

const formRef = React.createRef()

class MyForm extends Component {
    render () {
        let { visible, title, onCancel, onSave } = this.props
        return (
            <Modal
                visible={visible}
                title={title}
                onCancel={onCancel}
                onOk={() => {
                    let resulet = formRef.current.exec() // 获取校验信息结果
                    if (resulet.error) return
        			...
                }}>
                <VForm
                    tag={Form}
                    ref={formRef}
                    conditions={[
                        createRequiredRule('name', __('field.name')),
                        createRequiredRule('code', __('field.code')),
                    ]}>
                    <Form.Item {...FORM_LABEL_LAYOUT} label="名称" required>
                        <VItem for="name">
                            <Input
                                value={name}
                                onChange={e => { }}
                            />
                        </VItem>
                    </Form.Item>
                </VForm>
            </Modal>
        )
    }
}

export default MyForm

Java自定义校验注解实战:从@NotNull到复杂业务规则封装 数据校验是Java后端开发中保障接口健壮性的基础环节,其核心原理基于JSR 380(Bean Validation 2.0)规范,通过声明式注解实现数据约束。在Spring Boot框架中,Hibernate Validator作为默认实现,将校验逻辑与业务代码解耦,显著提升代码可维护性。标准注解如@NotNull、@Email虽能满足基础格式校验,但面对复杂业务规则(如邮箱后缀白名单、部门ID有效性验证)时则显乏力。此时,自定义校验注解的技术价值凸显——它允许开发者将特定业务逻辑封装为可复用的注解组件,实 阅读详情

相关推荐

IEEE ACCESS Please note that all author names should be listed in English.(所有作者名需用英文名列出)

很奇怪哈,我明明手稿和提交页面作者都是用的英文,但是为什么还是会提示我没用英文呢?后来给编辑发消息,回的很快,他给我发了一个截图,确实是出现中文,但是我还是不知道为啥会出现中文。直到晚上回寝室洗澡的时候忽然想起来了是不是orcid的原因,因为它会强制作者绑定一个orcid账号,而我的orcid账号的名字刚好是中文的。当然这个只是我的一个猜想,但是我觉得可能性很大。我的第二篇论文已经投稿了快三个月了,效果非常的不好,所以我打算转投IEEE ACCESS了,希望这里可以给我一点好的建议。

kuyecsl的博客 3310

自定义交互element-ui表单的校验信息

在表格排版的表单中,使用icon+ tooltip来显示错误的验证信息。充分优化用户体验,使表格每行以最优雅的高度显示,节省空间。 支持 input 与 select 交互效果 相关的样式,在表单上添加类design-form-validateicon // 行内错误信息 icon 加 tooltip显示效果 .design-form-validateicon { .el-form-item--small.el-form-item { margin-bottom: 0; } .el-

知无涯 4334

一种基于OpenPose和DNN的跌倒检测软件系统(中文&英文)

学习并实现一种跌倒检测模型,此模型基于OpenPose实现逐帧人体姿态检测,使用DNN识别人体动作。检测方式有在线与离线两种,本文主要测试了离线模式,测试效果较好。

Tongzhou_Li的博客 2643

尚品汇细节分析-Vue项目中如何实现自定义校验规则

data() {return {required表示必须输入字段trigger表示用户行为,常用blur表示失去焦点这里自定义规则的方法的调用是写在了rule里面,即validator当中必须要写callback()// 验证用户名以及密码 const validateUsername =(rule , value , callback) => {callback();if(!value) {callback(new Error("请输入用户名"));} else {

阿卡内的博客 1506

模糊综合评价模型

一.引子 1.数学归纳法:同高中知识 2.秃子悖论:秃子悖论 这俩个例子都是类似于“量变引起质变”的道理,而在数学中我们把这类问题的性质叫做“模糊性”,在生活中我们也经常能遇到一些模糊的概念,比如年轻、帅、很少很多… 二.概述 模糊综合评价法是一种基于模糊数学的综合评价方法。该综合评价法根据模糊数学的隶属度理论把定性评价转化为定量评价,即用模糊数学对受到多种因素制约的事物或对象做出一个总体的评价。它具有结果清晰,系统性强的特点,能较好地解决模糊的、难以量化的问题,适合各种非确定性问题的解决。——来自百度百

The__Tyche的博客 2万+

C#实战:5分钟搞定Modbus RTU通讯(基于NModbus4库)

本文详细介绍了如何使用C#和NModbus4库快速实现Modbus RTU通讯,包括环境配置、核心功能实现、性能优化及常见问题排查。通过代码示例和实用技巧,帮助开发者高效完成工业自动化设备的数据采集与控制任务。

weixin_30689307的博客 467

vue表单rules校验

文章目录一、表单校验1. 表单项校验2. 表单整体校验二、规则模板 一、表单校验 此部分详情可参考此博客《在vue中使用rules对表单字段进行验证》,这里只记录一下个人理解。 1. 表单项校验 form标签处申明,此标签要使用rules规则,如下图, :rules=“formRules”:formRules是后续我们自己编写的规则的名称; ref=“rulesForm”:获取整体表单的数据保存在rulesForm,用于校验整体表单做准备; :model="rulesForm:这个是JS处定义的变量,

weixin_45928161的博客 1万+

html一号店项目代码,项目一号店素材(html模板)

【实例简介】【实例截图】【核心代码】oneShop├── css│ ├── ShopShow.css│ ├── base.css│ ├── load.css│ ├── logo.css│ ├── register.css│ └── style.css├── detail.html├── images│ ├── Thumbs.db│ ├── a_close.png│...

weixin_35390150的博客 4989

VUE项目中如何进行表单校验

本文主要讲解Form 表单的必填项校验、正则验证、自定义校验规则和兜底校验

悟其浅而深修,沉其心而精进 1万+

结构光三维重建2——多频外差解包裹

本文深入解析了结构光三维重建中的多频外差解包裹技术。针对四步相移法产生的相位包裹问题,该方法通过投影多组不同频率的条纹光,利用外差原理逐级解算,最终获得精确、连续的绝对相位值,是实现高精度、稳健三维重建的关键步骤。

weixin_29056101的博客 350

AUTOSAR模式管理-EcuM多核处理及其他概念

因此,EcuM不请求状态。因此,BswM必须确保,例如,在调用EcuM_GoHalt或EcuM_GoPoll之前,必须将关机目标从其默认值更改为ECUM_STATE_SLEEP。对于ECU的关闭,BswM(位于主EcuM的同一个分区中)最终调用主核上的GoOff,该GoOff将请求分发给所有的从核。在ECU Manager模块的早期版本中,睡眠目标被特殊处理,因为在ECU中实现的睡眠模式取决于ECU的功能。在使用了外部的SBC控制相关的MCU的下电的时候,在OFF阶段最后调用SBC进入到Sleep的指令。

m0_49148264的博客 1340

webpack配置学习-上

待补充

Master12138的博客 1373

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 727

Element-ui 表单校验二次封装

Element-ui 表单校验二次封装说明Params 说明 本封装仅仅是将一些校验规则进行循环使用,避免多次重复书写而封装的 若有更好用的封装请各位大佬艾特我,我必紧紧跟随学习,追随大佬的脚步 若有更好的思路请留言,感谢 Params SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如: query type default desc required Boolean 默认为false 是否必传 trigger String 默认为blur 触发事件

一个前端小菜菜的博客,四五年的经验,熟悉vue,react,nuxt,微信小程序,Uniapp。 665

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

自定义断言工具类

自定义断言工具类, 消除if else 抛出异常的代码

qq_42945407的博客 51

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

element-ui自定义表单校验规则及常用表单校验

前言 表单校验是注册环节中必不可少的操作,表单校验可以提醒用户填写数据规则以确保用户提交数据的效性,也可以防止用户因误操作、填写错误数据或者恶意提交数据而占用服务器资源。 ElementUI校验规则 ElementUI封装了组件el-form来收集、校验和提交数据,其中的rules属性就是用来做数据校验的。ElementUI提供了一些常用的表单验证规则,我们可以直接使用该规则来实现数据校验。rules根据rules给出的规则会对prop中的值进行校验,当不满足要求时会弹出message相应的提示信息。 自

田兴的博客 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

表单校验插件Validate.js&自定义规则校验

一、jquery插件 网络上有许多成熟的插件供使用者参考,插件就是将jquery实现的常用操作进行封装,封装后的小框架就可以叫做插件,按照插件的语法去操作可以实现很多复杂的功能,而这些复杂功能的背后实现我们可以不必懂。 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求。该插件捆绑了一套有用的验证方法,包括 U...

henrly的博客 5587

React封装自定义表单校验方法

react中封装自定义校验规则函数

qq_51130780的博客 1394

影刀RPA自定义指令实战:如何用5分钟封装你的第一个数据校验模块

本文通过一个5分钟实战案例,详细介绍了如何在影刀RPA中利用自定义指令功能,快速封装一个可复用的数据校验模块。该模块能有效校验数据格式、完整性与有效性,统一数据质量防线,显著提升自动化流程的开发效率与健壮性。

Black的专栏 921

Vue常规表单校验规则与自定义表单校验

Vue常规表单校验规则与自定义表单校验

Asgfcsdn的博客 3723

ThinkPHP Validate自定义规则

首先,我们开发经常会遇到:校验参数时,看到过很多通常做法是直接if判断,参数少时还好,参数多时10多个参数以上呢?然后就用ThinkPHP5 封装好的Validate验证规则,开发业务时经常会遇到某些字段,ThinkPHP5验证规则没有我们想要的。这时就需要封装多个自定义验证规则了。 如上图:封装一个受保护的方法 参数 $value 是传递过来的值 $field是字段名 然后接下来只需要在...

qq_38214479的博客 2531

【vue3组件封装】含校验的Input

vue3 input组件封装

aaaaapipi的博客 1773

【Dify工具参数校验全攻略】:掌握9大类型规则,避免80%的配置错误

掌握Dify工具参数类型校验规则,有效避免配置错误。涵盖字符串、数值、布尔等9大类型校验方法,适用于API集成与工作流配置场景,提升调试效率与稳定性。规则清晰易用,值得收藏。

PixelShoal的博客 1140

手动封装一个uni-app表单校验公共方法

目录前言思路代码公共校验js校验代码使用 前言 使用uni-app开发小程序,因为没有使用插件,只能自己手动写校验 思路 第一时间考虑就是写一个自定义指令,这个指令包含两个功能,双向数据绑定和校验; 但实际操作发现uni-app不允许使用自定义指令; 因此,改用手动校验比较low的方法,此方法建立在element上,目前只是简单实现,后续会完善此方法 以下是实现流程 封装一个公共js——需要校验时,传入校验值和rules——校验失败(提示+返回false)——校验成功(返回true)(相识度比) 代码

tsang荒男的博客 1923

vue校验规则封装

vue校验规则封装

qq_33911541的博客 1051
上一篇: 前端面试真题宝典(二)
下一篇: React中的优先级
MaxLoongLvs
博客等级 码龄9年 226粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaxLoongLvs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值