电子表格转身购物车:三步轻松实现
在我们的项目当中,经常需要添加一些选择界面,让用户直观地进行交互,比如耗材、办公用品、设计稿或者其它可以选择的内容。
在线商城的商品目录和购物车无疑是一种大家都很熟悉的交互方式,但是在实际开发中,我们可能会遇到以下几个问题:
- 怎么及时响应产品的需求,快速实现功能上线?
- 怎样实现灵活变更模板,把数据、模板和实现分离,便于设计同学随时修改UI?
- 怎样让用户获得熟悉的交互体验,同时实现前端数据收集和统计? 这里给大家提供一个思路,用在线Excel来实现这个功能!本文将展示如何使用纯前端表格控件,在30分钟内、三步操作创建产品目录页和购物车效果。文末包含demo源码,不要错过。
先来看看完成的效果:
简单三步创建个性化产品目录页
除了支持数百种统计和财务功能的高速计算引擎外,我们还将大量使用SpreadJS内置的 RANGEBLOCKSPARKLINE(template_range, data_expr) - 一个强大的迷你图功能,允许用户将单元格范围模板 (template_range) 定义为单个单元格类型并将该模板应用于单元格以将一组数据(data_expr)加载到模板中。
点击此处下载演示文件,解压后直接用浏览器打开index.html即可看到效果。
以下是创建和设计产品目录所需的内容:
数据源表
数据源表包含有关不同产品的数据。它们位于名为 tbProducts 的表中。 此表包含有关名称、类别、价格、评级等的信息:
模板表
此页面包含用于在目录表上创建产品列表的模板范围。 首先要做的是排列单元格,然后设置单元格的绑定路径。 它可以通过 Javascript 使用 SpreadJS 的 setBindingPath 方法来完成。
templateSheet.setBindingPath(0, 0, "Nr"); templateSheet.setBindingPath(0, 1, "Name"); templateSheet.setBindingPath(0, 3, "Price"); templateSheet.setBindingPath(0, 4, "Category"); templateSheet.setBindingPath(0, 5, "Description"); templateSheet.setBindingPath(0, 6, "Image"); templateSheet.setBindingPath(0, 7, "Review"); templateSheet.setBindingPath(0, 8, "Favorite"); templateSheet.setBindingPath(0, 9, "Rating");
当然,上边这步操作也有不用写代码的方法------用设计器,在下载的安装包中,从"\SpreadJS.Release.x.x.x\Designer\Designer Runtime"路径下找到设计器的安装包,完成安装后,按照下列步骤操作:
-
数据→工作表绑定→字段列表
-
将鼠标悬停在 Start 分支上并通过单击绿色 + 按钮添加字段(请注意,这里可以使用"x"按钮删除字段并使用位于分支右侧的设置修改这些字段)
-
拖动模板范围所需单元格中的字段
渲染表(目录)
如上面的屏幕截图所示,此表包含四个主要部分:
按面板排序
此面板包含一个按钮列表,可以更改包含有关产品的数据的表格的顺序,从目录表更改产品的顺序。
如果使用设计器,执行以下操作: 1.主页→ 单元格编辑器→ 单元格类型 2.单击按钮列表 3.设置项目的文本和值以及按钮列表对象的不同属性。 4.添加项目 5.点击确定
另外,还可以使用以下 JavaScript 代码添加按钮列表:
var cellType = new GC.Spread.Sheets.CellTypes.ButtonList(); cellType.items([{text:"Name (asc)",value:0},{text:"Name (desc)",value:1},{text:"Price (lowest)",value:2},text:"Price (highest)",value:3},{text:"Rating (lowest)",value:4}, {text:"Rating (highest)",value:5}]); cellType.selectedBackColor("#0AA371"); cellType.selectedForeColor("#FFFFFF"); cellType.selectionMode(GC.Spread.Sheets.CellTypes.SelectionMode.single);// allows only 1 item to be selected catalogSheet.getCell(3, 2).cellType(cellType);
通过使用ValueChanged事件,我们可以根据按钮列表选择更改位于 Datasource 工作表上的表的顺序。
//Sort by panel catalogSheet.bind(GC.Spread.Sheets.Events.ValueChanged,function(type,args){ if (args.row ==3 && args.col==2)//only check if the button list value has changed { var i = 1; var asc = true; switch(args.newValue){ case 1: i= 1; asc = false;//sort by Name desc break; case 2: i= 3; asc = true;//sort by Price asc break; case 3: i= 3; asc = false;//sort by price desc break; case 4: i= 8; asc = true;//sort by Rating asc break; case 5: i= 8; asc = false;//sort by Rating desc break; default: i = 1; asc = true; //sort by Name desc break; } spread.suspendPaint(); //change the sorting spread.getSheetFromName("DataSource").sortRange(1, 0, 15, 9, true, [ {index:i, ascending:asc} ]); spread.resumePaint(); } });
产品列表
产品列表是产品目录中最重要的部分。这包含产品列表及其有关价格、类别、名称和图像的各自信息。
如前所述,我们将使用 RANGEBLOCKSPARKLINE 创建产品列表。 更改单元格宽度 (B6:D10) 以适应上述模板 (Template!A2:E7) 后,在这些单元格上设置如下公式:
=RANGEBLOCKSPARKLINE(Template!A2:E7,OBJECT(tbProducts[#Headers],INDEX(tbProducts[#Data],index,SEQUENCE(COUNTA(tbProducts[#Headers]),1))))
在这种情况下,索引将是项目的编号。例如,在 B6 上,索引将为 1。
如果这里只使用 javascript实现,可以用以下代码:
//first product sheet.setFormula(5, 1, "=RANGEBLOCKSPARKLINE(Template!A2:E7,OBJECT(tbProducts[#Headers],INDEX(tbProducts[#Data],1,SEQUENCE(COUNTA(tbProducts[#Headers]),1))))");
对其他单元格重复相同的策略。
选定项目
当用户使用SelectionChanged事件点击另一个item时,出现在目录右侧的item发生变化,选中item右端的"加号"背景;它变成绿色。
执行此操作的 JavaScript 代码如下:
// select items var row = 5, col =1; catalogSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function (sender, args) { const sheet = args.sheet; const newRow = args.newSelections[0].row; const newCol = args.newSelections[0].col; if ((newRow <5 || newRow > 9) || (newCol < 1 || newCol > 3)) return; //change the item appearing on the right panel var position = 3*(newRow - 5) + newCol; sheet.suspendPaint(); sheet.setFormula(5, 5, "=RANGEBLOCKSPARKLINE(Template!H9:O21,OBJECT(tbProducts[#Headers],INDEX(tbProducts[#Data]," + position + ",SEQUENCE(COUNTA(tbProducts[#Headers]),1))))"); // change the color of the "plus" sign of the selected item sheet.getCell(row, col).backColor("#dddddd"); sheet.getCell(newRow, newCol).backColor("#53b175"); sheet.resumePaint(); row = newRow; col = newCol;
添加到购物车按钮
添加到购物车按钮是一个简单的按钮,显示可以使用超链接功能调用最终将商品添加到购物车的事件或调用其他一些电子商务支付功能。该按钮显示该项目已添加到购物车的警报。
想了解更多?请参考以下资源: 了解更多纯前端表格在线demo示例 : https://www.grapecity.com.cn/developer/spreadjs/demo 纯前端表格应用场景:https://demo.grapecity.com.cn/spreadjs/mobilesample/
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
MySQL UDF 提权初探
MySQL UDF 提权初探 对 MySQL UDF 提权做一次探究,什么情况下可以提权,提取的主机权限是否跟mysqld进程启动的主机账号有关 数据库信息 MySQL数据库版本:5.7.21 UDF UDF:(User Defined Function) 用户自定义函数,MySQL数据库的初衷是用于方便用户进行自定义函数,方便查询一些复杂的数据,同时也有可能被攻击者利用,使用udf进行提权。 提权原理:攻击者通过编写调用cmd或者shell的共享库文件(window为.dll,linux为.so),并且导入到一个指定的文件夹目录下,创建一个指向共享库文件的自定义函数,从而在数据库中的查询就等价于在cmd或者shell中执行命令。 执行过程:本质上还是利用了MySQL能够执行系统命令的特点。具体过程如下 (1)攻击者编写一些可以调用cmd或者shell的共享库文件(window为.dll,linux为.so),将共享库导入指定的函数目录中。 (2)在MySQL中创建指向共享库文件的自定义函数。 (3)通过刚刚创建的函数执行系统命令,实现提权。 漏洞详情 当mysql配置secure_f...
- 下一篇
Elasticsearch:Node.js ECS 日志记录 - Morgan
这是之前系列文章: Elasticsearch:Node.js ECS 日志记录 - Pino Elasticsearch:Node.js ECS 日志记录 - Winston 中的第三篇文章。在今天的文章中,我将描述如何使用 Morgan 包针对 Node.js 应用进行日子记录。此 Morgan Node.js 软件包为 morgan 日志中间件(通常与 Express 一起使用)提供了一个格式化程序,与 Elastic Common Schema (ECS) 日志记录兼容。结合 Filebeat 发送器,你可以在 Elastic Stack 中的一处监控所有日志。 设置 安装 npm install @elastic/ecs-morgan-format npm install morgan 配置 morgan-logging.js const app = require('express')(); const morgan = require('morgan'); const { ecsFormat } = require('@elastic/ecs-morgan-...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2配置默认Tomcat设置,开启更多高级功能