數(shù)據合規性檢查案例

1.問題描述

1.1 數(shù)據驗證的意義

規則引擎可(kě)以在數(shù)據驗證和(hé)清洗場(chǎng)景中使用,通(tōng)過使用規則來(lái)驗證數(shù)據的有(yǒu)效性和(hé)一緻性,具體(tǐ)如下:

  • 數(shù)據格式驗證:驗證數(shù)據是否符合特定的格式要求,如郵件地址、電(diàn)話(huà)号碼等。
  • 數(shù)據範圍驗證:驗證數(shù)據是否在允許的範圍內(nèi),如年齡範圍、工資範圍等。
  • 數(shù)據一緻性驗證:驗證不同數(shù)據項之間(jiān)的一緻性,如郵寄地址和(hé)郵編号碼的一緻性等。

總之,數(shù)據驗證是确保用戶輸入數(shù)據的有(yǒu)效性和(hé)正确性的重要手段,可(kě)以使用戶提交的數(shù)據更加準确可(kě)靠,同時(shí)提高(gāo)系統的可(kě)用性和(hé)安全性。

1.2 表單數(shù)據驗證常用的幾種方式

客戶端驗證

這種驗證方式在用戶提交表單之前,先在客戶端進行(xíng)驗證。客戶端驗證的優勢在于能夠即時(shí)發現并糾正用戶的輸入問題,提高(gāo)用戶體(tǐ)驗,它通(tōng)常使用JavaScript或jQuery等前端技(jì)術(shù)實現。

這種驗證方式針對表單中的每個(gè)元素進行(xíng)驗證,包括必填項、長度、格式、類型等。表單元素驗證可(kě)以提高(gāo)表單的可(kě)用性和(hé)用戶體(tǐ)驗,同時(shí)可(kě)以減少(shǎo)用戶輸入錯誤的可(kě)能性。

服務端驗證

這種驗證方式在用戶提交表單後,由服務端進行(xíng)驗證。服務端驗證可(kě)以防止惡意用戶繞過前端驗證,确保數(shù)據的完整性和(hé)安全性。它通(tōng)常使用後端編程語言如PHP、Java或Python等實現。

數(shù)據庫驗證

這種驗證方式在數(shù)據存儲到數(shù)據庫之前,對數(shù)據進行(xíng)驗證。數(shù)據庫驗證可(kě)以确保數(shù)據的有(yǒu)效性和(hé)一緻性,同時(shí)可(kě)以防止惡意用戶繞過前端和(hé)後端驗證,它通(tōng)常使用數(shù)據庫查詢語句實現。

總之,做(zuò)好數(shù)據驗證工作(zuò),可(kě)極大(dà)地提升數(shù)據質量。

2.架構與設計(jì)

2.1 架構

應用間(jiān)交互圖

img

說明(míng)

  • 推薦采用以上(shàng)系統間(jiān)交互方式,通(tōng)過網關來(lái)與規則引擎交互,可(kě)能更适應于當前市場(chǎng)主流的微服務體(tǐ)系
  • 将鑒權、流控、熔斷等都集中在應用服務網關上(shàng)完成,從而保護規則引擎服務器(qì)
  • 由于,規則引擎的輸入接口數(shù)據格式比較特殊,可(kě)能需要在應用服務網關轉換,以更加适配于目标開(kāi)發團隊現有(yǒu)的技(jì)術(shù)棧和(hé)接口交互标準

規則項目關系圖

img

說明(míng)

  • 規則項目類型有(yǒu)2種,公共項目和(hé)普通(tōng)項目,我們的uRule産品支持項目間(jiān)的引用和(hé)共享,允許在普通(tōng)項目中調用公共項目中的規則文件
  • 在新建規則時(shí),将本單位的輸入規則進行(xíng)提練,将比較常用的、通(tōng)用的規則編寫在【公共項目】中,然後在【普通(tōng)項目】中進行(xíng)引用,按需組合規則并向自己的業務應用系統提供驗證服務

2.2 數(shù)據較驗流程

img

2.3 設計(jì)

用戶本地維護的規則編号表

