From 5718f2994090c6f2d5a7b6b73ad110d0853ff7f8 Mon Sep 17 00:00:00 2001 From: 王晓刚 <wxg@bronet.cn> Date: Sat, 8 Jun 2019 21:23:16 +0800 Subject: [PATCH] 海报 --- app/portal/controller/ShareController.php | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ composer.json | 4 +++- public/bg.png | Bin 0 -> 492029 bytes public/themes/simpleboot3/portal/share/index.html | 43 +++++++++++++++++++++++++++++++++++++++++++ public/white.png | Bin 0 -> 7094 bytes simplewind/cmf/common.php | 45 +++++++++++++++++++++++++++++++++++++++++++++ simplewind/vendor/composer/autoload_namespaces.php | 1 + simplewind/vendor/composer/autoload_psr4.php | 1 + simplewind/vendor/composer/autoload_static.php | 12 ++++++++++++ simplewind/vendor/composer/installed.json | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ simplewind/vendor/topthink/think-image/src/Image.php | 27 +++++++++++++++++++++++++++ 11 files changed, 356 insertions(+), 1 deletion(-) create mode 100644 app/portal/controller/ShareController.php create mode 100644 public/bg.png create mode 100644 public/themes/simpleboot3/portal/share/index.html create mode 100644 public/white.png diff --git a/app/portal/controller/ShareController.php b/app/portal/controller/ShareController.php new file mode 100644 index 0000000..3d0e0ff --- /dev/null +++ b/app/portal/controller/ShareController.php @@ -0,0 +1,138 @@ +<?php +/** + * Created by PhpStorm. + * User: Administrator + * Date: 2019/6/8 + * Time: 18:59 + */ + +namespace app\portal\controller; + + +use cmf\controller\WeChatBaseController; +use think\Db; + +class ShareController extends WeChatBaseController +{ + public function index(){ + //判断用户是否填写手机号 + $user_id = cmf_get_current_user_id(); + $my_user = Db::name('my_user')->where('uid',$user_id)->find(); + $user = Db::name('user')->where('id',$user_id)->find(); + if(empty($my_user)){ + $this->error('查询为空','','',''); + } + if(empty($my_user['phone'])){ + $this->error('跳转补全信息页面','','',''); + } + //判断有没有生成过 + if(file_exists('./upload/poster/poster_'.$user_id.".png")){ + $url = $this->get_url($user_id,$my_user['status']); + $webPath = 'qrcode/share_'.$user_id.'.png'; + $savePath = './upload/'.$webPath; + //生成带参二维码 + if(!file_exists($savePath)){ + $prcode_url = $this->get_code($user_id,$url); + } + //保存头像 + $avatar=$this->getImage($user['avatar'],'avatar_'.$user['id']); + if($avatar['code']==1){ + $this->error($avatar['msg']); + } + $savePath = './upload/poster'; + if(!file_exists($savePath)){ + mkdir ($savePath,0777,true); + } + $image = \think\Image::open(ROOT_PATH."public/upload/avatar/avatar_".$user_id.".jpeg"); + $image->thumb(173,173,\think\Image::THUMB_FIXED)->save('./upload/avatar/avatar_'.$user_id.".png"); + $image = \think\Image::open(ROOT_PATH."public/white.png"); + $image->water(ROOT_PATH."public/upload/qrcode/share_".$user_id.".png",[195,725],100) + ->water(ROOT_PATH."public/upload/avatar/avatar_".$user_id.".png",[289,478],100) + ->water(ROOT_PATH."public/bg.png",\think\Image::WATER_CENTER,100) + ->save('./upload/poster/poster_'.$user_id.".png"); + } + $share_image = cmf_get_image_url('poster/poster_'.$user_id.".png"); + $this->assign('share_image',$share_image); + return $this->fetch(); + } + + /** + * 分享链接 + * @param $user_id + * @param $status + * @return string + */ + public function get_url($user_id,$status){ + //http://xkeasy.w.bronet.cn/portal/index/index/my_user_id/用户id/status_id/身份id + $url = url('portal/index/index',['my_user_id'=>$user_id,'status_id'=>$status]); + return $url; + } + + /** + * 生成二维码 + * @param $user_id + * @param $qrData + * @return bool|string + */ + public function get_code($user_id,$qrData){ + /*存储本地*/ + $webPath = 'qrcode/'; + + $savePath = './upload/'.$webPath; + if(!file_exists($savePath)){ + mkdir ($savePath,0777,true); + } + $saveName = "share_".$user_id; + $qrLevel = 'H'; + $qrSize = '8'; + $savePrefix = ""; + if($filename = createQRcode($savePath, $qrData, $qrLevel, $qrSize, $savePrefix,$saveName)){ + $pic = $webPath .$savePrefix. $saveName . '.png'; + return $pic; + }else{ + return false; + } + } + /** + * 下载微信头像保存到本地 + * @param $url + * @param $filename + * @return array + */ + function getImage($url,$filename){ + $save_dir='./upload/avatar/'; + if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){ + return ['code'=>1,'msg'=>'图片路径错误']; + } + $header = array( + 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0', + 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', + 'Accept-Encoding: gzip, deflate',); + $curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);curl_setopt($curl, CURLOPT_ENCODING, 'gzip'); + curl_setopt($curl, CURLOPT_HTTPHEADER, $header); + $data = curl_exec($curl); + $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); + curl_close($curl); + if ($code == 200) {//把URL格式的图片转成base64_encode格式的! + $imgBase64Code = "data:image/jpeg;base64," . base64_encode($data); + }else{ + return ['code'=>1,'msg'=>'图片转换失败']; + } + $img_content=$imgBase64Code;//图片内容 + + if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $img_content, $result)) { + $type = $result[2]; + $new_file = $save_dir.$filename.'.'.$type; + $save_path= 'avatar/'.$filename.'.'.$type; + if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $img_content)))) { + return ['code'=>0,'file_path'=>$new_file,'save_path'=>$save_path]; + }else{ + return ['code'=>1,'msg'=>'图片保存失败']; + } + }else{ + return ['code'=>1,'msg'=>'图片格式错误']; + } + } + +} \ No newline at end of file diff --git a/composer.json b/composer.json index 6bacf8e..0c67eb1 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,9 @@ "ezyang/htmlpurifier": "^4.9", "weiwei/api-doc": "^1.6", "hooklife/thinkphp5-wechat": "^1.1", - "yly-openapi/yly-openapi-sdk": "v1.0.1" + "yly-openapi/yly-openapi-sdk": "v1.0.1", + "dh2y/think-qrcode": "^1.0", + "aferrandini/phpqrcode": "^1.0" }, "extra": { }, diff --git a/public/bg.png b/public/bg.png new file mode 100644 index 0000000..6dd333d Binary files /dev/null and b/public/bg.png differ diff --git a/public/themes/simpleboot3/portal/share/index.html b/public/themes/simpleboot3/portal/share/index.html new file mode 100644 index 0000000..669be15 --- /dev/null +++ b/public/themes/simpleboot3/portal/share/index.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> + <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" /> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>学考无忧-我的推广</title> + <link rel="stylesheet" href="__TMPL__/public/assets/css/reset.css"> + <link rel="stylesheet" href="__TMPL__/public/assets/css/base.css"> + <style> + html, + body { + width: 100%; + height: 100%; + display: flex; + display: -webkit-flex; + justify-content: flex-start; + align-items: flex-start; + flex-direction: column; + } + + .code_Box { + background: #FF5C19 url("{:cmf_get_image_url($share_image)}") no-repeat top left; + background-size: 100%; + -webkit-background-size: 100%; + } + </style> +</head> + +<body> + <!-- 顶部 --> + <div class="order_top" style="background-color: #FF5C19"> + <img src="__TMPL__/public/assets/images/left2.png" alt=""> + <p style="color:white">我的推广</p> + </div> + <div class="code_Box"> + + </div> + <script src="__TMPL__/public/assets/js/base.js"></script> +</body> + +</html> \ No newline at end of file diff --git a/public/white.png b/public/white.png new file mode 100644 index 0000000..076042f Binary files /dev/null and b/public/white.png differ diff --git a/simplewind/cmf/common.php b/simplewind/cmf/common.php index 9438b02..e9e9347 100644 --- a/simplewind/cmf/common.php +++ b/simplewind/cmf/common.php @@ -1822,4 +1822,49 @@ function getAccessToken(){ $jssdk=new \JSSDK(config('wx_app_id'),config('wx_app_secret')); return $jssdk->getAccessToken(); } +/** + * 功能:生成二维码 + * @param string $savePath 图片存储路径 + * @param string $qrData 手机扫描后要跳转的网址 + * @param string $qrLevel 默认纠错比例 分为L、M、Q、H四个等级,H代表最高纠错能力 + * @param int $qrSize 二维码图大小,1-10可选,数字越大图片尺寸越大 + * @param string $savePrefix 图片名称前缀 + * @param array $saveName 图片名称前缀 + * @return bool|string + */ +function createQRcode($savePath, $qrData = 'PHP QR Code :)', $qrLevel = 'L', $qrSize = 4, $savePrefix = '',$saveName) +{ + if (!isset($savePath)) return ''; + //设置生成png图片的路径 + $PNG_TEMP_DIR = $savePath; + //检测并创建生成文件夹 + if (!file_exists($PNG_TEMP_DIR)) { + mkdir($PNG_TEMP_DIR,777,true); + } + $filename = $PNG_TEMP_DIR . 'test.png'; + $errorCorrectionLevel = 'L'; + if (isset($qrLevel) && in_array($qrLevel, ['L', 'M', 'Q', 'H'])) { + $errorCorrectionLevel = $qrLevel; + } + $matrixPointSize = 4; + if (isset($qrSize)) { + $matrixPointSize = min(max((int)$qrSize, 1), 10); + } + if (isset($qrData)) { + if (trim($qrData) == '') { + die('data cannot be empty!'); + } + //生成文件名 文件路径+图片名字前缀+md5(名称)+.png + $filename = $PNG_TEMP_DIR . $savePrefix .$saveName . '.png'; + //开始生成 + \PHPQRCode\QRcode::png($qrData, $filename, $errorCorrectionLevel, $matrixPointSize, 2); + } else { + //默认生成 + \PHPQRCode\QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2); + } + if (file_exists($PNG_TEMP_DIR . basename($filename))) + return basename($filename); + else + return FALSE; +} diff --git a/simplewind/vendor/composer/autoload_namespaces.php b/simplewind/vendor/composer/autoload_namespaces.php index 351c0ed..194c63b 100644 --- a/simplewind/vendor/composer/autoload_namespaces.php +++ b/simplewind/vendor/composer/autoload_namespaces.php @@ -9,6 +9,7 @@ return array( 'Svg\\' => array($vendorDir . '/phenx/php-svg-lib/src'), 'Sabberworm\\CSS' => array($vendorDir . '/sabberworm/php-css-parser/lib'), 'Pimple' => array($vendorDir . '/pimple/pimple/src'), + 'PHPQRCode' => array($vendorDir . '/aferrandini/phpqrcode/lib'), 'PHPExcel' => array($vendorDir . '/phpoffice/phpexcel/Classes'), 'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'), 'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib'), diff --git a/simplewind/vendor/composer/autoload_psr4.php b/simplewind/vendor/composer/autoload_psr4.php index 3aa44e0..ad9097d 100644 --- a/simplewind/vendor/composer/autoload_psr4.php +++ b/simplewind/vendor/composer/autoload_psr4.php @@ -11,6 +11,7 @@ return array( 'think\\captcha\\' => array($vendorDir . '/topthink/think-captcha/src'), 'think\\' => array($vendorDir . '/topthink/think-image/src'), 'mindplay\\annotations\\' => array($vendorDir . '/mindplay/annotations/src/annotations'), + 'dh2y\\qrcode\\' => array($vendorDir . '/dh2y/think-qrcode/src'), 'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'), diff --git a/simplewind/vendor/composer/autoload_static.php b/simplewind/vendor/composer/autoload_static.php index db177a4..09e52cf 100644 --- a/simplewind/vendor/composer/autoload_static.php +++ b/simplewind/vendor/composer/autoload_static.php @@ -34,6 +34,10 @@ class ComposerStaticInit929fb365b9981d29459d58f676689cf7 array ( 'mindplay\\annotations\\' => 21, ), + 'd' => + array ( + 'dh2y\\qrcode\\' => 12, + ), 'S' => array ( 'Symfony\\Polyfill\\Php70\\' => 23, @@ -109,6 +113,10 @@ class ComposerStaticInit929fb365b9981d29459d58f676689cf7 array ( 0 => __DIR__ . '/..' . '/mindplay/annotations/src/annotations', ), + 'dh2y\\qrcode\\' => + array ( + 0 => __DIR__ . '/..' . '/dh2y/think-qrcode/src', + ), 'Symfony\\Polyfill\\Php70\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php70', @@ -205,6 +213,10 @@ class ComposerStaticInit929fb365b9981d29459d58f676689cf7 array ( 0 => __DIR__ . '/..' . '/pimple/pimple/src', ), + 'PHPQRCode' => + array ( + 0 => __DIR__ . '/..' . '/aferrandini/phpqrcode/lib', + ), 'PHPExcel' => array ( 0 => __DIR__ . '/..' . '/phpoffice/phpexcel/Classes', diff --git a/simplewind/vendor/composer/installed.json b/simplewind/vendor/composer/installed.json index c37faa7..4765d3c 100644 --- a/simplewind/vendor/composer/installed.json +++ b/simplewind/vendor/composer/installed.json @@ -1,5 +1,91 @@ [ { + "name": "aferrandini/phpqrcode", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/aferrandini/PHPQRCode.git", + "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aferrandini/PHPQRCode/zipball/3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", + "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2013-07-08T09:39:08+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "PHPQRCode": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ariel Ferrandini", + "email": "arielferrandini@gmail.com", + "homepage": "http://www.ferrandini.com/", + "role": "Developer" + } + ], + "description": "PHPQRCode porting and changed for PHP 5.3 compatibility", + "homepage": "https://github.com/aferrandini/PHPQRCode", + "keywords": [ + "barcode", + "php", + "qrcode" + ], + "abandoned": "endroid/qr-code" + }, + { + "name": "dh2y/think-qrcode", + "version": "1.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/cinaofdai/think-qrcode.git", + "reference": "e4eb6f588ffb6b99ef4fb4610d44e338c9b4c506" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cinaofdai/think-qrcode/zipball/e4eb6f588ffb6b99ef4fb4610d44e338c9b4c506", + "reference": "e4eb6f588ffb6b99ef4fb4610d44e338c9b4c506", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "time": "2018-10-16T04:31:01+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "dh2y\\qrcode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "dh2y", + "email": "xiaodai54_long@163.com" + } + ], + "description": "qrcode for thinkphp5", + "homepage": "https://github.com/cinaofdai/think-qrcode" + }, + { "name": "doctrine/cache", "version": "v1.4.4", "version_normalized": "1.4.4.0", diff --git a/simplewind/vendor/topthink/think-image/src/Image.php b/simplewind/vendor/topthink/think-image/src/Image.php index e28a13d..3dfabc4 100644 --- a/simplewind/vendor/topthink/think-image/src/Image.php +++ b/simplewind/vendor/topthink/think-image/src/Image.php @@ -607,4 +607,31 @@ class Image empty($this->im) || imagedestroy($this->im); } + function round() { + + $w = $this->info['width']; + $h = $this->info['height']; + $w = min($w, $h); + $h = $w; + $img = imagecreatetruecolor($w, $h); + //这一句一定要有 + imagesavealpha($img, true); + //拾取一个完全透明的颜色,最后一个参数127为全透明 + $bg = imagecolorallocatealpha($img, 255, 255, 255, 127); + imagefill($img, 0, 0, $bg); + $r = $w / 2; //圆半径 + $y_x = $r; //圆心X坐标 + $y_y = $r; //圆心Y坐标 + for ($x = 0; $x < $w; $x++) { + for ($y = 0; $y < $h; $y++) { + $rgbColor = imagecolorat($this->im, $x, $y); + if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) { + imagesetpixel($img, $x, $y, $rgbColor); + } + } + } + $this->im= $img; + + return $this; + } } -- libgit2 0.24.0