MaDong SaaS 多租户企业级极速开发框架

kzhzjdyw888

MaDong-SaaS 企业级多租户极速开发框架

标准版之外的进阶之选:MaDong 标准版极速开发框架 + MaDong-SaaS 多租户企业版(见第八节)。两个版本为相互独立的代码仓库,按业务场景按需选择。

一、框架总览

MaDong-SaaS 是基于 Webman 2.x + Workerman 打造的企业级多租户极速开发框架,以「多租户、插件化、高安全、可扩展」为核心设计理念。内置智能多租户隔离、方法级 RBAC 权限、插件系统等企业级能力,支持单体模式与多租户模式灵活切换,专注多租户 SaaS 产品的生产级落地,是 Webman 生态中面向 SaaS 场景的优质后台开发底座。

二、核心技术栈(现代化强栈)

技术 版本 定位
PHP 8.2+ 现代强类型语言
Webman 2.2 高性能 HTTP 服务框架
Workerman 5.2 底层异步网络引擎
Laravel Eloquent 11 优雅 ORM 数据层
JWT 自研增强 安全身份认证
Redis 7.0+ 缓存 / Token 会话管控
前端 Vue3 + TypeScript + Vben Admin 5.x Monorepo 多端后台(pnpm + Turborepo)
实时通信 SSE Server-Sent Events 推送

核心优势

  • 常驻内存运行,无重复请求初始化开销

  • 协程 + 异步 IO 模型,高并发能力拉满

  • 多租户数据源动态切换,隔离策略可配置

  • 全面适配 PHP8.2+ 注解、强类型、新特性

  • 代码架构干净整洁,二次开发自由度极高

三、架构设计

1. 清晰分层架构

  • Controller:请求入口、参数校验、接口分发

  • Service:核心业务逻辑封装

  • Validation:输入验证、参数拦截

  • DAO:数据访问层统一封装

  • Model:数据表结构与模型定义

  • Tenant:多租户上下文与数据源动态切换

2. 双模架构:单体模式 | 多租户模式

一套代码,两种模式,按需启用:

  • 单体模式:单项目独立部署,轻量开箱即用

  • 多租户模式,提供灵活隔离策略:

    • 字段隔离:共享数据表,通过租户字段实现逻辑隔离,适合中小规模应用

    • 库隔离:完全独立数据库,物理隔离,满足企业级安全合规需求

    • 混合模式:关键数据独立存储,非敏感数据共享

3. 插件化架构

核心工程 + 可选插件,模块化设计按需组合:

  • 插件独立安装、卸载、升级,不侵入核心代码

  • 支持第三方插件灵活扩展,不需要的组件直接裁剪

4. 平台插件租户下发与远程管理

面向多租户场景的平台级插件管理能力:

  • 平台侧统一管理插件与版本

  • 插件一键下发到指定租户,无需租户侧人工操作

  • 远程管理租户端插件启用 / 停用状态

5. 前端三端架构(多租户专属)

  • Admin 端(租户端):租户日常管理后台,支持多租户切换、SSE 实时消息推送

  • Platform 端(平台端):平台运营管理后台,租户管理、插件下发与远程管理

  • Install 端(安装向导):轻量可视化安装器,引导完成系统初始化

6. 工程化目录规范

沿用框架统一的工程化目录规范,后端 / 前端分离管理,多租户业务代码按域组织,二次开发路径清晰,维护成本低。

四、核心能力(生产级硬实力)

1. 智能多租户隔离

采用创新的「混合隔离」策略,开发者可根据业务需求灵活选择:

  • 共享数据库,独立 Schema:适合中小规模 SaaS 应用

  • 完全独立数据库:满足企业级安全合规需求

  • 混合模式:关键数据独立存储,非敏感数据共享

2. 方法级 RBAC 权限

内置完善 RBAC 权限体系,权限粒度精细到方法(接口)级别:

  • 可视化权限配置界面,直观高效

  • 细粒度资源控制,精确到每个操作方法

  • 权限变更实时生效

  • 可适配 Casbin 插件,按需扩展更复杂的权限模型

3. 插件系统

  • 插件独立安装、卸载、升级,模块化扩展业务能力

  • 核心工程保持精简,业务能力按需加载

