# admin-55 **Repository Path**: zhukou/admin-55 ## Basic Information - **Project Name**: admin-55 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2020-12-01 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 表单校验 * rules属性绑定 * data中定义规则 * 表单item上prop属性绑定 注意点: prop的值和规则的值以及表单的值需要保持一致 ### 在vue中如何获取dom元素 - 定义属性
111111
- 获取:this.$refs.qqq ### 如何携带token * 登录成功的时候将获取的token做本地缓存 * 需要做请求拦截====其他所有请求需要携带请求头 Authorization - api/index.js - 做请求拦截 获取本地缓存 - 将本都缓存的值添加到请求头上面去 ### 左侧菜单数据展示 - 封装函数 ===获取左侧菜单数据请求的函数 api/index.js - home.vue + 导入封装请求函数 + 调用这个函数获取数据,并且将数据 赋值给data中的menuList + 将数据循环出来 ====进行2层循环 步骤分析: - 静态组件布局编写===从官网复制过来 - 动态渲染左侧菜单导航===将获取的请求数据使用循环 - 配置属性默认值展开一个 ====查看官网配置属性 - 配置路由实现显示对应的组件 ### 做菜菜单导航图标的显示 + 引入iconfont.css文件 main.js中引入 + 一级图标 - 准备一个对象或者数组 iconObj: { 0: 'icon-user', 1: 'icon-tijikongjian', 2: 'icon-shangpin', 3: 'icon-danju', 4: 'icon-baobiao' }, - 图标标签属性绑定 class 然后根据索引找到对象中的哪一个类名进行显示 + 二级图标====直接在二级循环标题前面提加图标标签====写死 #### 左侧菜单步骤分析: - 1-显示组件菜单=====从官网复制 - 2-只展开一个 通过控制 index - 3-配置路由 ===点击谁右边就显示哪一个组件 + 配置项上面添加一个router属性 :router="true" + 配置唯一值index的值为path值=====:index="item2.path - 4-改变默认高亮颜色 active-text-color="#00ff00" - 5-点击当前只展开其他收起 :unique-opened="true" - 6-刷新保持最后一次的高亮 + 设置默认展开项 :default-active="defaultActive" + 点击 + 给当前每一项的二级菜单 绑定点击事件 并且获取当前的path值 + 将这个值赋值给 defaultActive 并且做本地缓存【刷新的时候还可以获取上一次的path值】 + 刷新后获取这个值 defaultActive=从本都缓存中拿 || 'users' - 7-解决二级菜单的每一项的右边框 .el-menu {border:none;} - 8-点击收起菜单功能 + 布局一个按钮 点击按钮 + 点击设置 collapse=true or false + 改变左侧侧边栏宽度样式的设置 + 关闭收起和展开的动画 :collapse-transition="false" ### 路由拦截 路由拦截和请求拦截的区别 请求拦截=====只要请求就拦截 路由拦截====只要路由值发生改变就拦截 ### 如何设置路由拦截 - 在router文件中设置路由前置拦截 router.beforeEach((to,form,next)=>{}) - 判断是不是lofgin路由值 是 就直接放行, - 判断是不是有token 有token就放行 没有就去login - 最后解决掉了问题会出现兼容性 解决方法如下 const originalPush = VueRouter.prototype.push; VueRouter.prototype.push = function push(location) { return originalPush.call(this, location).catch(err => err); }; 1-请求拦截====token 2-左侧菜单 3-路由拦截 #### 状态 // 点击按钮 /* 1-获取参数=== {uId:rows.id,type:rows.mg_state} 2-发送请求== */ #### 删除用户id * 封装删除用户的api请求函数 * 给删除按钮绑定点击事件 * 获取当前行用户id * 导入api请求函数 - 导入对话框api函数 .then()里面执行的就是点击确认按钮之后要做的事情 - 发送请求并且传入id - 成功后给出提示 - 再次调用初次进入获取数据请求的函数===刷新页面 #### 编辑用户 * 绑定点击事件 * 获取当前行的数据 * 显示对话框 并且将当前行的数据渲染到对话框中 * 表单校验 - 点击取消===关闭对话框 - 点击确认=== + 二次校验 + 发送请求 1、封装更改用户api函数 2、导入api函数 3、调用函数并且传入参数 4、成功后显示提示框+关闭对话框 5、重新渲染 #### 添加用户 * 找组件 对话框组件 * 点击按钮 - 显示对话框 - 校验表单 ======同时给表单数据做双向数据绑定 - 点击对话框中的确认按钮 + 二次校验 + 发送请求 1、封装更改用户api函数 2、导入api函数· 3、调用函数并且传入参数 4、成功后显示提示框+关闭对话框 5、重新渲染 #### 权限列表 * 布局表格组件 * 封装函数api * 请求数据并渲染 #### 角色列表 * 页面结构布局 * 发送请求获取数据并渲染 三级循环 一级===el-row 二级===el-row 三级===el-tag 优化: 1、结构布局中的el-tag的间距 2-边框 3-删除按钮 #### 删除权限 ====根据角色来删除 * 需要获取两个参数 分别是角色id 【经理】 和权限id 【就是展开的】 插槽 * 分装api函数 * 点击当前权限删除按钮 点击谁就获取谁的权限id ====共用一个函数 * 获取id然后根据id进行发送请求 * 重新渲染 #### 树形组件数据展示步骤 * 点击按钮显示对话框 * 封装api 获取树形组件中的数据函数 * 将数据渲染到组件上 - 获取每一行的数据中的children - 每一个children获取他的id 逐个获取children中的id 并将id存放至一个空数组中 + 收集,每个children中的id,总共需要收集3层===需要使用递归 使用递归就是你有children就继续找id 没有children就终止递归 - 最后将这个数组赋值给 default-checked-keys=【】 #### 给角色授权 * 点击对话框确认按钮 - 获取角色id === - 获取权限id=====需要获取所有选中的权限的id 并且以,拼接 rids = [ ...this.$refs.tree.getCheckedKeys(), ...this.$refs.tree.getHalfCheckedKeys() ].join() - 封装api函数 - 调用函数发送请求传入两个参数 - 成功后 关闭对话框+ 给出成功后的提示 - 重新调用初次进入函数并刷新页面 #### 分配角色 * 点击按钮 + 显示对话框 + 显示当前行的数据到组件上 + 显示角色数据列表 - 发送请求获取数据 - 将数据展示在级联选择器 - 点击谁就显示谁的内容在级联选择器上 - 点击确认按钮 + 封装api函数 + 发送请求 + 成功后关闭对话框 #### 获取商品分类 * 封装函数api * 调用函数api 并且传入三个参数 * 将数据进行渲染 #### vue-table-with-tree-grid 使用第三方组件库 * 下载 vue-table-with-tree-grid 分配权限+ 分配角色 vue-table-with-tree-grid #### 根据动态参数还是静态属性获取列表数据 =====选择了级联选择器 * 点击了级联选择器 就触发 * 获取分类id - 获取数组中最后一项的索引:arr.length-1 PS: arr=[1,2,3,4,5]========arr-1=4 arr[4]=5 - 获取数组中最后一项的值:arr[arr.length-1] * 获取only还是many 只需要设置v-model 和name的值 * 封装api函数 * 调用函数发送请求并且渲染数据 * 根据 activeName 的值来判断将获取的值赋值给谁 manyData 还是onlyData * 点击标签页 ===调用发送请求获取数据函数 #### 参数列表 * 获取级联选择器数据并渲染 需要配置 props 【帮我们设置显示什么数据的】 v-model 【获取你点击级联选择器之后的数据 ====id】 * 点击级联选择器 - 发送请求 【调用函数封装】 + 按钮禁用关闭 - 发送请求需要传递的参数 分类id======根据 级联选择器 v-model的数组的值 来获取数组中的租后一项 + 通过computed ===监听v-model 数组的长度的改变 ==3找数组的最后一项 only 还是many el-tabs的v-model * 点击 动态参数和静态属性 - 发送请求 【调用函数封装】 * 展开列表 - 按钮和表单的切换 按钮和表单是通过v-if v-else + 保证每一项的 v-if是唯一值 在获取的原始数据中添加属性 inputVisible - 表单聚焦 this.$nextTick(() => { console.log(this.$refs.saveTagInput, 777888) this.$refs.saveTagInput.focus() }) #### 添加el-tag * 失去焦点 1、获取表单值 并校验表单值不为空 2、显示按钮隐藏表单 3、发送请求 + 封装api函数 + 调用函数传入参数 + 成功后将数据直接显示到页面上 参数总结 1、级联 2、获取最后一项的id 3、禁用按钮 4、渲染表格 5、按钮和表单的切换以及添加数据 - 实现按钮和表达你的切换 - 表单显示时需要聚焦 - 失去焦点 + 表单和按钮切换显示 + 校验表单值 不能为空 + 发送请求 注意点:参数有5个 【麻烦】 + 成功后需要将数据显示出来 6、删除 其实调用的接口还是表单添加属性的接口,只不过需要传的参数中就需要把选中的移除即可 #### 添加参数 * 点击按钮 - 根据不同按钮显示对话框中不同的标题 需要点击的时候传参 - 显示对话框 + 布局 - 校验表单 - 点击对话框中的按钮 + 进行二次校验 + 封装api函数 + 调用并发送请求 + 成功后关闭对话框 + 更新数据列表 #### 步骤条和标签页如何进行关联 * 将标签页的name值从0开始计算 v-model=‘’获取就是从0开始的 * 步骤条是索引0 开始计算的 并且获取的这个索引是一个number值 * 将 标签页的值转换成number赋值给active即可 #### 显示参数和属性 * 判断当前属于第几个tabs切换屏 参数和属性执行的内容是一样的 * 复制之前获取分类参数和静态属性的函数api 进行封装 * 进入到参数 调用函数传入 many 或者进入到属性 传入 only * 循环参数和属性的数据 需要循环两次

