
## 安装

- 1.安装pnpm

  ```shell
  npm install -g pnpm
  ```

- 2.安装依赖

  ```shell
  pnpm i
  ```

## 运行

- 1.开发环境启动

  ```shell
  pnpm dev
  ```

## 打包

```shell
pnpm build
```

## 提交代码前先格式代码

```shell
pnpm lint
```

## 目录结构

```
├── .vscode  # IDE 工具推荐配置文件
│   │   ├── extensions.json  # 一键安装 vscode 插件
│   │   ├── settings.json  # 设置扩展程序或 vscode 编辑器的一些属性
│   │   ├── vue3.0.code-snippets  # vue3.0 代码片段
│   │   └── vue3.2.code-snippets  # vue3.2 代码片段
│   │   └── vue3.3.code-snippets  # vue3.3 代码片段
├── build  # 构建工具
│   │   ├── cdn.ts  # 打包时采用 cdn 模式
│   │   ├── compress.ts  # 打包时启用 gzip 压缩或 brotli 压缩
│   │   ├── info.ts  # 输出打包信息（大小、用时）
│   │   ├── optimize.ts  # vite 依赖预构建配置项
│   │   ├── plugins.ts  # vite 相关插件存放处
│   │   ├── utils.ts  # 构建工具常用方法抽离
├── locales  # 国际化文件存放处
│   │   ├── en.yaml  # 英文配置
│   │   ├── zh-CN.yaml  # 中文配置
├── node_modules  # 模块依赖
├── public  # 静态资源
│   │   ├── audio  # 音频文件
│   │   ├── html  # 静态 iframe 页面
│   │   ├── wasm  # wasm 文件以及胶水代码
│   │   ├── favicon.ico  # favicon
│   │   ├── logo.svg  # logo
│   │   ├── platform-config.json  # 全局配置文件（打包后修改也可生效）
├── src
│   ├── api  # 接口请求统一管理
│   ├── assets  # 字体、图片等静态资源
│   ├── components  # 自定义通用组件
│   │   ├── ReAnimateSelector  # [animate.css](https://animate.style/) 选择器组件
│   │   ├── ReAuth  # 按钮级别权限组件
│   │   ├── ReCol  # 封装 element-plus 的 el-col 组件
│   │   ├── ReCountTo  # 数字动画组件
│   │   ├── ReCropper  # 图片裁剪组件
│   │   ├── ReDialog  # 基于 element-plus 中 el-dialog 组件开发的函数式弹框
│   │   ├── ReIcon  # 图标组件
│   │   ├── ReImageVerify  # 图形验证码组件
│   │   ├── RePureTableBar  # 配合 `@pureadmin/table` 实现快速便捷的表格操作 https://github.com/pure-admin/pure-admin-table */
│   │   ├── ReSegmented  # 分段控制器组件
│   │   ├── ReText  # 支持 Tooltip 提示的文本省略组件
│   │   ├── ReTypeit  # 打字机效果组件
│   ├── config  # 获取平台动态全局配置
│   ├── directives  # 自定义指令
│   │   ├── auth  # 按钮级别权限指令
│   │   ├── copy  # 文本复制指令（默认双击复制）
│   │   ├── longpress  # 长按指令
│   │   ├── optimize  # 防抖、节流指令
│   ├── layout  # 主要页面布局
│   ├── plugins  # 处理一些库或插件，导出更方便的 api
│   ├── router  # 路由配置
│   ├── store  # pinia 状态管理
│   ├── style  # 全局样式
│   │   ├── dark.scss  # 暗黑模式样式适配文件
│   │   ├── element-plus.scss  # 全局覆盖 element-plus 样式文件
│   │   ├── reset.scss  # 全局重置样式文件
│   │   ├── sidebar.scss  # layout 布局样式文件
│   │   ├── tailwind.css  # tailwindcss 自定义样式配置文件
│   │   ├── ...
│   ├── utils  # 全局工具方法
│   │   ├── http  # 封装 axios 文件
│   │   ├── localforage  # 二次封装 localforage (https://localforage.docschina.org/) 支持设置过期时间，提供完整的类型提示
│   │   ├── progress  # 封装 nprogress
│   │   └── auth.ts  # 处理用户信息和 token 相关
│   │   └── chinaArea.ts  # 汉字转区域码
│   │   └── globalPolyfills.ts  # 解决项目可能因为安装某个依赖出现 `global is not defined` 报错
│   │   └── message.ts  # 消息提示函数
│   │   ├── mitt.ts  # 触发公共事件，类似 EventBus
│   │   ├── preventDefault.ts  # 阻止键盘F12、浏览器默认右键菜单、页面元素选中、图片默认可拖动的方法
│   │   ├── print.ts  # 打印函数
│   │   ├── propTypes.ts  # 二次封装 vue 的 propTypes
│   │   ├── responsive.ts  # 全局响应式 storage 配置
│   │   ├── sso.ts  # 前端单点登录逻辑处理
│   │   ├── tree.ts  # 树结构相关处理函数
│   ├── views  # 存放编写业务代码页面
│   ├── App.vue  # 入口页面
│   ├── main.ts  # 入口文件
├── types  # 全局 TS 类型配置
│   │   ├── global-components.d.ts  # 自定义全局组件获得 Volar 提示（自定义的全局组件需要在这里声明下才能获得 Volar 类型提示哦）
│   │   ├── global.d.ts  # 全局类型声明，无需引入直接在 `.vue` 、`.ts` 、`.tsx` 文件使用即可获得类型提示
│   │   ├── index.d.ts  # 此文件跟同级目录的 global.d.ts 文件一样也是全局类型声明，只不过这里存放一些零散的全局类型，无需引入直接在 .vue 、.ts 、.tsx 文件使用即可获得类型提示
│   │   ├── router.d.ts  # 全局路由类型声明
│   │   ├── shims-tsx.d.ts  # 该文件是为了给 .tsx 文件提供类型支持，在编写时能正确识别语法
│   │   └── shims-vue.d.ts  # .vue、.scss 文件不是常规的文件类型，typescript 无法识别，所以我们需要通过下图的代码告诉 typescript 这些文件的类型，防止类型报错
├── .browserslistrc  # 配置目标浏览器的环境
├── .dockerignore  # 排除不需要上传到 docker 服务端的文件或目录
├── .editorconfig  # 编辑器读取文件格式及样式定义配置 https://editorconfig.org/
├── .env  # 全局环境变量配置（当 .env 文件与 .env.development、.env.production、.env.staging 这三个文件之一存在相同的配置 key 时，.env 优先级更低）
├── .env.development  # 开发环境变量配置
├── .env.production  # 生产环境变量配置
├── .env.staging  # 预发布环境变量配置
├── .eslintignore  # eslint 语法检查忽略文件
├── .gitattributes  # 自定义指定文件属性
├── .gitignore  # git 提交忽略文件
├── .gitpod.yml  # gitpod 部署配置
├── .lintstagedrc  # lint-staged 配置
├── .markdownlint.json  # markdown 格式检查配置
├── .npmrc  # npm 配置文件
├── .nvmrc  # 用于指定在使用 Node Version Manager（NVM）时要使用的特定 Node.js 版本
├── .prettierignore  # prettier 语法检查忽略文件
├── .prettierrc.js  # prettier 插件配置
├── .stylelintignore  # stylelint 语法检查忽略文件
├── commitlint.config.js  # git 提交前检查配置
├── Dockerfile  # 用来构建 docker 镜像
├── eslint.config.js  # eslint 语法检查配置
├── index.html  # html 主入口
├── LICENSE  # 证书
├── package.json  # 依赖包管理以及命令配置
├── pnpm-lock.yaml  # 依赖包版本锁定文件
├── postcss.config.js  # postcss 插件配置
├── README.md  # README
├── stylelint.config.js  # stylelint 配置
├── tailwind.config.ts  # tailwindcss 配置
├── tsconfig.json  # typescript 配置
└── vite.config.ts  # vite 配置
```

