1.使用vue.js搭建页面

 1.1使用的模板插件Vuetify

  中文UI组件官网:https://vuetifyjs.com/zh-Hans/getting-started/quick-start

 1.2要实现的效果

 1.3创建Brand.vue初始化页面

  1. <template>
  2. <span>
  3. hello
  4. </span>
  5. </template>
  6.  
  7. <script>
  8. export default {
  9. name: "myBrand"
  10. }
  11. </script>
  12.  
  13. <!-- scoped:当前样式只作用于当前组件的节点 -->
  14. <style scoped>
  15.  
  16. </style>

 

  1.4首先是一个5列的表格 选用这个

  1.5复制模版

  1. <template>
  2. <div>
  3. <v-data-table
  4. :headers="headers"
  5. :items="brand"
  6. :pagination.sync="pagination"
  7. :total-items="totalDesserts"
  8. :loading="loading"
  9. class="elevation-1"
  10. >
  11. <template slot="items" slot-scope="props">
  12. <td>{{ props.item.name }}</td>
  13. <td class="text-xs-right">{{ props.item.calories }}</td>
  14. <td class="text-xs-right">{{ props.item.fat }}</td>
  15. <td class="text-xs-right">{{ props.item.carbs }}</td>
  16. <td class="text-xs-right">{{ props.item.protein }}</td>
  17. <td class="text-xs-right">{{ props.item.iron }}</td>
  18. </template>
  19. </v-data-table>
  20. </div>
  21. </template>

  

  headers:表头信息,是一个数组也就是表格的列信息

  text:表格列的名称   value:该列关联的字段   align:对齐方式   sortable:是否需要排默认false

  1. headers: [
  2. {text: '品牌id', value: 'id', align: 'center', sortable: true},
  3. {text: '品牌名称', value: 'name', align: 'center', sortable: false},
  4. {text: '品牌LoGo', value: 'image', align: 'center', sortable: false},
  5. {text: '品牌首字母', value: 'letter', align: 'center', sortable: true},
  6. {text: '操作', align: 'center', sortable: false},
  7.  
  8. ],
  • items:要在表格中展示的数据,数组结构,每一个元素是一行。在这里应该是品牌集合

  • pagination.sync:分页信息,包含了当前页,每页大小,排序字段,排序方式等。加上.sync代表服务端排序,当用户点击分页条时,该对象的值会跟着变化。监控这个值,并在这个值变化时去服务端查询,即可实现页面数据动态加载了。

  • total-items:总条数,在这里是品牌的总记录数

  • loading:boolean类型,true:代表数据正在加载,会有进度条。false:数据加载完毕。 

  1. <template slot="items" slot-scope="props">
  2. 这段就是在渲染每一行的数据。Vue会自动遍历上面传递的items属性,并把得到的对象传递给这段template中的props.item属性。我们从中得到数据,渲染在页面即可。
  1.  

1.6页面搭建完成接下来只需要使用watch监控页面数据发生改变时发送相应的ajax请求

  1. <template xmlns:v-bind="http://www.w3.org/1999/xhtml">
  2. <div>
  3. <v-layout class="px-3 pb-2">
  4. <v-flex xs2>
  5. <v-btn color="info" small>新增品牌</v-btn>
  6. </v-flex>
  7. <v-spacer/>
  8. <v-flex xs4>
  9. <v-col cols="12" sm="6" md="3">
  10. <v-text-field label="搜索" hide-details append-icon="search" v-model="key"></v-text-field>
  11. </v-col>
  12. </v-flex>
  13. </v-layout>
  14. <v-data-table
  15. :headers="headers"
  16. :items="brands"
  17. :pagination.sync="pagination"
  18. :toatl-items="totalBrands"
  19. :loading="loading"
  20. class="elevation-1"
  21. >
  22. <template slot="items" slot-scope="props">
  23. <td class="text-xs-center">{{props.item.id}}</td>
  24. <td class="text-xs-center">{{props.item.name}}</td>
  25. <td class="text-xs-center"><img v-if="props.item.image" v-bind:src="props.item.image" width="130" height="40"/>
  26. </td>
  27. <td class="text-xs-center">{{props.item.letter}}</td>
  28. <td class="text-xs-center">
  29. <v-btn color="success" small>修改</v-btn>
  30. <v-btn color="error" small>删除</v-btn>
  31. </td>
  32.  
  33. </template>
  34.  
  35. </v-data-table>
  36. </div>
  37. </template>
  38.  
  39. <script>
  40. export default {
  41. data() {
  42. return {
  43. totalDesserts: 0,
  44. desserts: [],
  45. loading: true,
  46. options: {},
  47. headers: [
  48. {text: '品牌id', value: 'id', align: 'center', sortable: true},
  49. {text: '品牌名称', value: 'name', align: 'center', sortable: false},
  50. {text: '品牌LoGo', value: 'image', align: 'center', sortable: false},
  51. {text: '品牌首字母', value: 'letter', align: 'center', sortable: true},
  52. {text: '操作', align: 'center', sortable: false},
  53.  
  54. ],
  55. brands: [],
  56. pagination: {},
  57. totalBrands: 0,
  58. loading: false,
  59. key: "",//搜索条件
  60. }
  61. },
  62. }
  63. </script>
  64.  
  65. <style scoped>
  66.  
  67. </style>
  1.  
  1. 在列的最后增加一列图标
  1. <template slot="items" slot-scope="props">
  2. <td class="text-xs-center">
  3. <v-btn color="success" small>修改
           <v-icon>edit</v-icon>//用一个图标来代替修改 
    </v-btn>
  4. <v-btn color="error" small>删除</v-btn>
  5. </td>
  6. </template>
  1.  

