Technical Documentation: soybeanjs/soybean-admin
ℹ️ Provenance: Multi-Tier Ingestion · CodeWiki Reference
Overview (`README.md`)
[!NOTE]
如果您觉得SoybeanAdmin对您有所帮助,或者您喜欢我们的项目,请在 GitHub 上给我们一个 ⭐️。您的支持是我们持续改进和增加新功能的动力!感谢您的支持!
[!IMPORTANT]
SoybeanAdmin3.0 版本正在开发中,将基于 ubean 全栈框架与 VeanUI 组件库进行整体重构,进展与方案请查看 Roadmap Issue #941。
[!WARNING]
2.3将是 2.x 系列最后一个维护的大版本。2.x 后续只在该版本上提供维护更新,新特性将集中在 3.0 中实现,建议新项目关注 3.0 进展。
简介
SoybeanAdmin 是一个清新优雅、高颜值且功能强大的后台管理模板,基于最新的前端技术栈,包括 Vue3, Vite8, TypeScript, Pinia 和 UnoCSS。它内置了丰富的主题配置和组件,代码规范严谨,实现了自动化的文件路由系统。此外,它还采用了基于 ApiFox 的在线Mock数据方案。SoybeanAdmin 为您提供了一站式的后台管理解决方案,无需额外配置,开箱即用。同样是一个快速学习前沿技术的最佳实践。
特性
- 前沿技术应用:采用 Vue3, Vite8, TypeScript, Pinia 和 UnoCSS 等最新流行的技术栈。
- 清晰的项目架构:采用 pnpm monorepo 架构,结构清晰,优雅易懂。
- 严格的代码规范:遵循 SoybeanJS 规范,集成了eslint、oxlint、oxfmt 和 vp hooks,保证代码的规范性。
- TypeScript: 支持严格的类型检查,提高代码的可维护性。
- 丰富的主题配置:内置多样的主题配置,与 UnoCSS 完美结合。
- 内置国际化方案:轻松实现多语言支持。
- 自动化文件路由系统:自动生成路由导入、声明和类型。更多细节请查看 Elegant Router。
- 灵活的权限路由:同时支持前端静态路由和后端动态路由。
- 丰富的页面组件:内置多样页面和组件,包括403、404、500页面,以及布局组件、标签组件、主题配置组件等。
- 命令行工具:内置高效的命令行工具,git提交、删除文件、发布等。
- 移动端适配:完美支持移动端,实现自适应布局。
版本
[!IMPORTANT]
3.0 版本正在开发中(Roadmap Issue #941);2.3是 2.x 系列最后一个维护的大版本。
- NaiveUI 版本:
- AntDesignVue 版本:
- ElementPlus 版本:
- 旧版:
文档
合作事项
我们非常感谢大家对 SoybeanAdmin 的支持!为了进一步回馈社区,并助力企业和开发者实现个性化需求,我们现提供多种合作服务,期待与您携手共赢。
1、定制化管理后台开发
针对企业和开发者的特定业务需求,我们提供基于 SoybeanAdmin 的定制化管理后台开发服务。我们的团队具备丰富的行业经验,能够迅速理解并实现您的需求,打造高效、灵活且安全的定制化解决方案。
- 定制开发:我们将根据您的具体需求,提供从需求分析、UI设计到功能实现的全方位服务,确保项目高效交付。
- 功能扩展:在
SoybeanAdmin基础上,扩展您所需的特定功能模块,提升管理后台的功能和用户体验。
2、企业外包服务
我们承接各类企业级外包项目,特别是在管理后台系统的开发、集成与运维方面。我们以精益求精的态度,确保项目的质量和进度,为您的业务提供强有力的技术支持。
- 项目开发:无论是全新的项目,还是现有系统的优化与集成,我们都将为您量身打造高效可靠的解决方案。
- 系统集成与维护:我们也提供基于
SoybeanAdmin的系统集成与长期维护服务,确保您的系统稳定、安全地运行。
3、联系方式
如有合作意向或项目咨询,请通过以下方式与我们联系:
- Email: [email protected]
- GitHub Issues: 欢迎通过 GitHub Issues 联系我们,进行初步的合作洽谈。
- 商务合作微信: honghuangdc
期待与您开展深入合作,共同推动 SoybeanAdmin 项目及其在更多领域的成功应用!
示例图片
使用
环境准备
确保你的环境满足以下要求:
- git: 你需要git来克隆和管理项目版本。
- NodeJS: >=20.19.0,推荐 20.19.0 或更高。
- pnpm: >= 10.5.0,推荐 10.5.0 或更高。
克隆项目
# github
git clone https://github.com/soybeanjs/soybean-admin.git
# gitee
git clone https://gitee.com/honghuangdc/soybean-admin.git
# gitcode
git clone https://gitcode.com/soybeanjs/soybean-admin.git安装依赖
pnpm i由于本项目采用了 pnpm monorepo 的管理方式,因此请不要使用 npm 或 yarn 来安装依赖。
启动项目
pnpm dev构建项目
pnpm build代码同步
参考 代码同步 文档。
周边生态
- skyroc-admin: SoybeanAdmin的React版本实现.
- electron-mock-admin: 一个 Mock Api 管理系统,帮助前端开发伙伴快速实现接口的 mock。
- T-Shell: 是一个可配置命令提示的终端模拟器和 SSH 客户端。
- pea : 采用SpringBoot3.2 + JDK21、MyBatis-Plus、SpringSecurity安全框架等,适配 soybean-admin 开发的简单权限系统。
- MalusAdmin: 基于 Vue3/TypeScript/NaiveUI 和 NET7 & Sqlsugar 开发的后台管理框架。采用最原生最简洁的方式来实现, 前端清新优雅高颜值,后端 结构清晰,优雅易懂,功能强大。
- PanisAdmin: 采用SpringBoot3、SaToken、MySQL等框架开发,二次修改 soybean-admin,适配动态菜单/按钮级别的鉴权,保留原汁原味、清新优雅、高颜值的后台管理系统脚手架。
- snail-job: 一款兼具 “高性能、高颜值、高活跃” 的分布式任务重试和分布式任务调度平台。
- SuperApi: 快速将你的 idea 变成线上稳定运行的产品! 无实体建库建表,对无实体库表进行增删改查,支持 15 种条件查询,以及分页,列表,无限级树形列表 等功能的 API 部署! 拥有接口文档,Auth 授权,接口限流,获取客户端真实 IP,先进的服务器缓存组件,动态 API 等功能,期待您的体验!
- FastSoyAdmin: 基于 FastAPI+Vue3+Naive UI 的现代化轻量管理平台.
- ba: 基于goFrame框架开发的后端服务对接soybean-admin,适配动态路由,接口鉴权限。
- soybean-admin-go:基于gin+gorm框架开发的go语言后端服务对接soybean-admin的example分支,适配动态路由,接口鉴权限。
更多周边生态请翻阅 周边生态 文档。
如何贡献
我们热烈欢迎并感谢所有形式的贡献。如果您有任何想法或建议,欢迎通过提交 pull requests 或创建 GitHub issue 来分享。
Git 提交规范
本项目已内置 commit 命令,您可以通过执行 pnpm commit 来生成符合 Conventional Commits 规范的提交信息。在提交PR时,请务必使用 commit 命令来创建提交信息,以确保信息的规范性。
浏览器支持
推荐使用最新版的 Chrome 浏览器进行开发,以获得更好的体验。
| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
开源作者
贡献者
感谢以下贡献者的贡献。如果您想为本项目做出贡献,请参考 如何贡献。
以下是近一年中活跃度较高的贡献者,感谢各位的支持,让项目得以持续发展。
交流
SoybeanAdmin 是完全开源免费的项目,在帮助开发者更方便地进行中大型管理系统开发,同时提供飞书群供大家交流,使用问题欢迎在群内提问。
飞书群
Star 趋势
开源协议
项目基于 MIT © 2021 Soybean 协议,仅供学习参考,商业使用请保留作者版权信息,作者不保证也不承担任何软件的使用风险。
V3 (`docs/v3.md`)
soybean-admin v3.0 实现方案
基于 ubean + vite-plus + soybean-ui 的全栈重构方案
状态:草案(供评审)
基线:soybean-admin v2.x(main = 脚手架内核,example = 全功能演示)
参考实现:soybean-unify(简约全栈参考)、ubean examples/ubean-test(全栈骨架参考)
1. 背景与目标
soybean-admin v2.x 是纯前端 SPA 模板:Vue 3 + Vite + Naive UI + Pinia + UnoCSS + elegant-router,后端能力完全依赖 Apifox 在线 mock 或用户自备服务。v3.0 的目标:
- 整体技术栈升级为全栈框架:以 ubean(v0.4.1,Vue 全栈框架,Hono 内核)为基座,构建工具链切换为 vite-plus(
vp),UI 层切换为 VeanUI(@vean/ui+@vean/aria)。 - 能力对齐:完整实现 v2.x(main + example)的全部能力,不丢"隐形能力"(见 §5.9)。
- 简约优先:以 soybean-unify 的简约实现为参考范式——单一契约源(
src/schema/Valibot)、OpenAPI 类型化客户端、菜单驱动路由/页签/标题的一元数据模型、零自研布局、单包平铺工程结构。 - 架子 + 样式适配:用 soybean-ui 搭好完整架子(布局/导航/页签/主题);第三方 UI 库(naive-ui / element-plus / ant-design-vue)的样式适配器(让第三方组件对齐 soybean-ui 的颜色、圆角等设计 token)在独立仓库开发,使 v2 各发行版平滑过渡到 v3。
- 双版本交付:
main分支:全栈版(ubean 完整能力:文件路由 API + DB + 鉴权 + OpenAPI 类型共享);lite分支(新分支承载):前端版(仅@ubean/vue客户端内核 + 自定义后端,任意语言后端可接入)。
非目标
- 不实现 v2.x 从未存在过的能力(锁屏、cropper、ripple 等不在 example 基线内,不列入)。
- v3.0 首版不做 SSR/SSG(admin 面板模式官方推荐
mode: 'fullstack' + ssr: false)。 - 不做 naive-ui 等旧版组件级 1:1 转发适配(原因见 §7.1),适配器只做样式 token 对齐;适配器实现不进本仓库(§7.2)。
2. 技术选型总览
| 层 | v2.x 现状 | v3.0 选型 | 选型依据 |
|---|---|---|---|
| 应用框架 | 纯前端 SPA(Vite 手工装配) | ubean 0.4.x(mode: 'fullstack', ssr: false) |
README 明确 admin panel 是 fullstack 模式的典型用例;client+server 双构建、无 SSR 开销 |
| 构建/工程工具链 | Vite + ESLint + Prettier + Turbo(无)+ 手写脚本 | vite-plus(vp):dev/build/test/lint/fmt/pack 一体;catalog 中 vite: npm:@voidzero-dev/vite-plus-core |
ubean 深度绑定 vite-plus;soybean-unify 已验证该工作区编排(vp check --fix staged、oxlint/oxfmt) |
| 路由 | elegant-router 插件生成 + 手写守卫 | ubean 文件式页面路由(src/pages/** + definePage 宏 + .ubean/routes.d.ts 类型化路径),守卫注入 defineApp({ router: { setup } }) |
与 elegant-router 同族的文件约定,且额外获得动态段 matcher、keep-alive、复用路由、并行/拦截路由 |
| 状态管理 | Pinia + @sa/* 私有包 |
Pinia(经 @ubean/integrations/pinia,pinia: true) |
框架不内置 store;unify 验证 6 个 store 足够 |
| UI 组件 | Naive UI(架构级耦合:NConfigProvider/四大 Provider/TableColumn) | SoybeanUI 0.30+(@vean/ui styled + @vean/aria)+ @vean/theme + @vean/unocss |
SAppShell 一个组件承接 v2 全部 6 种布局模式与菜单形态(见 §5.2);ubean ui: true 自动接 UiResolver |
| HTTP 客户端 | @sa/axios(axios 内核 flat request) |
@soybeanjs/fetch(createRequest/toFlatRequest + /openapi 子路径 createTypedClient/toFlatTypedClient,含 createUploadProgressAdapter/downloadFile) |
ubean 官方指定客户端(examples/ubean-test/src/request/client.ts 即此用法);fetch 内核免 axios 依赖 |
| 工程 CLI | @sa/scripts(sa git-commit/release/changelog/cleanup) |
@soybeanjs/cli(1.8.x,bin soy:git-commit/git-commit-verify/changelog/release/cleanup/ncu/config) |
官方维护通用 CLI,能力覆盖 @sa/scripts;gen-route 由文件式路由天然替代 |
| 后端 | Apifox 在线 mock(无真实服务) | ubean 后端:src/routes/api/** 文件路由(Hono handler 链)+ valibot 校验 + @ubean/server 原语(db/cache/session…) |
unify 的 server(Hono + Drizzle + RBAC)即为该形态的手写版,ubean 将其框架化 |
| 数据层 | 无 | Drizzle ORM + db0 connector(dev 默认 SQLite/内存,prod 可切 Postgres)+ drizzle 迁移 | defineDatabase/useDatabase 原语;unify 的 13 表 schema 可直接移植 |
| 鉴权 | mock 假登录 + 前端 roles 过滤 | JWT 双 token + Redis/内存黑名单(unify 方案)或 @ubean/auth(Better Auth);RBAC 权限码 api:${method}:${template} |
见 §6.4;@ubean/auth 成熟度待观察,首版建议沿用 unify 自研 JWT 方案以可控 |
| 类型共享 | 手写 typings/api/*.d.ts |
单一契约源:src/schema/(Valibot,前后端源码直消费)+ OpenAPI codegen(.ubean/openapi.d.ts)→ toFlatTypedClient |
Hono 路由 → /_openapi.json → openapi-typescript 闭环,ubean 内置;应用单包化后 schema 无需独立包 |
| 主题 | naive themeOverrides + 4 个 JSON 预设 | @vean/theme(createTheme CSS 变量引擎)+ SConfigProvider/SThemeCustomizer |
shadcn 风格全量语义 token,light/dark 双份,SThemeCustomizer 即现成主题抽屉 |
| i18n | vue-i18n 手工装配 | @ubean/i18n(vue-i18n 11 + 约束前缀语言路由 + src/locales/ 扫描) |
配置化(i18n: { locales, defaultLocale }),.ubean/i18n.d.ts 类型生成 |
| 图标 | iconify + unplugin-icons + svg-icons 三套 | @ubean/icon(icon: true,Iconify)+ SIcon(IconValue)+ 本地 svg 约定 |
soybean-ui 数据模型(menu/table 的 icon 字段)直接吃 iconify 字符串 |
版本风险声明:ubean 当前 0.4.1、README 标注"不可生产",0.3→0.4 刚做过入口大重构。v3.0 发布节奏必须与 ubean 版本锁定策略绑定(见 §10)。
3. 仓库与工程结构
3.1 项目结构(main 分支 = 全栈版,单包平铺)
v3 不再使用 monorepo:应用直接落在仓库根目录(等价于把 v2 设想中 apps/admin/ 的内容平铺),全栈应用的天然属性(前端 + API + 数据库同仓同进程)使 workspace 分层失去意义。
/* Detailed source-code truncated for AI context efficiency. */要点:
- 删除 v2 的
packages/私有包体系(@sa/axios、@sa/materials、@sa/hooks、@sa/color、@sa/scripts、@sa/uno-preset、@sa/alova、@sa/ofetch)与根pnpm-workspace.yaml:其职责分别由@soybeanjs/fetch、soybean-ui、@soybeanjs/utils、@vean/theme、@soybeanjs/cli、vp承担,全部以已发布 npm 包消费,仓库内不再维护本地包。 - schema 下沉
src/schema/:全栈应用前后端同进程、同 tsconfig,Valibot schema 直接以相对路径 import(#/schema/auth),无需 workspace 包;DTO 类型即 schema 推导类型,单一契约源不变。 - 第三方 UI 样式适配不放本仓库:由独立仓库开发(见 §7.2),本项目只保留对接约定。
- mock 服务退役:
src/service/api/*手写 API 层与 Apifox mock 全部删除,接口由src/routes/api/**真实实现,dev 即跑真后端(同进程,Vite middlewareMode + Hono)。 - v2
src/views→src/pages:文件约定基本同构([id].vue动态段、(group)路由组、_builtin→(builtin)),迁移以目录重命名 + meta 改写为主。 - 路径别名统一
#/→src/(vite-plustsconfigPaths+ ubean 默认约定)。
3.2 双版本分支策略(要求 8)
main(全栈版,默认) |
lite(前端版,新分支) |
|
|---|---|---|
| 框架入口 | ubean(ubean/client、ubean/server 全量) |
仅 @ubean/vue + @ubean/client(或纯 @ubean/vue 内核,参照 examples/client-only-spa) |
| 后端 | src/routes/api/** + @ubean/server 原语 + Drizzle |
无后端代码;src/request/ 指向用户自备 API(任意语言),契约用 OpenAPI 文档 + openapi-typescript 手工生成 |
| 构建 | ubean dev/build(client+server 双构建) |
vp build(纯 Vite SPA),vite.config.ts 用 ubeanVueVite() |
| 路由 | 文件式 src/pages + virtual routes |
同样文件式(@ubean/vue 是多目录页面路由唯一所有者),无 loader/SSR 数据层 |
| 鉴权 | JWT 双 token + RBAC 中间件 | 前端流程保留(登录页/守卫/token 存储/权限过滤),接口路径与响应码 env 可配 |
| mock | 不需要(真后端) | 可选保留轻量本地 mock(routeRules.proxy 或 MSW),默认提供 unify 风格 docs/api-contract.md 接口契约说明 |
| 共享代码 | src/schema、src/store、src/layouts、src/components 等绝大部分 |
与 main 尽量保持目录与代码一致,差异集中在:ubean.config.ts、vite.config.ts、src/routes/+src/services/+src/db/(删除)、src/server.ts(删除)、src/request/(改 baseURL 来源)、src/schema/(保留但仅前端消费) |
同步机制:lite 分支定期从 main rebase/merge,冲突面控制在上述差异点(集中在 5 个文件/目录)。CI 对两分支都跑 typecheck + build。文档站分别说明两种起步方式:pnpm create 模板对应 main;lite 作为"接入自定义后端"的官方示例。
4. 现有能力 vs v3.0 能力实现对比(核心)
4.1 布局与导航
| v2.x 能力 | v2.x 实现 | v3.0 实现 | 状态 |
|---|---|---|---|
| 6 种布局模式(vertical / horizontal / vertical-mix / vertical-hybrid-header-first / top-hybrid-sidebar-first / top-hybrid-header-first) | 自研 AdminLayout + 6 套 global-menu 组件 | SAppShell 单组件 6 模式:mode = 'sidebar' | 'top' | SplitNavMode,其中 SplitNavMode 4 种(dual-vertical / vertical-horizontal / horizontal-vertical / horizontal-dual-vertical);模式名描述菜单形态而非方向——一级垂直即全高侧栏(orientation 派生为 horizontal),一级水平即顶栏;items 一棵菜单树供全部渲染器消费;侧栏宽度由实际渲染面板推导 |
✅ 组件化承接(见 §5.2) |
| 侧栏菜单树(first/menu 混合树、折叠记忆、手风琴) | 自研 global-menu + menu store 派生 | 侧栏类模式渲染 STreeMenu、拆分类渲染 SSplitNav 子面板;expandStrategy: 'selected' | 'keep' 控制折叠后展开策略;collapsible: 'offcanvas' | 'icon'/collapsedWidth/--sidebar-* 经 layoutProps 透传内部 SLayout |
✅ 组件化承接 |
| 面包屑(菜单派生、下拉切换兄弟菜单) | 自研 breadcrumb store | SBreadcrumb 默认由 items + 激活值自动派生,传 breadcrumbs 才覆盖;下拉切换兄弟菜单经 breadcrumbProps 下沉(⚠️ 需应用层包装,原 store 下拉逻辑迁移) |
✅ 派生内化,下拉需包装 |
| 头部(品牌 logo/标题、折叠触发、明暗切换、用户区) | global-header + 手摆插槽 | #header 系插槽 + headerStart/headerCenter/headerEnd;触发按钮跟随一级菜单位置(shell 统一安排);品牌经 #logo/#title + logoPlacement;明暗 = SThemeModeSwitch |
✅ 组件化承接 |
| 移动端抽屉(<768px 全量菜单) | 自研 MobileDrawer | 恒以 sidebar 骨架渲染全量菜单树抽屉,v-model:mobileOpen 受控;备份恢复保留在 app store |
✅ 组件化承接 |
| 主题配置抽屉(外观/布局/通用/操作 4 Tab,约 40 项配置) | 自研 theme-drawer | SThemeCustomizer 内置面板 + 应用层补充 admin 专属项(布局模式卡片、页签风格、水印、搜索开关等),配置模型 = theme store → layoutProps 一层映射(unify 范式) |
✅ 大部分内置,admin 项需扩展 |
| 页签:3 风格(chrome/button/slider)、拖拽排序、右键菜单、中键关闭、固定、缓存、自定义标题、多标签 | 自研 GlobalTab + @better-scroll | SAppShell 内置页签(底层 SPageTabs,经 tabs/v-model:tabValue/tabProps/tabUi 喂入):beforeClose、中键关闭、pin 自动排序、draggable、contextMenu 全内置;多标签(query 区分)、页签缓存、setTabLabel 在 tab store 承接 |
✅ 组件化承接 |
| 水印(文本/用户名/实时时间 7 格式) | NWatermark | SWatermark(@vean/aria 已有 watermark 原语)+ watermarkContent 派生逻辑保留 |
✅ |
| 全局搜索(菜单模糊搜索、键盘导航、高亮) | 自研 search-modal | SCommand(命令面板原语)+ 菜单索引;routeRules 无关,纯前端 |
✅ 组件化重写 |
| 页面切换动画 7 种 | transition.css | SAppShell(经 layoutProps 转发内部 SLayout)页面过渡 props + @ubean/vue 页面过渡能力 + view transitions |
✅ |
| 滚动模式 wrapper/content、固定头部/页签/底部 | AdminLayout props | 内部 SLayout(经 SAppShell layoutProps 透传)scrollBehavior/fixedTop/fixedFooter 原生 |
✅ |
| Footer(显隐/固定/高度/居右) | global-footer | SAppShell #footer 插槽 + 内部 SLayout Footer(visible/height 经 layoutProps) |
✅ |
| 灰色/色弱模式 | documentElement filter | 应用层保留(css filter),theme store 驱动 | ✅ 保留 |
| 全屏内容切换 | app store fullContent | 内部 SLayout fullContent prop(经 SAppShell layoutProps) |
✅ |
4.2 路由与权限
| v2.x 能力 | v3.0 实现 | 状态 |
|---|---|---|
elegant-router 自动生成 + RouteKey/RouteMap 类型 |
.ubean/routes.d.ts + typed-router.d.ts(useRoute('RouteName') 参数推断)+ 动态段 matcher([id=numeric].vue) |
✅ 等价且更强(matcher 校验、复用路由、拦截路由) |
静态/动态双权限模式(VITE_AUTH_ROUTE_MODE) |
保留双模式:static = 本地菜单数据 + roles 过滤;dynamic = GET /api/menu/user 返回菜单树 → transformMenusToAutoRoutes(unify 范式,菜单驱动路由/页签/标题一元模型) |
✅ |
| 路由守卫链(progress → route → title) | defineApp({ router: { setup } }) 注册 beforeEach:auth 守卫 + 首屏 loading + 进度条(soybean-ui progress);标题由菜单 i18nKey 驱动 |
✅ 注入点变化,逻辑保留 |
| 15 项 meta 字段 | definePage({ meta }):requiresAuth/roles/keepAlive/multiTab/pinned/tabbable/href/activeMenu/order/icon/hideInMenu/query/isDev 全部保留;title/i18nKey 改由菜单数据承载(unify 简化),纯静态路由提供 routeTitle 兜底 |
✅(title 语义迁移,见 §5.3 说明) |
| 按钮级权限(userInfo.buttons + hasAuth + 演示页) | useAuth().hasAuth(code) + v-auth 指令(v2 无指令、v3 补上)+ 角色管理分配按钮权限弹窗 |
✅ 增强 |
| 403/404 判定(路径存在但无权限 → 403) | 保留:NotFound 捕获时 checkIsRouteExist(static 查表 / dynamic POST /api/menu/exist-path) |
✅ |
| keep-alive 按 meta 收集 + exclude 精确重置 | @ubean/vue 页面缓存(useCacheViews/enablePageCache/invalidatePageCache)+ route store cachedRoutes |
✅ |
iframe 外链页、href 外链新窗口 |
(builtin)/iframe/[url].vue 保留;meta.href 行为保留 |
✅ |
| root redirect = 动态 home | 菜单接口返回 home → 改写 ROOT redirect(unify 同款) | ✅ |
4.3 请求与后端
| v2.x 能力 | v3.0 实现 | 状态 |
|---|---|---|
flat request({data,error} 免 try/catch) |
toFlatRequest(@soybeanjs/fetch) |
✅ |
| Bearer 注入、响应解包、业务码判定 | onRequest/transform/isBackendSuccess 约 80 行范式(unify) | ✅ |
| token 过期刷新 + 并发去重 + 原请求重放 | v2 有、unify 缺——v3 必须接线:401/过期码 → refreshTokenPromise 去重 → 重放队列(保留 v2 shared.ts 逻辑) |
✅ 保留(吸取 unify 未完成教训) |
| LOGOUT_CODES / MODAL_LOGOUT_CODES 弹窗登出 | env 可配 + SDialog/useToast 实现 |
✅ |
| 错误消息去重栈 | errMsgStack 逻辑保留 | ✅ |
多 baseURL(demoRequest / VITE_OTHER_SERVICE_BASE_URL) |
routeRules.proxy(/_p/{key} 前缀代理)+ 多 client 实例 |
✅ |
| dev 代理 + 终端彩色日志 | vite-plus proxy / routeRules proxy;日志用 @ubean/server logger |
✅ |
| 版本更新检测(轮询 buildTime meta) | 保留(prod 特性开关 VITE_AUTOMATICALLY_DETECT_UPDATE);或改 /_health 版本端点 |
✅ |
| Apifox mock | 删除,由真实后端 + seed 数据替代;lite 分支提供接口契约文档 + 可选 MSW | 🔄 架构替换 |
手写 service/api/*.ts + typings/api/*.d.ts |
删除,createTypedClient 直接按路径调用;服务端进程内 createInternalAdapter 零网络复用 |
✅ 简化 |
4.4 状态管理
v2 的 5 个 store(app/auth/route/tab/theme)+ v3 新增 menu,全部保留为 Pinia setup store(unify 验证 6 store 结构):
| store | v3.0 职责变化 |
|---|---|
| app | 不变:isMobile、reloadSignal、fullContent、drawer 开关、移动端布局备份恢复 |
| auth | 接真实登录接口;跨用户切换清页签、lastLoginUserId 保留 |
| theme | settings → ThemeOptions(@vean/theme)+ layoutProps 派生;naive themeOverrides 生成逻辑删除;生产缓存 + overrideThemeSettings 版本覆盖保留 |
| route | 动态路由注册(addRoute 仍可用,vue-router 5 实例由框架创建)+ cacheRoutes |
| tab | 不变(对接 SAppShell 内置页签:tabs + v-model:tabValue,事件 tabClick/tabClose 回写 store) |
| menu(新增,自 route 拆分) | 菜单树 + map + 面包屑 + routeMenu;监听语言变化重建(unify 范式) |
4.5 i18n / 主题 / 图标
| v2.x | v3.0 |
|---|---|
| vue-i18n 手工装配、zh-cn/en-us 两套 Schema 类型 | @ubean/i18n 配置化 + .ubean/i18n.d.ts 类型生成;src/locales/ JSON 组织;保留 remove-i18n 一键裁剪脚本(unify) |
| naive locale/dateLocale 联动 | SConfigProvider locale + @vean/aria/locale(13 语言包);dayjs locale 联动保留 |
| 语言切换联动 title/menu/tab/dayjs | 全部保留(menu store + tab store 监听) |
| 4 个主题预设 JSON(default/dark/compact/azir) | @soybeanjs/shadcn-theme 内置预设 + 自定义 preset/overrides;VITE_THEME_PRESET env 选择 |
| iconify 离线 provider + 本地 svg 双模 | icon: true(@ubean/icon)+ 本地 svg collection 约定保留;SIcon 的 IconValue 统一数据模型 |
4.6 页面功能对齐清单
| v2.x 页面 | v3.0 处理 |
|---|---|
| 登录(pwd/验证码/注册/重置密码/绑定微信 5 模块) | 全部实现;后端真实签发 token;图形验证码用 @ubean/server cache 存储答案 |
| 首页 dashboard(问候横幅/4 统计卡/折线/饼图/项目动态) | 全部实现;图表用 @soybeanjs/chart + echarts(useEcharts hook 保留);CountTo 用 useTransition |
| manage:用户/角色/菜单/按钮权限管理(example) | 升级为 unify 的 8 套 CRUD:menu/user/role/permission/org/api/dict/dict-item,统一"搜索卡 + 分页表格 + operate 弹窗"范式(usePaginatedTable + useTableOperate) |
| function:标签页/多标签/请求演示/切换权限/隐藏子菜单/超管页 | 全部保留,请求演示对接真实错误码端点 POST /api/auth/error |
| multi-menu 三级嵌套 | 保留(文件目录天然表达) |
| plugin:copy/icon/echarts/antv/vchart/wangEditor/vditor/excel/pdf/print/barcode/pinyin/video/map/swiper/typeit/vtable/gantt | 全部保留为第三方集成示例页;依赖清单见 §5.8 |
| about(依赖版本表/构建时间/技术栈卡片) | 保留;版本表改读 catalog |
| user-center 占位 | 升级为完整 profile + settings 页(unify 占位教训,v3 补齐) |
| 403/404/500 | 保留(exception-base → soybean-ui SEmpty + 本地 svg) |
| alova 示例 / pro-naive-ui 示例 | 不迁移(alova 与框架请求层重复;pro-naive-ui 属 naive 生态) |
4.7 工程能力
| v2.x | v3.0 |
|---|---|
| ESLint + oxlint + oxfmt + simple-git-hooks | vp lint / vp fmt(oxc 系)+ vp check --fix staged;共享 @soybeanjs/oxc-config |
sa git-commit 交互式提交(@sa/scripts) |
soy git-commit(@soybeanjs/cli,devDependency 引入),commit-msg 钩子换 soy git-commit-verify;soy release/soy changelog/soy cleanup/soy ncu 覆盖 v2 @sa/scripts 全部能力 |
| vue-tsc typecheck | 保留(ubean prepare 生成 .ubean/ 类型后跑 vue-tsc) |
| bundle 体积无约束 | 引入 ubean pnpm analyze 基线回归(gzip 增长 >5% CI 失败) |
| GitHub Actions lint/release | 保留;release 走 soy release(内部 bumpp + @soybeanjs/changelog) |
| env 约 25 个变量 | 精简至约 15 个(见 §5.10):删除 naive 专属、mock 专属;新增 VITE_API_ENV/VITE_API_PROXY/VITE_THEME_PRESET |
5. 前端详细设计
5.1 应用入口与生命周期
// src/app.ts
import { defineApp } from 'ubean/client';
import { setupStore } from './store';
export default defineApp({
appRoot: () => import('./app.vue'), // SConfigProvider 包装层
plugins: [setupStore], // pinia 经 @ubean/integrations/pinia
router: {
setup(router) {
router.beforeEach(authGuard); // 登录/权限/动态路由初始化
router.beforeEach(progressGuard); // soybean-ui progress
router.afterEach(titleGuard); // document.title(菜单 i18nKey 驱动)
}
},
onClientReady() {
setupLoading(); // 首屏 HTML loading(主题色联动)
}
});app.vue(appRoot):SConfigProvider(theme/persistTheme/dir/locale)+ Toast/Dialog Provider 挂载 + 全局水印 SWatermark。
5.2 布局架子(layouts/default.vue)
<script setup lang="ts">
import { SAppShell } from '@vean/ui';
const active = ref('');
// items:菜单树(AppShellMenuItem[],唯一数据入口;面包屑/高亮路径由 shell 派生)
</script>
<template>
<SAppShell
v-model="active"
v-model:tab-value="tabStore.activeTab"
mode="dual-vertical"
:items="menuStore.items"
:tabs="tabStore.tabs"
expand-strategy="keep"
@tab-click="tabStore.switchTab"
@tab-close="tabStore.removeTab"
>
<template #logo><AppLogo /></template>
<template #headerStart>
</template>
<template #headerCenter><GlobalSearch /></template>
<template #headerEnd>
<UserAvatar />
<ThemeModeSwitch />
</template>
<template #default><RouterView /></template>
<template #footer v-if="footerVisible"><LayoutFooter /></template>
</SAppShell>
</template>要点:
mode承接 v2 全部 6 种布局:sidebar(原 vertical / vertical-mix 的侧栏形态)、top(原 horizontal)、dual-vertical(原 vertical-mix)、vertical-horizontal(原 top-hybrid-sidebar-first)、horizontal-vertical(原 top-hybrid-header-first)、horizontal-dual-vertical(原 vertical-hybrid-header-first)。模式名描述菜单形态而非方向:一级菜单垂直 = 全高侧栏,一级水平 = 顶栏;orientation等布局朝向由 shell 从 mode 派生(相对旧SLayout直填 props 是反转的),应用层不再手写。- 一棵菜单树喂所有渲染器:
items: AppShellMenuItem[]是唯一菜单数据入口,sidebar/top 渲染STreeMenu/STreeNav,4 种 split 模式渲染SSplitNav,无需按模式切换组件。 breadcrumbs默认由items+ 激活值自动派生(原 menu store 派生逻辑内化),传入才覆盖;expandStrategy: 'selected' | 'keep'控制折叠后展开策略(top 模式无此项;menuProps.tree/split优先级更高)。- 品牌/标题仅经
#logo/#title插槽注入,logoPlacement: 'auto' | 'sidebar' | 'sidebar-bottom' | 'header'控制落位(sidebar-bottom仅 sidebar/dual-vertical 生效);折叠触发按钮位置跟随一级菜单位置,由 shell 统一安排。 - 移动端恒以
sidebar骨架渲染全量菜单树抽屉(767.9px 断点;props 保留宿主传值),v-model:mobileOpen受控。 - 主题/布局配置映射:theme store →
layoutProps转发内部SLayout(shell 自己持有 open/orientation/sidebarVisible/isMobile/pxToRem,应用层只喂配置面);样式三层ui/layoutUi/menuUi(tree/split/treeNav)。 - 与路由无关:纯数据入(items/tabs/breadcrumbs)+ 事件出(
update:open/update:mobileOpen/update:modelValue/select/open/update:tabValue/update:tabs/tabClick/tabClose),路由联动留在 route/menu store。
v2 layout.mode → SAppShell mode 映射表:
| v2 layout.mode | SAppShell mode |
渲染器 |
|---|---|---|
| vertical | sidebar |
STreeMenu(单栏) |
| vertical-mix | dual-vertical |
SSplitNav(双栏) |
| horizontal | top |
STreeNav(横排) |
| top-hybrid-sidebar-first | vertical-horizontal |
SSplitNav(侧栏优先) |
| top-hybrid-header-first | horizontal-vertical |
SSplitNav(头部优先) |
| vertical-hybrid-header-first | horizontal-dual-vertical |
SSplitNav(混合) |
5.3 路由与菜单一元模型
- 页面即文件:
src/pages/**自动生成路由表(routing: { mode: 'virtual' },admin 无需生成文件;lite 分支同样使用)。 definePage({ requiresAuth: true, meta: { keepAlive, multiTab, pinned, ... } })编译期宏,零运行时开销。- 动态路由:dynamic 模式下后端菜单(menuType
menu|page)→transformMenusToAutoRoutes→router.addRoute;routeName/routePath 与页面路由表做一致性校验(启动断言,防漂移)。 - 标题:菜单
i18nKey单一来源;无菜单条目的静态页(异常页等)用definePage({ meta: { title } })兜底。此为对 v2 "meta.i18nKey 全局唯一来源"的简化统一。
5.4 请求层
// src/request/client.ts
import { createRequest } from '@soybeanjs/fetch';
import { toFlatTypedClient } from '@soybeanjs/fetch/openapi';
import type { paths } from '../../.ubean/openapi';
const request = createRequest(
{ baseURL: '/api' },
{
transform: response => response.data.data,
isBackendSuccess: response => response.data.code === import.meta.env.VITE_SERVICE_SUCCESS_CODE,
onRequest: config => {
/* 注入 Bearer token */
},
onError: error => {
/* 登出码 / 弹窗登出 / 过期刷新重放 / 错误去重 */
}
}
);
export const api = toFlatTypedClient<paths, '/api'>(request, '/api');
// 用法:const { data, error } = await api.get('/user/list', { params });- 内核为 fetch(免 axios 依赖),上传进度用
createUploadProgressAdapter,文件下载用内置downloadFile。 baseRequest承担:Bearer 注入、{ code, message, data }解包、业务码分支(登出/弹窗登出/过期刷新重放)、错误去重。全部逻辑 ≤150 行。- 服务端进程内复用:
createInternalAdapter(c)注入 adapter,internal.ts零网络直调 handler(unify/ubean-test 同款)。
5.5 鉴权流程
POST /api/auth/login(valibot 校验 + 验证码)→ 返回{ accessToken, refreshToken }→localStg存储。- 守卫首次进入:
GET /api/auth/user-info+GET /api/role/user+GET /api/menu/user→ 初始化路由/菜单/页签。 - 登出:调
POST /api/auth/logout(拉黑 refreshToken)+ 前端 resetStore(修复 unify 未调后端的问题)。 - 刷新链路:过期码 → 单飞
refreshTokenPromise→ 重放队列 → 失败则登出。
5.6 主题系统
- theme store
settings(保留 v2 全量配置项语义)→ 双路输出:①ThemeOptions(base/primary/radius/preset/overrides)→createThemeCSS 变量;②layoutProps→SAppShell(模式派生 orientation,见 §5.2)。 - 暗色:
useColorMode→SConfigProviderdark selector.dark;SSR 防闪烁脚本暂不需要(无 SSR),首帧防闪烁沿用plugins/loading.ts思路。 - 主题抽屉:
SThemeCustomizer承担外观 Tab;布局/通用/操作三个 Tab 应用层实现(配置项清单照搬 v2 theme-drawer)。
5.7 表格与 CRUD 范式
usePaginatedTable(soybean-ui 内置)+ useTableOperate(应用 composable)+ defaultTableTransform:
STable列模型(TableColumnType: 'index'|'selection'|'expand'+ sortable + virtual)替代NaiveUI.TableColumn。- v2
table-column-setting(列勾选/固定/拖拽排序)、table-header-operation用SDropdownMenu+vue-draggable-plus重写,保留为全局组件。 - 校验:
SForm+ StandardSchema(直接复用src/schema/的 valibot schema,前后端同一份校验规则)。
5.8 第三方集成页依赖
保留 v2 example 全部演示页,依赖映射:echarts、@antv/g2、@antv/g6、vchart、wangeditor、vditor、xlsx、vue-pdf-embed、print-js、jsbarcode、pinyin-pro、xgplayer、@fawmi/vue-google-maps(或国内三图 JS SDK 直连)、swiper、typeit、vtable、dhtmlx-gantt。全部经 definePage 懒加载隔离在 pages/plugin/**,不进主包体积(配合 bundle 基线回归)。
5.9 必须保留的"隐形能力"清单(回归测试用例来源)
版本更新检测、跨用户登录清页签、主题设置生产缓存 + BUILD_TIME 版本覆盖、错误消息去重、token 刷新并发去重、移动端布局备份恢复、水印定时器按需运行、页签滚轮横滚/中键关闭、isDev 路由、activeMenu/multiTab/fixedIndexInTab/href meta 语义、首屏 loading 主题色联动、登录成功 notification。
5.10 env 变量精简
VITE_APP_TITLE / VITE_APP_DESC
VITE_AUTH_ROUTE_MODE=static|dynamic VITE_ROUTE_HOME
VITE_ROUTER_HISTORY_MODE=hash|history
VITE_SERVICE_SUCCESS_CODE / VITE_SERVICE_LOGOUT_CODES / VITE_SERVICE_MODAL_LOGOUT_CODES / VITE_SERVICE_EXPIRED_TOKEN_CODES
VITE_STATIC_SUPER_ROLE
VITE_STORAGE_PREFIX
VITE_API_ENV / VITE_API_PROXY VITE_THEME_PRESET
VITE_AUTOMATICALLY_DETECT_UPDATE删除:naive 相关、mock baseURL、ICONIFY_URL(改 @ubean/icon 配置)、SOURCE_MAP(ubean build 配置承载)、PROXY_LOG(routeRules 承载)。
6. 后端详细设计(仅 main 分支)
6.1 分层
src/routes/api/** 文件式 API 路由:defineHandler(defineHandlerMeta, describeRoute, validator('json', schema), handler)
src/server.ts defineServer:全局 hooks(requestId、日志、错误映射)
src/middleware/ 01.auth.ts:Bearer → verifyToken(黑名单+用户状态)→ 权限码匹配 → checkUserHasPermission
src/services/ 纯函数/composable 业务层(每资源 *.service.ts)
src/db/ Drizzle schema(移植 unify 13 表:user/role/permission/api/menu/org/dict/dict-item + 4 关系表)+ 迁移 + seed
src/schema/ Valibot DTO(前后端源码直消费,不构建)- 统一响应:
response中间件重写c.json→{ code:'0000', message, data };错误AppError+ error 中间件同构输出(含业务码:8888 登出 / 7777 弹窗登出 / 9999 过期,支撑前端演示页)。 - OpenAPI:dev 自动挂
/_openapi.json+/_scalar,替代 v2 "手写接口文档给后端同学"的痛点。 - 数据模型约定沿用 unify:UUID v7 字符串主键、
enabled: 'Y'|'N'|'D'软删、审计四字段。
6.2 数据库与驱动
- dev:
defineDatabase默认 SQLite 文件(better-sqlite3 connector),开箱跑通 + seed 演示数据。 - prod:Postgres(postgres-js);cloudflare 适配版(D1)作为可选示例目录(参考 unify
apps/cloudflare,v3.2 再评估)。 - 风险:ubean DB 原语默认内存实现,必须显式接线 db0 connector 并在文档强调(roadmap 自述风险)。
6.3 接口清单(对齐 v2 mock + unify)
| 模块 | 端点 |
|---|---|
| auth | POST /login(pwd/captcha 双类型)、POST /register、POST /token/refresh、POST /logout、GET /user-info、POST /error(演示码)、GET /captcha |
| menu | GET /public、GET /user、POST /exist-path、CRUD + tree |
| role | CRUD + GET /user(角色码)+ 菜单/按钮权限分配 |
| user | CRUD + 状态 + 分配角色 |
| permission / api / org / dict / dict-item | CRUD(unify 8 套范式) |
6.4 鉴权方案取舍
- 首版:unify 式自研 JWT(hono/jwt + bcryptjs + 黑名单经
useCacheStore,dev 内存 / prod Redis driver)——行为完全可控,与 v2 业务码语义无缝。 - 演进:
@ubean/auth(Better Auth)作为 v3.x 可选模块评估切换(session/多 provider 能力更强),通过defineHandlerMeta({ requiresAuth })+useAuth()前端体验统一,切换成本收敛在 auth 模块。
6.5 服务端能力利用(ubean 差异化价值)
defineQueue(导出任务异步化)、defineScheduled(字典缓存刷新)、defineWebSocket/createSSEStream(通知中心演示页)、useRateLimit(登录防爆破)、useCacheStore(验证码/字典缓存)、routeRules(dev 代理、prod CDN headers)。这些作为 v3.1+ 增值演示,不进首版关键路径。
7. 架子 + 第三方 UI 样式适配(要求 7)
7.1 架构原则:架子 100% 基于 soybean-ui,适配只做"样式对齐"
v3 的架子层(layout/menu/tabs/theme store/router/store/request)全部构建在 @vean/ui + @vean/aria 之上,不存在"换 UI 库跑同一套架子"的转发层。当业务页需要引入第三方组件时(naive-ui / element-plus / ant-design-vue——无论因 soybean-ui 组件缺口,还是因 v2 迁移用户存量代码),适配器的职责是:让第三方组件适配 soybean-ui 的样式体系(颜色、圆角、字号、明暗等设计 token),保证同一页面视觉一致。
7.2 适配器在独立仓库开发,不进本仓库
- 独立仓库(建议命名
soybean-ui-adapters)承载全部适配实现,soybean-admin 只保留两个对接点:- token 输出:theme store 将生效的
@vean/theme变量(--primary/--radius/--background/--sidebar-*…,light/dark 双份)以结构化对象暴露(useThemeTokens()),并派发soybean:theme-change事件; - 挂载约定:用户在
app.vue(appRoot)按需注册适配器,如setupNaiveAdapter()。
- token 输出:theme store 将生效的
- 适配原理(按目标库主题机制选择):
- naive-ui:
ThemeSettings → GlobalThemeOverrides(common.primaryColor/borderRadius/高度字号…),经NConfigProvider注入——即 v2 反向能力(naive overrides 跟 soybean token 走); - element-plus:token →
--el-color-primary(含 light-3/5/7/8/9、dark-2 派生梯度)、--el-border-radius-base、--el-bg-color系列 CSS 变量直写; - ant-design-vue:token →
ConfigProvider :theme="{ token: { colorPrimary, borderRadius, colorBgContainer... }, algorithm: dark ? theme.darkAlgorithm : defaultAlgorithm }"。
- naive-ui:
- 派生算法对齐:primary 梯度(hover/active/disabled)统一用
@soybeanjs/colord按 soybean-ui 同一规则生成,避免三库各自派生导致色差。 - 交付形态:每库一个包(
@soybeanjs/adapter-naive等)+ 一个共享核心(token 映射表 + 订阅theme-change的 runtime),由适配器仓库独立发布、独立版本。
7.3 soybean-ui 当前缺口与对策
| 缺口(docs/roadmap P0/P1) | v3 对策 |
|---|---|
| Upload | 优先自建(@vean/aria 无该原语):文件列表 + 拖拽 + 进度,样式用 S* 拼装,上传走 @soybeanjs/fetch 的 createUploadProgressAdapter;若直接用目标库 Upload,则由 §7.2 适配器对齐样式 |
| Descriptions / TreeSelect / Transfer / Timeline / Statistic / Result / Typography / Image / Space | 应用层小组件先行(components/custom/),同步向 soybean-ui 提 issue/PR,成熟后替换 |
| 表格虚拟滚动已有(virtualizer);图表仅 4 件 | dashboard 图表继续用 echarts + @soybeanjs/chart container |
7.4 v2 naive/element/antd 版用户迁移路径
pnpm create soybean-admin@v3(全栈版)或 clonelite分支;- 业务页从
views/迁到pages/,useNaiveTable→usePaginatedTable(列模型字段映射表随迁移文档提供); - 存量第三方组件页暂不改写 → 安装对应适配器包(如
@soybeanjs/adapter-naive),第三方组件即自动跟随 soybean-ui 主题(含暗色切换与自定义主色/圆角),页面视觉一致; - 随 soybean-ui 组件覆盖度提升逐页替换为 S* 组件,最终移除适配器——一套架子渐进收敛,替代 v2 时代"每个 UI 库 fork 一个仓库"(soybean-admin-element-plus 等)的维护模式。
8. lite 分支(@ubean/vue 前端版)详细设计(要求 8)
基于 examples/client-only-spa 形态:
// vite.config.ts
import { defineConfig } from 'vite-plus';
import { ubeanVueVite } from '@ubean/vue/vite';
export default defineConfig({ plugins: [ubeanVueVite({ markdown: false, head: true })] });
// main.ts
import { createApp } from 'vue';
import { ubeanVue } from '@ubean/vue';
import routes from 'virtual:ubean-vue-routes';
createApp(App).use(ubeanVue, { routes }).mount('#app');- 保留:文件式路由 +
definePage、动态段 matcher、keep-alive、页面过渡、<Link>/。 - 移除:
src/routes/、src/server.ts、ubean.config.ts、loader/usePage 数据层、@ubean/i18n(改手工 vue-i18n 装配,与 v2 一致)、SSR 相关一切。 - 请求层:
toFlatTypedClient的paths来自用户openapi-typescript <用户后端 openapi.json>生成脚本(pnpm gen:api),文档提供 Java/Go/Python/Node 各后端的契约示例。 - 鉴权:前端流程同 main(守卫/存储/权限过滤),登录接口路径 env 可配(
VITE_API_LOGIN_PATH等),兼容非标准响应码。 - 维护约定:lite 不引入框架未提供的"伪全栈"能力;两分支差异清单固化在
docs/lite-delta.md,CI 校验 main→lite merge 只触碰 5 个差异文件。
9. 实施路线图
Phase 0 — 地基(脚手架与工具链)
- 单包工程重建:根目录平铺(
ubean.config.ts+vite.config.ts+src/),vite-plus 接管 dev/lint/fmt/test,@soybeanjs/cli(soy)接管 commit/changelog/release/cleanup - ubean 骨架跑通:
ubean.config.ts(fullstack/ssr:false/ui/icon/pinia/i18n)+pages/路由 +app.ts守卫注入 src/schema/建立;.ubean/openapi.d.tscodegen 链路 +@soybeanjs/fetchtyped client 打通- CI:typecheck + build + bundle 基线
Phase 1 — 后端内核
- Drizzle 13 表 + 迁移 + seed(unify 移植)
- auth 模块(双 token + 黑名单 + 验证码)+ 统一响应/错误/业务码
- menu/role/user/permission/api/org/dict/dict-item 8 套 CRUD + RBAC 中间件
- Scalar 文档 + 集成测试(ubean-test 38 例范式,目标 ≥40 例)
Phase 2 — 前端架子
SAppShell6 模式布局承接 + theme store/layoutProps- 菜单驱动路由/页签/标题一元模型(static + dynamic 双模式)
SAppShell内置页签全量能力(tabs/tabValue/tabClick/tabClose对接 tab store)+ keep-alive + reload + 多标签- 请求层(含 token 刷新重放)+ 登录/注册/验证码全流程
- i18n 双语 + 暗色 + 主题抽屉 + 全局搜索 + 水印 + 移动端适配
Phase 3 — 业务页面
- dashboard 首页(统计卡/图表/动态)
- manage 8 套 CRUD 页(表格范式 + 列设置 + 弹窗表单)
- function 演示页全量(含按钮级权限 v-auth + 角色分配弹窗)
- 403/404/500/iframe/about/profile/settings
Phase 4 — 插件演示与增值
- plugin 演示页(editor/excel/pdf/charts/video/map/gantt...)
- 版本更新检测、错误去重等隐形能力回归测试
- lite 分支切出与差异固化
Phase 5 — 适配对接与发布
- 与独立适配器仓库(soybean-ui-adapters)联调:
useThemeTokens()+soybean:theme-change对接约定落地,naive/element/antd 样式适配验证 - 缺口组件(Upload 等)补齐或桥接
- 文档站更新(v3 指南 + 迁移指南 + API 契约文档)+ 中英 README 重写
- beta(v3.0.0-beta.x 对齐 ubean 0.4.x 锁定版本)→ rc → stable
分支与版本计划
main v3.0.0-beta → rc → stable(全栈版)
lite 从 main Phase 2 完成后切出,跟随 main 里程碑同步
v2.x 维护分支仅收安全/严重 bug,README 置顶迁移指引10. 风险与对策
| 风险 | 等级 | 对策 |
|---|---|---|
| ubean 0.4.x API 破坏性变更(0.3→0.4 刚重构入口) | 高 | lock 精确版本;封装 src/shared/ubean-compat.ts 隔离高频 API;每升级一个 ubean minor 跑全量 e2e;v3.0 stable 前不追新 |
| ubean "声明宽于默认"(DB/queue 默认内存实现) | 高 | 首版后端只依赖已验证子集(Hono 路由/中间件/cache/db0 显式接线);生产部署文档强制 connector 配置检查 |
| soybean-ui 缺口组件(Upload/Descriptions 等 22 个 P0/P1) | 中 | §7.3 清单化;缺口组件应用层先行 + 向 ui 仓库提 PR 双向收敛 |
SAppShell API 尚在 beta(0.50.0-beta.9) |
中 | 架子 API 以 SAppShell 命名为目标设计;beta 期 API 调整通过 §5.2 一层映射隔离,应用层不直接触 props |
| vite-plus 工具链(oxlint/oxfmt)团队与社区接受度 | 中 | 保留 eslint 兼容配置导出;CI 双跑一个 Phase 后收敛 |
SAppShell 模式组合盲区(6 mode × 配置项) |
中 | Phase 2 第一周产出"模式 × 配置项"矩阵 PoC(模式名=菜单形态、orientation 派生已消除大半组合面),盲区项降级为 5 模式或 layoutProps 透传 SLayout 兜底 |
| lite/main 双分支漂移 | 中 | 差异文件清单 CI 校验;每季度 main→lite 单向同步 |
| 功能回归遗漏(隐形能力) | 中 | §5.9 清单转 e2e 用例(Playwright,ubean vitest 5 浏览器模式) |
| 与 v2 用户迁移断层 | 低 | 第三方组件样式适配器(独立仓库)+ 迁移指南 + 字段映射表(§7.4) |
11. 附录
11.1 关键参考路径
- ubean 全栈骨架:
/Users/soybean/Web/Projects/SoybeanJS/ubean/examples/ubean-test/(38 集成测试) - 纯前端 SPA 形态:
ubean/examples/client-only-spa/ - 后端范式:
/Users/soybean/Web/Projects/SoybeanJS/soybean-unify/apps/server/src/(routes/services/db/middleware) - 前端简约范式:
soybean-unify/apps/admin/src/(store 6 个、service ~80 行、layouts/base 用SAppShell) - 布局组件源码:
soybean-ui2/packages/ui/src/components/app-shell/(SAppShell6 模式;配套src/styles/app-shell.ts、test/specs/components/app-shell.spec.ts、zh/en 文档apps/docs/src/content/{zh,en}/ui/components/app-shell.md) - 主题引擎:
soybean-ui/packages/theme/src/{variables.ts,index.ts} - ubean API 速查与陷阱清单:
ubean/AGENTS.md(18 条注意事项)、ubean/skills/ubean/SKILL.md
11.2 术语
- 一元数据模型:菜单记录 = 导航条目 + 路由定义 + 页签标题来源(
App.Menu = MenuDTO + RouteKey 收窄),源自 unify。 - 样式适配(adapter):独立仓库实现,把 soybean-ui 的设计 token(颜色/圆角/明暗…)映射到 naive(themeOverrides)/ element(
--el-*变量)/ antd(ConfigProvider theme token),使第三方组件与 S* 组件同页视觉一致。 - 契约源:
src/schema/(Valibot)为 DTO/校验唯一来源;OpenAPI 生成为类型客户端来源。
--- METRICS ---
- Files Extracted: 2
- Estimated Token Budget: ~16142 tokens
- Canonical Reference: https://codewiki.google/github.com/soybeanjs/soybean-admin