4. 平台插件租户下发与远程管理

  • 平台侧统一管理插件与版本

  • 插件一键下发到指定租户,无需租户侧人工操作

  • 远程管理租户端插件启用 / 停用状态

5. 内置基础业务模块

用户管理、部门管理、职位管理、角色管理、菜单管理、字典管理、系统配置、操作日志、登录日志、服务监控、定时任务、短信发送、邮件服务、附件管理、文件上传、平台管理、公告管理、消息管理、数据权限…… 通用功能开箱即用,无需重复造轮子。

五、性能与安全(生产环境放心用)

性能优势

  • Webman 常驻内存,超低资源消耗

  • 数据库 / Redis 协程连接池

  • 多租户数据源切换高效,隔离开销可控

  • 高并发场景稳定低延迟,适合长期部署

安全防护

  • 租户级数据隔离,杜绝越权访问

  • 方法级权限校验自动注入

  • 全局请求参数强校验过滤

  • 全链路操作日志自动记录

六、与传统多租户方案对比(优势明显)

特性 MaDong-SaaS 传统单体改造方案
隔离模式 字段 / 库 / 混合灵活切换 改造复杂,通常单一
权限体系 方法级 RBAC + 数据权限 基础 RBAC
插件扩展 平台统一管理,租户下发 需人工逐个部署
运行模式 常驻内存、协程异步 每次请求重建
开发效率 开箱即用、极速开发 大量手写业务逻辑

七、快速部署(3 步上线)

\\# 1. 拉取项目源码

git clone https://gitee.com/motion-code/madong-admin-saas.git

cd madong-admin-saas/backend

\\# 2. 安装项目依赖

composer install

\\# 3. 启动 Webman 服务

php start.php start

访问安装向导:http://127.0.0.1:8500/install

八、MaDong 标准版(极速开发框架)

若你当前只需单项目独立部署,可选择 MaDong 标准版 —— 基于 Webman + Element UI 的极速后台开发框架,独立仓库、独立代码,支持一键生成 CRUD、自动接口文档与插件扩展。

九、适用场景

  • 多租户 SaaS 平台、云服务商、租户制管理后台

  • 传统单体系统 SaaS 化转型、多租户改造升级

  • 需要租户独立数据 / 独立部署的企业级产品

  • 平台化运营:插件统一管理、租户按需下发

  • 企业级 OA、CRM、进销存等多租户业务系统

十、Skills 技能库

MaDong-SaaS 5.x 配套 AI 技能库,让 AI 理解你的项目规范。覆盖后端、前端、跨层三大领域,一键分发到各 AI 编辑器,显著提升 AI 编码效率。

  • 技能库地址:https://gitee.com/motion-code/madong-admin-saas-skills

  • 后端技能:控制器、服务、DAO、模型、验证器、路由、中间件、事件、定时任务、数据权限等规范,另含 20 项代码生成技能

  • 前端技能:覆盖 Admin(租户端)/ Platform(平台端)/ Install(安装向导)三端开发规范

  • 跨层技能:API 对接、数据库设计、Git 提交规范、Lint / Format 等工程化规范

  • 一键同步:支持 CodeBuddy / Trae / Cursor / GitHub Copilot / Claude Code / Windsurf / Gemini CLI 等,Windows 执行 sync.ps1,macOS / Linux 执行 sync.sh

十一、项目截图

截图
截图
截图
截图

总结

MaDong-SaaS 聚焦多租户 SaaS 产品的真实需求,融合 Webman 高性能内核 + 智能多租户隔离 + 方法级权限 + 插件化架构,为企业与开发者提供轻量化、稳定、高效的多租户一体化开发解决方案。极简开发、稳定运行、易于扩展,让多租户 SaaS 开发更简单、更高效。

开源关注与社区共建

MaDong-SaaS 目前处于尝鲜阶段,欢迎申请体验、提交 Issue 与建议,共同完善 Webman 生态的多租户开发底座。欢迎 Star、Fork、提交 PR & Issue,一同共建繁荣的 Webman 开源生态。

项目路径 地址
MaDong-SaaS 企业版 https://gitee.com/motion-code/madong-admin-saas
MaDong 标准版 https://gitee.com/motion-code/madong-admin
MaDong-SaaS Skills 技能库 https://gitee.com/motion-code/madong-admin-saas-skills
官网 https://madong.tech/
文档 https://madong.tech/docs
15468 40 17
40个评论

