<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                >[success] # 開始實戰 ~~~ 1.現在有個需求有一個接口是創建人員的,要求人員的名字不能為空,剩下 的都可以為空,隨著業務可能后續還會增加越來越多和人有關的字段,例如 身高,體重,職業,這個接口也會在多個頁面重復使用,但如果頁面挨個添 加,容易出現遺漏,因此根據這個我們構建了一套管理數據分離 ~~~ >[info] ## 從'Model' 模塊文件夾開始 ~~~ 1.model 文件夾下的'BaseModel.js' 文件是所有自定義接口類的 基類,這里基類可以幫我們將字段 和 字段驗證方法進行匹配,可以幫我們 進行數據自動賦值,也可以根據我們自己的業務需求進行二次添加 2.model 文件下的'MyPerson.js' 文件是一個本章節的接口驗證管理類,需要 根據業務不同,自己維護各自的模塊類 ~~~ >[danger] ##### BaseModel -- 模塊管理基類 ~~~ 1.說明文件中導入的'KEY_DECO_VALIDATORS' 是一個'Symbol'變量: KEY_DECO_VALIDATORS = Symbol('validators') 2.'reflect-metadata' 是一個第三方的用來強化'Reflect' 映射的一個庫 ~~~ ~~~ import {KEY_DECO_VALIDATORS} from '../untils/decorators' import 'reflect-metadata' export default class BaseModel{ // 查當前類生成的實例,對應的指定字段映射的驗證類 decoratorsOf( property, metaKey = KEY_DECO_VALIDATORS) { const rs = Reflect.getMetadata(metaKey, this, property) return Array.isArray(rs) ? rs : [rs] } async validatorOf(property, args) { const vArr = this.decoratorsOf(property) if (vArr) { // 獲取當前驗證屬性值 const val = this[property] for (const it of vArr) { // 調用當前映射的驗證裝飾所對應的類驗證方法 if (it.validate && !(await it.validate(val, args))) { return new Error(it.errorMessage) }else{ return new Error('當前驗證方法不存在') } } } } } ~~~ >[danger] ##### 需要根據需要實現 -- MyPerson類 ~~~ 1.這個類應該根據你的需要和業務去實現,現在虛擬想出的業務就是有個接 口用來提交個人的信息 2.所有這系列的類都需要繼承'BaseModel.js',因為'BaseModel. js' 有這些模 塊共同的方法 3.需要對需要驗證的字段加上對應驗證的裝飾器用來修飾 ~~~ ~~~ import BaseModel from './BaseModel' import required from '../baseValidator/RequiredValidator' export default class MyPerson extends BaseModel{ @required(false,'不能為空') name = '' } ~~~ >[info] ## 從'baseValidator' 開始驗證 ~~~ 1.'baseValidator' 文件夾跟'model' 文件夾的思路一致的,有一個基類'BaseModel.js' 文件,這個是所有驗證的基類,可以根據自己的業務做二次開發 2.'baseValidator' 文件夾也會提供一些常用的基本驗證規則的類,這些類都是通過 繼承'BaseModel.js' 基類實現,例如常見的'必填','正則'等 3.最后的使用其實調用就是'validatorOf'方法 ~~~ >[danger] ##### BaseValidator 驗證的基類 ~~~ 1.驗證的基類,用來規定后續驗證,可以自定義格式,需要指定對應的報錯提示 ~~~ ~~~ /** * 驗證的基礎模板 類似驗證的接口 * @param {string} errorMessage - 驗證的報錯信息 */ export default class BaseValidator { constructor(errorMessage = 'Invalid Data') { this.errorMessage = errorMessage } /** * @return {boolean} 驗證規則返回的需要是布爾類型 * **/ async validate(value, args) { return false } } ~~~ >[danger] ##### 常用的驗證類 必填-- Required ~~~ 1.必填裝飾驗證的封裝 ~~~ ~~~ import BaseValidator from './BaseValidator' import {validatorImpl} from'../untils/decorators' /** * 驗證是否必填 * @param {string} errorMessage - 驗證的報錯信息 * @param {boolean} allowEmptyString - 自定義驗證規則 */ class Required extends BaseValidator { constructor(allowEmptyString=false, errorMessage) { super(errorMessage) this.allowEmptyString = allowEmptyString } /** * @return {boolean} 通過正則驗證必填 * **/ async validate(value, args) { return value !== null && (this.allowEmptyString || !/^\s*$/.test(value)) } } export default function required(allowEmptyString,errorMessage) { return validatorImpl( new Required(allowEmptyString,errorMessage)) } ~~~ >[info] ## untils -- 編寫配合工具 ~~~ 1.做映射關系,和映射全局'key' ~~~ >[danger] ##### 裝飾器開始 -- decorators.js ~~~ 1.可以發現這個方法是配合,裝飾器方法使用,例子: export default function required(allowEmptyString,errorMessage) { return validatorImpl( new Required(allowEmptyString,errorMessage)) } 2.整個方法思路就是用一個數組去保存對應屬性的映射驗證,往往有時候 字段是需要多個驗證規則,因此可能需要多個裝飾器來修飾, 'Reflect.getMetadata'用來判斷當前裝飾器是否有對應映射關系,如果沒有 就會返回'undefind',在利用'defineMetadata' 添加一個空數組作為映射 的'value',再將對應的驗證類添加到這個映射數組中 ~~~ ~~~ export const KEY_DECO_VALIDATORS = Symbol('validators') export function validatorImpl (ins) { return (target, propKey) => { let vArr = Reflect.getMetadata(KEY_DECO_VALIDATORS, target, propKey) if (!vArr) { vArr = [] Reflect.defineMetadata(KEY_DECO_VALIDATORS, vArr, target, propKey) } vArr.push(ins) } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看