From 82da920b54394ded09dad096d8d3a7ae2c893809 Mon Sep 17 00:00:00 2001 From: Devil Date: Sun, 11 Apr 2021 15:51:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AB=99=E7=82=B9=E7=B1=BB=E5=9E=8B=E4=BC=98?= =?UTF-8?q?=E5=8C=96+=E7=BB=86=E8=8A=82=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/admin/controller/Common.php | 3 + application/admin/controller/Goods.php | 4 +- application/admin/controller/Site.php | 4 + .../admin/view/default/admin/login_info.html | 2 +- .../admin/view/default/public/header.html | 2 +- .../admin/view/default/public/nav.html | 2 +- .../view/default/site/siteset/discount.html | 38 ++++ application/api/controller/Answer.php | 4 +- application/api/controller/Banner.php | 4 +- application/api/controller/Base.php | 4 +- application/api/controller/Buy.php | 4 +- application/api/controller/Cart.php | 4 +- application/api/controller/Goods.php | 8 +- application/api/controller/Index.php | 4 +- application/api/controller/Message.php | 4 +- application/api/controller/Navigation.php | 4 +- application/api/controller/Order.php | 8 +- application/api/controller/Orderaftersale.php | 6 +- application/api/controller/Region.php | 4 +- application/api/controller/Search.php | 4 +- application/api/controller/Toutiao.php | 4 +- application/api/controller/User.php | 4 +- application/api/controller/Useraddress.php | 6 +- .../api/controller/Usergoodsbrowse.php | 4 +- application/api/controller/Usergoodsfavor.php | 4 +- application/api/controller/Userintegral.php | 4 +- application/common.php | 4 +- application/index/controller/Buy.php | 4 +- application/index/controller/Common.php | 10 +- .../index/view/default/public/footer_nav.html | 8 +- .../view/default/user/login_content.html | 16 +- application/service/BuyService.php | 6 +- application/service/GoodsService.php | 4 +- application/service/PluginsService.php | 2 +- ...{BaseService.php => SystemBaseService.php} | 163 +++++++++++++++++- application/tags.php | 72 -------- changelog.txt | 12 +- .../common/images/default-company-license.jpg | Bin 0 -> 28466 bytes 38 files changed, 298 insertions(+), 146 deletions(-) create mode 100644 application/admin/view/default/site/siteset/discount.html rename application/service/{BaseService.php => SystemBaseService.php} (56%) create mode 100644 public/static/common/images/default-company-license.jpg diff --git a/application/admin/controller/Common.php b/application/admin/controller/Common.php index e5603afbe..36cc1488d 100755 --- a/application/admin/controller/Common.php +++ b/application/admin/controller/Common.php @@ -263,6 +263,9 @@ class Common extends Controller // 默认不加载百度地图api $this->assign('is_load_baidu_map_api', 0); + + // 站点名称 + $this->assign('admin_theme_site_name', MyC('admin_theme_site_name', 'ShopXO', true)); } /** diff --git a/application/admin/controller/Goods.php b/application/admin/controller/Goods.php index 1af8d9151..61db4de68 100755 --- a/application/admin/controller/Goods.php +++ b/application/admin/controller/Goods.php @@ -11,7 +11,7 @@ namespace app\admin\controller; use think\facade\Hook; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\GoodsService; use app\service\RegionService; use app\service\BrandService; @@ -198,7 +198,7 @@ class Goods extends Common // 站点类型 $this->assign('common_site_type_list', lang('common_site_type_list')); // 当前系统设置的站点类型 - $this->assign('common_site_type', BaseService::SiteTypeValue()); + $this->assign('common_site_type', SystemBaseService::SiteTypeValue()); // 商品参数类型 $this->assign('common_goods_parameters_type_list', lang('common_goods_parameters_type_list')); diff --git a/application/admin/controller/Site.php b/application/admin/controller/Site.php index b7848fea7..978a0cf51 100755 --- a/application/admin/controller/Site.php +++ b/application/admin/controller/Site.php @@ -245,6 +245,10 @@ class Site extends Common 'name' => '订单', 'type' => 'order', ], + [ + 'name' => '优惠', + 'type' => 'discount', + ], [ 'name' => '扩展', 'type' => 'extends', diff --git a/application/admin/view/default/admin/login_info.html b/application/admin/view/default/admin/login_info.html index 825decbf5..bff8582d5 100755 --- a/application/admin/view/default/admin/login_info.html +++ b/application/admin/view/default/admin/login_info.html @@ -4,7 +4,7 @@
- +
+ + +
+
+ + + +{{include file="public/footer" /}} + \ No newline at end of file diff --git a/application/api/controller/Answer.php b/application/api/controller/Answer.php index 0f80d75c0..c11d70d9b 100755 --- a/application/api/controller/Answer.php +++ b/application/api/controller/Answer.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\AnswerService; /** @@ -77,7 +77,7 @@ class Answer extends Common 'page_total' => $page_total, 'data' => $data['data'], ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** diff --git a/application/api/controller/Banner.php b/application/api/controller/Banner.php index 565151ec3..9882a4d46 100755 --- a/application/api/controller/Banner.php +++ b/application/api/controller/Banner.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\BannerService; /** @@ -46,7 +46,7 @@ class Banner extends Common { // 获取轮播 $result = BannerService::Banner(); - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } } ?> \ No newline at end of file diff --git a/application/api/controller/Base.php b/application/api/controller/Base.php index 26af9c2e7..6ce0ae794 100644 --- a/application/api/controller/Base.php +++ b/application/api/controller/Base.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; /** * 基础公共接口 @@ -35,7 +35,7 @@ class Base extends Common // 参数 $params = $this->data_post; $params['user'] = $this->user; - return BaseService::Common($params); + return SystemBaseService::Common($params); } } ?> \ No newline at end of file diff --git a/application/api/controller/Buy.php b/application/api/controller/Buy.php index d573fbad4..c6001edf0 100755 --- a/application/api/controller/Buy.php +++ b/application/api/controller/Buy.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\GoodsService; use app\service\UserService; use app\service\PaymentService; @@ -73,7 +73,7 @@ class Buy extends Common 'common_site_type' => (int) $buy_base['common_site_type'], ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } return $buy_ret; } diff --git a/application/api/controller/Cart.php b/application/api/controller/Cart.php index 205a289be..1ea880634 100755 --- a/application/api/controller/Cart.php +++ b/application/api/controller/Cart.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\BuyService; /** @@ -53,7 +53,7 @@ class Cart extends Common 'common_cart_total' => BuyService::UserCartTotal(['user'=>$this->user]), ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** diff --git a/application/api/controller/Goods.php b/application/api/controller/Goods.php index 4de242ffc..39d1297a1 100755 --- a/application/api/controller/Goods.php +++ b/application/api/controller/Goods.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\GoodsService; use app\service\BuyService; use app\service\GoodsCommentsService; @@ -115,7 +115,7 @@ class Goods extends Common 'common_cart_total' => BuyService::UserCartTotal(['user'=>$this->user]), 'buy_button' => $buy_button, ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** @@ -190,7 +190,7 @@ class Goods extends Common $result = [ 'category' => GoodsService::GoodsCategoryAll($this->data_post), ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** @@ -256,7 +256,7 @@ class Goods extends Common 'page_total' => $page_total, 'data' => $ret['data'], ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } } ?> \ No newline at end of file diff --git a/application/api/controller/Index.php b/application/api/controller/Index.php index fc9355aba..d5afe79ce 100755 --- a/application/api/controller/Index.php +++ b/application/api/controller/Index.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\GoodsService; use app\service\BannerService; use app\service\AppHomeNavService; @@ -54,7 +54,7 @@ class Index extends Common 'data_list' => GoodsService::HomeFloorList(), 'common_cart_total' => BuyService::UserCartTotal(['user'=>$this->user]), ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } } ?> \ No newline at end of file diff --git a/application/api/controller/Message.php b/application/api/controller/Message.php index 86da7dcbb..de221325a 100755 --- a/application/api/controller/Message.php +++ b/application/api/controller/Message.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\MessageService; /** @@ -80,7 +80,7 @@ class Message extends Common 'page_total' => $page_total, 'data' => $data['data'], ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } } ?> \ No newline at end of file diff --git a/application/api/controller/Navigation.php b/application/api/controller/Navigation.php index b06b25494..a853e4144 100755 --- a/application/api/controller/Navigation.php +++ b/application/api/controller/Navigation.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\AppHomeNavService; /** @@ -46,7 +46,7 @@ class Navigation extends Common { // 获取轮播 $result = AppHomeNavService::AppHomeNav(); - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } } ?> \ No newline at end of file diff --git a/application/api/controller/Order.php b/application/api/controller/Order.php index ad4c46152..776888966 100755 --- a/application/api/controller/Order.php +++ b/application/api/controller/Order.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\PaymentService; use app\service\OrderService; use app\service\GoodsCommentsService; @@ -87,7 +87,7 @@ class Order extends Common 'data' => $data['data'], 'payment_list' => $payment_list, ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** @@ -133,7 +133,7 @@ class Order extends Common $site_fictitious = ConfigService::SiteFictitiousConfig(); $result['site_fictitious'] = $site_fictitious['data']; } - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } return DataReturn('数据不存在或已删除', -100); } @@ -180,7 +180,7 @@ class Order extends Common 'data' => $data['data'][0], 'editor_path_type' => ResourcesService::EditorPathTypeValue('order_comments-'.$this->user['id'].'-'.$data['data'][0]['id']), ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } return DataReturn('没有相关数据', -100); } diff --git a/application/api/controller/Orderaftersale.php b/application/api/controller/Orderaftersale.php index 5ba05f4e8..06324016b 100644 --- a/application/api/controller/Orderaftersale.php +++ b/application/api/controller/Orderaftersale.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\OrderAftersaleService; use app\service\ResourcesService; @@ -81,7 +81,7 @@ class Orderaftersale extends Common 'page_total' => $page_total, 'data' => $data['data'], ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** @@ -141,7 +141,7 @@ class Orderaftersale extends Common 'return_goods_address' => MyC('home_order_aftersale_return_goods_address', '管理员未填写', true), 'editor_path_type' => ResourcesService::EditorPathTypeValue(OrderAftersaleService::EditorAttachmentPathType($this->user['id'], $order_id, $order_detail_id)), ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } return DataReturn($ret['msg'], -1); } diff --git a/application/api/controller/Region.php b/application/api/controller/Region.php index 719c8c225..74b8c87d2 100755 --- a/application/api/controller/Region.php +++ b/application/api/controller/Region.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\RegionService; /** @@ -52,7 +52,7 @@ class Region extends Common ], ]; $result = RegionService::RegionNode($params); - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** diff --git a/application/api/controller/Search.php b/application/api/controller/Search.php index 49a4b5522..89de90387 100755 --- a/application/api/controller/Search.php +++ b/application/api/controller/Search.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\SearchService; /** @@ -71,7 +71,7 @@ class Search extends Common // 商品规格 $result['goods_spec_list'] = SearchService::SearchGoodsSpecValueList($this->data_request); - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } } ?> \ No newline at end of file diff --git a/application/api/controller/Toutiao.php b/application/api/controller/Toutiao.php index 39a7e1c95..58dee54c3 100644 --- a/application/api/controller/Toutiao.php +++ b/application/api/controller/Toutiao.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\ToutiaoService; /** @@ -52,7 +52,7 @@ class Toutiao extends Common $params = $this->data_post; $params['user'] = $this->user; $ret = ToutiaoService::Pay($params); - return BaseService::DataReturn($ret['data']); + return SystemBaseService::DataReturn($ret['data']); } } ?> \ No newline at end of file diff --git a/application/api/controller/User.php b/application/api/controller/User.php index 76e4d3b2d..71aeaafe6 100755 --- a/application/api/controller/User.php +++ b/application/api/controller/User.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\UserService; use app\service\OrderService; use app\service\GoodsService; @@ -638,7 +638,7 @@ class User extends Common ); // 返回数据 - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** diff --git a/application/api/controller/Useraddress.php b/application/api/controller/Useraddress.php index 48a237cb6..1b42b1ae9 100755 --- a/application/api/controller/Useraddress.php +++ b/application/api/controller/Useraddress.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\ConfigService; use app\service\UserAddressService; use app\service\ResourcesService; @@ -54,7 +54,7 @@ class UserAddress extends Common $result = [ 'data' => $ret['data'], ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** @@ -76,7 +76,7 @@ class UserAddress extends Common 'data' => empty($data['data']) ? null : $data['data'], 'editor_path_type' => ResourcesService::EditorPathTypeValue(UserAddressService::EditorAttachmentPathType($this->user['id'])), ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** diff --git a/application/api/controller/Usergoodsbrowse.php b/application/api/controller/Usergoodsbrowse.php index f21a42b3f..5454dc04d 100755 --- a/application/api/controller/Usergoodsbrowse.php +++ b/application/api/controller/Usergoodsbrowse.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\GoodsBrowseService; /** @@ -78,7 +78,7 @@ class UserGoodsBrowse extends Common 'page_total' => $page_total, 'data' => $data['data'], ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** diff --git a/application/api/controller/Usergoodsfavor.php b/application/api/controller/Usergoodsfavor.php index 71b13cf05..11d2f6a62 100755 --- a/application/api/controller/Usergoodsfavor.php +++ b/application/api/controller/Usergoodsfavor.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\GoodsFavorService; /** @@ -77,7 +77,7 @@ class UserGoodsFavor extends Common 'page_total' => $page_total, 'data' => $data['data'], ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } /** diff --git a/application/api/controller/Userintegral.php b/application/api/controller/Userintegral.php index b8a8df70d..ffa44351a 100755 --- a/application/api/controller/Userintegral.php +++ b/application/api/controller/Userintegral.php @@ -10,7 +10,7 @@ // +---------------------------------------------------------------------- namespace app\api\controller; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\IntegralService; /** @@ -78,7 +78,7 @@ class UserIntegral extends Common 'page_total' => $page_total, 'data' => $data['data'], ]; - return BaseService::DataReturn($result); + return SystemBaseService::DataReturn($result); } } diff --git a/application/common.php b/application/common.php index 2e641a7c1..ec144e82b 100755 --- a/application/common.php +++ b/application/common.php @@ -358,7 +358,7 @@ function ArrayKeys($data) */ function GoodsSalesModelType($site_type) { - return ($site_type == -1) ? \app\service\BaseService::SiteTypeValue() : $site_type; + return ($site_type == -1) ? \app\service\SystemBaseService::SiteTypeValue() : $site_type; } /** @@ -380,7 +380,7 @@ function IsGoodsSiteTypeConsistent($site_type) } // 系统站点类型 - $common_site_type = \app\service\BaseService::SiteTypeValue(); + $common_site_type = \app\service\SystemBaseService::SiteTypeValue(); // 是否一致 if($common_site_type == $site_type) diff --git a/application/index/controller/Buy.php b/application/index/controller/Buy.php index 17cdf0833..bc17352da 100755 --- a/application/index/controller/Buy.php +++ b/application/index/controller/Buy.php @@ -11,7 +11,7 @@ namespace app\index\controller; use think\facade\Hook; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\GoodsService; use app\service\UserService; use app\service\UserAddressService; @@ -59,7 +59,7 @@ class Buy extends Common return redirect(MyUrl('index/buy/index')); } else { // 站点类型,是否开启了展示型 - if(BaseService::SiteTypeValue() == 1) + if(SystemBaseService::SiteTypeValue() == 1) { $this->assign('msg', '展示型不允许提交订单'); return $this->fetch('public/tips_error'); diff --git a/application/index/controller/Common.php b/application/index/controller/Common.php index d3b88ebba..032ce626c 100755 --- a/application/index/controller/Common.php +++ b/application/index/controller/Common.php @@ -14,7 +14,7 @@ use think\Controller; use think\facade\Hook; use app\module\FormHandleModule; use app\service\SystemService; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\ResourcesService; use app\service\GoodsService; use app\service\NavigationService; @@ -169,6 +169,9 @@ class Common extends Controller // 用户登录页面顶部钩子 $this->assign('plugins_view_user_login_info_top_data', Hook::listen('plugins_view_user_login_info_top', ['hook_name'=>'plugins_view_user_login_info_top', 'is_backend'=>false, 'user'=>$this->user])); + // 用户登录内容页面底部钩子 + $this->assign('plugins_view_user_login_content_bottom_data', Hook::listen('plugins_view_user_login_content_bottom', ['hook_name'=>'plugins_view_user_login_content_bottom', 'is_backend'=>false, 'user'=>$this->user])); + // 用户注册页面钩子 $this->assign('plugins_view_user_reg_info_data', Hook::listen('plugins_view_user_reg_info', ['hook_name'=>'plugins_view_user_reg_info', 'is_backend'=>false, 'user'=>$this->user])); @@ -300,7 +303,7 @@ class Common extends Controller $this->assign('currency_symbol', ResourcesService::CurrencyDataSymbol()); // 站点类型 - $this->assign('common_site_type', BaseService::SiteTypeValue()); + $this->assign('common_site_type', SystemBaseService::SiteTypeValue()); // 预约模式 $this->assign('common_order_is_booking', MyC('common_order_is_booking', 0, true)); @@ -420,6 +423,9 @@ class Common extends Controller // 登录/注册方式 $this->assign('home_user_login_type', MyC('home_user_login_type', [], true)); $this->assign('home_user_reg_type', MyC('home_user_reg_type', [], true)); + + // 底部信息 + $this->assign('home_theme_footer_bottom_powered', htmlspecialchars_decode(MyC('home_theme_footer_bottom_powered'))); } /** diff --git a/application/index/view/default/public/footer_nav.html b/application/index/view/default/public/footer_nav.html index 61667bf62..5d9415545 100755 --- a/application/index/view/default/public/footer_nav.html +++ b/application/index/view/default/public/footer_nav.html @@ -84,9 +84,7 @@ {{/if}}

- Powered by - ShopXO - {{$Think.APPLICATION_VERSION}} + {{$home_theme_footer_bottom_powered|raw}} {{$Think.APPLICATION_VERSION}}

{{if !empty($home_site_icp)}} diff --git a/application/index/view/default/user/login_content.html b/application/index/view/default/user/login_content.html index 56de568f6..3c49d8056 100644 --- a/application/index/view/default/user/login_content.html +++ b/application/index/view/default/user/login_content.html @@ -112,4 +112,18 @@ 忘记密码? - \ No newline at end of file + + + +{{if isset($shopxo_is_develop) and $shopxo_is_develop eq true}} +
+ plugins_view_user_login_content_bottom +
+{{/if}} +{{if !empty($plugins_view_user_login_content_bottom_data) and is_array($plugins_view_user_login_content_bottom_data)}} + {{foreach $plugins_view_user_login_content_bottom_data as $hook}} + {{if is_string($hook) or is_int($hook)}} + {{$hook|raw}} + {{/if}} + {{/foreach}} +{{/if}} \ No newline at end of file diff --git a/application/service/BuyService.php b/application/service/BuyService.php index 53fd70db3..e29212546 100755 --- a/application/service/BuyService.php +++ b/application/service/BuyService.php @@ -12,7 +12,7 @@ namespace app\service; use think\Db; use think\facade\Hook; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\GoodsService; use app\service\UserService; use app\service\UserAddressService; @@ -698,7 +698,7 @@ class BuyService // 站点模式 0销售, 2自提, 4销售+自提, 则其它正常模式 $user_site_model = isset($params['site_model']) ? intval($params['site_model']) : 0; - $common_site_type = BaseService::SiteTypeValue(); + $common_site_type = SystemBaseService::SiteTypeValue(); $site_model = ($common_site_type == 4) ? $user_site_model : $common_site_type; // 商品销售模式 @@ -952,7 +952,7 @@ class BuyService public static function OrderInsert($params = []) { // 站点类型,是否开启了展示型 - $common_site_type = BaseService::SiteTypeValue(); + $common_site_type = SystemBaseService::SiteTypeValue(); if($common_site_type == 1) { return DataReturn('展示型不允许提交订单', -1); diff --git a/application/service/GoodsService.php b/application/service/GoodsService.php index f8cef8c2c..1a0d5b409 100755 --- a/application/service/GoodsService.php +++ b/application/service/GoodsService.php @@ -12,7 +12,7 @@ namespace app\service; use think\Db; use think\facade\Hook; -use app\service\BaseService; +use app\service\SystemBaseService; use app\service\ResourcesService; use app\service\BrandService; use app\service\RegionService; @@ -2692,7 +2692,7 @@ class GoodsService $path = 'static'.DS.'upload'.DS.'images'.DS.'goods_qrcode'.DS.APPLICATION_CLIENT_TYPE.DS.date('Y', $add_time).DS.date('m', $add_time).DS.date('d', $add_time).DS; // 名称增加站点模式(站点模式不一样商品url地址也会不一样) - $filename = $goods_id.BaseService::SiteTypeValue().'.png'; + $filename = $goods_id.SystemBaseService::SiteTypeValue().'.png'; // 二维码处理参数 $params = [ diff --git a/application/service/PluginsService.php b/application/service/PluginsService.php index 1040ab278..3388c17f5 100755 --- a/application/service/PluginsService.php +++ b/application/service/PluginsService.php @@ -53,7 +53,7 @@ class PluginsService self::PluginsCacheStorage($plugins, $data); } } - return DataReturn('处理成功', 0, $data); + return DataReturn('处理成功', 0, empty($data) ? [] : $data); } /** diff --git a/application/service/BaseService.php b/application/service/SystemBaseService.php similarity index 56% rename from application/service/BaseService.php rename to application/service/SystemBaseService.php index 811a63388..d545886fd 100644 --- a/application/service/BaseService.php +++ b/application/service/SystemBaseService.php @@ -10,21 +10,25 @@ // +---------------------------------------------------------------------- namespace app\service; +use think\Db; use think\facade\Hook; use app\service\ResourcesService; use app\service\QuickNavService; use app\service\PluginsService; /** - * 基础公共信息服务层 + * 系统基础公共信息服务层 * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @date 2020-09-12 * @desc description */ -class BaseService +class SystemBaseService { + // 商品优惠使用记录key + public static $plugins_goods_discount_record_key = 'plugins_use_goods_discount_record_'; + /** * 公共配置信息 * @author Devil @@ -169,5 +173,160 @@ class BaseService return $value; } + + /** + * 是否使用商品优化记录 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-04-09 + * @desc description + * @param [int] $goods_id [商品id] + * @param [string] $plugins [插件名称] + */ + public static function IsGoodsDiscountRecord($goods_id, $plugins) + { + // 获取记录 + $data = self::GetGoodsDiscountRecord($goods_id); + + // 当前插件是否存在优惠记录 + return in_array($plugins, $data); + } + + /** + * 商品优化记录 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-04-09 + * @desc description + * @param [int] $goods_id [商品id] + * @param [string] $plugins [插件名称] + * @param [int] $is_use [是否使用(0否, 1是)] + */ + public static function GoodsDiscountRecord($goods_id, $plugins, $is_use = 0) + { + // 记录key + $key = self::$plugins_goods_discount_record_key.$goods_id; + + // 获取记录 + $data = self::GetGoodsDiscountRecord($goods_id); + + // 是否存在 + $index = array_search($plugins, $data); + + // 是否使用优惠 + if($is_use == 1) + { + // 存储记录 + if($index === false) + { + $data[] = $plugins; + } + session($key, $data); + } else { + if($index !== false) + { + unset($data[$index]); + sort($data); + } + } + + session($key, empty($data) ? null : $data); + return true; + } + + /** + * 获取使用商品优化记录 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-04-09 + * @desc description + * @param [int] $goods_id [商品id] + */ + public static function GetGoodsDiscountRecord($goods_id) + { + $res = session(self::$plugins_goods_discount_record_key.$goods_id); + return empty($res) ? [] : $res; + } + + /** + * 商品是否支持折扣 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2021-04-08 + * @desc description + * @param [array] $params [输入参数] + * @param [string] $plugins [插件名称] + */ + public static function IsGoodsDiscount($params = [], $plugins = '') + { + // 默认支持 + $status = true; + + // 是否关闭商品优惠重叠 + // 采用钩子进行处理 + if(MyC('is_close_goods_discount_overlap', 0) == 1 && !empty($params) && !empty($params['hook_name'])) + { + switch($params['hook_name']) + { + // 商品处理结束 + case 'plugins_service_goods_handle_end' : + if(!empty($params['goods']) && !empty($params['goods']['id'])) + { + $old = Db::name('Goods')->field('price,min_price,max_price')->find($params['goods']['id']); + if(!empty($old)) + { + // 展示销售价格 + if($status && isset($params['goods']['price'])) + { + $temp = explode('-', $params['goods']['price']); + $temp_old = explode('-', $old['price']); + if($temp[count($temp)-1] < $temp_old[count($temp_old)-1]) + { + $status = false; + } + } + + // 最低价 + if($status && isset($params['goods']['min_price'])) + { + if($params['goods']['min_price'] < $old['min_price']) + { + $status = false; + } + } + + // 最高价 + if($status && isset($params['goods']['max_price'])) + { + if($params['goods']['max_price'] < $old['max_price']) + { + $status = false; + } + } + } + } + break; + + // 获取规格详情 + case 'plugins_service_goods_spec_base' : + if(!empty($params['data']) && !empty($params['data']['spec_base']) && !empty($params['data']['spec_base']['id']) && !empty($params['data']['spec_base']['goods_id']) && isset($params['data']['spec_base']['price'])) + { + $price_old = Db::name('GoodsSpecBase')->where(['id'=>$params['data']['spec_base']['id']])->value('price'); + if($status && $params['data']['spec_base']['price'] < $price_old) + { + $status = false; + } + } + break; + } + } + + // 返回状态、默认支持 + return $status; + } } ?> \ No newline at end of file diff --git a/application/tags.php b/application/tags.php index 2b1d0a97d..975bac18d 100755 --- a/application/tags.php +++ b/application/tags.php @@ -32,77 +32,5 @@ return array ( 'log_write' => array ( ), - 'plugins_css' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_navigation_header_handle' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_goods_handle_end' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_goods_spec_base' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_buy_group_goods_handle' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_user_login_success_record' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_goods_spec_extends_handle' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_view_admin_user_save' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_user_save_handle' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_goods_save_handle' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_view_goods_detail_panel_price_top' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_view_home_goods_inside_bottom' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_view_search_goods_inside_bottom' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_goods_spec_type' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_users_center_left_menu_handle' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_service_header_navigation_top_right_handle' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_module_form_admin_user_index' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), - 'plugins_module_form_admin_user_detail' => - array ( - 0 => 'app\\plugins\\membershiplevelvip\\Hook', - ), ); ?> \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index 330fe897d..0df957ce0 100755 --- a/changelog.txt +++ b/changelog.txt @@ -3,19 +3,23 @@ +=========================================================+ 全局 1. 公共图片上传重绘加开关 - 2. 搜索模块多个关键字[或|并且]关系的控制 + 2. 搜索多个关键字[或|并且]关系的控制 + 3. 新增商品优惠重叠开关控制 web端 1. 修复编辑器粘贴数据图片重复存储 2. 修复web端用户注册图片验证码过期问题 3. 修复微信小程序用户授权基础信息丢失问题 - 4. 新增多商户插件、支持用户入驻开店销售产品、商品/订单/结算/数据统计管理 + 4. 新增多商户插件、支持用户入驻开店销售产品、独立首页、独立卖家中心、商品/订单/结算/数据统计管理 小程序 - 1. + 无更新 插件 - 1. 多商户 + 1. 新增多商户 + 2. 会员等级增强版(放开商品规格扩展的数据、支持多商户、适配优惠重叠) + 3. 分销(放开商品规格扩展的数据、支持多商户、适配优惠重叠) + 4. 限时秒杀(适配优惠重叠) +=========================================================+ diff --git a/public/static/common/images/default-company-license.jpg b/public/static/common/images/default-company-license.jpg new file mode 100644 index 0000000000000000000000000000000000000000..287010395a7655777bd97d9338c830365656fd18 GIT binary patch literal 28466 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 literal 0 HcmV?d00001