更新记录
1.0.0(2026-10-27) 下载此版本
工程架构从零搭建至首个稳定形态:对标 vue-admin-template 分层思想,以 uni-app x 技术栈 + 梦曦插件系(ux-router / ux-pinia / mx-request / ux-storage / ux-utils)完整落地,Web 端全链路验证通过。
Added
- 分层骨架:
api/(领域接口)、stores/(状态)、composables/(组合式函数)、components/(easycom 组件)、router/(路由与守卫)、utils/(request / auth)、config/(全局配置源)七大域。 - 网络层封装(
utils/request.uts):基于 mx-request 的全局默认配置、Authorization: Bearer自动注入拦截器、按错误码映射文案的统一错误 toast(ERR_CANCELED静默)。 - 鉴权体系(
utils/auth.uts):token 内存缓存(同步读)+ ux-storage 持久化(异步落盘),ensureAuthReady()消除冷启动竞态。 - 全局路由守卫(
router/permission.uts):白名单 + token 检查 + getInfo 补拉(失败 resetToken 回登录页);冷启动经router.guardRoute()补跑守卫链;async 守卫 + 显式RawLocation/NavigationRedirect重定向。 - 导航兜底:启用 ux-router
InterceptorPlugin(interceptUniApi: true)——外部直调的uni.navigateTo等原生导航被拦截转交守卫链,防止绕过鉴权守卫;Web 端全链路回归通过,拦截器无误拦。 - 登录闭环:
pages/login/login.uvue登录页(redirect 回跳)、首页欢迎语与退出登录、pages.json 与路由表注册(defineUniPage宏 + vite 插件生成)。 - 领域模块:
api/user.uts(login / getInfo / logout 薄封装,DTO 强类型还原)、stores/modules/user.uts(loginAction / getInfoAction / logoutAction / resetToken)、composables/useLoading.uts(异步加载态,错误透传)。 - 组件:
components/AppLogo/AppLogo.uvue(easycom 免注册,登录页与首页消费)。 - 类型组织体系:域级
types/目录 +types.uts具名类型聚合出口(api / stores / composables 三域同构),DTO 与出口形状集中管理;归属标准写入各域文件头注释。 - ux-utils 接入:request 层错误 toast、App 端返回键提示(自绘通道 position 全生效)、退出登录前置
showModalAsync确认弹窗。 - 文档:架构说明文档(仓库单文档门面)与本更新日志。
- AI 协作规则体系(
.trae/):rules/四件套(architecture 架构红线 / core-protocol 行为协议与 DoD / workflow 文档驱动四步工作流 / project_rules 通用规范沉淀)、skills/arch-feature新功能开发技能、documents/任务文档归档(含 implementation-log 汇总索引)、uni-app-x MCP 配置;各部分职责见仓库首页架构文档第 9 节。
Changed
servers/目录解散并重构为社区流行命名:servers/http.uts→utils/request.uts(initHttp→initRequest)、servers/api/→api/、servers/index.uts装配薄层移除(main.uts 直接调用initRequest())。permission.uts/settings.uts从项目根目录归位至router/、config/。- 类型定义分批抽取:
UserStore(stores)、LoadingState(composables)、DTO(api)统一收拢至各域types/;config 的AppSettings维持就近(单文件模块私有契约,判据已注释存档)。 - 响应处理升级:api 层以
JSON.parse<T>官方路径还原 DTO,store 与页面不再接触裸UTSJSONObject下标。 - toast 调用从
uni.showToast迁移至 ux-utilsshowToast(参数同构,迁移零成本)。 - 页面路由元信息补齐:
pages/index/index.uvue补defineUniPage({ name, title })编译宏(此前仅 login 页声明),路由 meta.title 由插件同步生成。
Removed
servers/目录(http.uts / api/user.uts / index.uts)——职责拆入utils/request.uts与api/。- 根目录
permission.uts、settings.uts(迁移至 router/、utils/ 后又随 config 层落地至config/index.uts)。 - store / composable 模块内的内联类型定义(迁移至各域
types/)。
Verified
- Web 端(HBuilderX 5.26 / VDOM / vapor)全链路验证:冷启动守卫重定向、登录 → 首页、带 token 冷启动、登出确认弹窗(取消 / 确定双路径)、DTO 解析、easycom 组件渲染、错误 toast;mock 服务端日志确认拦截器注入与请求协议正确。
Known Issues
redirectquery 在 Web 端存在双重编码(%252F)现象,round-trip 正常;深链场景需在 Android 端实测确认。- 控制台
NavigationFailure(relaunch 后的确认日志)为 ux-router Web 端已知行为,跳转结果正确。 - Android(Kotlin)端代码同构,待真机回归。
平台兼容性
uni-app x(3.8.6)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| √ | √ | √ | √ |
unix-architecture
uni-app x 工程架构模板,api / stores / router / utils / pages 全分层落地,底层由梦曦工作室自研插件系(unix- / mx-)承载。 技术栈:uni-app x(HBuilderX 5.26,VDOM 模式,vapor: true)· UTS 语言 · Vue3 组合式 API。
1. 项目定位
uni-app x 的页面是编译期静态模型(多端编译到 JS / Kotlin / Swift),无法直接套用标准 Vue3 的「单路由表、单插件协议」形态。本项目验证的目标是:在 uni-app x 的底座约束下,构建一套完整自洽的工程化分层——api / store / router / utils / pages 各司其职、类型契约清晰、装配点唯一。
分层与插件承载关系(各层职责单一、依赖单向):
| 分层 | 位置 | 承载插件 |
|---|---|---|
| 网络层(全局配置 + 双拦截器) | utils/request.uts |
mx-request |
| 接口层(领域函数 + DTO 还原) | api/*.uts |
mx-request |
| 凭证读写(token 同步读体验) | utils/auth.uts |
ux-storage |
| 状态层(业务状态与动作) | stores/modules/*.uts |
ux-pinia |
| 路由层(命名路由 + 守卫链) | router/index.uts |
ux-router |
| 全局守卫(鉴权重定向) | router/permission.uts |
ux-router guard |
| 配置层(全局唯一配置源) | config/index.uts |
— |
| 视图层(静态注册页面) | pages/ |
uni-app x 约定 |
- uni-app x 无全局 layout 机制,页面结构由各页面自持。
- setup 式 store 中
computed即 getter,无独立 getters 层。
2. 目录结构
├── main.uts # 唯一装配点:app.use(router) + initRequest() + setupPermission()
├── App.uvue # 应用生命周期(App 端返回键拦截等)
├── pages.json / manifest.json
│
├── api/ # 接口层:薄封装(请求转发 + 路径收敛 + DTO 还原),不写业务逻辑
│ ├── user.uts
│ ├── types.uts # 域类型聚合出口(具名类型转发)
│ └── types/
│ └── api.uts # DTO 唯一事实源(LoginResult / UserInfo)
│
├── stores/ # 状态层:ux-pinia 免挂载,模块级注册表即全局单例
│ ├── index.uts # useXxxStore 出口
│ ├── types.uts # 域类型聚合出口
│ ├── types/
│ │ └── user.uts # UserStore 定义
│ └── modules/
│ └── user.uts # token/name/avatar + login/getInfo/logout/resetToken
│
├── composables/ # 组合式函数:函数无出口(按需直接导入),类型走聚合出口
│ ├── useLoading.uts
│ ├── types.uts
│ └── types/
│ └── useLoading.uts # LoadingState 定义
│
├── components/ # easycom 约定目录(components/<Name>/<Name>.uvue,免注册使用)
│ └── AppLogo/AppLogo.uvue
│
├── router/ # 路由层
│ ├── index.uts # createRouter(routes 由 vite 插件生成)
│ ├── permission.uts # 全局守卫:白名单 + token 检查 + getInfo + 重定向
│ └── routes.gen.uts # ⚠ 由 @meng-xi/unix-router/vite-plugin 自动生成,勿手改
│
├── utils/ # 工具层
│ ├── request.uts # mx-request 封装:configureRequest + 双拦截器(token 注入/错误 toast)
│ └── auth.uts # token 读写:内存缓存(同步读)+ ux-storage 持久化(异步落盘)
│
├── config/
│ └── index.uts # 全局唯一配置源(appName / baseURL / timeout)
│
├── pages/ # 页面(uni-app x 约定,pages.json 静态注册)
│ ├── index/index.uvue
│ └── login/login.uvue
│
├── types/ # 插件生成的 d.ts(defineUniPage / RouteNameMap),业务类型不放这里
├── .trae/ # AI 辅助开发体系(rules / skills / documents / mcp.json,见第 9 节)
├── static/ uni_modules/ uni.scss
3. 核心调用链
页面(.uvue)
→ composables/useXxx(横切 UI 状态)
→ stores/modules/*(业务状态与动作)
→ api/<domain>(DTO 还原:JSON.parse<T>(JSON.stringify(res.data)))
→ utils/request(拦截器:token 注入 + 统一错误 toast)
→ mx-request → uni.request
- 页面不直连网络层,不接触裸 JSON;store 不引用组件。
- 鉴权数据流:登录 →
setToken(内存即时生效 + ux-storage 异步落盘)→ 请求拦截器注入Authorization: Bearer→ 冷启动由ensureAuthReady()先行恢复内存缓存。
启动装配(main.uts,唯一装配点)
app.use(router) // ux-router:provide + 全局 mixin(onShow syncRoute)
initRequest() // mx-request:默认实例配置 + 双拦截器(幂等)
setupPermission() // 注册 beforeEach + 冷启动 guardRoute() 补跑守卫链
三种装配范式并存是 uni-app x 的底座约束:ux-router 实现 Vue install 协议;ux-pinia 免挂载(原生端 app.use 不可靠,P8 实测);mx-request 为纯函数库(全局默认实例)。
鉴权守卫(router/permission.uts)
await ensureAuthReady() // 异步守卫(ux-router 守卫链支持 await Promise)
├─ 有 token
│ ├─ 访问登录页 → 重定向首页
│ ├─ 已有用户信息 → 放行
│ └─ 无用户信息 → await getInfoAction
│ ├─ 成功 → 放行
│ └─ 失败 → resetToken + 重定向登录页(带 redirect)
└─ 无 token
├─ 白名单(登录页)→ 放行
└─ 其余 → 重定向登录页(query 带 redirect=path)
冷启动(H5 直达 / deeplink)页面已加载而守卫未执行:router.isReady().then(() => router.guardRoute()) 补跑守卫链,redirect 按 relaunch 执行。重定向指令用导出的 RawLocation / NavigationRedirect 显式类型构造(规避 UTSJSONObject 在 Kotlin 名义类型下的 cast 风险)。
4. 类型组织标准
判据:类型跟着消费关系走。
| 类型性质 | 位置 | 实例 |
|---|---|---|
| 跨层共享(api → store → 页面/守卫) | <域>/types/ + <域>/types.uts 聚合出口 |
LoginResult / UserInfo |
| 多文件域的出口形状 | 同上 | UserStore / LoadingState |
| 单文件模块私有契约 | 就近定义 | AppSettings(config 头注释已记录判据) |
| 第三方库类型 | import type 导入,绝不复制 |
RequestConfig / ResponseResult / Ref |
- 聚合出口一律具名类型转发(
export type { X } from),不用 star re-export(Kotlin 端未实证)。 - 消费方统一从
<域>/types.uts导入,新增类型文件时在出口追加一行转发。 - api 层负责 DTO 还原,且逐调用点内联
JSON.parse<T>(...)(具体类型)——勿提取公共泛型包装,二次泛型传递在 Kotlin 端触发泛型擦除。
5. 各域细则
- api/:薄封装;响应以
UTSJSONObject承载、在 api 层还原为 DTO 后上抛;JSON.parse<T>解析失败(返回 null)即 throw 快速失败。 - stores/:setup 式
defineStore<T>(id, setup),state 用Ref、action 用箭头函数、返回值as T收尾;免挂载,无需聚合实例(stores/index.uts仅作消费入口)。 - composables/:函数从
<name>.uts直接导入;类型经types.uts;UTS 类型属性方法不支持泛型(uts110111161)——run仅收() => Promise<void>任务,带返回值需求扩展useTask<T>而非给函数加泛型。 - components/:easycom 免注册;组件内只管自身样式,页面间距经外层 view 控制(规避样式隔离对组件根节点的约束)。
- router/:
routes.gen.uts与页面级defineUniPage宏由插件维护,人手不碰(preserveRouteChanges 会保留手工追加字段)。
6. 关键机制
| 机制 | 实现 | 原因 |
|---|---|---|
| token 同步读写体验 | ux-storage 异步持久化 + 模块级内存缓存 | js-cookie 是同步的,ux-storage 是异步的 |
| 冷启动无竞态 | 守卫内首行 await ensureAuthReady()(Promise 复用,只读一次持久层) |
持久层恢复是异步的,守卫是同步心智 |
| 统一错误提示 | 响应拦截器按错误码映射文案,ERR_CANCELED 静默,返回 null 放行 |
错误仍 reject 给调用方做业务处理,提示只打一次 |
| 退出登录确认 | showModalAsync(ux-utils,confirm/cancel 恒存在互斥) |
破坏性操作标准语义 |
| toast/modal 全端一致 | ux-utils(App 端 UTS 直挂系统窗口自绘 / Web DOM 自绘 / 小程序原生降级) | uni 原生 position/icon 各端差异大 |
7. 跨端注意事项(截至 1.0.0)
- Web 端已全量验证:冷启动守卫、登录闭环、DTO 链路、easycom、自绘 modal/toast。
- Android(Kotlin)同构代码待真机回归,已知风险点均已规避:泛型二次传递(DTO 内联还原)、
export { x } from值转发(仅用export type)、UTSJSONObject cast(守卫重定向用导出类型构造)、app.use(pinia)(免挂载)。 redirectquery 在 Web 端存在双重编码(%252F)现象,round-trip 正常;深链场景上 Android 前建议实测。- 控制台的
NavigationFailure(relaunch 后的确认日志)为 ux-router Web 端已知行为,跳转结果正确。
8. 运行与验证
# 运行到 Web(HBuilderX CLI)
D:\HBuilderX\cli.exe launch web --project <项目绝对路径>
# 运行日志
D:\HBuilderX\cli.exe logcat web --project <项目绝对路径> --mode lastBuild
- 后端地址:
config/index.uts→settings.baseURL(接真实后端替换一处即可)。 - 本地联调可用任意 mock 服务(协议:
POST /user/login → {token},GET /user/info → {name, avatar},POST /user/logout),注意 CORS(Authorization头需放行)。 - 页面路由由 vite 插件从
pages/目录生成,新增页面 = 建文件 +pages.json注册 + 页内defineUniPage({ name, title })。
9. AI 辅助开发体系(.trae/)
本仓库将「AI 助手如何在此架构下工作」沉淀为可执行的规则与技能,与代码同库存放、随仓库演进。各部分职责如下:
| 内容 | 路径 | 职责 |
|---|---|---|
| 架构开发规则 | .trae/rules/architecture.md |
架构规范的机器强制约束层:分层调用链与禁令、插件清单(导入路径唯一事实源)、标准落码顺序、类型组织判据、UTS 红线、装配点唯一、验证 DoD;与本规则冲突的写法一律视为错误实现 |
| AI 行为协议 | .trae/rules/core-protocol.md |
协作协议:辩证执行、HBuilderX CLI 禁止幻觉构造、三种工作模式(交互 / 无人值守 / 谋定而后动)、DoD 检查清单、经验教训记录 |
| 文档驱动工作流 | .trae/rules/workflow.md |
功能实现的强制推进流程:建立任务文档 → 等待并读取回答 → 实现与验证 → 实施记录回填;疑问与方案全部落盘跨会话持久,对话只做通知与执行 |
| 通用规范沉淀 | .trae/rules/project_rules.md |
uni-app x / UTS / uvue / ucss 通用约束摘录(条件编译、名义类型系统、UTS 编译器限制明细、样式规则),供生成代码时对齐官方口径 |
| 新功能开发技能 | .trae/skills/arch-feature/SKILL.md |
按固定流程落码:需求确认 → DTO 类型 → api 薄封装 → store 模块 → 页面/组件 → 装配点检查 → 验证闭环;全程强制遵循 rules 体系 |
| 任务文档归档 | .trae/documents/ |
按「需求类型 / 日期」两级目录归档任务文档(需求分析、伪代码设计、疑问清单、实施记录);implementation-log.md 为全项目任务汇总索引 |
| MCP 配置 | .trae/mcp.json |
uni-app-x MCP 服务器(@dcloudio/uni-app-x-mcp),供 AI 查询项目插件与 API 平台兼容性 |
约束关系:本文档承载「架构为什么这样设计」的原理层描述,
.trae/rules/architecture.md承载「AI 必须怎么写」的强制层约束——二者同源、同步演进,修改任一侧需检查另一侧是否需要联动。

收藏人数:
https://github.com/MengXi-Studio/unix-architecture
下载插件并导入HBuilder
下载插件ZIP
赞赏(0)
下载 80
赞赏 0
下载 12719716
赞赏 1958
赞赏
京公网安备:11010802035340号