这几天给公司开发一套社区商城系统,开发进度整体上比较顺利,但今天被一个控件的细节搞了整整一天,最后才发现就是一个属性的问题,绕了好多弯,试了不少套方案,终归失败,在即将放弃之时又深读了一下控件的说明才恍然大悟,网上也百度了很多文章,有雷同但需求不完全一致,都没有一个完整的解决方式,在此写下此文,以作记录,同时也为遇到同样坑的技术人少走点弯路。
需求是这样的:
在商城产品管理页面中有一个“产品规格”的通用性需求,就是不同的产品有不同的产品规格,每个产品可以配置不同的多维度规格属性和规格值,这个需求意在解决两个问题:
1、同一个产品名称,但规格型号或其他参数不同,如果每个规格都新建一条产品数据,一来是造成冗余数据,产品信息雷同,客户需一个一个的点击查看,不利于客户快速下单成交,同时前台的产品列表中也会形成多种雷同产品数据,前台展示不友好,后台维护工作量大。
2、二是降低对价格管理的复杂性,一般在前台页面显示时,可显示产品的最低价,客户点击进去选择不同型号再出现对应的其他价格,有利于循序渐进的引导客户购买。
技术上通过设计规格名和规格值来进行多维组合,以便区分不同规格的产品价格,比如有三个维度的规格属性“尺寸、颜色、材质”,每个属性分别有3、3、2个值:
尺寸:'大','中','小'
颜色:'红','黄','蓝'
材质:'塑料','金属'
那么价格上就可以组合成3X3X2=18种价格,选择不同的组合,前台显示对应组合的价格,目前主流的大型电商平台也都是这样设计的,很强大吧,嗯,其实实现起来还是蛮复杂的,坑在后边,光这个组合自动生成价格表就搞了大半天才搞出来,这边文章不说这个,只说一下做规格名称和规格值时的大坑。
规格名称和规格值设计实现:
其实这个实现并不难,坑主要在控件上,在数据库中只需要设计两张表即可,作为通用规格属性使用,分别是:
规格名表:yr_goods_property_name
id:唯一ID主键
is_sale:是否销售属性
name:规格名
merchant_id:商户ID
规格值表:yr_goods_property_value
id:唯一ID主键
name_id:对应属性名ID
value:规格值
规格名规格值界面上设计如下:
1、首先是点击“添加规格”按钮时出现“规格名”和“规格值”控件,以及“添加”按钮。规格名采用的是bootstrap-suggest控件(bootstrap-suggest这是一个基于bootstrap按钮式下拉菜单组件的搜索建议插件),规格值采用的是select2控件(select2.js是一款下拉框插件)。
业务逻辑是这样的(别看就两控件,业务逻辑还是有点复杂的):
在点击规格名控件时,自动搜索商户自定义创建的规格名称推荐下拉列表,那么有两种情况:一种是用户直接选择已经设定的规格名称,一种是用户没有提前设定规格名称,而且当前产品的这个规格名称很小众,也不想专门设定规格名称和规格值,这种情况属于录入过程中自定义规格名称。
那么先说第一种情况,用户直接选择已经发设定的规格名称时,右方的规格值会自动索引出来对应的值(问题就出现在这个需求上,后边详细讲)。
而此时又会出现一种情况,事先配置的规格值不足以满足当前产品的属性值,需要能随时录入增加,但又不需要存储到数据库中,只是适用于当前产品而已,如只配置了“红、红黄”两种颜色,需要临时加一个蓝色,用户只需要输入蓝色后即可生成蓝色标签。
再说第二种情况,用户需要的规格名称不存在,也不想多余去配置页面配置,需要直接在商品页面录入一个规格名称,如“码号”,由于规格名称实现没配置保存在数据库中,对应的规格值自然也不存在,需要手工直接录入对应的值后,变成标签,如下图。
在录入完成后点击“添加”按钮即可动态生成产品规格配置表,界面如下(尚缺已配置规格属性编辑功能):
大坑解决方案:
上边详细写了一下需求点和设计方案,这里就说道说道碰到的select2控件大坑。select2控件有两种赋值的方式,一种是直接设置data属性来赋值,一种是通过设置ajax属性来赋值。
采用select({data:['属性值']})方式出现的问题是输入新的属性值标签时,只能在已经赋值的列表中选择,不在列表中的值无法生成标签。
于是只能采用ajax方式,这种方式可以在服务器端来生成值,能完美的实现选择已有值和新增额外值的需求,而就这么一个简单的需求却被原地踏步搞了一天,试过的方法就不说了,总之是不成功,出现的症结主要是在选择规格名称时,规格值始终不能自动宣示在select2控件列表中,只能在控件中输入对应的值来搜索,怎么select2默认不显示已经赋值的列表,真是很郁闷,牛气冲天的select2控件怎么会如此的弱智呢?如何能在不输入搜索关键词就能出现列表?什么focus、change事件,trigger触发方法都用过,就是死活不行,死牛一头,瘫卧不起,想看看select2控件源码吧,近6000行的代码直接吓退,于是继续深读属性说明,其中一个minimumInputLength属性引起了注意,该属性的意思是输入指定长度字符后开始搜索,再回头看自己的代码,发现写的是:minimumInputLength: 1,这最少输入一个字符才能触发访问服务器的请求,马上把这个属性注销后再试,成了!
就这么一个属性,花费了我整整一天的时间,谢天谢地最终还是找到原因解决了!于是也促成这篇了文章,不写出来都对不起这一天的大好时光被浪费。
2013-2024 LifeAdd生活方式 www.lifeadd.cn 版权所有 | 御融(北京)科技有限公司 All Rights
Reserved
增值电信业务经营许可证:京B2-20200664 | 京ICP备14004911号-7