Footprint 链底层数据质量

数据质量的重要性

数据质量是指数据的准确性、完整性、可靠性和一致性。这些特征对于数据的有效性和可用性至关重要。如果数据质量不高,可能会导致决策失误、成本增加、浪费资源。因此,维护数据质量是非常重要的。

Footprint Analytics数据质量标准

Footprint Analytics 对链上数据的校验标准,分为以下几个纬度:

校验指标

英文

描述

时效性

Timeliness

对于brone级别的数据,比如链底层数据,Footprint是做到实时更新;而silver或者gold级别的数据,,Footprint是做到T-1更新

唯一性

Unique

没有重复数据,每个表都要有唯一键

连续性

Continutity

确保数据是连续不中断的

完整性

Completeness

衡量所必须的数据的完整程度,如不能缺失的空值校验

有效性

Validity

对于数据的值、格式要求符合数据定义或业务定义的要求

Footprint Analytics 数据质量校验框架

Footprint Analytics 使用 Great Expectations 框架对链上数据校验。Great Expectations 是一个开源的数据质量和数据流程管理工具,提供了一系列工具和功能,可以帮助用户定义数据质量期望值,并在数据处理过程中检查数据是否符合这些期望值。

Footprint Analytics 使用 Great Expectations 进行数据校验,将异常测试数据结果实时发送到 slack 预警,团队可以在第一时间对数据问题进行修复;同时在 Footprint 生成对应的数据测试结果报告,方便团队对数据质量进行分析。

Footprint Analytics Great Expectations 项目结构:

├── expectations

├── great_expectations

│ ├── checkpoints # 生成的 yml

│ ├── expectations # 生成的 json

│ ├── notebooks

│ │ └── basic_info

│ │ └── nft # nft 领域

│ │ │ └──nft_transfers_timeliness.py # 其中一个校验开发脚本

│ ├── output

│ │ └── validations # 校验结果

│ ├── plugins

│ │ └── expectations # 自定义规则 Custom Expectation

├── utils

测试结果报告

Footprint Analytics 链底层校验规则

此文章的数据生产流程介绍中,我们能了解到,所有到指标计算都是基于原始数据的抽象。因此,对链底层对数据校验是最基础的一步。

以 Ethereum 链为例,公链的底层数据表有:

  • ethereum_traces

内部合约调用表,一个交易(Transactions)可以触发更多的内部调用操作,一个内部调用还可能进一步触发更多的内部调用。这些调用执行的信息会被记录到内部合约调用表。内部合约调用表主要包括 block_time、block_number、transaction_hash、status、from_address、to_address、value、trace_type 等字段。

  • ethereum_blocks

区块(Block)是区块链的基本构建组件。一个区块包含多个交易记录。区块表记录了每一个区块生成的日期时间 (timestamp)、对应的区块编号 ( number)、区块哈希值、难度值、燃料消耗等信息。除了需要分析整个区块链的区块生成状况、燃料消耗等场景外,我们一般并不需要关注和使用区块表。其中最重要的是区块生成日期时间和区块编号信息,它们几乎都同时保存到了其他所有数据表中,只是对应的字段名称不同。

  • ethereum_token_transfers

token转账表保存了区块链上非原生代币的转移详细信息;token转账表中最常用的字段包括block_timestamp、block_number、transaction_hash、from_address、to_address、token_address、value等。

  • ethereum_transactions

交易表保存了区块链上发生的每一个交易的详细信息(同时包括成功交易和失败交易)。交易表中最常用的字段包括 block_timestamp、 block_number、from_address、to_address、value、hash 等。

Footprint Analytics 的校验规则如下:

ethereum_traces

唯一性校验

在traces表中以trace_id作为唯一键,数据不能重复

SELECT if(( SELECT count(1) FROM ( SELECT trace_id, count(1) AS nums FROM "ethereum_traces" WHERE block_timestamp >= timestamp '2022-01-01' --节省运行时间,截取 2022-01-01 开始 GROUP BY 1 HAVING count(1) > 1 ) ) > 0, 'fail', 'pass')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-trace-uniqueness-fp-34876

