做了好几个后台系统之后,我把这套多租户中后台底座开源了( XiHan.BasicApp 基于.NET 10 + Vue 3 )
如果你也写过后台管理系统,大概率经历过这几件事:
- 每开一个新项目,登录、用户、角色、菜单、权限又从零搭一遍,复制粘贴改改改;
- 权限只做到了"能不能看这个菜单",等真到了"这个人只能看自己部门的数据""手机号要打码",就开始一个补丁接一个补丁;
- 想做多租户,结果发现登录、数据隔离、套餐、计费这些东西牵一发动全身,最后做成了一个"伪多租户"。
我也一样。前前后后做了几个中后台,每次都在重复造轮子,每次都不太满意。于是这两年,我把反复踩过的坑,沉淀成了一套自己用着顺手的底座 —— XiHan.BasicApp,现在把它开源了。

它是什么
一句话:一套基于 .NET 10 + Vue 3 的企业级多租户中后台内核。
后端是 DDD 分层 + CQRS ,跑在我自研的底层框架 XiHan.Framework 上;前端是 Vue 3.5 + TypeScript + Naive UI 。
它不是又一个 xxx-admin 的套壳。多租户、RBAC + ABAC 、字段级安全这些通常被"做个样子"的东西,我是当成核心来做的——而且它现在就在真实环境里跑着,不是一个 demo 。
几个我自己最满意的设计
光说功能多没意思,我更想聊聊几个"为什么这么做"的决定。
1. 登录后再选租户,而不是登录前
大多数多租户系统让你先选租户、再登录,体验很别扭。我把邮箱作为全平台唯一身份,登录后由系统按你的归属智能落点:平台管理员进控制台、单租户用户直接进工作台、多租户成员进租户选择页,头像下拉里随时切换租户。超级管理员还能以"平台态"切进任意租户代为管理。

2. 权限一直做到了"字段级"
- RBAC 解决"能不能进这个页面、点这个按钮";
- ABAC 解决"能看哪些数据"——全部 / 本部门 / 本部门及子部门 / 仅本人,越权请求在服务端直接拦掉;
- FLS (字段级安全)解决"敏感字段能不能看、要不要脱敏"——手机号、邮箱该打码的打码,没权限的字段根本不下发,也导不出去。
三层叠在一起,权限才算做完整。这也是我觉得很多"后台模板"做得最敷衍的地方,也是正式上线后,openapi 、接口最容易引发安全问题的隐患。
3. 写应用服务 = 写接口,没有 Controller
后端的应用服务打个 [DynamicApi] 就直接暴露成 REST 接口了,零 Controller 样板,Scalar 文档自动生成。少写一半的胶水代码。
4. 菜单只有一个事实源
菜单、路由、组件路径、权限码、国际化键,全在后端一个 PageRegistry 里登记。前后端契约不会漂,再也不用"前端配一遍菜单、后端配一遍权限,两边对不上"。
5. 前端的列表页是"配置"出来的
全站二十多个列表页,几乎没有重复的 Search / Table 代码——我做了一套 Schema 驱动的列表框架:搜索、表格、导出都用配置生成,列设置、高级搜索、个人视图、行悬停速览、树形、列宽拖拽、导入导出开箱即用。而且权限 / 租户 / 偏好全程感知,你的列设置和搜索习惯还会同步到云端,多端一致。

6. 全栈代码生成
连上数据库,选一张表,实体、DTO 、仓储、服务、接口、前端页面一键生成,Scriban 模板可自定义。新增一个 CRUD 模块,从几小时变成几分钟。
前端我也没敷衍
后台的"前端"经常被当成附属品,但我在这上面花的心思不比后端少。
偏好中心:亮 / 暗主题、主题色、布局风格、紧凑度都能调;更关键的是,你的偏好、列设置、搜索习惯会同步到云端——换台电脑登录,还是你熟悉的样子。

- 灵动岛:借了点手机的灵感,全局操作反馈、异步耗时任务进度都收敛到顶部一个小岛里,不再满屏弹 toast ;
- 顺手的细节:多标签页、收藏夹、命令面板式全局搜索(键盘呼出,直达任意页面与操作)、超多的过渡动画——这些"小东西"才是每天用起来顺不顺手的关键;
- 亮 / 暗双主题是认真做的,不是给
body加个 class 了事,每个页面、每个组件都对过:

