微服务[学成在线] day02:CMS前端开发

基于激光雷达与视觉融合的四旋翼无人机室内避障方法研究 本文研究了一种基于激光雷达与视觉融合的四旋翼无人机室内避障方法。针对单一传感器在室内环境中的局限性,提出通过激光雷达提供精确几何距离、视觉相机补充语义信息的融合方案。研究内容包括:搭建ROS硬件平台集成单目相机与2D激光雷达;设计基于扩展卡尔曼滤波的传感器融合模型;改进VFH算法结合视觉深度图进行路径规划。实验验证表明,该方法在复杂室内环境下具有较高的鲁棒性、实时性与避障成功率,为解决无GPS信号环境下的无人机自主导航问题提供了有效方案。 阅读详情

🚩 写在前面

我为什么要花时间去写这个笔记?

由于在学习该项目的过程中发现了原讲义存在的一些问题,所以该笔记基于「学成在线」微服务项目 PDF 讲义进行编写,并且投入了时间去优化了笔记的格式、代码的高亮、重点的标记等。

以及一些原讲义中所描述的一些知识点使我无法理解的内容,我会对这些内容的表达方式进行修改或者提出一些问题,并且用我自己所理解的一些想法去重新的解释这个问题。

总结一下原 PDF 讲义中已知的一些问题:

  • 从 PDF 中复制出来的代码,部分特殊符号的编码有问题,并且不易被发现,例如横杠 -,从PDF直接复制出来的话是无法运行的。
  • 有时候一些重复且简单的代码,我们需要直接从讲义中直接复制,而部分PDF编辑器复制出来的代码格式可能会变乱,且PDF中没有代码高亮,代码可阅读性差,并且复制出来时会有代码缩进错乱等问题。
  • 部分内容是重点但在讲义中只是简单的描述,这并不方便我们后期回顾该课程的知识点,所以我在一些重点的内容上加上了更多的解释。

如有不足的地方,欢迎小伙伴们补充、填坑。

😎 知识点概览

为了方便后续回顾该项目时能够清晰的知道本章节讲了哪些内容,并且能够从该章节的笔记中得到一些帮助,所以在完成本章节的学习后在此对本章节所涉及到的知识点进行总结概述。

本章节为【学成在线】项目的 day02 的内容

  • vue 基础语法

  • 对 webpack与 webpack-dev-server 的基本使用,理解 webpack 的打包过程。

  • CMS 前端工程的基础构建

  • 解决前端跨域请求的问题,并理解前端请求数据的流程。

  • 配合使用 Element-UI 的 table 组件进行分页查询

目录

一、vue基础

vue基础部分内容的笔记略过,如过你仍需要该阶段的学习,阅读官方的讲义或者移步:https://cn.vuejs.org/v2/guide/ 进行阅读和练习。

二、webpack入门

0x01 概述

使用vue.js开发大型应用需要使用 webpack 打包工具,本节研究webpack的使用方法。

Webpack 是一个前端资源的打包工具,它可以将js、image、css等资源当成一个模块进行打包。

image-20200318175432171.png

0x02 使用webpack有什么好处呢?

从图中我们可以看出,Webpack 可以将js、css、png等多种静态资源 进行打包

  • 模块化开发
    程序员在开发时可以分模块创建不同的js、 css等小文件方便开发,最后使用webpack将这些小文件打包成一个文
    件,减少了http的请求次数。
    webpack可以实现按需打包,为了避免出现打包文件过大可以打包成多个文件。

  • 编译typescript、ES6等高级js语法
    随着前端技术的强大,开发中可以使用javascript的很多高级版本,比如:typescript、ES6等,方便开发,
    webpack可以将打包文件转换成浏览器可识别的js语法。

  • CSS预编译
    webpack允许在开发中使用Sass 和 Less等原生CSS的扩展技术,通过sass-loader、less-loader将Sass 和 Less的
    语法编译成浏览器可识别的css语法。

0x03 webpack的缺点

1、配置有些繁琐
2、文档不丰富

0x04 安装 npm

node.js 已经集成了npm工具,在命令提示符输入 npm -v 可查看当前npm版本,node可以直接去官网下载安装

设置包路径

npm config set prefix "C:\Program Files\nodejs\npm_modules"
npm config set cache "c:\Program Files\nodejs\npm_cache"

0x05 安装 cnpm

执行以下命令

npm install -g cnpm --registry=https://registry.npm.taobao.org

安装完成后执行命令 cnpm -v

image-20200318180041039.png

0x03 安装 webpack

node.js 安装包分为两种模式

  • 本地安装:仅将webpack安装在当前项目的node_modules目录中,仅对当前项目有效。
  • 全局安装:将webpack安装在本机,对所有项目有效,全局安装会锁定一个webpack版本,该版本可能不适用某个项目。全局安装需要添加 -g 参数

本地安装

npm install --save-dev webpack 或 cnpm install --save-dev webpack
npm install --save-dev webpack-cli (4.0以后的版本需要安装webpack-cli)

全局安装

全局安装加-g,如下:全局安装就将webpack的js包下载到npm的包路径下。

