# vue-admin-2207 **Repository Path**: connerljlx_admin/vue-admin-2207 ## Basic Information - **Project Name**: vue-admin-2207 - **Description**: 2207班vue的后台管理项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-03-06 - **Last Updated**: 2023-03-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目基础搭建 + 项目目录 ```js utils // 存储 工具函数 api // 存储 接口函数 (单独抽离 model函数) ``` + 修改项目运行配置 ## 基础封装 接口相关 + axios二次封装 1 baseURL 存储在环境变量中 环境变量获取 process.env.环境变量名 获取 vueCli 预设环境变量 叫 NODE_ENV 值 开发环境下 development production 自定义环境变量: 项目根目录下 定义 .env文件 .env.development 存储 变量在开发环境下值 .env.production 存储变量在 生产环境下的值 如何定义环境变量语法如下 key=值 注意:自定义环境变量命名一定要 以 VUE_APP_变量名 否则拿不到 + 配置开发反向代理 (解决跨域问题) ```js devServer: { host: 'localhost', port: 3000, open: true, proxy: { // 所有 以 /conner开头请求 会触发这个反向代理 '/conner': { target: 'https://api.it120.cc', // 是否切换源 changeOrigin: true, // 请求前缀的路径重写 pathRewrite: { '^/conner': '/conner' } } } } 注意: 1 服务请求接口完整地址是 target+前缀pathRewrite之后的值+path (地址一定要真实地址是一致) 2 判断这个接口是不是真的有这个前缀,没有 重写为 "" 有 重写原来的值 ``` + 封装常用工具函数 https://api.it120.cc/conner # 为什么前后端分离 数据接口 一般都会添加 /api(语义就行也可以是其他前缀)这个请求前缀 因为 开发环境反向代码 所有请求 以 前缀开头 才能触发这个反向代理 # mock接口 前后端分离开发,后端和前端开发进度是同步进行 问题? 前端在开发时,后端接口还没好? 这个时候前端 根据接口文档 自己mock接口,(mock每一个接口 path 请求方式,返回数据格式都要和接口文档保持一致) 好处是:前端时请求自己的mock接口, 后端接口完成后,只需要将反向代理的源 改为 后端真实接口源即可(生产环境源后面记得改) 本地 利用mockjs 进行接口mock ## mockjs基本使用 + 安装 ```js npm i mockjs -D ``` + 基础使用 ```js /* Mock.mock(url[,type],data) 参数1 接口 path 参数2 请求类型 get post put delete 参数2 接口返回的数据 mockjs 生成随机数语法 量词 定义 字段名 修饰 数组长度、字符串长度、number大小、 字段自增(id) 数组 "arr|10" 固定长度为10数组 "arr|10-20" 产生10-20和数据数组 字符串 语法同数组 "str|3": "☆☆" 6个五角星 也可以给范围 number 一般都给范值 "num|10-20": 10 产生10-20之间的随机整数 自增 比如 id字段 { "id|+1": 1 } 快速生成不同类型 数据的 占位符 使用在 字段值中 值需要加引号 前面 @占位符生效 { icon: "@image" } Mock.mock('/api/itemLists', 'get', { code: 200, msg: 'success', "data|10-20": [ { "id|+1": 1, itemName: "@ctitle", desc: "@cparagraph", onsale: "@boolean", createAt: "@date", "thumb": "@image('100x100','@color', '牛夫人')" } ] }) */ ``` + 占位符 +
Type Method
Basic boolean, natural, integer, float, character, string, range, date, time, datetime, now
Image image, dataImage
Color color
Text paragraph, sentence, word, title, cparagraph, csentence, cword, ctitle
Name first, last, name, cfirst, clast, cname
Web url, domain, email, ip, tld
Address area, region
Helper capitalize, upper, lower, pick, shuffle
Miscellaneous guid, id
利用在线 mock平台进行mock (rap2.taobao.org fastmock easymock) 在线平台生成随机数语法 也是mockjs 利用软件mock apiPost # vueCli 中import和require区别 import 必须在 代码编译之前就引入 引入的文件 需要参与代码编译 require 可以按需引入 (编译后js代码中执行) 一般 一个 文件 引入后 后续 需要删除 建议使用require(区别醒目)4 单个分类 ``` cateName cateIcon enable pid 我的父级分类的id 特殊 值 -1 代表顶层分类 { id: 1, cateName: "电视", pid: -1 } { id: 2, cateName: "等离子电视", pid: 1 } ``` # element-ui 或 element-plus + 必填验证 ```js { required: true, message: 'xxx字段必填', // 验证不通过 提示文案 trigger: 'blur' // 验证触发的时机 默认是 blur } ``` + 常用类型 type验证 ```js { type: 'string', message: 'xccc' } /* 预定义类型有 string: Must be of type string. This is the default type. number: Must be of type number. boolean: Must be of type boolean. method: Must be of type function. regexp: Must be an instance of RegExp or a string that does not generate an exception when creating a new RegExp. integer: Must be of type number and an integer. float: Must be of type number and a floating point number. array: Must be an array as determined by Array.isArray. object: Must be of type object and not Array.isArray. enum: Value must exist in the enum. date: Value must be valid as determined by Date url: Must be of type url. hex: Must be of type hex. email: Must be of type email. any: Can be any type. */ ``` + pattern正则验证 ```js { pattern: /\w{3,7}/, message: 'xfg' } ``` + 自定义验证函数 ```js { validator: (rule,value, callback) => { if(验证通过) { callback() } else { callback(new Error('这是错误提示文案')) } } } ``` + 自定义 异步验证 场景: ```js // 返回promise then触发通过 catch触发 验证失败 /* asyncValidator: (rule, value) =>{ return axios.get('xxx', {params: {value}}) } */ { asyncValidator: (rule, value) => { return new Promise((resolve, reject) => { if (value < 18) { reject('too young'); // reject with error message } else { resolve(); } }); } } ``` # excel导入导出 https://docs.sheetjs.com/docs/demos/frontend/vue/ # 富文本编辑器 ueditor 百度 TinyMCE quill wangeditor # 数据可视化 常用图表插件 echarts 百度 vue技术栈 antv react技术栈 d3.js 国外图表插件 high-charts ## echarts 自定义文本内容 富文本 属性: "{a|标签里面文本内容}" # 地图 高德 百度 vue-baidu-map-3x # 登录鉴权 路由鉴权: 前端在 路由前置守卫中,判断缓存中是否有token 接口鉴权:将token 防到 接口请求头中, 发送给后端, 后端进行校验, 验证通过返回正常 code 0 200 正常返回数据 如果判断token过期 获取 失败 返回错误 code 401代表过期 403 无token # vuex持久化 原理: 在缓存中备份vuex 状态,vuex的状态改变(mutation),缓存也要同步一样 ,当我们刷新时,取缓存的备份状态 给 vuex state赋值即可 # 角色鉴权 每个用户都可以分配一个角色,不同角色可以访问 权限不同 (权限包括:侧边导航,路由、某个路由组件的某个操作 rabc 基于 角色 权限管理 ## 静态角色鉴权 这个项目会固定 若干角色, 所有角色 侧边导航 和 路由数据 都全部定义在前端代码中(建议存在vuex), 每个 导航 数据 和 路由数据 都会定义一个字段 roles,代表可以访问 该导航或该路由的 所有的角色,当用户登录成功后,返回role, 此时 对于 导航数组进行过滤,路由进行拦截 ```js { label: '商品列表', icon: 'Xxxx', path: '/xxxx', roles: ['admin', 'a', 'b'] } { path: 'xxx', component: xxx, meta: { roles: ['admin', 'a', 'b'] } } ``` 优点: 1 较为简单,不需要后端过多配合, 登录返回 对应用户的role即可 缺点: 代码 不灵活,权限定义在 前端代码中,后续 项目想要新增新的权限,只能重新该 前端源码,重新部署上线 适用于: 中小型,且 角色较为固定的项目 ## 动态角色鉴权 思路: 每个角色可以访问 导航菜单 和 路由 全部存储在数据库,前端 只定义 基础路由,用户登录成功后,再一次发请求,请求当前用户 可以访问的 权限数据 (侧边导航和权限路由),前端动态渲染,和动态添加路由 # lodash js工具