{{item.attr_name}}

{{item2==''?'暂无数据':item2}}
* 将获取的数据进行截取 只获取5条 this.tableData = res.data.slice(0, 5) #### 部署本地服务器 * 启动phpstudy * 启动sql图形化工具并且导入sql * 在服务器文件中 cnpm i 然后在node app.js - 如果没有获取数据 就在黑窗口中 回车一下 * 将所有的基准url换成本机 127.0.0.1 //axios.defaults.baseURL = "http://klxin.cn:8888/api/private/v1" axios.defaults.baseURL = "http://127.0.0.1:8888/api/private/v1" app.listen(3000, 'ip') #### echarts * 下载包 * 导入包和他的模板 ===mounted 原因是他需要操作dom元素 * 配置项需要在data中先定义好 * 封装api函数 * 调用函数 =====mounted * 获取数据后将data中的配置项和获取的数据进行合并 合并有两种方法:1、使用扩展运算符 + lodash vue 2.x vue-cli 3. X和4.x npm i @vue/cli -g weBpaCK 4. X 实现优化的过程 * 关闭console.log - 下载 babel-plugin-transform-remove-console - babel.config.js "plugins": ["transform-remove-console"] #### 优化步骤-- 某些包文件 使用cdn: * vue.config.js中配置打包入口文件 * 将入口打包文件 改成 main-prod.js 和 main-dev.js * 在vue.config.js中配置哪些文件是不需要使用import文件导入【之后这些导入文件就可以删除了,打包的时候也不会打包到打包后的文件中】 //使用externals设置排除项 config.set('externals',{ vue:'Vue', 'vue-router':'VueRouter', axios:'axios', lodash:'_', echarts:'echarts', nprogress:'NProgress', 'vue-quill-editor':'VueQuillEditor' }) * 在public中index.html中引入cdn资源文件 #### element-ui做按需引入 * 在babel.comfig.js中配置文件代码 { "presets": [ ["es2015", { "modules": false }] ], "plugins": [["component", [ { "libraryName": "element-ui", "styleLibraryName": "theme-chalk" } ]]] } * 原先使用引入element-ui 就不需要了 全部删除 * 创建一个js文件做按需引入 import {} from 'element-ui 引入后需要注册 * 在原先使用 import引入 element-ui的地方引入上面的按需引入的js文件即可 * 在public中index.html中引入cdn资源文件 #### 优化 * console.log * 按需加载 element-ui * cdn加载 * 路由懒加载 SPA 单页和多页面的区别 单页 ===spa===不利于搜索引擎 爬虫 + nuxt【服务端渲染】 开发速度快 多页面===