## 程序员必备技能之 `Git`

### 常用命令

#### 拉取代码

```sh
git clone xxx.git
```

#### 创建分支

```sh
git branch dev
# or
git checkout -b dev
# or
git switch -c dev
```

#### 切换本地分支

```sh
git checkout dev
# or
git switch dev
```

#### 切换分支并关联远程分支

```sh
git checkout -b dev origin/dev
# or
git checkout --track origin/dev
```

#### 查看本地所有分支

```sh
git branch
```

#### 查看远程所有分支

```sh
git branch -r
```

#### 删除本地分支

```sh
git branch -d dev
```

#### 删除远程分支

```sh
git push origin -d dev
```

#### 将代码从工作区添加暂存区

```sh
git add .
```

#### 查看尚未暂存的更新

```sh
git diff
```

#### 添加提交信息（`commit` 注释写错，执行 `git commit --amend` 此时会进入默认 `vim` 编辑器，修改注释后保存）

```sh
git commit -m 'xxxx'
```

#### 推送代码到远程分支

```sh
git push origin dev

# 强制推送（常在 git rebase 或 git reset 后使用）
git push -f origin dev
```

#### 拉取远程分支代码

```sh
git pull origin dev
```

#### 合并分支

```sh
git merge dev
```

#### 查看 `git` 状态