a511721932

很好用的一套开源系统

  • kzhzjdyw888 2024-11-09

    感谢支持
    持续更新中后续还将推出更多开源计划。若您想掌握最新的进展动态,欢迎加入我们的QQ频道,实时获取相关信息。

ncluoyu

很好用的一套开源系统

PHP黑粉

大佬牛批

  • kzhzjdyw888 2024-11-10

    感谢夸奖!
    还有很多需要学习和进步的地方。

saithink

非常棒! 👍 👍 👍

  • kzhzjdyw888 2024-11-10

    非常感谢saiadmin作者的认可和肯定!

    MaDong会持续努力,保持并提升产品质量,期待未来有更多合作和交流的机会,共同推动Webman生态和进步。

oliver.

大概看了下项目的代码风格和分层结构,还挺规范的。想请问下大佬,目前 master 分支稳定吗,最近刚好有个新项目在选开源框架

  • kzhzjdyw888 2024-11-13

    感谢支持
    后端RBAC已完善整体架构没什么变动,框架已预留CRUD代码生成部分实现。

kenshin

无条件支持!webman和vben5 也是我喜欢的两个技术栈。期待第一个release

567

支持 这个后端才是我喜欢的版本
前端顺便学习一下

  • kzhzjdyw888 2024-11-20

    感谢支持!
    如果只要前端,这边可以导出一份apifor 模型接口数据,可以脱离后端开发。

阿沁

支持 !!!

搬砖小助手

支持!!!代码生成什么时候能安排上

  • kzhzjdyw888 2024-11-20

    感谢支持
    这个功能需求好像用处不大吧!

  • 阿沁 2024-11-20

    一键curd很有必要 对于前端小白比较友好 起到引导作用

10bang

赞一个

给力,支持一下,

huihui14569

大佬, 啥时候上数据权限, 哈哈

  • kzhzjdyw888 2024-11-29

    数据权限
    前后端分离接口权限不够用,默认关闭默认路由是无法直接访问控制器的所有请求都必须经过定义路由,默认菜单表不添加接口权限不做验证的,如果需要更细可以在菜单表添加接口对应角色授权了才能访问,这块可以对菜单进行选项拓展选择路由列表进行添加创建。

saym

不错

Ace华

可以,这个系统真的挺不错的,可以直接拿来就用,后台功能很全,堪比java界的若依框架

efnic

点赞一个,正好需要学习Vue

  • kzhzjdyw888 2025-01-08

    开箱即用
    后端可选自己钟情的ORM tp或者la,前端也可以选择对应的拿手的ui 元数组驱动上手快。

tanhongbin

大佬我们系统准备用你这个开发,一会加你好友哈

Achun

作者大大--源码拉下来更新composer后,怎么安装呢

  • kzhzjdyw888 2025-01-18

    选择对应的分支下载,代码拉下来composer install 导入scripts 目录下的sql 就可以了
    1.master thinkORM模型
    2.laravel laraverORM模型
    3.mixture 混合模型适合测试多模型

  • Achun 2025-01-18

    感谢回复

yookey

项目拉下来,试用了下,前端是真够大。
开启定时任务执行时:报错
登录时,图形验证码错的也可以登录哈

  • kzhzjdyw888 2025-01-20

    感谢你的反馈
    1.大前端脚手架相对比较大,最终看打包后项目大小,不建议放到后端代码里面。
    2.验证码不生效默认关闭了,config/captcha captcha_open_flag 打开即可 这里后面做调整关闭了验证码前端不显示该组件。
    3.getCureeUser() 获取当前登录用户信息,定时任务没有经过路由没有相关登录信息导致。

  • yookey 2025-01-20

    好的,谢谢!

luscio

有代码生成的功能吗

  • kzhzjdyw888 2025-01-21

    很抱歉暂不支持该功能
    不过接口都标准化定义,可以自己写模板扩展。

567

不错 赞一个

jian1098

后台页面很漂亮👍如何能像saiadmin一样生成代码就完美了

  • kzhzjdyw888 2025-02-27

    关于可视化生成代码的功能

    已有很多小伙伴私信表示期待,认识到这一功能对于提高开发效率和简化工作流程的重要性。因此,我可以确认,该功能已经在我们的开发计划中了。

