利用Vue.js实现求职在线之职位查询功能


Posted in Javascript onJuly 03, 2017

前言

Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的。相比于Angular.js,Vue.js提供了更加简洁、更易于理解的API,使得我们能够快速地上手并使用Vue.js。

本文主要介绍的是关于利用Vue.js实现职位查询功能的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

知识点:

v-on, v-for, v-if, props, $emit,动态Prop, Class 与 Style 绑定

P1 分页查询

利用Vue.js实现求职在线之职位查询功能查询参数

查询参数:公司名称company, 职位类型type, 月薪范围salaryMin salaryMax

说明:通过axios.post携带参数发出请求,后端采取分页查询的方式向前台返回指定条数的数据。主要利用MongoDB Limit()限制读取的记录条数, Skip()跳过指定数量的数据,数据量很小1w+。

// 分页
exports.pageQuery = function (page, pageSize, Model, populate, queryParams, projection, sortParams, callback) {
 var start = (page - 1) * pageSize; // 根据 page 和 pageSize 得到 skip 要跳过的记录量
 var $page = {
  pageNumber: page
 };
 async.parallel({
  count: function (done) { // 查询到总共有count条数据
   Model.count(queryParams).exec(function (err, count) {
    done(err, count);
   });
  },
  records: function (done) { // 查询得到排序和排除字段的记录
   Model.find(queryParams, projection).skip(start).limit(pageSize).populate(populate).sort(sortParams).exec(function (err, doc) {
    done(err, doc);
   });
  }
 }, function (err, results) {

  var list = new Array();
  for (let item of results.records) {
   list.push(item.toObject())
  }

  var count = results.count;
  $page.pageCount = parseInt((count - 1) / pageSize + 1); // 总页数
  $page.results = list; // 单页结果
  $page.count = count; // 总记录量
  callback(err, $page);
 });
};

有了分页函数,查询工作函数只要传入参数即可.

关于MongoDB的模糊查询

// 数据库命令,就是个正则表达式: / 参数 /
db.getCollection('jobs').find({company: /网易/})

// js里如果直接写 /data.company/会是个字符串,Model.find({})函数识别不了,只能用 new RegExp()
company: new RegExp(data.company)
// 查询工作
exports.findJobs = function (data, cb) {
 let searchItem = {
  company: new RegExp(data.company),
  type: new RegExp(data.type),
  money: { $gte: data.salaryMin, $lte: data.salaryMax }
 }
 for (let item in searchItem) { // 若条件为空则删除该属性
  if (searchItem[item] === '//') {
   delete searchItem[item]
  }
 }
 var page = data.page || 1
 this.pageQuery(page, PAGE_SIZE, Job, '', searchItem, {_id: 0, __v: 0}, {
  money: 'asc'
 }, function (error, data) {
  ...
 })
}

P2 展示查询结果

利用Vue.js实现求职在线之职位查询功能
查询结果

利用Vue.js实现求职在线之职位查询功能

数据结构

说明:查询到的数据结果是对象数组,通过嵌套使用v-for轻松实现内容的展示

// html
<div class="searchResult">
 <table class="table table-hover">
  <tbody class="jobList">
   <tr>
    <th v-for="item in title">{{ item }}</th>
   </tr>
   <tr v-for="(item, index) in searchResults" @click="showDesc(index)">
    <td v-for="value in item">{{ value }}</td>
   </tr>
  </tbody>
 </table>
</div>
// onSubmit()
Axios.post('http://localhost:3000/api/searchJobs', searchData)
.then(res => {
 this.searchResults = res.data.results   // 单页查询结果
 this.page.count = res.data.pageCount   // 总页数
 console.log('总页数' + this.page.count)  // 总数据量
 ...
})
.catch(err => {
 console.log(err)
})

P3 详情卡片

利用Vue.js实现求职在线之职位查询功能
详情卡片

说明: 通过点击单行数据显示自定义的详情框组件DescMsg来展示具体内容。

组成: 遮罩 + 内容框

思路: 点击父组件 SearchJob 中的单行数据,通过 props 向子组件 DescMsg传递选中行的数据 jobDesc 和 showMsg: true 显示子组件。点击子组件 DescMsg 除详情框外的其余部分,使用 $emit('hideMsg') 触发关闭详情页事件,父组件在使用子组件的地方直接用 v-on 来监听子组件触发的事件,设置 showMsg: false 关闭详情页。

// 父组件中使用 DescMsg
<DescMsg :jobDesc="jobDesc" :showMsg="showMsg" v-on:hideMsg="hideJobDesc"></DescMsg>
// 显示详情框
showDesc (index) {
 let item = this.searchResults[index]
 this.jobDesc = [
  { title: '标题', value: item.posname },
  { title: '公司', value: item.company },
  { title: '月薪', value: item.money },
  { title: '地点', value: item.area },
  { title: '发布时间', value: item.pubdate },
  { title: '最低学历', value: item.edu },
  { title: '工作经验', value: item.exp },
  { title: '详情', value: item.desc },
  { title: '福利', value: item.welfare },
  { title: '职位类别', value: item.type },
  { title: '招聘人数', value: item.count }
 ]
 this.showMsg = true
},
// 关闭详情框
hideJobDesc () {
 this.showMsg = false
}
// 子组件 DescMsg