```sh
git status
```

#### 查看提交历史

```sh
git log
```

#### 查看可引用的历史版本记录

```sh
git reflog
```

#### 把本地未 `push` 的分叉提交历史整理成直线

```sh
git rebase origin/dev
```

#### 回到 `rebase` 执行之前的状态

```sh
git rebase --abort
```

#### 回退版本

```sh
# 回退指定 commit_id 版本
git reset --hard commit_id

# 回退上一个版本
git reset --soft HEAD^
# or
git reset --soft HEAD~1
```

#### 撤销代码

```sh
git revert commit_id
```

#### 修改分支名

```sh
# 第一步
git branch -m oldBranchName newBranchName

# 第二步
git push origin :oldBranchName

# 第三步
git push --set-upstream origin newBranchName
```

#### 查看 `git` 配置

```sh
# 查看全局配置
git config --global --list

# 查看用户名
git config --global user.name
```

#### 添加用户名

```sh
git config --global --add user.name newName
```

#### 删除用户名

```sh
git config --global --unset user.name
```

#### 修改用户名

```sh
git config --global user.name newName
```

#### 配置 `Git` 用户名和邮箱

```sh
# 用户名
git config --global user.name "Your Name"

# 邮箱
git config --global user.email "email@example.com"
```

#### 统计代码行数

```sh
git ls-files | xargs wc -l
```

#### 文件或文件夹重命名

`Git` 在 `Windows` 和 `macOS` 的默认文件系统中对文件大小写修改是不敏感的。可能你会先删除文件并提交，然后再新建文件再提交，这样做很麻烦，下面的 `git mv` 就简化了繁琐的操作  
比如文件 `filename.ts` 或文件夹 `jsutils`，它们的相对路径分别是 `src/filename.ts` 和 `src/jsutils`

```sh
# 将 filename.ts 文件重命名为 fileName.ts，分下面两步
# 第一步（注意下面的 name.ts 与 filename.ts 是不同的，如果你把 name.ts 改为 fileName.ts 是不行的，因为上面讲了仅大小写不同是不行的）
git mv src/filename.ts src/name.ts
# 第二步
git mv src/name.ts src/fileName.ts

# 将 jsutils 文件夹重命名为 jsUtils，分下面两步
# 第一步
git mv src/jsutils src/utils
# 第二步
git mv src/utils src/jsUtils
```

## 提交规范

[相关参考](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular)

`feat: 增加新功能`  
`fix: 修复问题/BUG`  
`style: 代码风格相关无影响运行结果的`  
`perf: 优化/性能提升`  
`refactor: 重构`  
`revert: 撤销修改`  
`test: 测试相关`  
`docs: 文档/注释`  
`chore: 依赖更新/脚手架配置修改等`  
`workflow: 工作流改进`  
`ci: 持续集成`  
`types: 类型定义文件更改`  
`wip: 开发中`

## `CodeReview` 常用缩写

`PR`（Pull Request）拉取请求，给其他项目提交代码  
`LGTM`（Looks Good To Me）代码已经过 review，可以合并  
`SGTM`（Sounds Good To Me）和上面那句意思差不多，也是已经通过了 review 的意思  
`WIP`（Work In Progress）如果有个改动很大的 PR，可以在写了一部分的情况下先提交，但需在标题写上 WIP，以告诉项目维护者这个功能还未完成，方便维护者提前 review 部分提交的代码  
`PTAL`（Please Take A Look）提示别人来看一下  
`TBR`（To Be Reviewed）提示维护者进行 review  
`TL;DR`（Too Long; Didn't Read）太长懒得看  
`TBD`（To Be Done(or Defined/Discussed/Decided/Determined)） 一般表示还没搞定

[简单易懂的 Git](https://www.bilibili.com/video/BV1KZ4y1o7gr/?p=1&vd_source=5a992808de6229d78e7810536c5f9ab3)<Badge text="视频教程推荐"/>