npm install webpack -g 或 cnpm install webpack -g  

安装 webpack 指定的版本:
进入webpacktest测试目录,运行:cnpm install --save-dev webpack@3.6.0
全局安装:npm install webpack@3.6.0 -g 或 cnpm install webpack@3.6.0 -g

0x07 入门程序

通过本入门程序体会webpack打包的过程及模块化开发的思想。

需求分析

通过入门程序实现对js文件的打包,体会webpack是如何对应用进行模块化管理。
对上边1+1=2的例子使用webpack进行模块化管理

定义 model01.js

在webpacktest01目录下创建model01.js

将本程序使用的加法运算的js方法抽取到一个js文件,此文件就是一个模块 ,代码如下

//定义add函数
function add(x, y) {
    return x+y;
}

//导出add函数
module.exports.add = add;

定义main.js

在webpacktest01目录下创建main.js,main.js是本程序的js主文件,包括如下内容:

1、在此文件中会引用model01.js模块
2、引用vue.min.js(它也一个模块)
3、将html页面中构建vue实例的代码放在main.js中。

var {add} = require("./model01.js")
var Vue = require("./vue.min")

// 实例化Vue对象
//vm :叫做MVVM中的 View Model
var VM = new Vue({
    el:"#app",//表示当前vue对象接管app的div区域
    data:{
        name:'黑马程序员',// 相当于是MVVM中的Model这个角色
        num1:0,
        num2:0,
        result:0,
        url:'http://www.itcast.cn'
    },
    methods:{
        change:function(){
            this.result = add(Number.parseInt(this.num1),Number.parseInt(this.num2));
        }
    }
});

打包测试

上边将 mode01.js 模块及 main.js 主文件编写完成,下边使用 webpack 对这些js文件进行打包

1、进入程序目录,执行 webpack main.js -o build.js ,这段指令表示将 main.js 打包输出为 build.js 文件执行完成,观察程序目录是否出现 build.js。

2、在创建一个html ,这里我命名为 vue_02.html 并 中引用 build.js

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>vue.js入门程序</title>
</head>
<body>
<div id="app">
    {{name}}
    <input type="text" v-model="num1">+
    <input type="text" v-model="num2">=
    <input type="text" v-model="result">
    <button v-on:click="change">计算</button>
</div>
</body>
<script src="build.js"></script>
</html>

运行html

image-20200318181454164.png

三、webpack-dev-server

0x01 测试环境搭建

webpack-dev-server 开发服务器,它的功能可以实现热加载 并且自动刷新浏览器。

创建一个新的程序目录,这里我们创建 webpacktest02 目录,将 webpack 入门程序( webpacktest01 )的代码拷贝进来,并在目录下创建 src 目录、dist 目录,并将main.js和model01.js拷贝到src目录。

image-20200318201120322.png

0x02 安装配置

安装webpack-dev-server

使用 webpack-dev-server 需要安装webpack、 webpack-dev-server 和 html-webpack-plugin三个包。

cnpm install webpackwebpack-dev-server html-webpack-plugin

安装完成,会发现程序目录出现一个package.json文件,此文件中记录了程序的依赖。

配置webpack-dev-server

在package.json中配置script

"scripts": {
  "dev": "webpack-dev-server --inline --hot --open --port 5008"
}

–inline:自动刷新
–hot:热加载
–port:指定端口
–open:自动在默认浏览器打开
–host:可以指定服务器的 ip,不指定则为127.0.0.1,如果对外发布则填写公网ip地址

此时package.json的文件内容如下:

{
  "devDependencies": {
    "html-webpack-plugin": "^3.2.0",
    "webpack-dev-server": "^3.10.3"
  },
  "scripts": {
    "dev": "webpack-dev-server --inline --hot --open --port 5008"
  }
}

devDependencies:开发人员在开发过程中所需要的依赖。
scripts:可执行的命令

0x03 webpack.config.js

在 webpacktest02 目录下创建 webpack.config.js, webpack.config.js 是 webpack 的配置文件。

在此文件中可以配置应用的入口文件、输出配置、插件等,其中要实现热加载自动刷新功能需要配置 html-webpack-plugin 插件。

html-webpack-plugin 的作用是根据 html 模板在内存生成 html 文件,它的工作原理是根据模板文件在内存中生成一个 index.html 文件。

配置模板文件

将原来的 vue_02.html 作为模板文件,为了和内存中的 index.html 文件名区别,注意将 vue_02.html 中的script 标签去掉,内容如下:

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>vue.js入门程序</title>
</head>
<body>
<div id="app">
    {{name}}
    <input type="text" v-model="num1">+
    <input type="text" v-model="num2">=
<input type="text" v-model="result">
<button v-on:click="change">计算</button>
</div>
</body>
</html>

配置 html-webpack-plugin

在 webpack.config.js 中配置 html-webpack-plugin 插件

