跳到主要内容

整体架构

企智通采用经典的前后端分离 + 单体模块化架构。后端 qzt-go-server 是整个系统的唯一数据源与业务规则持有者;admin、cms、mobile 三套前端都是后端 RESTful API 的消费方,前端本身不直接持有任何业务状态。

架构总览图

┌─────────────────────────────┐
│ 终端用户访问 │
└──────────────┬──────────────┘

┌────────────────────────────┼────────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ admin (SPA) │ │ cms (Next.js) │ │ mobile (SPA) │
│ React + antd │ │ SSR / ISR │ │ antd-mobile │
│ 后台管理 / 运营 │ │ 官网 / 博客 / SEO│ │ 外勤 / 移动办公 │
└────────┬────────┘ └────────┬─────────┘ └────────┬─────────┘
│ │ │
│ HTTPS / RESTful API │ │
└───────────────────────────┼────────────────────────────┘


┌───────────────────────────────────────────┐
│ qzt-go-server (Go 单体后端) │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ 中间件链 │ │
│ │ Recovery → Trace → CORS → Logger │ │
│ │ → Auth → OperationLog → Casbin │ │
│ └─────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ 业务模块 (每个实现 Module 接口) │ │
│ │ CRM · HRM · PSI · Finance · CMS │ │
│ │ Approval · System · OA · KB ... │ │
│ │ (另挂 /mcp: 全功能 MCP 开放) │ │
│ └─────────────────────────────────────┘ │
│ │
│ 分层: handler → service → repository │
└─────┬───────────────┬───────────────┬─────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
│ MySQL │ │ Redis │ │ OSS / 本地存储│
│ 业务数据 │ │ 缓存/会话 │ │ 文件资源 │
└──────────┘ └──────────┘ └──────────────┘

设计原则

1. 后端为唯一数据源

所有业务规则、数据校验、权限判断、数据一致性都由后端负责。前端只负责展示交互,不做任何关键业务决策。这意味着:

  • 任何前端都可以替换(admin / cms / mobile / 第三方),不影响业务正确性
  • 所有写操作必须经过后端 API,避免绕过权限
  • 数据计算(统计、聚合)统一在后端完成,前端不重复实现

2. 单体模块化

后端是单进程单体,但内部按业务领域严格模块化。每个模块(CRM、HRM、Approval 等):

  • 实现统一的 Module 接口(注册路由、注册菜单、注册权限、数据迁移等)
  • 拥有独立的 handler / service / repository / model 分层
  • 模块之间通过显式依赖注入协作,而非直接 import 对方内部实现

这种设计兼顾了单体的部署简单与微服务的代码清晰,适合中小企业体量。

3. 统一 API 信封

所有 API 响应遵循统一的信封格式,前端可写一次拦截器处理所有响应:

{
"code": 0,
"msg": "success",
"data": { },
"timestamp": 1722816000
}
字段含义
code业务码,0 表示成功,非 0 为业务错误码(与 HTTP 状态码解耦)
msg人类可读的提示信息,可直接展示给用户
data业务数据载荷,失败时为 null
timestamp服务器时间戳,用于排查时序问题

分页响应在 data 中统一为:

{
"list": [],
"total": 0,
"page": 1,
"page_size": 20
}

数据流向

以「销售员创建客户」为例,展示典型请求链路:

销售员在 admin 填表


admin 调用 POST /api/v1/crm/customers
│ (axios 自动携带 JWT)

qzt-go-server 中间件链:
Recovery → Trace(生成 traceId)
→ CORS → Logger → Auth(解析 JWT, 注入用户上下文)
→ OperationLog(记录请求体) → Casbin(校验 crm:customer:create)


crm 模块 handler: 参数绑定与校验


service 层: 业务规则(重名校验、公海规则、数据权限过滤)


repository 层: GORM 写入 MySQL (crm_customers 表)


统一信封封装 → JSON 响应


admin axios 拦截器自动解包 → UI 刷新

横切关注点

关注点实现方式
链路追踪每个请求分配 traceId,贯穿日志与响应头
操作审计写操作自动记录操作人、IP、UA、请求体、响应体
限流基于 Redis 的令牌桶,按 IP / 用户限流
缓存Redis 缓存字典、菜单、权限策略,减少 DB 压力
国际化后端错误码对应多语言文案,前端按 locale 展示

扩展阅读