Files
FastapiAdmin/frontend/web/README.md
T
zhangtao 9a231aa58c feat(web): 升级至 v3.0 并重构组件与引导流程
- 提取应用引导逻辑至 useAppBootstrap 组合式函数
- 增强日期选择器组件,支持全类型与格式自动推导
- 修复资源泄漏:清理 RAF、定时器、事件与 mitt 监听
- 修复退出登录逻辑与异步导出流程
- 迁移 ::v-deep 至 Vue 3 标准 :deep 语法
- 移除调试日志并改进类型定义与注释文档
2026-05-11 23:37:11 +08:00

212 lines
7.9 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# FastAPI Admin · 前端工程(web
基于 **Vue 3 + Vite + TypeScript + Element Plus** 的后台管理前端,与 FastAPI Admin 后端配套使用。状态管理为 **Pinia**,样式以 **Tailwind CSS 4****SCSS** 为主,接口请求使用 **Axios**
## 架构概览
```
main.ts 启动
└─ initPlugins(app) ← 插件注册(Pinia → Router → 指令 → i18n → Element Plus
└─ mount("#app")
└─ App.vue
├─ onBeforeMount: 主题初始化
└─ onMounted: bootstrap() → 存储检查/版本升级/站点配置
└─ 路由守卫 beforeEach
├─ 存储失效检测
├─ 登录态校验
├─ 动态路由注册(菜单 → addRoute)
└─ 标签/标题同步
```
路由采用 **Hash 模式**,静态路由(Layout/登录/404)首屏注册,业务路由由守卫根据菜单权限延迟 `addRoute`。HTTP 拦截器支持 **Token 静默续期**401 时自动 refresh,失败后跳转登录)。
---
## 第一次运行(最快上手)
### 1. 环境准备
| 工具 | 版本要求 |
|------|-----------|
| Node.js | ≥ 20.19(见 `package.json``engines` |
| pnpm | ≥ 8.8,推荐 **pnpm 9**(与 `packageManager` 字段一致) |
未安装 pnpm 时可执行:`corepack enable && corepack prepare pnpm@9.15.3 --activate`(版本可按项目 `packageManager` 调整)。
### 2. 安装依赖并启动
**仓库根目录** 下进入本工程(路径以你的克隆位置为准):
```bash
cd frontend/web
pnpm install
pnpm dev
```
终端会打印本地访问地址;默认开发端口由 **`.env`** 中的 **`VITE_PORT`** 决定(当前模板为 **5180**)。浏览器打开提示的 `http://localhost:端口/` 即可。
### 3. 环境变量(必看)
本项目使用 **Vite 环境文件**
- **`.env`**:各环境共享(端口、`VITE_APP_BASE_API`、权限模式等)。
- **`.env.development`**:开发模式覆盖项(后端地址、标题等)。
- 修改任一 env 后需 **重启** `pnpm dev`
若仓库内没有现成的 `.env`,可复制示例文件再按需改名:
```bash
cp .env.example .env
# 若有需要,再单独创建 .env.development(可参考示例下半段注释)
```
常用变量说明见下文 **[环境变量一览](#环境变量一览)**。
### 4. 与后端联调
1. 先启动 **FastAPI Admin 后端**,监听地址与 **`.env.development`** 里 **`VITE_API_BASE_URL`** 一致(模板默认为 **`http://127.0.0.1:8001`**)。
2. 前端开发时,浏览器请求发往当前页面同源路径,由 **Vite `server.proxy`****`VITE_APP_BASE_API`**(如 `/api/v1`)转发到上述后端。
3. 若页面提示「连接被拒绝」,检查后端是否启动、端口是否一致,或把 **`VITE_API_BASE_URL`** 改成你的实际后端地址。
### 5. 登录与权限
登录页与 Token 逻辑由项目内置 **`utils/http`**、**`utils/auth`** 与路由守卫配合实现。具体账号由 **后端初始化数据或管理员创建**,请参阅后端文档。
---
## 常见问题(排查)
| 现象 | 建议 |
|------|------|
| `ECONNREFUSED` / 网络错误 | 后端未启动或 **`VITE_API_BASE_URL`** 端口错误 |
| 接口 401 / 频繁跳转登录 | Token 失效或未登录;清除站点本地存储后重新登录 |
| 修改 `.env` 不生效 | 必须 **重启** `pnpm dev` |
| 依赖异常、热更新怪异 | 尝试 **`pnpm clean:cache`** 后再 **`pnpm dev`**;仍不行可 **`pnpm dev:force`** |
| 类型报错 | 运行 **`pnpm type-check`**;自动生成类型见 `src/types/import/`(勿手改自动生成的 d.ts |
---
## 技术栈
| 类别 | 选型 |
|------|------|
| 框架 | Vue 3Composition API / `<script setup>` |
| 构建 | Vite 7 |
| 语言 | TypeScript |
| UI | Element Plus |
| 路由 | Vue Router 4Hash;静态路由 + 守卫内动态 `addRoute` |
| 状态 | Pinia + pinia-plugin-persistedstate |
| 样式 | Tailwind CSS、SCSS |
| HTTP | Axios |
| 国际化 | vue-i18n |
---
## 常用脚本
| 命令 | 说明 |
|------|------|
| `pnpm dev` | 本地开发(读取 `.env` + `.env.development` |
| `pnpm dev:force` | 强制预打包依赖后启动(缓存异常时) |
| `pnpm build` | `vue-tsc` 类型检查 + 生产构建,产物在 **`dist/`** |
| `pnpm build:dev` / `build:test` / `build:pro` | 按 mode 构建(需对应 env 文件) |
| `pnpm preview` | 本地预览构建结果 |
| `pnpm type-check` | 仅 TypeScript 检查 |
| `pnpm lint` | ESLint + Prettier + Stylelint |
| `pnpm clean:dev` | 执行 `scripts/clean-dev.ts`(清理演示等,使用前阅读脚本说明) |
| `pnpm clean:cache` | 清理 Vite 等缓存 |
---
## 目录结构(src
```
src/
├── api/ # 按业务模块划分的接口封装
├── assets/ # 图片、字体、全局样式等
├── components/ # 通用与业务组件
├── config/ # 应用配置(fastEnter、headerBar 等)
├── enums/ # 枚举
├── hooks/ # 组合式函数
├── layouts/ # 布局壳(art-* 顶栏、侧栏、Tab、设置抽屉等)
├── locales/ # i18n(如 langs/zh.json
├── plugins/ # Vue 插件注册(入口:plugins/index.ts → initPlugins
├── router/ # staticRoutes、动态路由、守卫、MenuProcessor
├── store/ # Pinia 模块
├── types/ # TypeScript 类型
├── utils/ # 工具(含 `@utils`
├── views/ # 页面(module_* / dashboard 等)
├── App.vue
└── main.ts # 入口
```
应用插件与路由初始化顺序见 **`src/plugins/index.ts`****`initPlugins`**)。
---
## 路径别名(编写代码时)
| 别名 | 指向 |
|------|------|
| `@` | `src/` |
| `@views` | `src/views` |
| `@stores` | `src/store` |
| `@utils` | `src/utils` |
| `@styles` | `src/styles` |
| `@imgs` / `@icons` | 图片与 SVG |
**`vite.config.ts`**、`tsconfig.json``paths` 保持一致。
---
## 环境变量一览
只有以 **`VITE_`** 开头的变量会注入前端代码。下列与 **`pnpm dev`** 关系最密切:
| 变量 | 作用 |
|------|------|
| `VITE_PORT` | 开发服务器端口 |
| `VITE_BASE_URL` | 部署基础路径(子目录部署时形如 `/admin/` |
| `VITE_APP_BASE_API` | 接口路径前缀,与 Vite 代理匹配 |
| `VITE_API_URL` | 浏览器侧发出的 API 根前缀(开发时常为 `/` |
| `VITE_API_BASE_URL` | **代理目标**:后端 HTTP 根地址 |
| `VITE_ACCESS_MODE` | `frontend` / `backend` / `mixed`,菜单与路由来源 |
| `VITE_APP_WS_ENDPOINT` | WebSocket(如 AI 对话) |
| `VITE_APP_TITLE` | 页面标题(可被后端参数配置覆盖) |
完整列表以仓库内 **`.env`**、**`.env.development`** 为准;模板说明见 **`.env.example`**。
---
## 路由与菜单(扩展页面时)
| 文件 | 职责 |
|------|------|
| `src/router/staticRoutes.ts` | 静态路由、`dashboardLayoutChildren`、壳层菜单合并 |
| `src/router/dynamicRoutes.ts` | 菜单驱动的动态路由 |
| `src/router/beforeEach.ts` | 权限与动态挂载 |
| `src/router/MenuProcessor.ts` | 后端菜单 → 前端路由记录 |
新增业务页:一般需要 **视图 +(可选)静态或动态路由 + 后端菜单/i18n**,三者路径与 **name** 保持一致。
---
## 构建与部署
- 输出目录:**`dist/`**。
- 部署在子路径时配置 **`VITE_BASE_URL`**,并配置网关/Nginx 将前端资源与 `/api` 等转发到后端。
- 生产构建可能移除部分 `console`(见 **`vite.config.ts`** 中 `terserOptions`)。
---
## 代码规范与 Git
- **格式化与校验**`pnpm lint`
- **提交**husky、lint-staged、commitlint;可使用 **`pnpm commit`**Commitizen / cz-git)。
---
## 仓库与反馈
Issue 与主页见 **`package.json`** 中的 `bugs``homepage``repository`