VUE技术与项目

vue 调试api接口详情

2019-07-19  本文已影响336人  web30

今天在调试api接口时,因为不够仔细出现了点小问题,在此记录避免后续再现。

  1. 在api目录下的home.js文件中新建接口
export function getPower (data) {
  return request({
    url: '/api/node/getPower',  // 后端请求的路径
    method: 'post',
    data
  })
}
  1. 因为当我们每点击一个按钮跳转到下个页面前,都是先路由跳转后再渲染出页面,我这里是分开两步写的,在time.vue文件中写的是路由跳转,在nodesee.vue文件中写的是具体业务逻辑。
// time.vue
nodeseeClick(){.
   this.$router.push({
         name: 'nodesee',    // 这里是跳转到下个页面的文件名
         params: {
          // item.参数,是后台提供的参数1请求后得到的具体参数,得到具体的参数后,就可以直接按得到的具体参数来请求后台的数据了
           andrProjectPointId: item.andr_project_point_id,
           andrProjectSignId: item.andr_project_sign_id,
           andrProjectId: item.andr_project_id,
           andrProjectGroupId: item.andr_project_group_id

           //  1:最开始在没有得到具体的参数前,按照后台提供的参数请求后台数据
            andrProjectPointId: '1',
            andrProjectSignId: '1',
            andrProjectId: '1',
            andrProjectGroupId: '1'
         }
      })
}
  1. 在nodesee.vue文件中引入getPower
import { getPower } from '@/api/home/home'
import qs from 'Qs'
  1. 具体逻辑