增加按钮和搜索框

  1. <v-layout class="px-3 pb-2"><!--代表是一行 -->
  2. <v-flex xs2><!--设置宽度 -->
  3. <v-btn color="info" small>新增品牌</v-btn>
  4. </v-flex>
  5. <v-spacer/> <!--自动补全中的的空间 -->
  6. <v-flex xs4>
  7. <v-col cols="12" sm="6" md="3">
  8. <v-text-field label="搜索" hide-details append-icon="search" v-model="key"></v-text-field>
  9. </v-col>
  10. </v-flex>
  11. </v-layout>

1.7对搜索框和分页,排序,每页记录数进行监控当数据发生改变时调用ajax

  1. //监控
  2. watch:{
  3. key(){
  4. this.loadBrands();
  5. },
  6. pagination:{
  7. //深度监控
  8. deep:true,
  9. handler(){
  10. this.loadBrands();
  11. }
  12. }
  13. },

1.8发送ajax方法

  1. methods: {
  2. loadBrands() {
  3. this.$http.get("/item/brand/page", {
  4. params: {
  5. page:this.pagination.page,//当前页
  6. rows:this.pagination.rowsPerPage,//每页记录数
  7. sortBy:this.pagination.sortBy,//排序字段
  8. desc:this.pagination.descending,//是否降序
  9. key: this.key//搜索条件
  10. }
  11. }).then(resq =>{
  12. this.brands=resq.data.items;
  13. this.totalBrands=resq.data.total;
  14. })
  15. }
  16. },
  1. this.$http.get("/item/brand/page", 通过vue.js的原型去配置的
    http.js中定义了
  1. Vue.prototype.$http = axios;// 将axios添加到 Vue的原型,这样一切vue实例都可以使用该对象

1.9config.js中请求地址的自动拼接 发送的任何请求都会自动拼接api

  1. const baseUrl = 'http://api.leyou.com'
  2. api: `${baseUrl}/api`,

2.后台的处理(使用restful风格)

2.1拿到ajax传递的参数

  1. @RestController
  2. @RequestMapping("brand")
  3. public class BrandController {
  4.  
  5. @Autowired
  6. private BrandService brandService;
  7. @GetMapping("page")
  8. public ResponseEntity<PageResult<Brand>> queryBrandPage(
  9. @RequestParam(value = "page", defaultValue = "1") Integer page,
  10. @RequestParam(value = "rows", defaultValue = "5") Integer rows,
  11. @RequestParam(value = "storyBy", required = false) String storyBy,
  12. @RequestParam(value = "desc", defaultValue = "false") boolean desc,
  13. @RequestParam(value = "key", required = false) String key) {
  14.  
  15. PageResult<Brand> result=brandService.queryBrandPage(page,rows,storyBy,desc,key);
  16. System.out.println(result);
  17. return ResponseEntity.ok(result);
  18. }
  19. }

2.2在servicer中处理//分页//过滤//排序//查询//结果集的封装

通过通用mapper操作数据库

  1. @Service
  2. public class BrandService {
  3. @Autowired
  4. private BrandMapper brandMapper;
  5.  
  6. public PageResult<Brand> queryBrandPage(Integer page, Integer rows, String storyBy, boolean desc, String key) {
  7. //分页 mapper自带的分页助手
  8. PageHelper.startPage(page, rows);
  9.  
  10. //过滤 select * from tb_brand where name like "%"+key+"%" or letter==key order by storyBy desc
  11. Example example = new Example(Brand.class);
  12. if (StringUtils.isNotBlank(key)) {
  13. example.createCriteria().orLike("name", "%" + key + "%").orEqualTo("letter", key.toUpperCase());
  14. }
  15.  
  16. //排序
  17. if (StringUtils.isNotBlank(storyBy)) {
  18. String orderByClause=storyBy+(desc? " desc":" asc");
  19. example.setOrderByClause(orderByClause);
  20. }
  21.  
  22. //查询
  23. List<Brand> list = brandMapper.selectByExample(example);
  24. if (CollectionUtils.isEmpty(list)){
  25. throw new LyException(ExceptionEnum.BRAND_NOT_FOND);
  26. }
  27. //帮我们把查询到的结果List进行封装 封装的结果集里面有Total,pageNum,pageSizedeng
  28. PageInfo<Brand> info = new PageInfo<>(list);
  29.  
  30. //封装结果集
  31. PageResult<Brand> result = new PageResult<Brand>(info.getTotal(),list);
  32.  
  33. return result;
  34.  
  35. }
  36. }
  1. PageInfo<Brand> info = new PageInfo<>(list);
    帮我们把查到的sql语句结果强转为PageInfo对象
  1. PageInfo对象中定义了很多的分页属性
    例如:
  1. private static final long serialVersionUID = 1L;
  2. //当前页
  3. private int pageNum;
  4. //每页的数量
  5. private int pageSize;
  6. //当前页的数量
  7. private int size;
  8. //当前页面第一个元素在数据库中的行号
  9. private int startRow;
  10. //当前页面最后一个元素在数据库中的行号
  11. private int endRow;
  12. //总记录数
  13. private long total;
  14. //总页数
  15. private int pages;
  16. //结果集
  17. private List<T> list;
  1.  

leyou_04_使用vue.js搭建页面—使用ajax完成品牌的查询的更多相关文章

  1. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  2. vue.js多页面开发环境搭建

    利用 vue-cli 搭建的项目大都是单页面应用项目,对于简单的项目,单页面就能满足要求.但对于有多个子项目的应用,如果创建多个单页面,显示有点重复,特别是 node_modules 会有多份相同的. ...

  3. 基于webpack和vue.js搭建开发环境

    前言 在对着产品高举中指怒发心中之愤后,真正能够解决问题的是自身上的改变,有句话说的好:你虽然改变不了全世界,但是你有机会改变你自己.秉承着“不听老人言,吃亏在眼前”的优良作风,我还是决定玩火自焚. ...

  4. 用Vue.js搭建一个小说阅读网站

    目录 1.简介 2.如何使用vue.js 3.部署api服务器 4.vue.js路由配置 5.实现页面加载数据 6.测试vue项目 7.在正式环境部署 8.Vue前端代码下载 1.简介 这是一个使用v ...

  5. ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

    一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自 ...

  6. Vue.js搭建路由报错 router.map is not a function,Cannot read property ‘component’ of undefined

    错误: 解决办法: 2.0已经没有map了,使用npm install vue-router@0.7.13 命令兼容1.0版本vue 但是安装完之后会出现一个错误: Cannot read prope ...

  7. Vue.js项目中使用 Ajax 和 FormDate 对象上传文件

    let param = new FormData(); param.append("paths", this.ruleForm.uploadPath); param.append( ...

  8. 用vue.js重构订单计算页面

    在很久很久以前做过一个很糟糕的订单结算页面,虽然里面各区域(收货地址)使用模块化加载,但是偶尔会遇到某个模块加载失败的问题导致订单提交的数据有误. 大致问题如下: 1. 每个模块都采用usercont ...

  9. Vue的理解:Vue.js新手入门指南----转

    最近在逛各大网站,论坛,以及像SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,楼主自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在 ...

随机推荐

  1. 【Tomcat】使用Tomcat部署Spring Boot项目生成的jar包

    介绍 简单来说,Tomcat是一个免费的,用于Java Web应用以及其它Web应用的一个Web服务器.(简单地概括一下,可能有误) 下载与安装 本文章目标是把Spring Boot Web项目生成的 ...

  2. php开发面试题---php 对swoole的理解

    php开发面试题---php 对swoole的理解 一.总结 一句话总结: 以战养学,实例驱动 swoole是披着PHP外衣的C程序:其实就是c.java那些语言里面的高阶功能:比如 持久连接.异步通 ...

  3. kafka ProducerConfig 配置

    kafka-clients : 1.0.1

  4. HTML5: HTML5 Canvas

    ylbtech-HTML5: HTML5 Canvas 1.返回顶部 1. HTML5 Canvas <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形. 在画布 ...

  5. python模块学习之HTMLTestRunner模块生成HTML测试报告

    #!/usr/bin/env python #-*- coding:utf-8 -*- from HTMLTestRunner import HTMLTestRunner import time im ...

  6. activiti7启动流程实例,动态设置assignee人

    package com.zcc.activiti03; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proc ...

  7. Cocos2d之运行Test项目

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 打开Test项目 路径为   C:\Dev\cocos2d-x-3.8.1\build 2.设定cpp-tests为启动项(当cpp ...

  8. Windows10下运行Android Studio3.3时关于AMD处理器不支持Intel硬件加速的解决办法

    我的电脑是Thinkpad E485系列,CPU是AMD Ryzen 5 2500U,电脑预装系统是Windows10 X64家庭版,如下图所示: 下载安装了Android Studio3.3,创建了 ...

  9. editplus 正则表达式 分组替换

    editplus :zz正则表达式替换 /开头的api+换行符 替换为   /开头的api+空格 \1后有空格 editplus :zz正则表达式替换 行首两个数字+换行符 替换为  行首两个数字+空 ...

  10. mybatis自学历程(二)

    传递多个参数 1.在mybatis.xml下<mappers>下使用<package> <mappers> <package name="com.m ...