mirror of
https://gitee.com/zongzhige/shopxo.git
synced 2026-06-06 16:21:54 +08:00
商品详情及用户优化
This commit is contained in:
@ -77,10 +77,11 @@ class Buy extends Common
|
||||
|
||||
// 数据返回组装
|
||||
$result = [
|
||||
'goods_list' => $buy_goods,
|
||||
'payment_list' => $payment_list,
|
||||
'base' => $buy_base,
|
||||
'common_site_type' => (int) $buy_base['common_site_type'],
|
||||
'goods_list' => $buy_goods,
|
||||
'payment_list' => $payment_list,
|
||||
'base' => $buy_base,
|
||||
'common_site_type' => (int) $buy_base['common_site_type'],
|
||||
'default_payment_id' => $params['payment_id'],
|
||||
];
|
||||
$ret = SystemBaseService::DataReturn($result);
|
||||
}
|
||||
|
||||
@ -304,7 +304,7 @@
|
||||
|
||||
<!--各种规格-->
|
||||
{{if $goods['is_shelves'] == 1 and $goods['inventory'] gt 0}}
|
||||
<dl class="iteminfo_parameter sys_item_specpara">
|
||||
<dl class="buy-spec-info-container">
|
||||
<dt class="buy-event mini-spec-event" data-type="buy">
|
||||
<div class="cart-title">
|
||||
<span class="specpara-title">{{:MyLang('goods.panel_can_choice_spec_name')}}</span>
|
||||
@ -535,9 +535,7 @@
|
||||
|
||||
<!-- 加入购物车表单 -->
|
||||
<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="" />
|
||||
<input type="hidden" name="goods_data" value="" />
|
||||
<button type="submit"></button>
|
||||
</form>
|
||||
{{else /}}
|
||||
|
||||
@ -200,6 +200,60 @@ class GoodsCartService
|
||||
* @param [array] $params [输入参数]
|
||||
*/
|
||||
public static function GoodsCartSave($params = [])
|
||||
{
|
||||
// 请求参数
|
||||
$p = [
|
||||
[
|
||||
'checked_type' => 'empty',
|
||||
'key_name' => 'user',
|
||||
'error_msg' => MyLang('user_info_incorrect_tips'),
|
||||
],
|
||||
];
|
||||
$ret = ParamsChecked($params, $p);
|
||||
if($ret !== true)
|
||||
{
|
||||
return DataReturn($ret, -1);
|
||||
}
|
||||
|
||||
// 是否批量
|
||||
$ret = DataReturn(MyLang('operate_fail'), -1);
|
||||
if(!empty($params['goods_data']))
|
||||
{
|
||||
// 是否数组
|
||||
if(!is_array($params['goods_data']))
|
||||
{
|
||||
$params['goods_data'] = json_decode(base64_decode(urldecode($params['goods_data'])), true);
|
||||
}
|
||||
if(empty($params['goods_data']))
|
||||
{
|
||||
return DataReturn(MyLang('params_error_tips'), -1);
|
||||
}
|
||||
// 循环处理
|
||||
foreach($params['goods_data'] as $k=>$v)
|
||||
{
|
||||
$ret = self::GoodsCartSaveHandle(array_merge($v, ['user'=>$params['user']]));
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
$ret['msg'] = ($k+1).'、'.$ret['msg'];
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$ret = self::GoodsCartSaveHandle($params);
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* 购物车添加/更新处理
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2018-08-29
|
||||
* @desc description
|
||||
* @param [array] $params [输入参数]
|
||||
*/
|
||||
public static function GoodsCartSaveHandle($params = [])
|
||||
{
|
||||
// 请求参数
|
||||
$p = [
|
||||
@ -342,7 +396,7 @@ class GoodsCartService
|
||||
}
|
||||
|
||||
/**
|
||||
* 购物车数量保存
|
||||
* 购物车数量更新
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
|
||||
@ -2409,28 +2409,69 @@ class GoodsService
|
||||
*/
|
||||
public static function GoodsStock($params = [])
|
||||
{
|
||||
// 请求参数
|
||||
$p = [
|
||||
[
|
||||
'checked_type' => 'empty',
|
||||
'key_name' => 'id',
|
||||
'error_msg' => MyLang('goods_id_error_tips'),
|
||||
],
|
||||
[
|
||||
'checked_type' => 'min',
|
||||
'key_name' => 'stock',
|
||||
'checked_data' => 1,
|
||||
'error_msg' => MyLang('common_service.goods.base_buy_stock_error_tips'),
|
||||
],
|
||||
];
|
||||
$ret = ParamsChecked($params, $p);
|
||||
if($ret !== true)
|
||||
// 是否批量
|
||||
if(!empty($params['goods_data']))
|
||||
{
|
||||
return DataReturn($ret, -1);
|
||||
}
|
||||
// 是否数组
|
||||
if(!is_array($params['goods_data']))
|
||||
{
|
||||
$params['goods_data'] = json_decode(htmlspecialchars_decode($params['goods_data']), true);
|
||||
}
|
||||
if(empty($params['goods_data']))
|
||||
{
|
||||
return DataReturn(MyLang('params_error_tips'), -1);
|
||||
}
|
||||
|
||||
// 获取商品基础信息
|
||||
return self::GoodsSpecDetail($params);
|
||||
// 循环处理
|
||||
$result = [];
|
||||
foreach($params['goods_data'] as $v)
|
||||
{
|
||||
// 请求参数
|
||||
$p = [
|
||||
[
|
||||
'checked_type' => 'empty',
|
||||
'key_name' => 'id',
|
||||
'error_msg' => MyLang('goods_id_error_tips'),
|
||||
],
|
||||
[
|
||||
'checked_type' => 'isset',
|
||||
'key_name' => 'stock',
|
||||
'error_msg' => MyLang('common_service.goods.base_buy_stock_error_tips'),
|
||||
],
|
||||
];
|
||||
$ret = ParamsChecked($v, $p);
|
||||
if($ret !== true)
|
||||
{
|
||||
return DataReturn($ret, -1);
|
||||
}
|
||||
|
||||
// 获取商品基础信息
|
||||
$result[] = self::GoodsSpecDetail($v);
|
||||
}
|
||||
return DataReturn(MyLang('operate_success'), 0, $result);
|
||||
} else {
|
||||
// 请求参数
|
||||
$p = [
|
||||
[
|
||||
'checked_type' => 'empty',
|
||||
'key_name' => 'id',
|
||||
'error_msg' => MyLang('goods_id_error_tips'),
|
||||
],
|
||||
[
|
||||
'checked_type' => 'isset',
|
||||
'key_name' => 'stock',
|
||||
'error_msg' => MyLang('common_service.goods.base_buy_stock_error_tips'),
|
||||
],
|
||||
];
|
||||
$ret = ParamsChecked($params, $p);
|
||||
if($ret !== true)
|
||||
{
|
||||
return DataReturn($ret, -1);
|
||||
}
|
||||
|
||||
// 获取商品基础信息
|
||||
return self::GoodsSpecDetail($params);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -796,35 +796,39 @@ class UserService
|
||||
* @version 0.0.1
|
||||
* @datetime 2017-03-09T11:37:43+0800
|
||||
* @param [int] $user_id [用户id]
|
||||
* @param [array] $user [用户信息]
|
||||
* @return [boolean] [记录成功true, 失败false]
|
||||
*/
|
||||
public static function UserLoginRecord($user_id = 0)
|
||||
public static function UserLoginRecord($user_id = 0, $user = [])
|
||||
{
|
||||
if(!empty($user_id))
|
||||
if(!empty($user_id) && empty($user))
|
||||
{
|
||||
$user = self::UserInfo('id', $user_id);
|
||||
if(!empty($user))
|
||||
$user = self::UserHandle(self::UserInfo('id', $user_id));
|
||||
}
|
||||
if(!empty($user))
|
||||
{
|
||||
// 用户id处理
|
||||
if(empty($user_id))
|
||||
{
|
||||
// 用户数据处理
|
||||
$user = self::UserHandle($user);
|
||||
|
||||
// 用户登录成功信息纪录钩子
|
||||
$hook_name = 'plugins_service_user_login_success_record';
|
||||
MyEventTrigger($hook_name, [
|
||||
'hook_name' => $hook_name,
|
||||
'is_backend' => true,
|
||||
'user' => &$user,
|
||||
'user_id' => $user_id
|
||||
]);
|
||||
|
||||
// web端设置session
|
||||
if(APPLICATION == 'web')
|
||||
{
|
||||
// 存储session
|
||||
MyCookie(self::$user_login_key, $user);
|
||||
}
|
||||
return true;
|
||||
$user_id = $user['id'];
|
||||
}
|
||||
|
||||
// 用户登录成功信息纪录钩子
|
||||
$hook_name = 'plugins_service_user_login_success_record';
|
||||
MyEventTrigger($hook_name, [
|
||||
'hook_name' => $hook_name,
|
||||
'is_backend' => true,
|
||||
'user' => &$user,
|
||||
'user_id' => $user_id
|
||||
]);
|
||||
|
||||
// web端设置session
|
||||
if(APPLICATION == 'web')
|
||||
{
|
||||
// 存储session
|
||||
MyCookie(self::$user_login_key, $user);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -1292,7 +1296,7 @@ class UserService
|
||||
$body_html = [];
|
||||
|
||||
// 用户登录后钩子
|
||||
$user = self::UserInfo('id', $user_id, 'id,number_code,system_type,username,nickname,mobile,email,gender,avatar,province,city,county,birthday');
|
||||
$user = self::UserHandle(self::UserInfo('id', $user_id));
|
||||
|
||||
// 会员码生成处理
|
||||
if(empty($user['number_code']))
|
||||
@ -1318,10 +1322,10 @@ class UserService
|
||||
// 成功返回
|
||||
if(APPLICATION == 'app')
|
||||
{
|
||||
$result = self::AppUserInfoHandle($user_id);
|
||||
$result = self::AppUserInfoHandle(0, null, null, $user);
|
||||
} else {
|
||||
// 登录记录
|
||||
if(!self::UserLoginRecord($user_id))
|
||||
if(!self::UserLoginRecord(0, $user))
|
||||
{
|
||||
return DataReturn(MyLang('login_failure_tips'), -100);
|
||||
}
|
||||
@ -2142,7 +2146,7 @@ class UserService
|
||||
$user = self::UserHandle(self::UserInfo('id', $params['user']['id']));
|
||||
|
||||
// 重新更新用户缓存
|
||||
self::UserLoginRecord($user['id']);
|
||||
self::UserLoginRecord(0, $user);
|
||||
if(!empty($user['token']))
|
||||
{
|
||||
MyCache(SystemService::CacheKey('shopxo.cache_user_info').$user['token'], $user);
|
||||
@ -2424,17 +2428,14 @@ class UserService
|
||||
// 获取用户信息
|
||||
if(!empty($user_id))
|
||||
{
|
||||
$user = self::UserInfo('id', $user_id);
|
||||
$user = self::UserHandle(self::UserInfo('id', $user_id));
|
||||
} elseif(!empty($where_field) && !empty($where_value) && empty($user))
|
||||
{
|
||||
$user = self::UserInfo($where_field, $where_value);
|
||||
$user = self::UserHandle(self::UserInfo($where_field, $where_value));
|
||||
}
|
||||
|
||||
if(!empty($user))
|
||||
{
|
||||
// 用户信息处理
|
||||
$user = self::UserHandle($user);
|
||||
|
||||
// 是否强制绑定手机号码
|
||||
$user['is_mandatory_bind_mobile'] = intval(MyC('common_user_is_mandatory_bind_mobile'));
|
||||
|
||||
@ -2447,11 +2448,8 @@ class UserService
|
||||
$user['number_code'] = self::UserNumberCodeCreatedHandle($user['id']);
|
||||
}
|
||||
|
||||
// 非token数据库校验,则重新生成token更新到数据库
|
||||
if($where_field != 'token')
|
||||
{
|
||||
$user = self::UserTokenUpdate($user['id'], $user);
|
||||
}
|
||||
// 重新生成token更新到数据库并缓存
|
||||
$user = self::UserTokenUpdate($user['id'], $user);
|
||||
}
|
||||
|
||||
// 用户信息钩子
|
||||
@ -2481,21 +2479,21 @@ class UserService
|
||||
public static function UserTokenUpdate($user_id, $user = [])
|
||||
{
|
||||
// 未指定用户则读取用户信息、并处理数据
|
||||
if(empty($user))
|
||||
if(empty($user) && !empty($user_id))
|
||||
{
|
||||
$user = self::UserHandle(self::UserInfo('id', $user_id));
|
||||
}
|
||||
if(!empty($user))
|
||||
{
|
||||
// token生成并存储缓存
|
||||
$user['token'] = ApiService::CreatedUserToken($user_id);
|
||||
if(self::UserPlatformUpdate('user_id', $user_id, ['token'=>$user['token']]))
|
||||
$user['token'] = ApiService::CreatedUserToken($user['id']);
|
||||
if(self::UserPlatformUpdate('user_id', $user['id'], ['token'=>$user['token'], 'upd_time'=>time()]) !== false)
|
||||
{
|
||||
MyCache(SystemService::CacheKey('shopxo.cache_user_info').$user['token'], $user);
|
||||
}
|
||||
|
||||
// web端用户登录纪录处理
|
||||
self::UserLoginRecord($user_id);
|
||||
self::UserLoginRecord($user_id, $user);
|
||||
}
|
||||
return $user;
|
||||
}
|
||||
|
||||
@ -454,7 +454,6 @@ ul.am-dropdown-content > .am-active > a:focus,
|
||||
.am-nav > li.am-active > a:hover,
|
||||
.am-nav > li.am-active > a:focus {
|
||||
color: #d2354c !important;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.am-article-title.blog-title{
|
||||
|
||||
@ -34,7 +34,7 @@ input{font-size:12px;font-size:100%;outline:none;line-height:normal;color:#444;}
|
||||
.stock-tips{ font-size:12px; }
|
||||
|
||||
/*可选规格*/
|
||||
.iteminfo_parameter { margin-bottom: 10px; }
|
||||
.buy-spec-info-container { margin-bottom: 10px; }
|
||||
.theme-signin-left{max-height:250px ;overflow-y: scroll;background: #fff;}
|
||||
.theme-options{display: block;overflow: hidden;padding-left: 10px;padding-right:10px; margin-bottom: 5px;color: #666;}
|
||||
.theme-signin-left .sku-line{float: left; margin:10px;margin-left:0;border-radius: 2px; background:#efefef ;padding:3px 8px; border: 1px solid #d5d5d5;}
|
||||
@ -43,7 +43,7 @@ input{font-size:12px;font-size:100%;outline:none;line-height:normal;color:#444;}
|
||||
.sku-line-images img { width: 30px; height: 30px; vertical-align: middle;border-radius: 2px; }
|
||||
.theme-signin .btn{width:100%;font-size: 16px;padding:5px ;}
|
||||
.btn-op{position:fixed;left:0;bottom: 0;width:100%; z-index: 3;}
|
||||
.iteminfo_parameter dt.buy-event {text-align: left;width:100% ;}
|
||||
.buy-spec-info-container dt.buy-event {text-align: left;width:100% ;}
|
||||
|
||||
.theme-options dd{margin:10px 0px ;}
|
||||
.introduce-main .am-sticky-placeholder { margin: 0px !important; }
|
||||
@ -163,7 +163,7 @@ input{font-size:12px;font-size:100%;outline:none;line-height:normal;color:#444;}
|
||||
.iteminfo_mktprice em, .goods-price { color:#c00;}
|
||||
.tb-detail-price dd {display: inline-block;}
|
||||
.goods-favor-count { color: #999; }
|
||||
.iteminfo_parameter a:hover{text-decoration: none;color:initial ;}
|
||||
.buy-spec-info-container a:hover{text-decoration: none;color:initial ;}
|
||||
.tm-indcon .tm-label, .tb-detail-price dt, .specpara-title { white-space:nowrap; color:#666; font-weight: 400; }
|
||||
.tb-detail-price{ background: #fcf1e3 url(../images/goods-meta-bg.png); background-size: cover; -moz-background-size: cover; background-repeat: no-repeat; height:auto;padding:10px; }
|
||||
.tb-detail-price .items {display: block; margin: 5px 0;}
|
||||
@ -172,7 +172,7 @@ input{font-size:12px;font-size:100%;outline:none;line-height:normal;color:#444;}
|
||||
|
||||
/* 二维码 */
|
||||
.goods-qrcode{position: absolute; bottom: 5px; right: 10px; cursor: pointer; color: #666; width: 150px; text-align: right;}
|
||||
.goods-qrcode .qrcode-images{display: none; position: absolute; z-index: 2; top: 30px; right: 0;}
|
||||
.goods-qrcode .qrcode-images{display: none; position: absolute; z-index: 105; top: 30px; right: 0;}
|
||||
.goods-qrcode:hover .qrcode-images{display: block;}
|
||||
|
||||
/* 视频 */
|
||||
@ -194,7 +194,7 @@ input{font-size:12px;font-size:100%;outline:none;line-height:normal;color:#444;}
|
||||
.scoll .goods-video-submit-start { left: 0; bottom: 30px; padding: 10px 10px 5px 10px; }
|
||||
|
||||
/*销量*/
|
||||
.tm-ind-panel, .iteminfo_parameter, .parameters-base { border-bottom: 1px dotted #dadada; }
|
||||
.tm-ind-panel, .buy-spec-info-container, .parameters-base { border-bottom: 1px dotted #dadada; }
|
||||
.tm-ind-panel {padding: 10px 5px;position: relative;overflow: hidden;clear: both;display: flex;}
|
||||
.tm-ind-item {float: left;width: 33%;text-align: center;position: relative;left: -1px;border-left: 1px solid #E5DFDA;
|
||||
flex: 1 1 0%;line-height: 16px;cursor: pointer;}
|
||||
@ -212,8 +212,8 @@ flex: 1 1 0%;line-height: 16px;cursor: pointer;}
|
||||
.buy-event .cart-title .am-icon-angle-right{float: right;}
|
||||
|
||||
/*数量*/
|
||||
.iteminfo_parameter.munber,.iteminfo_parameter.freight{display:none ;}
|
||||
.iteminfo_parameter.munber dd{margin-left:5px ;}
|
||||
.buy-spec-info-container.munber,.buy-spec-info-container.freight{display:none ;}
|
||||
.buy-spec-info-container.munber dd{margin-left:5px ;}
|
||||
#min, #add{ width: 35px; height: 25px; outline:none; line-height: 23px; padding: 0; cursor: pointer; }
|
||||
#text_box { width: 60px; height: 25px; text-align: center; font-size: 12px !important; }
|
||||
.theme-popover .am-input-group { display: inline-flex; }
|
||||
@ -409,8 +409,8 @@ flex: 1 1 0%;line-height: 16px;cursor: pointer;}
|
||||
.scoll{float: left;width: calc(45% - 20px);}
|
||||
.scoll .slider-content { border: 1px solid #eee; }
|
||||
.clearfix-right{float:right;width:55%;min-height: 270px;}
|
||||
.iteminfo_parameter.freight{display: block;margin-top: 10px;margin-bottom:10px ;}
|
||||
.iteminfo_parameter.freight dt{margin-left:-70px ;float: left;margin-right:10px ;padding-top:5px ;padding-bottom:20px ;}
|
||||
.buy-spec-info-container.freight{display: block;margin-top: 10px;margin-bottom:10px ;}
|
||||
.buy-spec-info-container.freight dt{margin-left:-70px ;float: left;margin-right:10px ;padding-top:5px ;padding-bottom:20px ;}
|
||||
.buy-nav{position: static; margin-top: 20px; overflow: hidden; }
|
||||
ul.am-avg-sm-4.am-tabs-nav.am-nav.am-nav-tabs {width: auto;}
|
||||
|
||||
@ -427,7 +427,7 @@ flex: 1 1 0%;line-height: 16px;cursor: pointer;}
|
||||
|
||||
/*基础*/
|
||||
.tb-detail-price .items dt { min-width: 85px; }
|
||||
.iteminfo_parameter {padding-left: 50px;}
|
||||
.buy-spec-info-container {padding-left: 50px;}
|
||||
.tb-detail-hd,.tb-detail-price{text-align: left;}
|
||||
.tb-detail-hd h1 {font-size: 16px;}
|
||||
|
||||
@ -466,7 +466,7 @@ flex: 1 1 0%;line-height: 16px;cursor: pointer;}
|
||||
|
||||
/*规格*/
|
||||
.theme-popover {display: block;position: static;border:none ;box-shadow: none;width: 100%;}
|
||||
.theme-poptit,.theme-signin-right,.iteminfo_parameter dt.buy-event,.btn-op{display: none;}
|
||||
.theme-poptit,.theme-signin-right,.buy-spec-info-container dt.buy-event,.btn-op{display: none;}
|
||||
|
||||
.theme-options{overflow: visible;padding:0px 0px; margin-bottom: 5px;}
|
||||
.theme-options ul{overflow: hidden;float: none;}
|
||||
@ -474,12 +474,9 @@ flex: 1 1 0%;line-height: 16px;cursor: pointer;}
|
||||
.theme-signin-left .cart-title{margin-left: -46px;float: left;}
|
||||
|
||||
.scoll{display: none;}
|
||||
.item-inform{max-width:1000px; background:#fff; margin-bottom: 30px; }
|
||||
.clearfix-left{display:block;float: left;width:350px;}
|
||||
.clearfix-right{width:calc(100% - 370px);margin-left:10px;}
|
||||
.freight{width:400px;float: left;}
|
||||
.iteminfo_parameter.freight dt{padding-top:6px ;padding-bottom:0px ;}
|
||||
.iteminfo_parameter { border-bottom: 0; }
|
||||
.clearfix-right{width:calc(100% - 370px);margin-left:10px;}}
|
||||
.buy-spec-info-container { border-bottom: 0; }
|
||||
|
||||
/*左侧商品-看了又看*/
|
||||
.introduce-main{width:80%;float:left;background:#fff ;}
|
||||
|
||||
@ -175,15 +175,15 @@ function BuyCartHandle(e)
|
||||
}
|
||||
|
||||
// 操作类型
|
||||
var goods_data = encodeURIComponent(CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(JSON.stringify([{
|
||||
goods_id: params.id,
|
||||
stock: params.stock,
|
||||
spec: params.spec
|
||||
}]))));
|
||||
switch(params.type)
|
||||
{
|
||||
// 立即购买
|
||||
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="goods_data"]').val(goods_data);
|
||||
$form.find('button[type="submit"]').trigger('click');
|
||||
@ -192,8 +192,7 @@ function BuyCartHandle(e)
|
||||
// 加入购物车
|
||||
case 'cart' :
|
||||
var $form = $('form.cart-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');
|
||||
PoptitClose();
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user