<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RuoYi-Vue-Pro Architecture Overview | RuoYiPlus</title><link>https://ruoyiplus.com/en/ruoyi/</link><atom:link href="https://ruoyiplus.com/en/ruoyi/index.xml" rel="self" type="application/rss+xml"/><description>RuoYi-Vue-Pro Architecture Overview</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><image><url>https://ruoyiplus.com/media/icon_hu_eee4a95885829ab2.png</url><title>RuoYi-Vue-Pro Architecture Overview</title><link>https://ruoyiplus.com/en/ruoyi/</link></image><item><title>Feature List</title><link>https://ruoyiplus.com/en/ruoyi/feature/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/feature/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;This is the &amp;ldquo;capability map&amp;rdquo; of the entire platform&lt;/strong&gt;. Before deciding to use RuoYi, you can quickly determine through this list: Are the capabilities you need already built-in? If so, how quickly can you go live?&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Total code volume approximately 260,000 lines, covering 19 system features, 17 infrastructure items, and 14 business subsystems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="feature-panorama"&gt;Feature Panorama&lt;/h2&gt;
&lt;div class="mermaid"&gt;mindmap
root((RuoYi-Vue-Pro&lt;br/&gt;Feature Panorama))
System Features
User Management
Role Management
Menu Management
Department Management
Position Management
Tenant Management
Dictionary Management
Notifications &amp; Announcements
Operation Logs
Login Logs
Sensitive Word Management
Infrastructure
Code Generator
File Service
Message Queue
Configuration Management
WebSocket
Service Assurance
System Monitoring
Business Subsystems
BPM Workflow
CRM Customer Management
ERP Purchase-Sales-Inventory
Mall E-Commerce
MES Manufacturing Execution
WMS Warehouse Management
Pay Payment Center
AI Large Model
IoT Internet of Things
IM Instant Messaging
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="system-features-19-items"&gt;System Features (19 Items)&lt;/h2&gt;
&lt;p&gt;These are the &amp;ldquo;standard&amp;rdquo; capabilities of admin panels — universal features needed by any enterprise system:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Problem Solved&lt;/th&gt;
&lt;th&gt;Typical Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manage system login accounts, support CRUD, password reset, status control&lt;/td&gt;
&lt;td&gt;Create employee accounts, disable departed employees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Online Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;View currently online users in real-time, support forced logout&lt;/td&gt;
&lt;td&gt;Security investigation, account anomaly handling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Role Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RBAC permission model, roles assigned menu and button permissions&lt;/td&gt;
&lt;td&gt;Set &amp;ldquo;Sales Manager&amp;rdquo; to only see CRM module&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Menu Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dynamically configure sidebar menu, support directory/menu/button three levels&lt;/td&gt;
&lt;td&gt;Configure menus after adding new business modules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Department Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Organizational structure tree, support data scope permissions&lt;/td&gt;
&lt;td&gt;Beijing branch can only see Beijing data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Position Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Position dictionary, associated with users&lt;/td&gt;
&lt;td&gt;Link positions to salary/approval permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tenant Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SaaS tenant registration, package assignment, expiration handling&lt;/td&gt;
&lt;td&gt;SaaS provider managing multiple enterprise clients&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tenant Packages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bind different menu permissions for different tenant packages&lt;/td&gt;
&lt;td&gt;Basic/Professional/Enterprise edition feature differences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dictionary Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Global enumeration value maintenance, shared by frontend and backend&lt;/td&gt;
&lt;td&gt;Gender, status, type dropdown options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SMS Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SMS templates, sending records, channel configuration&lt;/td&gt;
&lt;td&gt;Verification codes, notification SMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Email Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Email templates, sending records, SMTP configuration&lt;/td&gt;
&lt;td&gt;Registration verification, system alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Internal Messages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In-system message notifications, read/unread status&lt;/td&gt;
&lt;td&gt;Approval notifications, system announcements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operation Logs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Record every user operation with request parameters and results&lt;/td&gt;
&lt;td&gt;Audit tracing, issue investigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Login Logs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Record login IP, time, result&lt;/td&gt;
&lt;td&gt;Security audit, abnormal login detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Code Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unified error code definitions, user-friendly prompts&lt;/td&gt;
&lt;td&gt;API returns &lt;code&gt;1002005001&lt;/code&gt; for &amp;ldquo;User not found&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notifications &amp;amp; Announcements&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;System-level announcements, support scheduled publishing&lt;/td&gt;
&lt;td&gt;System maintenance notices, company announcements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sensitive Words&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sensitive word library management and auto-filtering&lt;/td&gt;
&lt;td&gt;Content moderation, comment filtering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Application Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-application configuration, e.g., admin panel + mobile&lt;/td&gt;
&lt;td&gt;One system, multiple entry points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Region Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;China administrative division data, province/city/district three levels&lt;/td&gt;
&lt;td&gt;Address picker, logistics regions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="infrastructure-17-items"&gt;Infrastructure (17 Items)&lt;/h2&gt;
&lt;p&gt;These are the underlying capabilities that support business operations:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Problem Solved&lt;/th&gt;
&lt;th&gt;Technical Implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Generator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One-click CRUD frontend/backend code generation, eliminating repetitive work&lt;/td&gt;
&lt;td&gt;Template engine, supports master-child tables, tree tables, uni-app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;System API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Online API documentation based on Swagger&lt;/td&gt;
&lt;td&gt;Swagger3 + Knife4j&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database Documentation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto-generate database table structure docs&lt;/td&gt;
&lt;td&gt;Screw&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Form Builder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visual drag-and-drop form design&lt;/td&gt;
&lt;td&gt;Low-code form designer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Configuration Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dynamic parameter configuration, no restart needed&lt;/td&gt;
&lt;td&gt;System parameters + Configuration Center&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unified file upload/download, multi-cloud storage switching&lt;/td&gt;
&lt;td&gt;S3 protocol: MinIO/Alibaba OSS/Tencent COS/Qiniu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebSocket&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time bidirectional communication&lt;/td&gt;
&lt;td&gt;Standalone/Cluster dual mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API Logs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Record API request and response details&lt;/td&gt;
&lt;td&gt;Interceptor + async write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MySQL Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database connection pool and slow query monitoring&lt;/td&gt;
&lt;td&gt;Druid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redis Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Redis memory, hit rate, connection monitoring&lt;/td&gt;
&lt;td&gt;Built-in monitoring panel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Java Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JVM memory, threads, GC monitoring&lt;/td&gt;
&lt;td&gt;Spring Boot Actuator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distributed Tracing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Distributed request trace tracking&lt;/td&gt;
&lt;td&gt;SkyWalking integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Log Center&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Centralized multi-service log viewing&lt;/td&gt;
&lt;td&gt;Log file management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Service Assurance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Distributed locks, idempotency, rate limiting, deduplication&lt;/td&gt;
&lt;td&gt;Redisson + custom annotations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unit Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ensure code quality&lt;/td&gt;
&lt;td&gt;JUnit5 + 1121+ test cases&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="business-subsystem-overview"&gt;Business Subsystem Overview&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Subsystem&lt;/th&gt;
&lt;th&gt;Table Count&lt;/th&gt;
&lt;th&gt;One-Sentence Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BPM Workflow&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Approval process engine, DingTalk-like designer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay Payment Center&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Unified payment/refund/transfer, abstracting channel differences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report Dashboards&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Drag-and-drop dashboard design, three reporting engines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member Center&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Membership system, VIP levels, points check-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MP Official Accounts&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Multi-account management, follower messages, auto-reply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mall E-Commerce&lt;/td&gt;
&lt;td&gt;70+&lt;/td&gt;
&lt;td&gt;Complete B2C e-commerce system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRM Customer Management&lt;/td&gt;
&lt;td&gt;20+&lt;/td&gt;
&lt;td&gt;Lead → Opportunity → Contract → Collection full process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ERP Purchase-Sales-Inventory&lt;/td&gt;
&lt;td&gt;30+&lt;/td&gt;
&lt;td&gt;Procurement/sales/inventory/finance integrated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sale Finance&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;ERP sub-module, receipts/payments/settlements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WMS Warehouse Management&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;General warehouse management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MES Manufacturing Execution&lt;/td&gt;
&lt;td&gt;133&lt;/td&gt;
&lt;td&gt;Workshop-level manufacturing management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Large Model&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Chat/drawing/knowledge base/workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IoT Internet of Things&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Device management/thing model/rule engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IM Instant Messaging&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Private chat/group chat/channels/audio-video&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="suitable-users"&gt;Suitable Users&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Java Developers&lt;/strong&gt;: Have Spring Boot foundation, want to rapidly deliver enterprise-level projects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small &amp;amp; Medium Teams&lt;/strong&gt;: Need a foundation covering multiple business scenarios, reducing redundant development&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise IT Departments&lt;/strong&gt;: Internal digitalization, need mature modules like approval flows, purchase-sales-inventory, CRM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SaaS Providers&lt;/strong&gt;: Need multi-tenant capabilities and modular architecture to serve multiple customers&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Report Dashboards &amp; Data Visualization</title><link>https://ruoyiplus.com/en/ruoyi/report/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/report/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Report module enables non-technical users to create professional data dashboards&lt;/strong&gt;. Without writing any frontend code, by dragging and dropping components and configuring data sources, you can generate visual reports and dashboard pages. Suitable for management dashboards, data monitoring, project reporting, and similar scenarios.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: Create data dashboards like making a PowerPoint presentation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How Report Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Management wants to see data, developers have to write pages each time&lt;/td&gt;
&lt;td&gt;Drag-and-drop design, business users can do it themselves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data display requirements change frequently&lt;/td&gt;
&lt;td&gt;Modify dashboard configuration, no deployment needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need professional visualization effects&lt;/td&gt;
&lt;td&gt;Built-in dozens of chart components and templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Different scenarios need different reporting engines&lt;/td&gt;
&lt;td&gt;Three engines provided, choose as needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
DESIGNER["Dashboard Designer&lt;br/&gt;Drag-and-drop dashboard configuration&lt;br/&gt;Set up data sources&lt;br/&gt;Publish dashboards"]
VIEWER["Viewer (Management/Clients)&lt;br/&gt;View dashboards&lt;br/&gt;Interactively filter data"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="three-reporting-engines"&gt;Three Reporting Engines&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph GoView["Go-View (Recommended)"]
G1["Open-source &amp; free"]
G2["Vue3 tech stack"]
G3["Pure frontend, standalone deployment"]
G4["Rich built-in chart components"]
end
subgraph Jimu["JimuReport"]
J1["Not open-source"]
J2["Embedded backend"]
J3["Supports complex reports"]
J4["Chinese-style reports"]
end
subgraph AJ["AJ-Report"]
A1["Open-source"]
A2["Under development"]
A3["Fully backend-driven"]
end
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th style="text-align: center"&gt;Go-View&lt;/th&gt;
&lt;th style="text-align: center"&gt;JimuReport&lt;/th&gt;
&lt;th style="text-align: center"&gt;AJ-Report&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open-source&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning Curve&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐ Low&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐ Medium&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐ Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chart Richness&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex Reports&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recommended Scenario&lt;/td&gt;
&lt;td style="text-align: center"&gt;General dashboards&lt;/td&gt;
&lt;td style="text-align: center"&gt;Chinese-style complex reports&lt;/td&gt;
&lt;td style="text-align: center"&gt;Backend-driven scenarios&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="dashboard-design-process"&gt;Dashboard Design Process&lt;/h2&gt;
&lt;div class="mermaid"&gt;flowchart LR
A["New Dashboard&lt;br/&gt;Choose template or blank"] --&gt; B["Drag Components&lt;br/&gt;Charts/Text/Images/Borders"]
B --&gt; C["Configure Data Sources&lt;br/&gt;API / Static Data"]
C --&gt; D["Adjust Styles&lt;br/&gt;Layout/Colors/Animations"]
D --&gt; E["Preview&lt;br/&gt;Real-time view"]
E --&gt; F{Satisfied?}
F --&gt;|Yes| G["Publish Dashboard&lt;br/&gt;Generate access link"]
F --&gt;|No| B
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="built-in-chart-components-partial"&gt;Built-in Chart Components (Partial)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Line Chart / Bar Chart / Pie Chart / Radar Chart&lt;/li&gt;
&lt;li&gt;Data Table / Scrolling Table&lt;/li&gt;
&lt;li&gt;Number Flipper&lt;/li&gt;
&lt;li&gt;Map (China / Province / City)&lt;/li&gt;
&lt;li&gt;Gauge&lt;/li&gt;
&lt;li&gt;Word Cloud&lt;/li&gt;
&lt;li&gt;Timeline&lt;/li&gt;
&lt;li&gt;Border and Decoration Components&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="typical-application-scenarios"&gt;Typical Application Scenarios&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Dashboard Content&lt;/th&gt;
&lt;th&gt;Viewers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sales Dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Today&amp;rsquo;s sales, order volume, conversion rate, regional ranking&lt;/td&gt;
&lt;td&gt;Sales Director, Management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Production Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Production line status, output, defect rate, equipment OEE&lt;/td&gt;
&lt;td&gt;Production Manager, Plant Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operations Dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User growth, activity, retention, revenue trends&lt;/td&gt;
&lt;td&gt;Operations Team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project Reporting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Project progress, milestones, risks, resource usage&lt;/td&gt;
&lt;td&gt;Project Stakeholders&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>AI Large Model</title><link>https://ruoyiplus.com/en/ruoyi/ai/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/ai/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The AI module is a one-stop AI capability integration platform&lt;/strong&gt;, connecting to mainstream large models both domestically and internationally, providing 8 major AI capabilities including chat, drawing, knowledge base (RAG), tool calling, workflow, writing, mind mapping, and music creation. Whether you want to add an AI assistant to your system or build an AI-native application, ready-to-use capabilities are all here.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: Make your system &amp;ldquo;able to chat, draw, write articles, and sing.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How the AI Module Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Integrating large models requires individual API integration&lt;/td&gt;
&lt;td&gt;Unified integration of mainstream domestic and international models, one-time integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal enterprise knowledge cannot be utilized by AI&lt;/td&gt;
&lt;td&gt;RAG knowledge base lets AI understand your documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single AI capability (only chatting)&lt;/td&gt;
&lt;td&gt;8 major capability modules covering various scenarios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to orchestrate AI workflows&lt;/td&gt;
&lt;td&gt;Integrated with Dify/FastGPT/Coze workflow platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex switching between domestic and international models&lt;/td&gt;
&lt;td&gt;Unified API layer, switch models without changing code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
AI_ADMIN["AI Administrator&lt;br/&gt;Configure model access&lt;br/&gt;Manage knowledge bases&lt;br/&gt;Set permissions"]
AI_USER["AI User&lt;br/&gt;Chat conversations&lt;br/&gt;Drawing creation&lt;br/&gt;Knowledge base Q&amp;A&lt;br/&gt;Writing/Mind mapping"]
AI_DEV["Developer&lt;br/&gt;Integrate AI capabilities via API&lt;br/&gt;Create custom workflows"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="8-major-functional-modules"&gt;8 Major Functional Modules&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
AI_CORE["AI Large Model Platform"]
AI_CORE --&gt; CHAT["💬 AI Chat&lt;br/&gt;Multi-model conversation&lt;br/&gt;Context memory&lt;br/&gt;Internet search&lt;br/&gt;Thinking reasoning mode"]
AI_CORE --&gt; IMAGE["🎨 AI Drawing&lt;br/&gt;Text-to-image&lt;br/&gt;Supports Stable Diffusion&lt;br/&gt;Midjourney"]
AI_CORE --&gt; RAG["📚 AI Knowledge Base&lt;br/&gt;RAG retrieval-augmented generation&lt;br/&gt;Upload documents for Q&amp;A"]
AI_CORE --&gt; TOOL["🔧 AI Tool Calling&lt;br/&gt;Function Calling&lt;br/&gt;MCP Protocol"]
AI_CORE --&gt; WORKFLOW["🔄 AI Workflow&lt;br/&gt;Integrates Dify/FastGPT/Coze&lt;br/&gt;Visual orchestration"]
AI_CORE --&gt; WRITE["✍️ AI Writing&lt;br/&gt;Articles/Reports/Emails&lt;br/&gt;Multi-scenario templates"]
AI_CORE --&gt; MINDMAP["🧠 AI Mind Mapping&lt;br/&gt;Auto-generate mind maps"]
AI_CORE --&gt; MUSIC["🎵 AI Music&lt;br/&gt;Suno AI music creation"]
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="supported-models"&gt;Supported Models&lt;/h2&gt;
&lt;h3 id="domestic-models"&gt;Domestic Models&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tongyi Qianwen&lt;/td&gt;
&lt;td&gt;Alibaba Cloud&lt;/td&gt;
&lt;td&gt;Strong comprehensive capability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;High cost-effectiveness, strong reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Doubao&lt;/td&gt;
&lt;td&gt;ByteDance&lt;/td&gt;
&lt;td&gt;Multimodal capability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hunyuan&lt;/td&gt;
&lt;td&gt;Tencent&lt;/td&gt;
&lt;td&gt;Good ecosystem integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wenxin Yiyan&lt;/td&gt;
&lt;td&gt;Baidu&lt;/td&gt;
&lt;td&gt;Strong Chinese comprehension&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM&lt;/td&gt;
&lt;td&gt;Zhipu AI&lt;/td&gt;
&lt;td&gt;Open-source friendly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spark&lt;/td&gt;
&lt;td&gt;iFlytek&lt;/td&gt;
&lt;td&gt;Outstanding voice capability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moonshot&lt;/td&gt;
&lt;td&gt;Moonshot AI&lt;/td&gt;
&lt;td&gt;Long context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax&lt;/td&gt;
&lt;td&gt;MiniMax&lt;/td&gt;
&lt;td&gt;Multimodal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BaiChuan&lt;/td&gt;
&lt;td&gt;Baichuan Intelligence&lt;/td&gt;
&lt;td&gt;Chinese optimized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SiliconFlow&lt;/td&gt;
&lt;td&gt;SiliconFlow&lt;/td&gt;
&lt;td&gt;Multi-model aggregation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="international-models"&gt;International Models&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama&lt;/td&gt;
&lt;td&gt;Meta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="core-capability-details"&gt;Core Capability Details&lt;/h2&gt;
&lt;h3 id="ai-chat"&gt;AI Chat&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User: Help me analyze this quarter&amp;#39;s sales data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AI: Based on the data, Q3 sales increased 15% year-over-year, including...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ (Supports Thinking reasoning mode)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Displays complete reasoning process + conclusions
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Supports internet search, enabling AI to access real-time information.&lt;/p&gt;
&lt;h3 id="ai-knowledge-base-rag"&gt;AI Knowledge Base (RAG)&lt;/h3&gt;
&lt;div class="mermaid"&gt;flowchart LR
DOC["Upload Documents&lt;br/&gt;PDF/Word/Web Pages"] --&gt; PARSE["Document Parsing&lt;br/&gt;Segmentation/Vectorization"]
PARSE --&gt; STORE["Vector Storage"]
QUERY["User Question"] --&gt; SEARCH["Retrieve Relevant Passages"]
STORE --&gt; SEARCH
SEARCH --&gt; LLM["Large Model&lt;br/&gt;Answer with context"]
LLM --&gt; ANSWER["Accurate Answer"]
&lt;/div&gt;
&lt;h3 id="ai-workflow"&gt;AI Workflow&lt;/h3&gt;
&lt;p&gt;Integrates Dify, FastGPT, Coze, and other platforms, enabling visual orchestration of complex AI workflows, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intelligent Customer Service: User question → Intent recognition → Knowledge base retrieval → Escalation decision&lt;/li&gt;
&lt;li&gt;Content Generation: Keywords → Outline → Body → Image generation → Publishing&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>CRM Customer Relationship Management</title><link>https://ruoyiplus.com/en/ruoyi/crm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/crm/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CRM is the sales team&amp;rsquo;s &amp;ldquo;command center.&amp;rdquo;&lt;/strong&gt; From a single lead, to converting into a customer, creating an opportunity, signing a contract, and receiving payment — the entire sales funnel is visualized here. Combined with the public pool mechanism, it prevents customer resources from being &amp;ldquo;hoarded&amp;rdquo; by individual salespeople.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: Help your sales team say goodbye to managing customers in Excel, and make every deal traceable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How CRM Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Customer info scattered in salespeople&amp;rsquo;s personal WeChat/Excel&lt;/td&gt;
&lt;td&gt;Unified customer database, no data loss during handover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales collision, multiple people following the same customer&lt;/td&gt;
&lt;td&gt;Customer lock mechanism + public pool rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No visibility into what salespeople do daily&lt;/td&gt;
&lt;td&gt;Follow-up records, visit records fully logged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unclear which part of the sales funnel has issues&lt;/td&gt;
&lt;td&gt;Lead→Customer→Opportunity→Contract conversion rate visualization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chaotic payment collection management&lt;/td&gt;
&lt;td&gt;Contract → Payment Plan → Payment Record full chain&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
SALES["Salesperson&lt;br/&gt;Follow up on leads and customers&lt;br/&gt;Create opportunities and contracts&lt;br/&gt;Record follow-ups and payments"]
MANAGER["Sales Manager&lt;br/&gt;Assign leads and customers&lt;br/&gt;Approve contracts&lt;br/&gt;View team data"]
ADMIN4["Administrator&lt;br/&gt;Configure public pool rules&lt;br/&gt;Manage product catalog&lt;br/&gt;Data statistics and analysis"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="complete-sales-process"&gt;Complete Sales Process&lt;/h2&gt;
&lt;div class="mermaid"&gt;flowchart LR
A["🔍 Lead&lt;br/&gt;Potential customer source"] --&gt;|Convert| B["👤 Customer&lt;br/&gt;Official customer"]
B --&gt;|Create| C["💼 Opportunity&lt;br/&gt;Sales opportunity"]
C --&gt;|Advance| D["📝 Contract&lt;br/&gt;Signing"]
D --&gt;|Collect| E["💰 Payment&lt;br/&gt;Funds received"]
A -.-&gt;|Invalid| X1["❌ Invalid Lead"]
B -.-&gt;|Long-term no follow-up| X2["🌊 Falls into Public Pool"]
X2 -.-&gt;|Claimed by other salesperson| B
C -.-&gt;|Lost| X3["❌ Close Opportunity"]
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="core-table-structure-er-diagram"&gt;Core Table Structure (ER Diagram)&lt;/h2&gt;
&lt;div class="mermaid"&gt;erDiagram
CRM_CLUE ||--o| CRM_CUSTOMER : "Converted to"
CRM_CUSTOMER ||--o{ CRM_CONTACT : "Has"
CRM_CUSTOMER ||--o{ CRM_BUSINESS : "Creates"
CRM_BUSINESS ||--o{ CRM_CONTRACT : "Advances to"
CRM_CONTRACT ||--o{ CRM_RECEIVABLE : "Payment"
CRM_CONTRACT ||--o{ CRM_RECEIVABLE_PLAN : "Payment Plan"
CRM_CLUE {
bigint id PK
varchar name "Lead Name"
varchar mobile "Phone Number"
tinyint status "Status"
bigint owner_user_id FK "Owner"
}
CRM_CUSTOMER {
bigint id PK
varchar name "Customer Name"
tinyint level "Customer Level"
bigint owner_user_id FK "Owner"
}
CRM_CONTACT {
bigint id PK
bigint customer_id FK
varchar name "Contact Name"
varchar mobile "Phone Number"
}
CRM_BUSINESS {
bigint id PK
bigint customer_id FK
varchar name "Opportunity Name"
decimal total_price "Estimated Amount"
tinyint status "Stage"
}
CRM_CONTRACT {
bigint id PK
bigint business_id FK
varchar no "Contract Number"
decimal total_price "Contract Amount"
tinyint status "Status"
}
CRM_RECEIVABLE {
bigint id PK
bigint contract_id FK
decimal price "Payment Amount"
datetime time "Payment Time"
}
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="public-pool-mechanism"&gt;Public Pool Mechanism&lt;/h2&gt;
&lt;div class="mermaid"&gt;flowchart TB
CUSTOMER["Customer"] --&gt;|Salesperson following up| PROTECTED["Protection Period&lt;br/&gt;Other salespeople cannot claim"]
PROTECTED --&gt;|No follow-up for N days| SEA["Public Pool&lt;br/&gt;Visible to all salespeople"]
PROTECTED --&gt;|Deal Closed| DEAL["Locked&lt;br/&gt;Permanently assigned to this salesperson"]
SEA --&gt;|Claimed by other salesperson| PROTECTED
SEA --&gt;|Reached customer limit| LIMIT["Exceeded personal customer limit&lt;br/&gt;Cannot claim"]
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto-Release&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;If no follow-up for N days, customer automatically falls into public pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advance Reminder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remind salesperson to follow up before deadline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lock Protection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Closed-deal customers permanently locked, will not fall into public pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customer Limit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Each salesperson has a maximum customer count limit to prevent hoarding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scheduled Task&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Background scheduled scan and execution of public pool release logic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="data-permissions"&gt;Data Permissions&lt;/h2&gt;
&lt;p&gt;CRM uses an &lt;strong&gt;owner mechanism&lt;/strong&gt; for data isolation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each customer/lead/opportunity/contract has an &lt;code&gt;owner_user_id&lt;/code&gt; field&lt;/li&gt;
&lt;li&gt;Salespeople can only see their own data&lt;/li&gt;
&lt;li&gt;Sales managers can see team data&lt;/li&gt;
&lt;li&gt;Administrators can see all data&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;transfer&lt;/strong&gt; operation: transfer customers to other salespeople&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="feature-list"&gt;Feature List&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lead Management&lt;/td&gt;
&lt;td&gt;Lead entry, assignment, conversion, invalid marking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer Management&lt;/td&gt;
&lt;td&gt;Customer info, contacts, follow-up records, locking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public Pool Customers&lt;/td&gt;
&lt;td&gt;Public pool, claiming, release rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opportunity Management&lt;/td&gt;
&lt;td&gt;Opportunity stages, estimated amount, win/loss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contract Management&lt;/td&gt;
&lt;td&gt;Contract creation, approval, changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment Management&lt;/td&gt;
&lt;td&gt;Payment plans, payment records, receivables statistics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product Management&lt;/td&gt;
&lt;td&gt;Product catalog, pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Statistics&lt;/td&gt;
&lt;td&gt;Funnel analysis, performance statistics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Member Center</title><link>https://ruoyiplus.com/en/ruoyi/member/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/member/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Member module provides an independent member user system&lt;/strong&gt;, completely isolated from backend admin users (system_users). It serves as the user foundation for the e-commerce system, responsible for member registration, login, level progression, points operations, and the full lifecycle management of C-end users.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Key Distinction&lt;/strong&gt;: Admins log into the backend using &lt;code&gt;system_users&lt;/code&gt; (system users), while C-end users register and log in using &lt;code&gt;member_user&lt;/code&gt; (member users) — two completely independent systems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How Member Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C-end users need independent registration/login&lt;/td&gt;
&lt;td&gt;Independent member user table, not mixed with admin users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need membership levels and benefits system&lt;/td&gt;
&lt;td&gt;VIP levels + growth value mechanism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to increase user engagement and retention&lt;/td&gt;
&lt;td&gt;Points check-in, points mall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WeChat ecosystem users need one-click login&lt;/td&gt;
&lt;td&gt;Official account login, mini program login, mini program subscription messages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph BackendRoles
ADMIN3["Operations Staff&lt;br/&gt;Manage member information&lt;br/&gt;Configure VIP levels&lt;br/&gt;Manage points rules&lt;br/&gt;Set member tags and groups"]
end
subgraph FrontendRoles
MEMBER2["Regular Member&lt;br/&gt;Register/Login/Profile"]
VIP["VIP Member&lt;br/&gt;Enjoy level benefits&lt;br/&gt;Earn and use points"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="membership-system-architecture"&gt;Membership System Architecture&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph AccountSystem
LOGIN["Login Methods&lt;br/&gt;Phone/Email/WeChat"]
REGISTER["Registration&lt;br/&gt;Phone/WeChat authorization"]
end
subgraph LevelSystem
LEVEL["VIP Levels&lt;br/&gt;Regular → Silver → Gold → Diamond"]
GROWTH["Growth Value&lt;br/&gt;Earned through purchases/check-ins/tasks"]
LEVEL --&gt; GROWTH
end
subgraph PointsSystem
POINTS_GET["Points Earning&lt;br/&gt;Check-in/Purchases/Campaigns"]
POINTS_USE["Points Usage&lt;br/&gt;Deduction/Redemption"]
POINTS_GET --&gt; POINTS_USE
end
subgraph OperationsSystem
TAG["Member Tags&lt;br/&gt;Profile labeling"]
GROUP["Member Groups&lt;br/&gt;Targeted operations"]
end
LOGIN --&gt; MemberUserTable
REGISTER --&gt; MemberUserTable
MemberUserTable --&gt; LevelSystem
MemberUserTable --&gt; PointsSystem
MemberUserTable --&gt; OperationsSystem
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="wechat-ecosystem-integration"&gt;WeChat Ecosystem Integration&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
MEMBER3["Member Module"]
subgraph WeChatCapabilities
MP_LOGIN["Official Account Login&lt;br/&gt;WeChat H5 authorization"]
MINI_LOGIN["Mini Program Login&lt;br/&gt;One-click phone number access"]
MINI_QR["Mini Program QR Code&lt;br/&gt;Parameterized QR code"]
MINI_MSG["Mini Program Subscription Messages&lt;br/&gt;Order/Logistics/Campaign notifications"]
end
MEMBER3 --&gt; MP_LOGIN
MEMBER3 --&gt; MINI_LOGIN
MEMBER3 --&gt; MINI_QR
MEMBER3 --&gt; MINI_MSG
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="relationship-with-mall"&gt;Relationship with Mall&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
MEMBER4["Member Center&lt;br/&gt;Provides: Member info/Level/Points"] --&gt; MALL2["Mall E-Commerce&lt;br/&gt;Consumption: Use member identity to order&lt;br/&gt;Earning: Orders earn points and growth value"]
MALL2 --&gt; MEMBER4
&lt;/div&gt;
&lt;p&gt;The mall depends on the member module for user identity, while the mall&amp;rsquo;s consumption behavior feeds back points and growth value to the member system.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="core-feature-list"&gt;Core Feature List&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Member Management&lt;/td&gt;
&lt;td&gt;Member list, details, status management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member Tags&lt;/td&gt;
&lt;td&gt;Custom tags, user profile labeling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member Levels&lt;/td&gt;
&lt;td&gt;VIP level configuration, growth value rules, level upgrades/downgrades&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member Groups&lt;/td&gt;
&lt;td&gt;Group by conditions, support targeted push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Points Check-in&lt;/td&gt;
&lt;td&gt;Check-in rule configuration, consecutive check-in rewards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Points Records&lt;/td&gt;
&lt;td&gt;Points details, flow tracing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>MP WeChat Official Accounts</title><link>https://ruoyiplus.com/en/ruoyi/mp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/mp/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The MP module is a &amp;ldquo;multi-account management center&amp;rdquo; for WeChat Official Accounts&lt;/strong&gt;. If you operate multiple official accounts, you don&amp;rsquo;t need to log into the WeChat Official Account Platform and switch between them — here you can centrally manage followers, messages, menus, materials, and auto-replies for all official accounts.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: One admin panel manages all official accounts, doubling operational efficiency.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How MP Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Switching between multiple official accounts is cumbersome&lt;/td&gt;
&lt;td&gt;One admin panel manages multiple official accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follower information is scattered&lt;/td&gt;
&lt;td&gt;Unified follower list, tag management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-reply rule configuration is complex&lt;/td&gt;
&lt;td&gt;Visual configuration of follow replies, message replies, keyword replies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menu configuration experience is poor&lt;/td&gt;
&lt;td&gt;Visual menu editor, real-time preview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cannot integrate with business systems&lt;/td&gt;
&lt;td&gt;Follower data connected with member module&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
OP["Official Account Operator&lt;br/&gt;Manage followers and messages&lt;br/&gt;Configure auto-replies&lt;br/&gt;Edit menus&lt;br/&gt;Manage materials&lt;br/&gt;View data statistics"]
FAN["Followers&lt;br/&gt;Follow official account&lt;br/&gt;Send messages&lt;br/&gt;Trigger auto-replies"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="functional-architecture"&gt;Functional Architecture&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph Core["10 Major Functional Modules"]
ACCOUNT["Account Management&lt;br/&gt;Bind multiple official accounts"]
STATS["Data Statistics&lt;br/&gt;Follower growth/Message statistics"]
FANS["Follower Management&lt;br/&gt;Follower list/Tags/Sync"]
MSG["Message Management&lt;br/&gt;Receive/Reply to messages"]
AUTO["Auto-Reply&lt;br/&gt;Follow/Message/Keyword"]
TEMPLATE["Template Messages&lt;br/&gt;Business notification push"]
TAG2["Tag Management&lt;br/&gt;Follower grouping"]
MENU["Menu Management&lt;br/&gt;Visual configuration"]
MATERIAL["Material Management&lt;br/&gt;Articles/Images/Audio"]
DRAFT["Article Draft Box"]
end
subgraph WeChatAPI["WeChat Official Account API"]
WX_API["Message Receive/Send&lt;br/&gt;Menu Push&lt;br/&gt;Material Upload&lt;br/&gt;User Info Retrieval"]
end
Core --&gt; WeChatAPI
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="auto-reply-rules"&gt;Auto-Reply Rules&lt;/h2&gt;
&lt;div class="mermaid"&gt;flowchart LR
EVENT["User Action"] --&gt; TYPE{Reply Type}
TYPE --&gt;|Follow Account| FOLLOW["Follow Reply&lt;br/&gt;Welcome message + Guidance"]
TYPE --&gt;|Send Message| KEYWORD{Match Keyword?}
KEYWORD --&gt;|Exact Match| EXACT["Keyword Reply"]
KEYWORD --&gt;|Fuzzy Match| LIKE["Fuzzy Match Reply"]
KEYWORD --&gt;|No Match| DEFAULT["Default Message Reply"]
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="integration-with-business-systems"&gt;Integration with Business Systems&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
MP2["MP Official Accounts"] --&gt;|Follower Sync| MEMBER5["Member Center&lt;br/&gt;Account followers → Member users"]
MP2 --&gt;|Template Messages| MALL3["Mall E-Commerce&lt;br/&gt;Order status push"]
MEMBER5 --&gt;|WeChat Login| MP2
&lt;/div&gt;
&lt;p&gt;Official account followers can be synced as member users, and the mall can push order status to users via template messages, forming a complete WeChat ecosystem closed loop.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="core-feature-list"&gt;Core Feature List&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Account Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bind multiple official accounts, switch management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Statistics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Follower growth trends, message interaction statistics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Follower Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Follower list, details, tags, blocklist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Message Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Receive follower messages, manual reply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto-Reply&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Follow reply, default reply, keyword reply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Template Messages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Push template messages to followers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tag Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Follower grouping tags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Menu Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visual bottom menu configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Material Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Articles, images, voice, video material library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Article Draft Box&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Article message draft editing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Mall E-Commerce System</title><link>https://ruoyiplus.com/en/ruoyi/mall/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/mall/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Mall is the platform&amp;rsquo;s most complex business module (70+ tables)&lt;/strong&gt;, providing the full e-commerce chain from product management and order transactions to marketing campaigns and distribution commissions. One system comes with both an admin panel (Vue3+Element Plus) and a mobile app (uni-app), ready to use out of the box.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: If you need to build a B2C e-commerce store, 90% of the functionality is already implemented here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How Mall Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Building a store from scratch takes too long&lt;/td&gt;
&lt;td&gt;70+ tables + complete frontend/backend, go live in weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple marketing tactics are expensive to develop&lt;/td&gt;
&lt;td&gt;Built-in coupons/flash sales/group buying/bargaining/distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need both admin panel and user-facing frontend&lt;/td&gt;
&lt;td&gt;Admin panel + uni-app mobile app provided together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment and membership need extra integration&lt;/td&gt;
&lt;td&gt;Built-in integration with Payment Center and Member Center&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph BackendRoles
MALL_ADMIN["Mall Admin&lt;br/&gt;Manage products/orders/marketing"]
MALL_OP["Operations Staff&lt;br/&gt;Configure campaigns/review reviews"]
end
subgraph FrontendRoles
BUYER["Buyer&lt;br/&gt;Browse products/Place orders/Pay&lt;br/&gt;Participate in marketing campaigns"]
DISTRIBUTOR["Distributor&lt;br/&gt;Promote products&lt;br/&gt;Earn commissions"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="system-architecture"&gt;System Architecture&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph AdminPanel
ADMIN_PANEL["Vue3 + Element Plus Admin Panel&lt;br/&gt;Products/Orders/Marketing/Data"]
end
subgraph MobileApp
UNI_APP["uni-app Mobile App&lt;br/&gt;H5 + App + Mini Program&lt;br/&gt;Storefront customization (3 templates)"]
end
subgraph ProductCenter
CATEGORY["Product Categories"]
ATTR["Product Attributes"]
SPU["SPU Products"]
SKU["SKU Variants"]
REVIEW["Product Reviews"]
end
subgraph OrderCenter
CART["Shopping Cart"]
ORDER["Transaction Orders"]
AFTER_SALE["After-Sales Management"]
EXPRESS["Express Delivery"]
PICKUP["Self Pickup Verification"]
end
subgraph MarketingCenter
COUPON["Coupons"]
SECKILL["Flash Sales"]
BARGAIN["Bargaining"]
GROUPON["Group Buying"]
DISCOUNT["Limited-Time Discounts"]
CONTENT["Content Marketing"]
COMMISSION["Distribution Commissions"]
end
subgraph Dependencies
PAY2["Payment Center"]
MEMBER6["Member Center"]
MP3["Official Accounts"]
end
AdminPanel --&gt; ProductCenter
AdminPanel --&gt; OrderCenter
AdminPanel --&gt; MarketingCenter
MobileApp --&gt; ProductCenter
MobileApp --&gt; OrderCenter
MobileApp --&gt; MarketingCenter
OrderCenter --&gt; PAY2
OrderCenter --&gt; MEMBER6
MarketingCenter --&gt; MEMBER6
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="core-business-flow"&gt;Core Business Flow&lt;/h2&gt;
&lt;h3 id="user-order-process"&gt;User Order Process&lt;/h3&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant U2 as User
participant APP as Mobile/PC
participant MALL4 as Mall
participant PAY3 as Payment Center
participant WMS2 as Warehouse/WMS
U2-&gt;&gt;APP: Browse products, add to cart
U2-&gt;&gt;APP: Confirm order, select address
APP-&gt;&gt;MALL4: Create order (Pending Payment)
MALL4-&gt;&gt;PAY3: Initiate payment
PAY3--&gt;&gt;APP: Payment page
U2-&gt;&gt;PAY3: Complete payment
PAY3-&gt;&gt;MALL4: Callback: Payment successful
MALL4-&gt;&gt;MALL4: Order status → Pending Shipment
MALL4-&gt;&gt;WMS2: Notify shipment
WMS2-&gt;&gt;MALL4: Enter tracking number
MALL4-&gt;&gt;APP: Push shipment notification
U2-&gt;&gt;APP: Confirm receipt
MALL4-&gt;&gt;MALL4: Order complete, award points
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="marketing-campaign-matrix"&gt;Marketing Campaign Matrix&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campaign Type&lt;/th&gt;
&lt;th&gt;Mechanics&lt;/th&gt;
&lt;th&gt;Suitable Scenarios&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coupons&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Threshold discounts/percentage discounts/vouchers, can target specific products/categories&lt;/td&gt;
&lt;td&gt;Daily promotions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flash Sales&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited time &amp;amp; quantity, ultra-low price rush&lt;/td&gt;
&lt;td&gt;Traffic generation, inventory clearance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Group Buying&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-person group purchase for discount price&lt;/td&gt;
&lt;td&gt;Social viral growth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bargaining&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Share with friends to bargain down the price&lt;/td&gt;
&lt;td&gt;New user acquisition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Limited-Time Discounts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Discount during specified time period&lt;/td&gt;
&lt;td&gt;Holiday promotions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content Marketing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Articles/videos product seeding&lt;/td&gt;
&lt;td&gt;Content commerce&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distribution Commissions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Promotion commissions, multi-level distribution&lt;/td&gt;
&lt;td&gt;Social commerce&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="storefront-customization"&gt;Storefront Customization&lt;/h2&gt;
&lt;p&gt;The mobile app supports 3 storefront customization templates, allowing drag-and-drop component layout of the homepage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Carousel / Navigation icons / Product recommendations&lt;/li&gt;
&lt;li&gt;Coupon popups / Countdown timers&lt;/li&gt;
&lt;li&gt;Search bar / Announcement bar&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="dependencies"&gt;Dependencies&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mall E-Commerce
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── Payment Center (Pay) —— Order payment
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── Member Center (Member) —— User identity/points
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── Official Accounts (MP) —— WeChat H5 store
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>ERP Enterprise Resource Planning</title><link>https://ruoyiplus.com/en/ruoyi/erp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/erp/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ERP is the enterprise&amp;rsquo;s &amp;ldquo;purchase-sales-inventory hub&amp;rdquo;&lt;/strong&gt; — managing the complete flow of physical goods and funds from supplier procurement, warehouse inventory to customer sales. 30+ tables cover five core areas: procurement, sales, inventory, products, and finance, suitable for daily operations management of trading and manufacturing enterprises.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: Manage your goods and money, making every transaction traceable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How ERP Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inventory quantities rely on manual counting, often mismatched&lt;/td&gt;
&lt;td&gt;Every inbound/outbound transaction auto-updates inventory, real-time and accurate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Procurement and sales processes are opaque&lt;/td&gt;
&lt;td&gt;Document approval workflow + status tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unclear how much profit is made&lt;/td&gt;
&lt;td&gt;Procurement cost vs. sales revenue, auto-calculated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-warehouse transfers are chaotic&lt;/td&gt;
&lt;td&gt;Stock transfer operations are recorded, inventory locations are clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Financial receivables and payables are hard to manage&lt;/td&gt;
&lt;td&gt;Settlement accounts + payment/receipt records&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
PURCHASER["Purchaser&lt;br/&gt;Manage suppliers&lt;br/&gt;Create purchase orders&lt;br/&gt;Handle purchase inbound and returns"]
SALES2["Salesperson&lt;br/&gt;Manage customers&lt;br/&gt;Create sales orders&lt;br/&gt;Handle sales outbound and returns"]
WAREHOUSE["Warehouse Keeper&lt;br/&gt;Confirm inbound/outbound&lt;br/&gt;Manage inventory&lt;br/&gt;Execute stocktaking"]
FINANCE["Finance&lt;br/&gt;Manage settlement accounts&lt;br/&gt;Handle payments/receipts&lt;br/&gt;Review documents"]
MANAGER2["Manager&lt;br/&gt;Approve documents&lt;br/&gt;View reports"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="five-core-modules"&gt;Five Core Modules&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph Procurement["Procurement Management"]
P1["Supplier Management"]
P2["Purchase Orders"]
P3["Purchase Inbound"]
P4["Purchase Returns"]
end
subgraph Sales["Sales Management"]
S1["Customer Management"]
S2["Sales Orders"]
S3["Sales Outbound"]
S4["Sales Returns"]
end
subgraph Inventory["Inventory Management"]
I1["Inventory Query"]
I2["Inventory Flow"]
I3["Stock Transfer"]
I4["Stocktaking"]
end
subgraph Products["Product Management"]
PR1["Product Categories"]
PR2["Product Information"]
PR3["Product Units"]
end
subgraph Finance["Financial Management"]
F1["Settlement Accounts"]
F2["Purchase Payments"]
F3["Sales Receipts"]
end
PI["Purchase Inbound"] --&gt;|Inventory Increase| Inventory
PR["Purchase Returns"] --&gt;|Inventory Decrease| Inventory
SO["Sales Outbound"] --&gt;|Inventory Decrease| Inventory
SR["Sales Returns"] --&gt;|Inventory Increase| Inventory
PO["Purchase Orders"] --&gt;|Payment| Finance
SO["Sales Orders"] --&gt;|Receipt| Finance
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="procurement-process"&gt;Procurement Process&lt;/h2&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant P as Purchaser
participant ERP3 as ERP
participant S as Supplier
participant WH as Warehouse
P-&gt;&gt;ERP3: Select supplier, create purchase order
ERP3-&gt;&gt;ERP3: Order status: Pending Approval
Note over ERP3: Can integrate BPM workflow approval
ERP3-&gt;&gt;ERP3: Approved
P-&gt;&gt;S: Notify supplier to ship
S-&gt;&gt;WH: Goods delivered
WH-&gt;&gt;ERP3: Create purchase inbound order
ERP3-&gt;&gt;ERP3: Inbound approved
ERP3-&gt;&gt;ERP3: Inventory increased
Note over ERP3: If return needed
P-&gt;&gt;ERP3: Create purchase return order
ERP3-&gt;&gt;ERP3: Return approved → Inventory decreased
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="sales-process"&gt;Sales Process&lt;/h2&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant C as Customer
participant S2 as Salesperson
participant ERP4 as ERP
participant WH2 as Warehouse
C-&gt;&gt;S2: Place purchase demand
S2-&gt;&gt;ERP4: Create sales order
ERP4-&gt;&gt;ERP4: Order approved
S2-&gt;&gt;WH2: Notify warehouse to prepare goods
WH2-&gt;&gt;ERP4: Create sales outbound order
ERP4-&gt;&gt;ERP4: Outbound approved
ERP4-&gt;&gt;ERP4: Inventory decreased
WH2-&gt;&gt;C: Ship goods
Note over ERP4: If return needed
S2-&gt;&gt;ERP4: Create sales return order
ERP4-&gt;&gt;ERP4: Return approved → Inventory increased
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="core-table-structure"&gt;Core Table Structure&lt;/h2&gt;
&lt;div class="mermaid"&gt;erDiagram
ERP_PRODUCT ||--o{ ERP_PURCHASE_ORDER_ITEM : "Procurement"
ERP_PRODUCT ||--o{ ERP_SALE_ORDER_ITEM : "Sales"
ERP_PRODUCT ||--o{ ERP_STOCK : "Inventory"
ERP_PURCHASE_ORDER ||--o{ ERP_PURCHASE_ORDER_ITEM : "Contains"
ERP_PURCHASE_ORDER ||--o{ ERP_PURCHASE_IN : "Inbound"
ERP_SALE_ORDER ||--o{ ERP_SALE_ORDER_ITEM : "Contains"
ERP_SALE_ORDER ||--o{ ERP_SALE_OUT : "Outbound"
ERP_STOCK {
bigint id PK
bigint product_id FK "Product"
bigint warehouse_id FK "Warehouse"
int stock "Inventory Qty"
}
ERP_PURCHASE_ORDER {
bigint id PK
varchar no "Document No."
bigint supplier_id FK "Supplier"
tinyint status "Status"
decimal total_price "Total Amount"
}
ERP_SALE_ORDER {
bigint id PK
varchar no "Document No."
bigint customer_id FK "Customer"
tinyint status "Status"
decimal total_price "Total Amount"
}
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="document-number-rules"&gt;Document Number Rules&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Format: {prefix}{yyyyMMdd}{6-digit auto-increment}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Example: CGD20240625000001 (Purchase Order)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; XSD20240625000001 (Sales Order)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="approval-mechanism"&gt;Approval Mechanism&lt;/h2&gt;
&lt;p&gt;All inbound/outbound documents have an approval status (&lt;code&gt;ErpAuditStatus&lt;/code&gt;):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Not Approved&lt;/td&gt;
&lt;td&gt;Draft status, editable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approved&lt;/td&gt;
&lt;td&gt;Approved, triggers inventory change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Key Rule&lt;/strong&gt;: Only approved documents affect inventory; rejected documents produce no inventory changes.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="dependencies"&gt;Dependencies&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERP Purchase-Sales-Inventory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── BPM Workflow (Optional) —— Approval process
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>WMS Warehouse Management System</title><link>https://ruoyiplus.com/en/ruoyi/wms/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/wms/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;WMS is an independent general warehouse management system (16 tables)&lt;/strong&gt;, distinct from the manufacturing-deeply-integrated warehouse module in MES. WMS is positioned as &amp;ldquo;general warehouse management,&amp;rdquo; suitable for pure warehousing scenarios. If you need deep manufacturing integration (such as line-side inventory, production picking), use the warehouse module in MES.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: Manage the warehouse&amp;rsquo;s &amp;ldquo;in, out, transfer, count&amp;rdquo; — always know where every item is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How WMS Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Don&amp;rsquo;t know how much inventory is in the warehouse&lt;/td&gt;
&lt;td&gt;Real-time inventory query, inventory flow tracing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound/outbound records rely on paper documents&lt;/td&gt;
&lt;td&gt;Electronic documents, traceable status flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unclear item locations&lt;/td&gt;
&lt;td&gt;Multi-warehouse, location management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stocktaking is time-consuming and labor-intensive&lt;/td&gt;
&lt;td&gt;Systematic stocktaking process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inventory data is inaccurate&lt;/td&gt;
&lt;td&gt;Every operation auto-updates inventory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
WH_ADMIN["Warehouse Admin&lt;br/&gt;Manage warehouses/locations&lt;br/&gt;Configure product info&lt;br/&gt;Handle inbound/outbound/transfer/stocktaking&lt;br/&gt;View inventory"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="core-business-processes"&gt;Core Business Processes&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph InboundProcess
IN1["Create Inbound Order"] --&gt; IN2["Draft Status"]
IN2 --&gt; IN3["Confirm Complete"]
IN3 --&gt; IN4["Inventory Increased"]
IN2 --&gt; IN5["Voided"]
end
subgraph OutboundProcess
OUT1["Create Outbound Order"] --&gt; OUT2["Draft Status"]
OUT2 --&gt; OUT3["Confirm Complete"]
OUT3 --&gt; OUT4["Inventory Decreased"]
OUT2 --&gt; OUT5["Voided"]
end
subgraph TransferProcess
MV1["Create Transfer Order"] --&gt; MV2["Confirm Complete"]
MV2 --&gt; MV3["Source Warehouse Inventory Decreased&lt;br/&gt;Target Warehouse Inventory Increased"]
end
subgraph StocktakingProcess
CK1["Create Stocktaking Order"] --&gt; CK2["Enter Actual Count"]
CK2 --&gt; CK3["Confirm Complete"]
CK3 --&gt; CK4["Surplus: Inventory Increased&lt;br/&gt;Shortage: Inventory Decreased"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="core-table-structure"&gt;Core Table Structure&lt;/h2&gt;
&lt;div class="mermaid"&gt;erDiagram
WMS_WAREHOUSE ||--o{ WMS_STOCK : "Inventory"
WMS_PRODUCT ||--o{ WMS_STOCK : "Inventory"
WMS_WAREHOUSE {
bigint id PK
varchar name "Warehouse Name"
varchar code "Warehouse Code"
tinyint status "Status"
}
WMS_PRODUCT {
bigint id PK
varchar name "Product Name"
varchar no "Product Code"
varchar unit "Unit"
}
WMS_STOCK {
bigint id PK
bigint warehouse_id FK "Warehouse"
bigint product_id FK "Product"
int stock "Inventory Qty"
}
WMS_STOCK_RECORD {
bigint id PK
bigint warehouse_id FK
bigint product_id FK
int count "Change Qty"
tinyint type "In/Out Type"
varchar business_no "Related Document No."
}
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="document-number-rules"&gt;Document Number Rules&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Format: {prefix}{MMdd}{4-digit random}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Example: RK06250001 (Inbound Order)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CK06250001 (Outbound Order)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; YK06250001 (Transfer Order)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; PK06250001 (Stocktaking Order)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="two-phase-status-flow"&gt;Two-Phase Status Flow&lt;/h2&gt;
&lt;p&gt;All documents follow a &lt;strong&gt;Draft → Completed/Voided&lt;/strong&gt; two-phase pattern:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Draft&lt;/td&gt;
&lt;td&gt;Editable, does not trigger inventory changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;td&gt;Confirmed complete, triggers inventory transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voided&lt;/td&gt;
&lt;td&gt;Document voided, does not trigger inventory changes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Key Rule&lt;/strong&gt;: Only &amp;ldquo;Completed&amp;rdquo; status actually affects inventory quantities.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="difference-from-mes-warehouse"&gt;Difference from MES Warehouse&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;WMS&lt;/th&gt;
&lt;th&gt;MES Warehouse Module&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Positioning&lt;/td&gt;
&lt;td&gt;General warehouse management&lt;/td&gt;
&lt;td&gt;Manufacturing deep integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table Count&lt;/td&gt;
&lt;td&gt;16 tables&lt;/td&gt;
&lt;td&gt;62 tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use Case&lt;/td&gt;
&lt;td&gt;Standalone warehousing, logistics centers&lt;/td&gt;
&lt;td&gt;Manufacturing plants, production workshops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Special Features&lt;/td&gt;
&lt;td&gt;Basic inbound/outbound/stocktaking&lt;/td&gt;
&lt;td&gt;Line-side inventory, production picking, outsourcing management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requires MES&lt;/td&gt;
&lt;td&gt;❌ Standalone&lt;/td&gt;
&lt;td&gt;✅ Part of MES&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>MES Manufacturing Execution System</title><link>https://ruoyiplus.com/en/ruoyi/mes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/mes/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;MES is the largest business module on the entire platform (133 tables)&lt;/strong&gt;, designed for workshop-level management needs of manufacturing enterprises. It&amp;rsquo;s not just &amp;ldquo;purchase-sales-inventory,&amp;rdquo; but dives deep into production work orders, process routes, scheduling, work reporting, quality inspection, and equipment maintenance — a complete manufacturing execution system.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: If your factory needs to manage &amp;ldquo;how to schedule work orders, how to execute processes, how to inspect quality, how to maintain equipment,&amp;rdquo; MES is the answer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How MES Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Production progress is opaque&lt;/td&gt;
&lt;td&gt;Work order → Scheduling → Work reporting full-chain tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quality inspection relies on paper records&lt;/td&gt;
&lt;td&gt;IQC/IPQC/OQC/RQC digitized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Equipment failures affect delivery deadlines&lt;/td&gt;
&lt;td&gt;Equipment ledger + inspection plans for preventive maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Material management is chaotic&lt;/td&gt;
&lt;td&gt;Line-side inventory + production picking/return management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outsourced processing is hard to manage&lt;/td&gt;
&lt;td&gt;Independent outsourced inbound/outbound management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worker scheduling is complex&lt;/td&gt;
&lt;td&gt;Shift scheduling module&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
PLANNER["Planner&lt;br/&gt;Create production work orders&lt;br/&gt;Develop scheduling plans"]
WORKER["Operator&lt;br/&gt;View work order tasks&lt;br/&gt;Report work records&lt;br/&gt;Pick/return materials"]
QC["Quality Inspector&lt;br/&gt;IQC incoming inspection&lt;br/&gt;IPQC in-process inspection&lt;br/&gt;OQC outgoing inspection"]
MAINTENANCE["Equipment Maintainer&lt;br/&gt;Manage equipment ledger&lt;br/&gt;Execute inspection plans"]
SUPERVISOR["Workshop Supervisor&lt;br/&gt;View production progress&lt;br/&gt;Andon exception handling"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="seven-module-panorama"&gt;Seven Module Panorama&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph MD["Master Data md (17 tables)"]
MD1["Materials/Products"]
MD2["Customer/Supplier"]
MD3["Workshop Management"]
MD4["Coding Rules"]
end
subgraph PRO["Production Management pro (17 tables)"]
PRO1["Process Routes"]
PRO2["Production Work Orders"]
PRO3["Scheduling Orders"]
PRO4["Work Reports"]
PRO5["Andon System"]
end
subgraph WM["Warehouse Management wm (62 tables)"]
WM1["Location Setup"]
WM2["Inventory Management"]
WM3["Purchase Inbound"]
WM4["Finished Goods Inbound"]
WM5["Sales Outbound"]
WM6["Picking &amp; Returns"]
WM7["Stock Transfer"]
WM8["Stocktaking"]
WM9["Miscellaneous In/Out"]
WM10["Outsourcing Management"]
end
subgraph QC2["Quality Management qc (16 tables)"]
QC1["IQC Incoming Inspection"]
QC2_IN["IPQC In-Process Inspection"]
QC3["OQC Outgoing Inspection"]
QC4["RQC Return Inspection"]
end
subgraph DV["Equipment Management dv (12 tables)"]
DV1["Equipment Ledger"]
DV2["Inspection Plans"]
DV3["Inspection Records"]
end
subgraph TM["Tool Management tm (2 tables)"]
TM1["Tool Ledger"]
TM2["Tool Checkout"]
end
subgraph CAL["Shift Scheduling cal (7 tables)"]
CAL1["Shift Definition"]
CAL2["Scheduling Plans"]
end
MD --&gt; PRO
MD --&gt; WM
PRO --&gt; WM
PRO --&gt; QC2
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="production-execution-process"&gt;Production Execution Process&lt;/h2&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant PLAN as Planner
participant MES2 as MES
participant LINE as Production Line
participant QC3 as Quality Inspector
participant WH3 as Warehouse
PLAN-&gt;&gt;MES2: Create production work order
PLAN-&gt;&gt;MES2: Develop scheduling plan
MES2-&gt;&gt;LINE: Work order dispatched to production line
LINE-&gt;&gt;WH3: Material picking request
WH3-&gt;&gt;MES2: Confirm material issuance
LINE-&gt;&gt;MES2: Process work report
QC3-&gt;&gt;MES2: IPQC in-process inspection
LINE-&gt;&gt;MES2: Completion work report
QC3-&gt;&gt;MES2: OQC outgoing inspection
LINE-&gt;&gt;WH3: Finished goods inbound
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="quality-inspection-system"&gt;Quality Inspection System&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph IQC["IQC Incoming Inspection"]
I1["Supplier Incoming Materials"]
I2["Inspect → Pass/Fail"]
I3["Fail → Return/Concession"]
end
subgraph IPQC["IPQC In-Process Inspection"]
P1["Sample inspection during production"]
P2["Key process inspection"]
P3["Exception handling"]
end
subgraph OQC["OQC Outgoing Inspection"]
O1["Inspection before finished goods shipment"]
O2["Pass → Release"]
end
subgraph RQC["RQC Return Inspection"]
R1["Customer return inspection"]
R2["Determine responsibility attribution"]
end
IQC --&gt; IPQC --&gt; OQC
RQC -.-&gt; IQC
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="virtual-line-side-inventory-wip"&gt;Virtual Line-Side Inventory (WIP)&lt;/h2&gt;
&lt;p&gt;There is a special concept in the MES warehouse module — &lt;strong&gt;virtual line-side inventory&lt;/strong&gt; (&lt;code&gt;WIP_VIRTUAL_WAREHOUSE&lt;/code&gt;), used to track work-in-process materials on the shop floor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Materials issued from warehouse to production line → Line-side inventory increases&lt;/li&gt;
&lt;li&gt;Production line consumes materials → Line-side inventory decreases&lt;/li&gt;
&lt;li&gt;Finished goods completed → Line-side inventory decreases, finished goods inventory increases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This keeps the quantity and location of WIP materials on the shop floor always clear.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="relationship-with-other-modules"&gt;Relationship with Other Modules&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Relationship&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MES vs WMS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WMS is general warehouse management; MES&amp;rsquo;s warehouse module is deeply integrated with manufacturing (line-side inventory, picking, outsourcing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MES vs ERP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ERP manages &amp;ldquo;purchase-sales-inventory,&amp;rdquo; MES manages &amp;ldquo;production execution,&amp;rdquo; complementary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MES vs IoT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IoT can be used for equipment data collection, MES for production management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MES vs BPM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can integrate BPM for quality inspection exception approvals, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Sales &amp; Financial Management</title><link>https://ruoyiplus.com/en/ruoyi/sale/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/sale/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;This is the financial sub-module of the ERP system&lt;/strong&gt;, implemented by the &lt;code&gt;finance&lt;/code&gt; package of &lt;code&gt;yudao-module-erp&lt;/code&gt;. It does not exist independently but is tightly integrated into ERP&amp;rsquo;s procurement and sales processes, responsible for recording and managing the flow of funds.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: Procurement requires payment, sales require collection, returns require refunds — the financial module handles all these &amp;ldquo;money&amp;rdquo; matters.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How Financial Module Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Don&amp;rsquo;t know which supplier owes how much&lt;/td&gt;
&lt;td&gt;Settlement account balances are clearly visible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payments can&amp;rsquo;t be linked to specific purchase orders&lt;/td&gt;
&lt;td&gt;Payment orders linked to purchase inbound orders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collections disconnected from sales orders&lt;/td&gt;
&lt;td&gt;Receipt orders linked to sales outbound orders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refund process is chaotic&lt;/td&gt;
&lt;td&gt;Return orders automatically trigger refund process&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
FINANCE2["Finance Staff&lt;br/&gt;Manage settlement accounts&lt;br/&gt;Process payments/receipts&lt;br/&gt;Process refunds&lt;br/&gt;Reconcile accounts"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="core-er-diagram"&gt;Core ER Diagram&lt;/h2&gt;
&lt;div class="mermaid"&gt;erDiagram
ERP_ACCOUNT ||--o{ ERP_FINANCE_PAYMENT : "Payment"
ERP_ACCOUNT ||--o{ ERP_FINANCE_RECEIPT : "Receipt"
ERP_PURCHASE_IN ||--o{ ERP_FINANCE_PAYMENT : "Purchase Inbound → Payment"
ERP_PURCHASE_RETURN ||--o{ ERP_FINANCE_PAYMENT : "Purchase Return → Refund"
ERP_SALE_OUT ||--o{ ERP_FINANCE_RECEIPT : "Sales Outbound → Receipt"
ERP_SALE_RETURN ||--o{ ERP_FINANCE_RECEIPT : "Sales Return → Refund"
ERP_ACCOUNT {
bigint id PK
varchar name "Account Name"
decimal balance "Current Balance"
tinyint status "Status"
}
ERP_FINANCE_PAYMENT {
bigint id PK
varchar no "Payment No."
bigint account_id FK "Settlement Account"
bigint in_id FK "Purchase Inbound Order"
decimal price "Payment Amount"
datetime time "Payment Time"
}
ERP_FINANCE_RECEIPT {
bigint id PK
varchar no "Receipt No."
bigint account_id FK "Settlement Account"
bigint out_id FK "Sales Outbound Order"
decimal price "Receipt Amount"
datetime time "Receipt Time"
}
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="business-scenarios"&gt;Business Scenarios&lt;/h2&gt;
&lt;h3 id="scenario-1-purchase-payment"&gt;Scenario 1: Purchase Payment&lt;/h3&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant P2 as Purchaser
participant F2 as Finance
participant ERP5 as ERP
participant ACC as Settlement Account
P2-&gt;&gt;ERP5: Complete purchase inbound
F2-&gt;&gt;ERP5: View purchase inbound orders pending payment
F2-&gt;&gt;ERP5: Select settlement account, create payment order
ERP5-&gt;&gt;ACC: Deduct account balance
ERP5-&gt;&gt;ERP5: Record payment transaction
&lt;/div&gt;
&lt;h3 id="scenario-2-sales-receipt"&gt;Scenario 2: Sales Receipt&lt;/h3&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant S3 as Salesperson
participant F3 as Finance
participant ERP6 as ERP
participant ACC2 as Settlement Account
S3-&gt;&gt;ERP6: Complete sales outbound
F3-&gt;&gt;ERP6: View sales outbound orders pending receipt
F3-&gt;&gt;ERP6: Select settlement account, create receipt order
ERP6-&gt;&gt;ACC2: Increase account balance
ERP6-&gt;&gt;ERP6: Record receipt transaction
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="settlement-accounts"&gt;Settlement Accounts&lt;/h2&gt;
&lt;p&gt;Settlement accounts represent the fund account relationship between the company and suppliers/customers. Every payment and receipt affects the corresponding account balance.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Account Name&lt;/td&gt;
&lt;td&gt;e.g., &amp;ldquo;XX Supplier Settlement Account&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current Balance&lt;/td&gt;
&lt;td&gt;Real-time updates, payments deduct, receipts add&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Enabled/Disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>IoT Internet of Things</title><link>https://ruoyiplus.com/en/ruoyi/iot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/iot/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The IoT module is a device management platform similar to Alibaba Cloud IoT Platform&lt;/strong&gt;. It can connect massive devices, define device capabilities through thing models, process device data using a rule engine, and achieve device data collection, remote control, and scenario linkage.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: If your hardware devices need cloud-based management, this provides the complete chain from device registration to data flow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How IoT Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Diverse device access protocols&lt;/td&gt;
&lt;td&gt;Supports MQTT/HTTP/CoAP/TCP/UDP/WebSocket/Modbus etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-uniform device data formats&lt;/td&gt;
&lt;td&gt;Thing model standardizes device capability definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Don&amp;rsquo;t know how to process device data&lt;/td&gt;
&lt;td&gt;Rule engine → data routing/scenario linkage/alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difficult device firmware upgrades&lt;/td&gt;
&lt;td&gt;OTA remote upgrades&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to integrate with third-party IoT platforms&lt;/td&gt;
&lt;td&gt;Built-in EMQX integration, customizable protocols&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
IOT_ADMIN["IoT Admin&lt;br/&gt;Define products&lt;br/&gt;Manage devices&lt;br/&gt;Configure thing models&lt;br/&gt;Set up rule engine"]
IOT_DEV["Device Developer&lt;br/&gt;Device-side development&lt;br/&gt;Protocol integration&lt;br/&gt;OTA upgrades"]
IOT_OP["Operations Staff&lt;br/&gt;Monitor device status&lt;br/&gt;Handle alerts&lt;br/&gt;Data analysis"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="platform-architecture"&gt;Platform Architecture&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph DeviceLayer["Device Layer"]
D1["Sensors"]
D2["Gateways"]
D3["Controllers"]
D4["Smart Devices"]
end
subgraph AccessLayer["Access Layer (Multi-Protocol)"]
P1["MQTT"]
P2["HTTP"]
P3["CoAP"]
P4["TCP/UDP"]
P5["WebSocket"]
P6["Modbus"]
end
subgraph PlatformLayer["IoT Platform"]
PRODUCT["Product Management&lt;br/&gt;Define device types"]
DEVICE["Device Management&lt;br/&gt;Registration/Authentication/Status"]
MODEL["Thing Model&lt;br/&gt;Properties/Services/Events"]
OTA["OTA Upgrade&lt;br/&gt;Firmware remote updates"]
end
subgraph ProcessingLayer["Data Processing Layer"]
RULE["Rule Engine&lt;br/&gt;Data rules/Scenario linkage/Alerts"]
TD["TDengine&lt;br/&gt;Time-series data storage"]
end
DeviceLayer --&gt; AccessLayer
AccessLayer --&gt; PlatformLayer
PlatformLayer --&gt; ProcessingLayer
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="thing-model-design"&gt;Thing Model Design&lt;/h2&gt;
&lt;p&gt;The thing model is the core concept of IoT, describing in a standardized way &amp;ldquo;what attributes a device has, what it can do, and what it reports&amp;rdquo;:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph ThingModel["Thing Model = Digital Description of Device"]
ATTR["Property&lt;br/&gt;Static characteristics of device&lt;br/&gt;Example: Temperature, Humidity, Switch State"]
SERVICE["Service&lt;br/&gt;Actions the device can execute&lt;br/&gt;Example: Unlock, Restart, Calibrate"]
EVENT["Event&lt;br/&gt;Information actively reported by device&lt;br/&gt;Example: Alerts, Faults, Completion Notifications"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="rule-engine"&gt;Rule Engine&lt;/h2&gt;
&lt;div class="mermaid"&gt;flowchart LR
DATA["Device Data"] --&gt; ENGINE["Rule Engine"]
ENGINE --&gt;|Data Rules| ROUTE1["Data Routing&lt;br/&gt;Store to TDengine&lt;br/&gt;Forward to HTTP/Kafka"]
ENGINE --&gt;|Scenario Linkage| ROUTE2["Scenario Linkage&lt;br/&gt;Temp &gt; 30°C → Auto-turn on fan"]
ENGINE --&gt;|Alert Config| ROUTE3["Alerts&lt;br/&gt;Device offline &gt; 5 min → Send notification"]
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="device-lifecycle"&gt;Device Lifecycle&lt;/h2&gt;
&lt;div class="mermaid"&gt;flowchart LR
CREATE["Create Product&lt;br/&gt;Define thing model"] --&gt; REG["Register Device&lt;br/&gt;Get authentication info"]
REG --&gt; ONLINE["Device Online&lt;br/&gt;Establish connection"]
ONLINE --&gt; WORK["Normal Operation&lt;br/&gt;Report data/Receive commands"]
WORK --&gt; OTA2["OTA Upgrade"]
OTA2 --&gt; WORK
WORK --&gt; OFFLINE["Device Offline"]
OFFLINE --&gt; ONLINE
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="supported-protocols"&gt;Supported Protocols&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MQTT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mainstream IoT protocol&lt;/td&gt;
&lt;td&gt;Lightweight, pub-sub, QoS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple devices, web apps&lt;/td&gt;
&lt;td&gt;High versatility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CoAP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low-power devices&lt;/td&gt;
&lt;td&gt;HTTP-like, UDP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom protocols&lt;/td&gt;
&lt;td&gt;Flexible, efficient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UDP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High-frequency data reporting&lt;/td&gt;
&lt;td&gt;Low latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebSocket&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time bidirectional communication&lt;/td&gt;
&lt;td&gt;Browser-friendly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Modbus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Industrial devices&lt;/td&gt;
&lt;td&gt;Industrial control standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EMQX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High-performance MQTT Broker&lt;/td&gt;
&lt;td&gt;Million-level connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Protocol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Special devices&lt;/td&gt;
&lt;td&gt;Extension development&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="technical-dependencies"&gt;Technical Dependencies&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TDengine&lt;/strong&gt;: Time-series database for storing massive time-series data reported by devices (requires separate setup)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EMQX&lt;/strong&gt;: High-performance MQTT Broker (optional, for large-scale device access)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>IM Instant Messaging</title><link>https://ruoyiplus.com/en/ruoyi/im/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/im/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The IM module provides built-in instant messaging capabilities for your platform&lt;/strong&gt; — no need to integrate third-party IM SDKs (such as Huanxin, RongCloud), directly implement private chat, group chat, channel broadcasting, and audio-video calls within your system. Particularly suitable for scenarios requiring &amp;ldquo;in-platform communication,&amp;rdquo; such as e-commerce customer service, internal enterprise communication, community private messaging, etc.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: Let your users chat within your platform, with data and experience fully under your control.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How IM Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Third-party IM SDK costs are high&lt;/td&gt;
&lt;td&gt;Self-built IM, zero additional cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User data stored with third parties&lt;/td&gt;
&lt;td&gt;Chat data in your own database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to integrate with business systems&lt;/td&gt;
&lt;td&gt;User system, friend relationships linked with business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio-video call capability&lt;/td&gt;
&lt;td&gt;Integrated with LiveKit, supports WebRTC calls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
IM_USER["Regular User&lt;br/&gt;Private chat/group chat&lt;br/&gt;Send text/images/files/voice&lt;br/&gt;Audio-video calls"]
IM_ADMIN["IM Admin&lt;br/&gt;Manage groups&lt;br/&gt;Configure channels&lt;br/&gt;Manage sensitive words&lt;br/&gt;View message records"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="functional-architecture"&gt;Functional Architecture&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph Core["Core Features"]
MSG2["Message Center&lt;br/&gt;Private/Group chat&lt;br/&gt;Text/Image/File/Voice/Video"]
FRIEND["Friend Relationships&lt;br/&gt;Add/Delete/Blocklist"]
GROUP["Group Management&lt;br/&gt;Create/Join/Leave/Mute"]
CHANNEL["Channel Broadcasting&lt;br/&gt;Announcements/Notifications"]
CALL["Audio-Video Calls&lt;br/&gt;Based on LiveKit&lt;br/&gt;WebRTC"]
end
subgraph Auxiliary
EMOJI["Emoji Management"]
SENSITIVE["Sensitive Word Filtering"]
end
subgraph Communication["Communication Layer"]
WS["WebSocket Real-time Communication&lt;br/&gt;local / redis / rocketmq&lt;br/&gt;/ kafka / rabbitmq"]
end
Core --&gt; Communication
Auxiliary --&gt; Core
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="core-er-diagram"&gt;Core ER Diagram&lt;/h2&gt;
&lt;div class="mermaid"&gt;erDiagram
IM_USER ||--o{ IM_MESSAGE : "Send"
IM_USER ||--o{ IM_FRIEND : "Friend Relations"
IM_USER ||--o{ IM_GROUP_MEMBER : "Group Members"
IM_GROUP ||--o{ IM_GROUP_MEMBER : "Contains"
IM_GROUP ||--o{ IM_MESSAGE : "Group Messages"
IM_CHANNEL ||--o{ IM_CHANNEL_MESSAGE : "Channel Messages"
IM_CHANNEL ||--o{ IM_CHANNEL_MEMBER : "Channel Members"
IM_MESSAGE {
bigint id PK
bigint from_user_id FK "Sender"
bigint to_user_id FK "Receiver"
bigint group_id FK "Group"
tinyint type "Message Type"
text content "Message Content"
datetime create_time "Send Time"
}
IM_GROUP {
bigint id PK
varchar name "Group Name"
bigint owner_user_id FK "Group Owner"
tinyint status "Status"
}
IM_CHANNEL {
bigint id PK
varchar name "Channel Name"
tinyint type "Channel Type"
}
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="database-table-groups"&gt;Database Table Groups&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Table Count&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Message Center&lt;/td&gt;
&lt;td&gt;2 tables&lt;/td&gt;
&lt;td&gt;Message records, message conversations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friend Relations&lt;/td&gt;
&lt;td&gt;2 tables&lt;/td&gt;
&lt;td&gt;Friends, friend requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Group Management&lt;/td&gt;
&lt;td&gt;3 tables&lt;/td&gt;
&lt;td&gt;Groups, group members, group announcements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Channel Broadcasting&lt;/td&gt;
&lt;td&gt;3 tables&lt;/td&gt;
&lt;td&gt;Channels, channel members, channel messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio-Video Calls&lt;/td&gt;
&lt;td&gt;2 tables&lt;/td&gt;
&lt;td&gt;Call records, call participants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Others&lt;/td&gt;
&lt;td&gt;4 tables&lt;/td&gt;
&lt;td&gt;Emojis, sensitive words, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="websocket-communication-modes"&gt;WebSocket Communication Modes&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph SendMode["Message Send Modes (Switchable)"]
LOCAL["local&lt;br/&gt;Standalone Mode&lt;br/&gt;For development/debugging"]
REDIS3["redis&lt;br/&gt;Redis Broadcast&lt;br/&gt;Small clusters"]
ROCKET2["rocketmq&lt;br/&gt;RocketMQ&lt;br/&gt;High throughput"]
KAFKA2["kafka&lt;br/&gt;Kafka&lt;br/&gt;Large scale"]
RABBIT2["rabbitmq&lt;br/&gt;RabbitMQ&lt;br/&gt;Enterprise-grade"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="application-scenarios"&gt;Application Scenarios&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;E-commerce Customer Service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Buyer ↔ Merchant customer service private chat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enterprise Internal Communication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Employee group chat, department channels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community Private Messaging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User-to-user private chat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Online Education&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Student ↔ Teacher, course group chat + audio-video&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Medical Consultation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Patient ↔ Doctor private chat + audio-video consultation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Vue3 Admin Panel</title><link>https://ruoyiplus.com/en/ruoyi/vue3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/vue3/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Vue3 Admin Panel is RuoYi&amp;rsquo;s primary frontend solution&lt;/strong&gt; and the frontend project with the most complete business features. If you&amp;rsquo;re unsure which frontend to choose, pick this one — pages for all 14 subsystems are first implemented here.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;: Vue3 + TypeScript + Vite + Element Plus + Pinia&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="suitable-users"&gt;Suitable Users&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User Profile&lt;/th&gt;
&lt;th&gt;Why Choose This&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Teams pursuing stability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All features are first implemented here, most thoroughly tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Element Plus ecosystem users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mature component library, complete documentation, active community&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Need the most complete business features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All 14 subsystems have corresponding pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secondary development scenarios&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clear code structure, highly modular&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="project-architecture"&gt;Project Architecture&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph Entry
MAIN["main.ts&lt;br/&gt;Application Entry"]
end
subgraph CoreLayer["Core Layer"]
ROUTER["router/&lt;br/&gt;Route Configuration"]
STORE["store/&lt;br/&gt;Pinia State Management"]
UTILS["utils/&lt;br/&gt;Utility Functions"]
end
subgraph RequestLayer["Request Layer"]
AXIOS["utils/request.ts&lt;br/&gt;axios Wrapper&lt;br/&gt;baseURL / timeout / Interceptors"]
API["api/&lt;br/&gt;APIs Organized by Module"]
MOCK["mock/&lt;br/&gt;Mock Data"]
end
subgraph ViewLayer["View Layer (Organized by Subsystem)"]
SYS_V["views/system/&lt;br/&gt;System Management"]
BPM_V["views/bpm/&lt;br/&gt;Workflow"]
CRM_V["views/crm/&lt;br/&gt;Customer Management"]
ERP_V["views/erp/&lt;br/&gt;Purchase-Sales-Inventory"]
MALL_V["views/mall/&lt;br/&gt;E-Commerce"]
end
subgraph ComponentLayer
COMPS["components/&lt;br/&gt;Shared Components"]
DIRS["directives/&lt;br/&gt;Custom Directives"]
PLUGINS["plugins/&lt;br/&gt;Plugins"]
end
MAIN --&gt; ROUTER
MAIN --&gt; STORE
ROUTER --&gt; ViewLayer
ViewLayer --&gt; API
API --&gt; AXIOS
AXIOS --&gt; UTILS
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="key-design"&gt;Key Design&lt;/h2&gt;
&lt;h3 id="axios-request-wrapper"&gt;axios Request Wrapper&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;baseURL: /api
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timeout: 30000ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Interceptors:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Request interceptor: Auto-attach Token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Response interceptor: Unified error handling, Token expiration redirect to login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="page-file-organization"&gt;Page File Organization&lt;/h3&gt;
&lt;p&gt;Each business page typically contains:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;erp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;purchase&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vue&lt;/span&gt; &lt;span class="c1"&gt;# List page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vue&lt;/span&gt; &lt;span class="c1"&gt;# Form dialog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="c1"&gt;# Constants&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="permission-control"&gt;Permission Control&lt;/h3&gt;
&lt;p&gt;Menus and buttons are controlled via permission identifiers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Button permission example
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;el&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;v-hasPermi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;[&amp;#39;erp:purchase-order:create&amp;#39;]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Add&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/el-button&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Menus returned by backend, frontend dynamically renders based on role
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="comparison-with-other-frontends"&gt;Comparison with Other Frontends&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Vue3 Admin Panel&lt;/th&gt;
&lt;th&gt;Vben5&lt;/th&gt;
&lt;th&gt;Vue2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Positioning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Primary, most complete features&lt;/td&gt;
&lt;td&gt;Next-gen, more advanced architecture&lt;/td&gt;
&lt;td&gt;Classic, Vue2 compatible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UI Library&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Element Plus&lt;/td&gt;
&lt;td&gt;Ant Design / Element Plus&lt;/td&gt;
&lt;td&gt;Element UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Business Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Full coverage&lt;/td&gt;
&lt;td&gt;🚧 Gradual migration&lt;/td&gt;
&lt;td&gt;✅ Full coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Developer Experience&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;First choice for new projects&lt;/td&gt;
&lt;td&gt;For cutting-edge tech stack&lt;/td&gt;
&lt;td&gt;Vue2 legacy projects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="quick-start"&gt;Quick Start&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. Enter frontend directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; yudao-ui-admin-vue3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. Install dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. Start dev server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm run dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. Access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://localhost:80
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Vben5 Admin Panel</title><link>https://ruoyiplus.com/en/ruoyi/vben5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/vben5/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Vben5 is RuoYi&amp;rsquo;s next-generation admin panel&lt;/strong&gt;, based on Vben Admin 5.x (Monorepo architecture), with more advanced architectural design. It supports both Ant Design Vue and Element Plus UI component libraries — you can freely choose based on your team&amp;rsquo;s preferences.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;: Vue3 + TypeScript + Vite + Vben5 + Ant Design Vue / Element Plus&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="suitable-users"&gt;Suitable Users&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User Profile&lt;/th&gt;
&lt;th&gt;Why Choose This&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Teams pursuing latest architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monorepo + more advanced state management + stronger type constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ant Design ecosystem users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Supports Ant Design Vue, more international UI style&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Large project teams&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vben component system (Vxe Table / Vben Form / Vben Modal) better suited for complex forms and tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Willing to accept feature migration status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Some business modules still being migrated from Vue3 version&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="project-architecture"&gt;Project Architecture&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph Monorepo["Monorepo Structure"]
APPS["apps/&lt;br/&gt;Application Entries"]
PKGS["packages/&lt;br/&gt;Shared Packages"]
INTERNAL["internal/&lt;br/&gt;Internal Tools"]
end
subgraph UI["Dual UI Library Support"]
ANT["Ant Design Vue&lt;br/&gt;More international style"]
EP["Element Plus&lt;br/&gt;More localized style"]
end
subgraph COMP["Vben Component System"]
TABLE["Vben Vxe Table&lt;br/&gt;High-Performance Table"]
FORM["Vben Form&lt;br/&gt;Declarative Forms"]
MODAL["Vben Modal&lt;br/&gt;Dialog Management"]
DRAWER["Vben Drawer&lt;br/&gt;Drawer Component"]
end
subgraph PAGES["Page Structure (Three Files Per Page)"]
INDEX["index.vue&lt;br/&gt;Page Entry"]
FORM_V["form.vue&lt;br/&gt;Form Definition"]
DATA["data.ts&lt;br/&gt;Data Logic"]
end
APPS --&gt; UI
APPS --&gt; COMP
APPS --&gt; PAGES
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="core-advantages"&gt;Core Advantages&lt;/h2&gt;
&lt;h3 id="1-monorepo-architecture"&gt;1. Monorepo Architecture&lt;/h3&gt;
&lt;p&gt;All packages managed in one repository, unified dependency versions, easier code reuse. Shared utility functions, type definitions, and components are placed under &lt;code&gt;packages/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="2-dual-ui-library-switching"&gt;2. Dual UI Library Switching&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Can choose Ant Design Vue
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Form&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ant-design-vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Or choose Element Plus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ElButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ElTable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ElForm&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;element-plus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The same business logic can adapt to two UI styles, which is especially valuable for projects that need to be delivered to different clients.&lt;/p&gt;
&lt;h3 id="3-declarative-component-system"&gt;3. Declarative Component System&lt;/h3&gt;
&lt;p&gt;Vben&amp;rsquo;s component system dramatically improves development efficiency for complex forms and tables:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="nx"&gt;Vben&lt;/span&gt; &lt;span class="nx"&gt;Vxe&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Declarative&lt;/span&gt; &lt;span class="nx"&gt;Column&lt;/span&gt; &lt;span class="nx"&gt;Definition&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;vxe-grid&lt;/span&gt; &lt;span class="nt"&gt;v-bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gridOptions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="na"&gt;Built&lt;/span&gt;&lt;span class="nt"&gt;-in&lt;/span&gt; &lt;span class="na"&gt;pagination&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sorting&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;filtering&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;export&lt;/span&gt; &lt;span class="err"&gt;--&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;vxe-grid&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="nx"&gt;Vben&lt;/span&gt; &lt;span class="nx"&gt;Form&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Declarative&lt;/span&gt; &lt;span class="nx"&gt;Form&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;vben-form&lt;/span&gt; &lt;span class="nt"&gt;:schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;formSchema&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="feature-migration-progress"&gt;Feature Migration Progress&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;System Management&lt;/td&gt;
&lt;td&gt;✅ Completed&lt;/td&gt;
&lt;td&gt;Users/Roles/Menus/Departments etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;✅ Completed&lt;/td&gt;
&lt;td&gt;Code Generation/Files/Config etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BPM Workflow&lt;/td&gt;
&lt;td&gt;✅ Completed (v2.6.1)&lt;/td&gt;
&lt;td&gt;Ant Design version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRM Customer Management&lt;/td&gt;
&lt;td&gt;✅ Completed (v2.6.1)&lt;/td&gt;
&lt;td&gt;Ant Design version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay Payment Center&lt;/td&gt;
&lt;td&gt;✅ Completed (v2.6.1)&lt;/td&gt;
&lt;td&gt;Ant Design version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member Center&lt;/td&gt;
&lt;td&gt;✅ Completed (v2.6.1)&lt;/td&gt;
&lt;td&gt;Ant Design version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Large Model&lt;/td&gt;
&lt;td&gt;✅ Completed (v2.6.1)&lt;/td&gt;
&lt;td&gt;Ant Design version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ERP Purchase-Sales-Inventory&lt;/td&gt;
&lt;td&gt;🚧 In Progress&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mall E-Commerce&lt;/td&gt;
&lt;td&gt;🚧 In Progress&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="quick-start"&gt;Quick Start&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. Enter directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; yudao-ui-admin-vben5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. Install dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. Start dev server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm run dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. Access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://localhost:&lt;span class="o"&gt;{&lt;/span&gt;port&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>SaaS Multi-Tenancy</title><link>https://ruoyiplus.com/en/ruoyi/saas-tenant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/saas-tenant/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SaaS Multi-Tenancy allows you to serve multiple enterprise clients with a single codebase&lt;/strong&gt;, where each client (tenant) can only see their own data, completely isolated from each other. Whether building a vertical SaaS product or managing multiple subsidiaries within an enterprise, this is an indispensable capability.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Two approaches&lt;/strong&gt;: Column-based isolation (lightweight, suitable for small-to-medium scale) and database isolation (physical isolation, suitable for large-scale SaaS).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="suitable-users"&gt;Suitable Users&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Recommended Approach&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SaaS Startup Phase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Column-based isolation&lt;/td&gt;
&lt;td&gt;Simple operations, one database handles everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Large SaaS Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database isolation&lt;/td&gt;
&lt;td&gt;Physical isolation, high security, independent backups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enterprise Multi-Company&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Column-based isolation&lt;/td&gt;
&lt;td&gt;Limited number of companies, logical isolation is sufficient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Finance/Healthcare Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database isolation&lt;/td&gt;
&lt;td&gt;Data must be physically isolated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="two-approaches-comparison"&gt;Two Approaches Comparison&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph COLUMN["Approach 1: Column-Based Isolation (COLUMN Mode)"]
direction TB
C1["All tenants share&lt;br/&gt;same database, same tables"]
C2["Each table adds&lt;br/&gt;tenant_id column"]
C3["SQL Interceptor&lt;br/&gt;auto-appends WHERE tenant_id = ?"]
C4["Pros: Simple operations, high resource utilization&lt;br/&gt;Cons: Logical isolation, moderate security"]
C1 --&gt; C2 --&gt; C3 --&gt; C4
end
subgraph DATASOURCE["Approach 2: Database Isolation (DATASOURCE Mode)"]
direction TB
D1["Master DB: Shared tables&lt;br/&gt;Users/Menus/Config/Tenant info"]
D2["Tenant DB A: Business tables"]
D3["Tenant DB B: Business tables"]
D4["Tenant DB C: Business tables"]
D5["Pros: Physical isolation, high security, independent backups&lt;br/&gt;Cons: Complex operations, lower resource utilization"]
D1 --&gt; D2
D1 --&gt; D3
D1 --&gt; D4
D2 &amp; D3 &amp; D4 --&gt; D5
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="detailed-comparison"&gt;Detailed Comparison&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Column-Based (COLUMN)&lt;/th&gt;
&lt;th&gt;Database Isolation (DATASOURCE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Isolation Level&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logical isolation&lt;/td&gt;
&lt;td&gt;Physical isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium (relies on SQL interceptor)&lt;/td&gt;
&lt;td&gt;High (database-level isolation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource Utilization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (shared connection pool)&lt;/td&gt;
&lt;td&gt;Low (independent connections per tenant)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operations Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (single DB operations)&lt;/td&gt;
&lt;td&gt;High (multi-DB operations)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited by single DB performance&lt;/td&gt;
&lt;td&gt;Horizontally scalable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Backup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Need to filter by tenant_id&lt;/td&gt;
&lt;td&gt;Independent backup per tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Applicable Scale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hundreds of tenants&lt;/td&gt;
&lt;td&gt;Thousands/Tens of thousands of tenants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Technical Implementation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MyBatis Plus interceptor&lt;/td&gt;
&lt;td&gt;dynamic-datasource&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="column-based-isolation-implementation"&gt;Column-Based Isolation Implementation&lt;/h2&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant U as User (Tenant A)
participant APP as Application Layer
participant INTERCEPTOR as SQL Interceptor
participant DB as Shared Database
U-&gt;&gt;APP: Query customer list
APP-&gt;&gt;INTERCEPTOR: SELECT * FROM crm_customer
INTERCEPTOR-&gt;&gt;INTERCEPTOR: Auto-append tenant_id = 'A'
INTERCEPTOR-&gt;&gt;DB: SELECT * FROM crm_customer&lt;br/&gt;WHERE tenant_id = 'A'
DB--&gt;&gt;APP: Returns only Tenant A's data
APP--&gt;&gt;U: Display customer list
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Core Mechanism&lt;/strong&gt;: Through MyBatis Plus&amp;rsquo;s multi-tenant plugin, automatically adds &lt;code&gt;tenant_id&lt;/code&gt; condition before executing any SQL, completely transparent to business code.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="database-isolation-implementation"&gt;Database Isolation Implementation&lt;/h2&gt;
&lt;p&gt;Based on &lt;code&gt;dynamic-datasource&lt;/code&gt; dynamic data sources, when a request comes in, it switches to the corresponding data source based on the current tenant ID:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;datasource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;master &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Master DB (shared tables)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;datasource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;master&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Master DB config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;jdbc:mysql://localhost:3306/ruoyi_master&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tenant_1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Tenant 1&amp;#39;s independent database&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;jdbc:mysql://localhost:3306/ruoyi_tenant_1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tenant_2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Tenant 2&amp;#39;s independent database&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;jdbc:mysql://localhost:3306/ruoyi_tenant_2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="tenant-package-management"&gt;Tenant Package Management&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
PACKAGE1["Basic Package&lt;br/&gt;System Management + Basic Features"]
PACKAGE2["Professional Package&lt;br/&gt;Basic + CRM + ERP"]
PACKAGE3["Enterprise Package&lt;br/&gt;All Features"]
TenantA["Tenant A"] --&gt; PACKAGE1
TenantB["Tenant B"] --&gt; PACKAGE2
TenantC["Tenant C"] --&gt; PACKAGE3
&lt;/div&gt;
&lt;p&gt;Each tenant can be bound to a package, which defines the menus and features visible to that tenant. Supports automatic disabling upon package expiration.&lt;/p&gt;</description></item><item><title>Code Generation Advanced</title><link>https://ruoyiplus.com/en/ruoyi/new-feature/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/new-feature/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The code generator is RuoYi&amp;rsquo;s &amp;ldquo;nuclear weapon&amp;rdquo; for development efficiency&lt;/strong&gt;. Regular single-table CRUD can no longer satisfy complex business scenarios. Here we introduce three advanced generation modes, covering the most common complex page patterns in enterprise development.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;With these capabilities, a complex business page containing master-child tables and approval flows goes from &amp;ldquo;days of coding&amp;rdquo; to &amp;ldquo;minutes of configuration.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="suitable-users"&gt;Suitable Users&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Recommended Mode&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Order + Line Items&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Master-Child Standard Mode&lt;/td&gt;
&lt;td&gt;Same dialog, master-child tables edited together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Work Order + Processes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Master-Child Embedded Mode&lt;/td&gt;
&lt;td&gt;Expand child table directly in list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purchase Order + Details&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Master-Child ERP Mode&lt;/td&gt;
&lt;td&gt;Independent master and child lists, independent forms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Department Tree/Category Tree&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tree Table Mode&lt;/td&gt;
&lt;td&gt;Auto-generate tree table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mobile Pages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;uni-app Mode&lt;/td&gt;
&lt;td&gt;Generate pages compatible with H5/Mini Programs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="three-master-child-table-generation-modes"&gt;Three Master-Child Table Generation Modes&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph StandardMode["Mode 1: Standard Mode"]
S1["Master Table List Page"]
S2["Click Add → Dialog"]
S3["Dialog: Master Form + Child Table&lt;br/&gt;Edit in same dialog"]
S1 --&gt; S2 --&gt; S3
end
subgraph EmbeddedMode["Mode 2: Embedded Mode"]
I1["Master Table List Page"]
I2["Expand Row → Embedded Child Table&lt;br/&gt;Child table shown directly below master row"]
I1 --&gt; I2
end
subgraph ERPMode["Mode 3: ERP Mode"]
E1["Master Table Independent List"]
E2["Child Table Independent List&lt;br/&gt;(Linked by master table ID)"]
E3["Master Table Independent Form"]
E4["Child Table Independent Form"]
E1 --&gt; E2
E3 --&gt; E4
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="mode-applicable-scenarios"&gt;Mode Applicable Scenarios&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;User Experience&lt;/th&gt;
&lt;th&gt;Representative Business&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Small master-child data volume, master+child need to be filled together&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐ Smooth operation&lt;/td&gt;
&lt;td&gt;Surveys+Questions, Config+Config Items&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Embedded Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Need to quickly view child data without navigating away&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ High info density&lt;/td&gt;
&lt;td&gt;Work Orders+Processes, Tasks+Subtasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ERP Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Master and child each have independent business logic, large data volume&lt;/td&gt;
&lt;td&gt;⭐⭐⭐ High flexibility&lt;/td&gt;
&lt;td&gt;Purchase Orders+Details, Sales Orders+Details&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="tree-table-code-generation"&gt;Tree Table Code Generation&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
DEPT["Department Table&lt;br/&gt;id / parent_id / name"]
GEN["Code Generator&lt;br/&gt;Recognizes parent_id field"]
OUT["Generate Tree Table Page&lt;br/&gt;el-tree + Drag &amp; Drop Sorting"]
DEPT --&gt; GEN --&gt; OUT
&lt;/div&gt;
&lt;p&gt;Supports unlimited levels, auto-generates expand/collapse, drag-and-drop sorting, add child node, and other features.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="uni-app-code-generation"&gt;uni-app Code Generation&lt;/h2&gt;
&lt;p&gt;Generate complete page code for mobile, supporting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;List pages (pull-to-refresh, load more)&lt;/li&gt;
&lt;li&gt;Form pages&lt;/li&gt;
&lt;li&gt;Detail pages&lt;/li&gt;
&lt;li&gt;API request encapsulation&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="frontend-version-support"&gt;Frontend Version Support&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generation Target&lt;/th&gt;
&lt;th style="text-align: center"&gt;Vue3 Admin&lt;/th&gt;
&lt;th style="text-align: center"&gt;Vben5&lt;/th&gt;
&lt;th style="text-align: center"&gt;Vue2&lt;/th&gt;
&lt;th style="text-align: center"&gt;uni-app&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single Table CRUD&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Master-Child Standard&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Master-Child Embedded&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Master-Child ERP&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tree Table&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="usage-process"&gt;Usage Process&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create table structure in the database&lt;/li&gt;
&lt;li&gt;Import tables in the &amp;ldquo;Code Generation&amp;rdquo; menu&lt;/li&gt;
&lt;li&gt;Configure generation options (module name, business name, class name, generation mode)&lt;/li&gt;
&lt;li&gt;Preview and generate code&lt;/li&gt;
&lt;li&gt;Copy code to the project, configure menu to use&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>BPM Workflow</title><link>https://ruoyiplus.com/en/ruoyi/bpm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/bpm/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;BPM Workflow is the enterprise&amp;rsquo;s &amp;ldquo;approval hub&amp;rdquo;&lt;/strong&gt; — leave requests, reimbursements, procurement, contracts, seal usage&amp;hellip; almost any scenario requiring &amp;ldquo;multi-level approval&amp;rdquo; can be modeled and processed here. Based on the Flowable engine, it provides DingTalk/Feishu-style and BPMN dual designers, allowing non-technical personnel to design processes as well.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: Say goodbye to WeChat approvals, email approvals, and paper approvals — turn approval processes into structured, traceable systems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How BPM Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Approval processes rely on verbal/WeChat communication, no records&lt;/td&gt;
&lt;td&gt;All approvals leave traces, every step is traceable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approval rules rely on human memory, prone to omissions&lt;/td&gt;
&lt;td&gt;Process templates solidify rules, auto-route to correct approvers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-department approval communication costs are high&lt;/td&gt;
&lt;td&gt;Auto-routing, no manual notifications needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overdue approvals with no follow-up&lt;/td&gt;
&lt;td&gt;Auto-reminders for overdue items, supports auto-approval/skip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organizational changes cause approver changes&lt;/td&gt;
&lt;td&gt;Approvers dynamically calculated by role/department, not hardcoded to specific people&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
ADMIN["Process Administrator&lt;br/&gt;Design process templates&lt;br/&gt;Deploy and publish processes"]
APPLICANT["Initiator&lt;br/&gt;Submit applications&lt;br/&gt;View approval progress&lt;br/&gt;Cancel applications"]
APPROVER["Approver&lt;br/&gt;Approve/Reject/Transfer/Add-sign&lt;br/&gt;View pending/completed tasks"]
COPYER["CC Recipient&lt;br/&gt;Receive approval result notifications&lt;br/&gt;No action required"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="feature-collaboration-flow"&gt;Feature Collaboration Flow&lt;/h2&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant A as Initiator
participant F as Process Engine
participant P1 as Approver 1 (Dept Manager)
participant P2 as Approver 2 (Finance Manager)
participant B as Business System (e.g. ERP)
A-&gt;&gt;F: Initiate Process (e.g. Purchase Request)
F-&gt;&gt;B: Link Business Data (Purchase Order ID)
F-&gt;&gt;P1: Push Pending Task
P1-&gt;&gt;F: Approve
F-&gt;&gt;P2: Push Pending Task
P2-&gt;&gt;F: Approve
F-&gt;&gt;B: Callback: Process Complete, Update Business Status
F-&gt;&gt;A: Notification: Application Approved
Note over F: If any approver rejects&lt;br/&gt;process returns to initiator
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="dual-designer-comparison"&gt;Dual Designer Comparison&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph SIMPLE["SIMPLE Designer (DingTalk/Feishu Style)"]
S1["Drag-and-drop operation"]
S2["Suitable for simple approval chains"]
S3["Low learning curve"]
S4["Usable by non-technical staff"]
end
subgraph BPMN["BPMN Designer"]
B1["Standard BPMN 2.0"]
B2["Supports complex branches/parallel flows"]
B3["Requires some learning"]
B4["For technical staff"]
end
SIMPLE -.-&gt;|Complex scenarios can upgrade to| BPMN
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th style="text-align: center"&gt;SIMPLE Designer&lt;/th&gt;
&lt;th style="text-align: center"&gt;BPMN Designer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Learning Curve&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐ Very Low&lt;/td&gt;
&lt;td style="text-align: center"&gt;⭐⭐⭐ Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target Users&lt;/td&gt;
&lt;td style="text-align: center"&gt;Business staff, HR, Admin&lt;/td&gt;
&lt;td style="text-align: center"&gt;Developers, Process Experts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported Nodes&lt;/td&gt;
&lt;td style="text-align: center"&gt;Approval, CC, Conditional Branch&lt;/td&gt;
&lt;td style="text-align: center"&gt;All BPMN 2.0 Nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallel Branch&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inclusive Branch&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-process&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="full-approval-operations"&gt;Full Approval Operations&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
AN["Approval Node"] --&gt;|Approve| NN["Next Node"]
AN["Approval Node"] --&gt;|Reject| Return_Node["Return to specified node&lt;br/&gt;or return to initiator"]
AN["Approval Node"] --&gt;|Transfer| Transferee["Transfer to another person&lt;br/&gt;no longer involved"]
AN["Approval Node"] --&gt;|Delegate| Delegatee["Delegate to another person&lt;br/&gt;returns to self after processing"]
AN["Approval Node"] --&gt;|Add-sign| Additional_Approver["Add approver&lt;br/&gt;countersign/or-sign"]
AN["Approval Node"] --&gt;|Remove-sign| Remove_Approver["Reduce approvers"]
AN["Approval Node"] --&gt;|Terminate| End_Node["Process ends directly&lt;br/&gt;(special permission)"]
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="process-control-capabilities"&gt;Process Control Capabilities&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Typical Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Conditional Branch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Route to different approval paths based on form data&lt;/td&gt;
&lt;td&gt;Amount &amp;lt; 5000 skips CEO approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parallel Branch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multiple people approve simultaneously, proceed only when all approve&lt;/td&gt;
&lt;td&gt;Multi-department parallel countersign&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inclusive Branch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multiple people approve simultaneously, proceed when any approves&lt;/td&gt;
&lt;td&gt;Or-sign scenario&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trigger Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto-execute service tasks&lt;/td&gt;
&lt;td&gt;Auto-create ERP document after approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Delay Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wait specified time before continuing&lt;/td&gt;
&lt;td&gt;Remind 7 days before contract expiration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Timeout Approval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto-process on timeout&lt;/td&gt;
&lt;td&gt;Auto-approve/reject if not processed within 48 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto Reminder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scheduled reminder for pending tasks&lt;/td&gt;
&lt;td&gt;Push pending task summary every morning at 9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="integration-with-business-systems"&gt;Integration with Business Systems&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
BPM["BPM Process Engine"]
subgraph Integration Scenarios
ERP_APPROVAL["ERP Purchase Approval&lt;br/&gt;Purchase Order → BPM Approval → Auto Inbound"]
CRM_APPROVAL["CRM Contract Approval&lt;br/&gt;Contract Draft → BPM Approval → Contract Effective"]
OA_APPROVAL["OA General Approval&lt;br/&gt;Leave/Reimbursement/Seal Usage/Out of Office"]
end
BPM --&gt; ERP_APPROVAL
BPM --&gt; CRM_APPROVAL
BPM --&gt; OA_APPROVAL
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Integration Method&lt;/strong&gt;: Business modules initiate processes, query approval status, and handle approval callbacks through APIs provided by BPM, without needing to concern themselves with Flowable&amp;rsquo;s underlying details.&lt;/p&gt;</description></item><item><title>Message Queue</title><link>https://ruoyiplus.com/en/ruoyi/message-queue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/message-queue/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Message queue is the &amp;ldquo;central nervous system&amp;rdquo; for asynchronous communication between subsystems&lt;/strong&gt;. When ERP outbound needs to notify WMS to update inventory, when mall payment success needs to award points to members — all these cross-module asynchronous collaborations are completed through the message queue.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Design Philosophy&lt;/strong&gt;: Business code only depends on the &lt;code&gt;yudao-spring-boot-starter-mq&lt;/code&gt; abstract interface; switching the underlying implementation only requires changing one line of configuration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="suitable-users"&gt;Suitable Users&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User Profile&lt;/th&gt;
&lt;th&gt;Recommended Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Development/Debugging Phase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Spring Event (default, zero dependencies)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Small &amp;amp; Medium Projects&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Redis Stream (persistent, supports consumer groups)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enterprise Projects&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RabbitMQ (stable &amp;amp; reliable, mature operations)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High-Throughput Scenarios&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RocketMQ (Alibaba ecosystem, distributed transactions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Big Data Scenarios&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kafka (logs, event tracking, data pipelines)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="architecture-design"&gt;Architecture Design&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph BusinessLayer["Business Code Layer (depends only on abstraction)"]
P["Producer&lt;br/&gt;MessageProducer.send()"]
C["Consumer&lt;br/&gt;MessageConsumer.onMessage()"]
end
subgraph AbstractionLayer["Abstraction Layer yudao-spring-boot-starter-mq"]
API["Unified API&lt;br/&gt;Message / MessageProducer / MessageConsumer"]
end
subgraph ImplementationLayer["Implementation Layer (Choose One of Five)"]
SE["yudao-spring-boot-starter-mq-spring-event&lt;br/&gt;Spring Event (Default)"]
REDIS["yudao-spring-boot-starter-mq-redis&lt;br/&gt;Redis Stream"]
RABBIT["yudao-spring-boot-starter-mq-rabbitmq&lt;br/&gt;RabbitMQ"]
ROCKET["yudao-spring-boot-starter-mq-rocketmq&lt;br/&gt;RocketMQ"]
KAFKA["yudao-spring-boot-starter-mq-kafka&lt;br/&gt;Kafka"]
end
P --&gt; API
C --&gt; API
API --&gt; SE
API --&gt; REDIS
API --&gt; RABBIT
API --&gt; ROCKET
API --&gt; KAFKA
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="five-implementation-comparison"&gt;Five Implementation Comparison&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Persistence&lt;/th&gt;
&lt;th&gt;Consumption Mode&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Switch Config&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spring Event&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ In-memory&lt;/td&gt;
&lt;td&gt;Broadcast&lt;/td&gt;
&lt;td&gt;Development/Debugging&lt;/td&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redis Stream&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Cluster/Broadcast&lt;/td&gt;
&lt;td&gt;Small &amp;amp; Medium projects&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yudao.mq.type=redis&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RabbitMQ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Multiple modes&lt;/td&gt;
&lt;td&gt;Enterprise projects&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yudao.mq.type=rabbitmq&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RocketMQ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Cluster/Broadcast/Ordered&lt;/td&gt;
&lt;td&gt;High throughput, transactional messages&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yudao.mq.type=rocketmq&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kafka&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Partition-based&lt;/td&gt;
&lt;td&gt;Big data, logs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yudao.mq.type=kafka&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="usage-examples"&gt;Usage Examples&lt;/h2&gt;
&lt;h3 id="define-message"&gt;Define Message&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 1. Define message class, implement Message interface&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderPaidMessage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="send-message"&gt;Send Message&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Resource&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MessageProducer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;messageProducer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;payOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Business processing...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Send message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderPaidMessage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderPaidMessage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setOrderId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setUserId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getCurrentUserId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAmount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAmount&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;messageProducer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="consume-message"&gt;Consume Message&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderPaidConsumer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MessageConsumer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderPaidMessage&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;onMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderPaidMessage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Award points&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;memberService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addPoints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUserId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAmount&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Update inventory&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stockService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decreaseStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getOrderId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="typical-message-flow-between-subsystems"&gt;Typical Message Flow Between Subsystems&lt;/h2&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant MALL as Mall Module
participant MQ as Message Queue
participant WMS as Warehouse Module
participant MEMBER as Member Module
MALL-&gt;&gt;MALL: User payment successful
MALL-&gt;&gt;MQ: Send "Order Paid" message
MQ-&gt;&gt;WMS: Consume message → Deduct inventory
MQ-&gt;&gt;MEMBER: Consume message → Award points
Note over WMS,MEMBER: Two consumers execute independently, no interference
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="switching-method"&gt;Switching Method&lt;/h2&gt;
&lt;p&gt;Just modify the configuration file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Switch from Spring Event to Redis Stream&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;yudao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;redis &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Change to redis / rabbitmq / rocketmq / kafka&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No business code changes needed.&lt;/p&gt;</description></item><item><title>Pay Payment Center</title><link>https://ruoyiplus.com/en/ruoyi/pay/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/pay/</guid><description>&lt;h2 id="core-positioning"&gt;Core Positioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Pay Payment Center is the platform&amp;rsquo;s &amp;ldquo;unified checkout counter.&amp;rdquo;&lt;/strong&gt; The mall sells goods and needs to collect payments, ERP procurement needs to make payments, member top-ups need to collect payments — all these payment and collection scenarios are handled uniformly through the Payment Center, without business modules needing to care whether the underlying payment method is WeChat Pay or Alipay.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;In one sentence&lt;/strong&gt;: Integrate with the Payment Center once, and all business modules can collect and make payments.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="problems-solved"&gt;Problems Solved&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;How Payment Center Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Each business separately integrates WeChat/Alipay&lt;/td&gt;
&lt;td&gt;Unified integration once, all businesses reuse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment channel switching requires changing business code&lt;/td&gt;
&lt;td&gt;Channel changes are transparent to business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment callback handling is scattered&lt;/td&gt;
&lt;td&gt;Unified callback → dispatch to each business module&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment records are nowhere to be found&lt;/td&gt;
&lt;td&gt;Payment Center records all transactions, unified reconciliation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-roles"&gt;User Roles&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph LR
subgraph Roles
DEV["Developer&lt;br/&gt;Integrate payment APIs&lt;br/&gt;Handle payment callbacks"]
ADMIN2["Operations/Finance&lt;br/&gt;View payment records&lt;br/&gt;Process refunds&lt;br/&gt;Reconciliation"]
ENDUSER["End User&lt;br/&gt;Initiate payments&lt;br/&gt;View payment results"]
end
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="architecture-design"&gt;Architecture Design&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph BusinessLayer["Business Modules (Payment Callers)"]
MALL["Mall&lt;br/&gt;Order Payment"]
ERP2["ERP&lt;br/&gt;Purchase Payment"]
OTHER["Other Modules&lt;br/&gt;Top-up/Transfer"]
end
subgraph PaymentCenter["Payment Center yudao-module-pay"]
API_LAYER["API Layer&lt;br/&gt;PayOrderApi / PayRefundApi"]
CHANNEL["Channel Adapter Layer&lt;br/&gt;PayClient Unified Client"]
CALLBACK["Callback Handling Layer&lt;br/&gt;Unified Callback → Dispatch to Business"]
end
subgraph ChannelLayer["Payment Channels"]
WXPAY["WeChat Pay&lt;br/&gt;Official Account/Mini Program/QR Code"]
ALIPAY["Alipay&lt;br/&gt;PC/Wap/Transfer"]
MOCK["Mock Payment&lt;br/&gt;For development/debugging"]
end
BusinessLayer --&gt; API_LAYER
API_LAYER --&gt; CHANNEL
CHANNEL --&gt; ChannelLayer
ChannelLayer --&gt; CALLBACK
CALLBACK --&gt; BusinessLayer
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="payment-application-design"&gt;Payment Application Design&lt;/h2&gt;
&lt;div class="mermaid"&gt;graph TB
subgraph AppIsolation
APP1["Payment App: Mall Orders&lt;br/&gt;Callback URL: /mall/order/callback&lt;br/&gt;Order Prefix: MALL-"]
APP2["Payment App: ERP Procurement&lt;br/&gt;Callback URL: /erp/purchase/callback&lt;br/&gt;Order Prefix: ERP-"]
APP3["Payment App: Member Top-up&lt;br/&gt;Callback URL: /member/recharge/callback&lt;br/&gt;Order Prefix: MBR-"]
end
&lt;/div&gt;
&lt;p&gt;Each business module corresponds to a &amp;ldquo;payment application&amp;rdquo; with independent callback URL and order number prefix, ensuring payment callbacks are accurately routed to the correct business processing logic.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="full-payment-flow"&gt;Full Payment Flow&lt;/h2&gt;
&lt;div class="mermaid"&gt;sequenceDiagram
participant U as User
participant BIZ as Business System (Mall)
participant PAY as Payment Center
participant CH as Payment Channel (WeChat/Alipay)
U-&gt;&gt;BIZ: Submit order, click pay
BIZ-&gt;&gt;PAY: Create payment order PayOrderApi
PAY-&gt;&gt;CH: Initiate payment request
CH--&gt;&gt;U: Display payment page
U-&gt;&gt;CH: Complete payment (scan/password)
CH--&gt;&gt;PAY: Async callback: Payment successful
PAY-&gt;&gt;PAY: Update payment order status
PAY-&gt;&gt;BIZ: Callback notification: Order paid
BIZ-&gt;&gt;BIZ: Update order status
BIZ--&gt;&gt;U: Display payment success
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="supported-payment-methods"&gt;Supported Payment Methods&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Channel&lt;/th&gt;
&lt;th&gt;Payment Method&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WeChat Pay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Official Account Payment&lt;/td&gt;
&lt;td&gt;WeChat Official Account H5 store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WeChat Pay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mini Program Payment&lt;/td&gt;
&lt;td&gt;WeChat Mini Program store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WeChat Pay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Transfer&lt;/td&gt;
&lt;td&gt;Commission withdrawal, refunds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Alipay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PC Payment&lt;/td&gt;
&lt;td&gt;PC-side store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Alipay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wap Payment&lt;/td&gt;
&lt;td&gt;Mobile H5 store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Alipay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Transfer&lt;/td&gt;
&lt;td&gt;Commission withdrawal, refunds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mock Payment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mock&lt;/td&gt;
&lt;td&gt;Development/debugging, no real account needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="dependencies"&gt;Dependencies&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mall E-Commerce → Pay Payment Center ← ERP Purchase-Sales-Inventory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↑
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; System Management Module (Permissions)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Both Mall and ERP depend on the Payment Center, which depends on the System Management module for permissions and configuration management.&lt;/p&gt;</description></item><item><title>Changelog</title><link>https://ruoyiplus.com/en/ruoyi/changelog/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruoyiplus.com/en/ruoyi/changelog/</guid><description>&lt;h2 id="version-evolution"&gt;Version Evolution&lt;/h2&gt;
&lt;p&gt;RuoYi-Vue-Pro started from v2.0.0 and has been continuously iterating to date, with a total codebase of approximately &lt;strong&gt;260,000 lines&lt;/strong&gt; (160,000 lines of source code, 60,000 lines of comments, 1,121+ unit tests).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="v261-2025-07-19-key-updates"&gt;v2.6.1 (2025-07-19) Key Updates&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Large-Scale Vben5 + Ant Design Migration&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Migration Module&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BPM Workflow&lt;/td&gt;
&lt;td&gt;✅ Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRM Customer Management&lt;/td&gt;
&lt;td&gt;✅ Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay Payment Center&lt;/td&gt;
&lt;td&gt;✅ Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member Center&lt;/td&gt;
&lt;td&gt;✅ Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Large Model&lt;/td&gt;
&lt;td&gt;✅ Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vben5 + Element Plus Code Generation Examples&lt;/td&gt;
&lt;td&gt;✅ Added&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="monthly-update-records"&gt;Monthly Update Records&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Major Updates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2026-05&lt;/td&gt;
&lt;td&gt;System optimization and bug fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04&lt;/td&gt;
&lt;td&gt;Feature iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-03&lt;/td&gt;
&lt;td&gt;Feature iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-02&lt;/td&gt;
&lt;td&gt;Feature iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-01&lt;/td&gt;
&lt;td&gt;Feature iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-12&lt;/td&gt;
&lt;td&gt;Feature iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-11&lt;/td&gt;
&lt;td&gt;Feature iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-10&lt;/td&gt;
&lt;td&gt;Feature iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-09&lt;/td&gt;
&lt;td&gt;Feature iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-08&lt;/td&gt;
&lt;td&gt;Feature iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-07&lt;/td&gt;
&lt;td&gt;v2.6.1: Large-Scale Vben5 + Ant Design Migration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="technical-metrics"&gt;Technical Metrics&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Lines of Code&lt;/td&gt;
&lt;td&gt;259,995&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source Code Lines&lt;/td&gt;
&lt;td&gt;161,332&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comment Lines&lt;/td&gt;
&lt;td&gt;59,755&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unit Tests&lt;/td&gt;
&lt;td&gt;1,121+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business Subsystems&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Database Tables&lt;/td&gt;
&lt;td&gt;300+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported Frontend Versions&lt;/td&gt;
&lt;td&gt;4 (Vue3 / Vben5 / Vue2 / uni-app)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item></channel></rss>