From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master
---
jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/AuditL0FieldMetaProbe.java | 139 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 139 insertions(+), 0 deletions(-)
diff --git a/jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/AuditL0FieldMetaProbe.java b/jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/AuditL0FieldMetaProbe.java
new file mode 100644
index 0000000..de5a808
--- /dev/null
+++ b/jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/AuditL0FieldMetaProbe.java
@@ -0,0 +1,139 @@
+package jnpf.bizcommon.audit.service;
+
+import jnpf.audit.diff.AuditFieldDiff;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 灞� 0 {@code field_diffs} **灞曠ず鍏冩暟鎹�**鐨勬柇瑷�鎺㈤拡锛圖1 鍓嶇疆鏉′欢 鈶o級銆�
+ *
+ * <p>涓轰粈涔堝繀椤绘湁瀹冿紝涓斿繀椤绘槸**绾� JVM**锛氳繖鍧楃殑閿欐硶鏄�岄潤榛樺湴灏戜竴涓� key銆嶁�斺��
+ * 绔埌绔窇涓嶅嚭绾紝鍙細鍦ㄥ墠绔妸瀛楀吀瀛楁鐨勫瓨鍌ㄥ師鍊煎綋鏄庢枃娓叉煋鍑烘潵锛�
+ * 鑰岄偅绉嶉棶棰樿绛夊埌鏈変汉鐩潃椤甸潰鐪嬫墠鍙戠幇銆侱1 姝f槸杩欎箞鍙戠幇鏃у疄鐜板皯浜嗗洓涓敭鐨勩��
+ *
+ * <p>涓や釜鏂瑰悜閮借閽変綇锛岀己涓�涓嶅彲锛�
+ * <ul>
+ * <li><b>鏈夊厓鏁版嵁鏃堕敭瑕佸嚭鐜颁笖鍊艰瀵�</b>鈥斺�斿惁鍒欒ˉ浜嗙瓑浜庢病琛ワ紱</li>
+ * <li><b>娌℃湁鍏冩暟鎹椂閿銆屾暣涓笉鍑虹幇銆�</b>锛堝眰 1 鎭掍紶 null锛夆�斺�斿惁鍒欏眰 1 鐨� 190 鏉℃棦鏈夋柇瑷�
+ * 浼氬洜褰㈢姸鍙樺寲鑰岀孩锛岃�屽畠鐨勮涔変竴鐐规病鍙樸�傝繖鏄湰娆℃敼鍔�**鍞竴**鐨勫洖褰掗潰锛�
+ * 鎵�浠ユ柇瑷�鍐欏湪杩欓噷鑰屼笉鏄潬銆屽簲璇ヤ笉褰卞搷銆嶇殑鎺ㄦ柇銆�</li>
+ * </ul>
+ *
+ * <p>閫�鍑虹爜锛�0 = 鍏ㄧ豢 / 1 = 鏈夋柇瑷�澶辫触銆備笉杩炲簱銆佷笉璧峰鍣ㄣ��
+ */
+public final class AuditL0FieldMetaProbe {
+
+ private static int pass = 0;
+ private static int fail = 0;
+
+ private static void ok(String name) {
+ System.out.println(" [PASS] " + name);
+ pass++;
+ }
+
+ private static void bad(String name, String detail) {
+ System.out.println(" [FAIL] " + name + " 鈥斺�� " + detail);
+ fail++;
+ }
+
+ private static void assertContains(String name, String json, String needle) {
+ if (json != null && json.contains(needle)) {
+ ok(name);
+ } else {
+ bad(name, "鏈熸湜鍑虹幇 " + needle + "锛屽疄闄�=" + json);
+ }
+ }
+
+ private static void assertAbsent(String name, String json, String needle) {
+ if (json == null || !json.contains(needle)) {
+ ok(name);
+ } else {
+ bad(name, "鏈熸湜**涓�**鍑虹幇 " + needle + "锛屽疄闄�=" + json);
+ }
+ }
+
+ private static Map<String, Object> row(Object... kv) {
+ Map<String, Object> m = new LinkedHashMap<>();
+ for (int i = 0; i < kv.length; i += 2) {
+ m.put(String.valueOf(kv[i]), kv[i + 1]);
+ }
+ return m;
+ }
+
+ private static Set<String> masked(String... cols) {
+ return new LinkedHashSet<>(Arrays.asList(cols));
+ }
+
+ public static void main(String[] args) {
+ System.out.println("=== 灞� 0 field_diffs 灞曠ず鍏冩暟鎹紙jnpfKey / nameModified锛�===");
+
+ Map<String, Object> before = row("qingyan_leixing", "CP", "beizhu", "鏃�");
+ Map<String, Object> after = row("qingyan_leixing", "YL", "beizhu", "鏂�");
+
+ // 鈹�鈹� A 缁勶細灞� 1 璺緞锛坢eta=null锛夆�斺�� 鏂伴敭蹇呴』銆屾暣涓笉鍑虹幇銆� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ // 杩欎竴缁勬槸鏈鏀瑰姩鍞竴鐨勫洖褰掗潰锛氬眰 1 娌℃湁琛ㄥ崟妯″瀷銆佹亽浼� null锛�
+ // 鑻ユ棤鏉′欢琛ヤ笂 "jnpfKey":null 涔嬬被锛屽畠鐨� 190 鏉℃棦鏈夋柇瑷�浼氬洜褰㈢姸鍙樺寲鑰岀孩銆�
+ String noMeta = AuditFieldDiff.diff(before, after, masked());
+ assertAbsent("A1 灞�1 璺緞锛�3 鍙傞噸杞斤級涓嶅嚭鐜� jnpfKey 閿�", noMeta, "jnpfKey");
+ assertAbsent("A2 灞�1 璺緞锛�3 鍙傞噸杞斤級涓嶅嚭鐜� nameModified 閿�", noMeta, "nameModified");
+ assertContains("A3 灞�1 璺緞 fieldName 浠嶅洖钀芥垚瀛楁鍚�", noMeta, "\"fieldName\":\"qingyan_leixing\"");
+
+ String nullMeta = AuditFieldDiff.diff(before, after, masked(), null);
+ assertAbsent("A4 鏄惧紡浼� null meta锛�4 鍙傞噸杞斤級鍚屾牱涓嶅嚭鐜� jnpfKey", nullMeta, "jnpfKey");
+ if (noMeta.equals(nullMeta)) {
+ ok("A5 3 鍙備笌 4 鍙備紶 null 鐨勮緭鍑洪�愬瓧绗︾浉鍚岋紙灞�1 鎹㈤噸杞戒篃涓嶄細婕傦級");
+ } else {
+ bad("A5 3 鍙備笌 4 鍙備紶 null 杈撳嚭搴旂浉鍚�", noMeta + " vs " + nullMeta);
+ }
+
+ // 鈹�鈹� B 缁勶細鏈夊厓鏁版嵁 鈥斺�� 閿鍑虹幇銆佸�艰瀵� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ Map<String, AuditFieldDiff.FieldMeta> meta = new LinkedHashMap<>();
+ meta.put("qingyan_leixing", new AuditFieldDiff.FieldMeta("璇烽獙绫诲瀷", "select", Boolean.TRUE));
+ meta.put("beizhu", new AuditFieldDiff.FieldMeta("澶囨敞", "textarea", Boolean.FALSE));
+ String withMeta = AuditFieldDiff.diff(before, after, masked(), meta);
+ assertContains("B1 甯� jnpfKey", withMeta, "\"jnpfKey\":\"select\"");
+ assertContains("B2 甯� nameModified=true锛堝瓧鍏稿瓧娈靛墠绔彧鏄剧ず銆屽凡淇敼銆嶏級", withMeta, "\"nameModified\":true");
+ assertContains("B3 nameModified=false 涔熷瀹炲甫涓婏紙涓嶆槸鐪佺暐锛�", withMeta, "\"nameModified\":false");
+ assertContains("B4 涓枃鏍囩浠嶇劧鐢熸晥", withMeta, "\"fieldName\":\"璇烽獙绫诲瀷\"");
+
+ // 鈹�鈹� C 缁勶細鍏冩暟鎹己椤规椂閫愰敭闄嶇骇锛屼笉鏁村潡涓� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ Map<String, AuditFieldDiff.FieldMeta> partial = new LinkedHashMap<>();
+ partial.put("qingyan_leixing", new AuditFieldDiff.FieldMeta("璇烽獙绫诲瀷", null, null));
+ String partialJson = AuditFieldDiff.diff(before, after, masked(), partial);
+ assertContains("C1 鍙湁鏍囩鏃� fieldName 鐢熸晥", partialJson, "\"fieldName\":\"璇烽獙绫诲瀷\"");
+ assertAbsent("C2 jnpfKey 涓� null 鏃惰閿笉鍑虹幇锛堜笉鏄� \"jnpfKey\":null锛�", partialJson, "jnpfKey");
+ assertAbsent("C3 nameModified 涓� null 鏃惰閿笉鍑虹幇", partialJson, "nameModified");
+ // 鍚屼竴娆� diff 閲屽彟涓�涓瓧娈靛畬鍏ㄦ病鐧昏 鈫� 鍙奖鍝嶅畠鑷繁
+ assertContains("C4 鏈櫥璁扮殑瀛楁鍥炶惤鎴愬瓧娈靛悕锛屼笉鍙楀悓鎵瑰叾浠栧瓧娈靛奖鍝�", partialJson, "\"fieldName\":\"beizhu\"");
+
+ // 鈹�鈹� D 缁勶細涓庤劚鏁忓叡瀛� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ // 涓よ�呯鐨勬槸涓嶅悓鐨勪簨锛氳劚鏁� = 鍊间笉璁帮紱nameModified = 鍊间笉灞曠ず銆傚悓鏃舵垚绔嬫椂
+ // 鍓嶇鏄剧ず銆屽凡淇敼銆嶈�屼笉鏄� `***`锛岃涔夋洿鍑嗭紝鏁�**鑴辨晱鍒椾笂鐓ф牱甯� nameModified**銆�
+ Map<String, AuditFieldDiff.FieldMeta> maskedMeta = new LinkedHashMap<>();
+ maskedMeta.put("sign_password", new AuditFieldDiff.FieldMeta("绛惧悕瀵嗙爜", "password", Boolean.TRUE));
+ String maskedJson = AuditFieldDiff.diff(
+ row("sign_password", "old"), row("sign_password", "new"),
+ masked("sign_password"), maskedMeta);
+ assertContains("D1 鑴辨晱鍒楃殑鍊间粛鏄崰浣嶇", maskedJson, "\"oldData\":\"***\"");
+ assertContains("D2 鑴辨晱鍒楃収鏍峰甫 nameModified锛堣劚鏁忕涓嶈鍊笺�佸畠绠′笉灞曠ず锛�", maskedJson, "\"nameModified\":true");
+ assertContains("D3 鑴辨晱鍒� type 鎭掍负 1锛圔5 璇勫 M-3锛屽瓨鍦ㄦ�т篃涓嶇粰锛�", maskedJson, "\"type\":1");
+
+ // 鈹�鈹� E 缁勶細瀛愯〃鎺т欢 鈥斺�� 鏈眰鍒や笉浜嗭紝蹇呴』鑳借璇嗗埆鍑烘潵鐣欑棔 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ if (AuditFieldDiff.JNPF_KEY_TABLE.equals("table")) {
+ ok("E1 瀛愯〃鎺т欢甯搁噺涓庡墠绔� DataLogList.vue 鐨勫垽鎹瓧闈㈤噺涓�鑷达紙'table'锛�");
+ } else {
+ bad("E1 瀛愯〃鎺т欢甯搁噺搴斾负 'table'", AuditFieldDiff.JNPF_KEY_TABLE);
+ }
+
+ System.out.println();
+ System.out.println("=== 灞� 0 灞曠ず鍏冩暟鎹柇瑷�锛�" + pass + " 閫氳繃 / " + fail + " 澶辫触 ===");
+ System.exit(fail == 0 ? 0 : 1);
+ }
+
+ private AuditL0FieldMetaProbe() {
+ }
+}
--
Gitblit v1.8.0