vue项目导出功能_前端导出Excel_Export2Excel.js

VUE项目导出功能_前端导出Excel_Export2Excel.js

vue项目利用插件直接进行excel生成。

1.安装依赖

npm install -S file-saver
npm install xlsx@0.14.1 -S
npm install -D script-loader

高版本xlsx可能会出错儿!

2.创建js文件

创建一个名为Export2Excel.js的文件至项目目录中,给文件内容为:

/* eslint-disable */
require('script-loader!file-saver');
import XLSX from 'xlsx'

function generateArray(table) {
    var out = [];
    var rows = table.querySelectorAll('tr');
    var ranges = [];
    for (var R = 0; R < rows.length; ++R) {
        var outRow = [];
        var row = rows[R];
        var columns = row.querySelectorAll('td');
        for (var C = 0; C < columns.length; ++C) {
            var cell = columns[C];
            var colspan = cell.getAttribute('colspan');
            var rowspan = cell.getAttribute('rowspan');
            var cellValue = cell.innerText;
            if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;

            //Skip ranges
            ranges.forEach(function (range) {
                if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
                    for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
                }
            });

            //Handle Row Span
            if (rowspan || colspan) {
                rowspan = rowspan || 1;
                colspan = colspan || 1;
                ranges.push({
                    s: {
                        r: R,
                        c: outRow.length
                    },
                    e: {
                        r: R + rowspan - 1,
                        c: outRow.length + colspan - 1
                    }
                });
            };

            //Handle Value
            outRow.push(cellValue !== "" ? cellValue : null);

            //Handle Colspan
            if (colspan)
                for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
        }
        out.push(outRow);
    }
    return [out, ranges];
};

function datenum(v, date1904) {
    if (date1904) v += 1462;
    var epoch = Date.parse(v);
    return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}

function sheet_from_array_of_arrays(data, opts) {
    var ws = {};
    var range = {
        s: {
            c: 10000000,
            r: 10000000
        },
        e: {
            c: 0,
            r: 0
        }
    };
    for (var R = 0; R != data.length; ++R) {
        for (var C = 0; C != data[R].length; ++C) {
            if (range.s.r > R) range.s.r = R;
            if (range.s.c > C) range.s.c = C;
            if (range.e.r < R) range.e.r = R;
            if (range.e.c < C) range.e.c = C;
            var cell = {
                v: data[R][C]
            };
            if (cell.v == null) continue;
            var cell_ref = XLSX.utils.encode_cell({
                c: C,
                r: R
            });

            if (typeof cell.v === 'number') cell.t = 'n';
            else if (typeof cell.v === 'boolean') cell.t = 'b';
            else if (cell.v instanceof Date) {
                cell.t = 'n';
                cell.z = XLSX.SSF._table[14];
                cell.v = datenum(cell.v);
            } else cell.t = 's';

            ws[cell_ref] = cell;
        }
    }
    if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
    return ws;
}

function Workbook() {
    if (!(this instanceof Workbook)) return new Workbook();
    this.SheetNames = [];
    this.Sheets = {};
}

function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
}

export function export_table_to_excel(id) {
    var theTable = document.getElementById(id);
    var oo = generateArray(theTable);
    var ranges = oo[1];

    /* original data */
    var data = oo[0];
    var ws_name = "SheetJS";

    var wb = new Workbook(),
        ws = sheet_from_array_of_arrays(data);

    /* add ranges to worksheet */
    // ws['!cols'] = ['apple', 'banan'];
    ws['!merges'] = ranges;

    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {
        bookType: 'xlsx',
        bookSST: false,
        type: 'binary'
    });

    saveAs(new Blob([s2ab(wbout)], {
        type: "application/octet-stream"
    }), "test.xlsx")
}

export function export_json_to_excel({
    multiHeader = [],
    header,
    data,
    filename,
    merges = [],
    autoWidth = true,
    bookType=  'xlsx'
} = {}) {
    /* original data */
    filename = filename || 'excel-list'
    data = [...data]
    data.unshift(header);

    for (let i = multiHeader.length-1; i > -1; i--) {
        data.unshift(multiHeader[i])
    }

    var ws_name = "SheetJS";
    var wb = new Workbook(),
        ws = sheet_from_array_of_arrays(data);

    if (merges.length > 0) {
        if (!ws['!merges']) ws['!merges'] = [];
        merges.forEach(item => {
            ws['!merges'].push(XLSX.utils.decode_range(item))
        })
    }

    if (autoWidth) {
        /*设置worksheet每列的最大宽度*/
        const colWidth = data.map(row => row.map(val => {
            /*先判断是否为null/undefined*/
            if (val == null) {
                return {
                    'wch': 10
                };
            }
            /*再判断是否为中文*/
            else if (val.toString().charCodeAt(0) > 255) {
                return {
                    'wch': val.toString().length * 2
                };
            } else {
                return {
                    'wch': val.toString().length
                };
            }
        }))
        /*以第一行为初始值*/
        let result = colWidth[0];
        for (let i = 1; i < colWidth.length; i++) {
            for (let j = 0; j < colWidth[i].length; j++) {
                if (result[j]['wch'] < colWidth[i][j]['wch']) {
                    result[j]['wch'] = colWidth[i][j]['wch'];
                }
            }
        }
        ws['!cols'] = result;
    }

    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {
        bookType: bookType,
        bookSST: false,
        type: 'binary'
    });
    saveAs(new Blob([s2ab(wbout)], {
        type: "application/octet-stream"
    }), `${filename}.${bookType}`);
}

3.使用导出功能‘

下面的导入Export2Excel.js的路径需要根据实际情况进行手动更改

<button  @click="daochu" >导出表格</button>
// 导出方法
daochu() {
    import('@/Export2Excel.js').then((excel) => {
        const filterVal = ['title1', 'title2'] // 表头
        let list = []  // 表格数据 [{title1:'content1',title2:'content2'}]
        const data = this.formatJson(filterVal, list) // 单元格处理
        excel.export_json_to_excel({
            header: filterVal,
            data,
            filename: '测试表格文件',
        })
        this.downloadLoading = false
    })
}


// 数据处理
formatJson(filterVal, jsonData) {
    // 导出-数据过滤
    return jsonData.map((v) =>
        filterVal.map((j) => {
        console.log(v, j, v[j])
        return v[j]
        // if (j === 'a1') {
        //   //表格中需要过滤的属性,这里是在属性前面加上当前环境的地址
        //   return '特殊' + v[j]
        // } else {
        //   return v[j]
        // } 
    }) 
   )
},  
本文转载于网络 如有侵权请联系删除