var htmlwp = require('html-webpack-plugin');
module.exports={
    entry:'./src/main.js', //指定打包的入口文件
    output:{
        path : __dirname + '/dist', // 注意:__dirname表示webpack.config.js所在目录的绝对路径
        filename:'build.js' //输出文件
    },
    plugins:[
        new htmlwp({
            //生成的页面标题<head><title>首页</title></head>
            title: '首页',
            //webpack-dev-server在内存中生成的文件名称,自动将build注入到这个页面底部才能实现自动刷新功能
            filename: 'index.html',
            //根据vue_02.html这个模板来生成(这个文件请程序员自己生成)
            template: 'vue_02.html'
        })
    ]
}

启动

启动文件:
1、进入 webpacktest02目录,执行npm run dev
2、使用webstorm,右键package.json文件,选择 “Show npm Scripts”

打开窗口:

image-20200318223348318.png

双击 dev。
注意:dev 就是在 package.json 中配置的 webpack dev server 命令。
发现启动成功自动打开浏览器。
修改src中的任意文件内容,自动加载并刷新浏览器。

debug调试

使用了 webpack 之后就不能采用传统js的调试方法在 chrome 中打断点。

webpack 将多个源文件打包成一个文件,并且文件的内容产生了很大的变化,webpack 提供 devtool 进行调试,devtool 是基于 sourcemap 的方式,在调试时会生成一个 map 文件,其内容记录生成文件和源文件的内容映射,即生成文件中的哪个位置对应源文件中的哪个位置,有了 sourcemap 就可以在调试时看到源代码。

配置如下

1、在webpack.config.js中配置:

devtool: 'eval‐source‐map',

devtool: ‘eval‐source‐map’,

