立即购买支持多个商品、新增公共加入购物车操作

feat/task1-c-wallet
gongfuxiang 2022-12-13 17:00:45 +08:00
parent 16183a1139
commit b877887862
19 changed files with 477 additions and 130 deletions

View File

@ -25,8 +25,8 @@
------------------------------------------------------------------------
### 项目介绍
#### ShopXO国内领先企业级免费开源电商系统!
* 求实进取、创新专注、自主研发、国内领先企业级电商系统解决方案。
#### ShopXO国内企业级免费开源电商系统
* 求实进取、创新专注、自主研发、国内企业级电商系统解决方案。
* 遵循MIT开源协议发布无需授权、可商用、可二次开发、满足99%的电商运营需求。
* 支持PC+H5小程序支付宝、微信、百度、头条&抖音、QQ、快手APP等...
* 支持多仓库、多商户、线下门店模式运营组件插件化、即插即用可视化DIY拖拽装修。
@ -48,6 +48,7 @@
* 官方3群1127073697
* 官方多商户群782971010
* 官方多门店群281418967
* 官方进销存群719894308
* 官方uniapp群679303149
### 当前项目源代码平台

View File

@ -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}}

View File

@ -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),
// 公共销售模式

View File

@ -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}}" />

View File

@ -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);

View File

@ -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);

View File

@ -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}}

View File

@ -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' => '正在获取中..',

View File

@ -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>

View File

@ -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;
}

View File

@ -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>';

View File

@ -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;
}
}
/**
*

View File

@ -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');
});
});

View File

@ -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>';
}

View File

@ -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()
{

View File

@ -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;}
/*商品信息*/

View File

@ -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();
});

View File

@ -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)

View File

@ -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;