IndexedDB的包装器JsStore - 分页功能

news2024/11/14 17:31:13

          JsStore是IndexedDB的包装器。它提供了简单的SQL像api,这是容易学习和使用。IndexedDb查询可以在web worker内部执行,JsStore通过提供一个单独的worker文件来保持这种功能。

        由于之前使用IndexedDB时,提供api不太丰富,就自己写了一个分页功能函数,后期使用JsStore时一直沿用之前分页功能函数(缺点:需把所有数据查询出来,通过函数进行筛选分页显示);其实JsStore提供了更为方便的分页查询功能,查询Api中提供了skip起始位和limit查询长度属性外,结合事务功能可以实现数据总长度的查询。

        这里是在之前“学员管理系统”基础上给大家演示,管理员列表通过JsStore的api来实现分页功能。由于在上篇进行功能叠加,所以登录部分就不作讲解了,自己可以先看这篇后,再来了解该篇分页内容。

地址:https://blog.csdn.net/jiciqiang/article/details/128311568?spm=1001.2014.3001.5501JsStore是IndexedDB的包装器。它提供了简单的SQL像api,这是容易学习和使用。IndexedDb查询可以在web worker内部执行,JsStore通过提供一个单独的worker文件来保持这种功能。这里将之前使用IndexedDB写的登录功能,改为JsStore来实现。对于事务,简单的理解就是,一个事务里的操作,要么全部执行成功,要么全部执行失败。https://blog.csdn.net/jiciqiang/article/details/128311568?spm=1001.2014.3001.5501

需要实现效果图如下:

一、页面开发

        在上篇“IndexedDB的包装器JsStore - 实现登录功能及事务处理”上,路由定义中已创建好“/sys/index”路由地址作为管理员列表页显示。这里先完善页面列表显示样式及相关变更、函数的定义。index.vue中代码如下:

html代码:

<template>
<div class="index-wrap">
  <el-breadcrumb separator-class="el-icon-arrow-right">
    <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
    <el-breadcrumb-item>管理员列表</el-breadcrumb-item>
  </el-breadcrumb>
  <br /><br />
  <div class="filter-wrap">
    <div class="item left">
      <el-form :inline="true" class="demo-form-inline">
        <el-form-item label="账号">
          <el-input size="small" v-model="keyword" placeholder="请输入账号"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button size="small" type="primary" @click="updateUserList">查询</el-button>
        </el-form-item>
      </el-form>
    </div>
    <div class="item right">

    </div>
  </div>

  <div class="table-wrap">
    <el-table
      :data="tableList"
      style="width: 100%">
      <el-table-column prop="username" label="账号"></el-table-column>
      <el-table-column prop="createtime" label="创建日期"></el-table-column>
      <el-table-column prop="updatetime" label="更新日期"></el-table-column>
    </el-table>

    <div style="padding-top: 30px; text-align: right;">
      <el-pagination
        background
        layout="prev, pager, next"
        :page-size="pageSize"
        :total="pageTotal"
        @current-change="currentPageChange">
      </el-pagination>
    </div>
  </div>

</div>
</template>

javascript代码:

<script>
export default {
  data () {
    return {
      //查询关键字
      keyword: "",
      /**
       * 列表数据
       */
      tableList: [],

      page: 1,
      pageSize: 5,
      pageTotal: 13,
    }
  },
  created() {

  },
  methods: {
    /**
     * 分页事件
     */
    currentPageChange(e){
      this.page = e;
      this.updateUserList();
    },
    /**
     * 获取用户列表数据
     */
    updateUserList(){
      
    },
    //end
  }
}
</script>

页面效果如下:

二、分页查询

2.1 用户模型中添加查询函数

        在上篇“IndexedDB的包装器JsStore - 实现登录功能及事务处理”中,db/model/user.js创建了用户模型类,在这里我们添加分页查询getPageList()函数。

        对传入参数进行判断,保证必须字段完整性。代码如下:

import connection from "@/db/index.js";

export class UserService {
  constructor(){
    this.tableName = "Users";
  }

  //略...


  /**
   * 分页查询功能
   * @param {Object} params
   */
  getPageList(params){
    params = 'undefined'===typeof params ? { page: 1, pageSize: 10 } : params;

    if('undefined'===typeof params['page']) params['page'] = 1;
    if('undefined'===typeof params['pageSize']) params['pageSize'] = 10;

    return connection.select({
      from: this.tableName,
      skip: (params.page - 1) * params.pageSize,		//查询超始位置
      limit: params.pageSize,							//查询范围
      order: {
        by: "updatetime",
        type: "desc"
      },
    })
  }

