项目指南
目录结构
bash
├── .husky # 由 npx husky init 生成 (Git Hook 工具)
│ ├── commit-msg # 规范 git message 提交和格式检查 (使用 commitlint)
│ ├── pre-commit # 执行 git 提交时, 对提交源码进行检查 (使用 lint-staged)
│
├── .vscode # VSCode 编辑器配置
│ ├── extensions.json # VSCode 推荐安装的插件
│ ├── launch.json # VSCode 本地开发调试配置
│ ├── settings.json # VSCode 项目开发风格/格式化配置 (ESLint、Prettier等)
│
├── cypress # Cypress 资源配置
│ ├── downloads # 下载 - 资源存储区
│ ├── fixtures # 定义 - 本地静态数据
│ ├── support # 储存 - 测试辅助资源
│ │ ├── commands.ts # support -> 定义 自定义命令 - cy.[command]
│ │ ├── component-index.html # support -> 定义 组件测试 - 首页
│ │ ├── component.ts # support -> 定义 组件测试 - 资源
│
├── dist # 由 pnpm build 构建的本地工程
├── node_modules # 由 pnpm install 创建的本地依赖包
│
├── public # 静态资源 (不参与构建)
│ ├── favicon.ico # 网站 favicon.ico 图标
│ ├── logo.png # 网站 logo 图片, 通常在 html 模版中引用
│ ├── msw.js # mock service worker (mock response)
│
├── src # 源代码
│ ├── api # 定义与后端交互的接口
│ │ ├── user.js # 示例: 规范1 - 文件名 根据后台接口 (如 /user/add 定义user)
│ │ ├── auth.js # 示例: 规范2 - 文件名【 camelCase 】命名
│ │
│ ├── assets # 静态资源
│ │ ├── logo # 示例: 规范1 - 分组名 根据内容进行文件夹
│ │ │ ├── logo_light.png # 示例: 规范2 - 文件名【 kebab_case 】命名
│ │
│ ├── components # 公共组件
│ │ ├── BaseSearchQuery # 示例: 建议1 - 文件名 以类型化单词开头 (如 Base)
│ │ ├── BaseIconSelect # 示例: 规范1 - 文件名 应倾向于完整单词而不是缩写
│ │ ├── BaseSvgIcon # 示例: 规范2 - 文件名【 PascalCase 】命名
│ │
│ ├── configure # 默认配置 (建议【 default + 类型 】+【 camelCase 】命名)
│ │ ├── defaultRouter.ts # 预设定义 常规路由 (根路由、外部路由、异常路由、静态路由)
│ │ ├── defaultSettings.ts # 预设定义 前端整体 风格/主题/布局 等配置选项,在 store/app.ts 中用于初始值
│ │ ├── presetDirective.ts # 预设定义 Vue指令 操作权限 (示例 v-action)
│ │ ├── presetEnvironment.ts # 预设定义 环境变量 (源自于 .env.xxxx 配置)
│ │ ├── presetThemeColors.ts # 预设定义 主题色库 (例 极客蓝、拂晓蓝、薄暮)
│ │
│ ├── declare # 全局 TS 类型定义 (建议【 PascalCase 】命名)
│ │ ├── Axios.d.ts # 预设定义 Axios 相关类型 (AxiosSorter ...)
│ │ ├── Global.d.ts # 预设定义 JSX API / Window API 类型
│ │ ├── ImportMeta.d.ts # 预设定义 Vite Environment 类型
│ │ ├── Pinia.d.ts # 扩展定义 pinia-plugin-persist 类型
│ │
│ ├── layout # 布局组件库
│ │ ├── components # 储存仅布局组件依赖的组件
│ │ │ ├── LayoutAvatar # 基础布局组件 - 头像组件 Avatar
│ │ │ ├── LayoutBreadcrumb # 基础布局组件 - 面包屑组件 Breadcrumb
│ │ │ ├── LayoutLogo # 基础布局组件 - 图标栏组件 Logo
│ │ │ ├── LayoutMultiTab # 基础布局组件 - 多标签组件 MultiTab
│ │ │ ├── LayoutSettingDrawer # 基础布局组件 - 配置选项组件 SettingDrawer
│ │ │ #
│ │ ├── BasicLayout.tsx # 基础布局组件 (含 Layout.Sider、Layout.Header、Layout.Content + RouterView、Avatar ...)
│ │ ├── BlankLayout.tsx # 空白布局组件 (仅有 RouterView)
│ │ ├── PageFrame.tsx # 页面 Frame 布局组件 (适用 iframe 外部资源访问)
│ │ ├── PageView.tsx # 页面/路由布局组件 (加载 Layout.Content/RouterView 对应的 Vue 组件, 指定了容器样式)
│ │ ├── RouteView.tsx # 页面/路由布局组件 (加载 Layout.Content/RouterView 对应的 Vue 组件, 无相关样式)
│ │ ├── UserLayout.tsx # 用户路由布局组件 (仅有 RouterView + 定制容器样式,一般用于用户登录页的路由)
│ │
│ ├── mock # 模拟数据交互 - (规范与api保持一致)
│ │ ├── user # 示例: 用户接口
│ │ │ ├── addUserInfo.ts # 示例: 用户接口 - 新增
│ │ │ ├── getUserInfoList.ts # 示例: 用户接口 - 查询
│ │ │ #
│ │ ├── setup.ts # 定义 setupWorker (配合 public/msw.js 实现 mock response)
│ │
│ ├── model # 数据模型 TS 类型定义 (建议【 PascalCase 】命名)
│ │ ├── Tree.d.ts # 定义 Tree 树形结构模型
│ │ ├── User.d.ts # 定义 User 用户信息模型
│ │
│ ├── plugin # 定义引用第三方插件
│ │ ├── dayjs.ts # 导入引用 dayjs 日期插件
│ │ ├── pinia.ts # 导入引用 pinia 状态管理库 (集成了 pinia-plugin-persist)
│ │ ├── vue-ls.ts # 导入引用 vue-ls 储存管理
│ │
│ ├── router # 动态路由处理
│ │ ├── generate-routes.ts # 解析/转换/生成 动态路由 (Route)
│ │ ├── generate-typing.d.ts # 解析/转换/生成 类型定义
│ │
│ ├── store # pinia 状态储存 (建议【 camelCase 】命名)
│ │ ├── app.ts # 定义存储 前端整体 风格/主题/布局 等配置
│ │ ├── router.ts # 定义存储 Vue路由 (动态路由、静态路由、解析生成动态路由)
│ │ ├── tag.ts # 定义存储 多标签页 (记录标签、缓存标签、移除标签)
│ │ ├── user.ts # 定义存储 用户信息 (用户登录/退出、用户信息)
│ │
│ ├── styles # 样式定义/覆盖 (建议【 kebab_case 】命名)
│ │ ├── customize.less # 自定义样式 (例 flex-auto、flex-none、text-ellipsis)
│ │ ├── normalize.less # 重置默认样式 (关于 html、body、h1 ~ h6、p、-webkit-scrollbar)
│ │ ├── nprogress.less # 重写覆盖 nprogress 进度条样式
│ │ ├── override.less # 覆盖 ant design vue 组件样式 (目前仅覆盖 ant-drawer 部分样式)
│ │
│ ├── utils # 工具类方法 (建议【 camelCase 】命名)
│ │ ├── common.ts # 定义 通用工具类 (数值四舍五入、输出指定格式的日期、取出节点文本、封装请求参数)
│ │ ├── request.ts # 定义 Axios 实例 (Request拦截器、Response拦截器、预设 baseURL / timeout)
│ │ ├── router.ts # 定义 layout 中 FrameView 布局组件中 提取 route link API
│ │
│ ├── views # 视图路由组件库 (建议【 PascalCase 】.vue 命名)
│ │ ├── auth # 模块 - 认证管理
│ │ │ ├── Login.vue # 组件 - 用户登录
│ │ │
│ │ ├── error # 模块 - 异常管理
│ │ │ ├── PageError403.vue # 组件 - 异常 403
│ │ │ ├── PageError404.vue # 组件 - 异常 404
│ │ │ ├── PageError500.vue # 组件 - 异常 500
│ │ │
│ │ ├── system # 模块 - 系统管理
│ │ │ ├── components #
│ │ │ │ ├── OrganizeManage # 子组件库 - OrganizeManage
│ │ │ │ ├── ResourceManage # 子组件库 - ResourceManage
│ │ │ │ ├── RoleManage # 子组件库 - RoleManage
│ │ │ │ ├── UserManage # 子组件库 - UserManage
│ │ │ │ #
│ │ │ ├── OrganizeManage.vue # 组织管理 (路由 /system/OrganizeManage)
│ │ │ ├── ResourceManage.vue # 资源管理 (路由 /system/ResourceManage)
│ │ │ ├── RoleManage.vue # 角色管理 (路由 /system/RoleManage)
│ │ │ ├── UserManage.vue # 用户管理 (路由 /system/UserManage)
│ │
│ ├── App.vue # 顶层路由组件 (处理 全局 Theme/Token/Size)
│ ├── main.less # 样式入口文件
│ ├── main.ts # 主入口文件
│ ├── permission.ts # 路由权限拦截器
│ ├── router.constant.ts # 配置静态路由
│ ├── router.dynamic.ts # 配置动态路由 (借助 vite 的 import.meta.glob 导入 src/views 目录下路由)
│ ├── router.ts # 初始化 Router 实例
│
├── test # 测试脚本
│ ├── cypress # cypress (基于浏览器运行的测试工具,主要用于测试依赖浏览器的逻辑)
│ │ ├── -Login.vue.cy.ts # 范例: cypress 测试 Login Vue 组件
│ │ ├── tsconfig.json # 定义: cypress TS 配置文件
│ │ #
│ ├── vitest # vitest (由 Vite 驱动的测试工具,主要用于测试不依赖浏览器的逻辑)
│ │ ├── -utils.test.ts # 范例: vitest 测试 Utils Api
│ │ ├── tsconfig.json # 定义: vitest TS 配置文件
│
├── .cz-message.cjs # 指定 cz-message-helper 配置选项 (using by git cz)
├── .editorconfig # 指定项目的编码规范
├── .env # 默认基础环境配置
├── .env.development # 本地开发环境配置, 会覆盖 .env 文件同名属性配置
├── .env.production # 正式运行环境配置, 会覆盖 .env 文件同名属性配置
├── .env.test # 测试运行环境配置, 会覆盖 .env 文件同名属性配置
├── .eslintrc-auto-import.json # 是由 unplugin-auto-import/vite 插件自动生成 (在 eslint extends 中配置)
├── .gitattributes # 指定 git 使用的文件和路径的属性
├── .gitignore # 指定 git 哪些文件不需要添加到版本管理中
├── .lintstagedrc.js # 指定 lint-staged 配置选项
├── .npmignore # 指定 npm publish 哪些文件被忽略 (比 .gitignore 优先级高)
├── .npmrc # 指定 npm 运行时的配置选项
├── .prettierignore # 指定 prettier 哪些文件不需要校验
├── .prettierrc # 指定 prettier 格式的规则配置
├── .release-it.json # 指定 release-it 配置选项
├── auto-imports.d.ts # 是由 unplugin-auto-import/vite 插件自动生成
├── commitlint.config.js # 指定 @commitlint/cli、@commitlint/config-conventional 的配置选项
├── components.d.ts # 是由 unplugin-vue-components/vite 插件自动生成
├── eslint.config.mjs # 指定 eslint 校验的规则配置 (ESLint v9.x)
├── cypress.config.ts # Cypress 配置文件
├── index.html # 编译构建所需的 html 模版文件
├── LICENSE # 前端项目许可文件
├── package.json # 前端项目配置文件
├── pnpm-lock.yaml # pnpm 安装依赖包版本锁定文件
├── README.md # 前端项目介绍文件
├── tsconfig.json # typescript 配置文件
├── vite.config.ts # Vite 配置文件 (dev server / run build)
├── volar.config.js # Volar 配置文件 (配合 volar-service-prettyhtml 插件)
依赖管理
- Pnpm 版本:
>=7
- Node 版本:
^18.18.0 || ^20.9.0 || >=21.1.0
bash
# 本地初始化 (生成 package.json)
pnpm init
# 本地安装 package.json 依赖包
pnpm install
# 全局安装 某个依赖包
pnpm add -g [package]
pnpm add -g [package]@[tag]
pnpm add -g [package]@[version]
# 本地安装 仅编译环境所需 依赖包
pnpm add -D [package]
pnpm add -D [package]@[tag]
pnpm add -D [package]@[version]
# 本地安装 编译及生产环境所需 依赖包
pnpm add [package]
pnpm add [package]@[tag]
pnpm add [package]@[version]
# 本地升级 某个依赖包
pnpm upgrade [package]
pnpm upgrade [package]@[tag]
pnpm upgrade [package]@[version]
# 本地移除 某个依赖包
pnpm remove [package]
# 本地检查 依赖包情况
# <red> : Major Update backward-incompatible updates --- (不建议更新)
# <yellow> : Minor Update backward-compatible features ---- (可以更新)
# <green> : Patch Update backward-compatible bug fixes --- (建议更新)
pnpm outdated
# 批量更新 一键按需升级
# Press <space> to select ----------------------- (空格切换选中)
# Press <a> to toggle all ----------------------- (所有依赖选中)
# Press <i> to invert selection ----------------- (所有依赖反选)
# Press <Enter> install selected dependencies --- (所选依赖安装)
pnpm up -i --latest