基于Vue+iview+SpringBoot的前后台传参模式示例

        如今,springboot和vue作为最热门的前后台框架技术,最近公司的项目只要是java实现,均以此两种框架+iview前端技术进行实现,因此本菜鸟特用以下两个框架编写的前后台代码进行前后端调用说明,其中包含跨域等关键代码,以及后台返回值的封装。希望能对广大技术开发朋友有所帮助,提供灵感,也请各位大佬能够提出好的意见或建议以求精益求精。在此先谢谢各位看官。

先贴出前端页面显示效果,因为目前只是我个人写的demo,所以是最简陋的版本,各位轻喷。

好了,准备好了就让我们一起接着往下看吧。


前后端涉及技术内容:
前端:vue+iview

后端:springboot+activiti

功能需求:无差别获取列表数据,并放在Table组件中展示。

先看一下界面效果吧:

下面贴出关键代码实现:

前端(Vue+iview)

<template>

  <Table border :columns="columns12" :data="data6">

    <template slot-scope="{ row }" slot="name">

      <strong>{{ row.name }}</strong>

    </template>

    <template slot-scope="{ row, index }" slot="action">

      <Button type="primary" size="small" style="margin-right: 5px" @click="show(index)">查看</Button>

      <Button type="error" size="small" @click="remove(index)">删除</Button>

    </template>

  </Table>

</template>

<script>

  import {getTableData} from '../api/activityManagement'

  import {getDate} from '../libs/tools'

  export default {

    name: 'TableData',

    data () {

      return {

        columns12: [

          { title: '序号', type: 'index', key:'index'},

          { title: '版本号', key: 'version'},

          { title: '流程名称', key: 'name'},

          { title: '流程Key', key: 'flowKey'},

          { title: '定义主键', key: 'defId'},

          { title: '实例数量', key: 'instanceQuantity'},

          { title: '创建时间', key: 'createDate',

            render: (h, params) => {

              // 这里要求h中的第一个参数是注册成功的组件

              if(params.row.createDate !== null){

                return h('div',getDate(new Date(params.row.createDate),'year')

                )

              }

            }

          },

          { title: '发布时间', key: 'publishDate',

            render: (h, params) => {

              if(params.row.publishDate !== null){

                return h('div',getDate(new Date(params.row.publishDate),'year')

                )

              }

            }

          },

          {

            title: 'Action',

            slot: 'action',

            width: 150,

            align: 'center'

          }

        ],

        data6: []

      }

    },

    mounted(){

  //在钩子函数中调用此方法

      this.getTableData()

    },

    methods: {

//在methods中定义此方法

      getTableData(){

  //根据ES6语法进行调用

        getTableData({}).then(res =>{

          console.log(res)

          if(res.data.responseCode === 1){

            this.data6 = res.data.responseData.data

          }

        })

      },

      show (index) {

        alert(index)

      },

      remove (index) {

        this.data6.splice(index, 1);

      }

    }

  }

</script>

        以上均以iview3.0版本的官方文档的Table组件为原型,并根据自己的需求稍加修改。(PS:官网demo真心好用,建议各位在实际开发过程中遇到困难先尝试仔细查看官方API,大部分的问题都可以得到有效解决)

其中在以上代码中,用到了两个自己封装的API,下面贴出关键代码。

关键方法说明:

①getTableData():以axios工具请求后台,获取列表中的数据。

import axios from 'axios'

axios.defaults.baseURL = 'http://ip:port/project_name/';

/**获取table的数据**/

export const getTableData = params => {

  return axios.request({

    url: 'flowDef/list', //配置的映射路径

    params: params,  //请求参数

    method: 'get' //请求方式(以get请求为例)

  })

}

②getDate():格式化时间为 yyyy-mm-dd hh:mm:ss

const getValue= num => {

  return num < 10 ? '0' + num : num

}

/**

* @param {Number} timeStamp 传入的时间戳

* @param {Number} startType 要返回的时间字符串的格式类型,传入'year'则返回年开头的完整时间

*/