  //略...
}

2.2 API接口中添加查询函数

        然后在api/index.js中,添加分页查询getPageDataList()函数,代码如下:

import { UserService } from '@/db/model/user'

const Users = new UserService();

/**
 * 获取分页参数
 */
export const getPageDataList = (params) => {
  return Users.getPageList(params);
}

/**
 * 登录
 */
export const loginInfo = (params) => {
  return Users.login(params);
}


//略...

2.3 引入页面查询数据列表

        在index.vue的updateUserList()函数中执行getPageDataList()函数,进行分页查询。获取到当前分页范围数据列表后,将日期进行格式化,并通过map生成新数组赋值给tableList变量。

import { getPageDataList } from '@/api'
import { formatDate } from '@/utils/utils'
export default {
  data () {
    return {
      //查询关键字
      keyword: "",
      /**
       * 列表数据
       */
      tableList: [],

      page: 1,
      pageSize: 5,
      pageTotal: 0,
    }
  },
  created() {
    this.updateUserList();
  },
  methods: {
    /**
     * 分页改变
     */
    currentPageChange(e){
      this.page = e;
      this.updateUserList();
    },
    /**
     * 获取用户列表数据
     */
    updateUserList(){
      let param = {
        page: this.page,
        pageSize: this.pageSize
      }

      if(this.keyword){
        param['where'] = {
          username: this.keyword
        }
      }
      //查询数据
      getPageDataList(param).then(res => {
        this.tableList = res.map(item => {
          item['createtime'] = formatDate(item.createtime);
          item['updatetime'] = formatDate(item.updatetime);
          return item;
        });
        console.log('getPageDataList', res);
      }).catch(e => {
        console.error(e);
      });
      //ajax end
    },
    //end
  }
}

        目前这些操作完成后,页面只有一条当前登录账号信息,所以这里我们需要手动插入多条测试数据,来完成分页功能的数量。在create()函数中,运行一次循环追加10条测试用户数据。addUserInfo()在上一篇中已使用,这里不再详解。代码如下:

created() {
	for(var i = 0; i < 10; i++){
	  addUserInfo({
		username: "test-admin-" + i,
		password: "123456",
		role: 2
	  });
	}

	this.updateUserList();
}

        完后数据插入后,注释掉该代码:

created() {
	/*
	for(var i = 0; i < 10; i++){
	  addUserInfo({
		username: "test-admin-" + i,
		password: "123456",
		role: 2
	  });
	} */

	this.updateUserList();
}

        获取数据列表结构如下图:

         此时页面效果如下:

        我们把变量page改成2后,则可以查询到第2页的数据,代码如下:

data () {
	return {
	  //查询关键字
	  keyword: "",
	  /**
	   * 列表数据
	   */
	  tableList: [],

	  page: 2,
	  pageSize: 5,
	  pageTotal: 0,
	}
}

        页面效果如下:

三、结合事务获取分页数

        前面已完成了分页查询功能,但是这里还缺少一个数据,当前条件下数据的总条数。这里需要结合事务,同时查询到总条数和当前页数据列表。事务在上一篇中已使用,还在之前的transaction.js中创建getPageData()函数,用来实现事务的查询。添加如下代码:

const userTableName = "Users";

/**
 * 获取分页数据
 * @param {Object} ctx
 */
async function getPageData(ctx){
  

}

//获取分页数据
window.getPageData = getPageData;

3.1 开始事务

        执行start()函数开始事务,并准备查询条件,当where对象存在并且搜索关键字用户名存在时,才具备条件查询,否则不创建where条件。

/**
 * 获取分页数据
 * @param {Object} ctx
 */
async function getPageData(ctx){
  ctx.start();

  let whereData = {};

  if('undefined'!==typeof ctx.data.where 
		&& 'undefined'!== typeof ctx.data.where['username']
	){
    whereData['where'] = ctx.data.where;
  }
}

3.2 查询总条数

        通过JsStore的count()函数实现条件查询。

/**
 * 获取分页数据
 * @param {Object} ctx
 */
async function getPageData(ctx){
  ctx.start();

  let whereData = {};

   if('undefined'!==typeof ctx.data.where 
		&& 'undefined'!== typeof ctx.data.where['username']
	){
    whereData['where'] = ctx.data.where;
  }

  //查询条件内数据总数
  const count = await ctx.count({
    from: userTableName,
    ...whereData
  });

  
}

