diff --git a/application/admin/controller/Common.php b/application/admin/controller/Common.php index bbadce7ef..33e5e29d0 100755 --- a/application/admin/controller/Common.php +++ b/application/admin/controller/Common.php @@ -124,6 +124,16 @@ class Common extends Controller // 公共表格钩子名称动态处理 $current = 'plugins_view_admin_'.$this->controller_name; + + // 是否插件默认下 + if($this->controller_name == 'plugins') + { + if(!empty($this->data_request['pluginsname'])) + { + $current .= '_'.trim($this->data_request['pluginsname']); + } + } + // 内容外部顶部 $this->assign('hook_name_content_top', $current.'_content_top'); // 内容外部底部 diff --git a/application/admin/view/default/appmini/config.html b/application/admin/view/default/appmini/config.html index 56335c96a..7c03e30d1 100755 --- a/application/admin/view/default/appmini/config.html +++ b/application/admin/view/default/appmini/config.html @@ -78,7 +78,7 @@
-

1. 获取最新组件版本号,默认[ 1.0.18 ]

+

1. 获取最新组件版本号,默认[ 1.1.4 ]

2. 登录微信小程序平台,左侧导航[ 直播 ],申请直播权限后等待审核通过方可使用

3. 点击左侧导航[ 小程序直播->接入说明 ],找到[ 使用方法说明->1. 【直播组件】如何引入 ],json 代码串[ plugins->live-player-plugin ]参数下的[ version ]的值填入

