啥中台?啥后台?为啥要中台?后台?

3,061 阅读5分钟

为啥写?源于 看到一个专栏,讲中台,简单唠几句。

“技术中台”与“后台”虽然在实际业务中有交集,但定位、目标、服务对象和使用方式存在明显差异。下面是主流理解下的核心差异对比:


🚧 简单区分:

  • 后台(后台管理系统) :面向人(运营/客服/财务等)的操作界面
  • 技术中台:面向开发、业务的通用服务能力平台,提供复用能力,不一定有 UI

一、核心差异对比

对比维度技术中台后台管理系统
面向对象开发者、业务系统运营、客服、财务、销售等业务人员
本质可复用的通用服务能力、模块集合人机交互的业务操作界面
是否可视化一般为 API 服务,无 UI;也可能有部分控制台有明确的 Web 管理 UI
是否通用强调复用性通用性,如统一用户中心一般为单系统定制,如某平台的用户后台
服务方式通过 SDK / API / 微服务提供能力Web 页面操作请求后端 API
架构设计关注模块解耦、统一标准、业务能力沉淀关注流程闭环、页面易用、权限控制
典型功能用户中台、商品中台、内容中台、风控中台等CRM 系统、财务结算后台、订单管理后台等
构建目的让不同业务系统可以快速搭建自己的业务让运营人员直接操作系统功能

二、举例说明

  • 技术中台示例

    • 用户中台(统一身份认证、注册登录、权限服务)
    • 商品中台(统一商品建模、库存服务、价格服务)
    • 内容中台(统一图文、视频、审核等内容能力)
  • 后台示例

    • 订单管理后台:客服手动修改订单状态
    • 资金结算后台:财务导出结算单、对账、审核操作
    • 活动运营后台:运营配置活动规则、查看数据报表

三、两者关系

技术中台 = 能力层后台 = 操作层(UI)

  • 后台系统的某些功能依赖技术中台能力提供,例如:

    • 登录后台系统调用“用户中台”做鉴权;
    • 活动配置后台使用“商品中台”拉取商品列表;
    • 财务后台用“结算中台”统一生成结算数据。

四、主流技术实践

企业技术中台建设特点
阿里巴巴“中台战略”提出者,强调数据和业务中台
京东构建统一用户、商品、订单等多个技术中台
字节跳动大量通用服务通过微服务中台进行复用
腾讯构建统一服务框架、用户身份中台、支付中台等

总结

后台是人用的,技术中台是系统用的;后台要“好看好用”,中台要“好拆好复用”。

举案例说明一下

我们来构建一套真实且主流的:

  • 中台架构案例:以「用户中台」为例,提供用户统一注册/登录能力,供多个系统调用;
  • 后台架构案例:以「用户管理后台」为例,供客服/运营查看用户、封禁账号、重置密码等操作。

并通过 React + mock 数据 展示前端界面逻辑。


🧱 一、中台架构案例:用户中台

🎯 目标:

统一提供用户的注册、登录、用户信息、权限等能力,供多个系统(如商城、直播、教育平台等)调用。

📦 技术结构:

user-center/
├── services/
│   ├── userService.js       // 注册、登录、获取用户
│   └── permissionService.js // 获取权限
├── apis/
│   └── userRouter.js        // Express/KOA 路由暴露接口
├── models/
│   └── UserModel.js         // MongoDB/MySQL 用户表结构
└── index.js                 // 启动文件,暴露为 RESTful API 或 gRPC

🌐 示例 API(Node.js/Express):

// apis/userRouter.js
router.post('/login', async (req, res) => {
  const { username, password } = req.body
  const user = await userService.login(username, password)
  if (!user) return res.status(401).json({ message: '登录失败' })
  res.json({ token: createToken(user), user })
})

🧾 二、后台架构案例:用户管理后台

🎯 目标:

客服/运营人员通过后台系统管理用户账号,例如查看用户、封禁账号、修改信息等。

🖥️ React 前端目录结构

user-admin-panel/
├── pages/
│   └── UserList.jsx
├── services/
│   └── userApi.js         // 调用中台接口
└── App.jsx

🧪 React 示例代码:用户管理界面

pages/UserList.jsx

import React, { useEffect, useState } from 'react'
import { Table, Button, message } from 'antd'
import { getUserList, banUser } from '../services/userApi'

