分表数据的页面显示和后台传递(简单实现)

需求:1.统计每个城市的某两项数据在一段时间内的总量,展示在页面上。2.将结果导出Excel文件。

目前数据库是分库分表设计,分为南北方双库,一个城市对应一张表。

从查询的效率和用户的感觉考虑,这时将所有数据查出后再显示到页面并不是最好的方式,而且代码也会变得较为复杂。

实现方式(偏前端):

1.获取数据并显示

页面使用表格方式显示数据

<table>
  <thead>
    <tr>
      <th>城市</th>
      <th>A</th>
      <th>B</th>
    </tr>
  </thead>
  <tbody id="tbody"></tbody>
</table>

为减小数据库的压力,使用异步的方式查询数据,每隔100ms查询一个城市的数据,各查询之间相对独立。

查询数据的脚本如下:

       //查询数据
        var GetData = function () {
            $("#tbody").empty();
            $("#tbody").append(‘<tr><td>总计</td><td id="sumA">0</td><td id="sumB">0</td></tr>‘);
            if (0 == $("#StartTime").val() || 0 == $("#EndTime").val()) {
                alert("请选择起止时间!");
                return;
            }
            var cityString="北京,大连,郑州,天津,济南,上海,广州";
            for (var c in cityString) {
                if (cityString[c] != "") {
                    setTimeout("GetDataByCity(‘"+cityString[c]+"‘)", 100 * c);
                }
            }
        }

GetDataByCity为查询单城市数据的函数,其代码如下:

var GetDataByCity = function (city) {
            $.ajax({
                url: ‘xxxxxx‘,
                type: "get",
                data: {
                    starttime: $("#StartTime").val(),
                    endtime: $("#EndTime").val(),
                    City: escape(city)
                },
                success: function (data) {
                    $("#tbody").append("<tr><td>" + data.City + "</td><td>" + data.A + "</td><td>" + data.B + "</td></tr>");
                    $("#sumA").html(parseInt($("#sumA").html()) + parseInt(data.A));  //查出数据后将其值加到总计栏
                       $("#sumB").html(parseInt($("#sumB").html()) + parseInt(data.B));
                },
                error: function () {
                    alert(result.statusText);
                }
            });
        }

每查出一个城市的数据,就将其显示到页面,并将其值加入总计并更新总计栏。

即使某些城市查询失败,也不影响其他城市数据的显示和总计数据的统计。

数据会很快出现并一行一行逐渐加载,页面不会空白很久才出现结果。

查询结果如图所示:

2.将数据传递到后台

       为实现将数据导出Excel文件,最重要的一步是将数据传递至后台。在这里,我们后台使用ASP.NET MVC框架和C#语言。

首先需要定义接收数据的类型:

    public class DataDTO
    {
        public string City { get; set; }
        public string A { get; set; }
        public string B { get; set; }
    }

DataDTO的三个字段分别对应页面的三列数据。

下面使用脚本遍历读取页面table里的值,并转换成json字符串传递至后台,代码如下:

        var datalist = [];
        $("#tbody>tr").each(function () {
            var data = {};
            data.City = $(this).children("td").eq(0).html();
            data.A= $(this).children("td").eq(1).html();
            data.B= $(this).children("td").eq(2).html();
            datalist.push(data);
        })
        result = JSON.stringify(datalist);  //将数组转换成json串
          url = ‘xxxxxx‘;
        url += "?result=" + escape(result);
        window.open(url);

后台接收到json字符串之后,可以将其转化成List<DataDTO>类型。在这里,我们用的是开源类库Newtonsoft.Json:

    List<DataDTO> dataList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<DataDTO>>(result);

将数据从前端传递到后台之后,再对其做各种操作就比较方便了,比如可以使用NPOI完成Excel的导出,这里就不详细介绍了。

弊端:

当显示的数据需要分页时,这种实现方式就不太好处理了。

需要通过传统的方式,在后台组织数据之后再传递到前台展示。

时间: 2024-08-03 07:24:51

分表数据的页面显示和后台传递(简单实现)的相关文章

discuz X3.1 关于分表 和 分表数据迁移

// *********** 关于读取分表的数据*********** { // forum_thread 分表代码片段 -- 帖子列表 { // 定位某个板块的帖子落在哪个表(forum_thread_0) // ... // 到指定的表(forum_thread_0.forum_thread_1)中,读取帖子列表 // 注意:(分表的时候,要分得刚刚好,同一个板块的帖子不能跨表,不然会查不到) $threadlist = array_merge($threadlist, C::t('foru

