Update architecture diagram per feedback
- Core Backend centered, Core Web UI moved to left (uses API) - Print now shows it can register assets with Core - IoT card includes ERP integration bullet - Updated diagram layout, connections, and description
This commit is contained in:
@@ -80,99 +80,102 @@
|
||||
<rect width="100%" height="100%" fill="url(#grid)" />
|
||||
|
||||
<!-- ========== CORE (Central, owns DB) ========== -->
|
||||
<rect x="200" y="60" width="600" height="280" rx="14" fill="rgba(6, 78, 59, 0.1)" stroke="#34d399" stroke-width="2.5"/>
|
||||
<text x="220" y="85" fill="#34d399" font-size="13" font-weight="700">TallyFlow Core (Central Hub)</text>
|
||||
<rect x="180" y="55" width="640" height="285" rx="14" fill="rgba(6, 78, 59, 0.1)" stroke="#34d399" stroke-width="2.5"/>
|
||||
<text x="200" y="80" fill="#34d399" font-size="13" font-weight="700">TallyFlow Core (Central Hub)</text>
|
||||
|
||||
<!-- Core Backend (Go) -->
|
||||
<rect x="230" y="105" width="200" height="70" rx="8" fill="rgba(6, 78, 59, 0.55)" stroke="#34d399" stroke-width="2"/>
|
||||
<text x="330" y="132" fill="white" font-size="13" font-weight="700" text-anchor="middle">Core Backend</text>
|
||||
<text x="330" y="150" fill="#94a3b8" font-size="10" text-anchor="middle">Go (Echo / gRPC)</text>
|
||||
<text x="330" y="166" fill="#34d399" font-size="9" text-anchor="middle">REST + WebSocket API</text>
|
||||
<!-- Core Web UI (Vue.js) - LEFT -->
|
||||
<rect x="210" y="100" width="180" height="70" rx="8" fill="rgba(8, 51, 68, 0.55)" stroke="#22d3ee" stroke-width="2"/>
|
||||
<text x="300" y="127" fill="white" font-size="13" font-weight="700" text-anchor="middle">Core Web UI</text>
|
||||
<text x="300" y="145" fill="#94a3b8" font-size="10" text-anchor="middle">Vue.js 2</text>
|
||||
<text x="300" y="161" fill="#22d3ee" font-size="9" text-anchor="middle">Uses Core API</text>
|
||||
|
||||
<!-- Core Web UI (Vue.js) - sub-box -->
|
||||
<rect x="460" y="105" width="200" height="70" rx="8" fill="rgba(8, 51, 68, 0.55)" stroke="#22d3ee" stroke-width="2"/>
|
||||
<text x="560" y="132" fill="white" font-size="13" font-weight="700" text-anchor="middle">Core Web UI</text>
|
||||
<text x="560" y="150" fill="#94a3b8" font-size="10" text-anchor="middle">Vue.js 2</text>
|
||||
<text x="560" y="166" fill="#22d3ee" font-size="9" text-anchor="middle">Asset mgmt, reporting, config</text>
|
||||
<!-- Core Backend (Go) - CENTER -->
|
||||
<rect x="410" y="100" width="200" height="70" rx="8" fill="rgba(6, 78, 59, 0.55)" stroke="#34d399" stroke-width="2"/>
|
||||
<text x="510" y="127" fill="white" font-size="13" font-weight="700" text-anchor="middle">Core Backend</text>
|
||||
<text x="510" y="145" fill="#94a3b8" font-size="10" text-anchor="middle">Go (Echo / gRPC)</text>
|
||||
<text x="510" y="161" fill="#34d399" font-size="9" text-anchor="middle">REST + WebSocket API</text>
|
||||
|
||||
<!-- MongoDB (nested inside Core) -->
|
||||
<rect x="680" y="105" width="100" height="70" rx="6" fill="rgba(76, 29, 149, 0.6)" stroke="#a78bfa" stroke-width="1.5"/>
|
||||
<text x="730" y="132" fill="white" font-size="11" font-weight="700" text-anchor="middle">MongoDB</text>
|
||||
<text x="730" y="150" fill="#c4b5fd" font-size="8" text-anchor="middle">Assets • Tags</text>
|
||||
<text x="730" y="164" fill="#c4b5fd" font-size="8" text-anchor="middle">Photos • Zones</text>
|
||||
<!-- MongoDB (nested inside Core) - RIGHT -->
|
||||
<rect x="630" y="100" width="170" height="70" rx="6" fill="rgba(76, 29, 149, 0.6)" stroke="#a78bfa" stroke-width="1.5"/>
|
||||
<text x="715" y="127" fill="white" font-size="12" font-weight="700" text-anchor="middle">MongoDB</text>
|
||||
<text x="715" y="145" fill="#c4b5fd" font-size="9" text-anchor="middle">Assets • Tags • Photos • Zones</text>
|
||||
<text x="715" y="160" fill="#c4b5fd" font-size="8" text-anchor="middle">(owned by Core Backend)</text>
|
||||
|
||||
<!-- Core API label -->
|
||||
<text x="500" y="200" fill="#34d399" font-size="9" text-anchor="middle" font-weight="600">Core API Layer (single integration point for all 5 components)</text>
|
||||
<text x="500" y="195" fill="#34d399" font-size="9" text-anchor="middle" font-weight="600">Core API Layer — single integration point for all components</text>
|
||||
|
||||
<!-- ========== ASSETS (Mobile) ========== -->
|
||||
<rect x="60" y="380" width="170" height="100" rx="10" fill="rgba(8, 51, 68, 0.5)" stroke="#22d3ee" stroke-width="2"/>
|
||||
<text x="145" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">Assets</text>
|
||||
<text x="145" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">(Mobile)</text>
|
||||
<text x="145" y="444" fill="#22d3ee" font-size="9" text-anchor="middle">Flutter</text>
|
||||
<text x="145" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">Seek & Find • Inventory • Enrollment</text>
|
||||
<rect x="50" y="380" width="170" height="100" rx="10" fill="rgba(8, 51, 68, 0.5)" stroke="#22d3ee" stroke-width="2"/>
|
||||
<text x="135" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">Assets</text>
|
||||
<text x="135" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">(Mobile)</text>
|
||||
<text x="135" y="444" fill="#22d3ee" font-size="9" text-anchor="middle">Flutter</text>
|
||||
<text x="135" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">Seek & Find • Inventory • Enrollment</text>
|
||||
|
||||
<!-- ========== PRINT ========== -->
|
||||
<rect x="280" y="380" width="170" height="100" rx="10" fill="rgba(120, 53, 15, 0.45)" stroke="#fbbf24" stroke-width="2"/>
|
||||
<text x="365" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">Print</text>
|
||||
<text x="365" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">Flutter + Rust</text>
|
||||
<text x="365" y="444" fill="#fbbf24" font-size="9" text-anchor="middle">Zebra ZPL • RFID</text>
|
||||
<text x="365" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">Print UI + Print API</text>
|
||||
<rect x="260" y="380" width="180" height="100" rx="10" fill="rgba(120, 53, 15, 0.45)" stroke="#fbbf24" stroke-width="2"/>
|
||||
<text x="350" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">Print</text>
|
||||
<text x="350" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">Flutter + Rust</text>
|
||||
<text x="350" y="444" fill="#fbbf24" font-size="9" text-anchor="middle">Zebra ZPL • RFID</text>
|
||||
<text x="350" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">Print UI + Print API • Can register assets</text>
|
||||
|
||||
<!-- ========== CAPTURE (native) ========== -->
|
||||
<rect x="500" y="380" width="170" height="100" rx="10" fill="rgba(136, 19, 55, 0.45)" stroke="#fb7185" stroke-width="2"/>
|
||||
<text x="585" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">Capture</text>
|
||||
<text x="585" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">(PhotoTag)</text>
|
||||
<text x="585" y="444" fill="#fb7185" font-size="9" text-anchor="middle">Native App</text>
|
||||
<text x="585" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">Photo + Barcode QC</text>
|
||||
<rect x="490" y="380" width="170" height="100" rx="10" fill="rgba(136, 19, 55, 0.45)" stroke="#fb7185" stroke-width="2"/>
|
||||
<text x="575" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">Capture</text>
|
||||
<text x="575" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">(PhotoTag)</text>
|
||||
<text x="575" y="444" fill="#fb7185" font-size="9" text-anchor="middle">Native App</text>
|
||||
<text x="575" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">Photo + Barcode QC</text>
|
||||
|
||||
<!-- ========== IoT ========== -->
|
||||
<rect x="720" y="380" width="170" height="100" rx="10" fill="rgba(251, 146, 60, 0.4)" stroke="#fb923c" stroke-width="2"/>
|
||||
<text x="805" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">IoT</text>
|
||||
<text x="805" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">Rust</text>
|
||||
<text x="805" y="444" fill="#fb923c" font-size="9" text-anchor="middle">Fixed Readers • Sensors</text>
|
||||
<text x="805" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">MQTT / HTTP / BLE</text>
|
||||
<rect x="720" y="380" width="180" height="100" rx="10" fill="rgba(251, 146, 60, 0.4)" stroke="#fb923c" stroke-width="2"/>
|
||||
<text x="810" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">IoT</text>
|
||||
<text x="810" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">Rust</text>
|
||||
<text x="810" y="444" fill="#fb923c" font-size="9" text-anchor="middle">Fixed Readers • Sensors</text>
|
||||
<text x="810" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">MQTT / HTTP / BLE • ERP integration</text>
|
||||
|
||||
<!-- ========== CONNECTIONS ========== -->
|
||||
|
||||
<!-- Assets → Core (solid) -->
|
||||
<line x1="232" y1="420" x2="280" y2="340" stroke="#22d3ee" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="240" y="375" fill="#22d3ee" font-size="9" font-weight="600">API Sync</text>
|
||||
<line x1="222" y1="420" x2="280" y2="340" stroke="#22d3ee" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="235" y="375" fill="#22d3ee" font-size="9" font-weight="600">API Sync</text>
|
||||
|
||||
<!-- Print → Core (solid) -->
|
||||
<line x1="365" y1="378" x2="365" y2="340" stroke="#fbbf24" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="380" y="362" fill="#fbbf24" font-size="9">Print Jobs / Config</text>
|
||||
<!-- Print → Core (solid) + asset registration note -->
|
||||
<line x1="350" y1="378" x2="430" y2="340" stroke="#fbbf24" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="365" y="362" fill="#fbbf24" font-size="9">Print Jobs + Asset Reg</text>
|
||||
|
||||
<!-- Capture → Core (solid) -->
|
||||
<line x1="585" y1="378" x2="585" y2="340" stroke="#fb7185" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="600" y="362" fill="#fb7185" font-size="9">Photos + Metadata</text>
|
||||
<line x1="575" y1="378" x2="575" y2="340" stroke="#fb7185" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="590" y="362" fill="#fb7185" font-size="9">Photos + Metadata</text>
|
||||
|
||||
<!-- IoT → Core (dashed, optional) -->
|
||||
<line x1="805" y1="378" x2="805" y2="340" stroke="#fb923c" stroke-width="2" stroke-dasharray="5,4" marker-end="url(#arrowhead-dashed)"/>
|
||||
<text x="820" y="362" fill="#fb923c" font-size="9">Events (optional)</text>
|
||||
<line x1="810" y1="378" x2="610" y2="340" stroke="#fb923c" stroke-width="2" stroke-dasharray="5,4" marker-end="url(#arrowhead-dashed)"/>
|
||||
<text x="690" y="355" fill="#fb923c" font-size="9">Events (optional)</text>
|
||||
|
||||
<!-- Core Backend owns MongoDB (short solid line) -->
|
||||
<line x1="432" y1="140" x2="678" y2="140" stroke="#a78bfa" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<!-- Core Web UI uses Core Backend API (short arrow) -->
|
||||
<line x1="392" y1="135" x2="408" y2="135" stroke="#22d3ee" stroke-width="1.5" marker-end="url(#arrowhead)"/>
|
||||
|
||||
<!-- Core Backend owns MongoDB -->
|
||||
<line x1="612" y1="135" x2="628" y2="135" stroke="#a78bfa" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
|
||||
<!-- Legend -->
|
||||
<text x="60" y="530" fill="white" font-size="10" font-weight="700">Legend</text>
|
||||
<text x="50" y="530" fill="white" font-size="10" font-weight="700">Legend</text>
|
||||
|
||||
<rect x="60" y="542" width="18" height="11" rx="2" fill="rgba(6, 78, 59, 0.55)" stroke="#34d399" stroke-width="1"/>
|
||||
<text x="85" y="551" fill="#94a3b8" font-size="8">Core (Go + Vue.js + MongoDB)</text>
|
||||
<rect x="50" y="542" width="18" height="11" rx="2" fill="rgba(6, 78, 59, 0.55)" stroke="#34d399" stroke-width="1"/>
|
||||
<text x="75" y="551" fill="#94a3b8" font-size="8">Core (Go + Vue.js + MongoDB)</text>
|
||||
|
||||
<rect x="260" y="542" width="18" height="11" rx="2" fill="rgba(8, 51, 68, 0.5)" stroke="#22d3ee" stroke-width="1"/>
|
||||
<text x="285" y="551" fill="#94a3b8" font-size="8">Assets (Flutter)</text>
|
||||
<rect x="250" y="542" width="18" height="11" rx="2" fill="rgba(8, 51, 68, 0.5)" stroke="#22d3ee" stroke-width="1"/>
|
||||
<text x="275" y="551" fill="#94a3b8" font-size="8">Assets (Flutter)</text>
|
||||
|
||||
<rect x="385" y="542" width="18" height="11" rx="2" fill="rgba(120, 53, 15, 0.45)" stroke="#fbbf24" stroke-width="1"/>
|
||||
<text x="410" y="551" fill="#94a3b8" font-size="8">Print (Flutter/Rust + UI)</text>
|
||||
<rect x="375" y="542" width="18" height="11" rx="2" fill="rgba(120, 53, 15, 0.45)" stroke="#fbbf24" stroke-width="1"/>
|
||||
<text x="400" y="551" fill="#94a3b8" font-size="8">Print (Flutter/Rust + UI)</text>
|
||||
|
||||
<rect x="530" y="542" width="18" height="11" rx="2" fill="rgba(136, 19, 55, 0.45)" stroke="#fb7185" stroke-width="1"/>
|
||||
<text x="555" y="551" fill="#94a3b8" font-size="8">Capture (Native)</text>
|
||||
<rect x="520" y="542" width="18" height="11" rx="2" fill="rgba(136, 19, 55, 0.45)" stroke="#fb7185" stroke-width="1"/>
|
||||
<text x="545" y="551" fill="#94a3b8" font-size="8">Capture (Native)</text>
|
||||
|
||||
<rect x="660" y="542" width="18" height="11" rx="2" fill="rgba(251, 146, 60, 0.4)" stroke="#fb923c" stroke-width="1"/>
|
||||
<text x="685" y="551" fill="#94a3b8" font-size="8">IoT (Rust)</text>
|
||||
<rect x="650" y="542" width="18" height="11" rx="2" fill="rgba(251, 146, 60, 0.4)" stroke="#fb923c" stroke-width="1"/>
|
||||
<text x="675" y="551" fill="#94a3b8" font-size="8">IoT (Rust)</text>
|
||||
|
||||
<line x1="800" y1="547" x2="818" y2="547" stroke="#fb923c" stroke-width="1.5" stroke-dasharray="4,3" marker-end="url(#arrowhead-dashed)"/>
|
||||
<text x="825" y="551" fill="#94a3b8" font-size="8">Optional flow</text>
|
||||
<line x1="790" y1="547" x2="808" y2="547" stroke="#fb923c" stroke-width="1.5" stroke-dasharray="4,3" marker-end="url(#arrowhead-dashed)"/>
|
||||
<text x="815" y="551" fill="#94a3b8" font-size="8">Optional flow</text>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
@@ -183,10 +186,10 @@
|
||||
<h3>Core (Central)</h3>
|
||||
</div>
|
||||
<ul>
|
||||
<li>• Go backend + Vue.js Web UI</li>
|
||||
<li>• Go backend (center) + Vue.js Web UI (left)</li>
|
||||
<li>• Owns MongoDB (assets, tags, photos, zones)</li>
|
||||
<li>• Single API integration point</li>
|
||||
<li>• Configuration & reporting hub</li>
|
||||
<li>• Web UI also consumes the Core API</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="card">
|
||||
@@ -210,7 +213,7 @@
|
||||
<li>• Flutter + Rust</li>
|
||||
<li>• Zebra ZPL + RFID encoding</li>
|
||||
<li>• Print UI for configuration</li>
|
||||
<li>• Or direct Print API usage</li>
|
||||
<li>• Print API + can register assets with Core</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="card">
|
||||
@@ -235,12 +238,13 @@
|
||||
<li>• Fixed readers (Impinj/Zebra)</li>
|
||||
<li>• Sensors (location, temp, shock)</li>
|
||||
<li>• Optional dashed flow to Core</li>
|
||||
<li>• Can integrate with ERP systems</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="footer">
|
||||
TallyFlow • 5 components only • MongoDB nested inside Core • Verified from source • 2026
|
||||
TallyFlow • 5 components only • MongoDB nested inside Core • Print can register assets • Verified from source • 2026
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
TallyFlow is built around exactly **five primary components**, with **Core** as the central hub that owns the database.
|
||||
|
||||
### 1. Core (Central)
|
||||
- Go backend + Vue.js Web UI
|
||||
- **Core Backend** (Go) positioned in the center
|
||||
- **Core Web UI** (Vue.js) on the left — consumes the Core API
|
||||
- Owns MongoDB (assets, tags, photos, zones, events)
|
||||
- Single API integration point for all other components
|
||||
- Handles configuration, reporting, and orchestration
|
||||
@@ -22,6 +23,7 @@ TallyFlow is built around exactly **five primary components**, with **Core** as
|
||||
- Zebra ZPL-compatible label printing and RFID encoding
|
||||
- Includes **Print UI** for configuration
|
||||
- Can also be driven directly via the **Print API**
|
||||
- **Can register assets directly with Core**
|
||||
|
||||
### 4. Capture (PhotoTag)
|
||||
- Native mobile application (not Go/Vue)
|
||||
@@ -33,12 +35,14 @@ TallyFlow is built around exactly **five primary components**, with **Core** as
|
||||
- Rust-based service
|
||||
- Integrates fixed RFID readers (Impinj, Zebra) and environmental sensors
|
||||
- Pushes tag events and sensor data to Core (optional / dashed connection)
|
||||
- **Can integrate with ERP systems**
|
||||
|
||||
**MongoDB** is not a standalone component — it is fully owned and managed inside Core.
|
||||
|
||||
## Data Flows
|
||||
- **Assets, Print, Capture** → Core: Solid lines (primary, always-available flows)
|
||||
- **Assets, Print, Capture** → Core: Solid lines (primary flows)
|
||||
- **IoT → Core**: Dashed line (optional, event-driven)
|
||||
- Core Web UI and Print UI are shown as sub-elements within their respective components
|
||||
- **Print** additionally supports asset registration back into Core
|
||||
- Core Web UI communicates with Core Backend via the same API used by other components
|
||||
|
||||
This structure was verified by reviewing the actual source repositories in `~/src/`. All external modules interact exclusively through Core’s API layer.
|
||||
Reference in New Issue
Block a user