vue后台管理项目总结

vue后台管理项目总结,第1张

首先我们对api进行封装:

在src目录下创建 api的文件夹,在api文件夹里创建api.js文件 和 http.js文件。我们在里边分别进行接口文件和axios的封装。

1.http.js 里 先引入axios然后在axios.create方法里面配置请求的公共地址和超时时间。再创建请求拦截器和响应拦截器,请求拦截里可以设置loading加载,还可以读取本地存储里的token,如果token存在的话就给请求头统一加token(let token=localstorage.getitem('token'),这样就不用每次进后台,每个页面都加了。响应拦截里 先定义一个code来存放响应的状态码(let code=res.data.meta.status),判断res.data.meta.status是否是无效token(res.data.meta.msg=="无效token")如果过期的话就在.then(()=>{location.href='/login'})让他跳转到 login页面。否则就.catch(()=>{}).然后根据我们刚刚定义的状态码 对错误状态码进行精细控制,再在error里进行错误信息的处理,返回promise.reject(error) 最后用export default 导出这个axios的实例对象。

2.在api.js文件里存放我们请求需要的路径 导入我们封装好的axios,最后用export导出

登录页面的实现:

 1.使用element-ui组件或者其他组件进行静态布局 2.根据接口文档,模拟json数据 3.测试接口  4.验证规则:利用elment表单插件,判断验证规则是否通过,如果通过,获取前端用户输入信息,传入接口,发送请求 5.发送接口成功,后台验证数据后返回token,前台做下一步跳转 *** 作,同时提醒用户是否登录成功与失败信息 6.存储token,跳转页面

用户管理》用户列表》user.vue

 

分页:

本接口主要是后台分页:后台要求传入当前页数pagenum,每页条数pagesize。后台会返回总条数total,当前页数pagesize。使用分页插件实现分页样式,当条数改变时传入条数提交接口,当页数改变时传入页数提交接口 。

分页插件 @size-change(条数改变时触发)

        @current-change(页数发生改变时触发)

        :current-page(设置当前页码)

        :page-size(设置每页的数据条数)  layout是布局样式

        :total(设置总页数)

增加:

首先定义addform表单 给addform表单里的账号密码进行正则验证( this.$refs.addFormRef.validate(async valid => {})),如果正则验证通过的话就调用添加接口判断状态码if(res.data.status==200){成功: this.$message.success(res.meta.msg)}

    addUser() {

      this.$refs.addFormRef.validate(async valid => {

        if (!valid) return

        const res= await adduser(this.addForm)

        if (res.meta.status === 201) {

           this.$message.success(res.meta.msg)

          // 隐藏添加用户的对话框

          this.addDialogVisible = false

          // 重新获取用户列表数据

          this.getUserList()

        }

})

    },

编辑:先调用根据id查询 的接口 显示出原有的 数据。定义修改表单 进行验证 如果验证通过的话 就发起修改用户信息的数据请求

    editUserInfo() {

      this.$refs.editFormRef.validate(async valid => {

        if (!valid) return

        // 发起修改用户信息的数据请求

        const res= await edituser(

          {

            id: this.editForm.id,

            email: this.editForm.email,

            mobile: this.editForm.mobile

          }

               if (res.meta.status === 200) {

           // 关闭对话框

          this.editDialogVisible = false

          // 刷新数据列表

          this.getUserList()

          // 提示修改成功

          this.$message.success('更新用户信息成功!')         

        }

      })

    },

删除:根据id删除对应的用户信息 先d框询问是否删除,确定之后调用删除的接口

   async removeUserById(id) {

      // d框询问用户是否删除数据

      const confirmResult = await this.$confirm(

        '此 *** 作将永久删除该用户, 是否继续?',

        '提示',

        {

          confirmButtonText: '确定',

          cancelButtonText: '取消',

          type: 'warning'

        }

      ).catch(err => err)

      // 如果用户确认删除,则返回值为字符串 confirm

      // 如果用户取消了删除,则返回值为字符串 cancel

      // console.log(confirmResult)

      if (confirmResult !== 'confirm') {

        return this.$message.info('已取消删除')

      }

      const res = await deluser(id)

      if (res.meta.status === 200) {

          this.$message.success('删除用户成功!')

          this.getUserList()

      }

    },

查询:给查询的input进行双向数据绑定,将双向数据绑定的值放在渲染列表里请求的参数里 然后绑定点击事件 触发这个事件就行了

    async getUserList() {

   

       const res=await userlist(this.queryInfo)

   

        // console.log('用户列表',res);

      if (res.meta.status === 200) {

         this.userlist = res.data.users

         this.total = res.data.total

        this.$message.success(res.meta.msg)

      }  

    },

更改用户状态:

1.注意这里后台要求请求方式为put请求,也就是相当于axios的更新请求 2.注意这里点击切换时,把切换后的状态发送给后台存储。如果ajax发送失败,取反不改变当前用户数据里状态

    //接口要求:传入当前行信息-当前id,与用户状态(即在页面内数据绑定的那行的状态)

   async userStateChanged(userinfo) {

      console.log(252,userinfo) //当前用户对象

       const res = await changestatus({"id":userinfo.id,"status":userinfo.mg_state})

      if (res.meta.status === 200) {

         this.$message.success(res.meta.msg)

      }

      //除非提交失败,不能更改状态

      else{

          userinfo.mg_state = !userinfo.mg_state

          // this.$message.error('修改状态失败')

      }

    },

权限管理》角色列表

分配权限:

分配权限的样式设计需要引用element-ui样式分配权限的对话框 el-tree树形组件-show-checkbox:显示复选框node-key:设置选中节点对应的值 default-expand-all:是否默认展开所有节点:default-checked-keys 设置默认选中项的数组 ref:设置引用1.d框显示,布局调用el-tree组件, :props="treeProps" 绑定数据里的字 :default-checked-keys="defKeys" 默认选中   2.获取所有权限的数据  const res= await this.$http.get('rights/tree') ,渲染绑定  

3.默认选中如何实现?通过递归的形式,获取当前角色下所有最后一次出现children中的id,并保存到 默认defKeys 选中数组中 。递归会不断的遍历当前角色下childen是不是有值,如果没有,就拿当前层级下的id

4.提交更新权限-点击为角色分配权限-注意这里调用element两个方法来记录你选中了那些:1个是全选中方法getCheckedKeys(),1个是半选中方法getHalfCheckedKeys,在把它们合并成数组[105,116,117,150,101,104]。注意接口提交的时候要的是字符串

    async showSetRightDialog(role) {

        console.log('角色信息',role);

         this.roleId=role.id   //存储下角色id,更新时使用

         this.setRightDialogVisible=true  //打开窗口

         this.defKeys = []  //打开时把上次的选中清空下,防止累加重复

         //1.请求所有权限列表

          let res=await allrights('tree')

          console.log('所有权限',res);

          if (res.meta.status === 200) {

             

              this.$message.success(res.meta.msg)

              this.rightslist=res.data

              console.log('当前角色下所有权限',role);

            let arr=[]

            function fn(role){

                if(! role.children ){ return arr.push(role.id)}

                role.children.forEach(item=>fn(item))

            }

            fn(role)

            console.log('默认选择权限',arr);

            this.defKeys=arr

          } 

    },

商品管理》商品列表

这个页面主要就是请求接口进行渲染 然后进行增删改查 *** 作

分类参数:页面里的tag标签实现思路  1.下拉选择@change绑定数组[1,2,3],请求参数列表,传分类catID(数组中最后1个)和选择项tab切换里的属性activename(绑定v-model,通过name拿到)  2.拿到数据渲染,渲染到table表格里,别忘记给prop绑定自己数据字段  3.渲染的tag标签-给外面套一个作用域插槽,作用就是获取到当前行数据,给当前行绑定value,绑定是否可见  4.tag标签输入内容触发方法-把输入的内容加到原来数据里attr_vals里,合到一起提交  5.提交tab标签接口-需要大分类id,属性id,属性名字,tag拼接后的字符串,当前在哪个tab切换里

订单列表

思路- 0.布局-用到步骤条el-step组件,每个tab组件里套着表单组件。步骤条与tab如何联动?,可给tab声明1个激活索引v-model="activeIndex"同时每个tab子项给到name=“索引”,步骤条调用该索引   1.tab切换验证:切换下一个,得验证上一个是否选择?可用离开之前属性-:before-leave 调用方法,判断用户是否选择了下拉的3级列表  2.点击商品属性或商品参数面板,要根据上次选择的3级分类id请求对应数据。你怎么知道它点击的是商品属性,还是商品参数?点击时@tab-click="tabClicked"通过判断当前激活索引是多少,做相应的接口请求 4.提交必须的参数接口-看是否能提交进去,正则验证

点击上传-1.上传成功,会触发成功的事件,通达file文件里流信息,拿到临时路径存储后台要求的字段里 2.本地删除-从file流协议里找到你要删除的那个临时路径,从提交的数组中splice切掉 3.预览功能-通达file文件里流获取后台返回的正式地址,写到图片src里。

图片处理:

图片预览效果:

通过点击时当前文件流信息,获取后台会返回1个正式路径地址,你把此路径写入到图片中即可

  handlePreview(file){

           console.log(228,file);

          let url=file.response.data.url

           this.previewPath=url

           this.previewVisible=true

     },

   移除图片 *** 作:

在移除的时候删除的是临时路径 1. 如何获取将要删除的图片的临时路径 ?删除时会响应当前文件信息, 从提交表单图片pics数组中,找到这个图片对应的索引值。从该数组中splice切除掉

监听图片上传成功的事件-response[{pic:临时路径地址}]

    0.点击上传成功后 ,后台会返回临时路径和正式地址 1. 拼接得到一个图片信息对象 const picInfo = { pic: response.data.tmp_path } !!注意,因为后端接口需要传pic字段,所以拼接下  2. 将图片信息对象picInfo,push 到表单图片pics数组中

   handleSuccess(res){

          console.log(230,res); //成功响应有临时路径,还有正式地址

          let picStr={'pic':res.data.tmp_path}   //注意要按照接口里要求的键拼接 {'pic':'上传成功后的临时路径'}

           this.addForm.pics.push(picStr)  

    },

添加商品:

 add(){

           

           this.$refs['addFormRef'].validate(async (valid) => {

             //验证通过

              if (valid) {

                //此处有bug-当提交商品失败后,如果用户没有在次选择级联会有报错提醒用户,选择级联

                // this.addForm.goods_cat= this.addForm.goods_cat.join(',')

                //解决办法—深拷贝一份,表单绑定时用数据,提交接口时用深复制后的数据

                const form =JSON.parse(JSON.stringify(this.addForm))

                //提交接口-商品分类要字符串,声明的时候是数组,最后要转换下

                form.goods_cat=form.goods_cat.join(',')

                // 处理动态参数

                this.manyTableData.forEach(item => {

                  const newInfo = {

                    attr_id: item.attr_id,

                    attr_value: item.newVals.join(' ')

                  }

                  this.addForm.attrs.push(newInfo)

                })

                // 处理静态属性

                this.onlyTableData.forEach(item => {

                   const newInfo = {

                    attr_id: item.attr_id,

                    attr_value: item.newVals.join(' ')

                  }

                  this.addForm.attrs.push(newInfo)

                })

               

               form.attrs = this.addForm.attrs

                console.log(form)

                //提交接口

              const res=await addgoods(form)

                if(res.meta.status ===201){

                     this.$message.success(res.meta.msg)

                     this.$router.push('/goods')

                }

              } else {

                this.$message.error('请填写必要的商品信息')

                return false;

              }

        });

       }

数据统计》数据报表

0.安装echarts,建议不要装最新的,装这个 cnpm i echarts@4.9.0 -S

1. 导入 echarts——找百度echarts文档类似图表 https://echarts.apache.org/examples/zh/index.html   复杂版本的echarts图表 https://www.makeapie.cn

!!!注意此处,首页加载优化代码抽离时-已经在vue.config.js里配置过代码拆分抽离,此处按照常理生产环境可以注释掉,但是因为开发环境也要用,所以不能注释。在此处不注释,生产环境打包时会抽离掉.从中获取我们想要的。

   

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/940565.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-17
下一篇2022-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存