var htmlwp = require('html‐webpack‐plugin');
    module.exports={
    entry:'./src/main.js', //指定打包的入口文件
    output:{
    path : __dirname+'/dist', // 注意:__dirname表示webpack.config.js所在目录的绝对路径
    filename:'build.js' //输出文件
},
devtool: 'eval‐source‐map',
......

2、在js中跟踪代码的位置上添加debugger

一个例子:
在add方法中添加debugger

// 定义add函数
function add(x, y) {
    debugger
    return x + y
}

启动应用,刷新页面跟踪代码:
点击“计算” 即进入debugger代码位置,此时可以使用chrome进行调试了。

image-20200318223402386.png

无法正常启动调试?

谷歌浏览器中先按下 F12 打开调试模式后在点击 计算 按钮进行触发代码中的 debugger

0x04 总结一些坑

如果你根据黑马官方的项目讲义进行配置,并且一些环境遇到 命令无法找到 ,不用怀疑,其实你的配置并没有错,因为黑马提供的PDF文档有的部分配置,大部分人都是直接复制的,而不会浪费时间去一个个的敲(也没必要)当你复制到 IDE 编辑器中的时候,看起来跟文档一点区别都没有,例如下面的例子:

image-20200318210459873.png

从图片上可以看到,在IDE中看该配置没有任何问题,但是从外部的cmd中运行时,提示了未找到 webpack-dev-server 这个命令,但实际上博主已按网上的各种办法,例如将项目下的 node_modules 文件夹删除再重新 npm install --save 安装模块,但无果,仔细一看猜发现TM有其中一个横杠 - 不是正常的字符,导致无法找到该命令,原因猜测是该配置文件我是从讲义的PDF中直接复制导致的,但乍一眼看根本看不出问题。

建议用 JB系列的 IDE 替换项目文件夹下的 - 为 - (仔细一看,这两个杠还是优点区别的。。)

image-20200318212222010.png

本篇笔记也已全部替换。。

image-20200318212340138.png

启动成功,虽然踩坑花了不少时间,但是阅读错误信息的能力感觉提升了一些。

image-20200318214747054.png

四、CMS前端工程创建

0x01 导入系统管理前端工程

CMS系统使用Vue-cli脚手架创建, Vue-cli是 Vue 官方提供的快速构建单页应用的脚手架,github地址:
https://github.com/vuejs/vue-cli(有兴趣的同学可以参考官方指导使用vue-cli创建前端工程),本项目对 Vue-cli创建的工程进行二次封装,下边介绍CMS工程的情况。

0x02 工程结构

如果我要基于Vue-Cli创建的工程进行开发还需要在它基础上作一些封装,导入课程资料中提供Vue-Cli封装工程。
资料/xc-ui-pc-sysmanage.7z 拷贝到UI工程目录中,并解压,用WebStorm打开 xc-ui-pc-sysmanage 目录。

package.json

package.json记录了工程所有依赖,及脚本命令:

开发使用:npm run dev
打包使用:npm run build

webpack.base.conf.js

webpack.base.conf.js 就是 webpack 的 webpack.config.js 配置文件,在此文件中配置了入口文件及各种Loader。webpack 是通过vue-load解析 .vue 文件,通过 css-load 打包 css 文件等。

main.js

main.js 是工程的入口文件,在此文件中加载了很多第三方组件,如:Element-UI、Base64、VueRouter 等。
index.html 是模板文件。

src目录

src目录下存放页面及js代码。

  • assets:存放一些静态文件,如图片。
  • base:存放基础组件
  • base/api:基础api接口
  • base/component:基础组件,被各各模块都使用的组件
  • base/router:总的路由配置,加载各模块的路由配置文件。
  • common:工具类
  • component:组件目录,本项目不用。
  • mock:存放前端单元测试方法。
  • module:存放各业务模块的页面和api方法。

下级目录以模块名命名,下边以cms举例:

  • cms/api:cms模块的api接口
  • cms/component:cms模块的组件
  • cms/page: cms模块的页面
  • cms/router:cms模块的路由配置
  • statics:存放第三方组件的静态资源
  • vuex:存放vuex文件,本项目不使用
  • static:与src的平级目录,此目录存放静态资源它与assets的区别在于,static目录中的文件不被webpack打包处理,会原样拷贝到dist目录下

0x03 单页面应用介绍

单页面应用的优缺点:

优点:
1、用户操作体验好,用户不用刷新页面,整个交互过程都是通过Ajax来操作。
2、适合前后端分离开发,服务端提供http接口,前端请求http接口获取数据,使用JS进行客户端渲染。

缺点:
1、首页加载慢
单页面应用会将js、 css打包成一个文件,在加载页面显示的时候加载打包文件,如果打包文件较大或者网速慢则
用户体验不好。

2、SEO不友好
SEO(Search Engine Optimization)为搜索引擎优化。它是一种利用搜索引擎的搜索规则来提高网站在搜索引擎
排名的方法。目前各家搜索引擎对JS支持不好,所以使用单页面应用将大大减少搜索引擎对网站的收录。

总结:本项目的门户、课程介绍不采用单页面应用架构去开发,对于需要用户登录的管理系统采用单页面开发。

五、CMS前端页面查询开发

0x01 页面原型

1、创建页面

页面结构

在model目录创建 cms模块的目录结构

在page目录新建page_list.vue,扩展名为.vue。
.vue文件的结构如下:

<template>
<!‐‐编写页面静态部分,即view部分‐‐>
测试页面显示...
</template>
<script>
/*编写页面静态部分,即model及vm部分。*/
</script>
<style>
/*编写页面样式,不是必须*/
</style>

在页面的template中填写 “测试页面显示…”。
注意:template内容必须有一个根元素,否则vue会报错,这里我们在template标签内定义一个div。

页面路由

在 cms 目录下创建 page_list.vue 页面。
现在先配置路由,实现 url 访问到页面再进行内容完善与调试。

1、在cms的router下配置路由

import Home from '@/module/home/page/home.vue';
import page_list from '@/module/cms/page/page_list.vue';
    export default [{
        path: '/cms',
        component: Home,
        name: 'CMS内容管理',
        hidden: false,
        children:[
            {path:'/cms/page/list',name:'页面列表',component: page_list,hidden:false}
        ]
    }
]

2、在base目录下的router导入cms模块的路由

// // 导入路由规则
import HomeRouter from '@/module/home/router'
import CmsRouter from '@/module/cms/router'
// 合并路由规则
concat(HomeRouter)
concat(CmsRouter)

3、测试

启动工程,刷新页面,页面可以外正常浏览,并且看到“测试页面显示…”字样

2、Table组件测试

本功能实现的页面列表,用户可以进行分页查询、输入查询条件查询,通过查看 Element-UI 库,我们需要Table 表格、Form表单 及Pagination 分页组件。

进入Element-UI官方,找到 Table 组件,拷贝源代码到 vue 页面中,如下:

<template>
  <div>
    <el-table
      :data="tableData"
      border
      style="width: 100%">
      <el-table-column
        prop="date"
        label="日期"
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        width="180">
      </el-table-column>
      <el-table-column
        prop="address"
        label="地址">
      </el-table-column>
      <el-table-column
        prop="test"
        label="测试列">
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        tableData: [{
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄',
          test: '测试'
        }, {
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1517 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1519 弄'
        }, {
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1516 弄'
        }]
      }
    }
  }
</script>
<style>

</style>

测试:

通过查看代码发现,el-table 组件绑定了tableData模型数据,tableData模型数据在script标签中定义。

3、页面内容完善

根据需求完善页面内容,完善列表字段,添加分页组件。

<template>
  <div>
    <el-button type="primary" v-on:click="query" size="small">查询</el-button>
    <el-table
    :data="list"
    border
    style="width: 100%">
    <el-table-column prop="pageName" label="页面名称" width="120">
    </el-table-column>
    <el-table-column prop="pageAliase" label="别名" width="120">
    </el-table-column>
    <el-table-column prop="pageType" label="页面类型" width="150">
    </el-table-column>
    <el-table-column prop="pageWebPath" label="访问路径" width="250">
    </el-table-column>
    <el-table-column prop="pagePhysicalPath" label="物理路径" width="250">
    </el-table-column>
    <el-table-column prop="pageCreateTime" label="创建时间">
    </el-table-column>
    </el-table>
    <el-pagination
    layout="prev, pager, next"
    :page-size="this.params.size"
    v-on:current-change="changePage"
    :total="total" :current-page="this.params.page" style="float:right;">
    </el-pagination>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        list:[],
        total:50,
        params:{
          page:1,//页码
          size:2//每页显示个数
        }
      }
    },
    methods:{
      changePage:function () {
        this.query()
      },
    //查询
      query:function () {
        alert("查询")
      }
    }
  }