相关文章

  • 存储过程和触发器

    文章目录存储过程创建与执行修改和删除触发器创建修改和删除小结 学习使我快乐存储过程创建与执行语法格式 ①创建CREATE{PROC|PROCEDURE}[架构名.]过程名[;组号] /*定义过程名*/ [{@参数[类型架构名.]数据类型}/*定义参数的类型*/ [VARYING][=default][OUT|OUTPUT][READONLY] /*定义参数的属性*/ ] [WITHENCRYPTION] /*说明是否采用加密方式*/ [FORREPLICATION]/*说明不能在订阅服务器上执行为复制创建的存储过程。*/ AS { <SQL语句> /*执行的操作*/ …… }复制②执行[{EXEC|EXECUTE}] {[@返回状态=] {模块名|@模块名变量} [[@参数名=]{值|@变量[OUTPUT]|[DEFAULT]}] }复制2.举例 (数据表链接:spj库) ①创建存储过程p1,查询所有信息;运行之。createprocedurep1 as select*froms,p,j,spj wheres.sno=spj.sno andp.pno=spj.pno

  • 哈达玛矩阵指导下的在线哈希学习新方法

    作者|蒋宝尚编辑|丛末越来越多的数据流,让视觉相似度检索在应用场景中越来越难,例如微信每天都会产生十几亿甚至上百亿的流数据网络图片,给相似图片搜索带来了挑战。而视觉哈希编码技术逐渐成为实现相似性检索的有效途径。近日,厦门大学纪荣嵘关于在线哈希学习新方法的论文被发表在IJCV上,在论文中纪教授引入哈达玛矩阵指导哈希函数的学习,即吸取了传统在线哈希方法的优点,也最大程度上降低了精度损失。另外,对比当前最先进的七种技术,引入哈达玛矩阵的在线哈希学习都有一定程度的性能提高。论文地址:https://arxiv.org/pdf/1905.04454.pdf最近邻搜索在搜索领域一夫当关,作为一种找寻最优点的思路,在很多领域中都有很广泛应用,如:计算机视觉、信息检索、数据挖掘、机器学习,大规模学习等。但最近邻搜索有两个关键问题:1、特征维度较高;2、数据量较大。例如,简单的穷尽搜索,需要将原始数据从存储中加载到内存,这将面临非常高的时间复杂度,成为现实应用中所必须解决需要解决的一个瓶颈问题。为解决这个问题,近年来,在实际应用中出现了一些时间复杂度为次线性的、快速有效的最近邻搜索方法,例如KD树、Ba

  • [视频教程] redis中的bit运用统计用户在线天数

    位运算在redis中非常的方便使用,并且理由利用这个可以实现很多特殊的功能。这也迫使我去研究更多的redis提供的函数,只有研究的多,思路才能够更加开放。今天我就对strings下面的几个函数进行了测试,也收获颇丰。使用setBit和bitCount可以实现用户活跃天数的统计,大体的思路如下: 我们网站今天第一天上线,某用户taoshihan,今天有访问那么我就记一下,网站第一天,taoshihan访问1; 网站第二天,taoshihan访问1;网站第80天,taoshihan访问1;其余时间没有访问过,那么我们统计得出taoshihan活跃天数为3。使用代码体现为如下,具体解释可以查看视频: https://www.bilibili.com/video/av70912075///使用setBit和bitCount实现用户在线天数的统计 $redis->set("taoshihan",'@');//@符号的二进制形式为01000000 $redis->setBit("taoshihan",1,1); $redis-

  • LeetCode 25 Reverse Nodes in k-Group

    题目/** *Definitionforsingly-linkedlist. *structListNode{ *intval; *ListNode*next; *ListNode(intx):val(x),next(NULL){} *}; */ classSolution{ public: ListNode*reverseKGroup(ListNode*head,intk){ intnum=0; ListNode*temp=head; while(temp!=NULL) { num++; temp=temp->next; } if(k>num||k==1) returnhead; ListNode*start; ListNode*end; ListNode*pre; ListNode*res; pre=res=newListNode(0); temp=head; intpos=0; while(temp!=NULL) { if((pos==0||pos%k==0)) { if(num-pos<k) break; if(pos!=0){ pre=end;

  • Python爬虫入门教程 29-100 手机APP数据抓取 pyspider

    1.手机APP数据----写在前面继续练习pyspider的使用,最近搜索了一些这个框架的一些使用技巧,发现文档竟然挺难理解的,不过使用起来暂时没有障碍,估摸着,要在写个5篇左右关于这个框架的教程。今天教程中增加了图片的处理,你可以重点学习一下。2.手机APP数据----页面分析咱要爬取的网站是http://www.liqucn.com/rj/new/这个网站我看了一下,有大概20000页,每页数据是9个,数据量大概在180000左右,可以抓取下来,后面做数据分析使用,也可以练习优化数据库。网站基本没有反爬措施,上去爬就可以,略微控制一下并发,毕竟不要给别人服务器太大的压力。页面经过分析之后,可以看到它是基于URL进行的分页,这就简单了,我们先通过首页获取总页码,然后批量生成所有页码即可http://www.liqucn.com/rj/new/?page=1 http://www.liqucn.com/rj/new/?page=2 http://www.liqucn.com/rj/new/?page=3 http://www.liqucn.com/rj/new/?page=4复制获取总

  • linux每日命令(11):cat命令

    cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。一.命令格式:cat[参数][文件]...复制二.命令功能:cat主要有三大功能:1.一次显示整个文件:catfilename2.从键盘创建一个文件:cat>filename只能创建新文件,不能编辑已有文件.3.将几个文件合并为一个文件:catfile1file2>file三.命令参数参数描述-n--number,由1开始对所有输出的行数编号-b--number-nonblank,和-n相似,只不过对于空白行不编号。-s--squeeze-blank,当遇到有连续两行以上的空白行,就代换为一行的空白行。-v--show-nonprinting,使用^和M-引用,除了LFD和TAB之外-E--show-ends,在每行结束处显示$-T--show-tabs,将TAB字符显示为^I。-A--show-all,等价于-vET-e等价于-vE-t与-vT等价四.使用实例1.将file1的文档内容覆盖到file2中命令:不带行号覆

  • 面向纯新手的TensorFlow.js速成课程

    编译:yxy出品:ATYUN订阅号欢迎来到面向纯新手的的TensorFlow.js速成课程的第一课。本课程由CodingTheSmartWay.com出品,在本系列的第一部分中,你将学到:TensorFlow.js是什么如何将TensorFlow.js添加到Web应用程序中如何使用TensorFlow.js向Web应用程序添加机器学习功能 什么是TensorFlow.jsTensorFlow.js是一个JavaScript库,它可以将机器学习功能添加到任何Web应用程序中。使用TensorFlow.js,可以从头开发机器学习脚本。你可以使用API在浏览器或Node.js服务器应用程序中构建和训练模型。并且,你可以使用TensorFlow.js在JavaScript环境中运行现有模型。甚至,你可以使用TensorFlow.js用自己的数据再训练预先存在的机器学习模型,这些其中包括浏览器中客户端可用的数据。例如,你可以使用网络摄像头中的图像数据。该项目的网站在https://js.tensorflow.org/:TensorFlow.js基础知识在进行实际示例之前,让我们来看看Tensor

  • Android极速开发之SD卡缓存文件

    读取某个文件夹中的所有Apk文件路径并打开安装页面读取某文件夹下的所有apk文件获取SD卡跟目录中的某个文件弹出安装界面卸载apk/** * *@authorJaven * */ publicclassSDKUtil{ privatefinalstaticStringTAG=SDKUtil.class.getSimpleName(); /** *读取某个文件夹中的所有Apk文件路径并打开安装页面 *@paramcontext *@parampath */ publicstaticvoidreadApkAndStart(Contextcontext,Stringpath){ List<String>listpath=readAllApkForPath(context,path); if(listpath!=null&&listpath.size()>0){ for(Stringstring:listpath){ SDKUtil.openInstallView(context,string); } }else{ L.e("xxxx-----&

  • springboot如何配置mybaits-plus

    1MyBatis-Plus      MyBatis-Plus(opensnewwindow)(简称MP)是一个MyBatis(opensnewwindow)的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。     特性:     (1)无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。     (2)损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作。     (3)强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。     (4)支持Lambda形式调用:通过Lambda表达式,方便的编写各类查询条件,无需再担心字段写错。     

  • 晃动提示效果

    登录验证流程及左右晃动效果 业务场景   一般网站的登录页面或者注册页面,都要求对用户输入的信息进行验证,验证通过后将数据异步发送至后台,验证不通过时给出提示信息。 常见的做法,在点击提交按钮时检查用户填写的所有信息,一旦发现错误,执行提示函数给出提示信息,return当前流程。   为了让提示效果更为友好,我们特意给input框添加一个左右晃动的效果。 案例效果说明   当点击登陆按钮时,检查用户名和密码两个input框的value是否为空。为空则左右晃动input框,同时在下面给出对应的提示信息。 如图: HTML部分 这部分内容包括:一个html表单,两个input框和一用于放置提示文本的div盒子,外加立即登陆按钮。   <formaction="#"> <inputid="username"type="text"placeholder="请输入用户名"> <inputid="password"type="password"placeholder="登录密码"> <divclass="tipTextBox"> <

  • 自定义 Bean 的性质-5

    springFramework提供了许多接口,您可以使用它们来自定义bean的性质。 生命周期回调 要与容器对bean生命周期的管理进行交互,可以实现SpringInitializingBean和DisposableBean接口。容器要求afterPropertiesSet()前者和destroy()后者让bean在初始化和销毁bean时执行某些操作。 在内部,Spring框架使用BeanPostProcessor实现来处理它可以找到的任何回调接口并调用适当的方法。如果你需要自定义特性或其他生命周期行为Spring默认不提供,你可以BeanPostProcessor自己实现一个。 除了初始化和销毁回调之外,Spring管理的对象还可以实现该Lifecycle接口,以便这些对象可以参与容器自身生命周期驱动的启动和关闭过程。 初始化回调 在容器为bean设置了所有必要的属性后,该org.springframework.beans.factory.InitializingBean接口允许bean执行初始化工作。该InitializingBean接口指定了一个方法: voidafterP

  • 结构体对齐问题

    #pragma(1)typedefstruct{};#pragma()#pragmapack(1)的意义是什么skypxl | 浏览27771次发布于2009-10-0116:38最佳答案设置结构体的边界对齐为1个字节,也就是所有数据在内存中是连续存储的。比如你在C语言中定义下面这样的结构体:structs{charch;inti;};然后在主函数中写一句:printf("%d",sizeof(structs))也就是输出结构体s所占的字节数你觉得输出结果会是多少呢?我们知道,char型占用1个字节,int型占4个字节,那么输出的结果是5吗?答案是否定的。你可以自己试一下,输出结果为8。为什么会这样呢?这是因为编译器为了让程序跑得跟快,减少CPU读取数据的指令周期,对结构体的存储进行了优化。实际上第一个char型成员虽然本来只有1个字节,但实际上却占用掉了4个字节,为的是让第二个int型成员的地址能够被4整除。因此实际占用的是8个字节。而#pragmapack(1)让编译器将结构体数据强制连续排列,这样的话,sizeof(structs)输出的结果就是5了。

  • 网络原理

    (一)名词解释   1) LAN:局域网   2) WAN:广域网   3) 以太网:以太网(Ethernet)指的是由Xerox公司创建并由Xerox、Intel和DEC公司联合开发的基带局域网规范,是当今现有局域网采用的最通用的通信协议标准。以太网络使用CSMA/CD(载波监听多路访问及冲突检测)技术。   4) 广播地址:主机标识段全为1的地址,广播的边界通常为交换器和路由器等介质。例如10.1.1.0(255.255.255.0)网段,其广播地址为10.1.1.255(255即为2进制的11111111),当发出一个目的地址为10.1.1.255的分组(封包)时,它将被分发给该网段上的所有计算机。   5) 集线器:集线器的英文称为“Hub”。“Hub”是“中心”的意思,OSI参考模型的第一层,即物理层。集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。不具有类似于交换机的"智能记忆"能力和"学习"能力。它也不具备交换机所具有的MAC地址表,所以它发送数据时都是没有针

  • 201503-2 数字排序

    题目链接:http://118.190.20.162/view.page?gpid=T26 问题描述 试题编号: 201503-2 试题名称: 数字排序 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。 输入格式   输入的第一行包含一个整数n,表示给定数字的个数。  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。 输出格式   输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。 样例输入 12523313425235 样例输出 3423531141 评测用例规模与约定   1≤ n ≤1000,给出的数都是不超过1000的非负整数。 题解: 1#include<iostream> 2#include<queue> 3usingnamespacestd; 4 5cons

  • UML图中类的关系

    1.一般化关系(也叫泛化(generalization):表示is-a的关系),包括继承/实现,图网上找的,谢谢了 注意:继承是实线,而实现是虚线     2.关联关系(Association) 和组合(Composition)关系和聚合关系(Aggregation) 一个对象要想完成一个任务,需要知道其他的对象,并且调用其他对象的方法。这个对象对其他对象的知识叫做关联。 关联者和被关联者是前者知道后者的属性的关系,因为我有你的引用,我可以使用你。可以单向关联也可以双向关联。       聚合关系has-a的关系,是一种不稳定的包含关系。在java的语法中,他和关联关系无法区分。聚合强调的是一个整体,比如汽车和轮子的关系   组合是一种更强的关联contains-a,被组合的对象不能单独存在,有组合的类负责被组合的生命周期,如美猴王和他的四肢,订单和订单的商品项     从关联强度来说:组合>聚合>关联   3.依赖关系(denpendency) 一个类的某个方法,需

  • MIT-6.S081-2020实验(xv6-riscv64)七:thread

    实验文档 概述 这次实验主要涉及多线程编程,和之前的实验不太一样,比较偏向于应用层面,除了任务一外都是在宿主机上编写多线程程序,应该是xv6不支持系统级的多线程。 内容 Uthread:switchingbetweenthreads 这个任务要求对一个程序填空,这个程序在用户层面实现了多线程的调度。但实际上这个调度和xv6内核的进程调度非常相似。首先是对thread_schedule函数进行填空,只需要调用切换函数就行了,根据文档的说明,这个切换函数是保存当前线程用到的所有callee-saved寄存器,然后将这些寄存器全部赋值为下一个线程里保存的值,联想到xv6内核里的context结构体就是用来保存这些寄存器的,所以直接复制过来并作为thread结构体的一个属性,那么调用切换函数就会像这样: thread_switch((uint64)(&t->context),(uint64)(&current_thread->context)); 复制 thread_switch()在uthread_switch.S里实现,这里我不贴代码了,因为和kernel文件夹

  • ES6

    ES6简介 ES6是 ECMAScript6.0的简写,即JavaScript语言的下一代标准,已经在2015年6月正式发布了,它的目标是让JS能够方便的开发企业级大型应用程序,因此,ES6的一些规范正在逐渐向Java、C#等后端语言标准靠近。在ES6规范中,比较重大的变化有以下几个方面: 新增let、const命令来声明变量,和var相比,let声明的变量不存在变量提升问题,但没有改变JS弱类型的特点,依然可以接受任意类型变量的声明;const声明的变量不允许在后续逻辑中改变,提高了JS语法的严谨性。 新增解构赋值、rest语法、箭头函数等,这些都是为了让代码看起来更简洁,而包装的语法糖。 新增模块化机制,这是JavaScript走向规范比较重要的一步,让前端更方便的实现工程化。 新增类和继承的概念,配合模块化,JavaScript也可以实现高复用、高扩展的系统架构。 新增模板字符串功能,高效简洁,结束拼接字符串的时代。 新增Promise机制,解决异步回调多层嵌套的问题。 ES诞生 1997年ECMAScript1.0诞生 1999年12月ECMAScript3.0诞

  • CSP-S2019游记

    多半是结束了..... Day-1 让人surprised的是我们少了一个人,人数是奇数,必须单出去一个人住单屋,于是我们就草率的rand一下,whs成功入选。。。。。。 Day0在早上十点半学校领导给我们鼓气后我们就踏上了csp-s的征程;吃了学校送的红苹果,红心火龙果,橙子。。。 真是从里红到外,非红(WA)即黄(TLE),蕴意不错,让人背后发凉我们坐到了德州,eat了KFC一起愉快的坐了火车; 到了燕大已经下午四点半了,然而试机时间终止在五点,下了车我们一路小跑,赶紧去试机了。 今晚板子什么的都不怎么会就和fhw一起温习了一下板子,没敢颓,但是我平衡树板子打不熟练,想去找个有电脑的人看看板子就千辛万苦找到了yzh然后我就“’被迫‘颓废”了两个小时。。。 颓废完,已经7点多了,教练又开了一个小会,然后为了考试的好状态,赶紧在九点半洗洗睡了; 晚上因为稍紧张,在床上滚到了十二点半。。。。 Day1 早上6点半就赶紧起来去吃饭了,看到更早来的意淫哥和zzyy他们很自信,心里也更放松了一些; 8:30开考 T1格雷数:开考一看写了20分钟,以为切了,应该是考场有些紧张没看到2^64炸lo

  • 系统综合实践第二次实践作业

    前言 上一次作业同学们实现了docker环境的安装和基本配置,已经能够从docker的官方镜像仓库中拉取镜像,初步实现了入门。然而,从官方仓库拉取的镜像是最简单的镜像,在实际应用中经常需要根据需求额外修改镜像,这就涉及到了镜像的定制。在docker中我们可以使用Dockerfile文件实现自定义镜像,本次作业需要完成2个Dockerfile编写实践,掌握编写Dockerfile文件的基本方法。 (1)实现一个自定义的web容器服务 推荐apache或nginx,要求标明镜像作者信息,安装必要的工具以方便维护;设定你自己的web存放目录,安全起见,请将默认的监听端口80更改为你自定义的端口,并且声明暴露的端口,容器启动时,能直接进入web代码的存放目录。 1.1、获取最新版的nginx镜像 sudodockerpullnginx 我在第一步卡了好久,一开始出现docker无法启动,后来一直百度尝试解决,各种重启重装docker都不行。后来我把上次作业的阿里云加速器的一个文件:/etc/docker/daemon.json删掉,终于可以了。然后出现了新的问题,等了好久都没下载完,卡住不

  • 分布式数据库基本概念

    分布式数据库:   一群分布在计算机网络上,逻辑上相互关联的数据库   分布式计算系统   要求它具备一定数量的自主处理单元,这些单元通过计算机网络互连并且协同处理他们各自分配到的任务   分布式数据库系统(DDBS)包含分布式数据库系统管理(DDBMS)和分布式数据库(DDB)   DDBS的基础问题   分布及复制数据库的透明管理 数据独立性 逻辑数据独立性 用户应不受数据库的逻辑结构变化的影响 物理数据独立性 向用户应用隐蔽了存储结构的细节 网络透明(分布透明) 用户不必指出数据在哪里存放  位置透明 用来执行的命令既和数据的位置无关,也和由哪个系统的完成无关 命名透明 对于数据库里的对象都提供一个唯一的名字,如果没有命名透明,用户需要把位置名称放入一个对象名称内 复制透明 复制透明仅仅谈及副本的存在,而不是他们的实际位置 分片透明 水平分片 把一个关系划分成一组子关系,每个子关系仅

  • 第一个随笔- O(n) 产生含n个不重复元素的随机数组

    eg:A[0,1,2,3,4,5,6,7]; 函数rand()用来生成随机数组下标 for(inti=0;i<n;i++) {   intj=rand()%(n-i)+i;  //j=[i..n]   A[i]^=A[j]^=A[i]^=A[j]; } //从i=0开始,随机产生i..n中的一个数j,将A[i]和A[j]交换。 //因为i是递增的,j=rand(i..n),避免了i和j重复的可能。

相关推荐

推荐阅读