web-map/AGENTS.md

8.7 KiB
Raw Blame History

Repository Guidelines

本仓库为基于 Vite + Vue 3 + TypeScript 的前端项目,依赖 Ant Design Vue、Pinia、Axios 等。统一使用 UTF-8 编码。

项目结构与模块组织

  • 源码:src/components/pages/services/apis/stores/hooks/assets/
  • 静态资源:public/
  • 接口模拟:mocks/(本地联调示例数据)
  • 文档:docs/
  • 配置:vite.config.tstsconfig*.jsoneslint.config.js

构建、测试与本地运行

  • 本地开发:pnpm startnpm run start(启动 Vite 开发服务器)
  • 生产构建:pnpm buildnpm run build(先 TypeCheck 再打包)
  • 本地预览:pnpm previewnpm run preview
  • 代码检查:npx eslint . --ext .ts,.vue
  • 样式检查:npx stylelint "src/**/*.{vue,scss,css}"
  • 格式化:npx prettier -w .

代码风格与命名约定

  • TypeScript + Vue SFC缩进 2 空格;单引号;必须分号;max-len 120。
  • 组件命名采用帕斯卡命名(例:RobotLabels.vue);忽略名:index.vueexception.vue
  • 导入排序使用 eslint-plugin-simple-import-sort
  • 样式使用 SCSSstylelint 推荐与 Recess Order。

测试规范

当前未集成单测框架。建议后续采用 Vitest + Vue Test Utils测试文件命名 *.spec.ts,位置 src/**/__tests__/ 或与源码同级。

提交与合并请求

  • 提交遵循 Conventional Commitsfeat|fix|refactor(scope?): 简要中文描述
    • 示例:feat(editor): 新增导入场景模态框
  • PR 需包含:变更说明、影响范围、操作步骤/截图UI 变更)、关联 Issue、风险与回滚方案。
  • 在提交前确保:通过构建与 ESLint/Stylelint/Prettier 检查。

安全与配置提示

  • 后端地址与令牌从环境变量读取:ENV_HTTP_BASEENV_DEV_TOKENENV_DEV_TENANT_ID(见 src/services/http.ts)。请在 .env.development/.env.production 配置。
  • 避免将敏感信息写入仓库;调试日志仅限开发环境。

-Always reply to me in Chinese 文件编码使用 UTF8


web-amr 项目 AI 编程指导Vue 3 + Vite + TS + Ant Design Vue + Pinia

本指南用于约束 AI 在本项目中新增功能/修复 Bug 的方式,目标是:代码优雅、可维护、可读、符合主流 Vue 生态实践,并与仓库现有风格一致。


1. 总体原则

  1. 先理解再动手

    • 先搜索仓库已有实现(同类页面/组件/Store/接口封装),优先复用现成模式。
    • 不引入新范式/新库,除非明确要求;避免“为了重构而重构”。
  2. 最小必要改动Minimal Diff

    • 只改与需求直接相关的文件和逻辑。
    • 不随意改命名、格式、结构;不顺手修“无关的”问题。
  3. 分层清晰、职责单一

    • UI 逻辑、业务逻辑、数据访问、状态管理分离。
    • 一个文件/组件只负责一类事情。
  4. 可读性优先于“聪明”

    • 选择易懂的实现而非炫技。
    • 复杂逻辑拆分为可测试的小函数/Hook/Store action。