export default function UserList() {
  const [data, setData] = useState([])

  useEffect(() => {
    getUserList().then(setData)
  }, [])

  const handleBan = async (userId) => {
    await banUser(userId)
    message.success('封禁成功')
  }

  const columns = [
    { title: '用户ID', dataIndex: 'id' },
    { title: '用户名', dataIndex: 'username' },
    { title: '状态', dataIndex: 'status' },
    {
      title: '操作',
      render: (_, row) => (
        <Button danger onClick={() => handleBan(row.id)}>封禁</Button>
      )
    }
  ]

  return <Table rowKey="id" columns={columns} dataSource={data} />
}

services/userApi.js

export const getUserList = async () => {
  // 模拟从中台拉数据
  return Promise.resolve([
    { id: 1, username: '张三', status: '正常' },
    { id: 2, username: '李四', status: '正常' }
  ])
}

export const banUser = async (userId) => {
  // 实际应调用 POST /user/ban 中台接口
  return Promise.resolve({ success: true })
}

🔁 架构对比总结:

架构层用户中台(技术中台)用户后台(运营后台)
服务对象系统、业务系统调用者人工运营人员(客服、运营)
提供内容接口、服务能力操作界面、管理流程
UI 是否必须❌(可以纯 API,无界面)✅(必有 UI,需易用)
示例login / getUser / getPermissions 接口用户列表 / 封禁操作界面
通信方式REST API / gRPCHTTP 请求访问中台 API

更完整的 Nodejs 代码参考

// ✅ 技术中台:Node.js 用户服务
// 目录结构:
// user-center/
// ├── index.js
// ├── routes/user.js
// ├── services/userService.js
// └── db/users.js (模拟数据)

// === index.js ===
const express = require('express')
const cors = require('cors')
const userRoutes = require('./routes/user')

const app = express()
app.use(cors())
app.use(express.json())
app.use('/api/user', userRoutes)

app.listen(3001, () => {
  console.log('User center API running at http://localhost:3001')
})

// === db/users.js ===
let users = [
  { id: 1, username: '张三', password: '123456', status: '正常' },
  { id: 2, username: '李四', password: '123456', status: '正常' }
]

module.exports = {
  getUsers: () => users,
  banUser: (id) => {
    users = users.map(u => u.id === id ? { ...u, status: '已封禁' } : u)
  },
  findUser: (username, password) => users.find(u => u.username === username && u.password === password)
}

// === services/userService.js ===
const db = require('../db/users')

module.exports = {
  list: () => db.getUsers(),
  ban: (id) => db.banUser(id),
  login: (username, password) => db.findUser(username, password)
}

// === routes/user.js ===
const express = require('express')
const router = express.Router()
const userService = require('../services/userService')

router.get('/list', (req, res) => {
  res.json(userService.list())
})

router.post('/ban', (req, res) => {
  const { id } = req.body
  userService.ban(id)
  res.json({ success: true })
})

router.post('/login', (req, res) => {
  const { username, password } = req.body
  const user = userService.login(username, password)
  if (!user) return res.status(401).json({ error: '登录失败' })
  res.json({ token: 'mock-token', user })
})

module.exports = router

// ✅ 后台系统:React + Antd 页面
// 目录结构:
// user-admin-panel/
// ├── App.jsx
// ├── pages/UserList.jsx
// └── services/userApi.js

// === App.jsx ===
import React from 'react'
import UserList from './pages/UserList'
import 'antd/dist/antd.css'

function App() {
  return (
    <div style={{ padding: 24 }}>
      <h2>用户管理后台</h2>
      <UserList />
    </div>
  )
}

export default App

// === pages/UserList.jsx ===
import React, { useEffect, useState } from 'react'
import { Table, Button, message } from 'antd'
import { getUserList, banUser } from '../services/userApi'

export default function UserList() {
  const [data, setData] = useState([])

  const fetchData = async () => {
    const res = await getUserList()
    setData(res)
  }

  useEffect(() => {
    fetchData()
  }, [])

  const handleBan = async (id) => {
    await banUser(id)
    message.success('封禁成功')
    fetchData()
  }

  const columns = [
    { title: '用户ID', dataIndex: 'id' },
    { title: '用户名', dataIndex: 'username' },
    { title: '状态', dataIndex: 'status' },
    {
      title: '操作',
      render: (_, row) => (
        row.status === '正常' ? <Button danger onClick={() => handleBan(row.id)}>封禁</Button> : '—'
      )
    }
  ]

  return <Table rowKey="id" columns={columns} dataSource={data} />
}

// === services/userApi.js ===
export const getUserList = async () => {
  const res = await fetch('http://localhost:3001/api/user/list')
  return await res.json()
}

export const banUser = async (id) => {
  await fetch('http://localhost:3001/api/user/ban', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ id })
  })
}