export const getDate = (timeStamp, startType) => {

  const d = new Date(timeStamp)

  const year = d.getFullYear()

  const month = getValue(d.getMonth() + 1)

  const date = getValue(d.getDate())

  const hours = getValue(d.getHours())

  const minutes = getValue(d.getMinutes())

  const second = getValue(d.getSeconds())

  let resStr = ''

  if (startType === 'year') resStr = year + '-' + month + '-' + date + ' ' + hours + ':' + minutes + ':' + second

  else resStr = month + '-' + date + ' ' + hours + ':' + minutes

  return resStr

}

以上为demo中前端所涉及的全部代码,是不是十分容易呢。下面请看后端的关键代码:

先说一下解决跨域问题:

跨域:当一个请求的协议(例如:http)、域名(www.xxx.xxx)、端口(8080)三者之间任意一个与当前页面url(xxx://localhost:8081)不同即为跨域。

解决方案,网上有很多朋友都已经研究出了很成熟的解决方案,即使用以下代码即可:

@Component

public class OriginFilter implements Filter {

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override

    public void doFilter(ServletRequest req, ServletResponse res,

            FilterChain chain) throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;

        HttpServletRequest request = (HttpServletRequest) req;

        response.setHeader("Access-Control-Allow-Origin", "*");

        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");

        response.setHeader("Access-Control-Max-Age", "3600");

        response.setHeader("Access-Control-Allow-Headers", "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE");

        if (request.getMethod().equals("OPTIONS")) {

        response.setStatus(200) ;

            return;

        }

        chain.doFilter(req, res);

    }

    @Override

    public void destroy() {

    }

}

后台实际接口代码:

/**

    * 分页获取流程定义列表

    * @return

    */

    @RequestMapping("/list")

    @Transactional

    public JsonResult list(){

        JsonResult jr = new JsonResult() ;

        resultMap = new HashMap<String,Object>() ;

        try {

            List<FlowDef> list = flowDefService.list();

            jr.setResponseCode(1);

            resultMap.put("data",list) ;

            jr.setResponseData(resultMap);

            jr.setResponseMessage(ResultEnum.SUCCESS);

        }catch (Exception e){

            e.printStackTrace();

            jr.setResponseMessage(ResultEnum.EXCEPTION);

            jr.setResponseCode(1);

        }

        return jr;

    }

代码说明:JsonResult这是本人自己封装好的前后端交互数据,由三个属性构成,分别为Code(调用相应码),Message(调用结果信息,一般情况下Message和Code对应且成对出现)和Data(实际需要返回前台的数据)。这是为了将结果封装成Json格式,使得前后端传参结构更加统一便捷,以及使代码清晰明了。

这样返回前端的数据就变成了以下JSON格式:

{

    "responseCode": 1,

    "responseMessage": "SUCCESS",

    "responseData": {

        "data": [

            {

                key:value,

                ...

                ...

                ...

            }

        ]

    }

}


        总结:以上就是前后端调用的全部关键代码,因为本文只介绍前后端调用的基本方案,因此后台逻辑(Service层,Mapper层)具体实现并未详细列出,需要各位根据自己的实际业务需求进行封装和实现。

        大致思路就是:前端使用axios工具,根据配置好的映射路径对后台进行请求,后台获取指定的数据后,封装为JSON格式的数据并返回给前端,前端解析完成后再显示到Table组件中。

        好了,以上的代码demo是否能为各位看官带来一些前后端调用的思路呢,此文章内容比较浅显,对于各路好手也只是希望能尽绵薄之力,并有抛砖引玉之意。本菜鸟将抱着学习的态度,欢迎各位指教,最后

希望大家都能在技术的道路上渐行渐远,早日实现自己的理想。谢谢各位!

PS:由于最近工作需要,本文关键性源码均搭建在activiti工作流框架中,基于activiti工作流进行业务实现。如果有在这方面有经验或兴趣的小伙伴欢迎共同交流指正。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容