立即购买支持多个商品、新增公共加入购物车操作
parent
16183a1139
commit
b877887862
|
|
@ -25,8 +25,8 @@
|
|||
------------------------------------------------------------------------
|
||||
|
||||
### 项目介绍
|
||||
#### ShopXO国内领先企业级免费开源电商系统!
|
||||
* 求实进取、创新专注、自主研发、国内领先企业级电商系统解决方案。
|
||||
#### ShopXO国内企业级免费开源电商系统!
|
||||
* 求实进取、创新专注、自主研发、国内企业级电商系统解决方案。
|
||||
* 遵循MIT开源协议发布,无需授权、可商用、可二次开发、满足99%的电商运营需求。
|
||||
* 支持PC+H5,小程序(支付宝、微信、百度、头条&抖音、QQ、快手),APP等...
|
||||
* 支持多仓库、多商户、线下门店模式运营(组件插件化、即插即用),可视化DIY拖拽装修。
|
||||
|
|
@ -48,6 +48,7 @@
|
|||
* 官方3群:1127073697
|
||||
* 官方多商户群:782971010
|
||||
* 官方多门店群:281418967
|
||||
* 官方进销存群:719894308
|
||||
* 官方uniapp群:679303149
|
||||
|
||||
### 当前项目源代码平台
|
||||
|
|
|
|||
|
|
@ -95,6 +95,8 @@
|
|||
var __env_max_input_vars_count__ = '{{$env_max_input_vars_count}}';
|
||||
var __map_view_url__ = '{{:MyUrl("admin/map/index")}}';
|
||||
var __load_map_type__ = '{{$load_map_type}}';
|
||||
var __goods_spec_type_url__ = '';
|
||||
var __goods_spec_detail_url__ = '';
|
||||
// 语言定义(用于js调用、模板引擎直接使用$lang_data.xxx获取对应语言即可)
|
||||
{{if !empty($lang_data)}}
|
||||
{{foreach $lang_data as $k=>$v}}
|
||||
|
|
|
|||
|
|
@ -66,21 +66,15 @@ class Buy extends Common
|
|||
}
|
||||
|
||||
// 获取下单信息
|
||||
$data = MySession('buy_post_data');
|
||||
if(empty($data))
|
||||
$buy_data = MySession('buy_post_data');
|
||||
if(empty($buy_data) || empty($buy_data['goods_data']))
|
||||
{
|
||||
MyViewAssign('msg', '商品信息为空');
|
||||
return MyView('public/tips_error');
|
||||
} else {
|
||||
// 规格数据避免被转义
|
||||
if(!empty($data['spec']))
|
||||
{
|
||||
$data['spec'] = htmlspecialchars_decode($data['spec']);
|
||||
}
|
||||
}
|
||||
|
||||
// 参数
|
||||
$params = array_merge($this->data_request, $data);
|
||||
$params = array_merge($this->data_request, $buy_data);
|
||||
$params['user'] = $this->user;
|
||||
|
||||
// 默认支付方式
|
||||
|
|
@ -104,6 +98,7 @@ class Buy extends Common
|
|||
$assign = [
|
||||
'base' => $buy_base,
|
||||
'buy_goods' => $buy_goods,
|
||||
'buy_data' => $buy_data,
|
||||
// 浏览器名称
|
||||
'home_seo_site_title' => SeoService::BrowserSeoTitle('订单确认', 1),
|
||||
// 公共销售模式
|
||||
|
|
|
|||
|
|
@ -646,10 +646,8 @@
|
|||
{{/if}}
|
||||
</div>
|
||||
<form class="am-form form-validation nav-buy" action="{{:MyUrl('index/buy/add')}}" method="post" class="nav-buy" request-type="ajax-fun" request-value="BuySubmitBack" data-site-type="{{$common_site_type}}" data-base-actual-price="{{$base.actual_price}}" data-is-booking="{{$common_order_is_booking}}">
|
||||
<input type="hidden" name="goods_id" value="{{if isset($params['goods_id'])}}{{$params.goods_id}}{{else /}}0{{/if}}" />
|
||||
<input type="hidden" name="buy_type" value="{{if isset($params['buy_type'])}}{{$params.buy_type}}{{else /}}goods{{/if}}" />
|
||||
<input type="hidden" name="stock" value="{{if isset($params['stock'])}}{{$params.stock}}{{else /}}1{{/if}}" />
|
||||
<input type="hidden" name="spec" value='{{if isset($params['spec'])}}{{$params.spec}}{{/if}}' />
|
||||
<input type="hidden" name="buy_type" value="{{if isset($buy_data['buy_type'])}}{{$buy_data.buy_type}}{{else /}}goods{{/if}}" />
|
||||
<input type="hidden" name="goods_data" value="{{if isset($buy_data['goods_data'])}}{{$buy_data.goods_data}}{{/if}}" />
|
||||
<input type="hidden" name="ids" value="{{if isset($params['ids'])}}{{$params.ids}}{{/if}}" />
|
||||
<input type="hidden" name="address_id" value="{{if isset($base['address']) and isset($base['address']['id'])}}{{$base.address.id}}{{else /}}{{if isset($params['address_id'])}}{{$params.address_id}}{{else /}}-1{{/if}}{{/if}}" />
|
||||
<input type="hidden" name="payment_id" value="{{if isset($params['payment_id'])}}{{$params.payment_id}}{{else /}}0{{/if}}" />
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
{{include file="public/not_data" /}}
|
||||
{{else /}}
|
||||
<form class="am-form form-validation am-form-popup-fixed" method="post" action="{{:MyUrl('index/cart/save')}}" request-type="ajax-fun" request-value="GoodsCartInfoSubmitBack">
|
||||
<div class="goods-spec-container am-padding-sm" data-spectype-url="{{:MyUrl('index/goods/spectype')}}" data-specdetail-url="{{:MyUrl('index/goods/specdetail')}}" >
|
||||
<div class="goods-spec-container am-padding-sm">
|
||||
<h2>
|
||||
<img src="{{$goods.images}}" width="24" height="24" />
|
||||
<span class="am-margin-left-xs">{{$goods.title}}</span>
|
||||
|
|
@ -82,7 +82,7 @@ function GoodsCartInfoSubmitBack(e)
|
|||
Prompt(e.msg, 'success');
|
||||
setTimeout(function()
|
||||
{
|
||||
parent.IframePopupHomeCartNumberTotalUpdate(parseInt(e.data.buy_number), '.common-goods-cart-popup');
|
||||
parent.IframePopupHomeCartNumberTotalUpdate(e.data.buy_number, '.common-goods-cart-popup');
|
||||
}, 1500);
|
||||
} else {
|
||||
Prompt(e.msg);
|
||||
|
|
|
|||
|
|
@ -527,20 +527,18 @@
|
|||
</div>
|
||||
|
||||
<!-- 购买表单 -->
|
||||
<form action="{{:MyUrl('index/buy/index')}}" method="post" class="buy-form">
|
||||
<input type="hidden" name="goods_id" value="{{$goods.id}}" />
|
||||
<form action="{{:MyUrl('index/buy/index')}}" method="post" class="buy-form am-hide">
|
||||
<input type="hidden" name="buy_type" value="goods" />
|
||||
<input type="hidden" name="stock" value="1" />
|
||||
<input type="hidden" name="spec" value="" />
|
||||
<input type="hidden" name="goods_data" value="" />
|
||||
<button type="submit"></button>
|
||||
</form>
|
||||
|
||||
<!-- 加入购物车表单 -->
|
||||
<form action="{{:MyUrl('index/cart/save')}}" method="post" class="cart-form" request-type="ajax-fun" request-value="CartSubmitBack">
|
||||
<form action="{{:MyUrl('index/cart/save')}}" method="post" class="cart-form am-hide" request-type="ajax-fun" request-value="CartSubmitBack">
|
||||
<input type="hidden" name="goods_id" value="{{$goods.id}}" />
|
||||
<input type="hidden" name="stock" value="1" />
|
||||
<input type="hidden" name="spec" value="" />
|
||||
<button type="submit" class="am-hide"></button>
|
||||
<button type="submit"></button>
|
||||
</form>
|
||||
{{else /}}
|
||||
<p class="goods-not-buy-tips">{{if empty($buy_button['error'])}}暂停销售{{else /}}{{$buy_button.error}}{{/if}}</p>
|
||||
|
|
@ -616,7 +614,7 @@
|
|||
<div class="mc">
|
||||
<ul>
|
||||
<div class="mt">
|
||||
<h2>看了又看</h2>
|
||||
<h3>看了又看</h3>
|
||||
</div>
|
||||
{{if !empty($left_goods)}}
|
||||
{{foreach $left_goods as $key=>$v}}
|
||||
|
|
@ -843,7 +841,7 @@ function CartSubmitBack(e)
|
|||
{
|
||||
if(e.code == 0)
|
||||
{
|
||||
HomeCartNumberTotalUpdate(parseInt(e.data.buy_number));
|
||||
HomeCartNumberTotalUpdate(e.data.buy_number);
|
||||
Prompt(e.msg, 'success');
|
||||
} else {
|
||||
Prompt(e.msg);
|
||||
|
|
|
|||
|
|
@ -109,6 +109,10 @@
|
|||
var __env_max_input_vars_count__ = '{{$env_max_input_vars_count}}';
|
||||
var __map_view_url__ = '{{:MyUrl("index/map/index")}}';
|
||||
var __load_map_type__ = '{{$load_map_type}}';
|
||||
var __goods_spec_type_url__ = '{{:MyUrl("index/goods/spectype")}}';
|
||||
var __goods_spec_detail_url__ = '{{:MyUrl("index/goods/specdetail")}}';
|
||||
var __goods_cart_save_url__ = '{{:MyUrl("index/cart/save")}}';
|
||||
var __goods_cart_info_url__ = '{{:MyUrl("index/goods/cartinfo")}}';
|
||||
// 语言定义(用于js调用、模板引擎直接使用$lang_data.xxx获取对应语言即可)
|
||||
{{if !empty($lang_data)}}
|
||||
{{foreach $lang_data as $k=>$v}}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,8 @@ return [
|
|||
'goods_stock_min_tips' => '最低起购数量',
|
||||
'goods_inventory_number_tips' => '库存数量',
|
||||
'goods_no_choice_spec_tips' => '请选择规格',
|
||||
'goods_spec_empty_tips' => '无规格数据',
|
||||
'goods_id_empty_tips' => '商品ID数据',
|
||||
'store_enabled_tips' => '您的浏览器不支持本地存储。请禁用“专用模式”,或升级到现代浏览器。',
|
||||
// 上传下载
|
||||
'get_loading_tips' => '正在获取中..',
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<a href="javascript:;" data-index="{{$k}}" data-value="{{$v.id}}">
|
||||
<span class="data-name">{{$v.name}}</span>
|
||||
{{if !empty($v['items'])}}
|
||||
<span class="data-json am-hide">{{:json_encode($v['items'], JSON_UNESCAPED_UNICODE)}}</span>
|
||||
<span class="data-json am-hide">{{:urlencode(base64_encode(json_encode($v['items'], JSON_UNESCAPED_UNICODE)))}}</span>
|
||||
<i class="am-icon-angle-double-right am-fr"></i>
|
||||
{{/if}}
|
||||
</a>
|
||||
|
|
|
|||
|
|
@ -47,24 +47,8 @@ class BuyService
|
|||
$p = [
|
||||
[
|
||||
'checked_type' => 'empty',
|
||||
'key_name' => 'stock',
|
||||
'error_msg' => '购买数量有误',
|
||||
],
|
||||
[
|
||||
'checked_type' => 'min',
|
||||
'key_name' => 'stock',
|
||||
'checked_data' => 1,
|
||||
'error_msg' => '购买数量有误',
|
||||
],
|
||||
[
|
||||
'checked_type' => 'empty',
|
||||
'key_name' => 'goods_id',
|
||||
'error_msg' => '商品id有误',
|
||||
],
|
||||
[
|
||||
'checked_type' => 'isset',
|
||||
'key_name' => 'spec',
|
||||
'error_msg' => '规格参数有误',
|
||||
'key_name' => 'goods_data',
|
||||
'error_msg' => '购买商品有误',
|
||||
],
|
||||
];
|
||||
$ret = ParamsChecked($params, $p);
|
||||
|
|
@ -72,11 +56,16 @@ class BuyService
|
|||
{
|
||||
return DataReturn($ret, -1);
|
||||
}
|
||||
if(!is_array($params['goods_data']))
|
||||
{
|
||||
$params['goods_data'] = json_decode(base64_decode(urldecode($params['goods_data'])), true);
|
||||
}
|
||||
|
||||
// 获取商品
|
||||
$goods_ids = array_column($params['goods_data'], 'goods_id');
|
||||
$goods_params = array_merge($params, [
|
||||
'where' => [
|
||||
['id', '=', intval($params['goods_id'])],
|
||||
['id', 'in', $goods_ids],
|
||||
['is_delete_time', '=', 0],
|
||||
['is_shelves', '=', 1],
|
||||
],
|
||||
|
|
@ -87,51 +76,62 @@ class BuyService
|
|||
{
|
||||
return DataReturn('资源不存在或已被删除', -10);
|
||||
}
|
||||
$goods = $ret['data'][0];
|
||||
|
||||
// 规格
|
||||
$goods['spec'] = self::GoodsSpecificationsHandle($params);
|
||||
|
||||
// id处理、避免不同规格导致id一样
|
||||
$goods['id'] = md5($goods['goods_id'].(empty($goods['spec']) ? 'default' : implode('', array_column($goods['spec'], 'value'))));
|
||||
|
||||
// 获取商品基础信息
|
||||
$spec_params = array_merge($params, [
|
||||
'id' => $goods['goods_id'],
|
||||
'spec' => $goods['spec'],
|
||||
'stock' => $params['stock']
|
||||
]);
|
||||
$goods_base = GoodsService::GoodsSpecDetail($spec_params);
|
||||
if($goods_base['code'] == 0)
|
||||
// 商品处理
|
||||
$data = [];
|
||||
$temp_goods = array_column($ret['data'], null, 'id');
|
||||
foreach($params['goods_data'] as $v)
|
||||
{
|
||||
$goods['inventory'] = $goods_base['data']['spec_base']['inventory'];
|
||||
$goods['price'] = (float) $goods_base['data']['spec_base']['price'];
|
||||
$goods['original_price'] = (float) $goods_base['data']['spec_base']['original_price'];
|
||||
$goods['spec_weight'] = $goods_base['data']['spec_base']['weight'];
|
||||
$goods['spec_volume'] = $goods_base['data']['spec_base']['volume'];
|
||||
$goods['spec_coding'] = $goods_base['data']['spec_base']['coding'];
|
||||
$goods['spec_barcode'] = $goods_base['data']['spec_base']['barcode'];
|
||||
$goods['extends'] = $goods_base['data']['spec_base']['extends'];
|
||||
} else {
|
||||
return $goods_base;
|
||||
}
|
||||
|
||||
// 获取商品规格图片
|
||||
if(!empty($goods['spec']))
|
||||
{
|
||||
$images = self::BuyGoodsSpecImages($goods['goods_id'], $goods['spec']);
|
||||
if(!empty($images))
|
||||
if(array_key_exists($v['goods_id'], $temp_goods))
|
||||
{
|
||||
$goods['images'] = ResourcesService::AttachmentPathViewHandle($images);
|
||||
$goods['images_old'] = $images;
|
||||
// 商品
|
||||
$goods = $temp_goods[$v['goods_id']];
|
||||
|
||||
// 规格
|
||||
$goods['spec'] = self::GoodsSpecificationsHandle($v);
|
||||
|
||||
// id处理、避免不同规格导致id一样
|
||||
$goods['id'] = md5($goods['goods_id'].(empty($goods['spec']) ? 'default' : implode('', array_column($goods['spec'], 'value'))));
|
||||
|
||||
// 获取商品基础信息
|
||||
$spec_params = array_merge($params, [
|
||||
'id' => $goods['goods_id'],
|
||||
'spec' => $goods['spec'],
|
||||
'stock' => $v['stock']
|
||||
]);
|
||||
$goods_base = GoodsService::GoodsSpecDetail($spec_params);
|
||||
if($goods_base['code'] == 0)
|
||||
{
|
||||
$goods['inventory'] = $goods_base['data']['spec_base']['inventory'];
|
||||
$goods['price'] = (float) $goods_base['data']['spec_base']['price'];
|
||||
$goods['original_price'] = (float) $goods_base['data']['spec_base']['original_price'];
|
||||
$goods['spec_weight'] = $goods_base['data']['spec_base']['weight'];
|
||||
$goods['spec_volume'] = $goods_base['data']['spec_base']['volume'];
|
||||
$goods['spec_coding'] = $goods_base['data']['spec_base']['coding'];
|
||||
$goods['spec_barcode'] = $goods_base['data']['spec_base']['barcode'];
|
||||
$goods['extends'] = $goods_base['data']['spec_base']['extends'];
|
||||
} else {
|
||||
return $goods_base;
|
||||
}
|
||||
|
||||
// 获取商品规格图片
|
||||
if(!empty($goods['spec']))
|
||||
{
|
||||
$images = self::BuyGoodsSpecImages($goods['goods_id'], $goods['spec']);
|
||||
if(!empty($images))
|
||||
{
|
||||
$goods['images'] = ResourcesService::AttachmentPathViewHandle($images);
|
||||
$goods['images_old'] = $images;
|
||||
}
|
||||
}
|
||||
|
||||
// 数量/小计
|
||||
$goods['stock'] = $v['stock'];
|
||||
$goods['total_price'] = $v['stock']* ((float) $goods['price']);
|
||||
$data[] = $goods;
|
||||
}
|
||||
}
|
||||
|
||||
// 数量/小计
|
||||
$goods['stock'] = $params['stock'];
|
||||
$goods['total_price'] = $params['stock']* ((float) $goods['price']);
|
||||
|
||||
$ret['data'] = [$goods];
|
||||
$ret['data'] = $data;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,10 @@ class Page
|
|||
$this->tips_msg = empty($params['tips_msg']) ? '' : trim($params['tips_msg']);
|
||||
$this->page_total = 1;
|
||||
$this->html = '';
|
||||
// 插件基础参数不参与条件
|
||||
$this->not_fields[] = 'pluginsname';
|
||||
$this->not_fields[] = 'pluginscontrol';
|
||||
$this->not_fields[] = 'pluginsaction';
|
||||
|
||||
/* 参数设置 */
|
||||
$this->SetParem();
|
||||
|
|
@ -129,11 +133,11 @@ class Page
|
|||
$this->html .= '</li>';
|
||||
|
||||
$this->html .= '<span class="am-margin-left-sm">每页</span>';
|
||||
$this->html .= '<input type="text" min="1" class="am-form-field am-inline-block am-text-center am-margin-horizontal-xs am-radius pagination-input" value="'.$this->page_size.'" onchange="window.location.href=\''.str_replace(['&page_size='.$this->page_size, 'page_size='.$this->page_size.'&'], '', $this->url).$this->page_join.'page_size=\'+(isNaN(parseInt(this.value)) ? 10 : parseInt(this.value) || 10);" onclick="this.select()" />';
|
||||
$this->html .= '<input type="text" min="1" data-is-clearout="0" class="am-form-field am-inline-block am-text-center am-margin-horizontal-xs am-radius pagination-input" value="'.$this->page_size.'" onchange="window.location.href=\''.str_replace(['&page_size='.$this->page_size, 'page_size='.$this->page_size.'&'], '', $this->url).$this->page_join.'page_size=\'+(isNaN(parseInt(this.value)) ? 10 : parseInt(this.value) || 10);" onclick="this.select()" />';
|
||||
$this->html .= '<span>条</span>';
|
||||
|
||||
$this->html .= '<span class="am-margin-left-sm">跳转到</span>';
|
||||
$this->html .= '<input type="text" min="1" class="am-form-field am-inline-block am-text-center am-margin-horizontal-xs am-radius pagination-input" value="'.$this->page.'" onchange="window.location.href=\''.$this->url.$this->page_join.'page=\'+(isNaN(parseInt(this.value)) ? 1 : parseInt(this.value) || 1);" onclick="this.select()" />';
|
||||
$this->html .= '<input type="text" min="1" data-is-clearout="0" class="am-form-field am-inline-block am-text-center am-margin-horizontal-xs am-radius pagination-input" value="'.$this->page.'" onchange="window.location.href=\''.$this->url.$this->page_join.'page=\'+(isNaN(parseInt(this.value)) ? 1 : parseInt(this.value) || 1);" onclick="this.select()" />';
|
||||
$this->html .= '<span>页</span>';
|
||||
|
||||
$this->html .= '<div>';
|
||||
|
|
|
|||
|
|
@ -1721,6 +1721,79 @@ a.input-clearout-submit:focus > i {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* 商品可选规格
|
||||
*/
|
||||
.common-goods-spec-choice-content {
|
||||
width: 360px;
|
||||
height: auto;
|
||||
max-height: 300px;
|
||||
text-align: left;
|
||||
}
|
||||
.common-goods-spec-choice-content .spec-options {
|
||||
overflow: hidden;
|
||||
padding: 0 1px;
|
||||
margin: 5px 0;
|
||||
}
|
||||
.common-goods-spec-choice-content .spec-title, .price-title {
|
||||
font-weight: 500;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-line {
|
||||
float: left;
|
||||
margin: 5px 25px 10px 0;
|
||||
background: #efefef;
|
||||
padding: 8px 20px;
|
||||
border: 1px solid #d5d5d5;
|
||||
cursor: pointer;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-line:hover {
|
||||
background: none;
|
||||
color: #333;
|
||||
border: 1px solid #e23f36;
|
||||
box-shadow: 0px 0 0px 1px #e23f36;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-line.selected {
|
||||
background: #e23f36;
|
||||
color: #fff;
|
||||
border: 1px solid #e23f36;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-line-images {
|
||||
padding: 6px 15px !important;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-line-images img {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-not-active {
|
||||
border: 1px solid #f03726 !important;
|
||||
box-shadow: 0 0px 3px #ed7f76, 0 0 6px rgba(0, 0, 0, 0);
|
||||
padding: 5px 10px 0 10px;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-items-disabled {
|
||||
color: #d2cfcf !important;
|
||||
background-color: #ffffff !important;
|
||||
border: 1px dashed #d5d5d5 !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-dont-choose {
|
||||
color: #b4b3b3 !important;
|
||||
background-color: #ffffff !important;
|
||||
border: 1px solid #ebeaea !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-dont-choose img {
|
||||
opacity: 0.5;
|
||||
}
|
||||
.common-goods-spec-choice-content .sku-items-disabled img {
|
||||
opacity: 0.3;
|
||||
}
|
||||
@media only screen and (max-width: 641px) {
|
||||
.common-goods-spec-choice-content {
|
||||
max-width: 260px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 滚动条样式
|
||||
|
|
|
|||
|
|
@ -2793,6 +2793,123 @@ function ColorPickerInit()
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取规格详情
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2018-12-14
|
||||
* @desc description
|
||||
*/
|
||||
function CommonGoodsChoiceSpecDetail()
|
||||
{
|
||||
// 是否全部选中
|
||||
var $spec = $('.common-goods-spec-choice-content');
|
||||
var sku_count = $spec.find('.sku-items').length;
|
||||
var active_count = $spec.find('.sku-items li.selected').length;
|
||||
if(active_count < sku_count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取规格值
|
||||
var spec = [];
|
||||
$spec.find('.sku-items li.selected').each(function(k, v)
|
||||
{
|
||||
spec.push({"type": $(this).data('type-value'), "value": $(this).data('value')})
|
||||
});
|
||||
|
||||
// ajax请求
|
||||
$.AMUI.progress.start();
|
||||
$.ajax({
|
||||
url: RequestUrlHandle(__goods_spec_detail_url__),
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
timeout: 10000,
|
||||
data: {"id": $spec.data('id'), "spec": spec},
|
||||
success: function(result)
|
||||
{
|
||||
$.AMUI.progress.done();
|
||||
if(result.code != 0)
|
||||
{
|
||||
Prompt(result.msg);
|
||||
}
|
||||
},
|
||||
error: function(xhr, type)
|
||||
{
|
||||
$.AMUI.progress.done();
|
||||
Prompt(HtmlToString(xhr.responseText) || '异常错误', null, 30);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取规格类型
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2018-12-14
|
||||
* @desc description
|
||||
*/
|
||||
function CommonGoodsChoiceSpecType()
|
||||
{
|
||||
// 是否全部选中
|
||||
var $spec = $('.common-goods-spec-choice-content');
|
||||
var sku_count = $spec.find('.sku-items').length;
|
||||
var active_count = $spec.find('.sku-items li.selected').length;
|
||||
if(active_count <= 0 || active_count >= sku_count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取规格值
|
||||
var spec = [];
|
||||
$spec.find('.sku-items li.selected').each(function(k, v)
|
||||
{
|
||||
spec.push({"type": $(this).data('type-value'), "value": $(this).data('value')})
|
||||
});
|
||||
|
||||
// ajax请求
|
||||
$.AMUI.progress.start();
|
||||
$.ajax({
|
||||
url: RequestUrlHandle(__goods_spec_type_url__),
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
timeout: 10000,
|
||||
data: {"id": $spec.data('id'), "spec": spec},
|
||||
success: function(result)
|
||||
{
|
||||
$.AMUI.progress.done();
|
||||
if(result.code == 0)
|
||||
{
|
||||
var spec_count = spec.length;
|
||||
var index = (spec_count > 0) ? spec_count : 0;
|
||||
if(index < sku_count)
|
||||
{
|
||||
$spec.find('.sku-items').eq(index).find('li').each(function(k, v)
|
||||
{
|
||||
$(this).removeClass('sku-dont-choose');
|
||||
var value = $(this).data('value').toString();
|
||||
if(result.data.spec_type.indexOf(value) == -1)
|
||||
{
|
||||
$(this).addClass('sku-items-disabled');
|
||||
} else {
|
||||
$(this).removeClass('sku-items-disabled');
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
Prompt(result.msg);
|
||||
}
|
||||
},
|
||||
error: function(xhr, type)
|
||||
{
|
||||
$.AMUI.progress.done();
|
||||
Prompt(HtmlToString(xhr.responseText) || '异常错误', null, 30);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// 公共数据操作
|
||||
$(function()
|
||||
|
|
@ -4172,14 +4289,14 @@ $(function()
|
|||
});
|
||||
|
||||
// 加入购物车
|
||||
$('.common-cart-submit-event').on('click', function()
|
||||
$(document).on('click', '.common-goods-cart-submit-event', function()
|
||||
{
|
||||
var goods_id = $(this).data('gid');
|
||||
if(parseInt($(this).data('is-many-spec') || 0) == 0)
|
||||
{
|
||||
$.AMUI.progress.start();
|
||||
$.ajax({
|
||||
url: RequestUrlHandle($(this).data('cart-save-url')),
|
||||
url: RequestUrlHandle(__goods_cart_save_url__),
|
||||
type: 'post',
|
||||
dataType: "json",
|
||||
timeout: 10000,
|
||||
|
|
@ -4206,7 +4323,148 @@ $(function()
|
|||
});
|
||||
} else {
|
||||
// 开启规格选择弹窗
|
||||
ModalLoad(UrlFieldReplace('id', goods_id, $(this).data('cart-info-url')), '', 'common-goods-cart-popup');
|
||||
ModalLoad(UrlFieldReplace('id', goods_id, __goods_cart_info_url__), '', 'common-goods-cart-popup');
|
||||
}
|
||||
});
|
||||
|
||||
// 商品规格选择
|
||||
var $common_goods_spec_choice_submit_event_obj = null;
|
||||
$(document).on('click', '.common-goods-spec-choice-submit-event', function()
|
||||
{
|
||||
// 基础参数
|
||||
var goods_id = $(this).data('goods-id') || null;
|
||||
if(goods_id == null)
|
||||
{
|
||||
Prompt(window['lang_goods_id_empty_tips'] || '商品ID数据');
|
||||
return false;
|
||||
}
|
||||
var spec = $(this).data('spec') || null;
|
||||
if(spec == null)
|
||||
{
|
||||
Prompt(window['lang_goods_spec_empty_tips'] || '无规格数据');
|
||||
return false;
|
||||
}
|
||||
spec = JSON.parse(CryptoJS.enc.Base64.parse(decodeURIComponent(spec)).toString(CryptoJS.enc.Utf8));
|
||||
|
||||
// 规格处理
|
||||
var html = `<div class="common-goods-spec-choice-container am-padding-sm">`;
|
||||
html += `<div class="common-goods-spec-choice-content am-scrollable-vertical" data-id="`+goods_id+`">`;
|
||||
for(var i in spec)
|
||||
{
|
||||
html += `<div class="spec-options sku-items am-radius">
|
||||
<div class="spec-title">`+spec[i]['name']+`</div>
|
||||
<ul>`;
|
||||
for(var t in spec[i]['value'])
|
||||
{
|
||||
var temp = spec[i]['value'][t];
|
||||
html += `<li class="am-radius sku-line `+((temp['images'] || null) != null ? ' sku-line-images' : '')+` `+((i > 0) ? ' sku-dont-choose' : '')+` `+((parseInt(temp['is_only_level_one'] || 0) == 1 && parseInt(temp['inventory'] || 0) <= 0) ? ' sku-items-disabled' : '')+`" data-type-value="`+temp['name']+`" data-value="`+temp['name']+`" data-type-images="`+((temp['images'] || null) != null ? temp['images'] : '')+`">`;
|
||||
if((temp['images'] || null) != null)
|
||||
{
|
||||
html += `<img src="`+temp['images']+`" class="am-radius" />`;
|
||||
}
|
||||
html += temp['name']+`<i></i>
|
||||
</li>`;
|
||||
}
|
||||
html += `</ul>`;
|
||||
html += `</div>`;
|
||||
}
|
||||
html += '</div>';
|
||||
html += '<button type="button" class="am-btn am-btn-primary am-radius am-btn-xs am-btn-block am-margin-top-lg common-goods-spec-choice-confirm-submit">确认</button>';
|
||||
html += '</div>';
|
||||
|
||||
// 调用弹窗组件
|
||||
AMUI.dialog.alert({
|
||||
isClose: true,
|
||||
content: html
|
||||
});
|
||||
// 当前对象赋值
|
||||
$common_goods_spec_choice_submit_event_obj = $(this);
|
||||
});
|
||||
// 商品规格选择
|
||||
$(document).on('click', '.common-goods-spec-choice-content .spec-options ul>li', function()
|
||||
{
|
||||
// 规格处理
|
||||
var $parent = $(this).parents('.common-goods-spec-choice-content');
|
||||
var length = $parent.find('.sku-items').length;
|
||||
var index = $(this).parents('.sku-items').index();
|
||||
if($(this).hasClass('selected'))
|
||||
{
|
||||
$(this).removeClass('selected');
|
||||
|
||||
// 去掉元素之后的禁止
|
||||
$parent.find('.sku-items').each(function(k, v)
|
||||
{
|
||||
if(k > index)
|
||||
{
|
||||
$(this).find('li').removeClass('sku-items-disabled').removeClass('selected').addClass('sku-dont-choose');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if($(this).hasClass('sku-items-disabled') || $(this).hasClass('sku-dont-choose'))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$(this).addClass('selected').siblings('li').removeClass('selected');
|
||||
$(this).parents('.sku-items').removeClass('sku-not-active');
|
||||
|
||||
// 去掉元素之后的禁止
|
||||
if(index < length)
|
||||
{
|
||||
$parent.find('.sku-items').each(function(k, v)
|
||||
{
|
||||
if(k > index)
|
||||
{
|
||||
$(this).find('li').removeClass('sku-items-disabled').removeClass('selected').addClass('sku-dont-choose');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 获取下一个规格类型
|
||||
CommonGoodsChoiceSpecType();
|
||||
|
||||
// 获取规格详情
|
||||
CommonGoodsChoiceSpecDetail();
|
||||
}
|
||||
});
|
||||
// 商品规格选择确认
|
||||
$(document).on('click', '.common-goods-spec-choice-confirm-submit', function()
|
||||
{
|
||||
var $parent = $(this).parents('.common-goods-spec-choice-container');
|
||||
// 是否存在规格数据
|
||||
var sku_count = $parent.find('.sku-items').length;
|
||||
if(sku_count <= 0)
|
||||
{
|
||||
Prompt(window['lang_goods_spec_empty_tips'] || '无规格数据');
|
||||
return false;
|
||||
}
|
||||
|
||||
// 是否已选择处理
|
||||
var spec_count = $('.sku-line.selected').length;
|
||||
if(spec_count < sku_count)
|
||||
{
|
||||
$parent.find('.sku-items').each(function(k, v)
|
||||
{
|
||||
if($(this).find('.sku-line.selected').length == 0)
|
||||
{
|
||||
$(this).addClass('sku-not-active');
|
||||
}
|
||||
});
|
||||
Prompt(window['lang_goods_no_choice_spec_tips'] || '请选择规格');
|
||||
return false;
|
||||
}
|
||||
|
||||
// 已选规格
|
||||
var spec = [];
|
||||
var value = [];
|
||||
$('.sku-items li.selected').each(function(k, v)
|
||||
{
|
||||
spec.push({"type": $(this).data('type-value'), "value": $(this).data('value')});
|
||||
value.push($(this).data('value'));
|
||||
});
|
||||
|
||||
// 赋值已选
|
||||
$common_goods_spec_choice_submit_event_obj.attr('data-value', encodeURIComponent(CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(JSON.stringify(spec))))).text(value.join(' / '));
|
||||
// 关闭弹窗
|
||||
$(this).parents('.am-modal-dialog').find('.am-modal-hd .am-close').trigger('click');
|
||||
});
|
||||
});
|
||||
|
|
@ -4053,7 +4053,7 @@ $(function()
|
|||
var data = $(this).find('span.data-json').text() || null;
|
||||
if(data != null)
|
||||
{
|
||||
data = JSON.parse(data) || null;
|
||||
data = JSON.parse(CryptoJS.enc.Base64.parse(decodeURIComponent(data)).toString(CryptoJS.enc.Utf8))
|
||||
}
|
||||
|
||||
// 参数
|
||||
|
|
@ -4066,11 +4066,11 @@ $(function()
|
|||
var html = '';
|
||||
for(var i in data)
|
||||
{
|
||||
var json = (data[i]['items'] || null) == null ? '' : JSON.stringify(data[i]['items']);
|
||||
var json = ((data[i]['items'] || null) == null || data[i]['items'].length == 0) ? '' : encodeURIComponent(CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(JSON.stringify(data[i]['items']))));
|
||||
html += '<li><a href="javascript:;" data-value="'+data[i]['id']+'">';
|
||||
html += '<span class="data-name">'+data[i]['name']+'</span>';
|
||||
html += '<span class="data-json am-hide">'+json+'</span>';
|
||||
if((data[i]['items'] || null) != null)
|
||||
if((data[i]['items'] || null) != null && data[i]['items'].length > 0)
|
||||
{
|
||||
html += '<i class="am-icon-angle-double-right am-fr"></i>';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,17 +14,18 @@ var dialog = dialog || {};
|
|||
|
||||
dialog.alert = function(options) {
|
||||
options = options || {};
|
||||
options.class_name = options.class_name || '';
|
||||
options.class = options.class || '';
|
||||
options.title = options.title || null;
|
||||
options.content = options.content || '提示内容';
|
||||
options.confirmText = options.confirmText || '确定';
|
||||
options.isClose = options.isClose || false;
|
||||
options.isBtn = options.isBtn || false;
|
||||
options.config = options.config || {};
|
||||
options.onConfirm = options.onConfirm || function() {
|
||||
};
|
||||
var html = [];
|
||||
html.push('<div class="am-modal am-modal-alert '+options.class_name+'" tabindex="-1">');
|
||||
html.push('<div class="am-modal-dialog am-radius">');
|
||||
html.push('<div class="am-modal am-modal-alert '+options.class+'" tabindex="-1">');
|
||||
html.push('<div class="am-modal-dialog am-radius am-nbfc">');
|
||||
if(options.title !== null || options.isClose === true)
|
||||
{
|
||||
html.push('<div class="am-modal-hd">');
|
||||
|
|
@ -41,7 +42,7 @@ dialog.alert = function(options) {
|
|||
html.push('<div class="am-modal-bd">' + options.content + '</div>');
|
||||
if(options.isBtn)
|
||||
{
|
||||
html.push('<div class="am-modal-footer"><span class="am-modal-btn">确定</span></div>');
|
||||
html.push('<div class="am-modal-footer"><span class="am-modal-btn">'+options.confirmText+'</span></div>');
|
||||
}
|
||||
html.push('</div>');
|
||||
html.push('</div>');
|
||||
|
|
@ -63,6 +64,8 @@ dialog.confirm = function(options) {
|
|||
options = options || {};
|
||||
options.title = options.title || '提示';
|
||||
options.content = options.content || '提示内容';
|
||||
options.cancelText = options.cancelText || '取消';
|
||||
options.confirmText = options.confirmText || '确定';
|
||||
options.onConfirm = options.onConfirm || function() {
|
||||
};
|
||||
options.onCancel = options.onCancel || function() {
|
||||
|
|
@ -70,12 +73,12 @@ dialog.confirm = function(options) {
|
|||
|
||||
var html = [];
|
||||
html.push('<div class="am-modal am-modal-confirm" tabindex="-1">');
|
||||
html.push('<div class="am-modal-dialog am-radius">');
|
||||
html.push('<div class="am-modal-dialog am-radius am-nbfc">');
|
||||
html.push('<div class="am-modal-hd">' + options.title + '</div>');
|
||||
html.push('<div class="am-modal-bd"><div class="am-padding-horizontal-xl am-padding-vertical-xs">' + options.content + '</div></div>');
|
||||
html.push('<div class="am-modal-footer">');
|
||||
html.push('<span class="am-modal-btn" data-am-modal-cancel>取消</span>');
|
||||
html.push('<span class="am-modal-btn" data-am-modal-confirm>确定</span>');
|
||||
html.push('<span class="am-modal-btn" data-am-modal-cancel>'+options.cancelText+'</span>');
|
||||
html.push('<span class="am-modal-btn" data-am-modal-confirm>'+options.confirmText+'</span>');
|
||||
html.push('</div>');
|
||||
html.push('</div>');
|
||||
html.push('</div>');
|
||||
|
|
@ -109,7 +112,7 @@ dialog.loading = function(options) {
|
|||
} else {
|
||||
var html = [];
|
||||
html.push('<div class="am-modal am-modal-loading am-modal-no-btn" tabindex="-1" id="my-modal-loading">');
|
||||
html.push('<div class="am-modal-dialog am-radius">');
|
||||
html.push('<div class="am-modal-dialog am-radius am-nbfc">');
|
||||
html.push('<div class="am-modal-bd am-padding-vertical-0">');
|
||||
html.push('<div class="am-padding-horizontal-sm am-padding-vertical-sm">');
|
||||
html.push('<span class="am-icon-spinner am-icon-spin"></span>');
|
||||
|
|
@ -119,8 +122,7 @@ dialog.loading = function(options) {
|
|||
html.push('</div>');
|
||||
html.push('</div>');
|
||||
|
||||
return $(html.join('')).appendTo('body').modal()
|
||||
.on('closed.modal.amui', function() {
|
||||
return $(html.join('')).appendTo('body').modal().on('closed.modal.amui', function() {
|
||||
$(this).remove();
|
||||
});
|
||||
}
|
||||
|
|
@ -130,30 +132,29 @@ dialog.loading = function(options) {
|
|||
dialog.actions = function(options) {
|
||||
options = options || {};
|
||||
options.title = options.title || '您想整咋样?';
|
||||
options.cancelText = options.cancelText || '取消';
|
||||
options.items = options.items || [];
|
||||
options.onSelected = options.onSelected || function() {
|
||||
$acions.close();
|
||||
};
|
||||
var html = [];
|
||||
html.push('<div class="am-modal-actions">');
|
||||
html.push('<div class="am-modal-actions-group">');
|
||||
html.push('<div class="am-modal-actions-group am-radius am-nbfc">');
|
||||
html.push('<ul class="am-list">');
|
||||
html.push('<li class="am-modal-actions-header">' + options.title + '</li>');
|
||||
options.items.forEach(function(item, index) {
|
||||
html.push('<li index="' + index + '">' + item.content + '</li>');
|
||||
html.push('<li class="am-padding-sm" index="' + index + '">' + item.content + '</li>');
|
||||
});
|
||||
html.push('</ul>');
|
||||
html.push('</div>');
|
||||
html.push('<div class="am-modal-actions-group">');
|
||||
html.push('<button class="am-btn am-btn-secondary am-btn-block" data-am-modal-close>取消</button>');
|
||||
html.push('<button class="am-btn am-btn-secondary am-btn-block am-radius" data-am-modal-close>'+options.cancelText+'</button>');
|
||||
html.push('</div>');
|
||||
html.push('</div>');
|
||||
|
||||
var $acions = $(html.join('')).appendTo('body');
|
||||
|
||||
$acions.find('.am-list>li').bind('click', function(e) {
|
||||
options.onSelected($(this).attr('index'), this);
|
||||
});
|
||||
var $acions = $(html.join('')).appendTo('body').modal();
|
||||
if((options.onSelected || null) != null && typeof(options.onSelected) == 'function') {
|
||||
$acions.find('.am-list>li').bind('click', function(e) {
|
||||
options.onSelected($(this).attr('index'), $(this), $acions);
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
show: function() {
|
||||
|
|
@ -193,8 +194,7 @@ dialog.popup = function(options) {
|
|||
}
|
||||
html.push('</div> ');
|
||||
html.push('</div>');
|
||||
return $(html.join('')).appendTo('body').modal()
|
||||
.on('closed.modal.amui', function() {
|
||||
return $(html.join('')).appendTo('body').modal().on('closed.modal.amui', function() {
|
||||
var $this = $(this);
|
||||
setTimeout(function()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ input{font-size:12px;font-size:100%;outline:none;line-height:normal;color:#444;}
|
|||
|
||||
/*内容布局*/
|
||||
.clearfix-right dd { margin: 0; }
|
||||
.theme-popover .theme-poptit h3,.btn.close,i.buy-event, form.buy-form {display:none}
|
||||
.theme-popover .theme-poptit h3,.btn.close,i.buy-event {display:none}
|
||||
.theme-span{width:100%;background:transparent;height: 15px;}
|
||||
.theme-popbod.dform{background:#fff;}
|
||||
/*商品信息*/
|
||||
|
|
|
|||
|
|
@ -179,18 +179,27 @@ $(function()
|
|||
});
|
||||
|
||||
// 导航固定
|
||||
var nav_top = $('.cart-nav').length > 0 ? $('.cart-nav').offset().top : 0;
|
||||
var $nav = $('.cart-nav');
|
||||
var nav_top = $nav.length > 0 ? $nav.offset().top : 0;
|
||||
function CartNavPop()
|
||||
{
|
||||
var scroll = $(document).scrollTop();
|
||||
var location = scroll+$(window).height()-100;
|
||||
var bottom = ($(window).width() < 640) ? '49px' : '0';
|
||||
var height = $nav.innerHeight();
|
||||
var location = scroll+$(window).height()-height;
|
||||
var bottom = ($(window).width() < 640) ? height+'px' : '0';
|
||||
if($(window).width() < 640)
|
||||
{
|
||||
location -= $('.mobile-navigation').innerHeight();
|
||||
var bottom = (height-1)+'px';
|
||||
} else {
|
||||
var bottom = 0;
|
||||
}
|
||||
if(location < nav_top)
|
||||
{
|
||||
$('.cart-nav').css({"position":"fixed", "bottom":bottom, "width":$('.cart-content').width()+"px", "z-index":1000});
|
||||
$('body').css({"padding-bottom":"50px"});
|
||||
$nav.css({"position":"fixed", "bottom":bottom, "width":$('.cart-content').width()+"px", "z-index":1000});
|
||||
$('body').css({"padding-bottom":height+"px"});
|
||||
} else {
|
||||
$('.cart-nav').css({"position":"relative", "bottom":0, "z-index":0, "width":"100%"});
|
||||
$nav.css({"position":"relative", "bottom":0, "z-index":0, "width":"100%"});
|
||||
$('body').css({"padding-bottom":"0"});
|
||||
}
|
||||
}
|
||||
|
|
@ -203,7 +212,6 @@ $(function()
|
|||
// 浏览器窗口实时事件
|
||||
$(window).resize(function()
|
||||
{
|
||||
// 导航固定初始化
|
||||
CartNavPop();
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -30,9 +30,9 @@ function GoodsCartInfoSpecDetail()
|
|||
|
||||
// ajax请求
|
||||
$.ajax({
|
||||
url: $cart_info_goods_spec.data('specdetail-url'),
|
||||
url: RequestUrlHandle(__goods_spec_detail_url__),
|
||||
type: 'post',
|
||||
dataType: "json",
|
||||
dataType: 'json',
|
||||
timeout: 10000,
|
||||
data: {"id": $('.goods-spec-content').data('id'), "spec": spec, "stock": stock},
|
||||
success: function(result)
|
||||
|
|
@ -105,9 +105,9 @@ function GoodsCartInfoSpecType()
|
|||
|
||||
// ajax请求
|
||||
$.ajax({
|
||||
url: $cart_info_goods_spec.data('spectype-url'),
|
||||
url: RequestUrlHandle(__goods_spec_type_url__),
|
||||
type: 'post',
|
||||
dataType: "json",
|
||||
dataType: 'json',
|
||||
timeout: 10000,
|
||||
data: {"id": $('.goods-spec-content').data('id'), "spec": spec},
|
||||
success: function(result)
|
||||
|
|
|
|||
|
|
@ -179,9 +179,13 @@ function BuyCartHandle(e)
|
|||
{
|
||||
// 立即购买
|
||||
case 'buy' :
|
||||
var goods_data = encodeURIComponent(CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(JSON.stringify([{
|
||||
goods_id: params.id,
|
||||
stock: params.stock,
|
||||
spec: params.spec
|
||||
}]))));
|
||||
var $form = $('form.buy-form');
|
||||
$form.find('input[name="spec"]').val(JSON.stringify(params.spec));
|
||||
$form.find('input[name="stock"]').val(params.stock);
|
||||
$form.find('input[name="goods_data"]').val(goods_data);
|
||||
$form.find('button[type="submit"]').trigger('click');
|
||||
break;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue