Blame view

docs/all_test.html 83.3 KB
70a63b78   王彪总   feat(garden): 添加团...
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
  <!DOCTYPE html>
  <html lang="zh-CN">
  <head>
  <meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
  <title>UrbanOps 全域平台 · 技术架构全景分享</title>
  <link rel="stylesheet" href="ppt-assets/fonts.css">
  <link rel="stylesheet" href="ppt-assets/base.css">
  <link rel="stylesheet" href="ppt-assets/animations.css">
  <link rel="stylesheet" href="ppt-assets/style.css">
  <style>
  .tpl-tech-sharing .h1{font-size:68px;line-height:1.05}
  .tpl-tech-sharing .h2{font-size:44px}
  .tpl-tech-sharing .slide{padding:56px 72px}
  
  /* SVG diagram area */
  .svg-area{width:100%;max-width:1050px;flex:1;display:flex;align-items:center;justify-content:center;margin-top:8px}
  .svg-area svg{width:100%;height:100%;max-height:480px}
  
  /* Architecture layers */
  .arch-layers{margin-top:14px;display:grid;grid-template-rows:auto auto auto auto;gap:12px}
  .arch-layers .al{display:grid;grid-template-columns:110px 1fr;align-items:stretch;gap:12px}
  .arch-layers .al .al-name{display:flex;align-items:center;justify-content:center;background:var(--surface-2);border-radius:var(--radius);padding:12px 10px;font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:600;color:var(--accent);text-align:center;border:1px solid var(--border)}
  .arch-layers .al .al-cells{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:8px}
  .arch-layers .al .acell{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:12px 10px;text-align:center}
  .arch-layers .al .acell .aci{font-size:20px;margin-bottom:2px}
  .arch-layers .al .acell h4{font-size:13px;color:#fff;margin:3px 0 1px}
  .arch-layers .al .acell p{font-size:10px;color:var(--text-3);margin:0}
  .arch-layers .al.hl .acell{border-top:3px solid var(--accent);border-color:rgba(126,231,135,.35)}
  .arch-layers .al.fw .acell{border-top:3px solid var(--accent-2);border-color:rgba(121,192,255,.35)}
  
  .biz-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}
  .biz-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:22px 18px}
  .biz-card .biz-icon{font-size:32px;margin-bottom:8px}
  .biz-card h4{font-size:17px;color:#fff;margin-bottom:6px}
  .biz-card p{font-size:12px;color:var(--text-2);line-height:1.6;margin:0}
  .biz-card .biz-tags{display:flex;flex-wrap:wrap;gap:5px;margin-top:10px}
  .biz-card .biz-tags span{font-family:'JetBrains Mono',monospace;font-size:10px;padding:2px 8px;border-radius:4px;background:var(--surface-2);color:var(--text-2);border:1px solid var(--border)}
  .biz-card.ac{border-top:3px solid var(--accent)}
  .biz-card.blue{border-top:3px solid var(--accent-2)}
  .biz-card.purple{border-top:3px solid #d2a8ff}
  
  .col2{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:14px}
  .col2 .box{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:22px}
  
  .flow-steps{display:flex;align-items:center;gap:8px;margin-top:14px}
  .flow-steps .fs{flex:1;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px 12px;text-align:center}
  .flow-steps .fs .fs-icon{font-size:26px;margin-bottom:4px}
  .flow-steps .fs h4{font-size:13px;color:#fff;margin:3px 0}
  .flow-steps .fs p{font-size:10px;color:var(--text-3);margin:0}
  .flow-steps .fs-arr{color:var(--accent);font-size:20px;font-family:'JetBrains Mono',monospace;flex-shrink:0}
  .flow-steps .fs.hl{border-top:3px solid var(--accent)}
  
  .tg{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:12px}
  .tg .tgc{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px 12px;text-align:center}
  .tg .tgc .tgci{font-size:28px;margin-bottom:4px}
  .tg .tgc h4{font-size:14px;color:#fff;margin:4px 0}
  .tg .tgc .tgt{display:flex;flex-wrap:wrap;gap:4px;justify-content:center;margin-top:8px}
  .tg .tgc .tgt span{font-family:'JetBrains Mono',monospace;font-size:10px;padding:2px 7px;border-radius:4px;background:var(--surface-2);color:var(--text-2);border:1px solid var(--border)}
  
  .timeline{margin-top:14px}
  .timeline .tl-item{display:grid;grid-template-columns:100px 1fr;gap:16px;padding:14px 0;border-bottom:1px dashed var(--border)}
  .timeline .tl-item .tl-phase{font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--accent);font-weight:600}
  .timeline .tl-item .tl-body h4{font-size:16px;color:#fff;margin:0 0 4px}
  .timeline .tl-item .tl-body p{font-size:12px;color:var(--text-2);margin:0}
  
  .fw-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:12px}
  .fw-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px 14px}
  .fw-card .fwi{font-size:22px;margin-bottom:6px}
  .fw-card h4{font-size:14px;color:#fff;margin:4px 0}
  .fw-card p{font-size:11px;color:var(--text-3);margin:0}
  .fw-card.hl{border-top:2px solid var(--accent-2)}
  
  .roadmap-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:14px}
  .roadmap-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:22px 18px}
  .roadmap-card .r-period{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--accent);font-weight:600;margin-bottom:8px}
  .roadmap-card h4{font-size:18px;color:#fff;margin-bottom:8px}
  .roadmap-card ul{margin:0;padding-left:16px;font-size:12px;color:var(--text-2);line-height:1.8}
  .roadmap-card.now{border-top:3px solid var(--accent)}
  .roadmap-card.next{border-top:3px solid var(--accent-2)}
  .roadmap-card.future{border-top:3px solid #d2a8ff}
  
  .stats-row{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;margin-top:14px}
  .stat-item{text-align:center;padding:18px 10px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius)}
  .stat-item .stat-num{font-size:38px;font-weight:800;color:var(--accent);font-family:'JetBrains Mono',monospace}
  .stat-item .stat-label{font-size:12px;color:var(--text-2);margin-top:4px}
  
  .invoc-flow{display:flex;flex-direction:column;gap:10px;margin-top:12px}
  .invoc-flow .invoc-row{display:flex;align-items:center;gap:8px}
  .invoc-flow .invoc-row .ir-label{width:100px;text-align:right;font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--accent);font-weight:600;flex-shrink:0}
  .invoc-flow .invoc-row .ir-items{display:flex;gap:6px;flex:1;flex-wrap:wrap}
  .invoc-flow .invoc-row .ir-items span{font-family:'JetBrains Mono',monospace;font-size:10px;padding:4px 10px;border-radius:5px;background:var(--surface-2);color:var(--text-2);border:1px solid var(--border)}
  .invoc-flow .ir-arrow{color:var(--text-3);font-size:16px;font-family:'JetBrains Mono',monospace;text-align:center;padding:2px 0}
  
  .deploy-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}
  .deploy-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:20px 16px;text-align:center}
  .deploy-card .di{font-size:34px;margin-bottom:8px}
  .deploy-card h4{font-size:16px;color:#fff;margin-bottom:6px}
  .deploy-card ul{margin:0;padding:0;list-style:none;font-size:11px;color:var(--text-2);line-height:1.8}
  .deploy-card.ci{border-top:3px solid var(--accent)}
  .deploy-card.cn{border-top:3px solid var(--accent-2)}
  .deploy-card.mon{border-top:3px solid #d2a8ff}
  
  .code-text{font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--text-2);background:var(--surface-2);padding:8px 14px;border-radius:8px;border:1px solid var(--border);display:inline-block}
  
  /* Layer stack (from file1) */
  .layer-stack{display:flex;flex-direction:column;gap:10px;width:100%;max-width:1000px;margin-top:14px}
  .layer-stack .layer{display:flex;align-items:center;gap:20px;padding:14px 22px;border-radius:12px;background:var(--surface);border:1px solid var(--border)}
  .layer-stack .layer-label{font-weight:700;font-size:12px;min-width:110px;text-align:right;color:var(--accent);font-family:'JetBrains Mono',monospace}
  .layer-stack .layer-content{display:flex;gap:6px;flex-wrap:wrap}
  
  /* Evolution flow */
  .evo-flow{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:center;margin-top:12px}
  .evo-flow .evo-box{background:var(--surface);border:2px solid var(--border);border-radius:14px;padding:16px 24px;text-align:center;font-weight:600;min-width:120px;font-size:13px}
  .evo-flow .evo-box.accent{border-color:var(--accent);background:rgba(126,231,135,.08)}
  .evo-flow .evo-box.purple{border-color:#d2a8ff;background:rgba(210,168,255,.08)}
  .evo-flow .evo-box.green{border-color:var(--accent-2);background:rgba(121,192,255,.08)}
  .evo-flow .evo-arrow{font-size:1.6em;color:var(--text-3)}
  </style>
  </head>
  <body class="tpl-tech-sharing">
  <div class="deck">
  
    <!-- ====== 1. Cover ====== -->
    <section class="slide" data-title="Cover">
      <p class="kicker">urbanops · tech-sharing</p>
      <h1 class="h1 anim-fade-up" data-anim="fade-up">城市运营全域平台<br><span style="background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent">技术架构全景解析</span></h1>
      <p class="lede mt-m">业务架构 × 技术架构 × 系统架构 × 部署架构 — 一次讲透全域平台。</p>
      <div class="speaker"><div class="av"></div><div><b>架构组</b><span>platform infra · 60 min + Q&amp;A</span></div></div>
      <div class="deck-footer"><span class="mono">#spring-boot #smart-garden #urbanops #architecture #microservices</span><span class="slide-number" data-current="1" data-total="26"></span></div>
    </section>
  
    <!-- ====== 2. Agenda ====== -->
    <section class="slide" data-title="Agenda">
      <p class="kicker">agenda.yaml</p>
      <h2 class="h2">今日路线图</h2>
      <div class="stack mt-l">
        <div class="agenda-row"><span class="num">01</span><span class="t">项目概述与业务架构全景</span><span class="d">~6min</span></div>
        <div class="agenda-row"><span class="num">02</span><span class="t">业务布局:园林 · 工单 · BPM · 全局</span><span class="d">~10min</span></div>
        <div class="agenda-row"><span class="num">03</span><span class="t">系统架构总览 & 模块依赖关系</span><span class="d">~6min</span></div>
        <div class="agenda-row"><span class="num">04</span><span class="t">技术架构分层 & 基础设施层</span><span class="d">~6min</span></div>
        <div class="agenda-row"><span class="num">05</span><span class="t">核心技术栈 & 数据存储策略</span><span class="d">~6min</span></div>
        <div class="agenda-row"><span class="num">06</span><span class="t">数据流 & 模块调用逻辑</span><span class="d">~6min</span></div>
        <div class="agenda-row"><span class="num">07</span><span class="t">安全架构 & 可观测性</span><span class="d">~6min</span></div>
        <div class="agenda-row"><span class="num">08</span><span class="t">部署架构 & 后续演进规划</span><span class="d">~6min</span></div>
        <div class="agenda-row"><span class="num">09</span><span class="t">总结 &amp; Q&amp;A</span><span class="d">~5min</span></div>
      </div>
    </section>
  
    <!-- ====== 3. Project Overview ====== -->
    <section class="slide" data-title="Project Overview">
      <p class="kicker">// overview</p>
      <h2 class="h2">UrbanOps 全域平台:<br>智慧城市运营管理底座</h2>
      <p class="lede">基于 RuoYi-Vue-Pro 演进而来,面向城市园林绿化、工单调度、流程协同的综合运营管理平台。模块化单体架构向微服务演进中。</p>
      <div class="stats-row mt-l">
        <div class="stat-item anim-fade-up" data-anim="fade-up"><div class="stat-num">17</div><div class="stat-label">Maven 模块</div></div>
        <div class="stat-item anim-fade-up" data-anim="fade-up" style="animation-delay:.05s"><div class="stat-num">7</div><div class="stat-label">激活业务模块</div></div>
        <div class="stat-item anim-fade-up" data-anim="fade-up" style="animation-delay:.1s"><div class="stat-num">15</div><div class="stat-label">框架 Starter</div></div>
        <div class="stat-item anim-fade-up" data-anim="fade-up" style="animation-delay:.15s"><div class="stat-num">10+</div><div class="stat-label">数据库支持</div></div>
        <div class="stat-item anim-fade-up" data-anim="fade-up" style="animation-delay:.2s"><div class="stat-num">3.5.5</div><div class="stat-label">Spring Boot</div></div>
      </div>
      <div class="col2 mt-l">
        <div class="box" style="border-top:3px solid var(--accent)">
          <h4 style="color:#fff;margin:0 0 8px">后端技术基石</h4>
          <p class="dim" style="font-size:13px;line-height:1.7">Java 17 · Spring Boot 3.5.5 · MyBatis Plus 3.5.14 · Spring Security 6.x · Flowable 7.0 · Redisson 3.51 · SkyWalking 9.5 · RocketMQ · Vert.x + MQTT · PF4J 插件框架</p>
        </div>
        <div class="box" style="border-top:3px solid var(--accent-2)">
          <h4 style="color:#fff;margin:0 0 8px">前端生态 & 核心能力</h4>
          <p class="dim" style="font-size:13px;line-height:1.7">Vue3 + Element Plus / Vben 双管理后台 · uni-app 移动端 · 大屏报表设计器 · 多租户 SaaS · IoT 设备接入 · 代码生成器 · Spring AI 集成</p>
        </div>
      </div>
    </section>
  
    <!-- ====== 4. Business Architecture Overview ====== -->
    <section class="slide" data-title="Business Architecture">
      <p class="kicker">business · architecture</p>
      <h2 class="h2">业务架构全景:<br>四大核心域 + 两大支撑域</h2>
      <div class="biz-grid">
        <div class="biz-card ac anim-fade-up" data-anim="fade-up">
          <div class="biz-icon">🌳</div><h4>智慧园林管理</h4>
          <p>树木资产管理、巡检计划、养护计划、绩效评估、物料出入库、机械成本核算</p>
          <div class="biz-tags"><span>Garden</span><span>巡检</span><span>养护</span><span>绩效</span></div>
        </div>
        <div class="biz-card blue anim-fade-up" data-anim="fade-up" style="animation-delay:.05s">
          <div class="biz-icon">📋</div><h4>工单调度系统</h4>
          <p>事件上报、工单流转、物料明细、附件管理、地理位置编码、园林事件映射</p>
          <div class="biz-tags"><span>Workorder</span><span>事件</span><span>物料</span></div>
        </div>
        <div class="biz-card purple anim-fade-up" data-anim="fade-up" style="animation-delay:.1s">
          <div class="biz-icon">🔄</div><h4>工作流引擎</h4>
          <p>Flowable 驱动,仿钉钉/飞书 + BPMN 双设计器,会签、或签、转办、委派、加签全覆盖</p>
          <div class="biz-tags"><span>BPM</span><span>Flowable</span><span>审批</span></div>
        </div>
        <div class="biz-card ac anim-fade-up" data-anim="fade-up" style="animation-delay:.15s">
          <div class="biz-icon">🌐</div><h4>全局业务管理</h4>
          <p>问题上报、道路信息、工单提交详情、流程路径想法、跨模块数据聚合</p>
          <div class="biz-tags"><span>Global</span><span>道路</span><span>问题</span></div>
        </div>
        <div class="biz-card blue anim-fade-up" data-anim="fade-up" style="animation-delay:.2s">
          <div class="biz-icon">⚙️</div><h4>系统管理</h4>
          <p>用户/角色/菜单/部门/岗位管理、租户与套餐、字典、通知公告、应用管理</p>
          <div class="biz-tags"><span>System</span><span>RBAC</span><span>多租户</span></div>
        </div>
        <div class="biz-card purple anim-fade-up" data-anim="fade-up" style="animation-delay:.25s">
          <div class="biz-icon">🏗️</div><h4>基础设施</h4>
          <p>代码生成、文件存储、定时任务、配置管理、消息队列、API 日志、监控追踪</p>
          <div class="biz-tags"><span>Infra</span><span>代码生成</span><span>监控</span></div>
        </div>
      </div>
    </section>
  
    <!-- ====== 5. Garden Business ====== -->
    <section class="slide" data-title="Business · Garden">
      <p class="kicker">garden · smart-greening</p>
      <h2 class="h2">核心业务:智慧园林管理</h2>
      <p class="lede">覆盖园林绿化全生命周期——从资产登记到巡检养护,从绩效评估到成本核算。</p>
      <div class="arch-layers">
        <div class="al hl"><div class="al-name">管理端</div>
          <div class="al-cells">
            <div class="acell"><div class="aci">🌲</div><h4>树木资产管理</h4><p>古树名木 / 变更日志</p></div>
            <div class="acell"><div class="aci">📅</div><h4>巡检计划管理</h4><p>计划制定 / 明细配置</p></div>
            <div class="acell"><div class="aci">🔧</div><h4>养护计划管理</h4><p>养护任务 / 执行跟踪</p></div>
            <div class="acell"><div class="aci">📊</div><h4>绩效管理</h4><p>指标定义 / 专家评定</p></div>
            <div class="acell"><div class="aci">📦</div><h4>物料管理</h4><p>物料类型 / 出入库</p></div>
            <div class="acell"><div class="aci">💰</div><h4>机械成本</h4><p>折旧 / 租赁核算</p></div>
          </div>
        </div>
        <div class="al fw"><div class="al-name">移动端</div>
          <div class="al-cells" style="grid-template-columns:repeat(5,1fr)">
            <div class="acell"><div class="aci">📱</div><h4>首页概览</h4><p>数据汇总</p></div>
            <div class="acell"><div class="aci">📍</div><h4>GPS 定位</h4><p>位置上报</p></div>
            <div class="acell"><div class="aci"></div><h4>巡检提交</h4><p>现场打卡</p></div>
            <div class="acell"><div class="aci">🛠️</div><h4>养护提交</h4><p>任务执行</p></div>
            <div class="acell"><div class="aci">📝</div><h4>变更记录</h4><p>树木变更</p></div>
          </div>
        </div>
      </div>
      <div class="grid g4 mt-m">
        <div class="card card-accent"><h4>定时任务</h4><p class="dim">自动生成巡检/养护计划</p></div>
        <div class="card card-accent"><h4>数据权限</h4><p class="dim">按区域隔离园林数据</p></div>
        <div class="card card-accent"><h4>时间区间</h4><p class="dim">灵活配置任务执行周期</p></div>
        <div class="card card-accent"><h4>防重复提交</h4><p class="dim">计划明细幂等性保证</p></div>
      </div>
    </section>
  
    <!-- ====== 6. Workorder Business ====== -->
    <section class="slide" data-title="Business · Workorder">
      <p class="kicker">workorder · dispatch</p>
      <h2 class="h2">工单调度:事件驱动 + 流程闭环</h2>
      <div class="col2">
        <div>
          <div class="card card-accent" style="padding:22px">
            <h4 style="color:#fff;margin:0 0 12px">工单核心实体模型</h4>
            <div class="stack">
              <div class="tag">📋 MainInfo — 工单主信息</div>
              <div class="tag">📎 Attachment — 附件管理</div>
              <div class="tag">📦 MaterialDetail — 物料明细</div>
              <div class="tag">🎯 EventInfo — 事件信息</div>
              <div class="tag">🔗 EventMappingInfo — 事件映射</div>
              <div class="tag">🌳 GardenRef — 园林业务关联</div>
            </div>
          </div>
        </div>
        <div>
          <div class="card" style="padding:22px;border-top:3px solid var(--accent-2)">
            <h4 style="color:#fff;margin:0 0 12px">工单处理流程</h4>
            <div style="display:flex;flex-direction:column;gap:8px">
              <div style="display:flex;align-items:center;gap:8px">
                <div class="fs" style="flex:1"><div class="fs-icon">📝</div><h4>事件上报</h4></div>
                <span class="fs-arr"></span>
                <div class="fs" style="flex:1"><div class="fs-icon">🔍</div><h4>工单生成</h4></div>
                <span class="fs-arr"></span>
                <div class="fs hl" style="flex:1"><div class="fs-icon">👤</div><h4>人员指派</h4></div>
              </div>
              <div style="display:flex;align-items:center;gap:8px">
                <div class="fs" style="flex:1"><div class="fs-icon">🔧</div><h4>现场处理</h4></div>
                <span class="fs-arr"></span>
                <div class="fs" style="flex:1"><div class="fs-icon">📋</div><h4>结果反馈</h4></div>
                <span class="fs-arr"></span>
                <div class="fs" style="flex:1"><div class="fs-icon"></div><h4>审核结单</h4></div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="code-text mt-m">WorkorderModule → GardenModule (Feign API) · EventMapping 策略 · GeoCode 位置服务 · 数据权限隔离</div>
    </section>
  
    <!-- ====== 7. BPM Business ====== -->
    <section class="slide" data-title="Business · BPM">
      <p class="kicker">bpm · flowable-engine</p>
      <h2 class="h2">工作流引擎:同时支持<br>「轻量配置」与「深度编排」</h2>
      <div class="grid g2 mt-l" style="align-items:start">
        <div>
          <div class="card card-accent" style="padding:22px">
            <h4 style="color:var(--accent);font-family:'JetBrains Mono',monospace;font-size:13px">SIMPLE 设计器</h4>
            <p class="dim" style="font-size:13px">仿钉钉/飞书体验,拖拽搭建表单流程,10 分钟完成配置</p>
            <div class="stack mt-s">
              <div class="tag">✦ 拖拽式表单设计</div>
              <div class="tag">✦ 审批节点可视化配置</div>
              <div class="tag">✦ 抄送人 / 条件分支</div>
              <div class="tag">✦ 超时审批 / 自动提醒</div>
            </div>
          </div>
        </div>
        <div>
          <div class="card" style="padding:22px;border-top:3px solid #d2a8ff">
            <h4 style="color:#d2a8ff;font-family:'JetBrains Mono',monospace;font-size:13px">BPMN 设计器</h4>
            <p class="dim" style="font-size:13px">基于 BPMN 2.0 标准,适配复杂多层级审批及自动化场景</p>
            <div class="stack mt-s">
              <div class="tag">✦ 会签 / 或签 / 依次审批</div>
              <div class="tag">✦ 转办 / 委派 / 加签 / 减签</div>
              <div class="tag">✦ 并行 / 包容 / 路由分支</div>
              <div class="tag">✦ 父子流程 / 触发节点</div>
            </div>
          </div>
        </div>
      </div>
      <div class="grid g3 mt-m">
        <div class="card"><h4 style="color:#fff;font-size:14px">Flowable 7.0</h4><p class="dim">核心流程引擎</p></div>
        <div class="card"><h4 style="color:#fff;font-size:14px">信创数据库兼容</h4><p class="dim">DM8 / KingBase / OpenGauss</p></div>
        <div class="card"><h4 style="color:#fff;font-size:14px">动态表单</h4><p class="dim">节点级只读/编辑/隐藏权限</p></div>
      </div>
    </section>
  
    <!-- ====== 8. Global & System Business ====== -->
    <section class="slide" data-title="Business · Global & System">
      <p class="kicker">global · system · infra</p>
      <h2 class="h2">业务支撑域:<br>公共服务与系统管理</h2>
      <div class="grid g2 mt-l" style="align-items:start;gap:20px">
        <div>
          <h4 style="color:var(--accent-2);font-family:'JetBrains Mono',monospace;font-size:13px;margin-bottom:12px">🌐 Global 全局模块</h4>
          <div class="stack">
            <div class="card card-accent" style="padding:14px 16px"><h4 style="font-size:14px">问题上报管理</h4><p class="dim" style="font-size:11px">公共问题发现 → 流转到工单系统</p></div>
            <div class="card card-accent" style="padding:14px 16px"><h4 style="font-size:14px">道路信息管理</h4><p class="dim" style="font-size:11px">道路基础数据维护</p></div>
            <div class="card card-accent" style="padding:14px 16px"><h4 style="font-size:14px">工单提交详情</h4><p class="dim" style="font-size:11px">跨模块工单数据聚合视图</p></div>
            <div class="card card-accent" style="padding:14px 16px"><h4 style="font-size:14px">流程路径想法</h4><p class="dim" style="font-size:11px">流程优化建议收集</p></div>
          </div>
        </div>
        <div>
          <h4 style="color:#d2a8ff;font-family:'JetBrains Mono',monospace;font-size:13px;margin-bottom:12px">⚙️ System + Infra 模块</h4>
          <div class="stack">
            <div class="card" style="padding:14px 16px;border-top:2px solid var(--accent-2)"><h4 style="font-size:14px">RBAC 权限体系</h4><p class="dim" style="font-size:11px">用户 → 角色 → 菜单 → 按钮权限 · 数据权限</p></div>
            <div class="card" style="padding:14px 16px;border-top:2px solid var(--accent-2)"><h4 style="font-size:14px">SaaS 多租户</h4><p class="dim" style="font-size:11px">租户管理 · 套餐配置 · 数据隔离 · 透明化封装</p></div>
            <div class="card" style="padding:14px 16px;border-top:2px solid var(--accent-2)"><h4 style="font-size:14px">代码生成器</h4><p class="dim" style="font-size:11px">一键生成 Java · Vue · SQL · 接口文档</p></div>
            <div class="card" style="padding:14px 16px;border-top:2px solid var(--accent-2)"><h4 style="font-size:14px">消息通知中心</h4><p class="dim" style="font-size:11px">短信 · 邮件 · 站内信 · 多通道</p></div>
          </div>
        </div>
      </div>
    </section>
  
    <!-- ====== 9. Tech Stack Layers (from file1) ====== -->
    <section class="slide" data-title="Tech Stack Layers">
      <p class="kicker">tech-stack · layers</p>
      <h2 class="h2">技术栈七层全景</h2>
      <div class="layer-stack">
        <div class="layer"><div class="layer-label">前端</div><div class="layer-content"><span class="tag">Vue 3</span><span class="tag">Element Plus</span><span class="tag">Vben Admin</span><span class="tag">uni-app</span><span class="tag">TypeScript</span></div></div>
        <div class="layer"><div class="layer-label">网关 & 接入</div><div class="layer-content"><span class="tag">Vert.x</span><span class="tag">MQTT</span><span class="tag">HTTP/2</span><span class="tag">TCP</span><span class="tag">WebSocket</span></div></div>
        <div class="layer"><div class="layer-label">业务框架</div><div class="layer-content"><span class="tag">Spring Boot 3.5</span><span class="tag">Spring Security</span><span class="tag">Flowable 7</span><span class="tag">Quartz</span><span class="tag">Spring AI</span><span class="tag">PF4J</span></div></div>
        <div class="layer"><div class="layer-label">数据层</div><div class="layer-content"><span class="tag">MyBatis Plus</span><span class="tag">Druid</span><span class="tag">MySQL 8</span><span class="tag">Redis Sentinel</span><span class="tag">Redisson</span><span class="tag">Dynamic DS</span></div></div>
        <div class="layer"><div class="layer-label">消息 & 集成</div><div class="layer-content"><span class="tag">RocketMQ</span><span class="tag">Kafka</span><span class="tag">RabbitMQ</span><span class="tag">JustAuth</span><span class="tag">UAA SSO</span><span class="tag">S3</span></div></div>
        <div class="layer"><div class="layer-label">可观测性</div><div class="layer-content"><span class="tag">SkyWalking</span><span class="tag">SBA Admin</span><span class="tag">OpenTracing</span><span class="tag">Actuator</span><span class="tag">Knife4j</span></div></div>
        <div class="layer"><div class="layer-label">部署 & DevOps</div><div class="layer-content"><span class="tag">Docker</span><span class="tag">docker-compose</span><span class="tag">Eclipse Temurin 21</span><span class="tag">Maven</span><span class="tag">Git</span></div></div>
      </div>
    </section>
  
    <!-- ====== 10. System Architecture Overview SVG (from file1 slide 4) ====== -->
    <section class="slide" data-title="System Architecture Overview">
      <p class="kicker">architecture · system-overview</p>
      <h2 class="h2">系统架构总览 — 五层全景</h2>
      <div class="svg-area">
        <svg viewBox="0 0 1000 460" xmlns="http://www.w3.org/2000/svg">
          <defs>
            <linearGradient id="gAccent" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#38bdf8"/><stop offset="100%" stop-color="#818cf8"/></linearGradient>
            <linearGradient id="gGreen" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#34d399"/><stop offset="100%" stop-color="#22c55e"/></linearGradient>
            <linearGradient id="gPink" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#f472b6"/><stop offset="100%" stop-color="#e879f9"/></linearGradient>
            <filter id="shadow"><feDropShadow dx="0" dy="2" stdDeviation="4" flood-opacity="0.3"/></filter>
          </defs>
          <rect x="30" y="10" width="940" height="60" rx="10" fill="#161b22" stroke="#1e2d45" stroke-width="1.5"/>
          <text x="500" y="35" text-anchor="middle" fill="#8b949e" font-size="12" font-weight="600">接入层 CLIENT LAYER</text>
          <rect x="60" y="42" width="100" height="22" rx="6" fill="rgba(56,189,248,.12)" stroke="#38bdf8" stroke-width="1"/><text x="110" y="57" text-anchor="middle" fill="#38bdf8" font-size="10">Vue 3 Web</text>
          <rect x="180" y="42" width="100" height="22" rx="6" fill="rgba(56,189,248,.12)" stroke="#38bdf8" stroke-width="1"/><text x="230" y="57" text-anchor="middle" fill="#38bdf8" font-size="10">uni-app 小程序</text>
          <rect x="300" y="42" width="100" height="22" rx="6" fill="rgba(129,140,248,.12)" stroke="#818cf8" stroke-width="1"/><text x="350" y="57" text-anchor="middle" fill="#818cf8" font-size="10">IoT 设备</text>
          <rect x="420" y="42" width="100" height="22" rx="6" fill="rgba(129,140,248,.12)" stroke="#818cf8" stroke-width="1"/><text x="470" y="57" text-anchor="middle" fill="#818cf8" font-size="10">第三方系统</text>
          <line x1="500" y1="70" x2="500" y2="90" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="4,3"/>
  
          <rect x="30" y="90" width="940" height="80" rx="10" fill="#161b22" stroke="#1e2d45" stroke-width="1.5"/>
          <text x="500" y="115" text-anchor="middle" fill="#8b949e" font-size="12" font-weight="600">网关与接入 GATEWAY LAYER</text>
          <rect x="60" y="127" width="200" height="32" rx="8" fill="rgba(56,189,248,.1)" stroke="#38bdf8" stroke-width="1.5" filter="url(#shadow)"/><text x="160" y="147" text-anchor="middle" fill="#38bdf8" font-size="11" font-weight="600">UrbanOps Server :48081</text>
          <rect x="300" y="127" width="200" height="32" rx="8" fill="rgba(52,211,153,.1)" stroke="#34d399" stroke-width="1.5" filter="url(#shadow)"/><text x="400" y="147" text-anchor="middle" fill="#34d399" font-size="11" font-weight="600">IoT 网关 :8092 (独立部署)</text>
          <rect x="540" y="127" width="180" height="32" rx="8" fill="rgba(129,140,248,.1)" stroke="#818cf8" stroke-width="1.5" filter="url(#shadow)"/><text x="630" y="147" text-anchor="middle" fill="#818cf8" font-size="11" font-weight="600">UAA SSO :28201</text>
          <line x1="500" y1="170" x2="500" y2="190" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="4,3"/>
  
          <rect x="30" y="190" width="940" height="130" rx="10" fill="#161b22" stroke="#1e2d45" stroke-width="1.5"/>
          <text x="500" y="215" text-anchor="middle" fill="#8b949e" font-size="12" font-weight="600">业务模块层 BUSINESS MODULES</text>
          <rect x="50" y="228" width="145" height="42" rx="8" fill="rgba(56,189,248,.1)" stroke="#38bdf8" stroke-width="1.5"/><text x="122" y="246" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">system</text><text x="122" y="260" text-anchor="middle" fill="#8b949e" font-size="9">用户·权限·租户</text>
          <rect x="210" y="228" width="145" height="42" rx="8" fill="rgba(129,140,248,.1)" stroke="#818cf8" stroke-width="1.5"/><text x="282" y="246" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">garden</text><text x="282" y="260" text-anchor="middle" fill="#8b949e" font-size="9">园林养护·巡检</text>
          <rect x="370" y="228" width="145" height="42" rx="8" fill="rgba(52,211,153,.1)" stroke="#34d399" stroke-width="1.5"/><text x="442" y="246" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">workorder</text><text x="442" y="260" text-anchor="middle" fill="#8b949e" font-size="9">工单·调度</text>
          <rect x="530" y="228" width="145" height="42" rx="8" fill="rgba(244,114,182,.1)" stroke="#f472b6" stroke-width="1.5"/><text x="602" y="246" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">bpm</text><text x="602" y="260" text-anchor="middle" fill="#8b949e" font-size="9">Flowable 流程</text>
          <rect x="690" y="228" width="145" height="42" rx="8" fill="rgba(251,191,36,.1)" stroke="#fbbf24" stroke-width="1.5"/><text x="762" y="246" text-anchor="middle" fill="#e2e8f0" font-size="10" font-weight="600">gloabl</text><text x="762" y="260" text-anchor="middle" fill="#8b949e" font-size="9">全域运营</text>
          <rect x="250" y="280" width="500" height="30" rx="8" fill="rgba(255,255,255,.03)" stroke="#334155" stroke-width="1" stroke-dasharray="4,3"/><text x="500" y="299" text-anchor="middle" fill="#8b949e" font-size="10">API 契约层: garden-api · workorder-api (接口定义 + Feign 风格调用)</text>
          <line x1="500" y1="320" x2="500" y2="340" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="4,3"/>
  
          <rect x="30" y="340" width="940" height="50" rx="10" fill="#161b22" stroke="#1e2d45" stroke-width="1.5"/>
          <text x="500" y="370" text-anchor="middle" fill="#8b949e" font-size="11" font-weight="600">基础设施层 INFRASTRUCTURE: 15个Spring Boot Starter (Web · Security · MyBatis · Redis · MQ · Job · Excel · WebSocket · Monitor · Protection · Tenant · DataPermission · IP · Test)</text>
          <line x1="500" y1="390" x2="500" y2="408" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="4,3"/>
  
          <rect x="30" y="408" width="940" height="45" rx="10" fill="#0d1117" stroke="#1e2d45" stroke-width="1.5"/>
          <text x="500" y="435" text-anchor="middle" fill="#8b949e" font-size="11" font-weight="600">数据层: MySQL 8 · Redis Sentinel · RocketMQ · Kafka · RabbitMQ · S3 · Druid · Redisson</text>
        </svg>
      </div>
    </section>
  
    <!-- ====== 11. Module Dependencies SVG (from file1 slide 5) ====== -->
    <section class="slide" data-title="Module Dependencies">
      <p class="kicker">modules · dependency-graph</p>
      <h2 class="h2">模块依赖关系图</h2>
      <div class="svg-area">
        <svg viewBox="0 0 1000 440" xmlns="http://www.w3.org/2000/svg">
          <defs>
            <marker id="arrowBlue" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#38bdf8"/></marker>
            <marker id="arrowGray" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#64748b"/></marker>
          </defs>
          <rect x="350" y="8" width="300" height="38" rx="10" fill="rgba(251,191,36,.1)" stroke="#fbbf24" stroke-width="2"/><text x="500" y="32" text-anchor="middle" fill="#fbbf24" font-size="13" font-weight="700">urbanops-dependencies (BOM)</text>
          <line x1="500" y1="46" x2="500" y2="70" stroke="#fbbf24" stroke-width="1.5" marker-end="url(#arrowBlue)"/>
  
          <rect x="80" y="72" width="840" height="58" rx="10" fill="#161b22" stroke="#1e2d45" stroke-width="1.5"/>
          <text x="500" y="94" text-anchor="middle" fill="#8b949e" font-size="11" font-weight="600">urbanops-framework</text>
          <text x="500" y="113" text-anchor="middle" fill="#64748b" font-size="9">common · web · security · mybatis · redis · mq · job · excel · websocket · monitor · protection · tenant · data-permission · ip · test</text>
  
          <line x1="300" y1="130" x2="300" y2="155" stroke="#64748b" stroke-width="1.2" marker-end="url(#arrowGray)"/>
          <line x1="500" y1="130" x2="500" y2="155" stroke="#64748b" stroke-width="1.2" marker-end="url(#arrowGray)"/>
          <line x1="700" y1="130" x2="700" y2="155" stroke="#64748b" stroke-width="1.2" marker-end="url(#arrowGray)"/>
  
          <rect x="210" y="158" width="180" height="40" rx="8" fill="rgba(99,102,241,.12)" stroke="#6366f1" stroke-width="1.5"/><text x="300" y="183" text-anchor="middle" fill="#a5b4fc" font-size="12" font-weight="600">module-infra</text>
          <rect x="410" y="158" width="180" height="40" rx="8" fill="rgba(56,189,248,.12)" stroke="#38bdf8" stroke-width="1.5"/><text x="500" y="183" text-anchor="middle" fill="#38bdf8" font-size="12" font-weight="600">module-system</text>
          <rect x="610" y="158" width="180" height="40" rx="8" fill="rgba(251,191,36,.12)" stroke="#fbbf24" stroke-width="1.5"/><text x="700" y="183" text-anchor="middle" fill="#fbbf24" font-size="12" font-weight="600">module-gloabl</text>
  
          <line x1="300" y1="198" x2="300" y2="230" stroke="#64748b" stroke-width="1.2" marker-end="url(#arrowGray)"/>
          <line x1="500" y1="198" x2="360" y2="230" stroke="#38bdf8" stroke-width="1.2"/>
          <line x1="500" y1="198" x2="640" y2="230" stroke="#38bdf8" stroke-width="1.2"/>
  
          <rect x="210" y="233" width="180" height="40" rx="8" fill="rgba(244,114,182,.12)" stroke="#f472b6" stroke-width="1.5"/><text x="300" y="258" text-anchor="middle" fill="#f472b6" font-size="12" font-weight="600">module-bpm</text>
          <rect x="85" y="308" width="200" height="40" rx="8" fill="rgba(52,211,153,.12)" stroke="#34d399" stroke-width="2"/><text x="185" y="333" text-anchor="middle" fill="#34d399" font-size="12" font-weight="600">module-garden</text>
          <rect x="420" y="308" width="200" height="40" rx="8" fill="rgba(52,211,153,.12)" stroke="#34d399" stroke-width="2"/><text x="520" y="333" text-anchor="middle" fill="#34d399" font-size="12" font-weight="600">module-workorder</text>
          <rect x="680" y="308" width="220" height="40" rx="8" fill="rgba(129,140,248,.08)" stroke="#818cf8" stroke-width="1" stroke-dasharray="5,3"/><text x="790" y="333" text-anchor="middle" fill="#818cf8" font-size="11" font-weight="600">module-api (契约层)</text>
  
          <line x1="240" y1="273" x2="185" y2="307" stroke="#f472b6" stroke-width="1.2" marker-end="url(#arrowGray)"/>
          <line x1="360" y1="273" x2="520" y2="307" stroke="#f472b6" stroke-width="1.2" marker-end="url(#arrowGray)"/>
          <line x1="285" y1="330" x2="420" y2="330" stroke="#818cf8" stroke-width="1" stroke-dasharray="5,3" marker-end="url(#arrowGray)"/>
          <line x1="620" y1="330" x2="680" y2="330" stroke="#818cf8" stroke-width="1" stroke-dasharray="5,3" marker-end="url(#arrowGray)"/>
  
          <rect x="420" y="380" width="220" height="40" rx="8" fill="rgba(239,68,68,.12)" stroke="#ef4444" stroke-width="1.5" stroke-dasharray="6,3"/><text x="530" y="405" text-anchor="middle" fill="#ef4444" font-size="12" font-weight="600">IoT 网关 (独立进程 :8092)</text>
          <line x1="620" y1="348" x2="560" y2="379" stroke="#ef4444" stroke-width="1" stroke-dasharray="5,3"/>
  
          <rect x="30" y="415" width="12" height="12" rx="2" fill="none" stroke="#34d399" stroke-width="1.5"/><text x="48" y="425" fill="#64748b" font-size="9">核心业务域</text>
          <rect x="150" y="415" width="12" height="12" rx="2" fill="none" stroke="#38bdf8" stroke-width="1.5"/><text x="168" y="425" fill="#64748b" font-size="9">基础服务</text>
          <rect x="260" y="415" width="12" height="12" rx="2" fill="none" stroke="#ef4444" stroke-width="1.5" stroke-dasharray="3,2"/><text x="278" y="425" fill="#64748b" font-size="9">独立部署</text>
          <line x1="370" y1="421" x2="400" y2="421" stroke="#818cf8" stroke-width="1" stroke-dasharray="5,3"/><text x="408" y="425" fill="#64748b" font-size="9">API 契约调用</text>
        </svg>
      </div>
    </section>
  
    <!-- ====== 12. Tech Architecture 5-Layer Model ====== -->
    <section class="slide" data-title="Tech Architecture">
      <p class="kicker">architecture · layers</p>
      <h2 class="h2">技术架构五层模型</h2>
      <p class="lede">从用户端到底层基础设施,清晰分层、逐级解耦。</p>
      <div class="arch-layers anim-stagger-list" data-anim-target>
        <div class="al fw"><div class="al-name" style="color:var(--accent-2)">接入层</div>
          <div class="al-cells" style="grid-template-columns:repeat(4,1fr)">
            <div class="acell"><div class="aci">🖥️</div><h4>Web Admin</h4><p>Vue3 + Element Plus</p></div>
            <div class="acell"><div class="aci">📱</div><h4>Mobile App</h4><p>uni-app 跨端</p></div>
            <div class="acell"><div class="aci">📊</div><h4>大屏展示</h4><p>GoView 可视化</p></div>
            <div class="acell"><div class="aci">🔗</div><h4>开放 API</h4><p>第三方对接</p></div>
          </div>
        </div>
        <div class="al fw"><div class="al-name" style="color:var(--accent-2)">网关层</div>
          <div class="al-cells" style="grid-template-columns:repeat(4,1fr)">
            <div class="acell"><div class="aci">🔐</div><h4>认证鉴权</h4><p>Spring Security + Token</p></div>
            <div class="acell"><div class="aci">🚪</div><h4>路由转发</h4><p>Nginx / Gateway</p></div>
            <div class="acell"><div class="aci">⚖️</div><h4>负载均衡</h4><p>多实例分发</p></div>
            <div class="acell"><div class="aci">🛡️</div><h4>安全防护</h4><p>XSS / CSRF / SQL注入</p></div>
          </div>
        </div>
        <div class="al hl"><div class="al-name">服务层</div>
          <div class="al-cells" style="grid-template-columns:repeat(6,1fr)">
            <div class="acell"><div class="aci">🌳</div><h4>Garden</h4><p>园林管理</p></div>
            <div class="acell"><div class="aci">📋</div><h4>Workorder</h4><p>工单调度</p></div>
            <div class="acell"><div class="aci">🔄</div><h4>BPM</h4><p>工作流</p></div>
            <div class="acell"><div class="aci">🌐</div><h4>Global</h4><p>全局服务</p></div>
            <div class="acell"><div class="aci">⚙️</div><h4>System</h4><p>系统管理</p></div>
            <div class="acell"><div class="aci">🏗️</div><h4>Infra</h4><p>基础设施</p></div>
          </div>
        </div>
        <div class="al"><div class="al-name">中间件</div>
          <div class="al-cells" style="grid-template-columns:repeat(5,1fr)">
            <div class="acell"><div class="aci">🗄️</div><h4>MySQL</h4><p>OLTP</p></div>
            <div class="acell"><div class="aci"></div><h4>Redis</h4><p>缓存/锁</p></div>
            <div class="acell"><div class="aci">📨</div><h4>RocketMQ</h4><p>消息队列</p></div>
            <div class="acell"><div class="aci">🔍</div><h4>Elasticsearch</h4><p>全文检索</p></div>
            <div class="acell"><div class="aci">📡</div><h4>TDengine</h4><p>时序数据</p></div>
          </div>
        </div>
      </div>
    </section>
  
    <!-- ====== 13. Backend Layered Architecture ====== -->
    <section class="slide" data-title="Backend Architecture">
      <p class="kicker">backend · layered</p>
      <h2 class="h2">后端分层架构:<br>Controller → Service → DAL 三层解耦</h2>
      <div class="grid g2 mt-l" style="align-items:start;gap:20px">
        <div class="stack">
          <div class="card card-accent" style="padding:16px"><h4 style="font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--accent)">controller/</h4><p class="dim" style="font-size:12px;margin-bottom:6px">接收请求、参数校验、VO 转换</p><div class="biz-tags"><span>admin/</span><span>app/</span><span>VO 对象</span><span>@Valid</span></div></div>
          <div class="card card-accent" style="padding:16px"><h4 style="font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--accent)">service/</h4><p class="dim" style="font-size:12px;margin-bottom:6px">业务逻辑编排、事务管理、策略模式</p><div class="biz-tags"><span>接口+实现</span><span>@Transactional</span><span>策略</span><span>Listener</span></div></div>
          <div class="card card-accent" style="padding:16px"><h4 style="font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--accent)">dal/</h4><p class="dim" style="font-size:12px;margin-bottom:6px">数据访问层:MySQL Mapper + Redis Cache</p><div class="biz-tags"><span>mysql/</span><span>redis/</span><span>dataobject/</span></div></div>
        </div>
        <div class="stack">
          <div class="card" style="padding:16px;border-top:2px solid var(--accent-2)"><h4 style="font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--accent-2)">convert/</h4><p class="dim" style="font-size:12px">MapStruct 对象转换层,编译期生成高性能映射代码</p></div>
          <div class="card" style="padding:16px;border-top:2px solid var(--accent-2)"><h4 style="font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--accent-2)">api/</h4><p class="dim" style="font-size:12px">模块间 Feign 接口定义 + DTO,实现跨模块调用</p></div>
          <div class="card" style="padding:16px;border-top:2px solid var(--accent-2)"><h4 style="font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--accent-2)">mq/ + job/</h4><p class="dim" style="font-size:12px">异步消息(producer/consumer)+ 定时任务调度</p></div>
          <div class="card" style="padding:16px;border-top:2px solid var(--accent-2)"><h4 style="font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--accent-2)">framework/</h4><p class="dim" style="font-size:12px">模块内框架代码:数据权限配置、Web 配置、操作日志等</p></div>
        </div>
      </div>
    </section>
  
    <!-- ====== 14. Framework Infrastructure ====== -->
    <section class="slide" data-title="Framework Infrastructure">
      <p class="kicker">framework · starters</p>
      <h2 class="h2">基础设施层:<br>15 个 Spring Boot Starter</h2>
      <p class="lede">将通用能力抽象为可复用的 Starter 组件,所有业务模块按需引入。</p>
      <div class="fw-grid">
        <div class="fw-card hl anim-fade-up" data-anim="fade-up"><div class="fwi">🌐</div><h4>web</h4><p>全局异常处理 · 统一返回 · CORS · Swagger</p></div>
        <div class="fw-card hl anim-fade-up" data-anim="fade-up" style="animation-delay:.05s"><div class="fwi">🔐</div><h4>security</h4><p>Spring Security · Token 鉴权 · SSO</p></div>
        <div class="fw-card hl anim-fade-up" data-anim="fade-up" style="animation-delay:.1s"><div class="fwi">🗄️</div><h4>mybatis</h4><p>MyBatis Plus · 多数据源 · 联表查询</p></div>
        <div class="fw-card hl anim-fade-up" data-anim="fade-up" style="animation-delay:.15s"><div class="fwi"></div><h4>redis</h4><p>Redisson · 分布式锁 · 缓存策略</p></div>
        <div class="fw-card hl anim-fade-up" data-anim="fade-up" style="animation-delay:.2s"><div class="fwi">📨</div><h4>mq</h4><p>RocketMQ 集成 · 消息幂等 · 重试</p></div>
        <div class="fw-card hl anim-fade-up" data-anim="fade-up" style="animation-delay:.25s"><div class="fwi">🛡️</div><h4>protection</h4><p>分布式锁 · 幂等 · 限流 · 熔断</p></div>
        <div class="fw-card anim-fade-up" data-anim="fade-up" style="animation-delay:.3s"><div class="fwi">📊</div><h4>monitor</h4><p>SkyWalking · Admin · 日志中心</p></div>
        <div class="fw-card anim-fade-up" data-anim="fade-up" style="animation-delay:.35s"><div class="fwi"></div><h4>job</h4><p>Quartz 定时任务 · 执行日志</p></div>
        <div class="fw-card anim-fade-up" data-anim="fade-up" style="animation-delay:.4s"><div class="fwi">📝</div><h4>excel</h4><p>FastExcel 导入导出</p></div>
        <div class="fw-card anim-fade-up" data-anim="fade-up" style="animation-delay:.45s"><div class="fwi">🔌</div><h4>websocket</h4><p>实时通信 · Token 校验 · 集群</p></div>
        <div class="fw-card anim-fade-up" data-anim="fade-up" style="animation-delay:.5s"><div class="fwi">🏢</div><h4>biz-tenant</h4><p>多租户数据隔离 · 透明封装</p></div>
        <div class="fw-card anim-fade-up" data-anim="fade-up" style="animation-delay:.55s"><div class="fwi">🔒</div><h4>biz-data-permission</h4><p>数据权限 · 行级过滤</p></div>
      </div>
    </section>
  
    <!-- ====== 15. Core Tech Stack Grid ====== -->
    <section class="slide" data-title="Tech Stack Grid">
      <p class="kicker">tech-stack · ecosystem</p>
      <h2 class="h2">核心技术栈全景</h2>
      <div class="tg">
        <div class="tgc anim-fade-up" data-anim="fade-up"><div class="tgci"></div><h4>核心框架</h4><div class="tgt"><span>Spring Boot 3.5.5</span><span>Spring MVC 6.x</span><span>Spring Security 6.x</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.05s"><div class="tgci">🗄️</div><h4>持久层</h4><div class="tgt"><span>MyBatis Plus 3.5.14</span><span>Druid 1.2.27</span><span>Dynamic-DS 4.3.1</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.1s"><div class="tgci"></div><h4>缓存 &</h4><div class="tgt"><span>Redis 7.x</span><span>Redisson 3.51</span><span>Lock4j 2.2.7</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.15s"><div class="tgci">📨</div><h4>消息队列</h4><div class="tgt"><span>RocketMQ</span><span>Spring-RocketMQ</span><span>Redis Stream</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.2s"><div class="tgci">🔄</div><h4>工作流</h4><div class="tgt"><span>Flowable 7.0.1</span><span>BPMN 2.0</span><span>SIMPLE 设计器</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.25s"><div class="tgci">📡</div><h4>IoT & 通信</h4><div class="tgt"><span>Vert.x 4.5.13</span><span>Netty 4.2.4</span><span>MQTT 1.2.5</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.3s"><div class="tgci">🔍</div><h4>可观测性</h4><div class="tgt"><span>SkyWalking 9.5</span><span>Admin 3.5.2</span><span>OpenTracing</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.35s"><div class="tgci">📋</div><h4>API 文档</h4><div class="tgt"><span>Springdoc 2.8.11</span><span>Knife4j 4.5.0</span><span>Swagger 3</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.4s"><div class="tgci">🔌</div><h4>插件 & 工具</h4><div class="tgt"><span>PF4J 0.9.0</span><span>MapStruct 1.6.3</span><span>Hutool 5.8+6.0</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.45s"><div class="tgci">🧪</div><h4>测试</h4><div class="tgt"><span>JUnit 5</span><span>Mockito 5.x</span><span>Jedis-Mock</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.5s"><div class="tgci">🗄️</div><h4>多数据库</h4><div class="tgt"><span>MySQL 8.x</span><span>DM8</span><span>KingBase</span><span>OpenGauss</span></div></div>
        <div class="tgc anim-fade-up" data-anim="fade-up" style="animation-delay:.55s"><div class="tgci">🐳</div><h4>部署运维</h4><div class="tgt"><span>Docker</span><span>K8s</span><span>Jenkins</span><span>Harbor</span></div></div>
      </div>
    </section>
  
    <!-- ====== 16. Data Flow & Communication SVG (from file1 slide 7) ====== -->
    <section class="slide" data-title="Data Flow & Communication">
      <p class="kicker">data-flow · communication</p>
      <h2 class="h2">数据流与通信架构</h2>
      <div class="svg-area">
        <svg viewBox="0 0 1000 420" xmlns="http://www.w3.org/2000/svg">
          <defs>
            <marker id="arrGreen" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#34d399"/></marker>
            <marker id="arrBlue2" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#38bdf8"/></marker>
            <marker id="arrPink" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#f472b6"/></marker>
            <marker id="arrYellow" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#fbbf24"/></marker>
          </defs>
          <rect x="350" y="160" width="300" height="60" rx="14" fill="rgba(56,189,248,.12)" stroke="#38bdf8" stroke-width="2.5" filter="url(#shadow)"/><text x="500" y="187" text-anchor="middle" fill="#e2e8f0" font-size="15" font-weight="700">UrbanOps Server</text><text x="500" y="205" text-anchor="middle" fill="#8b949e" font-size="10">核心业务处理引擎</text>
  
          <rect x="60" y="60" width="160" height="50" rx="10" fill="rgba(59,130,246,.12)" stroke="#3b82f6" stroke-width="1.5"/><text x="140" y="82" text-anchor="middle" fill="#60a5fa" font-size="12" font-weight="600">MySQL 8</text><text x="140" y="98" text-anchor="middle" fill="#8b949e" font-size="9">主从 + Druid 连接池</text>
          <line x1="220" y1="85" x2="348" y2="175" stroke="#3b82f6" stroke-width="1.2" stroke-dasharray="6,3" marker-end="url(#arrBlue2)"/>
  
          <rect x="60" y="150" width="160" height="50" rx="10" fill="rgba(239,68,68,.12)" stroke="#ef4444" stroke-width="1.5"/><text x="140" y="172" text-anchor="middle" fill="#f87171" font-size="12" font-weight="600">Redis Sentinel</text><text x="140" y="188" text-anchor="middle" fill="#8b949e" font-size="9">缓存 · 分布式锁 · Token</text>
          <line x1="220" y1="175" x2="348" y2="180" stroke="#ef4444" stroke-width="1.2" stroke-dasharray="6,3" marker-end="url(#arrBlue2)"/>
  
          <rect x="60" y="240" width="160" height="50" rx="10" fill="rgba(52,211,153,.12)" stroke="#34d399" stroke-width="1.5"/><text x="140" y="262" text-anchor="middle" fill="#4ade80" font-size="12" font-weight="600">MQ 消息队列</text><text x="140" y="278" text-anchor="middle" fill="#8b949e" font-size="9">RocketMQ · Kafka · RabbitMQ</text>
          <line x1="220" y1="265" x2="348" y2="195" stroke="#34d399" stroke-width="1.2" stroke-dasharray="6,3" marker-end="url(#arrGreen)"/>
  
          <rect x="740" y="60" width="200" height="50" rx="10" fill="rgba(244,114,182,.12)" stroke="#f472b6" stroke-width="1.5"/><text x="840" y="82" text-anchor="middle" fill="#f472b6" font-size="12" font-weight="600">IoT 网关 :8092</text><text x="840" y="98" text-anchor="middle" fill="#8b949e" font-size="9">Vert.x · MQTT · TCP</text>
          <line x1="740" y1="85" x2="652" y2="175" stroke="#f472b6" stroke-width="1.2" stroke-dasharray="6,3" marker-end="url(#arrPink)"/>
  
          <rect x="740" y="160" width="200" height="50" rx="10" fill="rgba(251,191,36,.12)" stroke="#fbbf24" stroke-width="1.5"/><text x="840" y="182" text-anchor="middle" fill="#fbbf24" font-size="12" font-weight="600">IoT 设备层</text><text x="840" y="198" text-anchor="middle" fill="#8b949e" font-size="9">传感器 · GPS · 控制器</text>
          <line x1="740" y1="185" x2="940" y2="185" stroke="#fbbf24" stroke-width="1.2" stroke-dasharray="4,3"/>
          <line x1="840" y1="210" x2="840" y2="350" stroke="#fbbf24" stroke-width="1" stroke-dasharray="4,3"/>
  
          <rect x="740" y="240" width="200" height="50" rx="10" fill="rgba(129,140,248,.12)" stroke="#818cf8" stroke-width="1.5"/><text x="840" y="262" text-anchor="middle" fill="#a5b4fc" font-size="12" font-weight="600">对象存储 S3</text><text x="840" y="278" text-anchor="middle" fill="#8b949e" font-size="9">文件 · 图片 · 附件</text>
          <line x1="740" y1="265" x2="652" y2="205" stroke="#818cf8" stroke-width="1.2" stroke-dasharray="6,3" marker-end="url(#arrBlue2)"/>
  
          <rect x="60" y="330" width="160" height="50" rx="10" fill="rgba(244,114,182,.12)" stroke="#f472b6" stroke-width="1.5"/><text x="140" y="352" text-anchor="middle" fill="#f472b6" font-size="12" font-weight="600">Flowable 7</text><text x="140" y="368" text-anchor="middle" fill="#8b949e" font-size="9">工作流引擎</text>
          <line x1="220" y1="355" x2="348" y2="220" stroke="#f472b6" stroke-width="1.2" stroke-dasharray="6,3"/>
  
          <rect x="320" y="340" width="160" height="50" rx="10" fill="rgba(251,191,36,.12)" stroke="#fbbf24" stroke-width="1.5"/><text x="400" y="362" text-anchor="middle" fill="#fbbf24" font-size="12" font-weight="600">Quartz 调度</text><text x="400" y="378" text-anchor="middle" fill="#8b949e" font-size="9">定时任务集群</text>
          <line x1="480" y1="340" x2="500" y2="222" stroke="#fbbf24" stroke-width="1.2" stroke-dasharray="6,3"/>
  
          <rect x="560" y="340" width="190" height="50" rx="10" fill="rgba(56,189,248,.12)" stroke="#38bdf8" stroke-width="1.5"/><text x="655" y="362" text-anchor="middle" fill="#38bdf8" font-size="12" font-weight="600">WebSocket</text><text x="655" y="378" text-anchor="middle" fill="#8b949e" font-size="9">实时消息推送</text>
          <line x1="560" y1="365" x2="502" y2="222" stroke="#38bdf8" stroke-width="1.2" stroke-dasharray="6,3"/>
        </svg>
      </div>
    </section>
  
    <!-- ====== 17. Data Storage Strategy ====== -->
    <section class="slide" data-title="Data Storage">
      <p class="kicker">database · strategy</p>
      <h2 class="h2">数据存储策略:<br>多数据源 + 多数据库 + 读写分离</h2>
      <div class="grid g2 mt-l" style="align-items:start;gap:20px">
        <div>
          <div class="card card-accent" style="padding:22px"><h4 style="font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--accent)">Dynamic-Datasource 多数据源</h4>
            <div class="stack mt-m"><div class="tag"><span style="color:var(--accent)"></span> 一主多从读写分离</div><div class="tag"><span style="color:var(--accent)"></span> @DS 注解切换数据源</div><div class="tag"><span style="color:var(--accent)"></span> Druid 连接池监控</div></div></div>
          <div class="card" style="padding:22px;border-top:3px solid var(--accent-2);margin-top:12px"><h4 style="font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--accent-2)">Redis 缓存体系</h4>
            <div class="stack mt-m"><div class="tag">○ Redisson 分布式锁 · 幂等键</div><div class="tag">○ Redis Stream 轻量 MQ</div><div class="tag">○ Token 存储 & 在线用户管理</div></div></div>
        </div>
        <div>
          <div class="card" style="padding:22px;border-top:3px solid #d2a8ff"><h4 style="font-family:'JetBrains Mono',monospace;font-size:14px;color:#d2a8ff">多数据库兼容矩阵</h4>
            <div class="stack mt-m"><div class="tag"><span style="color:#d2a8ff"></span> MySQL 5.7/8.0+ — 主力库</div><div class="tag"><span style="color:#d2a8ff"></span> 达梦 DM8 — 国产信创</div><div class="tag"><span style="color:#d2a8ff"></span> 人大金仓 KingBase 8.6 — 信创</div><div class="tag"><span style="color:#d2a8ff"></span> OpenGauss 5.1 — 华为开源</div><div class="tag"><span style="color:#d2a8ff"></span> Oracle / PostgreSQL / SQL Server</div><div class="tag"><span style="color:#d2a8ff"></span> TDengine 3.7 — IoT 时序数据</div></div></div>
          <div class="card card-accent" style="padding:22px;margin-top:12px"><h4 style="font-size:14px;color:#fff">数据隔离策略</h4><p class="dim" style="font-size:12px">SaaS 多租户:共享数据表 + tenant_id 字段隔离,biz-tenant Starter 透明拦截 SQL</p></div>
        </div>
      </div>
    </section>
  
    <!-- ====== 18. Module Invocation Logic ====== -->
    <section class="slide" data-title="Invocation Logic">
      <p class="kicker">invocation · communication</p>
      <h2 class="h2">模块调用逻辑:三种通信通道</h2>
      <div class="invoc-flow mt-l">
        <div class="invoc-row"><div class="ir-label" style="color:var(--accent)">Feign API</div><div class="ir-items"><span>System → Dept API</span><span>System → User API</span><span>Workorder → Garden API</span><span>Garden → System API</span></div></div>
        <div class="ir-arrow">▼ 同步调用 · 模块间 RPC · 请求/响应模式 ▼</div>
        <div class="invoc-row"><div class="ir-label" style="color:var(--accent-2)">MQ 消息</div><div class="ir-items"><span>SMS Producer → Consumer</span><span>Mail Producer → Consumer</span><span>Event → 多消费者</span><span>RocketMQ Topic</span><span>Redis Stream</span></div></div>
        <div class="ir-arrow">▼ 异步解耦 · 事件驱动 · 最终一致性 ▼</div>
        <div class="invoc-row"><div class="ir-label" style="color:#d2a8ff">直接依赖</div><div class="ir-items"><span>Server → All Modules</span><span>Workorder → Garden Service</span><span>BPM → System User</span><span>Garden → Infra File</span></div></div>
      </div>
      <div class="grid g3 mt-l">
        <div class="card card-accent"><h4 style="font-size:14px">api/ 包设计</h4><p class="dim" style="font-size:12px">每个模块暴露 Feign 接口 + DTO,其他模块引入依赖即可调用,编译期类型安全。</p></div>
        <div class="card card-accent"><h4 style="font-size:14px">mq/ 包设计</h4><p class="dim" style="font-size:12px">Producer 发送消息,Consumer 消费处理。SMS / Mail 异步发送,不解耦主流程。</p></div>
        <div class="card card-accent"><h4 style="font-size:14px">service/ 直接注入</h4><p class="dim" style="font-size:12px">同模块内 Service 互相注入。跨模块通过 api 包或直接依赖。</p></div>
      </div>
    </section>
  
    <!-- ====== 19. Message & Async ====== -->
    <section class="slide" data-title="Message & Async">
      <p class="kicker">async · event-driven</p>
      <h2 class="h2">异步消息与事件驱动</h2>
      <div class="col2">
        <div><div class="card card-accent" style="padding:20px"><h4 style="color:#fff;margin:0 0 10px">RocketMQ 消息架构</h4>
          <div class="stack"><div class="tag">📤 Producer → Topic</div><div class="tag">📥 Consumer 拉取并处理</div><div class="tag">🔄 消费失败自动重试</div><div class="tag">⚡ 顺序消息: 全局/分区有序</div><div class="tag">🔒 事务消息: 分布式事务最终一致性</div></div></div></div>
        <div><div class="card" style="padding:20px;border-top:3px solid var(--accent-2)"><h4 style="color:#fff;margin:0 0 10px">典型异步场景</h4>
          <div class="stack"><div class="tag">📧 SMS → MQ → 消费者推送</div><div class="tag">📨 邮件 → MQ → 消费者投递</div><div class="tag">🔔 站内信 → Redis Stream 广播</div><div class="tag">📋 操作日志 → 异步记录</div><div class="tag">🔄 工单事件 → 通知园林模块</div></div></div></div>
      </div>
      <div class="grid g2 mt-m">
        <div class="card card-accent"><h4 style="font-size:14px">定时任务 (Quartz)</h4><p class="dim" style="font-size:12px">巡检计划自动生成 · 养护计划定时创建 · 数据统计报表 · 超时任务自动处理</p></div>
        <div class="card card-accent"><h4 style="font-size:14px">服务保障 (Protection)</h4><p class="dim" style="font-size:12px">@Lock4j 分布式锁防并发 · @Idempotent 幂等性 · @RateLimiter 限流保护 · 熔断降级</p></div>
      </div>
    </section>
  
    <!-- ====== 20. Security Architecture SVG (from file1 slide 8) ====== -->
    <section class="slide" data-title="Security Architecture">
      <p class="kicker">security · auth-flow</p>
      <h2 class="h2">安全与认证架构</h2>
      <div class="svg-area">
        <svg viewBox="0 0 1000 400" xmlns="http://www.w3.org/2000/svg">
          <rect x="30" y="30" width="120" height="60" rx="10" fill="rgba(56,189,248,.1)" stroke="#38bdf8" stroke-width="1.5"/><text x="90" y="55" text-anchor="middle" fill="#38bdf8" font-size="11" font-weight="600">客户端</text><text x="90" y="73" text-anchor="middle" fill="#8b949e" font-size="9">Web / 小程序 / App</text>
  
          <rect x="200" y="30" width="760" height="60" rx="10" fill="#161b22" stroke="#1e2d45" stroke-width="1.5"/><text x="580" y="52" text-anchor="middle" fill="#8b949e" font-size="11" font-weight="600">Security Filter Chain</text>
          <rect x="215" y="58" width="130" height="24" rx="6" fill="rgba(239,68,68,.12)" stroke="#ef4444" stroke-width="1"/><text x="280" y="74" text-anchor="middle" fill="#f87171" font-size="9">API 签名校验</text>
          <rect x="355" y="58" width="120" height="24" rx="6" fill="rgba(251,191,36,.12)" stroke="#fbbf24" stroke-width="1"/><text x="415" y="74" text-anchor="middle" fill="#fbbf24" font-size="9">限流 & 幂等</text>
          <rect x="485" y="58" width="120" height="24" rx="6" fill="rgba(56,189,248,.12)" stroke="#38bdf8" stroke-width="1"/><text x="545" y="74" text-anchor="middle" fill="#38bdf8" font-size="9">Token 认证</text>
          <rect x="615" y="58" width="100" height="24" rx="6" fill="rgba(129,140,248,.12)" stroke="#818cf8" stroke-width="1"/><text x="665" y="74" text-anchor="middle" fill="#a5b4fc" font-size="9">权限校验</text>
          <rect x="725" y="58" width="100" height="24" rx="6" fill="rgba(52,211,153,.12)" stroke="#34d399" stroke-width="1"/><text x="775" y="74" text-anchor="middle" fill="#4ade80" font-size="9">数据脱敏</text>
          <rect x="835" y="58" width="110" height="24" rx="6" fill="rgba(244,114,182,.12)" stroke="#f472b6" stroke-width="1"/><text x="890" y="74" text-anchor="middle" fill="#f472b6" font-size="9">操作日志</text>
          <line x1="150" y1="60" x2="198" y2="60" stroke="#38bdf8" stroke-width="2" marker-end="url(#arrBlue2)"/>
  
          <rect x="200" y="120" width="760" height="110" rx="10" fill="#161b22" stroke="#1e2d45" stroke-width="1.5"/><text x="580" y="145" text-anchor="middle" fill="#8b949e" font-size="11" font-weight="600">认证与授权中心</text>
          <rect x="220" y="155" width="200" height="42" rx="8" fill="rgba(56,189,248,.1)" stroke="#38bdf8" stroke-width="1.5"/><text x="320" y="174" text-anchor="middle" fill="#e2e8f0" font-size="11" font-weight="600">JWT Token</text><text x="320" y="189" text-anchor="middle" fill="#8b949e" font-size="9">Redis 存储 · 自动续期</text>
          <rect x="450" y="155" width="200" height="42" rx="8" fill="rgba(129,140,248,.1)" stroke="#818cf8" stroke-width="1.5"/><text x="550" y="174" text-anchor="middle" fill="#e2e8f0" font-size="11" font-weight="600">UAA SSO</text><text x="550" y="189" text-anchor="middle" fill="#8b949e" font-size="9">OAuth2 · 单点登录</text>
          <rect x="680" y="155" width="250" height="42" rx="8" fill="rgba(52,211,153,.1)" stroke="#34d399" stroke-width="1.5"/><text x="805" y="174" text-anchor="middle" fill="#e2e8f0" font-size="11" font-weight="600">JustAuth 社交登录</text><text x="805" y="189" text-anchor="middle" fill="#8b949e" font-size="9">钉钉 · 企业微信 · 小程序 · 公众号</text>
          <rect x="220" y="205" width="340" height="20" rx="5" fill="rgba(251,191,36,.08)" stroke="#fbbf24" stroke-width="0.8"/><text x="390" y="219" text-anchor="middle" fill="#fbbf24" font-size="9">多租户数据隔离 (SaaS)</text>
          <rect x="580" y="205" width="350" height="20" rx="5" fill="rgba(244,114,182,.08)" stroke="#f472b6" stroke-width="0.8"/><text x="755" y="219" text-anchor="middle" fill="#f472b6" font-size="9">部门/用户级数据权限 (RBAC + Data Scope)</text>
          <line x1="580" y1="230" x2="580" y2="260" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="5,3"/><text x="600" y="250" fill="#64748b" font-size="9">授权通过</text>
  
          <rect x="200" y="260" width="760" height="50" rx="10" fill="#0d1117" stroke="#1e2d45" stroke-width="1.5"/><text x="580" y="290" text-anchor="middle" fill="#8b949e" font-size="11" font-weight="600">业务模块: garden · workorder · bpm · gloabl · infra · system</text>
          <rect x="30" y="320" width="120" height="50" rx="10" fill="rgba(251,191,36,.08)" stroke="#fbbf24" stroke-width="1"/><text x="90" y="342" text-anchor="middle" fill="#fbbf24" font-size="11" font-weight="600">AJ Captcha</text><text x="90" y="358" text-anchor="middle" fill="#8b949e" font-size="9">滑块验证</text>
          <line x1="150" y1="345" x2="198" y2="285" stroke="#fbbf24" stroke-width="0.8" stroke-dasharray="4,3"/>
          <rect x="30" y="200" width="120" height="50" rx="10" fill="rgba(239,68,68,.08)" stroke="#ef4444" stroke-width="1"/><text x="90" y="222" text-anchor="middle" fill="#f87171" font-size="11" font-weight="600">API 加密</text><text x="90" y="238" text-anchor="middle" fill="#8b949e" font-size="9">AES 算法</text>
        </svg>
      </div>
    </section>
  
    <!-- ====== 21. Security & Auth Details ====== -->
    <section class="slide" data-title="Security & Auth">
      <p class="kicker">security · auth · tenant</p>
      <h2 class="h2">安全与权限体系详解</h2>
      <div class="grid g3 mt-l">
        <div class="card card-accent anim-fade-up" data-anim="fade-up" style="padding:22px"><h4 style="color:#fff;margin-bottom:8px">🔐 认证体系</h4><ul style="font-size:12px;color:var(--text-2);padding-left:16px;line-height:1.8;margin:0"><li>Spring Security 6.x 核心</li><li>Token + Redis 无状态会话</li><li>OAuth2 授权码模式</li><li>多终端(Web / App / 小程序)</li><li>SSO 单点登录</li><li>社交登录(JustAuth)</li></ul></div>
        <div class="card card-accent anim-fade-up" data-anim="fade-up" style="padding:22px;animation-delay:.1s"><h4 style="color:#fff;margin-bottom:8px">🛡️ 授权体系</h4><ul style="font-size:12px;color:var(--text-2);padding-left:16px;line-height:1.8;margin:0"><li>RBAC:用户 → 角色 → 菜单</li><li>按钮级别权限控制</li><li>动态菜单加载</li><li>Redis 缓存权限信息</li><li>数据权限:行级过滤</li><li>部门数据范围隔离</li></ul></div>
        <div class="card card-accent anim-fade-up" data-anim="fade-up" style="padding:22px;animation-delay:.2s"><h4 style="color:#fff;margin-bottom:8px">🏢 多租户</h4><ul style="font-size:12px;color:var(--text-2);padding-left:16px;line-height:1.8;margin:0"><li>tenant_id 字段隔离</li><li>MyBatis 拦截器自动注入</li><li>租户套餐权限定制</li><li>每个租户独立菜单/角色</li><li>透明化封装无侵入</li></ul></div>
      </div>
      <div class="code-text mt-l">SystemModule → Security Starter → Token + Redis → @PreAuthorize → DataPermission AOP → SQL Interceptor</div>
    </section>
  
    <!-- ====== 22. Observability ====== -->
    <section class="slide" data-title="Observability">
      <p class="kicker">observability · monitoring</p>
      <h2 class="h2">可观测性与监控体系</h2>
      <div class="grid g3 mt-l">
        <div class="card" style="padding:22px;border-top:3px solid var(--accent)"><h4 style="color:#fff;font-size:16px;margin-bottom:8px">📝 日志体系</h4><p class="dim" style="font-size:12px;line-height:1.7">Logback + SkyWalking Logback Appender,TraceId 自动注入</p><div class="biz-tags mt-s"><span>操作日志</span><span>登录日志</span><span>API 访问日志</span><span>错误日志</span></div></div>
        <div class="card" style="padding:22px;border-top:3px solid var(--accent-2)"><h4 style="color:#fff;font-size:16px;margin-bottom:8px">📊 指标监控</h4><p class="dim" style="font-size:12px;line-height:1.7">Spring Boot Admin + Druid SQL 监控 + Redis 监控面板</p><div class="biz-tags mt-s"><span>JVM 指标</span><span>连接池</span><span>QPS/RT</span><span>慢 SQL</span></div></div>
        <div class="card" style="padding:22px;border-top:3px solid #d2a8ff"><h4 style="color:#fff;font-size:16px;margin-bottom:8px">🔍 链路追踪</h4><p class="dim" style="font-size:12px;line-height:1.7">Apache SkyWalking 9.5 分布式追踪,服务拓扑自动发现</p><div class="biz-tags mt-s"><span>调用链</span><span>拓扑图</span><span>慢端点</span><span>告警</span></div></div>
      </div>
      <div class="grid g2 mt-m">
        <div class="card card-accent"><h4 style="font-size:14px">Monitor Starter 集成</h4><p class="dim" style="font-size:12px">SkyWalking · Admin Client · OpenTracing · 日志中心 · 一键接入</p></div>
        <div class="card card-accent"><h4 style="font-size:14px">保护机制</h4><p class="dim" style="font-size:12px">分布式锁 (Lock4j) · 幂等性保证 · 限流降级 · 异常全局处理 · 错误码统一管理</p></div>
      </div>
    </section>
  
    <!-- ====== 23. Deployment Architecture SVG (from file1 slide 9) ====== -->
    <section class="slide" data-title="Deployment Architecture SVG">
      <p class="kicker">deployment · docker</p>
      <h2 class="h2">部署架构 — Docker 容器化</h2>
      <div class="svg-area">
        <svg viewBox="0 0 1000 400" xmlns="http://www.w3.org/2000/svg">
          <rect x="20" y="20" width="960" height="360" rx="16" fill="#161b22" stroke="#1e2d45" stroke-width="2"/><text x="500" y="48" text-anchor="middle" fill="#64748b" font-size="13" font-weight="600">Docker Host</text>
  
          <rect x="50" y="65" width="290" height="160" rx="12" fill="rgba(56,189,248,.08)" stroke="#38bdf8" stroke-width="2"/><text x="195" y="92" text-anchor="middle" fill="#38bdf8" font-size="14" font-weight="700">urbanops-server</text><text x="195" y="110" text-anchor="middle" fill="#8b949e" font-size="10">Eclipse Temurin 21 JRE</text><text x="195" y="126" text-anchor="middle" fill="#64748b" font-size="9">-Xms512m -Xmx512m</text>
          <rect x="70" y="137" width="120" height="22" rx="5" fill="rgba(255,255,255,.04)" stroke="#334155" stroke-width="0.8"/><text x="130" y="152" text-anchor="middle" fill="#8b949e" font-size="9">Port 48081</text>
          <rect x="200" y="137" width="120" height="22" rx="5" fill="rgba(255,255,255,.04)" stroke="#334155" stroke-width="0.8"/><text x="260" y="152" text-anchor="middle" fill="#8b949e" font-size="9">Actuator /actuator</text>
          <rect x="70" y="165" width="250" height="22" rx="5" fill="rgba(255,255,255,.04)" stroke="#334155" stroke-width="0.8"/><text x="195" y="180" text-anchor="middle" fill="#8b949e" font-size="9">包含所有业务模块 (fat JAR)</text>
          <rect x="70" y="193" width="250" height="22" rx="5" fill="rgba(255,255,255,.04)" stroke="#334155" stroke-width="0.8"/><text x="195" y="208" text-anchor="middle" fill="#8b949e" font-size="9">SpringDoc /v3/api-docs · Knife4j</text>
  
          <rect x="370" y="65" width="260" height="160" rx="12" fill="rgba(239,68,68,.08)" stroke="#ef4444" stroke-width="2"/><text x="500" y="92" text-anchor="middle" fill="#f87171" font-size="14" font-weight="700">iot-gateway-server</text><text x="500" y="110" text-anchor="middle" fill="#8b949e" font-size="10">独立部署 · Vert.x 引擎</text>
          <rect x="390" y="122" width="220" height="22" rx="5" fill="rgba(255,255,255,.04)" stroke="#334155" stroke-width="0.8"/><text x="500" y="137" text-anchor="middle" fill="#8b949e" font-size="9">Port 8092</text>
          <rect x="390" y="150" width="220" height="22" rx="5" fill="rgba(255,255,255,.04)" stroke="#334155" stroke-width="0.8"/><text x="500" y="165" text-anchor="middle" fill="#8b949e" font-size="9">协议: MQTT · HTTP · TCP</text>
          <rect x="390" y="178" width="220" height="22" rx="5" fill="rgba(255,255,255,.04)" stroke="#334155" stroke-width="0.8"/><text x="500" y="193" text-anchor="middle" fill="#8b949e" font-size="9">设备接入 · 数据采集</text>
          <rect x="390" y="206" width="220" height="22" rx="5" fill="rgba(255,255,255,.04)" stroke="#334155" stroke-width="0.8"/><text x="500" y="221" text-anchor="middle" fill="#8b949e" font-size="9">HTTP RPC → Server :48080</text>
  
          <rect x="660" y="65" width="180" height="72" rx="10" fill="rgba(59,130,246,.08)" stroke="#3b82f6" stroke-width="1.5"/><text x="750" y="92" text-anchor="middle" fill="#60a5fa" font-size="12" font-weight="600">MySQL 8</text><text x="750" y="110" text-anchor="middle" fill="#8b949e" font-size="9">:3306</text><text x="750" y="125" text-anchor="middle" fill="#64748b" font-size="8">主从读写分离</text>
          <rect x="660" y="150" width="180" height="72" rx="10" fill="rgba(239,68,68,.08)" stroke="#ef4444" stroke-width="1.5"/><text x="750" y="177" text-anchor="middle" fill="#f87171" font-size="12" font-weight="600">Redis Sentinel</text><text x="750" y="195" text-anchor="middle" fill="#8b949e" font-size="9">:26379</text><text x="750" y="210" text-anchor="middle" fill="#64748b" font-size="8">高可用集群</text>
  
          <rect x="860" y="65" width="110" height="72" rx="10" fill="rgba(52,211,153,.08)" stroke="#34d399" stroke-width="1.5"/><text x="915" y="92" text-anchor="middle" fill="#4ade80" font-size="11" font-weight="600">RocketMQ</text><text x="915" y="110" text-anchor="middle" fill="#8b949e" font-size="9">:9876</text>
          <rect x="860" y="150" width="110" height="72" rx="10" fill="rgba(129,140,248,.08)" stroke="#818cf8" stroke-width="1.5"/><text x="915" y="177" text-anchor="middle" fill="#a5b4fc" font-size="11" font-weight="600">Kafka</text><text x="915" y="195" text-anchor="middle" fill="#8b949e" font-size="9">:9092</text>
  
          <rect x="660" y="240" width="310" height="40" rx="10" fill="rgba(251,191,36,.08)" stroke="#fbbf24" stroke-width="1.5"/><text x="815" y="265" text-anchor="middle" fill="#fbbf24" font-size="11" font-weight="600">urbanops-admin (前端 Nginx) :8080</text>
          <rect x="50" y="245" width="580" height="40" rx="10" fill="rgba(129,140,248,.06)" stroke="#6366f1" stroke-width="1.5"/><text x="340" y="270" text-anchor="middle" fill="#a5b4fc" font-size="11" font-weight="600">可观测性: SkyWalking Agent · Spring Boot Admin · OpenTracing · Actuator · 日志采集</text>
          <rect x="50" y="298" width="580" height="32" rx="8" fill="rgba(244,114,182,.06)" stroke="#f472b6" stroke-width="1" stroke-dasharray="5,3"/><text x="340" y="319" text-anchor="middle" fill="#f472b6" font-size="10">PF4J 插件目录: ../plugins (动态扩展)</text>
  
          <rect x="50" y="350" width="12" height="12" rx="2" fill="rgba(56,189,248,.3)" stroke="#38bdf8" stroke-width="1"/><text x="68" y="360" fill="#64748b" font-size="9">fat JAR</text>
          <rect x="140" y="350" width="12" height="12" rx="2" fill="rgba(239,68,68,.3)" stroke="#ef4444" stroke-width="1"/><text x="158" y="360" fill="#64748b" font-size="9">独立进程</text>
          <rect x="240" y="350" width="12" height="12" rx="2" fill="rgba(59,130,246,.3)" stroke="#3b82f6" stroke-width="1"/><text x="258" y="360" fill="#64748b" font-size="9">数据服务</text>
          <rect x="340" y="350" width="12" height="12" rx="2" fill="rgba(52,211,153,.3)" stroke="#34d399" stroke-width="1"/><text x="358" y="360" fill="#64748b" font-size="9">消息中间件</text>
        </svg>
      </div>
    </section>
  
    <!-- ====== 24. CI/CD & Deployment Details ====== -->
    <section class="slide" data-title="CI/CD & Deployment">
      <p class="kicker">deployment · ci-cd</p>
      <h2 class="h2">CI/CD 流水线与运维监控</h2>
      <div class="deploy-grid mt-l">
        <div class="deploy-card ci anim-fade-up" data-anim="fade-up"><div class="di">🚀</div><h4>CI 持续集成</h4><ul><li>Jenkins Pipeline</li><li>Maven 多模块构建</li><li>单元测试 + 代码扫描</li><li>Docker 镜像构建</li><li>推送 Harbor 私有仓库</li></ul></div>
        <div class="deploy-card cn anim-fade-up" data-anim="fade-up" style="animation-delay:.1s"><div class="di">☸️</div><h4>容器编排</h4><ul><li>Kubernetes 集群</li><li>Deployment 滚动更新</li><li>Service 服务发现</li><li>ConfigMap 配置管理</li><li>Ingress 流量入口</li></ul></div>
        <div class="deploy-card mon anim-fade-up" data-anim="fade-up" style="animation-delay:.2s"><div class="di">📊</div><h4>运维监控</h4><ul><li>Prometheus + Grafana</li><li>SkyWalking 链路追踪</li><li>ELK 日志收集</li><li>AlertManager 告警</li><li>Admin 应用监控</li></ul></div>
      </div>
      <div class="card card-accent mt-l" style="padding:22px">
        <h4 style="font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--accent);margin-bottom:12px">Dockerfile — 多阶段构建</h4>
        <div class="terminal"><div class="bar"><span class="dot"></span><span class="dot"></span><span class="dot"></span><span>urbanops-server/Dockerfile</span></div>
          <pre><span class="cmt"># Stage 1: 构建</span>
  <span class="kw">FROM</span> maven:3.9-eclipse-temurin-17 <span class="kw">AS</span> builder
  <span class="kw">COPY</span> . /app && <span class="kw">WORKDIR</span> /app
  <span class="kw">RUN</span> mvn clean package -DskipTests
  
  <span class="cmt"># Stage 2: 运行</span>
  <span class="kw">FROM</span> eclipse-temurin:17-jre
  <span class="kw">COPY</span> --from=builder /app/urbanops-server/target/*.jar app.jar
  <span class="kw">ENTRYPOINT</span> ["java","-jar","/app.jar"]</pre>
        </div>
      </div>
    </section>
  
    <!-- ====== 25. Future Planning & Roadmap ====== -->
    <section class="slide" data-title="Future Planning">
      <p class="kicker">roadmap · planning</p>
      <h2 class="h2">后续扩展规划</h2>
      <div class="roadmap-grid">
        <div class="roadmap-card now anim-fade-up" data-anim="fade-up"><div class="r-period">Phase 1 · 近期</div><h4>🏗️ 架构夯实</h4><ul><li>完善 IoT 设备接入能力</li><li>会员中心 (Member) 激活</li><li>支付系统 (Pay) 集成</li><li>微信公众号 (MP) 接入</li><li>数据报表与大屏 (Report)</li><li>提升单元测试覆盖率</li></ul></div>
        <div class="roadmap-card next anim-fade-up" data-anim="fade-up" style="animation-delay:.1s"><div class="r-period">Phase 2 · 中期</div><h4>🚀 业务扩展 & 微服务化</h4><ul><li>ERP / CRM 系统搭建</li><li>商城系统 (Mall)</li><li>AI 大模型集成 (AI)</li><li>Spring Cloud 微服务拆分</li><li>Nacos 注册 & 配置中心</li><li>Gateway + Sentinel 流量治理</li></ul></div>
        <div class="roadmap-card future anim-fade-up" data-anim="fade-up" style="animation-delay:.2s"><div class="r-period">Phase 3 · 远期</div><h4>🌐 平台化 & 智能化</h4><ul><li>多租户 SaaS 化运营</li><li>开放平台 & API 市场</li><li>低代码/无代码搭建</li><li>PF4J 插件生态</li><li>边缘计算 + IoT 规模化</li><li>数据中台 & 智能决策</li></ul></div>
      </div>
      <div class="timeline mt-l">
        <div class="tl-item"><div class="tl-phase">Q2 2025</div><div class="tl-body"><h4>物联网接入打通</h4><p>MQTT 协议适配 · 设备影子 · TDengine 时序存储</p></div></div>
        <div class="tl-item"><div class="tl-phase">Q3 2025</div><div class="tl-body"><h4>业务模块激活</h4><p>Member + Pay + MP + Report 模块上线,补齐业务闭环</p></div></div>
        <div class="tl-item"><div class="tl-phase">Q4 2025</div><div class="tl-body"><h4>微服务演进</h4><p>核心域拆分 · Spring Cloud 迁移 · 服务独立部署</p></div></div>
      </div>
    </section>
  
    <!-- ====== 26. Architecture Evolution & Summary ====== -->
    <section class="slide" data-title="Architecture Evolution">
      <p class="kicker">evolution · target-architecture</p>
      <h2 class="h2">架构演进目标:微服务全景</h2>
      <div class="card card-accent" style="padding:24px;margin-top:14px">
        <h4 style="color:var(--accent);font-family:'JetBrains Mono',monospace;font-size:13px;margin-bottom:12px">目标微服务架构</h4>
        <div class="evo-flow">
          <span class="evo-box accent">Nginx</span><span class="evo-arrow"></span>
          <span class="evo-box purple">Gateway</span><span class="evo-arrow"></span>
          <span class="evo-box green">Nacos</span><span class="evo-arrow"></span>
          <div style="display:flex;flex-direction:column;gap:6px">
            <span class="tag">garden-service</span><span class="tag">workorder-service</span><span class="tag">bpm-service</span><span class="tag">system-service</span><span class="tag">iot-gateway (已有)</span>
          </div>
          <span class="evo-arrow"></span>
          <div style="display:flex;flex-direction:column;gap:6px">
            <span class="tag">Sentinel</span><span class="tag">Seata</span><span class="tag">SkyWalking</span>
          </div>
        </div>
      </div>
      <div class="grid g3 mt-l">
        <div class="card card-accent"><h4>1 · 业务驱动架构</h4><p class="dim">智慧园林 + 工单调度 + 流程协同,三大核心域支撑城市运营。</p></div>
        <div class="card card-accent"><h4>2 · 分层清晰可扩展</h4><p class="dim">15 个 Starter 组件化,模块间 Feign API + MQ 双通道解耦。</p></div>
        <div class="card card-accent"><h4>3 · 信创全栈兼容</h4><p class="dim">MySQL / DM8 / KingBase / OpenGauss 多数据库无缝切换。</p></div>
        <div class="card card-accent"><h4>4 · 可观测性内置</h4><p class="dim">SkyWalking + Admin + 日志中心,三大支柱保障系统可靠。</p></div>
        <div class="card card-accent"><h4>5 · 渐进式演进</h4><p class="dim">模块化先行 → API 契约驱动 → 渐进式拆分 → 独立部署验证。</p></div>
        <div class="card card-accent"><h4>6 · IoT 独立先行</h4><p class="dim">IoT 网关已实现独立部署,为后续微服务化积累了宝贵经验。</p></div>
      </div>
      <div style="margin-top:24px;text-align:center">
        <div class="mono" style="font-size:56px;color:var(--accent);font-weight:800;letter-spacing:-.04em">?</div>
        <h2 class="h2">Questions &amp; Discussion</h2>
        <p class="lede">感谢聆听 · 欢迎交流</p>
        <div class="row mt-s" style="justify-content:center"><span class="tag">#urbanops</span><span class="tag">#spring-boot</span><span class="tag">#microservices</span><span class="tag">#smart-garden</span><span class="tag">#cloud-native</span></div>
      </div>
    </section>
  
  </div>
  <script src="ppt-assets/runtime.js"></script>
  </body></html>