# 商品选择功能使用说明 ## 概述 商品选择功能现在支持通过最后一列的"选择"按钮来控制单选和多选模式,提供了更直观的用户体验。 ## 功能特性 ### 单选模式 - 表格最后一列显示蓝色的"选择"按钮 - 点击任意商品的"选择"按钮即可直接完成选择并关闭弹窗 - 适用于奖品商品选择等单选场景 ### 多选模式 - 表格最后一列显示绿色的"选择"按钮 - 点击"选择"按钮后变为红色的"取消选择"按钮 - 可以选择多个商品,底部显示已选择数量 - 支持最大选择数量限制 - 适用于营销活动参与商品等多选场景 ## 使用方法 ### 1. JavaScript调用 #### 单选模式 ```javascript Fast.api.open('shop/goods/select?selectMode=single', '选择商品', { callback: function(data) { if (data.length > 0) { var goods = data[0]; console.log('选中的商品:', goods); // 处理选中的商品 } } }); ``` #### 多选模式 ```javascript Fast.api.open('shop/goods/select?selectMode=multiple', '选择商品', { callback: function(data) { if (data.length > 0) { console.log('选中的商品列表:', data); // 处理选中的商品列表 } } }); ``` #### 多选模式(带数量限制) ```javascript Fast.api.open('shop/goods/select?selectMode=multiple&maxSelect=5', '选择商品(最多5个)', { callback: function(data) { if (data.length > 0) { console.log('选中的商品列表:', data); // 处理选中的商品列表 } } }); ``` ### 2. 使用activity.js中的封装方法 ```javascript // 单选商品(奖品场景) Controller.api.selectPrizeGoods('#prize-goods-container'); // 多选商品(任务场景) Controller.api.selectTaskGoods('#task-goods-container'); // 通用商品选择 Controller.api.selectGoods({ mode: 'single', // 'single' 或 'multiple' title: '选择商品', container: '#selected-goods', maxSelect: 0, // 最大选择数量,0表示无限制 callback: function(data) { // 处理选中的商品 } }); ``` ## URL参数说明 | 参数 | 类型 | 默认值 | 说明 | |------|------|--------|------| | selectMode | string | multiple | 选择模式:single(单选) 或 multiple(多选) | | maxSelect | number | 0 | 最大选择数量,仅在多选模式下有效,0表示无限制 | ## 界面说明 ### 选择模式提示 - 页面顶部会显示当前的选择模式(单选/多选)和操作提示 - 单选模式:提示"单击任意商品的'选择'按钮即可完成选择" - 多选模式:提示"点击商品的'选择'按钮添加到选择列表,再次点击可取消选择" ### 按钮状态 - **单选模式**:蓝色"选择"按钮,点击后直接完成选择 - **多选模式**: - 未选择:绿色"选择"按钮 - 已选择:红色"取消选择"按钮 - 达到数量限制:未选择的按钮变为禁用状态 ### 确认按钮 - 单选模式:保留传统的确认按钮作为备选方案 - 多选模式:确认按钮显示已选择的商品数量,如"确认选择 (3)" ## 界面变更 相比之前的版本,新版本有以下重要变更: - **完全移除**了传统的checkbox/radio选择列 - **专用按钮选择**:只通过操作列的选择按钮进行选择 - **更简洁界面**:减少不必要的列,界面更加简洁 - **更直观操作**:按钮状态和颜色直观反映选择状态 ## 注意事项 1. **专用按钮选择**:只能通过操作列的选择按钮进行选择,不再支持点击行或checkbox方式 2. **单选直接选择**:单选模式下点击"选择"按钮会直接关闭弹窗,无需再点击确认按钮 3. **多选状态保持**:多选模式下表格刷新、搜索、分页后选择状态会自动保持 4. **按钮状态反馈**:通过按钮颜色和图标直观显示选择状态(绿色=可选,红色=已选) 5. **模式选择**:建议根据业务场景选择合适的选择模式和数量限制 6. **确认按钮逻辑**:单选模式隐藏确认按钮,多选模式显示确认按钮并显示选择数量 ## 示例场景 - **奖品选择**:使用单选模式,用户点击即可快速选择奖品 - **营销活动参与商品**:使用多选模式,允许选择多个参与商品 - **优惠券适用商品**:使用多选模式,并设置合理的数量限制 ## 显示样式 **注意:单选和多选模式现在使用相同的显示样式模板** ### 单选模式显示(奖品商品) ``` ┌─────────────────────────────────────────────────┐ │ [图片] [标签]商品名称 删除 │ │ ¥价格 [单规格/多规格] │ │ 编码: xxx | 分类: xxx | 类型: xxx │ └─────────────────────────────────────────────────┘ ``` ### 多选模式显示(任务商品) ``` ┌─────────────────────────────────────────────────┐ │ [图片] [标签]商品名称1 删除 │ │ ¥价格1 [单规格/多规格] │ │ 编码: xxx | 分类: xxx | 类型: xxx │ ├─────────────────────────────────────────────────┤ │ [图片] [标签]商品名称2 删除 │ │ ¥价格2 [单规格/多规格] │ │ 编码: xxx | 分类: xxx | 类型: xxx │ ├─────────────────────────────────────────────────┤ │ [图片] [标签]商品名称3 删除 │ │ ¥价格3 [单规格/多规格] │ │ 编码: xxx | 分类: xxx | 类型: xxx │ └─────────────────────────────────────────────────┘ ``` ## 商品信息显示说明 ### 商品标签 系统会根据商品属性自动显示相应的彩色标签: - **密** - 虚拟商品(type=2) - **荐** - 推荐商品(isrecom=1) - **热** - 热门商品(ishot=1) - **新** - 新品(isnew=1) ### 规格类型标签 - **单规格** - 蓝色标签,商品只有一种规格 - **多规格** - 橙色标签,商品有多种规格选择 ### 商品类型 - **普通商品** - 实体商品,需要物流配送 - **虚拟商品** - 虚拟商品,如卡密、服务等 - **服务商品** - 服务类商品 ### 其他信息 - **编码** - 商品的唯一编码标识 - **分类** - 商品所属的分类名称 - **价格** - 商品销售价格,红色加粗显示 ## 表单字段 **注意:模板会根据选择的商品数量自动判断字段名** ### 单选模式(选择1个商品) 选中的商品会生成以下隐藏字段: ```html ``` ### 多选模式(选择多个商品) 选中的商品会生成以下隐藏字段: ```html ``` ## 高级用法 ### 自定义配置 ```javascript Controller.api.selectGoods({ mode: 'single', // 选择模式:single/multiple title: '自定义标题', // 弹窗标题 container: '#my-container', // 显示容器 template: 'my-template', // 使用的模板 maxSelect: 5, // 最大选择数量(仅多选模式有效),0表示无限制 callback: function(data) { // 选择完成后的回调 console.log('选中的商品:', data); } }); ``` ### 选择模式控制 系统通过URL参数控制商品选择器的行为: - `selectMode=single` - 单选模式,显示单选按钮 - `selectMode=multiple` - 多选模式,显示复选框(默认) - `maxSelect=N` - 最大选择数量限制(仅多选模式有效) ### 常用配置示例 ```javascript // 单选商品(奖品选择) Controller.api.selectGoods({ mode: 'single', title: '选择奖品商品', container: '#prize-goods', template: 'goods-list-template' }); // 多选商品(任务商品,最多3个) Controller.api.selectGoods({ mode: 'multiple', title: '选择参与商品', container: '#task-goods', template: 'goods-list-template', maxSelect: 3 }); // 无限制多选 Controller.api.selectGoods({ mode: 'multiple', title: '选择商品', container: '#goods-list', template: 'goods-list-template' }); ``` ### 获取已选商品 ```javascript // 获取单选商品ID var goodsId = $('input[name="goods_id"]').val(); // 获取多选商品ID数组 var taskGoodsIds = []; $('input[name="task_goods_ids[]"]').each(function() { taskGoodsIds.push($(this).val()); }); ``` ## 模板说明 系统现在统一使用一个商品显示模板: 1. **goods-list-template** - 统一的商品列表模板(支持单选和多选) 2. **prize-goods-template** - 奖品商品模板(已废弃) **统一使用:** `goods-list-template` 模板,它支持单选和多选两种模式,会根据商品数量自动生成正确的表单字段。 ### 模板可用数据字段 模板中每个商品对象包含以下字段: ```javascript { id: '商品ID', name: '商品名称', title: '商品标题', image: '商品图片URL(已处理CDN)', price: '商品价格', goods_sn: '商品编码', spec_type: '规格类型(0=单规格,1=多规格)', category: {name: '分类名称'}, type_name: '商品类型名称', type_text: '商品标签文本(热、新、荐、密等)' } ``` 如需自定义显示样式,可以修改对应的模板文件: `application/admin/view/lottery/activity/scripttpl.html` ## 技术实现 ### URL参数控制 选择器通过以下URL参数控制行为: ``` shop/goods/select?selectMode=single // 单选 shop/goods/select?selectMode=multiple // 多选 shop/goods/select?selectMode=multiple&maxSelect=5 // 多选,最多5个 ``` ### Bootstrap Table配置 ```javascript // 单选模式 { field: 'state', radio: true } // 多选模式 { checkbox: true } ``` ### 事件监听 ```javascript // 多选数量限制控制 table.on('check.bs.table check-all.bs.table', function (e, row) { // 检查选择数量并控制 }); ```