<template>
 <div class="wrapper" v-if="showMsg">
 <div class="shade" @click="hideShade"></div>
 <div class="msgBox">
  <h4 class="msgTitle">详情介绍</h4>
  <table class="table table-hover">
  <tbody class="jobList">
   <tr v-for="item in jobDesc" :key="item.id">
   <td class="title">{{ item.title }}</td>
   <td class="ctn">{{ item.value }}</td>
   </tr>
  </tbody>
  </table>
  <div class="ft">
  <button type="button" class="btn btn-primary" @click="fllow">关注</button>
  </div>
 </div>
 </div>
</template>

<script>

export default {
 data () {
 return {
 }
 },
 props: {
 jobDesc: {
  type: Array,
  default: []
 },
 showMsg: {
  type: Boolean,
  default: false
 }
 },
 methods: {
 hideShade () {
  this.$emit('hideMsg')
 },
 fllow () {
  alert('1')
 }
 }
}
</script>

P4 页号

利用Vue.js实现求职在线之职位查询功能
页号

说明: 根据查询得到的总页数 count,规定一次最多显示10个页号。

思路: 通过v-for渲染页号,即v-for="(item, index) of pageList" ,并为每个li绑定Class 即 :class="{active: item.active} 。当页数大于10时,点击大于6的第n个页号时,页数整体向右移动1,否则整体向左移动1。为点击某一页数后item.active = true ,该页数添加样式.active

html

<!-- 底部页号栏 -->
<div class="pageButtons">
 <nav aria-label="Page navigation">
  <ul class="pagination">
   <li :class="{disabled: minPage}">
    <a aria-label="Previous">
     <span aria-hidden="true">«</span>
    </a>
   </li>
   <li v-for="(item, index) of pageList" :class="{active: item.active}">
    <a @click="onSubmit(index)">{{ item.value }}</a>
   </li>
   <li :class="{disabled: maxPage}">
    <a aria-label="Next">
     <span aria-hidden="true">»</span>
    </a>
   </li>
  </ul>
 </nav>
</div>

js

export default {
 data () {
 return {
  page: {
  selected: 0, // 选中页数
  count: 0,  // 总页数
  size: 10  // 最大显示页数
  },
  pageList: [
  {active: false, value: 1} // 默认包含页数1
  ]
 }
 },
 methods: {
  // index 代表从左到开始第index个页号,好吧我也搞混了,最多10个
 onSubmit (index) {
  if (index === -1) { // index为-1代表直接点击查询按钮触发的事件,初始化数据
  index = 0
  this.page.selected = 0
  this.pageList = [
   {active: false, value: 1}
  ]
  }
  Axios.post('http://localhost:3000/api/searchJobs', searchData)
  .then(res => {
  this.page.count = res.data.pageCount // 总页数
  let pageNumber = 1 // 默认第1页

  // 若index >= 6且显示的最后一个页号小于总页数,则整体向后移动1,选中的页号相应向左移动1,即index--
  if (index >= 6 && (this.page.count - this.pageList[9].value) > 0) {
   pageNumber = this.pageList[1].value
   index--
  } else if (index < 6 && this.pageList[0].value !== 1) {
   pageNumber = this.pageList[0].value - 1
   index++
  }
  this.pageList = [] // 初始化 pageList,之后会重新渲染
  this.page.size = (this.page.count > 10) ? 10 : this.page.count
  for (let i = 0; i < this.page.size; i++) {
   let item = {
   active: false,
   value: pageNumber
   }
   pageNumber++
   this.pageList.push(item)
  }
  // 改变当前选中页号下标样式,index 代表从左到开始第index个页号,最多10个
  this.pageList[this.page.selected].active = false
  this.pageList[index].active = true
  this.page.selected = index
  console.log(searchData.page)
  })
  .catch(err => {
  console.log(err)
  })
 }
 }
}

源码下载地址:Github源码

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
在浏览器中获取当前执行的脚本文件名的代码
Jul 19 Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 Javascript
jquery处理json对象
Nov 03 Javascript
纯js实现重发验证码按钮倒数功能
Apr 21 Javascript
jquery实现左右滑动菜单效果代码
Aug 27 Javascript
给angular加上动画效遇到的问题总结
Feb 17 Javascript
原生JS实现旋转木马式图片轮播插件
Apr 25 Javascript
js简单时间比较的方法
Aug 02 Javascript
浅谈Angular路由复用策略
Oct 04 Javascript
浅谈vue2 单页面如何设置网页title
Nov 08 Javascript
小程序实现选择题选择效果
Nov 04 Javascript
JS监听Esc 键触发事键
Apr 14 Javascript
Swiper实现轮播图效果
Jul 03 #Javascript
jQuery实现点击关注和取消功能
Jul 03 #jQuery
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
Jul 03 #Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
Jan 27 #Javascript
Bootstrap按钮组实例详解
Jul 03 #Javascript
详解使用vue实现tab 切换操作
Jul 03 #Javascript
关于jQuery.ajax()的jsonp碰上post详解
Jul 02 #jQuery
You might like
php生成xml简单实例代码
2009/12/16 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
基于node.js实现微信支付退款功能
2017/12/19 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
Python使用MONGODB入门实例
2015/05/11 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
对Python中的@classmethod用法详解
2018/04/21 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
python super的使用方法及实例详解
2019/09/25 Python
django实现支付宝支付实例讲解
2019/10/17 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
python中if及if-else如何使用
2020/06/02 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
GC是什么?为什么要有GC?
2013/12/08 面试题
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
离职报告范文
2014/11/04 职场文书
世界地球日活动总结
2015/02/09 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
python 破解加密zip文件的密码
2021/04/22 Python
python turtle绘图命令及案例
2021/11/23 Python