去获取组件版本号 diff --git a/application/admin/view/default/public/module/form_operate_top.html b/application/admin/view/default/public/module/form_operate_top.html index 58064e7fc..524f602ce 100644 --- a/application/admin/view/default/public/module/form_operate_top.html +++ b/application/admin/view/default/public/module/form_operate_top.html @@ -16,12 +16,11 @@ {{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
- plugins_view_admin_goods_top_operate + {{$hook_name_form_top_operate}}
{{/if}} {{php}} - $hook_name = 'plugins_view_admin_goods_top_operate'; - $hook_data = Hook::listen($hook_name, ['hook_name'=>$hook_name, 'is_backend'=>true]); + $hook_data = Hook::listen($hook_name_form_top_operate, ['hook_name'=>$hook_name_form_top_operate, 'is_backend'=>true]); if(!empty($hook_data) && is_array($hook_data)) { foreach($hook_data as $hook) diff --git a/application/index/controller/Common.php b/application/index/controller/Common.php index 5c378deb0..42cfedb8f 100755 --- a/application/index/controller/Common.php +++ b/application/index/controller/Common.php @@ -169,6 +169,16 @@ class Common extends Controller // 公共表格钩子名称动态处理 $current = 'plugins_view_index_'.$this->controller_name; + + // 是否插件默认下 + if($this->controller_name == 'plugins') + { + if(!empty($this->data_request['pluginsname'])) + { + $current .= '_'.trim($this->data_request['pluginsname']); + } + } + // 内容外部顶部 $this->assign('hook_name_content_top', $current.'_content_top'); // 内容外部底部 diff --git a/application/index/controller/Goods.php b/application/index/controller/Goods.php index 36afc4d02..c1feda17d 100755 --- a/application/index/controller/Goods.php +++ b/application/index/controller/Goods.php @@ -95,7 +95,9 @@ class Goods extends Common } // 二维码 - $this->assign('qrcode_url', MyUrl('index/qrcode/index', ['content'=>urlencode(base64_encode(MyUrl('index/goods/index', ['id'=>$goods_id], true, true)))])); + $qrcode = GoodsService::GoodsQrcode($goods_id, $goods['add_time']); + $qrcode_url = ($qrcode['code'] == 0 && isset($qrcode['data']['url'])) ? $qrcode['data']['url'] : ''; + $this->assign('qrcode_url', $qrcode_url); // 商品评分 $goods_score = GoodsCommentsService::GoodsCommentsScore($goods_id); diff --git a/application/index/view/default/public/module/form_operate_top.html b/application/index/view/default/public/module/form_operate_top.html index 58064e7fc..524f602ce 100644 --- a/application/index/view/default/public/module/form_operate_top.html +++ b/application/index/view/default/public/module/form_operate_top.html @@ -16,12 +16,11 @@ {{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}}
- plugins_view_admin_goods_top_operate + {{$hook_name_form_top_operate}}
{{/if}} {{php}} - $hook_name = 'plugins_view_admin_goods_top_operate'; - $hook_data = Hook::listen($hook_name, ['hook_name'=>$hook_name, 'is_backend'=>true]); + $hook_data = Hook::listen($hook_name_form_top_operate, ['hook_name'=>$hook_name_form_top_operate, 'is_backend'=>true]); if(!empty($hook_data) && is_array($hook_data)) { foreach($hook_data as $hook) diff --git a/application/service/AppMiniService.php b/application/service/AppMiniService.php index a0b897709..52f567ce1 100755 --- a/application/service/AppMiniService.php +++ b/application/service/AppMiniService.php @@ -255,7 +255,7 @@ class AppMiniService if(is_array($data) && isset($data['plugins'])) { $data['plugins']['live-player-plugin'] = [ - 'version' => MyC('common_app_weixin_liveplayer_ver', '1.0.18', true), + 'version' => MyC('common_app_weixin_liveplayer_ver', '1.1.4', true), 'provider' => 'wx2b03c6e691cd7370', ]; if(file_put_contents($file, JsonFormat($data)) === false) diff --git a/application/service/GoodsService.php b/application/service/GoodsService.php index 8dc39e20d..76272882d 100755 --- a/application/service/GoodsService.php +++ b/application/service/GoodsService.php @@ -2151,5 +2151,38 @@ class GoodsService // 匹配商品销售模式 return DataReturn('success', 0, GoodsSalesModelType($site_type)); } + + /** + * 商品二维码生成 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2020-08-13 + * @desc description + * @param [int] $goods_id [商品id] + * @param [int] $add_time [商品创建时间] + */ + public static function GoodsQrcode($goods_id, $add_time) + { + // 时间格式、是否已是时间格式 + if(strstr($add_time, '-') != false) + { + $add_time = strtotime($add_time); + } + + // 自定义路径和名称 + $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; + $filename = $goods_id.'.png'; + + // 二维码处理参数 + $params = [ + 'path' => DS.$path, + 'filename' => $filename, + 'content' => MyUrl('index/goods/index', ['id'=>$goods_id], true, true), + ]; + + // 创建二维码 + return (new \base\Qrcode())->Create($params); + } } ?> \ No newline at end of file diff --git a/application/service/OrderService.php b/application/service/OrderService.php index 1c2d25978..0f9487919 100755 --- a/application/service/OrderService.php +++ b/application/service/OrderService.php @@ -1040,7 +1040,7 @@ class OrderService // 自提模式 添加订单取货码 if($v['order_model'] == 2) { - $v['extraction_data'] = self::OrdersExtractionData($v['id'], $v['user_id']); + $v['extraction_data'] = self::OrdersExtractionData($v['id']); } } @@ -1249,9 +1249,8 @@ class OrderService * @date 2019-11-26 * @desc description * @param [int] $order_id [订单id] - * @param [int] $user_id [用户id] */ - private static function OrdersExtractionData($order_id, $user_id) + private static function OrdersExtractionData($order_id) { // 必须返回的内容格式 $result = [ @@ -1266,30 +1265,17 @@ class OrderService $result['code'] = $code; // 生成二维码参数 - $qrcode_params = [ + $params = [ 'content' => $code, - 'root_path' => ROOT.'public', 'path' => DS.'download'.DS.'order'.DS.'extraction_ode'.DS, - 'filename' => $user_id.'_'.$order_id.'.png', + 'filename' => $order_id.'.png', ]; // 图片不存在则去生成二维码图片并保存至目录 - $file = $qrcode_params['root_path'].$qrcode_params['path'].$qrcode_params['filename']; - if(!file_exists($file)) + $ret = (new \base\Qrcode())->Create($params); + if($ret['code'] == 0) { - $ret = (new \base\Qrcode())->Create($qrcode_params); - if($ret['code'] == 0) - { - $result['images'] = $qrcode_params['path'].$qrcode_params['filename']; - } - } else { - $result['images'] = $qrcode_params['path'].$qrcode_params['filename']; - } - - // 展示地址处理 - if(!empty($result['images'])) - { - $result['images'] = ResourcesService::AttachmentPathViewHandle($result['images']); + $result['images'] = $ret['data']['url']; } } return $result; diff --git a/application/tags.php b/application/tags.php index 72b0e9ae0..25be01e30 100755 --- a/application/tags.php +++ b/application/tags.php @@ -32,6 +32,16 @@ return array ( 'log_write' => array ( ), + 'plugins_service_order_status_change_history_success_handle' => + array ( + 0 => 'app\\plugins\\neworderemail\\Hook', + 1 => 'app\\plugins\\distribution\\Hook', + 2 => 'app\\plugins\\coupon\\Hook', + ), + 'plugins_service_order_pay_launch_handle' => + array ( + 0 => 'app\\plugins\\neworderemail\\Hook', + ), 'plugins_css' => array ( 0 => 'app\\plugins\\distribution\\Hook', @@ -52,11 +62,6 @@ return array ( 1 => 'app\\plugins\\coupon\\Hook', 2 => 'app\\plugins\\membershiplevelvip\\Hook', ), - 'plugins_service_order_status_change_history_success_handle' => - array ( - 0 => 'app\\plugins\\distribution\\Hook', - 1 => 'app\\plugins\\coupon\\Hook', - ), 'plugins_service_order_aftersale_audit_handle_end' => array ( 0 => 'app\\plugins\\distribution\\Hook', @@ -101,6 +106,7 @@ return array ( 0 => 'app\\plugins\\freightfee\\Hook', 1 => 'app\\plugins\\coupon\\Hook', 2 => 'app\\plugins\\membershiplevelvip\\Hook', + 3 => 'app\\plugins\\newuserreduction\\Hook', ), 'plugins_view_goods_detail_title' => array ( @@ -117,6 +123,7 @@ return array ( 1 => 'app\\plugins\\coupon\\Hook', 2 => 'app\\plugins\\membershiplevelvip\\Hook', 3 => 'app\\plugins\\weixinliveplayer\\Hook', + 4 => 'app\\plugins\\answers\\Hook', ), 'plugins_service_goods_handle_end' => array ( @@ -180,5 +187,30 @@ return array ( array ( 0 => 'app\\plugins\\membershiplevelvip\\Hook', ), + 'plugins_admin_css' => + array ( + 0 => 'app\\plugins\\orderpricerevision\\Hook', + ), + 'plugins_admin_js' => + array ( + 0 => 'app\\plugins\\orderpricerevision\\Hook', + ), + 'plugins_admin_view_common_bottom' => + array ( + 0 => 'app\\plugins\\orderpricerevision\\Hook', + ), + 'plugins_view_admin_order_list_operate' => + array ( + 0 => 'app\\plugins\\orderpricerevision\\Hook', + 1 => 'app\\plugins\\orderexportprint\\Hook', + ), + 'plugins_view_admin_order_top_operate' => + array ( + 0 => 'app\\plugins\\orderexportprint\\Hook', + ), + 'plugins_service_user_login_end' => + array ( + 0 => 'app\\plugins\\userloginrewardintegral\\Hook', + ), ); ?> \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index 139ee71f7..ba986b695 100755 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,5 @@ +=========================================================+ - ShopXO 1.9.0 Release --- http://shopxo.net + ShopXO 1.9.0 Release 20200818 http://shopxo.net +=========================================================+ 全局 1. 积分支持按照订单商品总额比例发放,发生售后收回积分 @@ -12,6 +12,7 @@ 8. 支付日志、退款日志、用户消息优化 9. 商品封面图片优化 10. 搜索支持空格多个关键字 + 11. 商品分类支持1~3级自由配置展示 web端 1. 所有条件、数据列表、新增、编辑、删除 新增钩子(公共 form 表单封装) @@ -28,6 +29,7 @@ web端 12. 后台小程序配置集中管理 13. 品牌支持关联多个分类 14. 首页轮播支持电话、地图事件方式 + 15. 商品详情二维码改为静态、更容易适配各种服务器环境 小程序端 @@ -35,7 +37,7 @@ web端 插件 1. 分销插件新增返积分模块、海报高清 - 2. 会员等级推广海报高清 + 2. 微信小程序直播分享海报高清 3. 运费插件支持单独每一个仓库独立配置 diff --git a/config/shopxo.php b/config/shopxo.php index c4c6bffb0..e8aa97fc8 100755 --- a/config/shopxo.php +++ b/config/shopxo.php @@ -15,7 +15,7 @@ return [ // 开发模式 - 'is_develop' => false, + 'is_develop' => true, // 默认编码 'default_charset' => 'utf-8', diff --git a/extend/base/Qrcode.php b/extend/base/Qrcode.php index 1ef8e8d88..82759c51e 100644 --- a/extend/base/Qrcode.php +++ b/extend/base/Qrcode.php @@ -10,6 +10,8 @@ // +---------------------------------------------------------------------- namespace base; +use app\service\ResourcesService; + /** * 二维码驱动 * @author Devil @@ -27,9 +29,10 @@ class Qrcode * @author Devil * @blog http://gong.gg/ * @version 1.0.0 + * @param [array] $params [输入参数] * @datetime 2019-04-16T21:13:10+0800 */ - public function __construct() + public function __construct($params = []) { require_once ROOT.'extend'.DS.'qrcode'.DS.'phpqrcode.php'; @@ -44,7 +47,7 @@ class Qrcode * @blog http://gong.gg/ * @version 1.0.0 * @datetime 2019-04-16T21:13:16+0800 - * @param [array] $params [输入参数] + * @param [array] $params [输入参数] */ public function View($params = []) { @@ -76,7 +79,7 @@ class Qrcode * @version 1.0.0 * @date 2019-04-19 * @desc description - * @param [array] $params [输入参数] + * @param [array] $params [输入参数] */ public function Create($params = []) { @@ -107,55 +110,60 @@ class Qrcode // 文件名称 $filename = empty($params['filename']) ? $this->RandNewFilename().'.png' : $params['filename']; - // 容错率 - $level = isset($params['level']) && in_array($params['level'], array('L','M','Q','H')) ? $params['level'] : 'L'; - - // 大小,最小1,最大10 - $point_size = isset($params['size']) ? min(max(intval($params['size']), 1), 30) : 10; - - // 外边距 - $mr = isset($params['mr']) ? intval($params['mr']) : 2; - - // 生成二维码 - \QRcode::png($params['content'], $dir.$filename, $level, $point_size, $mr); - if(!file_exists($dir.$filename)) + // 是否已经存在、存在是否需要强制重新生成 + if(!file_exists($dir.$filename) || (isset($params['is_force']) && $params['is_force'] == 1)) { - return DataReturn('二维码创建失败', -100); - } - - //判断是否生成带logo的二维码 - if(!empty($params['logo'])) - { - $logo = @file_get_contents($params['logo']); - if($logo !== false) - { - $qr = imagecreatefromstring(file_get_contents($dir.$filename)); //目标图象连接资源 - $logo = imagecreatefromstring($logo); //源图象连接资源 - - $qr_width = imagesx($qr); - $qr_height = imagesy($qr); - $logo_width = imagesx($logo); - $logo_height = imagesy($logo); - $logo_qr_width = $qr_width / 5; //组合之后logo的宽度(占二维码的1/5) - $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度) - $logo_qr_height = $logo_height/$scale; //组合之后logo的高度 - $from_width = ($qr_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点 - - //重新组合图片并调整大小 - imagecopyresampled($qr, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height); - - //输出图片 - imagepng($qr, $dir.$filename); - imagedestroy($qr); - imagedestroy($logo); + // 容错率 + $level = isset($params['level']) && in_array($params['level'], array('L','M','Q','H')) ? $params['level'] : 'L'; + + // 大小,最小1,最大10 + $point_size = isset($params['size']) ? min(max(intval($params['size']), 1), 30) : 10; + + // 外边距 + $mr = isset($params['mr']) ? intval($params['mr']) : 2; + + // 生成二维码 + \QRcode::png($params['content'], $dir.$filename, $level, $point_size, $mr); + if(!file_exists($dir.$filename)) + { + return DataReturn('二维码创建失败', -100); + } + + //判断是否生成带logo的二维码 + if(!empty($params['logo'])) + { + $logo = @file_get_contents($params['logo']); + if($logo !== false) + { + $qr = imagecreatefromstring(file_get_contents($dir.$filename)); //目标图象连接资源 + $logo = imagecreatefromstring($logo); //源图象连接资源 + + $qr_width = imagesx($qr); + $qr_height = imagesy($qr); + $logo_width = imagesx($logo); + $logo_height = imagesy($logo); + $logo_qr_width = $qr_width / 5; //组合之后logo的宽度(占二维码的1/5) + $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度) + $logo_qr_height = $logo_height/$scale; //组合之后logo的高度 + $from_width = ($qr_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点 + + //重新组合图片并调整大小 + imagecopyresampled($qr, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height); + + //输出图片 + imagepng($qr, $dir.$filename); + imagedestroy($qr); + imagedestroy($logo); + } } } - + $result = [ 'dir' => $dir.$filename, 'root' => $this->config['root_path'], 'path' => $this->config['path'], 'filename' => $filename, + 'url' => ResourcesService::AttachmentPathViewHandle($this->config['path'].$filename), ]; return DataReturn('创建成功', 0, $result); @@ -167,7 +175,7 @@ class Qrcode * @blog http://gong.gg/ * @version 1.0.0 * @datetime 2019-04-16T21:23:01+0800 - * @param [array] $params [输入参数] + * @param [array] $params [输入参数] */ public function Download($params = []) { diff --git a/public/static/upload/.gitignore b/public/static/upload/.gitignore index 342a79339..5a3cf0bfa 100755 --- a/public/static/upload/.gitignore +++ b/public/static/upload/.gitignore @@ -1 +1,2 @@ -plugins_* \ No newline at end of file +plugins_* +goods_qrcode \ No newline at end of file