时效性校验

traces 表必须有最新日期的数据 SELECT if((

SELECT count(*) FROM "ethereum_traces" WHERE block_timestamp >= CURRENT_DATE ) > 0, 'pass', 'fail')

Footprint Query URL: https://www.footprint.network/chart/ethereum-trace-timeliness-fp-34871

traces blocks 数量校验

traces中,trace_type= 'reward' 且 reward_type='block' 的去重 block 数量应该等于同一时间范围内blocks表的block数量 SELECT if((

SELECT count(DISTINCT block_number) AS trace_blocks_count

FROM "ethereum_traces"

WHERE trace_type = 'reward'

AND reward_type = 'block'

AND block_timestamp < CURRENT_DATE

) = (

SELECT count(*) AS blocks_count

FROM "ethereum_blocks"

WHERE timestamp < CURRENT_DATE

) - 1, 'pass', 'fail') AS trace_blocks_count_result

Footprint Query URL:

https://www.footprint.network/chart/ethereum-trace-blocks-count-check-fp-34872

traces transactions 数量校验

在 traces 表中,非空 trace_address 中的非空 transaction_hash 数量应该等于同一时间范围内 transactions 表的总记录数 SELECT if((

SELECT count(transaction_hash)

FROM "ethereum_traces"

WHERE trace_address IS NULL

AND transaction_hash IS NOT NULL

AND block_timestamp < CURRENT_DATE

AND block_timestamp >=timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

) = (

SELECT count(*)

FROM "ethereum_transactions"

WHERE block_timestamp < CURRENT_DATE

AND block_timestamp >=timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

), 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-trace-transactions-count-check-fp-34874

ethereum_blocks

唯一性校验

在blocks表中以number作为唯一键,数据不能重复

SELECT if((

SELECT count(1)

FROM (

SELECT number, count(1) AS nums

FROM "ethereum_blocks"

GROUP BY 1

HAVING count(1) > 1

)

) > 0, 'fail', 'pass')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-blocks-uniqueness-fp-34878

时效性校验

blocks表必须有最新日期的数据 SELECT if((

SELECT count(*)

FROM "ethereum_blocks"

WHERE timestamp >= CURRENT_DATE

) > 0, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-blocks-timeliness-fp-34879

连续性校验

blocks表中的number必须是连续不中断的 SELECT if((

SELECT expect_total_blocks - total_blocks

FROM (

SELECT max(number) - min(number) + 1 AS expect_total_blocks

, count(DISTINCT number) AS total_blocks

FROM "ethereum_blocks"

)

) = 0, 'pass', 'fail') --blocks的number应该是连续不中断的

Footprint Query URL: https://www.footprint.network/chart/ethereum-blocks-continuity-fp-34880

blocks 数量有效性校验

blocks 表中最大的 number+1 等于 blocks 表的总行数,因为blocks的number是从0开始,也就是创世块的number=0

SELECT if((

SELECT expect_total_blocks - total_blocks

FROM (

SELECT count(1) AS total_blocks

, max(number) + 1 AS expect_total_blocks

FROM "ethereum_blocks"

)

) = 0, 'pass', 'fail') --blocks的记录数应该等于最大的block number+1

Footprint Query URL:

https://www.footprint.network/chart/ethereum-blocks-blocks-validity-check-fp-34882

blocks transaction 数量校验

blocks中的transaction_count 总和等于同一时间范围内transactions的总行数 SELECT if((

SELECT sum(transaction_count) AS block_transaction_count

FROM "ethereum_blocks"

WHERE timestamp < CURRENT_DATE

) = (

SELECT count(*) AS transaction_count

FROM "ethereum_transactions"

WHERE block_timestamp < CURRENT_DATE

), 'pass', 'fail') --相同时间范围内,blocks中的transaction 总数等于transactions中的总行数

Footprint Query URL:

https://www.footprint.network/chart/ethereum-blocks-transactions-validity-check-fp-34883

ethereum_token_transfers

唯一性校验

token_transfers表以block_timestamp,log_index,transaction_hash 为唯一键,数据不能重复

SELECT if((

SELECT count(1)

FROM (

SELECT block_timestamp,log_index,transaction_hash,count(1) AS nums

FROM "ethereum_token_transfers"

WHERE block_timestamp >=timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

GROUP BY 1,2,3

HAVING count(1) > 1

)

) > 0, 'fail', 'pass')

Footprint Query URL: https://www.footprint.network/chart/ethereum-token-transfers-uniqueness-fp-35017

时效性校验

token_transfers表必须有最新日期的数据

SELECT if((

SELECT count(*)

FROM "ethereum_token_transfers"

WHERE block_timestamp >= CURRENT_DATE

) > 0, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/token-transfers-timeliness-fp-35018

连续性校验

token_transfers每日应该有交易数据,按天为纬度是连续的

SELECT if((

SELECT total_day - diff_day AS block_timestamp_continue_result

FROM (

SELECT date_diff('day', date(min(block_timestamp)), date(max(block_timestamp))) AS diff_day

, count(DISTINCT date(block_timestamp)) AS total_day

FROM "ethereum_token_transfers"

WHERE block_timestamp >= timestamp '2022-01-01’ --节省运行时间,截取2022-01-01开始

)

) = 1, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-token-transfers-continuity-fp-35020

ethereum_transactions

唯一性校验

transactions表以block_timestamp,hash,block_number 为唯一键,数据不能重复

SELECT if((

SELECT count(1)

FROM (

SELECT block_timestamp,hash,block_number,count(1) AS nums

FROM "ethereum_transactions"

WHERE block_timestamp >=timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

GROUP BY 1,2,3

HAVING count(1) > 1

)

) > 0, 'fail', 'pass')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-transactions-uniqueness-fp-35021

时效性校验

transactions表必须有最新日期的数据

SELECT if((

SELECT count(*)

FROM "ethereum_transactions"

WHERE block_timestamp >= CURRENT_DATE

) > 0, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-transactions-timeliness-fp-35022

连续性校验

transactions每日应该有交易数据,按天为纬度是连续的

SELECT if((

SELECT total_day - diff_day AS block_timestamp_continue_result

FROM (

SELECT date_diff('day', date(min(block_timestamp)), date(max(block_timestamp))) AS diff_day

, count(DISTINCT date(block_timestamp)) AS total_day

FROM "ethereum_transactions"

WHERE block_timestamp >= timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

)

) = 1, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-transactions-continuity-fp-35023

总结

以上就是 Footprint Analytics 技术团队对底层链的数据进行测试的方法和规则,仍在持续完善更新中,欢迎大家提出优化的建议,一起让Footprint Analytics的数据质量得到更可靠的保证。

本文转载于网络 如有侵权请联系删除

相关文章

  • 出现了,PPT 制作新方式——GitHub 热点速览 v.21.19

    作者:HelloGitHub-小鱼干 想当初Markdown的出现,拯救了多少死在Word样式调整上的人,现在,slidev出现了,它让你Focus在本该专注的PPT内容制作上而不需要花太多精力在样式调整上,你仅仅用Markdown语法就可以做出一个高颜值幻灯片。生产力工具除了slidev,还有zx这个Google开源的小工具能帮你写出更好的脚本,以及现在才被小鱼干发现的一个宝藏项目Best-websites-a-programmer-should-visit收录了太多非常高质量的CS相关网站,全方位解放学习能力。以下内容摘录自微博@HelloGitHub的GitHubTrending及HackerNews热帖(简称HN热帖),选项标准:新发布|实用|有趣,根据项目release时间分类,发布时间不超过14day的项目会标注New,无该标志则说明项目release超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知?1.本周特推在开始本周的特推之前,如果你有什么想要的GitHub项目,记得留言呀~你的留言超重要(≧▽≦)1.1Markdown方式做PPT:slidev本周st

  • 动态网页常用的两种数据加载方式ajax和js动态请求

    欢迎关注”生信修炼手册”!对于静态网页,我们只需要访问对应的URL就可以获得全部的数据了,动态网页则没有这么简单。比如以下网站http://q.10jqka.com.cn/zjhhy/detail/code/M/在浏览器中打开,我们可以看到对应的表格数据在浏览器中,通过翻页按钮,可以查看不同页面的内容但是你会发现,在翻页的过程中,页面的url并没有发生变化,这说明这个表格中的数据是动态加载的。目前,常用的动态加载技术有以下两种1.ajax2.js通过构建ajax或者js请求,来获得对应的数据。对于这些动态加载的数据,我们就不能只请求网页的url了,而是需要找到上述两种请求的链接,一些简单的动态加载链接,可以通过浏览器的调试工具来快速查找1.ajaxajax请求通过network选项中的xhr请求来查找,在上述网站进行翻页,可以看到如下如下所示的ajax请求链接直接用爬虫或者ajax链接,就可以返回对应的数据了。2.js动态加载js请求通过network选项中的js请求来进行查找,在下列网站中,其翻页的数据就是通过js请求来动态加载的https://finance.sina.com.cn

  • IRscope代码拆解一

    IRScope是用用来可视化叶绿体基因组边界扩张收缩的一个shiny应用。正好自己最近在学习R语言里shiny相关的知识。就准备看看他的代码是怎么写的。目前看懂了一小部分,记录在这里。他开头定义了很多函数1、读入genbank函数的文件read.gb<-function(file){ return(readLines(file)) } 复制readLines()函数读入文本文件,结果好像是一个向量,文件中的每行是向量中的一个元素。2、提取读入的genbank文件的fasta序列这个代码稍微有点长,,逻辑还有点没看懂FasExtract<-function(gb){ fasta<-gb[(grep("ORIGIN",gb)+1):length(gb)] while(fasta[length(fasta)]==""){ fasta<-fasta[1:length(fasta)-1] } while(fasta[length(fasta)]=="//"){ fasta<-fasta[1:length(f

  • Python 学习笔记 (8)—— sy

    主要介绍用的比较多的sys的模块命令包括:sys.argv,sys.platform,sys.getdefaultencoding,sys.setdefaultencoding(),sys.getfilesystemencoding(),sys.exit(n),sys.path,sys.modules.keys(),sys.stdin,sys.stdout,sys.stderr 等。sys.argv    获取参数 参数获取从0开始,而不是1,0为命令本身 #!/usr/bin/python import sys print "I the first arg :", sys.argv[1] print "I the second arg :", sys.argv[2] print "All of the args are :" for i in sys.argv:         print i 执行结果: [root@node1 python]# python arg.py hello python I the first 

  • Jetson Xavier NX资料全放送,NVIDIA这次很麻利儿

    XavierNX的规格详情:AI性能:高达:21TOPS(INT8)VoltaGPU:384NVIDIA®CUDA®cores|48Tensorcores CarmelCPU:ARMv8.2(64-bit)heterogeneousmulti-processing(HMP)CPUarchitecture|3xdual-coreCPUclusters(sixNVIDIACarmelprocessorcores)connectedbyahigh-performancesystemcoherencyinterconnectfabric|L3Cache:4MB(sharedacrossallclusters)NVIDIACarmel(Dual-Core)Processor:L1Cache:128KBL1instructioncache(I-cache)percore;64KBL1datacache(Dcache)percore|L2UnifiedCache:2MBperclusterMaximumOperatingFrequency:1900MHzAudioDedicatedprogramma

  • TensorFlow从1到2(十三)图片风格迁移

    风格迁移《从锅炉工到AI专家(8)》中我们介绍了一个“图片风格迁移”的例子。因为所引用的作品中使用了TensorFlow1.x的代码,算法也相对复杂,所以文中没有仔细介绍风格迁移的原理。 今天在TensorFlow2.0的帮助,和新算法思想的优化下,实现同样功能的代码量大幅减少,结构也越发清晰。所以今天就来讲讲这个话题。“风格迁移”指的是将艺术作品的笔触、技法等表现出来的视觉效果,应用在普通照片上,使得所生成的图片,类似使用同样笔触、技法所绘制完成,但内容跟照片相同的“伪画作”。 在神经网络机器学习的帮助下,生成图片的观赏性非常高,远非早期传统方法得到的图片可比。 这里重贴一遍前文中的例图,让我们有一个更直观的感受。 首先是一张原程序作者的的自拍照: 接着不陌生,著名大作《星空》: (请将以上两图保存至工作目录,不要修改文件名,我们稍晚的代码中会用到。) 两张图片经过程序处理后,会得到一幅新的图片: 即使用《星空》风格模仿的手绘作品《黄粱一梦》:)基本原理风格迁移原理基于论文《ANeuralAlgorithmofArtisticStyle》。 虽然论文中并没有明说,但采用卷积神经

  • Rollup

    什么是Rolluprollup.js是Javascript的ES模块打包器,我们熟知的Vue、React等诸多知名框架或类库都通过rollup.js进行打包。与Webpack偏向于应用打包的定位不同,rollup.js更专注于Javascript类库打包(虽然rollup.js也可以提供资源打包,但显然这不是它的强项)。在我们学习Vue和React等框架源码或者自己编写Javascript类库时,rollup.js是一条必经之路。 Rollup的好处TreeShaking:自动移除未使用的代码,输出更小的文件ScopeHoisting:所有模块构建在一个函数内,执行效率更高Config文件支持通过ESM模块格式书写可以一次输出多种格式:IIFE,AMD,CJS,UMD,ESMDevelopment与production版本:.js,.min.js文档精简基础插件rollup-plugin-alias:提供modules名称的alias和reslove功能.rollup-plugin-babel:提供Babel能力,需要安装和配置Babel(这部分知识不在本文涉及)rollup-plug

  • 使用Cython将Python代码转为C语言,从而提高代码保密性

    CythonCython是Python编程语言和扩展Cython编程语言(基于Pyrex)的优化静态编译器。它使得为Python编写C扩展就像Python本身一样容易。这允许编译器从Cython代码生成C代码。 显而易见的是,它能将python代码翻译为C代码,然后生成符合Python/CAPI的动态链接库。这样就能更好的保护你的python源码不被破解。例如你的代码包含了核心的量化交易策略。将其转为机器语言才能更好的保护你的核心代码。另外一方面,Cython也带来了一些扩展,使得你可以通过添加静态类型声明,将原本的python代码的性能逼近纯C语言的性能。使用Cython众所周知,Python的for循环是非常慢的,我们来使用Cpython来生成二进制库以及加快for循环的速度。(这不是我的主要目的,我的目的是将其转为C语言代码,然后进行编译,来加强保密性)。importtime z=0 start=time.time() foriinrange(1000): forjinrange(1000): forkinrange(1000): z+=1 print(z) end=time.

  • 腾讯云开启跟踪集

    1.接口描述接口请求域名:cloudaudit.tencentcloudapi.com。 开启跟踪集 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:StartLogging。 Version 是 String 公共参数,本接口取值:2019-03-19。 Region 是 String 公共参数,详见产品支持的地域列表,本接口仅支持其中的:ap-guangzhou。 AuditName 是 String 跟踪集名称 3.输出参数 参数名称 类型 描述 IsSuccess Integer 是否开启成功 RequestId String 唯一请求ID,每次请求都会返回。定位问题时需要提供该次请求的RequestId

  • 视频融合平台EasyCVR如何快速更改快照文件的raw后缀?

    EasyCVR视频融合云服务支持多协议、多类型的设备接入,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、级联等功能。在录像功能上,EasyCVR可支持云端录像回看、以及设备录像回看,录像存储方面,既能存储在本地服务器,也能存储在第三方服务商平台,如阿里云、腾讯云、移动/电信等。     有用户反馈,其在EasyCVR平台调用快照时,快照格式为raw格式,而用户使用java不易处理raw文件,于是请求我们协助,修改一下快照文件的后缀。 从用户需求来看,若需将raw格式修改成jpg格式,我们可以通过配置中心来进行修改。 1)方法一:将前端解码关闭,快照格式就会默认为jpg格式;     2)方法二:通过easycvr.ini配置文件进行配置,将snap_mode改成0,即为后端转码,就可得到jpg格式的快照了。     我们在此前的文章中也分享过关于视频快照的技术内容,感兴趣的用户可以翻阅我们往期的文章进行了解。     EasyCVR平台基于云边端一体化架构,可支持多类型设备、多

  • [hdu5521 Meeting]最短路

      题意:有N个点,给定M个集合,集合Si里面的点两两之间的距离都为Ti,集合里面的所有点数之和<=1e6。有两个人分别在1和N处,求1个点使得两个人到这一点距离的最大值最小 思路:这题是裸的最短路问题,难点在建图。然而建图也只有1步,在集合外新建1个点,每个点向它连一条Ti/2的边(避免浮点数,可以先乘2,然后结果除以2)。如此巧妙。。。 #include<bits/stdc++.h> usingnamespacestd; #defineXfirst #defineYsecond #definepb(x)push_back(x) #definemp(x,y)make_pair(x,y) #defineall(a)(a).begin(),(a).end() #definemset(a,x)memset(a,x,sizeof(a)) #definemcpy(a,b)memcpy(a,b,sizeof(b)) #definecas()intT,cas=0;cin>>T;while(T--) template<typenameT>bool

  • 微信小程序搜索排名权重!

    最后,再介绍一下排名权重的计算比例: 1、小程序上线时间(占比5%) 2、描述中完全匹配出现关键词次数越多,排名越靠前(10%) 3、标题中关键词出现1次,且整体标题的字数越短,排名越靠前(35%) 4、微信小程序用户使用数量越多,排名越靠前(占比50%)

  • 查询指定列的指定值

    表名:Settings查询属性名这列名为CurrentGroupName这条记录的属性值对应的值是什么?stringConnectionString="DataSource=test.db;Version=3;"; stringsql=$"Select属性值FromSettingsWhere属性名='CurrentGroupName'"; using(SQLiteConnectionconn=newSQLiteConnection(ConnectionString)){ using(SQLiteCommandcmd=newSQLiteCommand(sql,conn)){ conn.Open(); objectobj=cmd.ExecuteScalar(); MessageBox.Show((string)obj); } } 复制因为我只读指定一一行对应的值所以使用ExecuteScalar遍历的方法如下:https://www.cnblogs.com/Donnnnnn/p/6023421.html

  • Dockerfile 时区设置

    Dockerfile时区设置 RUNln-sf/usr/share/zoneinfo/Asia/Shanghai/etc/localtime RUNecho'Asia/Shanghai'>/etc/timezone复制 EG、 FROMfiadliel/java8-jre VOLUME/tmp ADDapi_h5-0.1.jarapp.jar RUNln-sf/usr/share/zoneinfo/Asia/Shanghai/etc/localtime RUNecho'Asia/Shanghai'>/etc/timezone ENTRYPOINT["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]复制   docker已运行容器里的时区修改 ln-sf/usr/share/zoneinfo/Asia/Shanghai/etc/localtime 或者 cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime 重启容器即可复制

  • 数论题集合

    不定期更新,随心情太监 欧拉函数: POJ2407计算欧拉函数 HDU2824 欧拉的线性打表 HDU2588 枚举因数+欧拉函数 HDU2588 欧拉函数的应用 数论分块: FJUT3243         向下取整的快速枚举 FJUT3244          向下取整的快速枚举 BZOJ1257           疯狂一顿操作后可推导出一个与向下取整有关的式子,然后数论分块就行了。 ZOJ3175            f(n,k)=(n/k)-1  然后又是向下取整相关的求和、  扩展GCD与同余方程(组

  • 搜索算法框架

    https://mp.weixin.qq.com/s/97tl37JTZTsID7qPcdjIpg

  • vue element UI el-table 给表格添加复选框,并得到所选值

          <el-table@selection-change="changeCheckBoxValue"v-bind:data="this.requireData"v-loading="this.tableLoading" border style="width:100%"> <el-table-columnmin-width='140'type="selection"></el-table-column> <el-table-columnprop="RequirementNO"v-bind:label="$t('rq_lst_require_no')"min-width='150'></el-table-column> </el-table>复制     <script> data:{ checkBoxData:[], }, methods:{ changeCheckBoxValue(val){ $.each(val,funct

  • Spring 中使用Properties文件

    Spring提供了加载Properties文件的工具类:org.springframework.beans.factory.config.PropertyPlaceholderConfigurer。在Spring容器启动时,使用内置bean对属性文件信息进行加载,在bean.xml中添加如下:<!--spring的属性加载器,加载properties文件中的属性--> <beanid="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <propertyname="location"> <value>/WEB-INF/configInfo.properties</value> </property> <propertyname="fileEncoding"value="utf-8"/> </bean>复制 属性信息加载后其中一种使用方式是在其

  • MAC 上运行 npm报错:line 1: react-app-rewired: command not found

      从仓库下了前端的项目,运行时报了这个错: line1:react-app-rewired:commandnotfound 1.网上查了资料,需要安装 create-react-app 解决: 执行命令:  sudonpmi-gcreate-react-app  输入电脑密码后,安装 注意:如果不加sudo,可能会报无权限   2.执行npminstall还报错,报错信息: errorERESOLVEunabletoresolvedependencytree     解决: 执行命令: npmi--legacy-peer-deps 执行完成后,运行工程npmstart,可以正常启动了         参考博客: https://www.csdn.net/tags/OtTaUgysMTY4NC1ibG9n.html https://blog.csdn.net/weixin_53798028/article/details/124479201

  • 题解 P2085 【最小函数值】

    题目描述 有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Aix^2+Bix+Ci(x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。 输入输出格式 输入格式: 输入数据:第一行输入两个正整数n和m。以下n行每行三个正整数,其中第i行的三个数分别位Ai、Bi和Ci。Ai<=10,Bi<=100,Ci<=10000。 输出格式: 输出数据:输出将这n个函数所有可以生成的函数值排序后的前m个元素。这m个数应该输出到一行,用空格隔开。 输入输出样例 输入样例#1: 310 453 345 171 复制 输出样例#1: 9121219252931444554 复制 数据范围 n,m<=10000 主要思路:STL+初中数学(实质是瞎搞) STL就是用的优先队列。 对于一个函数\(f(x)=ax^{2}+bx+c\),我们会发现对称轴为\(x=-\frac{b}{2a}\),所以函数\(f(x)\)在\([1,+∞)\),根据题意\(x∈N^{*}\),可知对于每个函数\(f(x)\)都是单调递增的。 所以

  • static关键字的作用(修饰类、方法、变量、静态块)

    1.static修饰的类只能为内部类,普通类无法用static关键字修饰。static修饰的内部类相当于一个普通的类,访问方式为(new外部类名.内部类的方法())。如下所示:   publicclassOuterClass{ publicstaticclassInnerClass{ InnerClass(){ System.out.println("=============我是一个内部类'InnerClass'============="); } } } publicclassTestStaticClass{ publicstaticvoidmain(String[]args){ //不需要new一个InnerClass newOuterClass.InnerClass(); } }复制  注:普通内部类的访问方式为(外部类对象.new内部类方法())   2.static修饰静态方法的访问方式为 (类名.方法名)   3.静态变量和实例变量的区别  static修饰的变量为静态变量,静态变量在内存中只有一份存储空

相关推荐

推荐阅读