3.3 查询当前页数据列表

        通过JsStore的select()函数查询当前页列表数据,公式:page - 1 * pageSize 计算出每页起始位置,limit为查询长度。

/**
 * 获取分页数据
 * @param {Object} ctx
 */
async function getPageData(ctx){
  ctx.start();

  let whereData = {};

  if('undefined'!==typeof ctx.data.where
      && 'undefined'!== typeof ctx.data.where['username']
    ){
    whereData['where'] = ctx.data.where;
  }

 //查询条件内数据总数
  const count = await ctx.count({
    from: userTableName,
    ...whereData
  });

  const data = await ctx.select({
    from: userTableName,
    skip: (ctx.data.page - 1) * ctx.data.pageSize,
    limit: ctx.data.pageSize,
    order: {
      by: "updatetime",
      type: "desc"
    },
    ...whereData
  });

}

3.4 返回数据结果

        通过setResult()函数,返回相应数据。

/**
 * 获取分页数据
 * @param {Object} ctx
 */
async function getPageData(ctx){
  ctx.start();

  let whereData = {};

  if('undefined'!==typeof ctx.data.where
      && 'undefined'!== typeof ctx.data.where['username']
    ){
    whereData['where'] = ctx.data.where;
  }

 //查询条件内数据总数
  const count = await ctx.count({
    from: userTableName,
    ...whereData
  });

  const data = await ctx.select({
    from: userTableName,
    skip: (ctx.data.page - 1) * ctx.data.pageSize,
    limit: ctx.data.pageSize,
    order: {
      by: "updatetime",
      type: "desc"
    },
    ...whereData
  });

  ctx.setResult('code', 0);
  ctx.setResult('msg', "查询成功~");
  ctx.setResult('data', {
    data,
    count,
    page: ctx.data.page,
    pageSize: ctx.data.pageSize
  });
}

3.5 用户模型分页函数修改

        事务功能完成后,我们将其引入到db/model/user.js中,通过事务查询返回对应数据。getPageList()函数改造代码如下:

import connection from "@/db/index.js";
import { hex_md5 } from '@/utils/md5'
import { randomStrName } from '@/utils/utils'
import '../transaction.js'

export class UserService {
  constructor(){
    this.tableName = "Users";
  }

  //略...

  /**
   * 分页查询功能
   * @param {Object} params
   * @date 2023/4/21
   */
  getPageList(params){
    params = 'undefined'===typeof params ? { page: 1, pageSize: 10 } : params;

    if('undefined'===typeof params['page']) params['page'] = 1;
    if('undefined'===typeof params['pageSize']) params['pageSize'] = 10;

    return connection.transaction({
      tables: [this.tableName],
      method: "getPageData",
      data: {
        where: params['where'],
        page: params.page,
        pageSize: params.pageSize
      }
    })
  }
  /* getPageList(params){
    params = 'undefined'===typeof params ? { page: 1, pageSize: 10 } : params;

    if('undefined'===typeof params['page']) params['page'] = 1;
    if('undefined'===typeof params['pageSize']) params['pageSize'] = 10;

    return connection.select({
      from: this.tableName,
      skip: (params.page - 1) * params.pageSize,
      limit: params.pageSize,
      order: {
        by: "updatetime",
        type: "desc"
      },
    })
  } */


  //略...
}

        此时返回的数据结果如下图:

3.6 列表页中数据结果调整

        因返回数据结构变化,所以列表页中updateUserList()函数须稍作调整一下。代码如下:

import { addUserInfo, getPageDataList } from '@/api'
import { formatDate } from '@/utils/utils'
export default {
  data () {
    return {
      // 查询关键字
      keyword: "",
      // 列表数据
      tableList: [],
      page: 1,
      pageSize: 5,
      pageTotal: 0,
    }
  },
  created() {
    this.updateUserList();
  },
  methods: {
    /**
     * 分页改变
     * @date 2023/4/21
     */
    currentPageChange(e){
      this.page = e;
      this.updateUserList();
    },
    /**
     * 获取用户列表数据
     */
    updateUserList(){
      let param = {
        page: this.page,
        pageSize: this.pageSize
      }

      if(this.keyword){
        param['where'] = {
          username: this.keyword
        }
      }
      //查询数据
      getPageDataList(param).then(res => {
        if(res.code==0){
          this.pageTotal = res.data.count;
          this.tableList = res.data.data.map(item => {
            item['createtime'] = formatDate(item.createtime);
            item['updatetime'] = formatDate(item.updatetime);
            return item;
          });
        }
      }).catch(e => {
        console.error(e);
      });
      //ajax end
    },
   /* updateUserList(){
      let param = {
        page: this.page,
        pageSize: this.pageSize
      }

      if(this.keyword){
        param['where'] = {
          username: this.keyword
        }
      }
      //查询数据
      getPageDataList(param).then(res => {
        this.tableList = res.map(item => {
          item['createtime'] = formatDate(item.createtime);
          item['updatetime'] = formatDate(item.updatetime);
          return item;
        });
        console.log('getPageDataList', res);
      }).catch(e => {
        console.error(e);
      });
      //ajax end
    }, */
    //end
  }
}

        以上操作完成后,页面分页功能即完成了,效果如下:

        当然,该分页事务函数还可以再优化一下,以便适应其他数据模型的查询。这里只作演示,不过多讲解,大家可以自己多加了解后,再做更好的优化操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu2204安装pycharm社区版

最近在学习人工智能相关的知识&#xff0c;比较流行的开源框架对windows操作系统的支持并不太友好&#xff0c;因此把学习测试的环境搭在了Ubuntu2204上。一开始我都是在win10系统中的pycharm上写python代码&#xff0c;然后再上传到Ubuntu2204中运行测试&#xff0c;这么做降低…

GIS基础概念与开发实践

GIS的应用价值 呈现、还原、规划空间信息数据挖掘、统计分析等等 Q&#xff1a;这么多软件可以做GIS&#xff0c;但是格式又不一样&#xff0c;怎么办&#xff1f;这普需要一个标准的出现。 GIS标准&#xff1a;OGC标准 不同GIS软件对空间数据定义和存储结构不同&#xff0…

远程访问及控制ssh

SSH远程管理 OpenSSH服务器 SSH(Secure Shell) 协议 是一种安全通道协议。主要用来实现字符界面的远程登录、远程复制等功能。对通信数据进行了加密处理&#xff0c;用于远程管理其中包括用户登录时输入的用户口令。因此SSH协议具有很好的安全性------------&#xff08;同样…

C嘎嘎~~ 【初识C++ 下篇】

初识C 下篇 1.引用1.1引用的概念1.2引用的特点1.3常引用1.4引用使用的场景1.5引用和指针的区别 2.指针空值 --- nullptr3.内联函数3.1 内联函数的概念3.2内联函数的使用场景3.3内联函数的特性 1.引用 1.1引用的概念 相信大家小时候&#xff0c; 肯定有小名、绰号、亲朋好友的昵…

查询提速 20 倍,Apache Doris 在 Moka BI SaaS 服务场景下的应用实践

导读&#xff1a; MOKA 主要有两大业务线 MOKA 招聘&#xff08;智能化招聘管理系统&#xff09;和 MOKA People&#xff08;智能化人力资源管理系统&#xff09;&#xff0c;MOKA BI 通过全方位数据统计和可灵活配置的实时报表&#xff0c;赋能于智能化招聘管理系统和人力资源…

scratch甲壳虫走迷宫 中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析2023年3月

目录 scratch甲壳虫走迷宫 一、题目要求 1、准备工作 2、功能实现 二、案例分析

ESP32学习二-环境搭建(ESP-IDF V5.0,Ubuntu18.4)

一、准备事项 Ubuntu 18.04.5。具体安装可以参考如下链接。使用VMware安装Ubuntu虚拟机和VMware Tools_t_guest的博客-CSDN博客 乐鑫官方也提供了安装的相关操作。有兴趣可以参考。 快速入门 - ESP32 - — ESP-IDF 编程指南 v5.0.1 文档 注&#xff1a;提前说明&#xff0c;因…

Android权限描述

问题 我们常常在写apk的时候申请一些相关权限。想知道每个权限的作用&#xff0c;可以查询权限声明的地方。 1、三方页面&#xff1a; https://manifestdestiny.reveb.la/ 2、源码注释 /frameworks/base/core/res/AndroidManifest.xml <!-- SystemApi TestApi Allows a…

部署 Exsi 7.0.3

文章目录 1. 下载介质2. u盘引导安装启动盘3. 硬件连接4. 安装 EXSI 7.0.3 1. 下载介质 下载 VMware-VMvisor-Installer-7.0U3l-21424296.x86_64.iso 安装 EXSI 7.0.3 可参考: https://www.dinghui.org/vmware-iso-download.html 2. u盘引导安装启动盘 工具 https://www.v…