稚出

composer install提示找不到madong/madong-helper

solo123

老铁,什么时候开放演示站呢

  • kzhzjdyw888 2025-03-31

    可以正常访问,已追加原来域名地址或者使用admin.madong.tech访问

567

支持一下

lla

牛批

z

坐等更新代码生成,顶

  • kzhzjdyw888 2025-06-06

    先验证一波
    没问题后面集成CI/DI 要不代码生成有什么用

yookey

看了JWT部分:$payload = JWT::jsonDecode(JWT::urlsafeB64Decode($bodyb64));
这个是不是没有作token的签名验证,如果token被恶意篡改岂不是很不安全?还是我看错了?

  • kzhzjdyw888 2025-06-08

    创建token 有添加签名的请查看对应getToken
    parseToken解析的时候只使用body结合redis 用户信息验证过期时间,如果用户觉得不安全可以改成完整token解析。

  • oliver. 2025-07-03

    jwt 签名校验是 jwt 安全性的基本保障,最核心的步骤不能少。难道是疏忽了?

  • kzhzjdyw888 2025-07-08

    该部分已更新

Jinson

看过源码,感觉比较规范,不错

xiaobai

不错,啥时候更新

superkingm

我上个月使用这个这个系统master应该是升级到了2.0.模型生成雪花ID会出现重复。切换到PGSQL数据库部分方法会失效。还有一些方法的返回标记的是TP的orm。导致运行报错,不知道是不是还没有迭代更新完的原因。自己陆陆续续给修改了一些使用了。整体还是不错的

  • kzhzjdyw888 2025-07-01

    感谢支持!
    目前主分支3.x,社区近期放出最新版本测试体验没有问题的话应该在在最近发公开。可以关注一下频道动态或者群动态。

Tinywan

看了一下依赖包,都是盗版我的插件啊!这个插件盗用,简直无敌了!!!

看了一下依赖包,都是盗版我的插件啊!这个插件盗用,简直无敌了!!!

看了一下依赖包,都是盗版我的插件啊!这个插件盗用,简直无敌了!!!

  • Jinson 2025-07-09

    看了下,是不是指 server/packages目录下的包,casbin、jwt那些?

  • Tinywan 2025-07-10

    对啊

  • tanhongbin 2025-07-10

    天下代码一顿抄 哈哈

  • Tinywan 2025-07-10

    希望是共建,不是大家每人搞一个

  • tanhongbin 2025-07-10

    哈哈哈

  • kzhzjdyw888 2025-07-10

    感谢您的关注与反馈。我们始终尊重开源社区的劳动成果,现将使用情况说明如下:

    遵循 Apache License 2.0 的要求:

    1. 完整保留 原项目的 LICENSE
    2. README.md 中明确标注基于您的插件:

    若您认为仍有不合规之处,请具体指出,我们将立即修正。

    项目使用雪花id 以及多数据源做了相关调整,我们的初衷是共建生态,而非重复造轮子。

会飞的鱼

已经基于框架二开自己产品,结构划分非常清晰规范,存在小坑作者都能及时处理!

  • tanhongbin 2025-09-10

    我一直用saiadmin了 感觉好像都差不多他们

  • beita 2025-09-16

    这个支持laravel风格的orm,从laravel转过来更顺溜

beita

这个框架收费吗,看着插件市场要599?还有官网经常报数据库链接的错误是什么情况?

  • kzhzjdyw888 2025-09-15

    MIT开源不收费,服务器配置过低一堆演示网站,数据库扛不住。

  • beita 2025-09-16

    辛苦,非常实用,整个qq群有问题沟通效率更高

tanhongbin

看了功能非常高级,666

  • 暂无评论
lanaz

太强了,膜拜大佬

  • 暂无评论
酒米

这个是不是依然要写前端
redis,文件时共用吗?

  • 暂无评论
calvin

在线催更5.x

  • kzhzjdyw888 2026-03-16

    已进入收尾冲刺
    核心体验、性能优化、大家最关心的“完美感”都已落地,就差最后一轮全场景测试啦!预计两周后,就能和大家正式“见面”——无论是线上体验还是线下小聚,都备好了热乎的新功能。

kenshin

温柔催更