// nodesee.vue
export default {
    name: 'nodesee', 
    data () {
      return {
        tableData: [],  //定义一个空数组,并绑定到表格中(见*5.4)
        timeNode: {  //timeNode是我自己定义的对象名称
         // 以下是后台返回的数据
        andrProjectPointId: '',
        andrProjectSignId: '',
        andrProjectId: '',
        andrProjectGroupId: ''
      }
    }
  },
  // 跳转到节点可见页面
  methods: {
    // debugger     // 发送请求后页面报参数错误,在这启用debugger排错
    getPower () {
      getPower(qs.stringify(this.timeNode)).then(response => {
        if (response.data.retcode === 2000) {
          //lablePowerList是后台返回的数组
          this.tableData = response.data.data.lablePowerList
          // this.$message.success(response.data.retmsg)
        } else {
          this.$message.error(response.data.retmsg)
        }
      })
    },
     created () {
       this.getPower()
  }
}
</script>
  1. 以下是请求后台数据有问题后debugger及解决过程:
    *5.1 逻辑都写完后,点击按钮向后台发送请求,然鹅页面什么都没有渲染出来并且还报参数错误。


    image.png

*5.2 因为不知道是哪里出现的问题,我就直接在逻辑处启用debugger,F12控制台sources中显示返回的数据为空。


image.png

*5.3 检查后发现nodesee.vue页面中都没有获取到 time.vue页面路由传过来的参数,这个参数是一刷新就要获取到的,发现created函数中并没有写,我赶紧把路由的参数写进来后再次debugger,这时后台有返回数据了,但是只返回了<等级>这一个字段。

created () {
    // 以下前四项参数是从路由那跳转过来的
    this.timeNode.andrProjectPointId = this.$route.params.andrProjectPointId
    this.timeNode.andrProjectSignId = this.$route.params.andrProjectSignId
    this.timeNode.andrProjectId = this.$route.params.andrProjectId
    this.timeNode.andrProjectGroupId = this.$route.params.andrProjectGroupId
    this.getPower()
  }
image.png image.png

*5.4 因为只返回了一个字段,我想可能是我的字段和后台返回的字段不一样,我就去和后端再去确认下。后端回复<状态>处返回的字段对应的是数字,因为项目业务逻辑的关系,需要前端这里再做一次判断,然后我把之前封装好的判断状态的组件引入到nodesee.vue文件中来,并把后台返回的字段 is_open 填写到表格中,渲染后页面出了相对应的数字。

<el-table
        ref="multipleTable"
        border
        :data="tableData"  // 和data中定义的tableData[]绑定
        tooltip-effect="dark"
        style="width: 100%"
        @selection-change="handleSelectionChange">
        <el-table-column
          type="selection"
          width="60">
        </el-table-column>
        <el-table-column
          label="状态"
          width="200">
           //scope.row获得当前行的数据
          <template slot-scope="scope">{{ scope.row.is_open }}</template>  //is_open是后台返回的字段
        </el-table-column>
    </el-table>
import { formatNodeStatus } from '@/api/common/common'  // 这是引入封装好的组件

methods: {
// 循环标签/节点的状态
    formatNodeStatus (nodeStatus) {
       <!--0:对外部分可见 1:对外所有可见 2:对内 >  //这是对标签状态的定义
      return formatNodeStatus(nodeStatus)
       }
}
image.png

*5.5 渲染出相对应的数字并不是我们最终需要的效果,我们需要的是文字来表示,检查后发现原来是封装的组件formatNodeStatus 并没有被调用,加上后就可以渲染出数据了。
用户昵称没有渲染出数据,是因为我们后台忘记写了,所以这会只能空在这里了。

     <el-table-column
          label="状态"
          width="200">
          <template slot-scope="scope">{{ formatNodeStatus(scope.row.is_open) }}</template>
    </el-table-column>
image.png

总之,和后台交互发请求、调api接口都是需要非常仔细的。

api 接口调用注意事项:

methods: {
    // 个人中心 参与的项目
    getJoinedPro () {
      this.joinProject.userId = this.userId   // 赋值userId   
      this.joinProject.name = ''
      getJoinedPro(qs.stringify(this.joinProject)).then(response => {
        if (response.data.retcode === 2000) {
          this.tableData = response.data.data
          this.$message.success(response.data.retmsg)
        }
      })
    },
created () {
    this.userId = this.$store.state.userId   // vuex中取userId
    this.getJoinedPro()
  }
  <el-table-column
        prop="operation"
        label="操作"
        width="230">
        <template slot-scope="scope">  //  当前操作的那一行
            <el-button type="primary" size="mini" icon="el-icon-view" @click="seeprojectClick(scope.row)">查看</el-button>
        </template>
  </el-table-column>

效果图

image.png

代码

<el-form :label-position="labelPosition" label-width="90px" :model="joinProject">
        <div style="display: inline-block;margin-left: 25px">
          <el-image
            style="width: 80px; height: 80px"
            :src="joinProject.url_head">
          </el-image>
        </div>
        <div style="display: inline-block;margin-left: 20px;font-size: 14px;line-height: 60px">
              <div>用户昵称: {{joinProject.nickname}}</div>
              <div>手机号码: {{joinProject.tel}}</div>
         </div>
        <el-divider></el-divider>   
        <el-form-item  label="项目名称">
          <el-input v-model="joinProject.projectName"></el-input>
        </el-form-item>
        <el-form-item label="团队名称">
          <el-input v-model="joinProject.groupname"></el-input>
        </el-form-item>
        <el-form-item label="合同编号">
          <el-input v-model="joinProject.number "></el-input>
        </el-form-item>
        <el-form-item label="修改职位">
          <el-input v-model="joinProject.postname "></el-input>
        </el-form-item>
      </el-form>

在路由里定义

// 个人中心 参与的项目 查看项目
    seeprojectClick (row) {
        this.$router.push({
           path: '/home/seejoinProject',
           query: {
            // 以下3个参数是在同一功能,不同地方用到的参数
           projectId: row.andr_project_id,
           groupId: row.groupId,
           staffId: row.andr_project_staff_id,
        }
      })
    }

在data中定义公用对象来接受路由传过来的参数

 data () {
     return {
        userId: '',
        // 定义一个公用对象来接受路由传过来的参数
         route_query: {
            staffId: '',
            projectId: '',
            groupId: ''
        },
       // 表格中的 后端返回的参数
       joinProject: {
        groupId: '',
        url_head: '',
        nickname: '',
        tel: '',
        projectName: '',
        groupname: '',
        number: '',
        postname: ''
       }
     }
 }

接收从路由处传过来的参数并赋值

created () {
    this.route_query.groupId = this.$route.query.groupId
    this.route_query.projectId = this.$route.query.projectId
    this.route_query.staffId = this.$route.query.staffId
  }

在methods方法中定义后端要求的参数

methods: {
  var modifyPosition = {  // modifyPosition是我自己定义的对象名称 
        // 左边绿色是后端返回的参数
        'userId': this.userId,  // userId是一直要用到的,所以data中单独定义
        'staffId': this.route_query.staffId,  // 从data中定义的route_query中直接取数据定义
        'postName': this.joinProject.postname  //修改的是当前表格中的某个数据,直接从表格中获取就可以了,更新一就替换当前的旧数据了
      }
      modifyPostName(qs.stringify(modifyPosition)).then(response => {
        if (response.data.retcode === 2000) {
          this.$message.success(response.data.retmsg)
        }
     })
 }
上一篇下一篇

猜你喜欢

热点阅读