</script>

测试

0x02 API调用

1、定义

在cms模块的 api 目录定义cms.js,
在 cms.js 中定义如下js方法,此方法实现 http 请求服务端页面查询接口。

//public是对axios的工具类封装,定义了http请求方法
import http from './../../../base/api/public'

//页面查询
export const page_list = (page,size,params) => {
    //定义方法,请求服务端查询接口
    return http.requestQuickGet('http://localhost:31001/cms/page/list/'+page+'/'+size)
}

axios实现了http方法的封装,vue.js 官方不再继续维护 vue-resource,推荐使用 axios。

2、调用

前端 page_list.vue 页面导入cms.js,调用js方法请求服务端页面查询接口。

请求的参数根据后端的 Swagger 文档进行配置 http://localhost:31001/swagger-ui.html

配置

<script>
  //导入api
  import * as cmsApi from '../api/cms';
  export default {
    data() {
      return {
        list:[],
        total:50,
        params:{
          page:1,//页码
          size:2//每页显示个数
        }
      }
    },
    methods:{
      changePage:function () {
        this.query()
      },
    //查询
      query:function () {
        //调用服务端接口
        cmsApi.page_list(this.params.page, this.params.size).then((res) =>{
          //将res结果数据赋值给数据模型对象
          this.list = res.queryResult.list
          this.total = res.queryResult.total
        })
      }
    }
  }
</script>

0x03 跨域问题解决

测试 上边的代理 ,结果 报错如下 :

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin
'http://localhost:11000' is therefore not allowed access.

原因:浏览器的同源策略不允许跨域访问,所谓同源策略是指协议、域名、端口相同。

解决:采用 proxyTable 解决。

proxyTable 是什么?

vue-cli提供的解决vue开发环境下跨域问题的方法,proxyTable的底层使用了 http-proxymiddleware(https://github.com/chimurai/http-proxy-middleware),它是http代理中间件,它依赖 node.js,
基本原理是用服务端代理解决浏览器跨域:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUU8JtHj-1595563918814)(C:\Users\root\AppData\Roaming\Typora\typora-user-images\image-20200319111906042.png)]

cms跨域解决原理:

1、访问页面http://localhost:11000/

2、页面请求http://localhost:11000/cms

由于url由http://localhost:31001/cms…改为“http://localhost:11000/cms.",所以不存在跨域

3、通过proxyTable由node服务器代理请求 http://localhost:31001/cms.

服务端不存在跨域问题

具体的配置如下:

1、修改api方法中url的定义

请求前加/api前缀

//public是对axios的工具类封装,定义了http请求方法
import http from './../../../base/api/public'  //ES6 导入
let sysConfig = require('@/../config/sysConfig')
let apiUrl = sysConfig.xcApiUrlPre
//页面查询
export const page_list = (page,size,params) => {
  //定义方法,请求服务端查询接口
  return http.requestQuickGet(apiUrl + '/cms/page/list/'+page+'/'+size)
}

2、在 config/index.js 下配置 proxyTable