老丛

看介绍里说有协程,看了一下没有开启swoole自动协程,希望框架开发的时候能考虑的自动协程的变量污染的坑,方便后续开启swoole自动协程

  • 暂无评论
老丛
/www/wwwroot/novareader/backend# php webman madong-download:frontend
PHP Fatal error:  Uncaught FastRoute\BadRouteException: Static route "/adminapi/member/auth/permissions" is shadowed by previously defined variable route "/adminapi/member/([^/]+)/permissions" for method "GET" in /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php:95
Stack trace:
#0 /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php(30): FastRoute\DataGenerator\RegexBasedAbstract->addStaticRoute()
#1 /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/RouteCollector.php(44): FastRoute\DataGenerator\RegexBasedAbstract->addRoute()
#2 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(545): FastRoute\RouteCollector->addRoute()
#3 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(229): Webman\Route::addRoute()
#4 /www/wwwroot/novareader/backend/vendor/webman-tech/swagger/src/Integrations/RouteRegister.php(50): Webman\Route::add()
#5 /www/wwwroot/novareader/backend/vendor/webman-tech/swagger/src/Swagger.php(74): WebmanTech\Swagger\Integrations\WebmanRouteFactory->register()
#6 /www/wwwroot/novareader/backend/app/adminapi/config/route.php(23): WebmanTech\Swagger\Swagger->registerRoute()
#7 /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/RouteCollector.php(61): Webman\Route::{closure}()
#8 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(248): FastRoute\RouteCollector->addGroup()
#9 /www/wwwroot/novareader/backend/app/adminapi/config/route.php(22): Webman\Route::group()
#10 /www/wwwroot/novareader/backend/config/route.php(22): require_once('...')
#11 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(580): require_once('...')
#12 /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/functions.php(25): Webman\Route::Webman\{closure}()
#13 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(575): FastRoute\simpleDispatcher()
#14 /www/wwwroot/novareader/backend/support/bootstrap.php(138): Webman\Route::load()
#15 /www/wwwroot/novareader/backend/webman(37): require_once('...')
#16 {main}
  thrown in /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php on line 95

Fatal error: Uncaught FastRoute\BadRouteException: Static route "/adminapi/member/auth/permissions" is shadowed by previously defined variable route "/adminapi/member/([^/]+)/permissions" for method "GET" in /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php:95
Stack trace:
#0 /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php(30): FastRoute\DataGenerator\RegexBasedAbstract->addStaticRoute()
#1 /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/RouteCollector.php(44): FastRoute\DataGenerator\RegexBasedAbstract->addRoute()
#2 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(545): FastRoute\RouteCollector->addRoute()
#3 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(229): Webman\Route::addRoute()
#4 /www/wwwroot/novareader/backend/vendor/webman-tech/swagger/src/Integrations/RouteRegister.php(50): Webman\Route::add()
#5 /www/wwwroot/novareader/backend/vendor/webman-tech/swagger/src/Swagger.php(74): WebmanTech\Swagger\Integrations\WebmanRouteFactory->register()
#6 /www/wwwroot/novareader/backend/app/adminapi/config/route.php(23): WebmanTech\Swagger\Swagger->registerRoute()
#7 /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/RouteCollector.php(61): Webman\Route::{closure}()
#8 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(248): FastRoute\RouteCollector->addGroup()
#9 /www/wwwroot/novareader/backend/app/adminapi/config/route.php(22): Webman\Route::group()
#10 /www/wwwroot/novareader/backend/config/route.php(22): require_once('...')
#11 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(580): require_once('...')
#12 /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/functions.php(25): Webman\Route::Webman\{closure}()
#13 /www/wwwroot/novareader/backend/vendor/workerman/webman-framework/src/Route.php(575): FastRoute\simpleDispatcher()
#14 /www/wwwroot/novareader/backend/support/bootstrap.php(138): Webman\Route::load()
#15 /www/wwwroot/novareader/backend/webman(37): require_once('...')
#16 {main}
  thrown in /www/wwwroot/novareader/backend/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php on line 95
  • kzhzjdyw888 2026-05-16

    普通版本才有一键拉取前端资源,Saas版本暂时不支持

kzhzjdyw888

880
积分
0
获赞数
0
粉丝数
2023-06-07 加入
🔝