范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

政采云数据可视化探索之SpreadJS表格控件

  政采云有限公司(以下简称:政采云)由浙江省财政厅与阿里巴巴集团合作建设,于2016年8月8日成立。公司以全球领先的云计算、大数据、人工智能等数字技术为基础,遵循"制度定规则、市场建平台、属地化管理、专业化运营"的建设思路,搭建了全国首个专注服务于"互联网+政企采购"的云服务平台——政采云平台。
  政采云平台基于 "互联网+"的行业背景,顺应政府采购制度改革要求和电商化采购趋势,以大数据、云计算、AI等先进技术为支撑构建的集网上交易、网上监管和网上服务于一体,覆盖政府采购各领域、全流程、多用户的综合性的云服务平台。
  为了实现高性能的数据处理要求和更加易用的使用体验,平台的数据处理模块基于葡萄城的纯前端表格控件 SpreadJS 进行开发,本文将就平台的数据可视化功能和使用 SpreadJS 表格控件时的技术选型心得进行分享,希望对从事线上协同协作系统开发和可视化分析等方向的同学有一定的帮助。一、前言
  数据可视化包含三个分支:科学可视化、信息可视化、可视分析。
  1、科学可视化主要关注的是三维现象的可视化,如建筑学、气象学、医学或生物学方面的各种系统。重点在于对体、面以及光源等等的逼真渲染,或许甚至还包括某种动态成分。
  2、信息可视化是一种将数据与设计结合起来的图片,有利于个人或组织简短有效地向受众传播信息的数据表现形式。
  3、可视分析学被定义为由可视交互界面为基础的分析推理科学,将图形学、数据挖掘、人机交互等技术融合在一起,形成人脑智能和机器智能优势互补和相互提升。
  可视化分析中可视化报表是重中之重,把大量的数据快速的展示出来,并且灵活地进行数据操作,其中操作包括数据的筛选、关联、联动、钻取,文案的查询,替换、样式设置,条件格式的注入实现多色阶、图标集、数据条、重复值,以及公式的插入,跨表联动等。纯前端表格控件SpreadJS 在解决可视化分析报表中最为突出,下面我们只针对可视化分析中 SpreadJS 所扮演的角色做探讨。
  二、报表可视化开发的技术难点
  互联网电商服务行业平时会处理大量的商业信息和用户信息,客服和数据分析师是报表的主要使用人员。
  客服平时每天都会处理大量的工单填报、客诉登记、第三方平台原始数据的导入、统计汇总、审核审批、电签、分发等工作。平时大部分工作信息的载体都是 Excel,服务器每天都需要处理海量的文档。由于 Excel 文档本身数据难以提取入库,模板更新时也不方便第一时间分发到操作员处,难以整合到 Web 页面里,数据分析师需要拿到数据进行汇总,算出各个品牌商品的销售额,最大值、最小值、平均值等,标识出有价值的数据。抓取有效数据,制作成报表提交给 boss。
  针对以上的场景,报表可视化可以总结出以下几个技术难点:
  1. 高并发
  公司客服人数众多,几千人同时在线,重度操作,业务流转周期短、数据量大,所以对服务端的并发性能消耗是很大的。可以在后台使用 Apache POI 来提取和修改 Excel 数据、并执行其中的公式计算等。这样会遇到两个性能瓶颈:
  1)需要频繁地上传、下载文档,服务器带宽承受了很大的压力;
  2)所有 Excel 解析、提取的操作都在服务器端,频繁的 IO 操作让服务器不堪重负。
  以上两个性能点,在目前的架构下很难突破,这也是重构项目时最具挑战性的需求点之一。当然硬堆服务器配置也是一个解决方案,但无法解决其它的一些问题,并且也会带来运维的压力。
  2. 对Excel 操作和兼容性要求
  新系统如果不能让大家快速上手使用,以这个项目用户的体量,培训成本将无法承受。而且要能够直接导入已有的 Excel 报表模板,否则再次开发或设计所有 Excel 报表也是难以接受的。
  3. 报表格式灵活多变
  针对不同的业务场景,报表的模版也是千变万化。因此不需要研发的介入,操作员的设计和填报都可以在页面上完成显得尤为重要。
  4. 支持公式计算
  由于涉及到商品、订单、成本核算、财务统计等模块,对计算公式的种类和性能要求较高。
  5. 工作流中的数据文档
  以前系统的工作流,涉及到 Excel 报表时,要么数据会先在服务端和 Excel 模板进行拼装,要么系统根据路径找到文件服务器的 Excel 文件,然后流转到对应环节。一些新的业务模块,甚至还只能用邮件进行文件传输。
  这个过程会产生大量的文件,对文件服务器的带来了很大压力,后台也不得不定期做批量的数据拆分和维护。这次升级系统需要解决这个问题。三、思考如何选型
  首先,选型的第一步就是搞清楚市面上具体有哪些产品供我们选择。根据目前市面上能集成到系统中的产品来看,支持这种在线表格文档编辑的产品有不少,大体可以分成两类。
  1. 云文档类型产品
  这种产品有很多,类似 WPS、石墨文档、office online。它们本身具备较高的完成度,已经帮用户实现了包括在线协同内的几乎所有功能,甚至也支持一定程度的二次开发而且可以私有化部署。但问题在于通常这类产品封闭性比较强,二次定制开发还是相对比较困难,且不够轻量。授权方式也多以按时间、按并发量、用户数量等方式授权,价格昂贵,不是很适合开发者的需要。
  2. 控件类型产品
  SpreadJS 是行业公认的表格控件业界标杆,功能支持导入包括公式、图表、样式、条件格式在内的绝大部分 Excel 特性(不支持宏)。并且最惊喜的是,它的操作界面是一个完整的 Excel 界面,完全纯 JS 开发的,用 json 进行模板和数据交互。
  同时 SpreadJS 也有对应的售后支持团队,技术问题可以工作日期间随时电话、论坛交流,相关的资料包括视频、文档、示例、API 手册也都非常丰富,甚至还可以请技术顾问到公司培训。对于工期短、开发任务比较繁重的项目组,确实能节约大量的精力,降低了风险。
  图片来源:SpreadJS在线Excel编辑器
  那么什么是控件?为什么要用控件?
  引用维基百科 在计算机编程当中,控件(或部件,widget或control)是一种图形用户界面元素,其显示的信息排列可由用户改变,例如视窗或文本框。控件定义的特点是为给定数据的直接操作(direct manipulation)提供单独的互动点。控件是一种基本的可视构件块,包含在应用程序中,控制着该程序处理的所有数据以及关于这些数据的交互操作。
  控件相对依赖更轻,可塑性更好,并且也有对应的开发文档和 API,是面向开发者的基础功能包,便于按需求来定制功能。四、SpreadJS 需求解决方案和优势
  1. 并发
  由于 SpreadJS 是数据和模板分离的设计,填报人员只需要在页面上完成填报。提交时可以只提交填报好的数据 json 即可,服务器再也不用集中解析所有Excel 文件了,带宽消耗也直接节约了一半。
  2. 对 Excel 操作和兼容性要求较高
  在内部试用时,用户反馈SpreadJS的使用体验跟 Excel 几乎完全一样,不需要再进行特意培训。而且用户的大量 Excel 报表可以直接导入进去(二次开发后也可以实现批量和远程导入),包括图表、公式、表格样式等等一系列元素都可以直接导入线上操作。
  3. 报表格式灵活多变
  设计人员可以直接在线设计,或者把 Excel 设计好的报表,拿到 Web 端,做好数据绑定,提交保存成 json 格式即可(Spread JS 的 ssjson 格式包括 Excel 文档的所有信息)
  4. 支持公式计算
  支持了 450 多种( Excel 一共 480 多种)公式,还可以自己开发扩展自定义公式,对财务来说也完全够用。同时还支持所有 Excel 的引用操作,比如跨 sheet 引用、绝对引用、函数命名信息之类。
  5. 工作流中的数据文档
  基本脱离了对文件的依赖,所有流程状态和依赖的数据都可以在数据库中记录,文件服务器只需要保存少量的模板文档即可,这里节约了90% 文件服务器的空间开销。五、深入SpreadJS
  其实最让开发者感兴趣的就是 SpreadJS 的一些底层设计、以及对内存、性能平衡性的优化。这些内容可以在葡萄城官方论坛的公开课版块找到:
  1. 渲染性能
  性能是每个深度表格控件用户最担心的问题。通常,需要处理得到数据量常常达到好几千条,但 Excel 不方便分页(涉及前端的公式计算汇总)。SpreadJS 可以轻松加载 50 万条数据,加载耗时 200 ms左右。葡萄城技术团队解决这个问题的思路是:实时渲染 + Double buffering (双层缓存):
  用 Canvas 渲染表格部分,并且只渲染用户看到的部分内容,这就实现了加载 1000 行和加载 100000 行数据速度都很快,性能相差不大的现象。
  而 Double buffering 是为了解决连续渲染的连续性体验问题,也可以进一步提升渲染速度。这个名词估计听过的人少,但应该人人都体验过,Double buffering 在图形学里,一般称作双缓冲,实际上的绘图指令是在一个缓冲区完成,这里的绘图非常的快,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,这就避免了出现绘图的不完整,同时效率很高。在游戏里其实很常见,当我们主控的人物在地图上奔跑时,游戏引擎会按照人物移动方向实时加载和渲染地图,这就避免了一次性加载超大地图时那漫长的等待。
  图片来源:葡萄城公开课【SpreadJS性能优化】稀疏数组:
  SpreadJS 对表格数据的存储优化采用了稀疏数组的数据结构。稀疏数组常用来优化二维数组(比如棋盘、地图等场景)的内存占用,但它有个天生的缺陷,就是访问性能慢。
  SpreadJS经过压力测试,百万级别的遍历耗时 200 多ms。性能可以满足大部分开发者的需求。
  2. 计算引擎
  据官方介绍来看,公式引擎其实是包含了两大实现的部分,一个是计算逻辑系统、一个是引用系统。引用系统
  Excel 中公式的计算都是依赖于某些原始数据的,比如 C1 引用 B1、B1 又引用 A1等等, SpreadJS 把这部分功能封装的已经非常原生化了,根本不需要开发者操心(除非有引用回溯等特殊需求)。
  Excel 中 有直接引用、跨 Sheet 表单引用、相对/绝对引用、命名信息的引用、 table 行列公式的引用、跨工作簿引用等等(没列举完,感兴趣的同学可以自行搜索学习)。SpreadJS 的 runtime 是在网页端,因此跨 Workbook 引用就别想了,至少目前肯定没支持。计算逻辑
  SUM、IF、MATCH、VLOOKUP 这种能输入到单元格里的计算公式,用起来就像是一个个的小"逻辑包",目前 SpreadJS 有 460+ 种原生的公式函数,而 Excel 只有 490+ 种,并且 SpreadJS 能自定制公式,使用体验与原生公式一样。
  对于底层实现,实际上经过多个版本的迭代,这些公式早已不是一个个独立的"逻辑孤岛"了。公式的实现在底层有大量的抽象和复用,据说新版本在性能提升的同时,代码量比老版本有明显精简,这对前端工程打包也是比较友好的。
  对于嵌套公式计算的实现,SpreadJS 在底层建立起了 AST 树来解析用户设置公式的计算逻辑,从官方示例的代码来看,公式底层建立了一套 Expression,并且有对应的 public 接口可供调用,如图:
  图片来源:【SpreadJS公式结构树形展示】性能
  很多开发者在开发时需要用到大量的用户事件、脏数据、联动等功能,所有这些功能确保正确运行的一个重要前提,就是必须能确保随时可以拿到正确的计算结果,那么最直接的实现思路就是让公式以高优先级、同步的方式来执行完计算。
  大家都知道,多线程可以帮助分担计算压力,但是先抛开设计和实现难度不说,即便支持了 Web Worker,JavaScript 严格来说也只能算是一个单线程语言,因为它的 Web Worker 子线程完全受主线程控制,并且主线程无法被阻塞挂起。所以即使引入了 Web Worker,也无法确保上边提到的同步执行。
  经过以上分析,可以看出公式计算性能的局限性,取决于 JavaScript 的计算能力。下图可以直观反映 Node.js 的计算能力(Node.js 是 V8 引擎,公认最快的 JS 引擎)
  图片引用自《深入浅出Node.js》
  而 SpreadJS 官方给出了一组公式的计算数据,参考如下:
  据测试,以上计算性能接近原生JS的计算性能,SpreadJS 在这方面的优化已经十分接近物理极限了。目前在大部分应用场景中,这个计算性能已经足够使用,但不排除以后会出现海量的数据和公式的计算需求,而在这方面官方也给出了相关解决方案。
  据说,官方还在进一步开发缓存技术,来实现公式计算的分块缓存:即使引用链上有值发生变化,也不需要计算整个引用链的公式。听起来很强大,思路也靠谱,希望能早点推出。
  3. 样式系统
  Excel 的样式系统非常复杂,边框、字体、对齐、数据格式、条件格式等等每一个功能点都有非常灵活庞大的实现,除了边框、背景、字体、对齐等这些能"看得到"的,也有单元格类型、数据格式、表格按钮、下拉、水印这类东西。很多人会认为,这样的话会不会Style 太重了,如果定制大量的单元格样式,内存和性能肯定都不好。不过实际应用中倒也没发现瓶颈,原来这里采用了分层结构来设计,如图:
  图片来源:葡萄城公开课【SpreadJS性能优化】六、SpreadJS怎么用?
  1. 渲染表格
  图 6.1-1 绑定数据和公式
  首先获取全局 spread 对象,spread 是整个表格的主体,spread 又分成多个 sheet。SpreadJS 初始化结束都会返回一个 spread 对象。vue 版本 spread 对象 methods:{ spreadInitHandle: function (spread) { this.spread = sprea }, }绑定数据,绑定公式tableDataBind() { // 数据源,可以从后台请求拿到 var dataSource = { // 注意这里加了一层bindPath,用于映射表格的绑定路径 bindPath_table: [{ c1: 100, c2: 90, c3: 30, c4: 40 }, { c1: 88, c2: 66, c3: 55, c4:100 }, { c1: 30, c2: 89, c3: 100, c4: 40 },{ c1: 40, c2: 66, c3: 88, c4: 40 }] }; // 表格绑定和单元格绑定数据源,需要用SpreadJS的CellBindingSource包装一下 var spreadNS = GC.Spread.Sheets; var dataSource1 = new spreadNS.Bindings.CellBindingSource(dataSource); var table2 = this.activeSheet.tables.add("tableName", 0, 0, 1, 5, spreadNS.Tables.TableThemes.light6); table2.showFooter(true); table2.autoGenerateColumns(false); var c1 = new spreadNS.Tables.TableColumn(1); c1.name("语文"); c1.dataField("c1"); var c2 = new spreadNS.Tables.TableColumn(2); c2.name("数学"); c2.dataField("c2"); var c3 = new spreadNS.Tables.TableColumn(3); c3.name("英语"); c3.dataField("c3"); var c4 = new spreadNS.Tables.TableColumn(4); c4.name("化学"); c4.dataField("c4"); var c5 = new spreadNS.Tables.TableColumn(5); c5.name("合计"); table2.bindColumns([c1, c2, c3, c4, c5]); table2.bindingPath("bindPath_table"); // 设置公式 table2.setColumnDataFormula(4, "=[@语文]+[@数学]+[@英语]+[@化学]"); table2.setColumnFormula(4, "=SUBTOTAL(109,[合计])"); // 设置允许单元格的内容超出单元格,与绑定无关 this.activeSheet.options.allowCellOverflow = true; // 绑定dataSource this.activeSheet.setDataSource(dataSource1); this.spread.resumePaint(); },
  函数名和函数码映射表
  2. 渲染条件格式
  渲染条件格式:数据渲染完成只能保证数据能正常显示出来,但是这还不能满足数据分析师的需求,还要明显展示有效数据譬如:最大值,最小值标红,进度条展示一个变化状态,图标展示上升还是下降,双色阶,三色阶,等,具体怎么实现?图标集:效果如图
  实现代码iconset() { var activeSheet = this.activeSheet; var iconSetRule = new GC.Spread.Sheets.ConditionalFormatting.IconSetRule(); // 演示demo先写死区域 iconSetRule.ranges([new GC.Spread.Sheets.Range(0,0, 5, 5)]); // IconSetType图标志的类型:箭头,圆圈和execl 打通的,excel有哪些这这边就支持哪些 iconSetRule.iconSetType(GC.Spread.Sheets.ConditionalFormatting.IconSetType.threeArrowsColored); var iconCriteria = iconSetRule.iconCriteria(); iconCriteria[0] = new GC.Spread.Sheets.ConditionalFormatting.IconCriterion( true, GC.Spread.Sheets.ConditionalFormatting.IconValueType.number, 60 );//(<60) iconCriteria[1] = new GC.Spread.Sheets.ConditionalFormatting.IconCriterion( true, GC.Spread.Sheets.ConditionalFormatting.IconValueType.number, 90 );//(60<= <90) iconCriteria[2] = new GC.Spread.Sheets.ConditionalFormatting.IconCriterion( true, GC.Spread.Sheets.ConditionalFormatting.IconValueType.number, 90 );//(>=90) iconSetRule.reverseIconOrder(false); iconSetRule.showIconOnly(false); activeSheet.conditionalFormats.addRule(iconSetRule); },进度条:效果如图
  实现代码dataBar(){ var activeSheet = this.activeSheet; activeSheet.conditionalFormats.addDataBarRule( GC.Spread.Sheets.ConditionalFormatting.ScaleValueType.number,0,//最小数 GC.Spread.Sheets.ConditionalFormatting.ScaleValueType.number, 100,//最大值 "orange",//颜色 [new GC.Spread.Sheets.Range(0,0, 5, 4)] ); },重复值:效果如图
  实现代码duplicateValue() { var activeSheet = this.activeSheet; var style = new GC.Spread.Sheets.Style(); style.backColor = "yellow"; style.foreColor = "red"; var ranges = [new GC.Spread.Sheets.Range(0,0, 5, 4)]; activeSheet.conditionalFormats.addDuplicateRule(style, ranges); },包含文本 6 的单元格:效果如图
  实现代码includeText() { var activeSheet = this.activeSheet; var style = new GC.Spread.Sheets.Style(); style.backColor = "red"; var ranges = [new GC.Spread.Sheets.Range(0,0, 5, 5)]; activeSheet.conditionalFormats.addSpecificTextRule( GC.Spread.Sheets.ConditionalFormatting.TextComparisonOperators.contains, "6", style, ranges ); },综合以上实现结果如图
  七、写在最后
  本文主要介绍了自己在数据可视化方向的一些探索,针对一些准备做市场大盘以及邮件订阅报表,线上协同协作,可视化分析等方向的同学有一定的帮助。
  因篇幅较长,所涉及概念性的东西比较多,难免会出现错误,希望大家多多指正,谢谢大家!
  欢迎关注葡萄城公众号:"葡萄城社区",了解更多技术产品知识。

为什么买完手机之后手机店员非要帮你安装软件?很多手机专卖店跟厂家是有联系的,双方的利益是相互依存的。各个手机品牌的设计都有自己的优势,设计了有利于发挥自己优势的一些软件。商家店员怕顾客不了解情况,不利于该手机优势的发挥,所以加密货币的无政府状态终将结束?丨视频书摘21世纪头十年里,一个自称中本聪的人首创了比特币。这个神秘人物(或团队)有着颠覆性的想法,立志于创造一种去中心化货币。如今,以比特币为首的加密货币在全球金融界吸引了一大批追随者。加OPPO自研芯片意义有多大?为何手机厂商都要走这条路?12月14日,OPPO在2021INNODAY上发布了首款自研芯片,影像专用NPU芯片马里亚纳X,揭开了OPPO造芯计划的面纱。而在此之前,包括小米vivo都推出自研的芯片。不过,星起航兴趣电商的商业逻辑是什么随着经济的发展和竞争的加剧,许多公司都在寻求更多领域的发展,以获得更高的实力和竞争优势。抖音电商平台也不例外,也在寻找自己的发展道路和定位。外界将其归为直播电商或内容电商的范畴,但自动驾驶车辆撞上行人,Waymo澄清当时司机在手动开车鞭牛士12月17日消息,据报道,社交新闻网Reddit网上一篇帖子称,周三晚上一辆Waymo自动驾驶汽车在旧金山撞倒一名行人。这家Alphabet旗下公司的发言人在推特上证实了这一观察云计算商业化15年,未来在5G数字孪生机器学习澎湃新闻记者邵文2006年亚马逊云科技(AmazonWebServices,以下简称AWS)是全球第一家推出云计算服务的公司,当时云计算的概念才刚刚兴起。15年后,云计算几乎无处不字符串常量,C语言字符串常量详解字符常量是由一对单撇号括起来的单个字符,如aD?39。在C语言中,除了字符常量外还有字符串常量,顾名思义就是多个字符串在一起。与字符常量有所不同,字符串常量是用双撇号括起来的多个字小米手机才是国产手机真正的领跑者首先声明,我和小米厂家没有任何关系,我只是他一个消费者,之所以有这样的看法,基于以下几点。第一,初恋。我记得小米第一款手机出来,我压根没在意,当时我主要用三星5。5寸屏幕的note小米12X超好配置?5600毫安电池加上天玑9000,怎么定位?在今年马上就要结束的时候啊,在手机市场上厂商发展中有意外掀起了一股非常的高的市场热度,那就是小米还在酝酿的新手机产品小米12的首发骁龙8gen1处理器被抢走了,并且现在小米的小米1百度百科为什么很难通过百度百科完全免费的呀,百度官方对外也明确说了,百科是一个完全免费的知识共享平台,任何人都可以自由编辑,都可以成为某个词条的贡献者,只要有一个百度帐号就可以编辑了。但这样的0门槛,并100倍变焦麒麟9000鸿蒙OS,8512G高达18799!华为飘了对于喜欢华为手机的用户来说,现在最困惑的一件事就是买不到华为的5G旗舰!确实是因为禁令还没有放松,所以台积电方面还不能给华为代工麒麟芯片,而高通又不能卖5G芯片给华为,所以华为现在
资讯北汽蓝谷迎来拐点?公司注册资本增幅超22至42。87亿元文懂车帝原创彩丽美懂车帝原创行业日前,据天眼查显示,北汽蓝谷新能源科技股份有限公司于近日发生工商变更,注册资本由约34。94亿人民币增至约42。87亿人民币,增幅超22。资料显示,课本学的外国资本家压榨剥夺工人来获得资本,现在还有意义吗?当然,现在也是一样剥削。且更狠。要知道天下乌鸦一般黑。有意义。意义如下。1让你明白资本家企业为国家交的税大多是由工人创造的。工人给资本家打工就是给国家做贡献。2资本家是资本主义社会媲美苹果三星影像旗舰!Reno6Pro拍照好不好,一比就知道说起OPPOReno6Pro,想必大家印象都十分深刻,毕竟该机不仅外观轻薄好看,更在游戏和影像方面有着不小的提升。尤其是在影像方面,OPPOReno6Pro更是搭载了旗舰级的IMX嘴唇动作解锁手机?华为申请唇动特征解锁方式引热议目前我们使用的不管是电脑还是手机,解锁方式不外乎指纹解锁虹膜解锁人脸识别解锁这几项,其中虹膜解锁由于成本贵和识别难度问题迟迟无法大面积推广,而人脸识别解锁目前最安全最快的也就只有苹华为公开利用唇动特征解锁设备专利,具有抗抄袭性侨报网综合讯继指纹人脸解锁手机之后又多了唇语解锁?近日,华为公开利用唇动特征解锁设备专利这一话题冲上微博热搜。图为位于北京市联想桥附近的一家电器商店内相邻的华为与荣耀的手机销售专区向iPhone学习,小米11高温后强制降频?MIUI负责人遵守国家规定天气越来越热,不仅人受不了,手机也受不了。这不,最近关于小米手机被迫降频的消息上了热搜。不少小米11用户都收到了降温通知,更新后的固件增加了对于部分场景的温度限制。根据某些已经升级百度输入法再更新,领先的AI技术应用,掀起一场人机体验革命初识百度输入法如果大家对百度是停留是一家搜索引擎公司,你可能了解百度的一小部分,百度起家是做搜索引擎,大家经常上网查询资料,第一个使用最多的要数百度搜索功能,百度现在是一家非常强大我国能源新突破?跨时代意义钠电池将面世,或解决电动汽车缺陷?近期,要说在科技界最大的呼声是什么?那必然是钠电池取代锂电池,用惯锂电池的我们或许一时之间搞不明白,钠电池有什么过人之处吗?为何它的呼声会这么高?它能将锂电池取而代之吗?究竟在未来读华中农业大学有前途吗?随着我国城乡一体化建设建成的加快,美丽乡村建设战略目标的不断推进,特色小镇,文化小镇如雨后春笋,遍布在实现中华民族伟大梦想的春风里,对农业科技创新人才的需要供不应求,并且高烧不退,Win11来了!电脑上也能装安卓手机App苹果去年已实现手机电脑应用进入全面协同时代上周,微软正式发布新一代视窗操作系统Windows11。与上一代系统相比,win11最大的亮点是实现了手机和电脑的进一步协同,让用户感到最方便的无疑是win11系统上可以安装安卓A迎来芯时代!为什么说WiFi6和电视更配?就在上上个月,苹果迎来了他的春季发布会,推出了全新的iMac和搭载了M1芯片的iPad,这一下子就让芯片这一核心技术成为了所有厂家重点关注的对象。我们说,更强的芯片带来了更快的运算