快消B2B SaaS系统开源:零依赖多语言技术栈+多端骨架+部署模板,附完整源码下载
快消B2B SaaS系统开源:零依赖多语言技术栈+多端骨架+部署模板,附完整源码下载
本文开源了「分销代理多端触达系统」项目中的 7 个基础设施模块,涵盖 i18n 国际化引擎、零依赖 API 客户端、Node.js 后端认证骨架、UniApp 多端框架、HarmonyOS App 骨架、Docker 部署模板和前端 UI 框架。全部 零第三方依赖,拿来即用。文末附完整源码下载。
一、项目背景
我在做一个快消品 B2B 分销代理 SaaS 系统,技术栈比较杂:
Node.js(零依赖 ESM) — 后端单体版
Go(Gin) — 网关/触达/Agent/分析/存档 5个微服务
Java(Spring Boot 3) — 佣金/代理/合规/培训/报表等 8个微服务
PHP 8.2 — 门户/看板/文档/CMS 4个服务
HarmonyOS(ArkTS/ArkUI) — 鸿蒙原生App
UniApp(Vue 3) — H5/小程序/App/企微侧边栏
总共 17 个微服务 + 4 个客户端,7 语种国际化。
项目核心商业逻辑(合规护栏、Agent 意图解析、推荐引擎、佣金计算)不开源,但 基础设施层的代码是通用的,整理出来分享给大家。
二、开源模块总览
| 模块 | 目录 | 技术栈 | 亮点 |
|------|------|--------|------|
| i18n 国际化引擎 | i18n/ | JavaScript | 零依赖,7语种,localStorage 持久化 |
| API 客户端封装 | api-client/ | JavaScript | 零依赖,自动降级,离线检测 |
| 前端 UI 框架 | ui-framework/ | HTML/JS/CSS | 模块化渲染,仪表盘组件 |
| Docker 部署模板 | deploy-templates/ | Docker | Go/Java/PHP 三语言 + Nginx + Compose |
| Node.js 后端骨架 | node-backend-skeleton/ | Node.js ESM | JWT/用户管理/文件存储/审计/健康检查 |
| UniApp 多端框架 | uniapp-skeleton/ | Vue 3 | 一套代码4端运行 |
| HarmonyOS App骨架 | harmony-skeleton/ | ArkTS/ArkUI | API客户端+页面模板+模块配置 |
许可证:Apache License 2.0(可商用、可修改、可闭源)
三、模块详解与代码
3.1 i18n 国际化引擎 — 7语种零依赖
支持简体中文、繁体中文(中国台湾/中国香港/中国澳门)、日语、英语(UK/US),核心就一个文件:
// i18n/i18n.js — 核心API
// 切换语言
setLocale('ja'); // → 日本語
// 翻译(点分键路径 + 参数插值)
t('dashboard.totalGMV'); // → "総GMV"
t('touch.channels.sms'); // → "SMS"
t('archive.searchResults', { count: 5 }); // → "5 件の一致記録"
// 获取可用语言列表
getAvailableLocales();
// [{ code: 'zh-CN', label: '简体中文', flag: '🇨🇳' }, ...]
设计要点:
-
零依赖 — 不用 i18next、不用 vue-i18n,纯原生 JS
-
语言回退 — 找不到翻译自动回退到简体中文
-
localStorage 持久化 — 用户选过的语言下次自动恢复
-
参数插值 —
{count}占位符自动替换 -
点分键路径 —
t('nav.dashboard')解析嵌套对象
// 翻译函数核心实现
export function t(key, params) {
const dict = _messages[_locale] || _messages['zh-CN'];
let val = _resolvePath(dict, key);
if (val === undefined) {
val = _resolvePath(_messages['zh-CN'], key); // 回退
}
if (val === undefined) return key;
if (params && typeof val === 'string') {
for (const [k, v] of Object.entries(params)) {
val = val.replace(new RegExp(`\\{${k}\\}`, 'g'), String(v));
}
}
return val;
}
7 个语种全部翻译完成,覆盖系统全部 16 个功能模块的 UI 文案。
3.2 API 客户端 — 自动降级处理
前端调用后端 API 时,后端可能没启动。这个封装能自动检测并降级为占位数据,不会白屏:
// api-client/api.js
const res = await apiFetch('/agents');
// res = { ok: true, status: 200, data: {...}, error: null, offline: false }
// 后端没起时:
// res = { ok: false, status: 0, data: null, error: 'network_unreachable', offline: true }
// UI 中判断占位
if (isPlaceholder(res)) {
// 显示 "后端未连接 · 占位数据"
}
核心代码:
export async function apiFetch(path, { method = 'GET', body = null } = {}) {
try {
const res = await fetch(API_BASE + path, opts);
let data = null;
try { data = await res.json(); } catch { /* 无 body */ }
return { ok: res.ok, status: res.status, data, error: null, offline: false };
} catch (e) {
// 网络层错误 → 降级占位
return { ok: false, status: 0, data: null, error: e.message, offline: true };
}
}
适用场景:前后端分离项目、MVP 开发阶段前后端并行开发、弱网环境。
3.3 Node.js 后端骨架 — JWT 认证 + 文件存储
这部分是从生产项目中提取的后端基础设施,包含 7 个模块:
| 文件 | 功能 |
|------|------|
| config.js | 环境配置(.env 解析 + 环境变量覆盖) |
| jwt.js | JWT HMAC-SHA256 零依赖实现 |
| auth-middleware.js | Bearer Token + API Key 双模式认证中间件 |
| user-store.js | 用户 CRUD(双角色 RBAC,SHA-256+salt) |
| file-store.js | 文件持久化(原子写入,多机共享) |
| system-handler.js | 健康检查(/api/health + /api/ready + /api/info) |
| audit-handler.js | 不可篡改审计日志 |
JWT 零依赖实现
不装 jsonwebtoken,用 Node.js 内置 crypto 模块手写:
// jwt.js — 签发 token
export function signToken(payload, ttl = 28800, type = 'access') {
const header = { alg: 'HS256', typ: 'JWT' };
const now = Math.floor(Date.now() / 1000);
const body = {
...payload,
iat: now,
exp: now + ttl,
iss: config.jwtIssuer,
type,
jti: crypto.randomBytes(8).toString('hex'), // 唯一 ID
};
const headerB64 = b64url(JSON.stringify(header));
const payloadB64 = b64url(JSON.stringify(body));
const signature = sign(`${headerB64}.${payloadB64}`);
return `${headerB64}.${payloadB64}.${signature}`;
}
// 验证 token(时间安全比较防时序攻击)
export function verifyToken(token, expectedType = 'access') {
// ... 签名验证用 crypto.timingSafeEqual
}
安全特性:
-
access token 8h + refresh token 7d
-
crypto.timingSafeEqual防时序攻击 -
token 类型校验(access/refresh 不可混用)
-
签发者校验 + 过期校验
文件原子写入(多机安全)
// file-store.js — 原子写入
export function saveJSON(filename, data) {
const tmpPath = `${filePath}.tmp`;
writeFileSync(tmpPath, serialized, 'utf-8');
renameSync(tmpPath, filePath); // 原子操作!
}
// 支持 Map/Set 自动序列化
const serialized = JSON.stringify(data, (key, value) => {
if (value instanceof Map) return Object.fromEntries(value);
if (value instanceof Set) return [...value];
return value;
}, 2);
为什么用 tmp + rename?
多机部署时,如果机器 A 正在写文件、机器 B 同时读取,直接 writeFileSync 可能读到半写文件。先写 .tmp 再 rename 是 POSIX 原子操作,B 要么读到旧文件、要么读到新文件,不会读到半成品。
环境配置
// config.js — .env 解析 + 环境变量覆盖
export const config = {
port: getEnvInt('PORT', 3000),
jwtSecret: getEnv('JWT_SECRET', randomBytes(32).toString('hex')),
accessTokenTtl: getEnvInt('ACCESS_TOKEN_TTL', 8 * 3600), // 8h
refreshTokenTtl: getEnvInt('REFRESH_TOKEN_TTL', 7 * 24 * 3600), // 7d
storageMode: getEnv('STORAGE_MODE', 'memory'), // memory | file
dataDir: getEnv('DATA_DIR', '.data'), // NFS 共享目录
instanceId: getEnv('INSTANCE_ID', `${hostname()}-${process.pid}`),
// ...
};
环境变量优先于 .env 文件,方便 Docker 部署时注入配置。
3.4 UniApp 多端框架骨架
一套代码跑 4 个端:H5 / 微信小程序 / App / 企微侧边栏。
uniapp-skeleton/
├── pages.json # 页面路由配置
├── manifest.json # 应用清单(H5/小程序/App配置)
├── App.vue # 根组件
├── main.js # 入口文件
├── common/ # API封装/工具函数
├── static/ # 静态资源
└── pages/
├── login/ # 登录页完整实现
└── index/ # 首页示例
登录页包含完整的表单验证、API 调用、token 存储、路由跳转逻辑,可直接复用。
3.5 HarmonyOS App 骨架
鸿蒙原生 App 的起步骨架,ArkTS/ArkUI 风格:
// harmony-skeleton/ApiClient.ets
export class ApiClient {
private static BASE_URL = 'http://10.0.2.2:8080/api'; // 模拟器地址
static async request(path: string, options?: RequestConfig): Promise<ApiResponse> {
const token = await this.getToken();
const res = await fetch(this.BASE_URL + path, {
method: options?.method || 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': token ? `Bearer ${token}` : ''
},
body: options?.body ? JSON.stringify(options.body) : undefined
});
return await res.json();
}
}
包含:
-
ApiClient.ets— HTTP 客户端(token 管理 + 多环境 BASE_URL) -
LoginPage-template.ets— 登录页模板 -
module.json5— 模块配置 -
EntryAbility.ets— 入口 Ability 生命周期管理
3.6 Docker 部署模板
一套 docker-compose 编排 17 个微服务 + 3 个基础设施:
# deploy-templates/docker-compose.yml(精简版)
services:
# 基础设施
mysql: { image: mysql:8.0, ports: ["3306:3306"] }
redis: { image: redis:7-alpine, ports: ["6379:6379"] }
minio: { image: minio/minio:latest, ports: ["9000:9000", "9001:9001"] }
# Go 服务层
go-gateway: { build: ../go, ports: ["8080:8080"] }
go-touch: { build: ../go, ports: ["8081:8081"] }
go-agent: { build: ../go, ports: ["8082:8082"] }
go-analytics: { build: ../go, ports: ["8083:8083"] }
go-archive: { build: ../go, ports: ["8084:8084"] }
# Java 服务层
java-commission: { build: ../java/commission, ports: ["9090:9090"] }
java-agent: { build: ../java/agent, ports: ["9091:9091"] }
# ... 共8个Java服务
# PHP 服务层
php-portal: { build: ../php/portal, ports: ["7080:7080"] }
php-dashboard: { build: ../php/dashboard, ports: ["7081:7081"] }
# ... 共4个PHP服务
# Nginx 反向代理
nginx: { image: nginx:alpine, ports: ["80:80", "443:443"] }
还包含三语言的 Dockerfile 模板:
| 文件 | 说明 |
|------|------|
| Dockerfile.go-gateway | Go 多阶段构建(builder → alpine 运行镜像) |
| Dockerfile.java-service | Java Maven 构建 + JRE 运行 |
| Dockerfile.php-service | PHP-FPM + Nginx 双进程 |
| nginx/nginx.conf | 反向代理 + HTTPS + WebSocket + 负载均衡 |
3.7 前端 UI 框架
不用 React/Vue,纯原生 HTML/JS/CSS 实现的模块化渲染框架:
// ui-framework/dashboard-example.js
// 模块化渲染 — 每个功能模块独立 render 函数
export function renderDashboard(container) {
container.innerHTML = `
<div class="dashboard">
<div class="metric-cards">
${renderMetricCard('总GMV', '¥1,234,567', '#3b82f6')}
${renderMetricCard('代理商', '128', '#10b981')}
${renderMetricCard('待办', '12', '#f59e0b')}
</div>
<div class="charts">...</div>
</div>
`;
}
适合快速搭建管理后台原型、内部工具、MVP 界面。
四、技术选型理由
为什么零依赖?
| 传统方案 | 零依赖方案 | 区别 |
|---------|-----------|------|
| npm install i18next | 直接引入 i18n.js | 不用装包,不用配 webpack |
| npm install jsonwebtoken | import crypto from 'node:crypto' | Node.js 内置模块搞定 |
| npm install express | import http from 'node:http' | 原生 http.Server |
好处:
-
部署简单 — 不用
npm install,拷贝代码就能跑 -
安全 — 没有供应链风险,不会因为某个依赖被投毒导致整个项目被攻击
-
学习成本低 — 看源码就知道怎么实现的,没有魔法
-
体积小 — 整个开源包 50KB,不包含 node_modules
为什么用多语言微服务?
| 语言 | 擅长的场景 | 在项目中的角色 |
|------|-----------|---------------|
| Go | 高并发、低延迟 | 网关、WebSocket、实时触达、Agent 对话 |
| Java | 复杂业务逻辑、事务 | 佣金计算、合规校验、培训管理、报表 |
| PHP | 快速页面渲染 | 门户、看板、文档站、CMS |
| Node.js | 快速原型、前后端同构 | MVP 版本、全功能验证 |
| HarmonyOS | 鸿蒙原生体验 | 鸿蒙 App |
不是每个项目都需要多语言微服务。如果你在做 MVP,先用 Node.js 单体跑通,验证业务逻辑后再拆分。
五、快速上手
5.1 使用 i18n 引擎
<script type="module">
import { t, setLocale, getAvailableLocales } from './i18n/i18n.js';
// 初始化
setLocale('zh-CN');
// 使用
document.title = t('app.title');
document.querySelector('#dashboard').textContent = t('dashboard.title');
// 切换语言
document.querySelector('#lang-switch').onclick = () => {
setLocale('en');
location.reload(); // 重新渲染
};
</script>
5.2 使用 API 客户端
import { apiFetch, isPlaceholder } from './api-client/api.js';
async function loadAgents() {
const res = await apiFetch('/agents');
if (isPlaceholder(res)) {
return mockAgents; // 降级占位数据
}
return res.data;
}
5.3 使用后端骨架
// server.js
import http from 'node:http';
import { config } from './config.js';
import { signAccessToken, verifyToken } from './jwt.js';
import { saveJSON, loadJSON } from './file-store.js';
const server = http.createServer((req, res) => {
// 路由 + 认证 + 业务逻辑
});
server.listen(config.port, config.host, () => {
console.log(`Server running at http://${config.host}:${config.port}`);
});
5.4 启动 Docker 部署
# 进入部署模板目录
cd deploy-templates/
# 一键启动全部服务
docker-compose up -d
# 查看状态
docker-compose ps
# 只启动基础设施
docker-compose up -d mysql redis minio
六、目录结构
distributor-touch-opensource/
├── README.md # 项目说明
├── LICENSE # Apache 2.0 许可证
├── i18n/
│ └── i18n.js # 零依赖国际化引擎(7语种,846行)
├── api-client/
│ └── api.js # 零依赖HTTP API封装
├── ui-framework/
│ ├── index.html # 前端布局框架模板
│ └── dashboard-example.js # 仪表盘UI组件示例
├── deploy-templates/
│ ├── docker-compose.yml # 微服务编排模板
│ ├── Dockerfile.go-gateway # Go服务Dockerfile
│ ├── Dockerfile.java-service # Java服务Dockerfile
│ ├── Dockerfile.php-service # PHP服务Dockerfile
│ └── nginx/
│ └── nginx.conf # Nginx反向代理配置
├── node-backend-skeleton/
│ ├── config.js # 环境配置管理
│ ├── jwt.js # JWT HMAC-SHA256实现
│ ├── auth-middleware.js # 认证中间件
│ ├── user-store.js # 用户CRUD存储
│ ├── file-store.js # 文件原子写入存储
│ ├── system-handler.js # 健康检查/系统信息
│ └── audit-handler.js # 审计日志
├── uniapp-skeleton/
│ ├── pages.json # 页面路由配置
│ ├── manifest.json # 应用清单
│ ├── App.vue # 根组件
│ ├── main.js # 入口文件
│ ├── common/ # API封装/工具函数
│ ├── static/ # 静态资源
│ └── pages/
│ ├── login/ # 登录页示例
│ └── index/ # 首页示例
└── harmony-skeleton/
├── ApiClient.ets # HTTP客户端封装
├── LoginPage-template.ets # 登录页模板
├── module.json5 # 模块配置
└── EntryAbility.ets # 入口Ability
七、什么没开源?
以下核心商业逻辑 未包含 在开源包中:
| 模块 | 原因 |
|------|------|
| 合规护栏(G01-G15) | 已申请软件著作权 + 发明专利,核心知识产权 |
| Agent 意图解析器 | 30+ 意图 + 参数提取 + 多步编排,核心交互层 |
| 推荐引擎权重 | 标签匹配/热度/新鲜度三策略混合评分参数 |
| 佣金计算引擎 | 分润层级 + 计酬基数 + 结算规则 |
开源的是 基础设施层,不开源的是 业务逻辑层。基础设施层可以帮你快速搭起项目骨架,业务逻辑需要你自己实现。
八、许可证
Apache License 2.0
你可以:
-
✅ 商业使用
-
✅ 修改代码
-
✅ 分发代码
-
✅ 闭源使用
-
✅ 更换许可证
你需要:
-
📋 保留版权声明和许可证文本
-
📋 注明对代码的修改
九、下载方式
完整源码已打包为 ZIP 文件(约 50KB,29 个文件),可通过 CSDN 下载获取。
下载后解压即可使用,无需 npm install,无需任何依赖安装。
十、总结
| 模块 | 代码量 | 核心价值 |
|------|--------|---------|
| i18n 引擎 | 846 行 | 零依赖7语种国际化,直接引入即用 |
| API 客户端 | 49 行 | 自动降级 + 离线检测,前后端分离必备 |
| Node.js 后端骨架 | 7 个文件 | JWT认证/文件存储/审计日志/健康检查 |
| UniApp 骨架 | 完整项目 | 4端一套代码,登录页+首页示例 |
| HarmonyOS 骨架 | 4 个文件 | 鸿蒙App起步模板 |
| Docker 模板 | 6 个文件 | 三语言Dockerfile + Compose编排 + Nginx |
| UI 框架 | 2 个文件 | 模块化渲染 + 仪表盘组件 |
设计理念:零依赖、拿来即用、看源码就能改。
如果你觉得有用,点个赞 + 收藏,有问题评论区交流。
作者:姚腾
许可证:Apache 2.0
项目:分销代理多端触达系统(distributor-touch)
Tags:
零依赖Node.jsGoJavaPHPHarmonyOSUniApp微服务DockerJWTi18n开源B2B SaaS前端框架鸿蒙开发
更多推荐




所有评论(0)