• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zhaifanhua
V2EX  ›  程序员

做了好几个后台系统之后,我把这套多租户中后台底座开源了(XiHan.BasicApp 基于.NET 10 + Vue 3)

  •  
  •   zhaifanhua ·
    zhaifanhua · Jun 27 · 1978 views

    做了好几个后台系统之后,我把这套多租户中后台底座开源了( 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

    写在最后

    这个项目还会持续打磨,它并不完美——短信网关、支付还在路上,有些模块也还在重构。但它是我真刀真枪在用的东西,不是写给人看的样板。

    如果它能帮你少造一个轮子,或者给你一点全栈实践的参考,我就很满足了。

    如果想看某个模块的实现细节——比如多租户怎么隔离、字段级安全怎么做的、代码生成怎么写的——评论区告诉我,我可以单独拆一篇出来。

    17 replies    2026-06-29 14:22:47 +08:00
    YAFEIML
        1
    YAFEIML  
       Jun 27
    不错,star 支持
    afirefish
        2
    afirefish  
       Jun 27
    不错,star 支持
    dimwoodxi27
        3
    dimwoodxi27  
       Jun 27
    之前在 NaiveUI 官网看到过,前端 UI 组件设计感觉非常不错
    ddup
        4
    ddup  
       Jun 27
    不错,非常漂亮,同 .NET 开发,支持!
    burp2019
        5
    burp2019  
       Jun 27
    感谢分享,star 支持,难得看到 Net 的帖子
    idragonet
        6
    idragonet  
       Jun 27
    支持下! NET 开发路过。
    gowk
        7
    gowk  
       Jun 27
    .NET 开发路过,支持一下,加油!
    lizhenda
        8
    lizhenda  
       Jun 28 via iPhone
    做的很用心,支持!
    byaiu
        9
    byaiu  
       Jun 28
    mark 一下,希望 1 年后还在维护使用
    guin
        10
    guin  
       Jun 28
    支持,感觉比现在挂在 gitee 的那些仿若依的强
    Lea6fy
        11
    Lea6fy  
       Jun 28
    看起来很不错,支持!看你的项目学习一下
    Al0rid4l
        12
    Al0rid4l  
       Jun 29
    SqlSugar 这个比 EF Core 好用吗? 之前总是在知乎上看到作者
    gowk
        13
    gowk  
       Jun 29
    @Al0rid4l #12 同问
    shiloh595
        14
    shiloh595  
       Jun 29
    @Al0rid4l 还行,没有那么多复杂的概念
    lobatty
        15
    lobatty  
       Jun 29
    同.NET 开发,支持一下!
    RinGress
        16
    RinGress  
       Jun 29
    可惜用的不是.net 的技术栈。star 下学习思想
    Keppel
        17
    Keppel  
       Jun 29
    做的真不错
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1135 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 23:07 · PVG 07:07 · LAX 16:07 · JFK 19:07
    ♥ Do have faith in what you're doing.