自定義全局編碼 知識包id 較驗規則說明(míng)
CK_USERNAME 301 用戶名較驗
CK_USEREMAIL 302 用戶郵箱較驗
  • 開(kāi)發者自建的對照關系表,即能展示本地特色、方便開(kāi)發者在前端應用界面中記憶等,又可(kě)以與uRule解耦,在遷移項目時(shí)知識包id可(kě)能會(huì)重新編号,出現不能匹配到的問題
  • 自建的對照表可(kě)以作(zuò)為(wèi)組織的知識庫公開(kāi)顯示和(hé)查詢,更能提升工作(zuò)效率

前端在調用時(shí),輸入數(shù)據問題

  • 規則碼如上(shàng)圖所示,标記着調用那(nà)個(gè)知識包
  • 輸入數(shù)據格式需要抽象,并保持全域(所有(yǒu)的消費方)一緻性,方可(kě)多(duō)路複用,兼容多(duō)種複雜的場(chǎng)景
  • 輸入參數(shù)可(kě)能是個(gè)List集合或者是Map,但(dàn)不能是個(gè)java對象(BOM),可(kě)能會(huì)涉及到多(duō)個(gè)表單要素間(jiān)的組合性檢查,輸入對象的實例化(Map轉換成BOM)應放在調用入口規則上(shàng)
  • 需要注意此處的字段名fieldName輸入值來(lái)源于“數(shù)據字典”,全域公用的,規則引擎中會(huì)根據這個(gè)fieldName匹配規則算(suàn)法
{
  "ckId":"CK_001",
  "inputData":[
    {
      "fieldName":"myName",
      "fieldValue":"張三"      
    },
    {
      "fieldName":"myCerKind",
      "fieldValue":"1"
    },
    {
      "fieldName":"myCerCode",
      "fieldValue":"420322xxxxxxxxxxxx"
    }
  ]
}
{
  "ckId":"CK_002",
  "inputMap":
    {
      "custName":"張三豐",
      "custCerType":"2",
      "custCerCode":"123456789"
    }
}

返回到前端的數(shù)據,标準結構

{
  "resultCode":"200",
  "resultMsg":"較驗通(tōng)過"  
}
{
  "resultCode":"999",
  "resultMsg":"較驗未通(tōng)過",
  "data":[
    {"checkMsg":"不滿足最小(xiǎo)長度","checkCode":"0","checkFieldName":"myName"},
    {"checkCode":"1","checkFieldName":"myCerKind"},
    {"checkMsg":"證件号不滿足行(xíng)業規範要求","checkCode":"0","checkFieldName":"myCerCode"}
  ]
}

3.示例程序

3.1 業務需求

3.1.1 技(jì)術(shù)要求

  • 實現對客戶信息的輸入項合規性較驗,在業務場(chǎng)景發生(shēng)變更時(shí),能及時(shí)調整數(shù)據的較驗規則,生(shēng)産系統能及時(shí)變更生(shēng)效,無需走繁雜的項目變更發版流程
  • 本單位各業務系統的具有(yǒu)相同業務含義的要素,原則上(shàng)執行(xíng)同一套輸入标準,以保證數(shù)據的完整性和(hé)一緻性

3.1.2 業務規則

  • 客戶姓名:元素值是一個(gè)長度在[4, 120]區(qū)間(jiān)內(nèi)的字符串
  • 客戶證件類型:元素值是一個(gè)整型數(shù)值,取值範圍[1,2] ,身份證和(hé)戶口本
  • 客戶證件号碼:當證件類型是1-身份證時(shí)其長度是18位字符串,而且是一個(gè)合法的有(yǒu)效的身份證号碼;當證件類型是2-戶口本時(shí)其長度是9位字符串

3.2 uRule規則引擎實現過程

3.2.1 新建項目

  • 新建2個(gè)規則項目:公共項目和(hé)普通(tōng)項目
  • 在公共項目中編寫【客戶姓名較驗規則】【客戶證件類型較驗規則】【客戶證件号較驗規則】

img

3.2.2 公共規則庫項目

3.2.2.1 庫文件

變量庫(BOM)
  • 客戶信息

img

  • 輸出BOM

img

  • 輸入BOM

img

參數(shù)庫
  • 公共參數(shù)庫

img

  • 其它參數(shù)庫

img

3.2.2.2 客戶姓名較驗規則

img

3.2.2.3 客戶證件類型較驗規則

注意:本示例隻允許1-身份證,2-戶口本這兩種類型

img

3.2.2.4 客戶證件号較驗規則

img

  • 戶口本号碼規則

img

  • 身份證号規則,算(suàn)法有(yǒu)點複雜,涉及到多(duō)個(gè)規則文件

