數(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)交互圖
說明(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é)接口交互标準
規則項目關系圖
說明(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ù)據較驗流程
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)項目
- 在公共項目中編寫【客戶姓名較驗規則】【客戶證件類型較驗規則】【客戶證件号較驗規則】
3.2.2 公共規則庫項目
3.2.2.1 庫文件
變量庫(BOM)
- 客戶信息
- 輸出BOM
- 輸入BOM
參數(shù)庫
- 公共參數(shù)庫
- 其它參數(shù)庫
3.2.2.2 客戶姓名較驗規則
3.2.2.3 客戶證件類型較驗規則
注意:本示例隻允許1-身份證,2-戶口本這兩種類型
3.2.2.4 客戶證件号較驗規則
- 戶口本号碼規則
- 身份證号規則,算(suàn)法有(yǒu)點複雜,涉及到多(duō)個(gè)規則文件
- 身份證号較驗算(suàn)法明(míng)細
- 以下是身份證号較驗算(suàn)法所需要的轉換關系表,在上(shàng)述規則中有(yǒu)調用
3.2.3 數(shù)據分析項目(普通(tōng)規則項目)
3.2.3.1 客戶三要素較驗規則
注意:
- 在此規則中需要導入【公共項目】的參數(shù)庫,也會(huì)直接調用公共項目中的規則文件
- 根據輸入的【字段名】動态匹配相應的規則執行(xíng)組,也可(kě)以增加一個(gè)輸入項“規則名”來(lái)匹配規則的
- 将輸入的Map轉換成【變量】對象,方便後續的規則較驗邏輯的輸入
3.2.3.2 定義公共動作(zuò)模闆
說明(míng):将常用的賦值語句分組定義在動作(zuò)模闆庫中,以達到抽象和(hé)快速引用目的,提高(gāo)規則編寫效率和(hé)可(kě)讀性;例如上(shàng)述的規則中就出現了【動作(zuò)模闆:數(shù)據較驗返回值賦值動作(zuò)】,二者遙向呼應
3.2.3.3 創建知識包
- 創建知識包
- Rest服務測試
3.2.4 示例項目(普通(tōng)規則項目)
3.2.4.1 客戶姓名較驗規則
注意:将輸入Map轉換成【客戶信息】對象
3.2.4.2 創建知識包
- 創建知識包
- Rest服務測試
3.3 測試
3.3.1 在postMan工具中模拟消費方
3.3.1.1 客戶三要素較驗測試
3.3.1.2 客戶姓名較驗測試
- 輸入數(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接口
3.3.2.2 驗證‘客戶姓名合規性’
(1)前端頁面代碼
(2)測試用例
- 前端輸入空(kōng)值,較驗未通(tōng)過
- 前端輸入【張三豐】較驗通(tōng)過
- 前端輸入【1234】較驗不通(tōng)過
- 消費方控制(zhì)台打印日志(zhì)
3.3.2.3 驗證‘客戶三要素合規性’
(1)編寫前端頁面代碼
(2)測試用例
- 輸入空(kōng)值,較驗不通(tōng)過
- 輸入合規的三要素,驗收通(tōng)過
- 輸入不合規的要素值,較驗不通(tōng)過
- 消費方控制(zhì)台打印日志(zhì)
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)文檔。