fitlog使用教程(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 fitlog包是用于自动版本管理和自动日志记录的Python包&#xff0c;是fastNLP团队开发的。 fitlog 中文文档 — fitlog 文档 他们团队的文档写的真的不行&#xff0c;崩溃&#xff0c;FastNLP也很难用&#xff0c;fitlog也很难用&#xff0c;中…

数据库系统概论--第四章课后习题

1.什么是数据库的安全性&#xff1f; 答&#xff1a; 数据库安全&#xff0c;是指以保护数据库系统、数据库服务器和数据库中的数据、应用、存储&#xff0c;以及相关网络连接为目的&#xff0c;是防止数据库系统及其数据遭到泄露、篡改或破坏的安全技术。 数据库安全与一般应…

超级国际象棋:第二个里程碑已完成

获取Cartesi资助的项目的最新进展&#xff0c;现在将完全去中心化的Web3国际象棋带到你的手中 “Ultrachess是一个完全基于区块链的国际象棋应用程序&#xff0c;由Cartesi Rollup技术支持&#xff0c;允许用户将真实价值投入到比赛中&#xff0c;不仅仅是他们的Elo分数。 此…

Controller里面的重定向无法跳转网址

Controller里面的重定向无法跳转网址时&#xff0c;需要在要跳转的页面地址前面加上tomcat里面的本项目的总网址&#xff0c;如下图所示

代码随想录之平衡二叉树

本题思路是针对高度&#xff0c;只不过是判断高度之差的绝对值是否大于1罢了&#xff0c;这里引入特殊变量-1用来说明不是平衡二叉树 如果左右子节点对应的子树有一个不是平衡二叉树就一直-1返回到头了。 只有全是平衡二叉树时才正常运行完。 class Solution { public:int tra…

Windows 下 GitKraken 6.5.1免费版本安装

文章目录 1. 安装 6.5.1 版本2. 更换快捷方式3. 登录 用过 GitKraken 都说好&#xff0c;不过&#xff0c;GitKraken 从 6.5.3 版本开始收费&#xff0c;它的最后一个免费版本是 6.5.1 &#xff0c;当你使用收费版本而又未付费时&#xff0c;使用 GitKranken 将无法打开私有仓库…

【学习资源】终身机器学习之增量学习

从机器学习存在的问题谈起&#xff0c;介绍增量学习可以解决怎样的问题&#xff0c;增量学习的类别&#xff0c;实现增量学习的方法&#xff0c;增量学习的评价指标和常用数据集&#xff0c;类别增量学习典型方法和代码库以及参考资源&#xff0c;希望能帮助大家用增量学习提高…

产品结构优化叠加渠道红利释放,劲仔食品是下一个食品大牛股吗?

A股有着独特的“四条鱼”标的&#xff0c;其中三家都是做大鱼&#xff1a;鳗鱼、三文鱼、罗非鱼。但在消费者这一侧听得最多的&#xff0c;往往是那个“劲仔小鱼”&#xff0c;和它背后的劲仔食品。 这只是一个诙谐的说法&#xff0c;但劲仔食品的业绩质量好&#xff0c;却是不…

Flutter 状态管理框架 Provider 和 Get 原理分析

为什么需要状态管理&#xff1f; 首先&#xff0c;为什么需要状态管理&#xff0c;这是因为 Flutter 基于 声明式 构建 UI &#xff0c;使用状态管理的目的之一就是解决「声明式」开发带来的问题。 「声明式」开发是一种区别于传原生的方式&#xff0c;所以我们没有在原生开发…

Java8特性之Lambda表达式

1.概念 lambda表达式是Java8的一个新特性&#xff0c;从本质上来讲是一个匿名函数&#xff0c;可以使用这个匿名函数实现接口中的方法&#xff0c;并且非常简洁。 通常来讲&#xff0c;使用 lambda表达式 是为了简化接口实现的。关于接口实现&#xff0c;可以有很多种方式来实…

MongoDB多字段重复数据的查询与删除

MongoDB的语法平时接触的不错&#xff0c;更多的是使用关系型数据库。最近遇到一个问题&#xff0c;在MongoDB中&#xff0c;需要找出三个字段重复的数据&#xff0c;有点类似于SQL数据中的三个字段组成的唯一键。并且需要将重复的数据保留一条&#xff0c;其余删除。但是在Mon…