如何循环html数据制作[{},{}]格式,向后台传递多个数据

var allobject=[ ]; $('.P_center').each(function(){                //获取对象所需要的值                var courseId = $(this).data('id');                var buyNum = $(this).data('quantity');                var buyPrice = $('.P_su').text(); //将获取好的值保存到对象中     

利用Sharding-Jdbc实现分表

你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订单跟雪花一样纷沓而来. 慢慢地,你的心情开始变差,因为客户和产品的抱怨越来越频繁,抱怨的最多的一个问题就是:系统越来越慢了. 1 常规优化 你组织团队,进行了一系列的优化. 1.1 数据表索引优化 经过初步分析,发现瓶颈在数据库.WEB服务器的CPU闲来无事,但数据库服务器的CPU使用率高居不下. 于是,请来架构组的DBA同事,监控数据库的访问,整理出那些耗时的SQL,并且进行SQL查询分析.根据分析

写脚本的一些心得-----------------------历史数据迁移到分表

历史数据迁移到分表的.(以前单表几十G的表,需要做优化分表) 背景: 之前项目因为历史原因使用的是mssql,其中有大量的各种log表,需要完整地迁移到mysql的按照日期分表的分表里.由于数据量大和表当初设计的一些缺陷,所以在迁移的时候要考虑查询效率和执行效率问题. 我采用的方式如下: 每一个表一个function去处理.其实写这种导数据的应该对传入参数减少.我当初写的是开始时间和天数的传入,然后根据时间戳算出连续时间的字符串,用来去生成对应的天表表面中的字符串.其实后来想想,完全可以传入2个

mysql分表场景分析与简单分表操作

为什么要分表 首先要知道什么情况下,才需要分表个人觉得单表记录条数达到百万到千万级别时就要使用分表了,分表的目的就在于此,减小数据库的负担,缩短查询时间. 表分割有两种方式: 1水平分割:根据一列或多列数据的值把数据行放到两个独立的表中. 水平分割通常在下面的情况下使用: 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度. 表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用. 需要把数据存

MySQL_分库分表

分库分表 数据切分 通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果.数据的切分同时还能够提高系统的总体可用性,由于单台设备Crash之后,仅仅有总体数据的某一部分不可用,而不是全部的数据. 切分模式 数据的切分(Sharding)依据其切分规则的类型.能够分为两种切分模式. 依照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这样的切能够称之为数据的垂直(纵向)切分.另外一种则是依据表中的数据的逻辑关系,将同一个表

一次难得的分库分表实践

背景 前不久发过两篇关于分表的文章: 一次分表踩坑实践的探讨 分表后需要注意的二三事 从标题可以看得出来,当时我们只做了分表:还是由于业务发展,截止到现在也做了分库,目前看来都还比较顺利,所以借着脑子还记得清楚来一次复盘. <!--more--> 先来回顾下整个分库分表的流程如下: 整个过程也很好理解,基本符合大部分公司的一个发展方向. 很少会有业务一开始就会设计为分库分表,虽说这样会减少后续的坑,但部分公司刚开始都是以业务为主. 直到业务发展到单表无法支撑时,自然而然会考虑分表甚至分库的事情

分库分表 or NewSQL数据库?终于看懂应该怎么选!【转】

最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好坏其实有失公允.本文通过对两种模式关键特性实现原理对比,希望可以尽可能客观.中立的阐明各自真实的优缺点以及适用场景. 一.NewSQL数据库先进在哪儿? 首先关于“中间件+关系数据库分库分表”算不算NewSQL分布式数据库问题,国外有篇论文pavlo-newsql-sigmodrec,如果根据该文中

数据分表小结

数据分表小结 背景 分库.分表带来的后遗症 分表策略 一些注意事项 背景 最近一段时间内结束了数据库表拆分项目,这里做个简单的小结. 本次拆分主要包括订单和优惠券两大块,这两块都是覆盖全集团所有分子公司所有业务线.随着公司的业务飞速发展,不管是存储的要求,还是写入.读取的性都基本上到了警戒水位. 订单是交易的核心,优惠券是营销的核心,这两块基本上是整个平台的正向最核心部分.为了支持未来三到五年的快速发展,我们需要对数据进行拆分. 数据库表拆分业内已经有很多成熟方案,已经不是什么高深的技术,基本上