237 lines
14 KiB
XML
237 lines
14 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1080" viewBox="0 0 1600 1080" role="img" aria-labelledby="title desc">
|
||
<title id="title">TIKU Backend 当前技术架构图</title>
|
||
<desc id="desc">TIKU Backend 是 ASP.NET Core 模块化单体。API 按平台、租户和学生客户端边界承载 HTTP,Worker 独立处理后台任务与平台审批,DbMigrator 负责迁移,运行时依赖 PostgreSQL、Redis、对象存储和外部服务。</desc>
|
||
<defs>
|
||
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
|
||
<path d="M0 0L10 5L0 10Z" fill="#334155"/>
|
||
</marker>
|
||
<marker id="arrowBlue" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
|
||
<path d="M0 0L10 5L0 10Z" fill="#1686d9"/>
|
||
</marker>
|
||
<style>
|
||
text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans CJK SC", "Microsoft YaHei", sans-serif; letter-spacing: 0; }
|
||
.bg { fill: #fff; }
|
||
.title { fill: #172033; font-size: 34px; font-weight: 700; }
|
||
.subtitle { fill: #5f6b7a; font-size: 16px; font-weight: 400; }
|
||
.group { fill: #fbfdff; stroke: #1686d9; stroke-width: 2; stroke-dasharray: 10 8; }
|
||
.group-title { fill: #e11d2e; font-size: 22px; font-weight: 700; }
|
||
.node { fill: #fff; stroke: #cbd5e1; stroke-width: 1.5; }
|
||
.node-blue { fill: #edf7ff; stroke: #69aee0; stroke-width: 1.5; }
|
||
.node-green { fill: #effaf3; stroke: #78bc8b; stroke-width: 1.5; }
|
||
.node-amber { fill: #fff8e8; stroke: #d5ad52; stroke-width: 1.5; }
|
||
.node-violet { fill: #f7f1fb; stroke: #ae8bc3; stroke-width: 1.5; }
|
||
.node-title { fill: #172033; font-size: 17px; font-weight: 700; }
|
||
.node-text { fill: #526070; font-size: 13px; font-weight: 400; }
|
||
.node-tiny { fill: #64748b; font-size: 12px; font-weight: 400; }
|
||
.badge { fill: #1686d9; }
|
||
.badge-text { fill: #fff; font-size: 16px; font-weight: 700; text-anchor: middle; dominant-baseline: central; }
|
||
.edge { fill: none; stroke: #334155; stroke-width: 1.8; marker-end: url(#arrow); }
|
||
.edge-blue { fill: none; stroke: #1686d9; stroke-width: 2; marker-end: url(#arrowBlue); }
|
||
.edge-dash { fill: none; stroke: #64748b; stroke-width: 1.6; stroke-dasharray: 7 6; marker-end: url(#arrow); }
|
||
.edge-label { fill: #475569; font-size: 13px; font-weight: 500; }
|
||
.boundary { fill: #fffdf4; stroke: #d2ad3e; stroke-width: 1.5; stroke-dasharray: 8 6; }
|
||
.boundary-text { fill: #614d11; font-size: 14px; font-weight: 500; }
|
||
</style>
|
||
</defs>
|
||
|
||
<rect class="bg" width="1600" height="1080"/>
|
||
<text class="title" x="56" y="54">TIKU Backend 当前技术架构</text>
|
||
<text class="subtitle" x="57" y="82">ASP.NET Core 模块化单体 · Application 定义契约与上下文 · Infrastructure 提供业务、持久化和 Provider 实现</text>
|
||
|
||
<!-- Clients -->
|
||
<text class="group-title" x="48" y="129">访问端</text>
|
||
<rect class="group" x="40" y="145" width="230" height="570" rx="4"/>
|
||
|
||
<rect class="node-blue" x="66" y="180" width="178" height="92" rx="6"/>
|
||
<circle class="badge" cx="96" cy="211" r="18"/>
|
||
<text class="badge-text" x="96" y="211">P</text>
|
||
<text class="node-title" x="124" y="207">平台管理端</text>
|
||
<text class="node-text" x="84" y="239">React / Vite 管理端</text>
|
||
<text class="node-tiny" x="84" y="258">Platform Realm · 治理审批</text>
|
||
|
||
<rect class="node-blue" x="66" y="307" width="178" height="92" rx="6"/>
|
||
<circle class="badge" cx="96" cy="338" r="18"/>
|
||
<text class="badge-text" x="96" y="338">T</text>
|
||
<text class="node-title" x="124" y="334">租户管理端</text>
|
||
<text class="node-text" x="84" y="366">内容与业务运营</text>
|
||
<text class="node-tiny" x="84" y="385">租户 Realm · RBAC</text>
|
||
|
||
<rect class="node-blue" x="66" y="434" width="178" height="92" rx="6"/>
|
||
<circle class="badge" cx="96" cy="465" r="18"/>
|
||
<text class="badge-text" x="96" y="465">H5</text>
|
||
<text class="node-title" x="124" y="461">学员端</text>
|
||
<text class="node-text" x="84" y="493">H5 / 小程序 / App</text>
|
||
<text class="node-tiny" x="84" y="512">Student 路径 · Tenant Realm</text>
|
||
|
||
<rect class="node-blue" x="66" y="561" width="178" height="92" rx="6"/>
|
||
<circle class="badge" cx="96" cy="592" r="18"/>
|
||
<text class="badge-text" x="96" y="592">↩</text>
|
||
<text class="node-title" x="124" y="588">外部回调</text>
|
||
<text class="node-text" x="84" y="620">微信 / 支付通知</text>
|
||
<text class="node-tiny" x="84" y="639">签名校验 · 幂等处理</text>
|
||
|
||
<!-- API -->
|
||
<text class="group-title" x="318" y="129">HTTP 接入与安全管线</text>
|
||
<rect class="group" x="310" y="145" width="355" height="570" rx="4"/>
|
||
|
||
<rect class="node-blue" x="338" y="180" width="299" height="92" rx="6"/>
|
||
<circle class="badge" cx="371" cy="211" r="18"/>
|
||
<text class="badge-text" x="371" y="211">API</text>
|
||
<text class="node-title" x="402" y="207">Tiku.Api</text>
|
||
<text class="node-text" x="356" y="239">ASP.NET Core Controller API</text>
|
||
<text class="node-tiny" x="356" y="258">OpenAPI / Scalar(Development)</text>
|
||
|
||
<rect class="node" x="338" y="307" width="299" height="184" rx="6"/>
|
||
<text class="node-title" x="358" y="337">请求管线(按执行顺序)</text>
|
||
<text class="node-text" x="358" y="367">1 日志 / 异常 / Forwarded Headers / HTTPS</text>
|
||
<text class="node-text" x="358" y="393">2 响应压缩 / Routing / CORS</text>
|
||
<text class="node-text" x="358" y="419">3 可信 Host 租户解析 / Browser CSRF</text>
|
||
<text class="node-text" x="358" y="445">4 JWT / 认证分区限流 / Rate Limiter</text>
|
||
<text class="node-text" x="358" y="471">5 CurrentPrincipal / Authorization / Feature</text>
|
||
|
||
<rect class="node-green" x="338" y="526" width="299" height="127" rx="6"/>
|
||
<text class="node-title" x="358" y="556">Controller 边界</text>
|
||
<text class="node-text" x="358" y="584">平台治理审批 · SaaS 管理 · 租户后台</text>
|
||
<text class="node-text" x="358" y="608">题库内容学习 · 商城增长</text>
|
||
<text class="node-text" x="358" y="632">认证运行时 · 支付回调 · 后台任务</text>
|
||
|
||
<path class="edge-blue" d="M244 226H338"/>
|
||
<path class="edge-blue" d="M244 353H338"/>
|
||
<path class="edge-blue" d="M244 480H338"/>
|
||
<path class="edge-blue" d="M244 607H338"/>
|
||
<text class="edge-label" x="272" y="214">HTTPS</text>
|
||
|
||
<!-- Modular monolith -->
|
||
<text class="group-title" x="713" y="129">模块化单体业务核心</text>
|
||
<rect class="group" x="705" y="145" width="565" height="570" rx="4"/>
|
||
|
||
<rect class="node-green" x="733" y="180" width="509" height="98" rx="6"/>
|
||
<text class="node-title" x="755" y="210">Tiku.Application:契约与执行上下文</text>
|
||
<text class="node-text" x="755" y="239">用例 / Provider 契约 · Tenant / User / SystemScope</text>
|
||
<text class="node-tiny" x="755" y="261">仅引用 Domain;不包含 EF Core 与第三方 SDK</text>
|
||
|
||
<rect class="node-amber" x="733" y="307" width="509" height="92" rx="6"/>
|
||
<text class="node-title" x="755" y="337">Tiku.Domain:领域模型</text>
|
||
<text class="node-text" x="755" y="366">Identity · Tenant · Catalog · QuestionBank · Content</text>
|
||
<text class="node-tiny" x="755" y="387">Learning · Commerce · Growth · Operations · Platform</text>
|
||
|
||
<rect class="node-violet" x="733" y="428" width="509" height="225" rx="6"/>
|
||
<text class="node-title" x="755" y="458">Tiku.Infrastructure:当前业务实现与适配器</text>
|
||
|
||
<rect class="node" x="755" y="480" width="144" height="142" rx="5"/>
|
||
<text class="node-title" x="773" y="508">平台底座</text>
|
||
<text class="node-text" x="773" y="535">身份认证</text>
|
||
<text class="node-text" x="773" y="558">租户 / 域名</text>
|
||
<text class="node-text" x="773" y="581">RBAC / Feature</text>
|
||
<text class="node-text" x="773" y="604">SaaS / 治理审批</text>
|
||
|
||
<rect class="node" x="915" y="480" width="144" height="142" rx="5"/>
|
||
<text class="node-title" x="933" y="508">教育业务</text>
|
||
<text class="node-text" x="933" y="535">分类 / 内容</text>
|
||
<text class="node-text" x="933" y="558">题库 / 视频</text>
|
||
<text class="node-text" x="933" y="581">学习 / 分数线</text>
|
||
<text class="node-text" x="933" y="604">档案 / 资源</text>
|
||
|
||
<rect class="node" x="1075" y="480" width="144" height="142" rx="5"/>
|
||
<text class="node-title" x="1093" y="508">交易增长</text>
|
||
<text class="node-text" x="1093" y="535">订单 / 支付</text>
|
||
<text class="node-text" x="1093" y="558">积分 / 推荐</text>
|
||
<text class="node-text" x="1093" y="581">CRM / 佣金</text>
|
||
<text class="node-text" x="1093" y="604">平台账务</text>
|
||
|
||
<path class="edge-blue" d="M637 589H733"/>
|
||
<text class="edge-label" x="658" y="577">调用契约</text>
|
||
<path class="edge" d="M987 278V307"/>
|
||
<text class="edge-label" x="997" y="298">引用</text>
|
||
<path class="edge-dash" d="M827 428V399"/>
|
||
<path class="edge-dash" d="M1147 428C1147 412 1110 407 1050 399"/>
|
||
<text class="edge-label" x="844" y="418">实现 Application 接口并操作 Domain</text>
|
||
|
||
<!-- Processes -->
|
||
<text class="group-title" x="1318" y="129">后台处理与迁移</text>
|
||
<rect class="group" x="1310" y="145" width="250" height="570" rx="4"/>
|
||
|
||
<rect class="node-green" x="1336" y="180" width="198" height="192" rx="6"/>
|
||
<circle class="badge" cx="1368" cy="211" r="18"/>
|
||
<text class="badge-text" x="1368" y="211">BG</text>
|
||
<text class="node-title" x="1398" y="207">Tiku.Worker</text>
|
||
<text class="node-text" x="1354" y="242">独立后台运行时</text>
|
||
<text class="node-text" x="1354" y="269">域名 / 订阅 / 用量</text>
|
||
<text class="node-text" x="1354" y="296">任务 / 授权缓存失效</text>
|
||
<text class="node-text" x="1354" y="323">商业账务 / 平台审批</text>
|
||
<text class="node-text" x="1354" y="350">任务租约 / Advisory Lock</text>
|
||
|
||
<rect class="node-amber" x="1336" y="408" width="198" height="144" rx="6"/>
|
||
<circle class="badge" cx="1368" cy="439" r="18"/>
|
||
<text class="badge-text" x="1368" y="439">DB</text>
|
||
<text class="node-title" x="1398" y="435">Tiku.DbMigrator</text>
|
||
<text class="node-text" x="1354" y="471">EF Core Migrate</text>
|
||
<text class="node-text" x="1354" y="498">Development Seed</text>
|
||
<text class="node-text" x="1354" y="525">平台管理员安全引导</text>
|
||
|
||
<rect class="node" x="1336" y="588" width="198" height="65" rx="6"/>
|
||
<text class="node-title" x="1354" y="616">共享组合方式</text>
|
||
<text class="node-tiny" x="1354" y="638">Application + Infrastructure</text>
|
||
|
||
<path class="edge-dash" d="M1336 276H1242"/>
|
||
<path class="edge-dash" d="M1336 480H1242"/>
|
||
|
||
<!-- Data and external systems -->
|
||
<text class="group-title" x="48" y="773">数据与外部服务</text>
|
||
<rect class="group" x="40" y="790" width="1520" height="212" rx="4"/>
|
||
|
||
<rect class="node-violet" x="70" y="826" width="270" height="138" rx="6"/>
|
||
<circle class="badge" cx="105" cy="859" r="20"/>
|
||
<text class="badge-text" x="105" y="859">PG</text>
|
||
<text class="node-title" x="139" y="854">PostgreSQL</text>
|
||
<text class="node-text" x="92" y="892">EF Core 实体 / Identity / AuthSession</text>
|
||
<text class="node-text" x="92" y="917">业务 / BackgroundJob / 审批与审计</text>
|
||
<text class="node-tiny" x="92" y="944">事实源 · Query Filter · 写入拦截 · Guard</text>
|
||
|
||
<rect class="node-violet" x="372" y="826" width="205" height="138" rx="6"/>
|
||
<circle class="badge" cx="407" cy="859" r="20"/>
|
||
<text class="badge-text" x="407" y="859">R</text>
|
||
<text class="node-title" x="441" y="854">Redis</text>
|
||
<text class="node-text" x="394" y="892">安全频控 / 授权缓存</text>
|
||
<text class="node-text" x="394" y="917">Feature / Output Cache</text>
|
||
<text class="node-tiny" x="394" y="944">非事实源 · Production 必需</text>
|
||
|
||
<rect class="node-violet" x="609" y="826" width="225" height="138" rx="6"/>
|
||
<circle class="badge" cx="644" cy="859" r="20"/>
|
||
<text class="badge-text" x="644" y="859">JOB</text>
|
||
<text class="node-title" x="678" y="854">PostgreSQL 任务租约</text>
|
||
<text class="node-text" x="631" y="892">即时任务 / RunAfter</text>
|
||
<text class="node-text" x="631" y="917">SKIP LOCKED / 重试</text>
|
||
<text class="node-tiny" x="631" y="944">Tiku.Worker 独立执行</text>
|
||
|
||
<rect class="node-blue" x="866" y="826" width="205" height="138" rx="6"/>
|
||
<text class="node-title" x="890" y="856">对象存储</text>
|
||
<text class="node-text" x="890" y="892">Alibaba OSS / S3 / MinIO</text>
|
||
<text class="node-text" x="890" y="917">预签名上传 / 资源访问</text>
|
||
<text class="node-tiny" x="890" y="944">IObjectStorageService</text>
|
||
|
||
<rect class="node-blue" x="1103" y="826" width="205" height="138" rx="6"/>
|
||
<text class="node-title" x="1127" y="856">通信与支付</text>
|
||
<text class="node-text" x="1127" y="892">阿里云短信 · 微信 OAuth</text>
|
||
<text class="node-text" x="1127" y="917">微信支付 · 支付宝</text>
|
||
<text class="node-tiny" x="1127" y="944">租户级配置与加密 Secret</text>
|
||
|
||
<rect class="node-blue" x="1340" y="826" width="190" height="138" rx="6"/>
|
||
<text class="node-title" x="1364" y="856">域名基础设施</text>
|
||
<text class="node-text" x="1364" y="892">DNS 所有权校验</text>
|
||
<text class="node-text" x="1364" y="917">HTTP 网关开通</text>
|
||
<text class="node-tiny" x="1364" y="944">自定义域名生命周期</text>
|
||
|
||
<path class="edge" d="M850 715C850 766 205 768 205 826"/>
|
||
<path class="edge" d="M930 715C930 774 474 770 474 826"/>
|
||
<path class="edge" d="M1010 715C1010 780 721 774 721 826"/>
|
||
<path class="edge" d="M1070 715C1070 766 968 770 968 826"/>
|
||
<path class="edge" d="M1130 715C1130 765 1205 770 1205 826"/>
|
||
<path class="edge" d="M1190 715C1190 756 1435 766 1435 826"/>
|
||
<path class="edge-dash" d="M1435 653V748C1435 778 721 784 721 826"/>
|
||
|
||
<!-- Project dependency direction -->
|
||
<rect class="boundary" x="40" y="1025" width="1520" height="38" rx="4"/>
|
||
<text class="boundary-text" x="61" y="1050">项目依赖方向:Api / Worker → Application + Infrastructure | DbMigrator → Infrastructure | Infrastructure → Application + Domain | Application → Domain</text>
|
||
</svg>
|