# vue_admin **Repository Path**: li-yangfei/vue_admin ## Basic Information - **Project Name**: vue_admin - **Description**: Vue3后台管理,后期可能加入部分GIS页面 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-12 - **Last Updated**: 2026-05-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vue_admin ## 目录 ## 通用功能 ### SVG图标封装 1. 安装 ```bash npm i vite-plugin-svg-icons -D npm install fast-glob --save-dev ``` 2. 配置 - `vite.config.js` ```js import path from 'path' import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' ... plugins: [ createSvgIconsPlugin({ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], symbolId: 'icon-[dir]-[name]' }) ] ... ``` - `main.js` ```js import 'virtual:svg-icons-register' ``` 3. 封装`SvgIcon`组件 ```vue ``` ## Mock vue_admin/ ├── mock/ # ✅ Mock 独立目录 │ ├── index.js │ └── ... ├── src/ │ ├── api/ # API 接口定义 │ │ └── ... │ ├── views/ # 页面组件 │ │ └── ... │ └── main.js ├── vite.config.js # ✅ 已配置 mock 插件 ├── vite.mock.config.js # ✅ Mock 配置文件 └── package.json 1. 安装 ```bash npm install vite-plugin-mock@2.9.6 -D npm install mockjs -D ``` 2. 配置文件 - 在项目根目录创建 vite.mock.config.js ```js // vite.mock.config.js import { viteMockServe } from 'vite-plugin-mock' export function setupMock(isBuild) { return viteMockServe({ // 是否启用 mock enable: !isBuild, // mock 文件目录 mockDir: 'mock', // 本地环境文件路径 localEnabled: true, // 生产环境是否启用(建议关闭,或按需开启) prodEnabled: false, // 监听文件更改 watchFiles: true, // 日志级别 logger: true, }) } ``` - 修改 vite.config.js ```js import { setupMock } from './vite.mock.config' export default defineConfig({ plugins: [setupMock(isBuild)], }) ``` 3. 创建 Mock 数据文件 ```js import Mock from 'mockjs' // 用户列表 const userList = [ { id: 1, username: 'admin', role: 'admin' }, { id: 2, username: 'editor', role: 'editor' }, ] export default [ // 获取用户列表 { url: '/api/user/list', method: 'get', response: () => { return { code: 200, message: 'success', data: userList, } }, }, // 获取用户详情 { url: '/api/user/:id', method: 'get', response: ({ query }) => { const { id } = query const user = userList.find((u) => u.id == id) return { code: 200, data: user || null, } }, }, ] ``` ## axios封装 1. 封装 ```js import axios from 'axios' // TAG: 创建axios实例 const request = axios.create({ baseURL: '/api', timeout: 5000, headers: { 'Content-Type': 'application/json', }, }) // TAG: 请求拦截器 request.interceptors.request.use( (config) => { const token = localStorage.getItem('token') if (token) { config.headers['Authorization'] = `Bearer ${token}` } return config }, (error) => { console.error('❌ 请求拦截器错误:', error) return Promise.reject(error) }, ) // TAG: 响应拦截器 request.interceptors.response.use( (response) => { const res = response.data if (res.code === 200 || res.code === 0) { return res.data } console.error('❌ 业务错误:', res.message || '未知错误') return Promise.reject(new Error(res.message || '业务错误')) }, (error) => { console.error('❌ 响应拦截器错误', error) if (error.response) { // 服务器返回了错误状态码 let message = '' const { status, data } = error.response switch (status) { case 400: message = '请求参数错误' break case 401: message = '未授权或token过期' break case 403: message = '没有权限访问' break case 404: message = '请求的资源不存在' break case 500: message = '服务器内部错误' break case 502: message = '网关错误' break case 503: message = '服务不可用' break default: message = data?.message || `请求失败 (${status})` } return Promise.reject(new Error(message)) } else if (error.request) { if (error.message.includes('timeout')) { return Promise.reject(new Error('请求超时,请检查网络')) } return Promise.reject(new Error('网络连接失败,请检查网络')) } return Promise.reject(error) }, ) export default request ``` 2. 调用 ```js // 无参数 request.get('/user/list') // 带参数(query string) request.get('/user/list', { params: { page: 1, size: 10, keyword: 'test' }, }) // 实际请求 → GET /api/user/list?page=1&size=10&keyword=test // 无参数 request.post('/user/create') // 带 JSON body 参数 request.post('/user/create', { name: '张三', age: 25, roles: ['admin'], }) // 实际请求 → POST /api/user/create Content-Type: application/json ``` ## 环境变量`.evn.xxx` import.meta.env.VITE_APP_API_BASE_URL > 原理: 1. 创建不同环境的配置文件,如`.env.dev`、`.env.prod`等 2. 修改`pakcage.json`中的`scripts`执行脚本的参数 ```bash scripts: { "dev": "vite --mode dev", } ``` 3. 运行的过程中node会将`.env+脚本中的参数`为名的文件中的值加载到`process.env`中,在代码中可以通过`import.meta.env.参数名称`来获取,在类似`index.html`中可以通过`%参数名称%`来获取 ## 静态资源压缩 1. 安装依赖 ```bash npm i -D vite-plugin-compression ``` 2. `vite.config.js`配置 ```js viteCompression({ // === 压缩算法 === algorithm: 'gzip', // 'gzip' | 'brotliCompress' | 'deflate' // === 输出文件后缀 === ext: '.gz', // gzip → .gz, brotli → .br // === 压缩阈值(字节),小于此值不压缩 === threshold: 10240, // 默认 10KB,推荐 1024 以上 // === 是否删除原文件(仅保留压缩文件)=== deleteOriginFile: false, // 一般设为 false,保留原文件作 fallback // === 压缩过滤 === filter: /\.(js|mjs|json|css|html|svg|ico|ttf|woff2?)$/i, // === 压缩级别 === // gzip: 1-11 (默认 9) // brotli: 0-11 (默认 11) compressionOptions: { level: 9 }, // === 是否在 dev 模式也启用(一般不需要)=== disable: false, }) ```