'/api/cms': {
    target: 'http://localhost:31001',
    pathRewrite: {
    '^/api': ''//实际请求去掉/api
}

0x04 分页查询测试

1、定义分页视图

 <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :page-sizes="[5,10, 20, 30, 100]"
      :current-page="this.params.page"
      :page-size="this.params.size"
      :total="this.total"
      layout="total, sizes, prev, pager, next, jumper"
      v-on:current-change="changePage"
      style="float:right;">
</el-pagination>

2、定义数据模型对象

 data() {
      return {
        list:[],
        total:0,  //数据总量
        params:{
          page:1,//默认页码
          size:10//默认每页显示个数
        }
      }
 },

3、定义分页方法,接收页码参数

      //触发分页参数变动
      handleSizeChange(val) {
        this.params.size = val
        console.log(`每页 ${val} 条`);
      },
      handleCurrentChange(val) {
        this.params.page = val
        console.log(`当前页: ${val}`);
      },

      //分页查询,接收page页码
      changePage(){
        this.query()
      },

      //查询
      query:function () {
        //调用服务端接口
        cmsApi.page_list(this.params.page, this.params.size).then((res) =>{
          //将res结果数据赋值给数据模型对象
          this.list = res.queryResult.list
          this.total = res.queryResult.total
        })
      }

修改完毕,分页测试效果如下

0x05 进入页面立即查询

目前实现的功能是进入页面点击查询按钮向服务端表求查询,实际的需求是进入页面立即查询。

那么如何实现?

这要用到 vue 的钩子函数,每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会 。

通常使用最多的是 created 和 mounted 两个钩子:

created:vue实例已创建但是DOM元素还没有渲染生成。

mounted:DOM元素渲染生成完成后调用 。

本例子在两个方法的任意一个都满足需求:

添加如下代码:

mounted() {
    //默认查询页面
    this.query()
}

重新刷新页面。

六、前端请求响应流程小结

参考 “讲义–>前后端请求响应流程.png”,如下:

根据图中所示,我们总结流程如下:

1、在浏览器输入前端url

2、前端框架 vue.js 根据 url 解析路由,根据路由找到 page_list.vue 页面

3、首先执行 page_list.vue 中的钩子方法

4、在钩子方法中调用 query 方法。

5、在 query 方法中调用 cms.js 中的 page_list 方法

6、cms.js 中的 page_list 方法通过 axios 请求服务端接口

7、采用 proxyTable 解决跨域问题,node.js 将请求转发到服务端(http://localhost:31001/cms/page/list)

8、服务端处理,将查询结果响应给前端

9、成功响应调用 then 方法,在 then 方法中处理响应结果,将查询结果赋值给数据模型中的total和list变量。

10、vue.js 通过双向数据绑定将list数据渲染输出 。

😁 认识作者

作者:👦 LCyee ,全干型代码🐕

自建博客:https://www.codeyee.com

记录学习以及项目开发过程中的笔记与心得,记录认知迭代的过程,分享想法与观点。

优快云 博客:https://blog.youkuaiyun.com/codeyee

记录和分享一些开发过程中遇到的问题以及解决的思路。

欢迎加入微服务练习生的队伍,一起交流项目学习过程中的一些问题、分享学习心得等,不定期组织一起刷题、刷项目,共同见证成长。

【电源专题】案例:对比不同电池在不同电流下的电池放电曲线 无 阅读详情

相关推荐

GoDaddy域名解析 到 阿里云域名DNS

一:登录GODaddy,点击“个人中心”,然后点击“管理域名” 二:域名解析 第一种:直接解析到对应的服务器 添加一个,类型默认A,主机填写二级域名前缀(image.主域名),指向填写目标服务器ip即可(注意目标服务器80端口是否开放) 第二种:将主域名dns转到阿里云域名下 三:若要修给为阿里云解析服务器,要做以下修改,点击“更改” 点击更改后出现如下页面,此时需要到阿里云官网云解析DNS下添加域名解析 四:阿里云添加域名解析...

xiaolinzi176的博客 6704

微服务[学成在线] day05:消息中间件 RabbitMQ

???? 知识点概览 为了方便后续回顾该项目时能够清晰的知道本章节讲了哪些内容,并且能够从该章节的笔记中得到一些帮助,所以在完成本章节的学习后在此对本章节所涉及到的知识点进行总结概述。 本章节为【学成在线】项目的 day05 的内容 RabbitMQ 的基本应用场景 使用原生RabbitMQ 库构建生产者与消费者模型 整合 Springboot 实现 RabbitMQ 生产者与消费者模型 目录 内容会比较多,小伙伴们可以根据目录进行按需查阅。 文章目录???? 知识点概览目录一、需求分析二、初

通往体面生活的路上 846

SPSS实战:如何用Harman单因素检验搞定共同方法偏差(附完整操作步骤)

本文提供了一份详尽的SPSS实战指南,手把手教你运用Harman单因素检验来诊断共同方法偏差。文章从核心概念讲起,逐步详解数据准备、SPSS操作步骤、结果解读与报告撰写,帮助研究者快速掌握这一关键的数据质量控制方法,确保量化研究结论的可靠性。

weixin_29263201的博客 1704

(99)Part26【作业】-后台管理CMS模块-02-后台管理系统CMS模块-前端

一、创建相关文件 guli-admin项目 1、api src/api 2、页面组件 src/views 3、路由配置 src/router/index.js // 内容管理 { path: '/ad', component: Layout, redirect: '/ad/list', name: 'Ad', meta: { title: '内容管理' }, children: [ { path: 'list',

希冀 365

数据分析项目:电商用户行为分析系统

本报告基于某电商平台用户行为数据(采样10%),通过清洗、探索性分析及多维度建模,旨在挖掘用户行为特征、商品销售规律及用户价值分层,为运营策略优化提供数据支持。原始数据字段:用户ID、商品ID、类目ID、行为类型、时间戳。长尾商品(购买量低)可考虑捆绑销售或限时折扣,提升动销率。长尾商品(购买量低)可考虑捆绑销售或限时折扣,提升动销率。,少数高活跃用户贡献大部分行为,多数用户行为次数较少。

Nervousr的博客 1702

SuccessFactors入门篇

SuccessFactors入门篇—— Employee Central(一)最近通过一个月左右的学习,拿到了SF EC(SuccessFactors Employee Central )模块SAP认证,所以打算把自己学习SF的整个过程以及相关资料和大家分享一下,相互切磋,共同进步。Employee Central简单了解Employee Central简单了解新的改变功能快捷键合理的创建标题,有...

qq_42288853的博客 1万+

vue 在使用element-ui时import 'element-ui/lib/theme-chalk/index.css‘时一直报错

1.在package.json中确认style-loader是否下载,如果下载,是否在config文件中进行配置 配置文件如下:       {         test: /\.css$/,         loader: 'style-loader!css-loader',         exclude: /node_modules/ } 如果仍然无法正常运行,则是因为在elmen...

Hi~豆豆麻麻 2万+

【Unity实战篇 】| Unity实现 文本框可以自适应大小,到达最大宽度之后再缩小字体

Unity实现 Text文本框可以自适应大小,到达最大宽度之后再缩小字体 需求:在文本框可以自适应大小拉伸的前提下,增加一个最大限制宽度,使其到达最大宽度后 再启用 Best Fit 实现自适应改变文字大小以适应文本框的大小。 在Unity中经常会用到文本组件的自适应大小功能,一般使用HorizontalLayoutGroup和ContentSizeFitter组件配合即可实现文本自适应的效果。

努力前行,总会成为自己心中的那道光 3万+

微服务[学成在线] day20:项目总结

???? 写在前面 我为什么要花时间去写这个笔记? 由于在学习该项目的过程中发现了原讲义存在的一些问题,所以该笔记基于「学成在线」微服务项目 PDF 讲义进行编写,并且投入了时间去优化了笔记的格式、代码的高亮、重点的标记等。 以及一些原讲义中所描述的一些知识点使我无法理解的内容,我会对这些内容的表达方式进行修改或者提出一些问题,并且用我自己所理解的一些想法去重新的解释这个问题。 总结一下原 PDF 讲义中已知的一些问题: 从 PDF 中复制出来的代码,部分特殊符号的编码有问题,并且不易被发现,例如横杠

通往体面生活的路上 3261

uniapp - 实现扫码功能自定义扫描二维码/条码界面+手电筒轻触照亮+扫码屏幕添加手动输入框,手机扫描二维码并跳转过程,调用手机原生摄像头进行扫码且自动识别执行事件(uniApp安卓苹果App端)

uniapp,app端,安卓app,苹果ios,uniapp扫码识别,二维码展示和扫码,uniapp如何实现扫码功能,uni-app实现扫码功能,二维码和一维码/条码扫描,UniApp实现扫描二维码,uniapp开发原生app页面的扫码功能,自定义扫码界面,uniapp怎么调用扫一扫功能,app自定义扫码界面,uniapp 自定义扫一扫页面,扫码手电筒功能,自定义扫描框,扫码报错怎么办,扫码黑屏,扫一扫摄像头黑屏,uniapp扫码原生插件,最新扫码组件,连续扫码,uniapp APP扫码,扫码后如何处理跳转

✅ 精选推荐文章 1万+

手把手教你学Simulink——基于Simulink的重复控制抑制周期性负载转矩扰动

传统的PI调节器在面对这类特定频率的周期性扰动时,会因积分器的相位滞后而导致转速出现明显的纹波(如6次、12次谐波),严重影响系统的控制精度和静音性能。:要在频率 fd​处获得较高的开环增益以抑制扰动,必须大幅增加PI的比例系数 Kp​,但这会牺牲系统的相位裕度,导致高频共振甚至系统失稳;:电机转速变化时,基频 fbase​会变,导致 6次谐波频率 6×fbase​也在变。设系统的采样周期为 Ts​,目标抑制的周期性扰动频率为 fd​(rad/s),则对应的周期采样点数 N=fd​Ts​2π​。

MHD0815的博客 256

学成在线--day01 搭建环境 CMS服务端开发

学成在线 第1天 讲义-项目概述 CMS接口开发 1 项目的功能构架 1.1 项目背景 受互联网+概念的催化,当今中国在线教育市场的发展可谓是百花齐放、如火如荼。 按照市场领域细分为:学前教 育、K12教育、高等教育、留学教育、职业教育、语言教育、兴趣教育以及综合平台,其中,职业教育和语言教育 的市场优势突出。 根据Analysys易观发布的数据显示,预计2019年中国互联网教育市场...

zgz102928的博客 1446

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

微服务[学成在线] day03:CMS页面管理开发

???? 知识点概览 为了方便后续回顾该项目时能够清晰的知道本章节讲了哪些内容,并且能够从该章节的笔记中得到一些帮助,所以在完成本章节的学习后在此对本章节所涉及到的知识点进行总结概述。 本章节为【学成在线】项目的 day03 的内容 使用 Spring data 提供的 PageRequest 模块进行分页查询的应用 使用 Spring data 提供 MongoDB 的dao接口进行前后端联调的 CRUD 操作 基于 VUE.JS 的前端模块化开发 使用统一的响应模型、状态码进行 RESTf

通往体面生活的路上 553

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

微服务实战学成在线day02——(三)CMS前端开发

本小节为CMS前端开发,涉及Element-ui,vue.js,proxyTable等技术。

聂泳的博客 514

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java ee实战教程_黑马JavaEE微服务学成在线视频教程学习平台项目实战

│ 学成在线-每日目标-V1.2.xlsx│├─day01 搭建环境 CMS服务端开发│ ├─代码│ │ xcEduService01.zip│ ││ ├─视频│ │ 01-项目概述-功能构架-项目背景.avi│ │ 02-项目概述-功能构架-功能模块和项目原型.avi│ │ 03-项目概述-技术架构.avi│ │ 04-项目概述...

weixin_28964423的博客 717

微服务实战学成在线day01——(一)搭建环境

学成在线项目的搭建,主要介绍了项目,还有完成一些基础性的工作。

聂泳的博客 527

阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_16-CMS前端工程创建-导入系统管理前端工程...

提供了基于脚手架封装好的前端工程 H:\BaiDu\黑马传智JavaEE57期 2019最新基础+就业+在职加薪\阶段5 3.微服务项目【学成在线】·\day02 CMS前端开发\资料\xc-ui-pc-sysmanage.7z _all的是完整的。不带all的是手写的第一部分的 解压出来 ,这里应包括了所有的依赖 build构建工程相关的js webS...

weixin_30566063的博客 216

微服务[学成在线] day06:页面发布以及课程管理

???? 知识点概览 为了方便后续回顾该项目时能够清晰的知道本章节讲了哪些内容,并且能够从该章节的笔记中得到一些帮助,所以在完成本章节的学习后在此对本章节所涉及到的知识点进行总结概述。 本章节为【学成在线】项目的 day06 的内容 使用 Spring boot 集成 RabbitMQ 和 GridFS 实现基于生产者和消费者模型的页面静态化发布的流程。 在本章节的知识点中,再次复习了基于 GridFS 和 RabbitMQ 的分布式静态页面发布的知识点,深化了记忆。 使用三级菜单实现课程计

通往体面生活的路上 627

微服务[学成在线] day09:Eureka、Feign、课程预览实现

???? 知识点概览 为了方便后续回顾该项目时能够清晰的知道本章节讲了哪些内容,并且能够从该章节的笔记中得到一些帮助,所以在完成本章节的学习后在此对本章节所涉及到的知识点进行总结概述。 本章节为【学成在线】项目的 day09 的内容 构建基于 Eureka 的服务注册中心 Ribbon 的基本使用,以及使用 Ribbon 来进行服务间的负载均衡调用 使用 Feign 实现服务之间的远程调用 课程预览功能开发 目录 文章目录???? 知识点概览目录一、Eureka 注册中心0x01 需求分析0

通往体面生活的路上 568

最新传智学成在线JAVAEE微服务项目实战视频教程

目录 ├─day01 搭建环境 CMS服务端开发 ├─day02 CMS前端开发 ├─day03 CMS页面管理开发 ├─day04 页面静态化 ├─day05 消息中间件RabbitMQ ├─day06 页面发布 课程管理 ├─day07 课程管理实战 ├─day08 课程图片管理 分布式文件系统 ├─day09 课程预览 Eureka Feign ├─day10 课程发布 ElasticSea...

u011576602的博客 992

阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_18-CMS前端页面查询开发-页面原型-创建页面和定义路由...

module下创建cms目录,里面存cms模块相关的页面 在cms下创建api和components目录,components下放的就是组件。 这个组件刚才介绍的base的下的组件不一样。base下的组件是被所有模块公用。cms下的组件是只给cms这个模块下用的 cms下 四个标准的目录结构 开始写页面 定义page_list.vue 页面列表 ...

weixin_30566063的博客 175

阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_09-webpack研究-webpack介绍

使用vue.js开发大型应用需要使用webpack打包工具,本节研究webpack的使用方法。 1.3.1 webpack介绍 Webpack 是一个前端资源的打包工具,它可以将js、image、css等资源当成一个模块进行打包。 从图中我们可以看出,Webpack 可以将js、css、png等多种静态资源 进行打包,使用webpack有什么好处呢? 1、模块化开...

weixin_30566063的博客 145

阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_10-webpack研究-安装nodejs

1.3.2.1 安装Node.js webpack基于node.js运行,首先需要安装node.js。 node -v:验证是否安装成功了。 转载于:https://www.cnblogs.com/wangjunwei/p/11548324.html...

weixin_30566063的博客 218

阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_20-CMS前端页面查询开发-页面原型-页面内容完善...

访问swaggerUI的接口 得到返回的json数据,就是我们页面上要显示的数据 复制到页面的数据这里 <el‐table :data="list" stripe style="width: 100%"> <el‐table‐column type="index" width="60"> </el‐table‐column&gt...

weixin_30566063的博客 160

微服务实战学成在线day01——(二)完成页面查询相关功能

完成了页面查询功能的服务端。

聂泳的博客 417

2017黑加传智java_传智黑马 Java在职加薪课 学成在线

传智黑马 Java在职加薪课 学成在线|____【传智播客】学成在线|____day20 Devops 项目总结|____day19 分布式事务|____day18 用户授权|____day17 用户认证 Zuul|____day16 Spring Security Oauth2|____day15 媒资管理系统集成|____day14 媒资管理|____day13 在线学习 HLS|____da...

weixin_30927801的博客 195
上一篇: 微服务[学成在线] day01:CMS接口开发
下一篇: 微服务[学成在线] day03:CMS页面管理开发
cory_lin
博客等级 码龄7年 22粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值