-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
2322 lines (1940 loc) · 99.1 KB
/
index.html
File metadata and controls
2322 lines (1940 loc) · 99.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222"><meta name="generator" content="Hexo 6.3.0">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
<link rel="mask-icon" href="/images/logo.svg" color="#222">
<link rel="manifest" href="/manifest.json">
<meta name="google-site-verification" content="4zmc5dCOR7a63YXOZx4mwqsC5dPpr0m2iWeI12w6wng">
<meta name="baidu-site-verification" content="fe6bba1d0d4e906fed87c9f7c2d1d09d">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" integrity="sha256-Z1K5uhUaJXA7Ll0XrZ/0JhX4lAtZFpT6jkKrEDT0drU=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css" integrity="sha256-Vzbj7sDDS/woiFS3uNKo8eIuni59rjyNGtXfstRzStA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pace/1.2.4/themes/blue/pace-theme-minimal.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/pace/1.2.4/pace.min.js" integrity="sha256-gqd7YTjg/BtfqWSwsJOvndl0Bxc8gFImLEkXQT8+qj0=" crossorigin="anonymous"></script>
<script class="next-config" data-name="main" type="application/json">{"hostname":"wnhyang.github.io","root":"/","images":"/images","scheme":"Gemini","darkmode":false,"version":"8.14.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":{"enable":true,"style":null},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":true,"pangu":true,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":false,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果:${query}","hits_time":"找到 ${hits} 个搜索结果(用时 ${time} 毫秒)","hits":"找到 ${hits} 个搜索结果"},"path":"/search.xml","localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false}}</script><script src="/js/config.js"></script>
<meta name="description" content="热爱、分享、生活">
<meta property="og:type" content="website">
<meta property="og:title" content="无奈何杨(wnhyang)">
<meta property="og:url" content="https://wnhyang.github.io/index.html">
<meta property="og:site_name" content="无奈何杨(wnhyang)">
<meta property="og:description" content="热爱、分享、生活">
<meta property="og:locale" content="zh_CN">
<meta property="article:author" content="无奈何杨(wnhyang)">
<meta property="article:tag" content="blog">
<meta name="twitter:card" content="summary">
<link rel="canonical" href="https://wnhyang.github.io/">
<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":true,"isPost":false,"lang":"zh-CN","comments":"","permalink":"","path":"index.html","title":""}</script>
<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>无奈何杨(wnhyang)</title>
<script async defer data-website-id="" src=""></script>
<script defer data-domain="" src=""></script>
<noscript>
<link rel="stylesheet" href="/css/noscript.css">
</noscript>
<link rel="alternate" href="/atom.xml" title="无奈何杨(wnhyang)" type="application/atom+xml">
</head>
<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
<div class="headband"></div>
<main class="main">
<div class="column">
<header class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="site-brand-container">
<div class="site-nav-toggle">
<div class="toggle" aria-label="切换导航栏" role="button">
<span class="toggle-line"></span>
<span class="toggle-line"></span>
<span class="toggle-line"></span>
</div>
</div>
<div class="site-meta">
<a href="/" class="brand" rel="start">
<i class="logo-line"></i>
<h1 class="site-title">无奈何杨(wnhyang)</h1>
<i class="logo-line"></i>
</a>
<p class="site-subtitle" itemprop="description">I will keep to fight</p>
</div>
<div class="site-nav-right">
<div class="toggle popup-trigger" aria-label="搜索" role="button">
<i class="fa fa-search fa-fw fa-lg"></i>
</div>
</div>
</div>
<nav class="site-nav">
<ul class="main-menu menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a></li><li class="menu-item menu-item-about"><a href="/about/" rel="section"><i class="fa fa-user fa-fw"></i>关于</a></li><li class="menu-item menu-item-tags"><a href="/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签<span class="badge">50</span></a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档<span class="badge">229</span></a></li><li class="menu-item menu-item-rss"><a href="/atom.xml" rel="section"><i class="fa fa-rss fa-fw"></i>RSS</a></li>
<li class="menu-item menu-item-search">
<a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
</a>
</li>
</ul>
</nav>
<div class="search-pop-overlay">
<div class="popup search-popup"><div class="search-header">
<span class="search-icon">
<i class="fa fa-search"></i>
</span>
<div class="search-input-container">
<input autocomplete="off" autocapitalize="off" maxlength="80"
placeholder="搜索..." spellcheck="false"
type="search" class="search-input">
</div>
<span class="popup-btn-close" role="button">
<i class="fa fa-times-circle"></i>
</span>
</div>
<div class="search-result-container no-result">
<div class="search-result-icon">
<i class="fa fa-spinner fa-pulse fa-5x"></i>
</div>
</div>
</div>
</div>
</header>
<aside class="sidebar">
<div class="sidebar-inner sidebar-overview-active">
<ul class="sidebar-nav">
<li class="sidebar-nav-toc">
文章目录
</li>
<li class="sidebar-nav-overview">
站点概览
</li>
</ul>
<div class="sidebar-panel-container">
<!--noindex-->
<div class="post-toc-wrap sidebar-panel">
</div>
<!--/noindex-->
<div class="site-overview-wrap sidebar-panel">
<div class="site-author animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
<img class="site-author-image" itemprop="image" alt="无奈何杨(wnhyang)"
src="/images/avatar.jpg">
<p class="site-author-name" itemprop="name">无奈何杨(wnhyang)</p>
<div class="site-description" itemprop="description">热爱、分享、生活</div>
</div>
<div class="site-state-wrap animated">
<nav class="site-state">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">229</span>
<span class="site-state-item-name">日志</span>
</a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/">
<span class="site-state-item-count">50</span>
<span class="site-state-item-name">标签</span></a>
</div>
</nav>
</div>
<div class="links-of-author animated">
<span class="links-of-author-item">
<a href="https://github.com/wnhyang" title="GitHub → https://github.com/wnhyang" rel="noopener" target="_blank"><i class="fab fa-github fa-fw"></i></a>
</span>
<span class="links-of-author-item">
<a href="https://www.zhihu.com/people/wnhyang" title="Zhihu → https://www.zhihu.com/people/wnhyang" rel="noopener" target="_blank"><i class="fab fa-zhihu fa-fw"></i></a>
</span>
<span class="links-of-author-item">
<a href="mailto:wnhyang@qq.com" title="E-Mail → mailto:wnhyang@qq.com" rel="noopener" target="_blank"><i class="fa fa-envelope fa-fw"></i></a>
</span>
</div>
<div class="cc-license animated" itemprop="license">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" class="cc-opacity" rel="noopener" target="_blank"><img src="https://cdnjs.cloudflare.com/ajax/libs/creativecommons-vocabulary/2020.11.3/assets/license_badges/small/by_nc_sa.svg" alt="Creative Commons"></a>
</div>
</div>
</div>
</div>
<div class="sidebar-inner sidebar-blogroll">
<div class="links-of-blogroll animated">
<div class="links-of-blogroll-title"><i class="fa fa-globe fa-fw"></i>
链接
</div>
<ul class="links-of-blogroll-list">
<li class="links-of-blogroll-item">
<a href="https://www.yuque.com/wnh/share" title="https://www.yuque.com/wnh/share" rel="noopener" target="_blank">语雀分享</a>
</li>
<li class="links-of-blogroll-item">
<a href="https://github.com/wnhyang" title="https://github.com/wnhyang" rel="noopener" target="_blank">GitHub</a>
</li>
<li class="links-of-blogroll-item">
<a href="https://www.zhihu.com/people/wnhyang" title="https://www.zhihu.com/people/wnhyang" rel="noopener" target="_blank">知乎</a>
</li>
</ul>
</div>
</div>
<div class="pjax">
</div>
</aside>
</div>
<div class="main-inner index posts-expand">
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://wnhyang.github.io/article/a50aac1c.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.jpg">
<meta itemprop="name" content="无奈何杨(wnhyang)">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="无奈何杨(wnhyang)">
<meta itemprop="description" content="热爱、分享、生活">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | 无奈何杨(wnhyang)">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/article/a50aac1c.html" class="post-title-link" itemprop="url">置顶声明</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2025-03-30 13:54:25 / 修改时间:13:56:55" itemprop="dateCreated datePublished" datetime="2025-03-30T13:54:25+08:00">2025-03-30</time>
</span>
<span class="post-meta-break"></span>
<span class="post-meta-item" title="本文字数">
<span class="post-meta-item-icon">
<i class="far fa-file-word"></i>
</span>
<span class="post-meta-item-text">本文字数:</span>
<span>69</span>
</span>
<span class="post-meta-item" title="阅读时长">
<span class="post-meta-item-icon">
<i class="far fa-clock"></i>
</span>
<span class="post-meta-item-text">阅读时长 ≈</span>
<span>1 分钟</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="博客停更了">博客停更了</h1>
<p>因为个人博客运营比不上现如今的微信公众号等等渠道,所以今后所有内容统一更新在微信公众号和语雀中。</p>
<p>个人语雀:<a target="_blank" rel="noopener" href="https://www.yuque.com/wnhyang"
title="wnhyang">wnhyang</a></p>
<p>共享语雀:<a target="_blank" rel="noopener" href="https://www.yuque.com/wnh"
title="在线知识共享">在线知识共享</a></p>
<p>Github:<a target="_blank" rel="noopener" href="https://github.com/wnhyang">wnhyang -
Overview</a></p>
<p><img data-src="https://wnhyang.github.io/images/wechat_channel.webp" /></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://wnhyang.github.io/article/c1d213b2.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.jpg">
<meta itemprop="name" content="无奈何杨(wnhyang)">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="无奈何杨(wnhyang)">
<meta itemprop="description" content="热爱、分享、生活">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | 无奈何杨(wnhyang)">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/article/c1d213b2.html" class="post-title-link" itemprop="url">基于规则引擎的决策系统开放在线体验了</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2025-03-28 10:26:56" itemprop="dateCreated datePublished" datetime="2025-03-28T10:26:56+08:00">2025-03-28</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2025-03-30 13:52:46" itemprop="dateModified" datetime="2025-03-30T13:52:46+08:00">2025-03-30</time>
</span>
<span class="post-meta-break"></span>
<span class="post-meta-item" title="本文字数">
<span class="post-meta-item-icon">
<i class="far fa-file-word"></i>
</span>
<span class="post-meta-item-text">本文字数:</span>
<span>2.2k</span>
</span>
<span class="post-meta-item" title="阅读时长">
<span class="post-meta-item-icon">
<i class="far fa-clock"></i>
</span>
<span class="post-meta-item-text">阅读时长 ≈</span>
<span>8 分钟</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>项目地址:<a target="_blank" rel="noopener" href="https://github.com/wnhyang/coolGuard"
class="uri">https://github.com/wnhyang/coolGuard</a></p>
<h1 id="前言">前言</h1>
<p>如果对此此项目还不了解可以先看下面两篇文章</p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/u5FmDX2kVDyeZ8FSTgDh2Q">基于规则引擎的风控决策系统介绍与演示</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/7De2jvMtEhQqvmsrybaRtA">风控系统之规则条件&操作增强,名单&标签&消息模版管理</a></p>
<p><img data-src="https://files.mdnice.com/user/55163/d827852f-9ea0-4d09-9d9d-8ac182a4057e.png" /></p>
<p>正如前文所讲,开始分支开发了,规划中main对应开源主分支(功能有限),pro对应标准付费分支,当然未来可能还会有pro-max🥳,demo对应在线体验分支,目前是基于pro增加一些限制和不一样的东西。</p>
<p>所以在线体验版本并不是开源版,会有些差别。</p>
<h1 id="最近">最近</h1>
<p>在开始之前还是先回顾一下最近做的事情吧!</p>
<p>最近除了在main分支做优化更新外,还要在pro分支做规划中的事情,说起来是这么概括就够了,但是其实事情很多,不仅是前端后端项目的迭代优化,更重要还有除编程外的其他事情。</p>
<p>其中花费时间最多的是在做开放在线体验上,因为这并不是简简单单的将服务部署在公网上这么简单的事,不过回头来看好像也就是这么简单的事情😂</p>
<p>因为放在公网上总要考虑很多安全性上的问题,记得之前买的服务器因为配置了常用安全组,并设置了简单的密码导致服务数据全没了,收到了“比特币换数据的要挟”,不过还好那台服务器就是自己随便玩玩的,没什么重要数据。除了数据问题之外,更有甚者被黑客攻击后被作为挖矿服务器,频繁高CPU,并收到云厂商的告警通知法律法规发现挖矿脚本要本人确定,挺麻烦的。自那之后,在这方面就谨慎起来了,不管是开发测试,密码都尽可能设置的复杂一些🥲怕了怕了</p>
<h2 id="表单校验完善">表单校验完善</h2>
<p>完善表单校验,对于普通的字段的校验相对简单,对于系统中如复合条件的校验也做了加强。</p>
<p>左/逻辑判断/右,递归等等。</p>
<p><img data-src="https://files.mdnice.com/user/55163/cf17ab7e-396e-4633-b305-5baefab6b651.png" /></p>
<p><img data-src="https://files.mdnice.com/user/55163/cb27764c-a0cf-440f-bc23-6657365c1bef.png" /></p>
<p><img data-src="https://files.mdnice.com/user/55163/32229c80-b496-4d4f-91b4-5f6cd97bc989.png" /></p>
<h2 id="批量发布">批量发布</h2>
<p>抽象了发布组件,新增批量发布组件</p>
<p><img data-src="https://files.mdnice.com/user/55163/3a166c0f-4142-46b3-a76c-2b925bc4b634.png" /></p>
<h2 id="事件数据">事件数据</h2>
<p>事件数据存储在ElasticSearch中,相关代码也只写在pro分支。</p>
<p>这部分重点在于ES索引的设计与检索数据的实现。</p>
<p>如下是目前事件数据页,支持复杂多条件查询</p>
<p><img data-src="https://files.mdnice.com/user/55163/0e7934cb-51a4-435e-bcfb-74351718512e.png" /></p>
<p>因为决策流配置还未完成,在面对多策略结果时,如何综合所有结果还在考虑中,所以目前所有结果都是“通过”。</p>
<p><img data-src="https://files.mdnice.com/user/55163/20c071a1-8c78-4235-8ba0-d94cebb912ae.png" /></p>
<p>同样高级搜索这里做了校验</p>
<p><img data-src="https://files.mdnice.com/user/55163/054e9d5a-4c98-4261-b6e2-a40eee7331bc.png" /></p>
<p>点击行即可看事件详细数据</p>
<p><img data-src="https://files.mdnice.com/user/55163/bf44e475-f3fe-43cd-8f11-585c6945b7ee.png" /></p>
<p>字段-指标-策略</p>
<p><img data-src="https://files.mdnice.com/user/55163/6ef96ea1-38b7-4aa6-9b84-3883b9c359bd.png" /></p>
<h2 id="部署相关">部署相关</h2>
<p>上篇预热在线体验的文章也有展示</p>
<p><img data-src="https://files.mdnice.com/user/55163/f3d25ee9-af30-44b8-8e11-5ad868f8c9d2.png" /></p>
<p><img data-src="https://files.mdnice.com/user/55163/fb41d1f5-c06c-4215-b1d8-8269321143f6.png" /></p>
<p>项目使用了云效的devops,采用Docker镜像部署方案,详细的如Dockerfile和docker-compose.yaml可以另开一篇文章讲。</p>
<h2 id="安全">安全</h2>
<p>要开放在线体验势必要考虑安全问题,包含服务器、中间件、账号、接口等等。</p>
<p>后端项目也为一些接口增加了权限校验,在线体验一定会限制的!</p>
<h1 id="在线体验">在线体验</h1>
<h2 id="再啰嗦一下">再啰嗦一下</h2>
<p>自己写的当然最为熟悉,对于目前有哪些问题,下一步怎么做,我是有比较清晰的规划的,但还是那句话,没有那么多时间精力啊🤪</p>
<p>除了大方向的功能/流程/交互方式/表/接口等等,更细节的如使用什么组件,那个方法需要优化,大概什么样式都是考虑中的,这些平常都记录在我的todolist中,每完成一项就删除一项,或者迁移到产品说明书/备忘录中。</p>
<h2 id="方式">方式</h2>
<p><img data-src="https://files.mdnice.com/user/55163/ed7404dd-7e51-472b-8299-fdf9a32f1eb4.png" /></p>
<p>关注公众号,私信或是加好友后,说明“在线体验”就好。</p>
<p>我会分配一个专有账号,此账号会有权限限制(这当然是必须的,主要是一些查询和新增的权限,修改、删除等等是没有),而且账号默认有效期只有7天。</p>
<p>如果人员过多,我会设置几个公用的账号(因为设置了同账号不允许多地登录,所以有挤掉的情况😅)。</p>
<p>毕竟是自费服务器,还是要限制一下。</p>
<p>当然这些只是此刻的规划,未来可能需要申请填写个人或公司信息、目的等等,也不一定,也有可能什么时候就关闭在线体验也不一定🙂↔︎️</p>
<p>关于反馈问题的渠道,当然私信和私聊都是可以的。</p>
<p>群聊的话,一直都没有,但如果开放在线体验了,想发一些公告,如:“维护中不可访问”,那么群聊就很有必要了。关于这个请看下面“交流群”。</p>
<h2 id="使用">使用</h2>
<p>关于系统如何工作的前面有很多文章了,不想在这里赘述了,未来尽量去补充详细的官方文档(产品、技术),敬请期待吧。</p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/u5FmDX2kVDyeZ8FSTgDh2Q">基于规则引擎的风控决策系统介绍与演示</a></p>
<p>1、接口</p>
<p>每配置一个接入就有三个接口可用,/test、/sync、/async如下,test需要登录,sync适合需要决策的场景,async不会决策。</p>
<p><img data-src="https://files.mdnice.com/user/55163/ccce1689-ad50-4553-90bb-8feca16e88e8.png" /></p>
<p>2、参数</p>
<p>接口参数就是下图配置的这些</p>
<p><img data-src="https://files.mdnice.com/user/55163/22cd87c6-4dfb-45e0-9a96-06a2b421428c.png" /></p>
<p>在线体验中配置了已经一个策略,发送时注意必须的几个字段就行,如下</p>
<figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span> </span><br><span class="line"><span class="attr">"appCode"</span><span class="punctuation">:</span> <span class="string">"app"</span><span class="punctuation">,</span> </span><br><span class="line"><span class="attr">"policySetCode"</span><span class="punctuation">:</span> <span class="string">"appLogin"</span><span class="punctuation">,</span> </span><br><span class="line"><span class="attr">"eventTime"</span><span class="punctuation">:</span> <span class="string">"{{$date.now}}"</span><span class="punctuation">,</span> </span><br><span class="line"><span class="attr">"transSerialNo"</span><span class="punctuation">:</span> <span class="string">"{% mock 'uuid' %}"</span><span class="punctuation">,</span> </span><br><span class="line"><span class="attr">"eventCode"</span><span class="punctuation">:</span> <span class="string">"event1234"</span> </span><br><span class="line"><span class="punctuation">}</span> </span><br></pre></td></tr></table></figure>
<p>平常我都是使用下面这种方式发的</p>
<p><img data-src="https://files.mdnice.com/user/55163/226332b7-ffc6-403c-8205-06e1284fb200.png" /></p>
<p>curl参考,mock的数据</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">curl --location --request POST 'http://127.0.0.1:8081/decision/public/sync' </span><br><span class="line">--header 'Content-Type: application/json' </span><br><span class="line">--data-raw '{ </span><br><span class="line">"appCode": "app", </span><br><span class="line">"policySetCode": "appLogin", </span><br><span class="line">"eventTime": "2025-03-29 23:31:31", </span><br><span class="line">"transTime": "2025-03-29 23:31:31", </span><br><span class="line">"transAmount": 1098.52734, </span><br><span class="line">"transSerialNo": "9b926aae-3379-4845-8e91-b9c5913dc118", </span><br><span class="line">"payerAccount": "123456", </span><br><span class="line">"payeeAccount": "654321", </span><br><span class="line">"payeeName": "薛娜", </span><br><span class="line">"payerName": "董军", </span><br><span class="line">"payeeType": "反外合年他", </span><br><span class="line">"payerType": "龙和民角", </span><br><span class="line">"payeeRiskRating": "HIGH", </span><br><span class="line">"payerRiskRating": "HIGH", </span><br><span class="line">"payeeBankName": "ABC Bank", </span><br><span class="line">"payerBankName": "XYZ Bank", </span><br><span class="line">"payeeAddress": "罗平县 福建省 上海市", </span><br><span class="line">"payerAddress": "改则县 广西壮族自治区 泰州市", </span><br><span class="line">"payeePhoneNumber": "18104207857", </span><br><span class="line">"payerPhoneNumber": "18654274834", </span><br><span class="line">"payeeIDNumber": "640000200005293830", </span><br><span class="line">"payerIDNumber": "630000197905127364", </span><br><span class="line">"payeeIDCountryRegion": "US", </span><br><span class="line">"payerIDCountryRegion": "US", </span><br><span class="line">"ip": "134.172.96.72", </span><br><span class="line">"lonAndLat": "4.514,134.44342", </span><br><span class="line">"account": "019741048", </span><br><span class="line">"deviceId": "e", </span><br><span class="line">"bindDevice": "true", </span><br><span class="line">"eventCode": "event1234" </span><br><span class="line">}' </span><br></pre></td></tr></table></figure>
<p>3、响应</p>
<p>响应结果自己试一下吧。</p>
<p>服务器日志大概如下,目前影响耗时也还好。</p>
<p><img data-src="https://files.mdnice.com/user/55163/775503d7-487d-4b23-bc3b-708c4142f769.png" /></p>
<p>从决策的角度来看,这一步已经结束了,接下来就是调用方如何使用决策结果了,当然反馈机制也是需要的。</p>
<p>4、验证</p>
<p>参考前面的事件数据查看是否符合规则配置,是否按照策略运行。</p>
<h1 id="交流群">交流群</h1>
<p>交流群其实我是比较推荐qq频道的,因为几点</p>
<ul>
<li><p>成员数量上限高</p></li>
<li><p>无论加入时间,历史消息可见</p></li>
<li><p>不仅仅是聊天,还有帖子</p></li>
<li><p>等等</p></li>
</ul>
<p>交流群可作为官方通知,因为公众号是有消息限制的,所以这种交流群是最好的,另外可以听到大家的声音,有利于我们的共同成长</p>
<p>至于共同开发/运营,也还在考虑中。</p>
<h1 id="未来">未来</h1>
<p>不管是开放在线体验还是交流群都是需要精力去运营的,个人精力实在有限,我也想把一天掰开来用,还想拔几根毫毛生成几个分身呢🥹但实在是没空啊!</p>
<p>开源版大概就是修修补补了,pro应该会成为未来主要重心。</p>
<h1 id="其他文章">其他文章</h1>
<p>全局</p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/bCZvLLrtAvp3vGaIluHYyA">规则引擎可以应用于哪些系统,用户画像、触达、风控、推荐、监控...</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/u5FmDX2kVDyeZ8FSTgDh2Q">基于规则引擎的风控决策系统介绍与演示</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/FQ6PgCjppuZiTUCawD9lVQ">风控系统之规则重复触发</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/soyeu4iC19dM2VkPeqZZPQ">LiteFlow上下文与组件设计,数据依赖梳理</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/ycAInj9obPa9ZJqXsskx6A">交易事件的生命周期,事前事中事后风控,结果通知/回调</a></p>
<p>策略/规则篇</p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/m0isU0Gd9unHZLaf5wd0-g">风控系统之普通规则条件,使用LiteFlow实现</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/XHkJFLormIKteoBiAygFew">风控系统之通用规则条件设计,算术单元/逻辑单元/函数式接口</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/_5Cc5IMd1nmJa3asVVV05g">LiteFlow决策系统的策略模式,顺序、最坏、投票、权重</a></p>
<p>指标篇</p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/DDtkjJUGjI7WehADtiWL9A">风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/aWwGnSMLRtLA-ZMPUkbJoA">基于LiteFlow的风控系统指标版本控制</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/tNoM8uVHUsxD_YHEzMtFQA">风控系统指标版本管理,前端实现</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/jYMaOFMfJ8h_TCeqmqNGKA">风控系统之指标回溯,历史数据重跑</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/4ngljYekpiklpfpxuG3Wkw">业务链指标,用户行为模式识别,埋点系统</a></p>
<p>数据篇</p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/FIj6cV61bTi9YRMizj4gRQ">风控系统之数据服务,名单、标签、IP、设备、地理信息、征信等</a></p>
<p><a
target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/oFsyvhc-BrBDxLedPW7VkQ">GeoHash处理经纬度,降维,空间填充曲线</a></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="">
<link itemprop="mainEntityOfPage" href="https://wnhyang.github.io/article/55f89c19.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.jpg">
<meta itemprop="name" content="无奈何杨(wnhyang)">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="无奈何杨(wnhyang)">
<meta itemprop="description" content="热爱、分享、生活">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="undefined | 无奈何杨(wnhyang)">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/article/55f89c19.html" class="post-title-link" itemprop="url">三方数据管理-远程接口调用,供应商&服务接口抽象分析</a>
</h2>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2025-03-23 22:17:39 / 修改时间:22:47:31" itemprop="dateCreated datePublished" datetime="2025-03-23T22:17:39+08:00">2025-03-23</time>
</span>
<span class="post-meta-break"></span>
<span class="post-meta-item" title="本文字数">
<span class="post-meta-item-icon">
<i class="far fa-file-word"></i>
</span>
<span class="post-meta-item-text">本文字数:</span>
<span>2.1k</span>
</span>
<span class="post-meta-item" title="阅读时长">
<span class="post-meta-item-icon">
<i class="far fa-clock"></i>
</span>
<span class="post-meta-item-text">阅读时长 ≈</span>
<span>8 分钟</span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="前言">前言</h1>
<ol type="1">
<li><p><strong>远程接口调用模式</strong></p>
<ul>
<li><strong>技术特征</strong>:基于HTTP/API实时交互,需实现三方服务接口的协议适配(如RESTful、GraphQL、gRPC),并内置重试、熔断、限流等容错机制。</li>
<li><strong>核心约束</strong>:
<ul>
<li>依赖服务商的接口稳定性与性能上限(如QPS、TPS阈值);</li>
<li>受限于套餐化流量配额(如API调用次数、数据返回量);</li>
<li>数据实时性高,但无法脱离三方系统进行深度加工或长期存储。</li>
</ul></li>
</ul></li>
<li><p><strong>数据源批量同步模式</strong></p>
<ul>
<li><strong>技术特征</strong>:通过ETL/CDC工具(如Airbyte、Debezium)周期同步全量或增量数据至本地/私有化存储(如HDFS、数据湖),支持自定义计算引擎(如Spark、Flink)进行分布式处理。</li>
<li><strong>核心优势</strong>:
<ul>
<li><strong>服务自主性</strong>:可基于业务需求动态扩缩容计算与存储集群(如Kubernetes弹性调度),支撑高吞吐、低延迟场景;</li>
<li><strong>数据治理自由度</strong>:支持灵活定义数据清洗、脱敏、聚合等加工链路。</li>
</ul></li>
<li><strong>实施挑战</strong>:
<ul>
<li>需严格遵循服务商的数据安全策略(如访问权限审批、加密传输协议、存储隔离机制);</li>
<li>数据同步时效性受服务商同步接口开放粒度影响(如仅允许T+1全量导出)。</li>
</ul></li>
</ul></li>
</ol>
<p>本篇只展开远程接口调用模式,以地理信息数据服务举例,重点分析高德和天地图。</p>
<h1 id="供应商">1、供应商</h1>
<p>这里指的就是高德和天地图,其作为供应商,同时也是数据源。</p>
<figure>
<img data-src="https://jsd.cdn.zzko.cn/gh/wnhyang/picx-images-hosting@master/20250323/image.26ln7hv0e9.webp"
alt="image" />
<figcaption aria-hidden="true">image</figcaption>
</figure>
<p>如在高德开发平台(天地图也是按应用分的),会以应用纬度再划分,同时服务是多种的。据此可以抽象供应商(供应商id、供应商名称、应用、应用密钥、合同编号、合同其他信息等等)。</p>
<h1 id="服务">2、服务</h1>
<p>供应商对多个应用,高德和天地图是一致的,但是下面服务就不一致了,天地图所有服务密钥就是应用密钥,高德是应用下新建服务后服务密钥是独立的。</p>
<figure>
<img data-src="https://jsd.cdn.zzko.cn/gh/wnhyang/picx-images-hosting@master/20250323/image.pfi5qrk15.webp"
alt="image" />
<figcaption aria-hidden="true">image</figcaption>
</figure>
<p>每种服务对应不同的接口和请求响应配置。</p>
<p><a target="_blank" rel="noopener" href="https://lbs.amap.com/api/webservice/guide/api/georegeo"
class="uri">https://lbs.amap.com/api/webservice/guide/api/georegeo</a></p>
<figure>
<img data-src="https://jsd.cdn.zzko.cn/gh/wnhyang/picx-images-hosting@master/20250323/image.5c156fqtr3.webp"
alt="image" />
<figcaption aria-hidden="true">image</figcaption>
</figure>
<p><a target="_blank" rel="noopener" href="http://lbs.tianditu.gov.cn/server/geocoding.html"
class="uri">http://lbs.tianditu.gov.cn/server/geocoding.html</a></p>
<figure>
<img data-src="https://jsd.cdn.zzko.cn/gh/wnhyang/picx-images-hosting@master/20250323/image.3d4yg3m3ez.webp"
alt="image" />
<figcaption aria-hidden="true">image</figcaption>
</figure>
<p>那么可以抽象服务(服务id、供应商id、服务类型、请求方法、请求路径、请求头、参数、请求体、超时时间、重试策略),当然所有这些都可以硬编码实现,但是本篇目标是抽象通用设计方案,用于后面的灵活配置。</p>
<h1 id="套餐与计费">3、套餐与计费</h1>
<figure>
<img data-src="https://jsd.cdn.zzko.cn/gh/wnhyang/picx-images-hosting@master/20250323/image.2obow2z3ya.webp"
alt="image" />
<figcaption aria-hidden="true">image</figcaption>
</figure>
<p>套餐与服务是关联的,通常模式有每天/月/年免费额度,超量阶梯计费,包年/季/月等。</p>
<figure>
<img data-src="https://jsd.cdn.zzko.cn/gh/wnhyang/picx-images-hosting@master/20250323/image.7w6zj2sj9x.webp"
alt="image" />
<figcaption aria-hidden="true">image</figcaption>
</figure>
<p>作为服务调用方,出于成本的考虑,费用当然相当关键,但是不同服务商的套餐与计费模式又不是那么容易抽象统一,从另一方面来讲灵活的服务调用(包含降级、重试策略等)只需关心接口相关的配置就好了,至于具体的费用,我比较建议不做,首先增加了复杂度,另外高德这样的三方数据服务商都会有开放平台,提供控制台用于服务的管理、流量分析、费用结算等等功能,非常丰富,作为服务使用方最好数据调用明细记录就已经不错了。</p>
<p>就像dify、coze的工作流编排时,重点是接口的配置,而不是数据服务商和费用的管理(当然不是说这些不重要)。</p>
<figure>
<img data-src="https://jsd.cdn.zzko.cn/gh/wnhyang/picx-images-hosting@master/20250323/image.4cl1t9qa1q.webp"
alt="image" />
<figcaption aria-hidden="true">image</figcaption>
</figure>
<h1 id="缓存与预警">4、缓存与预警</h1>
<p>缓存除了可以是接口的配置,如请求体配置模版外,还可以是具体的三方数据缓存,当然这个要慎重,一致性和资源问题要考虑清楚了。</p>
<p>其实不管是上面讲的流量治理(降级、熔断、重试、超时、限流等等)和预警都是通用型设计,是现代高可用服务必然考虑的事情。</p>
<h1 id="ai设计方案">AI设计方案</h1>
<p>AI设计方案仅供参考</p>
<h3 id="一三方数据管理模块"><strong>一、三方数据管理模块</strong></h3>
<h4 id="供应商表supplier新增字段">1.
供应商表(<code>supplier</code>)<strong>新增字段</strong></h4>
<table>
<colgroup>
<col style="width: 15%" />
<col style="width: 50%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr class="header">
<th>字段名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>billing_mode</td>
<td>ENUM('FREE_TIER','PAY_AS_YOU_GO','SUBSCRIPTION')</td>
<td>计费模式(免费/按量/包月包年)</td>
</tr>
<tr class="even">
<td>free_quota</td>
<td>INT</td>
<td>每月免费额度(次数/数据量)</td>
</tr>
<tr class="odd">
<td>circuit_breaker</td>
<td>JSON</td>
<td>熔断配置(失败率阈值、降级策略)</td>
</tr>
</tbody>
</table>
<h4 id="供应商套餐表supplier_plan">2.
供应商套餐表(<code>supplier_plan</code>)</h4>
<table>
<thead>
<tr class="header">
<th>字段名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>plan_id</td>
<td>VARCHAR(36)</td>
<td>套餐ID(主键)</td>
</tr>
<tr class="even">
<td>supplier_id</td>
<td>VARCHAR(36)</td>
<td>关联供应商</td>
</tr>
<tr class="odd">
<td>plan_type</td>
<td>ENUM('MONTHLY','YEARLY')</td>
<td>包月/包年</td>
</tr>
<tr class="even">
<td>price</td>
<td>DECIMAL(8,2)</td>
<td>套餐价格</td>
</tr>
<tr class="odd">
<td>max_requests</td>
<td>INT</td>
<td>套餐内最大请求次数</td>
</tr>
<tr class="even">
<td>validity_days</td>
<td>INT</td>
<td>有效期(天)</td>
</tr>
</tbody>
</table>
<hr />
<h3 id="二计费管理模块"><strong>二、计费管理模块</strong></h3>
<h4 id="计费价格配置表price_config扩展">1.
计费价格配置表(<code>price_config</code>)<strong>扩展</strong></h4>
<table>
<colgroup>
<col style="width: 18%" />
<col style="width: 13%" />
<col style="width: 68%" />
</colgroup>
<thead>
<tr class="header">
<th>新增字段</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>tiered_pricing</td>
<td>JSON</td>
<td>阶梯计价规则(如 <code>[{ "min": 1000, "price": 0.1 }]</code>)</td>
</tr>
<tr class="even">
<td>currency</td>
<td>VARCHAR(3)</td>
<td>货币类型(如CNY、USD)</td>
</tr>
</tbody>
</table>
<h4 id="用户套餐订阅表user_subscription">2.
用户套餐订阅表(<code>user_subscription</code>)</h4>
<table>
<thead>
<tr class="header">
<th>字段名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>subscription_id</td>
<td>VARCHAR(36)</td>
<td>订阅ID(主键)</td>
</tr>
<tr class="even">
<td>account_id</td>
<td>VARCHAR(36)</td>
<td>关联用户账户</td>
</tr>
<tr class="odd">
<td>plan_id</td>
<td>VARCHAR(36)</td>
<td>关联供应商套餐</td>
</tr>
<tr class="even">
<td>start_date</td>
<td>DATE</td>
<td>订阅开始日期</td>
</tr>
<tr class="odd">
<td>end_date</td>
<td>DATE</td>
<td>订阅结束日期</td>
</tr>
<tr class="even">
<td>used_quota</td>
<td>INT</td>
<td>已使用额度</td>
</tr>
</tbody>
</table>
<hr />
<h3
id="三请求与响应管理模块"><strong>三、请求与响应管理模块</strong></h3>
<h4 id="api请求配置表api_config">1.
API请求配置表(<code>api_config</code>)</h4>
<table>
<colgroup>
<col style="width: 15%" />
<col style="width: 21%" />
<col style="width: 63%" />
</colgroup>
<thead>
<tr class="header">
<th>字段名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>config_id</td>
<td>VARCHAR(36)</td>
<td>配置ID(主键)</td>
</tr>
<tr class="even">
<td>supplier_id</td>
<td>VARCHAR(36)</td>
<td>关联供应商</td>
</tr>
<tr class="odd">
<td>api_method</td>
<td>VARCHAR(20)</td>
<td>接口方法(如<code>GET_DATA</code>)</td>
</tr>
<tr class="even">
<td>http_method</td>
<td>ENUM('GET','POST')</td>
<td>请求方法</td>
</tr>
<tr class="odd">
<td>path</td>
<td>VARCHAR(100)</td>
<td>API路径(如<code>/v1/data</code>)</td>
</tr>
<tr class="even">
<td>headers</td>
<td>JSON</td>
<td>固定请求头(如<code>{"Authorization": "Bearer {token}"}</code>)</td>
</tr>
<tr class="odd">
<td>body_template</td>
<td>JSON</td>
<td>请求体模板(支持变量插值)</td>
</tr>
<tr class="even">
<td>timeout_ms</td>
<td>INT</td>
<td>超时时间(毫秒)</td>
</tr>
<tr class="odd">
<td>retry_policy</td>
<td>JSON</td>
<td>重试策略(次数、间隔)</td>
</tr>
</tbody>
</table>
<h4 id="参数校验表api_param">2.
参数校验表(<code>api_param</code>)</h4>
<table>
<thead>
<tr class="header">
<th>字段名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>param_id</td>
<td>VARCHAR(36)</td>
<td>参数ID(主键)</td>
</tr>
<tr class="even">
<td>config_id</td>
<td>VARCHAR(36)</td>
<td>关联API配置</td>
</tr>
<tr class="odd">
<td>param_name</td>
<td>VARCHAR(20)</td>
<td>参数名</td>
</tr>
<tr class="even">
<td>param_type</td>
<td>ENUM('STRING','NUMBER','BOOLEAN')</td>
<td>参数类型</td>
</tr>
<tr class="odd">
<td>required</td>
<td>BOOLEAN</td>
<td>是否必填</td>
</tr>
<tr class="even">
<td>default_value</td>
<td>VARCHAR(50)</td>
<td>默认值</td>
</tr>
</tbody>
</table>
<hr />
<h3 id="四缓存管理模块"><strong>四、缓存管理模块</strong></h3>
<h4 id="缓存配置表cache_config">1.
缓存配置表(<code>cache_config</code>)</h4>
<table>
<colgroup>
<col style="width: 16%" />
<col style="width: 17%" />
<col style="width: 65%" />
</colgroup>
<thead>
<tr class="header">
<th>字段名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>cache_key</td>
<td>VARCHAR(36)</td>
<td>缓存键(主键)</td>
</tr>
<tr class="even">
<td>supplier_id</td>
<td>VARCHAR(36)</td>
<td>关联供应商</td>
</tr>
<tr class="odd">
<td>api_method</td>
<td>VARCHAR(20)</td>
<td>接口方法</td>
</tr>
<tr class="even">
<td>ttl_seconds</td>
<td>INT</td>
<td>缓存有效期(秒)</td>
</tr>
<tr class="odd">
<td>key_pattern</td>
<td>VARCHAR(100)</td>
<td>缓存键生成规则(如<code>data:{param1}:{param2}</code>)</td>
</tr>
</tbody>
</table>
<h4 id="缓存记录表cache_data">2.
缓存记录表(<code>cache_data</code>)</h4>
<table>
<thead>
<tr class="header">
<th>字段名</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>cache_id</td>