移动端不是 PC 页面的缩小版
很多后台的"移动端"就是把 PC 页面硬塞进小屏。我是按移动端交互重新做的——登录、工作台、菜单、命令面板、消息中心,体验接近原生 App:
安全和审计,是我最较真的部分
做 B2B 系统,"谁、在什么时候、做了什么"必须查得到。系统内置六类日志——访问 / API / 操作 / 异常 / 登录 / 实体变更——各自独立写入;请求里的密码、令牌、密钥、身份证这些落库前自动脱敏;实体变更精确到字段,还能区分新增 / 修改 / 删除 / 恢复。

配合前面说的字段级安全,越权访问、敏感数据泄露这些上线后最容易出事的点,从一开始就被框住了。
还有这些
剩下的功能我快速过一下:
- 完整认证:JWT 双令牌、邮箱 / 短信验证码登录、OAuth2 ( GitHub / Google / QQ ,其他的可自行实现,底层都抽象出来了)、2FA 、多端登录控制;
- 消息中心:系统公告 / 安全 / 业务 / 待办 / 紧急五类,顶部横幅、登录弹窗、强制阅读、按角色部门定向,SignalR 实时推送;
- 网关能力:灰度发布(百分比 / 白名单 / 租户 / 请求头)、限流熔断、请求追踪、OpenAPI 签名加密;
- 系统监控:CPU / 内存 / 磁盘 / 网络 / 服务状态一屏掌握;
- 其它:文件多存储(本地 / S3 / OSS / COS / MinIO )、定时任务、审核工作流、富文本 / Markdown / Cron / JSON 编辑器、中英国际化……

技术栈 & 谁适合用
后端:.NET 10 / SqlSugar ( PostgreSQL / MySQL )/ Redis / SignalR / Serilog 前端:Vue 3.5 / TypeScript / Vite / Naive UI / Pinia / Tailwind CSS / Tiptap
代码本身我也尽量写得能看:科学的框架结构,清晰的代码注释,直观的树形依赖——clone 下来不至于一脸懵,能比较快地理清它是怎么组织起来的。

系统里还自带了一个"关于"页,把后端和前端用到的每一个开源依赖都列了出来——既是对这些项目的致敬,也方便你审一遍依赖再决定用不用:

它可能适合你,如果你:
- 想要一套"权限和多租户是真做了"的中后台起步模板,而不是又一个换皮的 admin ;
- 在学 .NET + Vue 全栈,想看 DDD / CQRS 、动态 API 、RBAC + ABAC 怎么落地;
- 在做 B2B SaaS ,需要租户隔离 + 套餐版本 + 权限白名单这套东西。
跑起来很简单
# 后端
git clone https://github.com/XiHanFun/XiHan.BasicApp.git
cd XiHan.BasicApp/backend
dotnet run --project src/main/XiHan.BasicApp.WebHost --launch-profile Development
# 前端(另开一个终端)
cd ../frontend
pnpm install && pnpm dev
首次启动会自动建表 + 初始化种子数据,默认管理员账号 superadmin。后端 API 文档在 http://127.0.0.1:9708/scalar。
写在最后
这个项目还会持续打磨,它并不完美——短信网关、支付还在路上,有些模块也还在重构。但它是我真刀真枪在用的东西,不是写给人看的样板。
如果它能帮你少造一个轮子,或者给你一点全栈实践的参考,我就很满足了。
- GitHub: https://github.com/XiHanFun/XiHan.BasicApp
- Gitee: https://gitee.com/XiHanFun/XiHan.BasicApp
- 源码导读: https://deepwiki.com/XiHanFun/XiHan.BasicApp
- 在线预览: https://basicapp.xihanfun.com
- 交流 QQ 群:462371834
- Star 、Issue 、PR 、吐槽都欢迎。
如果想看某个模块的实现细节——比如多租户怎么隔离、字段级安全怎么做的、代码生成怎么写的——评论区告诉我,我可以单独拆一篇出来。