更新记录

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-utils showToast(参数同构,迁移零成本)。
  • 页面路由元信息补齐: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

  • redirect query 在 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)(免挂载)。
  • redirect query 在 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 必须怎么写」的强制层约束——二者同源、同步演进,修改任一侧需检查另一侧是否需要联动。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。