img

  • 身份證号較驗算(suàn)法明(míng)細

img

img

img

  • 以下是身份證号較驗算(suàn)法所需要的轉換關系表,在上(shàng)述規則中有(yǒu)調用

img

img

3.2.3 數(shù)據分析項目(普通(tōng)規則項目)

img

3.2.3.1 客戶三要素較驗規則

注意:

  • 在此規則中需要導入【公共項目】的參數(shù)庫,也會(huì)直接調用公共項目中的規則文件
  • 根據輸入的【字段名】動态匹配相應的規則執行(xíng)組,也可(kě)以增加一個(gè)輸入項“規則名”來(lái)匹配規則的
  • 将輸入的Map轉換成【變量】對象,方便後續的規則較驗邏輯的輸入

img

img

img

img

3.2.3.2 定義公共動作(zuò)模闆

說明(míng):将常用的賦值語句分組定義在動作(zuò)模闆庫中,以達到抽象和(hé)快速引用目的,提高(gāo)規則編寫效率和(hé)可(kě)讀性;例如上(shàng)述的規則中就出現了【動作(zuò)模闆:數(shù)據較驗返回值賦值動作(zuò)】,二者遙向呼應

img

3.2.3.3 創建知識包

  • 創建知識包

img

  • Rest服務測試

img

3.2.4 示例項目(普通(tōng)規則項目)

img

3.2.4.1 客戶姓名較驗規則

注意:将輸入Map轉換成【客戶信息】對象

img

3.2.4.2 創建知識包

  • 創建知識包

img

  • Rest服務測試

img

3.3 測試

3.3.1 在postMan工具中模拟消費方

3.3.1.1 客戶三要素較驗測試

img

3.3.1.2 客戶姓名較驗測試

img

  • 輸入數(shù)據
[
    {
        "name": "參數(shù)",
        "fields": {
            "inputMap": {
                "custName": "張"
            }
        },
        "class": "java.util.HashMap"
    }
]
  • 輸出數(shù)據
{
    "output": [
        {
            "參數(shù)": {
                "outList": [
                    {
                        "checkMsg": "客戶姓名違反業務規則:張",
                        "checkFieldName": "custName",
                        "checkCode": "0"
                    }
                ]
            }
        }
    ],
    "duration": 6
}

3.3.2 在某個(gè)消費方業務系統模拟

3.3.2.1 編寫消費方後端api接口

img

3.3.2.2 驗證‘客戶姓名合規性’

(1)前端頁面代碼

img

img

(2)測試用例

  • 前端輸入空(kōng)值,較驗未通(tōng)過

img

  • 前端輸入【張三豐】較驗通(tōng)過

img

  • 前端輸入【1234】較驗不通(tōng)過

img

  • 消費方控制(zhì)台打印日志(zhì)

img

3.3.2.3 驗證‘客戶三要素合規性’

(1)編寫前端頁面代碼

img

img

(2)測試用例

  • 輸入空(kōng)值,較驗不通(tōng)過

img

  • 輸入合規的三要素,驗收通(tōng)過

img

  • 輸入不合規的要素值,較驗不通(tōng)過

img

  • 消費方控制(zhì)台打印日志(zhì)

img

3.4 小(xiǎo)結

  • 規則設計(jì)時(shí),隻有(yǒu)要确保入口規則數(shù)據結構的通(tōng)用性,才能保證消費方在java端調用規則代碼的兼容性,通(tōng)過【知識包id】和(hé)【輸入參數(shù)】自動觸發對應的規則,輸入參數(shù)結構是固定不變的,與你(nǐ)要調用的規則文件一一對應。
  • 規則設計(jì)時(shí),若遇到比較複雜的規則,我們通(tōng)常會(huì)聲明(míng)變量(BOM)在多(duō)個(gè)規則文件中傳遞,以提升可(kě)讀性和(hé)便捷性;那(nà)麽,在入口規則處就得(de)對象實例化,出應當做(zuò)好入參的檢查工作(zuò)。
  • 前端頁面在調用規則時(shí),輸入參數(shù)至少(shǎo)包括該規則文件中要用到的元素值,通(tōng)常在你(nǐ)的團隊開(kāi)發規範中,會(huì)要求每個(gè)規則接口的輸入和(hé)輸出都有(yǒu)一個(gè)api說明(míng)文檔。

results matching ""

    No results matching ""