# vue-admin-side **Repository Path**: GyYuMine/vue-admin-side ## Basic Information - **Project Name**: vue-admin-side - **Description**: vite7_vue3_elementuiplus_ts 多模块架构 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-24 - **Last Updated**: 2026-05-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Vue Admin Side - 企业级后台管理系统 基于 Vue 3 + Vite 7 + Element Plus + TypeScript 构建的现代化后台管理系统,采用模块化架构设计,支持多模块独立打包和联合打包。 ## 📋 目录 - [技术栈](#技术栈) - [项目结构](#项目结构) - [快速开始](#快速开始) - [模块化架构](#模块化架构) - [构建命令](#构建命令) - [分模块打包能力](#分模块打包能力) - [环境变量](#环境变量) - [代码规范](#代码规范) - [组件多声明方式支持](#组件多声明方式支持-new) - [部署](#部署) --- ## 🛠️ 技术栈 ### 核心框架 - **Vue 3.5.24** - 渐进式 JavaScript 框架 - **Vite 7.2.2** - 下一代前端构建工具 - **TypeScript 5.9.3** - 类型安全的 JavaScript 超集 - **Element Plus 2.10.4** - Vue 3 组件库 ### 状态管理 - **Pinia 3.0.3** - Vue 官方状态管理库 - **Pinia Plugin Persistedstate** - Pinia 持久化插件 ### 路由管理 - **Vue Router 4.6.3** - Vue 官方路由 ### 构建工具 - **@vitejs/plugin-vue** - Vue 单文件组件支持 - **vue-tsc** - TypeScript 类型检查 - **unplugin-auto-import** - 自动导入 API - **unplugin-vue-components** - 组件自动注册 - **vite-plugin-svg-icons** - SVG 图标管理 - **code-inspector-plugin** - 代码定位调试工具 ### UI/样式 - **Sass 1.89.2** - CSS 预处理器 - **全局 SCSS 变量系统** - 统一的设计令牌管理 ### 地图可视化 - **Leaflet 1.9.4** - 开源地图库 - **Leaflet Canvas Map 1.0.3** - Canvas 地图渲染 ### HTTP 请求 - **Axios 1.10.0** - HTTP 客户端 --- ## 📁 项目结构 ``` vue-admin-side/ ├── public/ # 公共静态资源(直接复制) │ └── vite.svg ├── config/ # 配置文件 │ └── readdir.ts # 获取模块名称的工具函数 ├── src/ # 主源码目录 │ ├── assets/ # 全局静态资源 │ │ ├── api/ # 全局 API 接口定义 │ │ ├── dictionary/ # 全局数据字典 │ │ ├── font/ # 字体文件 │ │ ├── icons/ # 全局 SVG 图标 │ │ ├── images/ # 图片资源 │ │ ├── mapData/ # 地图数据 │ │ └── styles/ # 全局样式 │ │ ├── variables.scss # 全局 SCSS 变量(设计令牌) │ │ ├── globalStyle.scss # 全局基础样式 │ │ └── reset.scss # 样式重置 │ ├── components/ # 全局公共组件 │ │ ├── sidebar/ # 侧边栏组件 │ │ ├── SvgIcon.vue # SVG 图标组件 │ │ └── HelloWorld.vue │ ├── engineeringModule/ # 工程模块目录(核心业务模块) │ │ ├── example/ # 示例模块(可删除) │ │ ├── test/ # 测试模块(可删除) │ │ └── readMe.md # 工程模块说明文档 │ ├── router/ # 全局路由配置 │ │ ├── index.ts # 路由实例 │ │ └── routes.ts # 路由表 │ ├── store/ # 全局状态管理 │ │ ├── index.ts # Store 入口 │ │ └── default.ts # 默认状态 │ ├── types/ # TypeScript 类型定义 │ │ └── ResponseData.ts # 响应数据类型 │ ├── utils/ # 工具函数 │ │ ├── http.ts # HTTP 请求封装 │ │ ├── mainImport.ts # 主导入工具 │ │ ├── regex.ts # 正则表达式 │ │ ├── registerComponen.ts # 组件注册 │ │ ├── registerdirective.ts # 指令注册 │ │ └── tools.ts # 通用工具 │ ├── views/ # 全局页面视图 │ │ ├── layout/ # 布局组件 │ │ │ ├── components/ # 布局子组件 │ │ │ │ └── HomeTabs.vue # Tab 标签页 │ │ │ └── index.vue # 主布局 │ │ └── RouterView.vue # 路由视图 │ ├── App.vue # 根组件 │ ├── main.ts # 主入口文件 │ └── vite-env.d.ts # Vite 类型声明 ├── dist/ # 构建输出目录 │ ├── all/ # 全部模块打包结果 │ ├── example/ # example 模块打包结果 │ └── test/ # test 模块打包结果 ├── .vscode/ # VSCode 配置 ├── .qoder/ # Qoder AI 配置 ├── .history/ # 历史版本备份(可忽略) ├── index.html # HTML 模板 ├── package.json # 项目依赖配置 ├── pnpm-lock.yaml # 依赖锁定文件 ├── tsconfig.json # TypeScript 配置 └── vite.config.ts # Vite 构建配置 ``` --- ## 🚀 快速开始 ### 环境要求 - Node.js >= 18.x - pnpm >= 8.x(推荐使用 pnpm) ### 安装依赖 ```bash pnpm install ``` ### 启动开发服务器 ```bash # 启动主模块(默认) pnpm dev # 启动指定工程模块 pnpm dev:example # 启动 example 模块 pnpm dev:test # 启动 test 模块 ``` ### 访问地址 开发服务器启动后自动打开浏览器,访问:`http://localhost:8080` --- ## 🏗️ 模块化架构 ### 什么是工程模块? 工程模块是本项目核心的架构设计理念,每个模块都是一个**独立完整的功能单元**,包含: - 独立的页面视图(views) - 独立的路由配置(router) - 独立的状态管理(store) - 独立的组件库(components) - 独立的静态资源(assets) - 独立的样式系统(styles) ### 模块目录结构 每个工程模块都遵循标准化的目录结构: ``` moduleName/ ├── assets/ # 模块静态资源 │ ├── api/ # API 接口定义 │ ├── dictionary/ # 数据字典 │ ├── font/ # 字体文件 │ ├── icons/ # SVG 图标 │ ├── images/ # 图片资源 │ └── styles/ # 样式文件(index.scss) ├── components/ # 模块组件 ├── router/ # 路由配置 │ ├── index.ts # 路由实例 │ └── routes.ts # 路由表 ├── store/ # 状态管理 │ └── index.ts # Store 定义 ├── utils/ # 工具函数 ├── views/ # 页面视图 │ └── layout/ # 布局组件 │ ├── components/ # 布局子组件 │ └── index.vue # 布局主页面 ├── main.ts # 模块入口 ├── auto-imports.d.ts # 自动导入类型 └── components.d.ts # 组件类型 ``` ### 当前模块 | 模块名 | 说明 | 状态 | | ----------------- | ---------------------------- | ------ | | **example** | 示例模块,展示完整的模块结构 | 可删除 | | **test** | 测试模块,用于新功能开发 | 可删除 | ### 创建新模块 ```bash # 方式 1:复制示例模块 cp -r src/engineeringModule/example src/engineeringModule/new-module # 方式 2:复制测试模块 cp -r src/engineeringModule/test src/engineeringModule/new-module ``` **命名规范:** - 使用小写字母 - 多个单词用短横线 `-` 分隔 - 例如:`user-management`、`order-system`、`data-analysis` **重要提示:** - 模块名称会作为路由前缀和资源路径的一部分 - `store` 的 ID 必须与模块名称一致 - 在正式项目中,`example` 和 `test` 模块应删除 --- ## 📦 构建命令 ### 开发环境 ```bash # 启动主模块开发服务器 pnpm dev # 启动指定工程模块开发服务器 pnpm dev:example pnpm dev:test ``` ### 生产环境 ```bash # 构建主模块(全部模块) pnpm build # 输出目录:dist/all/ # 构建指定工程模块 pnpm build:example # 输出目录:dist/example/ pnpm build:test # 输出目录:dist/test/ ``` ### 预览构建结果 ```bash pnpm preview ``` --- ## 🔧 分模块打包能力 ### 打包机制 项目支持**灵活的模块化打包策略**,可以根据不同需求选择打包范围: #### 1. **全部模块打包**(默认) ```bash pnpm build ``` - 打包所有工程模块和主应用 - 输出到 `dist/all/` 目录 - 适用于完整部署或单体应用 #### 2. **单个模块独立打包** ```bash pnpm build:example pnpm build:test ``` - 只打包指定的单个工程模块 - 输出到 `dist/{module-name}/` 目录 - 适用于微前端架构或模块独立部署 #### 3. **自定义模块打包** 通过修改 `package.json` 添加新的构建命令: ```json { "scripts": { "build:custom": "vue-tsc --noEmit && cross-env VITE_MODE=your-module vite build" } } ``` ### 打包配置详解 #### 环境变量控制 ```typescript // vite.config.ts process.env.VITE_MODE // 控制打包目标模块 ``` - **未设置 VITE_MODE**:打包主应用(全部模块) - **设置 VITE_MODE=example**:只打包 example 模块 #### 入口文件切换 ```typescript // 根据 VITE_MODE 动态切换入口 entryFileNames: process.env.VITE_MODE ? `./src/engineeringModule/${process.env.VITE_MODE}/main.ts` : './src/main.ts' ``` #### 资源路径管理 ```typescript // SVG 图标目录动态配置 iconDirs: (() => { let dirs = [resolve(root, 'src/assets/icons')]; if (process.env.VITE_MODE) { // 只添加指定模块的图标 dirs.push(resolve(root, 'src/engineeringModule/' + process.env.VITE_MODE + '/assets/icons')); } else { // 添加所有模块的图标 engineeringModules.forEach(moduleName => { dirs.push(resolve(root, 'src/engineeringModule/'+ moduleName + '/assets/icons')); }); } return dirs; })() ``` #### 样式注入 ```typescript // SCSS 全局变量动态注入 additionalData: (() => { let style = `@import "@/assets/styles/globalStyle.scss";`; if (process.env.VITE_MODE) { style += `@import "@/engineeringModule/${process.env.VITE_MODE}/assets/styles/index.scss";`; } return style; })() ``` ### 打包优化策略 #### 1. **代码分割** ```typescript manualChunks: { // 第三方库单独打包 'vue-vendor': ['vue', 'vue-router', 'pinia'], 'element-plus-vendor': ['element-plus'], } ``` #### 2. **资源分类** - JS 文件:`js/[name]-[hash].js` - 图片资源:`images/[name]-[hash].[ext]` - 其他资源:`[ext]/[name]-[hash].[ext]` #### 3. **性能优化** - 使用 esbuild 压缩(比 terser 快 20-40 倍) - 生产环境移除 console 和 debugger - 不生成 source map(提高构建速度) - 启用依赖预构建和构建缓存 ### 打包输出示例 ``` dist/ ├── all/ # 全部模块打包 │ ├── assets/ │ │ ├── js/ │ │ │ ├── index-[hash].js │ │ │ ├── vue-vendor-[hash].js │ │ │ └── element-plus-vendor-[hash].js │ │ ├── images/ │ │ └── svg/ │ └── index.html ├── example/ # example 模块打包 │ └── ... └── test/ # test 模块打包 └── ... ``` --- ## 🌍 环境变量 ### 环境变量配置 项目使用 `.env` 文件管理环境变量(需要自行创建): ```bash # .env.development NODE_ENV=development VITE_API_BASE_URL=/api # .env.production NODE_ENV=production VITE_API_BASE_URL=https://api.your-domain.com ``` ### 自定义环境变量 在 `package.json` 的 `paramDescription` 中定义了关键参数: ```json { "paramDescription": { "VITE_MODE": "启动模块的文件夹名称", "VITE_API_BASE_URL": "请求的接口转发" } } ``` ### API 代理配置 开发环境下的 API 代理配置(`vite.config.ts`): ```typescript proxy: { ['/api']: { target: 'http://xxx.xxx.xxx.xxx:8000', changeOrigin: true, rewrite: path => path.replace(new RegExp('^api'), ''), }, } ``` --- ## 📝 代码规范 ### TypeScript 规范 - 所有 `.vue` 和 `.ts` 文件必须使用 TypeScript - 禁止使用 `any` 类型,使用 `unknown` 或具体类型 - 接口定义放在 `types/` 目录 ### SCSS 规范 项目建立了完整的全局 SCSS 变量系统: ```scss // 颜色变量 $primaryColor: #1e3a5f; // 主题色 $sidebar-bg-color: #1e3a5f; // 侧边栏背景 $whiteColor: #ffffff; // 白色 // 字号变量(四个值原则) $fontSize-xs: 12px; // 超小字号 $fontSize-sm: 14px; // 小字号 $fontSize-md: 16px; // 中标号 $fontSize-lg: 18px; // 大字号 // 间距变量(四个值原则) $padding-xs: 4px; // 超小内边距 $padding-sm: 8px; // 小内边距 $padding-md: 12px; // 中内边距 $padding-lg: 16px; // 大内边距 $margin-xs: 4px; // 超小外边距 $margin-sm: 8px; // 小外边距 $margin-md: 12px; // 中外边距 $margin-lg: 16px; // 大外边距 ``` ### 命名规范 #### 文件命名 - 组件文件:PascalCase(如 `SidebarItem.vue`) - 工具文件:camelCase(如 `http.ts`) - 模块目录:kebab-case(如 `user-management`) #### 组件命名 - 使用多单词名称(避免与 HTML 元素冲突) - 文件名与组件名保持一致 #### Store 命名 ```typescript // 模块名称为 user-management const useUserManagementStore = defineStore('user-management', { // store 定义 }); ``` ### 自动导入 项目配置了自动导入,无需手动导入以下内容: - Vue API(ref, reactive, computed 等) - Vue Router API(useRouter, useRoute 等) - Pinia API(defineStore 等) - Element Plus 组件 --- ## 🎭 组件多声明方式支持 ✨ NEW 本项目**完美支持三种 Vue 3 组件声明方式混用**,你可以根据团队习惯和项目需求灵活选择。 ### 三种声明方式对比 | 特性 | Options API | Composition API | Setup 语法糖 | | -------------------- | ----------- | --------------- | ------------ | | **代码简洁度** | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | | **类型推导** | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | | **逻辑复用** | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | | **学习曲线** | 低 | 中 | 中 | | **Vue 2 兼容** | ✅ | ❌ | ❌ | | **自动暴露** | ✅ | ❌ | ✅ | | **推荐场景** | Vue 2 迁移 | 复杂逻辑封装 | 新项目首选 | ### 1️⃣ Options API(选项式 API) **特点:** - Vue 2 经典写法,使用 `data`、`methods`、`computed` 等选项 - 结构清晰,易于理解 - 适合从 Vue 2 迁移的项目 **示例代码:** ```vue ``` ### 2️⃣ Composition API(普通函数声明) **特点:** - 使用 `setup()` 函数 - 需要显式 `return` 模板中使用的内容 - 更好的类型推导,逻辑复用更方便 **示例代码:** ```vue ``` ### 3️⃣ Setup 语法糖(Vue 3 推荐) **特点:** - Vue 3 推荐的写法 - 代码最简洁,自动暴露顶层内容 - 无需手动 `return` **示例代码:** ```vue ``` ### 🎯 混合使用示例 父组件使用 Setup 语法糖,子组件可以使用任意一种方式: ```vue ``` ### 📁 完整示例位置 项目中已包含完整的三种声明方式示例: ``` src/engineeringModule/test/views/layout/ ├── components/ │ ├── child.vue # Setup 语法糖示例 │ ├── OptionsApiComponent.vue # Options API 完整示例 │ └── CompositionApiComponent.vue # Composition API 完整示例 ├── DemoIndex.vue # 三种方式混合演示页面 └── components/README.md # 详细使用文档 ``` ### 🚀 运行示例 启动 test 模块查看演示: ```bash pnpm dev:test ``` 然后在左侧导航点击 **"组件声明演示"** 菜单。 ### ⚙️ 核心配置 项目已配置好支持多种声明方式,关键配置如下: **vite.config.ts** ```typescript AutoImport({ imports: ['vue', 'vue-router', 'pinia'], resolvers: [ElementPlusResolver()], dts: './auto-imports.d.ts', include: [/\.[tj]sx?$/, /\.vue$/, /\.vue\?vue/, /\.md$/], // ✅ 支持所有文件 }), Components({ resolvers: [ElementPlusResolver()], dts: './components.d.ts', types: [], // ✅ 支持非 setup 语法 }), ``` **tsconfig.json** ```json { "compilerOptions": { "allowSyntheticDefaultImports": true, // ✅ 允许默认导入 "strict": true } } ``` --- ## 🚀 部署 ### 构建产物 ```bash # 构建全部模块 pnpm build # 输出:dist/all/ # 构建单个模块 pnpm build:example # 输出:dist/example/ ``` ### 部署步骤 1. **构建生产版本** ```bash pnpm build ``` 2. **上传构建产物** - 将 `dist/` 目录上传到服务器 - 或使用 CI/CD 自动化部署 3. **配置 Web 服务器** **Nginx 配置示例:** ```nginx server { listen 80; server_name your-domain.com; root /path/to/dist/all; index index.html; location / { try_files $uri $uri/ /index.html; } location /api { proxy_pass http://backend-server:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` ### Docker 部署 ```dockerfile FROM nginx:alpine COPY dist/all /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` ### 多模块部署策略 #### 方案一:单体部署 - 构建全部模块(`dist/all/`) - 统一部署到一个服务器 - 适用于小型项目 #### 方案二:微前端部署 - 每个模块独立构建(`dist/example/`, `dist/test/`) - 部署到不同的子域名或路径 - 使用 qiankun、single-spa 等微前端框架集成 #### 方案三:按需部署 - 根据业务需求构建特定模块 - 动态加载远程模块 - 适用于大型分布式系统 --- ## 🎨 UI 设计规范 ### 主题色 ```scss $primaryColor: #1e3a5f; // 导航栏深蓝主题色 $primaryLight: #409eff; // Element Plus 主色 $sidebar-active-color: #00b2ff; // 侧边栏激活色 ``` ### 圆角规范 ```scss $border-radius-sm: 4px; // 小圆角 $border-radius-md: 6px; // 中圆角(Tab、按钮) $border-radius-lg: 8px; // 大圆角(卡片) $border-radius-xl: 12px; // 超大圆角 ``` ### 阴影规范 ```scss $button-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); // 按钮阴影 $collapse-hover-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); // 悬停阴影 ``` --- ## 🔍 开发工具 ### Code Inspector 项目集成了 `code-inspector-plugin`,支持点击页面元素直接跳转到 VSCode 对应代码位置。 **使用说明:** - 开发模式下自动启用 - 生产构建时自动禁用 - 点击页面任意元素即可定位到源码 ### 自动导入 使用 `unplugin-auto-import` 和 `unplugin-vue-components` 实现: - API 自动导入(ref, reactive 等) - 组件自动注册(ElButton, ElTable 等) - 类型提示自动生成 ### SVG 图标 使用 `vite-plugin-svg-icons` 管理 SVG 图标: ```vue ``` --- ## 📚 常见问题 ### Q: 如何添加新的工程模块? A: 1. 复制 `example` 或 `test` 目录 2. 重命名为新模块名称(使用 kebab-case) 3. 修改模块内的 `main.ts`、`router`、`store` 等文件 4. 在 `package.json` 中添加对应的启动命令 ### Q: 如何实现模块间通信? A: - 使用 Pinia 全局状态管理 - 使用事件总线(mitt) - 使用 localStorage/sessionStorage ### Q: 如何优化打包速度? A: - 使用 `pnpm` 替代 `npm` - 启用 Vite 依赖预构建 - 合理配置 `manualChunks` 进行代码分割 - 生产环境不生成 source map ### Q: 如何处理跨域问题? A: - 开发环境:使用 Vite 的 `proxy` 配置 - 生产环境:使用 Nginx 反向代理 --- ## 📄 许可证 MIT License --- ## 👥 贡献指南 欢迎提交 Issue 和 Pull Request! --- ## 📞 联系方式 如有问题,请通过以下方式联系: - Email: tj_ygy@163.com - GitHub Issues: [提交 Issue](https://github.com/your-repo/issues) --- **最后更新:** 2026 年 3 月 24 日