2. 项目结构与放置规范

  • 页面:src/pages/**
    • 每个页面一个文件夹,包含 index.vue、子组件、局部 hooks、局部类型。
  • 组件:src/components/**
    • 复用组件放这里;页面私有组件放页面目录内。
  • 状态:src/stores/**Pinia
    • 全局/跨页面状态必须放 Store。
  • 接口:
    • src/apis/**:接口定义、类型、路径、参数;
    • src/services/**Axios 实例、拦截器、通用请求工具。
  • Hookssrc/hooks/**
    • 复用的组合式逻辑;页面私有 hooks 放页面目录。
  • 静态资源:src/assets/**public/**

放置判定:
跨页面复用 → components/stores/hooks/apis;仅当前页面使用 → 页面目录内。


3. Vue 组件设计(主流实践)

  1. Composition API + <script setup lang="ts">

    • 使用 ref/reactive/computed/watch 等组合式 API。
    • 逻辑块按:props -> emits -> state -> computed -> watchers -> methods -> lifecycle 顺序组织。
  2. 组件拆分规则

    • 当组件出现以下任一情况必须拆分:
      • 文件 > 200 行且含多个业务区域;
      • 同一文件里出现多个“独立区域”的 UI/逻辑;
      • 有可复用的表单、表格、弹窗、卡片、列表项等。
    • 拆分后:父组件负责数据/状态/事件串联,子组件负责局部展示与交互
  3. Props/Emits 约束

    • Props 必须有 TS 类型且语义清晰;不要透传大对象导致耦合。
    • 子组件通过 emit 通知父组件,不直接改父组件状态。
  4. 避免反模式

    • 不在模板中写复杂表达式(>1 行逻辑移到 computed
    • 不在组件内手动维护“全局状态影子副本”。
    • 不把 API 请求散落在多个子组件中。

4. 状态管理Pinia

  1. 什么时候用 Store

    • 跨组件/跨页面共享;
    • 需要缓存/持久化;
    • 逻辑复杂、含多处读写;
    • 与权限、用户、全局配置、设备/机器人状态相关。
  2. Store 设计

    • state:只放数据,不放派生值。
    • getters:派生/只读视图。
    • actions:异步与业务逻辑(含 API 调用、数据归一化)。
    • 禁止在组件里复制一份全局状态再手动同步。
  3. 调用方式

    • 页面进入时 store.actionFetch() 拉取,组件只消费 store。
    • 需要局部临时状态(表单草稿、展开折叠)放组件内。

5. 接口与数据层

  1. 接口位置

    • 接口定义放 src/apis/**,按领域/模块拆文件。
    • 组件/页面不直接写 URL 字符串或 Axios 逻辑。
  2. 类型先行

    • 所有请求/响应必须有 TS 类型;
    • 类型从后端字段映射后再进入 UI必要时做 transform)。
  3. 错误与边界处理

    • 接口失败要有可预期的 UI 反馈message/notification/empty
    • 不吞异常;在 action 层统一 try/catch。

6. 类型与可维护性

  • 组件 props、emits、store state/action、API 入参/出参必须显式类型。
  • 避免 any;需要时用更窄的 unknown + 类型守卫。
  • 公共类型放 src/apis/types 或模块 types.ts
  • 复杂对象优先 interface/type 命名清晰。

7. UI 与 Ant Design Vue 规范

  • 组件命名、用法遵循 Ant Design Vue 官方 API。
  • 表单使用 a-form/a-form-item + 规则校验,不手写校验状态。
  • 表格分页、排序、筛选走 Ant 事件与参数,不做自定义混乱实现。
  • 弹窗/抽屉优先抽成可复用组件。

8. 样式与布局

  • 统一 SCSS缩进 2 空格。
  • 样式尽量局部作用(scoped 或 BEM 风格)。
  • 不在模板内写行内样式,除非是动态且非常简单。
  • 顺序遵循 Recess/Stylelint 推荐(位置/盒模型/排版/视觉/动画)。

9. 性能与体验

  • 列表/表格大数据注意:分页、虚拟滚动(如已有方案则复用)。
  • 计算量大逻辑放 computed,避免频繁 watch
  • 路由懒加载、组件按需引入遵循现有配置。
  • 避免无意义的深拷贝和 watch 深度监听。

10. 代码风格(必须遵守)

  • UTF-8 编码TS + Vue SFC2 空格缩进;单引号必须分号max-len 120
  • 导入排序使用 eslint-plugin-simple-import-sort,不要手动乱序。
  • 组件命名帕斯卡;公共组件文件名语义化。
  • 禁止一字母变量名(循环计数 i/j/k 除外)。

11. 提交前自检清单AI 输出代码前需自查)

  • 是否复用/延续了仓库已有模式?
  • 是否把共享状态放进 Pinia而非组件“手动同步”
  • 是否按职责拆分组件,父管业务/子管展示?
  • API 是否全部走 apis/services,且有类型?
  • 代码是否仅包含本需求相关改动?
  • ESLint/Stylelint/Prettier 风格是否一致?

12. AI 禁止事项Hard Donts

  • 不引入新状态库/新架构(除非明确要求)。
  • 不在组件中复制全局状态再手动维护一致性。
  • 不把业务逻辑硬塞进模板/样式/子组件里。
  • 不做无关重构、无关格式化、无关命名调整。
  • 不输出“看似能跑但难维护”的临时方案。

13. 推荐的开发步骤AI 应遵循)

  1. 明确需求与边界 → 列出影响的页面/Store/API。
  2. 搜索现有相似实现 → 决定复用与扩展点。
  3. 先设计数据流/状态流 → 再落地 UI 与组件拆分。
  4. 先写 types + apis + store actions → 再写页面/组件。
  5. 最后补齐异常处理、空态、加载态与交互细节。