本地 RAG 知识库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
18 KiB

​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. ---
  2. title: 项目技术栈与开发规范
  3. created: '2026-06-03'
  4. tags:
  5. - guide
  6. - config
  7. - work
  8. - standard
  9. summary: 本文定义项目技术栈选型、z-index层级规范及响应式布局要求
  10. cover: /assets/default-cover.jpg
  11. updated: '2026-08-15'
  12. ---
  13. ## 技术栈规范
  14. | 类别 | 技术选型 | 说明 |
  15. | ---------- | ----------------------------- | ---------------------------------------------------------------------- |
  16. | 前端框架 | Vue 3 + JavaScript | 不使用 TypeScript |
  17. | 构建工具 | Vite + pnpm | 包管理统一使用 pnpm |
  18. | UI 框架 | tdesign-vue-next | 严格使用 TDesign 组件,尽可能少使用原始 HTML 标签 |
  19. | 图标库 | tdesign-icons-vue-next | 所有 icon 统一使用 tdesign-icons-vue-next |
  20. | 状态管理 | Pinia | 全局状态集中管理 |
  21. | 代码规范 | eslint + @antfu/eslint-config | 统一代码风格 |
  22. | 工具库 | xe-utils | 对象、函数、数组、数字、字符串、URL、Web、计算、判空、数据处理统一使用 |
  23. | 日期处理 | dayjs | 所有日期相关操作统一使用 |
  24. | Hooks 工具 | vue-hooks-plus | 复用 Vue 组合式交互逻辑、异步状态、DOM 事件、虚拟列表等 hooks |
  25. ## 层级规范
  26. | 层级 | 语义 | 使用场景 |
  27. | ---: | -------------- | ------------------------------------------ |
  28. | 0 | base | 普通页面内容 |
  29. | 10 | raised | 卡片 hover、轻微浮起元素 |
  30. | 100 | sticky | sticky 表头、吸顶筛选栏 |
  31. | 200 | local-floating | 页面局部浮动按钮、局部工具栏 |
  32. | 300 | fixed-nav | 顶部导航、移动端底部导航 |
  33. | 400 | dropdown | Dropdown、Select、DatePicker、AutoComplete |
  34. | 500 | popover | Popup、Tooltip、Popconfirm |
  35. | 800 | overlay-local | 页面局部遮罩、局部 loading |
  36. | 1000 | overlay | 全局遮罩 |
  37. | 1100 | drawer | Drawer、侧边抽屉 |
  38. | 1200 | modal | Dialog |
  39. | 1300 | modal-floating | Dialog 内部 Dropdown、Popup、Tooltip |
  40. | 1400 | toast | Message、Notification |
  41. | 1500 | global-loading | 全屏 Loading、页面阻断加载 |
  42. | 2000 | onboarding | 新手引导、产品引导遮罩 |
  43. | 3000 | system | 系统级弹窗、强制升级、维护提示 |
  44. | 9000 | emergency | 特殊兜底层,必须注释说明 |
  45. | 9999 | max | 最高优先级,仅限极特殊场景 |
  46. - 层级统一通过项目维护的 CSS 变量管理,如 `--z-dropdown: 400`、`--z-drawer: 1100`、`--z-dialog: 1200`、`--z-message: 1400`、`--z-loading: 1500`。
  47. - TDesign 弹层组件(Dropdown、Popup、Dialog、Drawer、Message、Notification、Loading)通过主题变量或包裹层对齐上述层级,避免与项目 z-index 体系冲突。
  48. - 0 ~ 500 为常规内容层级,1000 以上为弹层体系;不随意使用最高档位 `--z-max`。
  49. ## Scroll 滚动规范
  50. | 类别 | 规范 | 说明 |
  51. | ------------ | ----------------------------- | ----------------------------------------------------------------- |
  52. | 滚动容器 | 单一主滚动区域 | 应用层只允许一个主滚动容器,禁止 body、main、组件多层嵌套滚动 |
  53. | 页面滚动 | Router 统一管理 | 禁止组件内部直接调用 window.scrollTo,统一通过路由滚动策略处理 |
  54. | 滚动恢复 | 支持页面级 scroll restoration | 列表页返回时恢复原滚动位置,普通页面进入默认滚动到顶部 |
  55. | 滚动区域 | 明确 scroll-root | Layout 层定义主滚动容器,业务组件不得随意创建页面滚动区域 |
  56. | 局部滚动 | scroll-section | 大列表、日志、代码区域等允许局部滚动,但必须明确高度和边界 |
  57. | 弹窗滚动 | Dialog / Drawer 独立滚动 | 弹窗内部内容滚动,不影响 body 滚动状态 |
  58. | Body 锁定 | Overlay 打开时禁止背景滚动 | Dialog、Drawer、全屏遮罩打开时锁定 body,关闭后恢复 |
  59. | Sticky | 必须绑定正确滚动容器 | sticky 元素必须位于对应 scroll container 内,避免定位失效 |
  60. | 表格滚动 | TDesign Table 统一处理 | 表格内部横向滚动,禁止页面整体横向滚动 |
  61. | 表格固定 | 使用组件能力 | TDesign Table 固定表头、固定列必须使用组件配置,不手写定位实现 |
  62. | 大数据列表 | 必须虚拟滚动 | 超过指定数据量的大列表必须使用虚拟列表优化性能 |
  63. | 滚动事件 | Hook 统一封装 | 禁止页面散落 addEventListener,统一通过 useScroll 等 hooks 管理 |
  64. | 滚动监听 | 必须节流优化 | scroll 事件必须使用 throttle / requestAnimationFrame 降低性能消耗 |
  65. | 滚动动画 | 局部启用 smooth | 仅允许锚点跳转、返回顶部使用 smooth,禁止全局开启 |
  66. | 减少动画 | 支持 prefers-reduced-motion | 用户开启减少动画模式时关闭滚动动画效果 |
  67. | 锚点定位 | 统一 scrollToAnchor | 禁止业务组件直接调用 scrollIntoView,统一封装滚动方法 |
  68. | Sticky 偏移 | 使用 scroll-margin-top | 页面存在固定导航时,锚点定位必须考虑顶部遮挡问题 |
  69. | 返回顶部 | local-floating 层级 | 返回顶部按钮使用 local-floating 层级(200),超过滚动阈值后显示,优先使用 TDesign BackTop 组件 |
  70. | 横向滚动 | 禁止页面级横向滚动 | 页面禁止 overflow-x 滚动,特殊区域必须局部控制 |
  71. | 移动端滚动 | 适配 Touch 滚动 | 支持 iOS / Android 惯性滚动,避免滚动卡顿 |
  72. | 滚动高度稳定 | 避免 CLS | Skeleton、图片、异步内容必须保持高度稳定,避免滚动位置跳动 |
  73. | 数据刷新 | 保留滚动上下文 | 刷新数据时保持当前滚动位置,不因重新渲染导致页面跳顶部 |
  74. | 请求失败 | 保持用户上下文 | 请求失败进入错误态时保持当前滚动位置和已有数据 |
  75. | 图片加载 | 预留尺寸 | 图片必须设置宽高或 aspect-ratio,避免加载造成页面跳动 |
  76. | 虚拟列表 | 统一封装 | 虚拟滚动能力通过 hooks / 组件提供,禁止业务重复实现 |
  77. | 滚动状态 | 禁止随意持久化 | 不允许直接 localStorage 保存 scrollTop,统一由滚动管理器维护 |
  78. | 滚动性能 | 监控长任务 | 大量滚动计算必须避免阻塞主线程,必要时接入 Performance 监控 |
  79. | 无障碍 | 支持键盘滚动 | 页面滚动区域必须保持键盘访问能力和 focus 可见性 |
  80. | 滚动恢复清理 | 路由离开自动处理 | 页面卸载时清理滚动监听、缓存状态、事件绑定 |
  81. ## 布局
  82. 固定视口应用壳 + 圣杯布局 + 局部滚动
  83. ┌──────────────── 固定顶部导航 ────────────────┐
  84. │ 平台切换、全局操作、应用状态 │
  85. ├──────────────┬──────────────────┬────────────┤
  86. │ 左侧栏 │ 主内容区 │ 右侧栏 │
  87. │ │ │ │
  88. │ 配置列表 │ 配置编辑区 │ 环境检测 │
  89. │ 平台导航 │ 独立局部滚动 │ 生成结果 │
  90. │ 快捷操作 │ │ 状态信息 │
  91. │ │ │ │
  92. ├──────────────┴──────────────────┴────────────┤
  93. │ 固定状态栏 │
  94. └─────────────────────────────────────────────┘
  95. ## 响应式要求
  96. - 支持移动端。
  97. - 支持平板端。
  98. - 页面必须使用响应式布局。
  99. ## API 层标准化
  100. | 类别 | 规范 | 说明 |
  101. | ------------ | ---------------------- | ---------------------------------------- |
  102. | 请求封装 | Axios 二次封装 | 统一 baseURL、timeout、headers、错误处理 |
  103. | API 结构 | 按模块拆分 | `api/modules/*.api.js`,禁止写在组件内 |
  104. | 请求拦截 | Token + Error 统一处理 | 自动注入 token、统一处理 401/500 |
  105. | 响应结构 | 标准化返回 | `{ code, data, message }` 统一格式 |
  106. | 错误处理 | 全局错误中心 | Message + 日志 + 可选上报 |
  107. | 取消请求 | AbortController | 页面切换自动取消未完成请求 |
  108. | 并发控制 | 防重复请求 | 相同 key 请求去重 |
  109. | Loading 管理 | 请求级 + 页面级 | 避免手动控制 loading 状态 |
  110. ---
  111. ## Skeleton / Loading 规范
  112. | 场景 | 优先方案 | 说明 |
  113. | ---------- | ---------------------------- | ------------------------------------------------ |
  114. | 首屏加载 | 页面骨架屏 | 模拟真实页面结构,避免白屏和布局跳动 |
  115. | 模块加载 | 局部骨架屏 | 卡片、列表、表格、详情区按实际内容占位 |
  116. | 数据刷新 | 保留旧数据 + 局部 Loading | 不清空页面,避免用户失去上下文 |
  117. | 表单提交 | 按钮 Loading + 禁用提交按钮 | 防重复提交,提交中保留表单内容 |
  118. | 表格加载 | TDesign Table loading / 表格骨架 | 表头固定,行高稳定,禁止整页遮罩替代表格加载 |
  119. | 路由切换 | 页面级 Loading | 只在跨页面等待明显时使用,优先展示目标页骨架 |
  120. | 阻断型任务 | 全局 Loading | 仅限鉴权初始化、应用启动、强制等待等不可交互场景 |
  121. - 骨架屏必须贴近真实布局:标题、头像、卡片、表格行、按钮区域要按最终尺寸占位,禁止使用一整块灰色矩形糊弄。
  122. - 骨架屏风格必须匹配 TDesign 设计语言:圆角、柔和底色、轻微点状或软边框质感;禁止使用生硬的默认灰阶风格。
  123. - 骨架元素必须有稳定宽高、`min-height` 或固定行高,加载完成前后不能造成明显 CLS。
  124. - 首次进入页面优先使用骨架屏;只有小面积异步操作、按钮提交、短时请求才使用 spinner / loading icon。
  125. - 局部 Loading 使用层级 `--z-overlay-local: 800`;全屏 Loading 使用 `--z-global-loading: 1500`,不得随意使用最高档位。
  126. - 加载超过 3 秒必须展示明确状态文案;超过 8 秒必须提供重试、取消或返回入口。
  127. - 请求失败后必须进入错误态,数据为空必须进入空态,不能让 loading 无限停留。
  128. - 页面级异步状态应由 composable、Pinia 或 API SDK 统一管理;禁止在多个组件里散落重复的 `isLoading` 和手写请求状态。
  129. - 对刷新类请求,应优先保留已有数据并展示局部刷新状态;只有首次无数据时才用完整骨架屏。
  130. - 动效必须克制,遵守 `prefers-reduced-motion`;骨架 shimmer 不得过亮、过快或大面积闪烁。
  131. - Loading 文案使用业务语义,如“正在生成配置”“正在同步状态”;禁止只有“Loading...”且无上下文。
  132. ## 测试体系规范
  133. | 类别 | 工具 | 说明 |
  134. | --------- | -------------------------- | ---------------------------------- |
  135. | 单元测试 | Vitest | 逻辑函数、工具库必须覆盖 |
  136. | 组件测试 | Vue Test Utils | 关键 UI 组件行为测试 |
  137. | E2E 测试 | Playwright | 核心业务流程(登录/下单/操作链路) |
  138. | Mock 数据 | MSW / Vitest mock | API 层隔离测试 |
  139. | 覆盖率 | Vitest coverage | 核心模块 ≥ 80% |
  140. | 测试范围 | 分级测试 | utils > service > component > flow |
  141. | CI 集成 | GitHub Actions / GitLab CI | 每次 PR 必跑测试 |
  142. | 回归策略 | 关键路径回归 | 核心业务必须 e2e 覆盖 |
  143. ---
  144. ## 规范约束体系
  145. | 类别 | 规范 | 说明 |
  146. | ----------- | ----------------------------- | ---------------------------- |
  147. | 代码风格 | eslint + @antfu/eslint-config | 全项目统一风格 |
  148. | 组件规范 | 三层结构 | Base / Layout / Business |
  149. | 命名规范 | 语义化命名 | 禁止 a/b/c、data1 这种变量 |
  150. | 引用规范 | 禁止跨 feature 引用 | feature 之间不能直接依赖 |
  151. | import 顺序 | 规范化排序 | 外部库 → 内部模块 → 相对路径 |
  152. | 目录约束 | feature-first | 按业务模块组织代码 |
  153. | JSDoc | JS 类型补强 | 无 TS 场景必须写 JSDoc |
  154. ---
  155. ## 性能 & 监控兜底
  156. | 类别 | 方案 | 说明 |
  157. | -------- | -------------------- | ---------------------------- |
  158. | 路由优化 | Vue Router lazy load | 页面级懒加载 |
  159. | 代码拆分 | Vite manualChunks | vendor / core / feature 分包 |
  160. | 静态资源 | 图片懒加载 | IntersectionObserver |
  161. | 列表优化 | 虚拟列表 | 大数据列表必须使用 |
  162. | 缓存策略 | HTTP + localStorage | 关键数据缓存 |
  163. | 错误监控 | Sentry / 自建日志 | JS 错误 + API 错误上报 |
  164. | 性能监控 | Web Vitals | LCP / FID / CLS 监控 |
  165. | 请求监控 | API 耗时统计 | slow request 记录 |
  166. | 白屏兜底 | loading + fallback | 首屏异常兜底页面 |
  167. | 全局异常 | errorHandler | Vue + Promise 统一捕获 |
  168. | 资源压缩 | gzip / brotli | Vite compression 插件 |
  169. | 降级策略 | feature flag | 异常时关闭非核心功能 |
  170. ---
  171. ## 目录结构规范(Feature First)
  172. | 层级 | 目录 | 说明 |
  173. | ------ | ---------------- | ------------------------------------------- |
  174. | 核心层 | `src/core` | 项目级能力(request、router、store 初始化) |
  175. | 通用层 | `src/shared` | 纯工具 / 通用组件 / hooks |
  176. | 业务层 | `src/features` | 按业务模块拆分(核心规范) |
  177. | UI层 | `src/components` | 全局通用组件 |
  178. | 布局层 | `src/layouts` | 页面布局结构 |
  179. | 页面层 | `src/pages` | 路由入口页面 |
  180. | API层 | `src/api` | API SDK(模块化) |
  181. | 状态层 | `src/stores` | Pinia store |
  182. | 资源层 | `src/assets` | 图片 / 样式 / 字体 |
  183. | 配置层 | `src/config` | 环境配置、常量 |
  184. ---
  185. ## ENV 文件规范
  186. | 类别 | 规范 | 说明 |
  187. | -------- | ------------------- | ---------------------------------------------------------- |
  188. | 环境文件 | `.env` 分层管理 | `.env / .env.development / .env.staging / .env.production` |
  189. | 变量前缀 | `VITE_` 必须前缀 | Vite 仅暴露 `VITE_` 开头变量 |
  190. | 命名规范 | 大写 + 下划线 | 如 `VITE_API_BASE_URL` |
  191. | 使用方式 | 统一 env 封装访问 | 禁止直接使用 `import.meta.env` |
  192. | 环境区分 | mode 控制 | `vite --mode staging` |
  193. | mock控制 | env 控制 mock 开关 | `VITE_MOCK=true/false` |
  194. | API绑定 | baseURL 由 env 控制 | 不允许写死 API 地址 |
  195. | 类别 | 规范 | 说明 |
  196. | ------ | -------------------- | ------------------- |
  197. | API层 | request 统一读取 env | baseURL 从 env 注入 |
  198. | 配置层 | `src/config/env.js` | 统一封装 env 读取 |
  199. | 业务层 | 禁止直接读取 env | 必须通过 config 层 |