diff --git a/app/api/controller/Buy.php b/app/api/controller/Buy.php index 1560aa4f9..c0869cb4b 100755 --- a/app/api/controller/Buy.php +++ b/app/api/controller/Buy.php @@ -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); } diff --git a/app/index/view/default/goods/index.html b/app/index/view/default/goods/index.html index f615f9d27..34a0c4d96 100755 --- a/app/index/view/default/goods/index.html +++ b/app/index/view/default/goods/index.html @@ -304,7 +304,7 @@ {{if $goods['is_shelves'] == 1 and $goods['inventory'] gt 0}} -
+
{{:MyLang('goods.panel_can_choice_spec_name')}} @@ -535,9 +535,7 @@
- - - +
{{else /}} diff --git a/app/service/GoodsCartService.php b/app/service/GoodsCartService.php index d4bfc6d0a..a0358d90b 100644 --- a/app/service/GoodsCartService.php +++ b/app/service/GoodsCartService.php @@ -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 diff --git a/app/service/GoodsService.php b/app/service/GoodsService.php index cd6f083be..f6a26b183 100755 --- a/app/service/GoodsService.php +++ b/app/service/GoodsService.php @@ -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); + } } /** diff --git a/app/service/UserService.php b/app/service/UserService.php index 24ba4b2f5..9b3a0b3b2 100755 --- a/app/service/UserService.php +++ b/app/service/UserService.php @@ -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; } diff --git a/public/static/index/default/css/common.css b/public/static/index/default/css/common.css index d9c690a76..5e002745e 100755 --- a/public/static/index/default/css/common.css +++ b/public/static/index/default/css/common.css @@ -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{ diff --git a/public/static/index/default/css/goods.css b/public/static/index/default/css/goods.css index 68575d1a4..46079cfdd 100755 --- a/public/static/index/default/css/goods.css +++ b/public/static/index/default/css/goods.css @@ -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 ;} diff --git a/public/static/index/default/js/goods.js b/public/static/index/default/js/goods.js index d01d32a8b..4554ad27b 100755 --- a/public/static/index/default/js/goods.js +++ b/public/static/index/default/js/goods.js @@ -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;