Merge pull request '新增土地列表、新增种植、种植列表、新增操作、操作列表接口' (#8) from zhangwei into dev
Reviewed-on: #8
|
@ -3,8 +3,11 @@
|
|||
namespace app\api\controller;
|
||||
|
||||
use app\common\model\action\Action;
|
||||
use app\common\model\action\ActionPic;
|
||||
use app\common\model\land\Land;
|
||||
use app\common\model\plant\Plant;
|
||||
use dh2y\qrcode\QRcode;
|
||||
use think\facade\Db;
|
||||
use think\response\Json;
|
||||
|
||||
class ActionController extends BaseApiController
|
||||
{
|
||||
|
@ -13,7 +16,7 @@
|
|||
2 => ['kind','breed','dosage','start_date','end_date','area','user','pic','remark'],//除草操作字段
|
||||
3 => ['type','start_date','end_date','area','user','pic','remark'],//灌溉操作字段
|
||||
4 => ['kind','breed','dosage','start_date','end_date','area','user','pic','remark'],//除虫操作字段
|
||||
5 => ['area','user','pic','remark'],//收获操作字段
|
||||
5 => ['user','pic','remark'],//收获操作字段
|
||||
];
|
||||
protected array $actionMessage = [
|
||||
1 => '施肥操作',
|
||||
|
@ -24,38 +27,81 @@
|
|||
];
|
||||
|
||||
//添加操作
|
||||
public function add() {
|
||||
$params = $this->request->post(['land_id','type','detail']);
|
||||
if(empty($params['land_id']) || empty($params['type']) || empty($params['detail'])){
|
||||
public function add(): Json
|
||||
{
|
||||
$params = $this->request->post(['plant_id','type','detail']);
|
||||
if(empty($params['plant_id']) || empty($params['type']) || empty($params['detail'])){
|
||||
return $this->fail('缺少必要参数');
|
||||
}
|
||||
if(!in_array($params['type'],[1,2,3,4,5,6])){
|
||||
if(!in_array($params['type'],[1,2,3,4,5])){
|
||||
return $this->fail('操作类型错误');
|
||||
}
|
||||
$detail = json_decode($params['detail'],true);
|
||||
if(empty($detail)){
|
||||
return $this->fail('请填写操作格式错误');
|
||||
return $this->fail('操作内容格式错误');
|
||||
}
|
||||
foreach($this->actionFields[$params['type']] as $v) {
|
||||
if(empty($detail[$v])){
|
||||
return $this->fail($this->actionMessage[$params['type']].'缺少必要参数');
|
||||
}
|
||||
}
|
||||
Db::startTrans();
|
||||
try {
|
||||
$actionModel = new Action();
|
||||
$actionPicModel = new ActionPic();
|
||||
$actionModel->save([
|
||||
'land_id' => $params['land_id'],
|
||||
'type' => $params['type'],
|
||||
'detail' => $params['detail'],
|
||||
'create_time' => time()
|
||||
]);
|
||||
Db::commit();
|
||||
return $this->success('操作添加成功');
|
||||
} catch (\Exception $e) {
|
||||
Db::rollback();
|
||||
return $this->fail($e->getMessage());
|
||||
if(!is_array($detail['pic'])){
|
||||
return $this->fail($this->actionMessage[$params['type']].'图片字段格式错误');
|
||||
}
|
||||
foreach($detail as $k=>$v){
|
||||
if(!in_array($k,$this->actionFields[$params['type']])){
|
||||
unset($detail[$k]);
|
||||
}
|
||||
}
|
||||
$params['detail'] = json_encode($detail);
|
||||
$plant = Plant::where('id',$params['plant_id'])->findOrEmpty();
|
||||
if($plant->isEmpty()){
|
||||
return $this->fail('土地种植信息错误');
|
||||
}
|
||||
if($plant['status'] == 2){
|
||||
return $this->fail('当前种植信息为已收获状态,不能添加操作信息');
|
||||
}
|
||||
$land = Land::where('id',$plant['land_id'])->findOrEmpty();
|
||||
if($land->isEmpty()){
|
||||
return $this->fail('土地信息错误');
|
||||
}
|
||||
Db::transaction(function()use($params,$plant,$land){
|
||||
Action::create([
|
||||
'plant_id' => $params['plant_id'],
|
||||
'type' => $params['type'],
|
||||
'type_text' => $this->actionMessage[$params['type']],
|
||||
'detail' => $params['detail'],
|
||||
'create_time' => time(),
|
||||
'update_time' => time(),
|
||||
]);
|
||||
if($params['type'] == 5){
|
||||
$qrCode = new QRcode();
|
||||
$qrCodeUrl = env('project.project_url').'/api/index/suYuan?id='.$params['plant_id'];
|
||||
$qrCodeFile = $qrCode->png($qrCodeUrl,false, 6)->entry();
|
||||
Plant::where('id',$params['plant_id'])->update([
|
||||
'status'=>2,
|
||||
'qr_code' => empty($qrCodeFile) ? '' : $qrCodeFile
|
||||
]);
|
||||
Land::where('id',$plant['land_id'])->update([
|
||||
'residual_area'=>$land['residual_area']+$plant['area'],
|
||||
'update_time' => time()
|
||||
]);
|
||||
}
|
||||
});
|
||||
return $this->success('操作成功');
|
||||
}
|
||||
|
||||
//操作列表
|
||||
public function list(): Json
|
||||
{
|
||||
$params = $this->request->get(['plant_id']);
|
||||
if(empty($params['plant_id'])){
|
||||
return $this->fail('缺少必要参数');
|
||||
}
|
||||
$data = Action::where('plant_id',$params['plant_id'])->order('create_time asc')->select()->each(function($item){
|
||||
$item['detail'] = json_decode($item['detail'],true);
|
||||
return $item;
|
||||
})->toArray();
|
||||
return $this->success('请求成功',$data);
|
||||
}
|
||||
}
|
|
@ -30,7 +30,7 @@ class IndexController extends BaseApiController
|
|||
{
|
||||
|
||||
|
||||
public array $notNeedLogin = ['index', 'config', 'policy', 'decorate','code'];
|
||||
public array $notNeedLogin = ['index', 'config', 'policy', 'decorate','code','suYuan'];
|
||||
|
||||
|
||||
/**
|
||||
|
@ -123,6 +123,10 @@ class IndexController extends BaseApiController
|
|||
return $this->fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function suYuan() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -26,6 +26,21 @@
|
|||
return $this->success('请求成功',$data);
|
||||
}
|
||||
|
||||
//土地详情
|
||||
public function detail(): Json
|
||||
{
|
||||
$params = $this->request->get(['land_id']);
|
||||
if(empty($params['land_id'])){
|
||||
return $this->fail('缺少必要参数');
|
||||
}
|
||||
$data = Land::where('id',$params['land_id'])->findOrEmpty();
|
||||
if($data->isEmpty()){
|
||||
return $this->fail('土地信息不存在');
|
||||
}
|
||||
$data['pic'] = json_decode($data['pic'],true);
|
||||
return $this->success('请求成功',$data->toArray());
|
||||
}
|
||||
|
||||
//添加土地
|
||||
public function add(): Json
|
||||
{
|
||||
|
|
|
@ -9,6 +9,21 @@
|
|||
|
||||
class PlantController extends BaseApiController
|
||||
{
|
||||
//种植列表
|
||||
public function list(): Json
|
||||
{
|
||||
$params = $this->request->get(['land_id']);
|
||||
if(empty($params['land_id'])){
|
||||
return $this->fail('缺少必要参数');
|
||||
}
|
||||
$data = Plant::where('land_id',$params['land_id'])->order('create_time desc')->select()->each(function($item){
|
||||
$item['pic'] = json_decode($item['pic'],true);
|
||||
$item['plant_date'] = date('Y-m-d',$item['plant_date']);
|
||||
return $item;
|
||||
})->toArray();
|
||||
return $this->success('请求成功',$data);
|
||||
}
|
||||
|
||||
//添加种植
|
||||
public function add(): Json
|
||||
{
|
||||
|
@ -46,8 +61,10 @@
|
|||
'status' => 1,
|
||||
'create_time' => time()
|
||||
]);
|
||||
$residual_area = $land['residual_area']-$params['area'];
|
||||
Land::where('id',$params['land_id'])->update(['residual_area'=>$residual_area]);
|
||||
Land::where('id',$params['land_id'])->update([
|
||||
'residual_area'=>$land['residual_area']-$params['area'],
|
||||
'update_time' => time()
|
||||
]);
|
||||
});
|
||||
return $this->success('种植添加成功');
|
||||
}
|
||||
|
|
|
@ -34,7 +34,8 @@
|
|||
"rmccue/requests": "^2.0",
|
||||
"w7corp/easywechat": "^6.8",
|
||||
"tencentcloud/sms": "^3.0",
|
||||
"ext-curl": "*"
|
||||
"ext-curl": "*",
|
||||
"dh2y/think-qrcode": "^2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/var-dumper": "^4.2",
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "bc1e827f292ccdd477dd5701ef65d783",
|
||||
"content-hash": "ef8fb5f6b7330deffd3410dd813510fc",
|
||||
"packages": [
|
||||
{
|
||||
"name": "adbario/php-dot-notation",
|
||||
|
@ -267,6 +267,47 @@
|
|||
},
|
||||
"time": "2021-07-12T15:27:21+00:00"
|
||||
},
|
||||
{
|
||||
"name": "dh2y/think-qrcode",
|
||||
"version": "2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/cinaofdai/think-qrcode.git",
|
||||
"reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/cinaofdai/think-qrcode/zipball/977d032afa27b1852f5fc5441fad2497f6db7ff5",
|
||||
"reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"type": "library",
|
||||
"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",
|
||||
"support": {
|
||||
"issues": "https://github.com/cinaofdai/think-qrcode/issues",
|
||||
"source": "https://github.com/cinaofdai/think-qrcode/tree/2.0"
|
||||
},
|
||||
"time": "2019-07-10T02:57:29+00:00"
|
||||
},
|
||||
{
|
||||
"name": "dragonmantank/cron-expression",
|
||||
"version": "v3.3.1",
|
||||
|
@ -4916,7 +4957,8 @@
|
|||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
"php": ">=8.0"
|
||||
"php": ">=8.0",
|
||||
"ext-curl": "*"
|
||||
},
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.3.0"
|
||||
|
|
|
@ -10,6 +10,7 @@ return array(
|
|||
'think\\trace\\' => array($vendorDir . '/topthink/think-trace/src'),
|
||||
'think\\app\\' => array($vendorDir . '/topthink/think-multi-app/src'),
|
||||
'think\\' => array($vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-template/src'),
|
||||
'dh2y\\qrcode\\' => array($vendorDir . '/dh2y/think-qrcode/src'),
|
||||
'clagiordano\\weblibs\\configmanager\\' => array($vendorDir . '/clagiordano/weblibs-configmanager/src'),
|
||||
'app\\' => array($baseDir . '/app'),
|
||||
'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'),
|
||||
|
|
|
@ -42,6 +42,10 @@ class ComposerStaticInitd2a74ba94e266cc4f45a64c54a292d7e
|
|||
'think\\app\\' => 10,
|
||||
'think\\' => 6,
|
||||
),
|
||||
'd' =>
|
||||
array (
|
||||
'dh2y\\qrcode\\' => 12,
|
||||
),
|
||||
'c' =>
|
||||
array (
|
||||
'clagiordano\\weblibs\\configmanager\\' => 34,
|
||||
|
@ -166,6 +170,10 @@ class ComposerStaticInitd2a74ba94e266cc4f45a64c54a292d7e
|
|||
2 => __DIR__ . '/..' . '/topthink/think-orm/src',
|
||||
3 => __DIR__ . '/..' . '/topthink/think-template/src',
|
||||
),
|
||||
'dh2y\\qrcode\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/dh2y/think-qrcode/src',
|
||||
),
|
||||
'clagiordano\\weblibs\\configmanager\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/clagiordano/weblibs-configmanager/src',
|
||||
|
|
|
@ -273,6 +273,50 @@
|
|||
},
|
||||
"install-path": "../clagiordano/weblibs-configmanager"
|
||||
},
|
||||
{
|
||||
"name": "dh2y/think-qrcode",
|
||||
"version": "2.0",
|
||||
"version_normalized": "2.0.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/cinaofdai/think-qrcode.git",
|
||||
"reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/cinaofdai/think-qrcode/zipball/977d032afa27b1852f5fc5441fad2497f6db7ff5",
|
||||
"reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"time": "2019-07-10T02:57:29+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",
|
||||
"support": {
|
||||
"issues": "https://github.com/cinaofdai/think-qrcode/issues",
|
||||
"source": "https://github.com/cinaofdai/think-qrcode/tree/2.0"
|
||||
},
|
||||
"install-path": "../dh2y/think-qrcode"
|
||||
},
|
||||
{
|
||||
"name": "dragonmantank/cron-expression",
|
||||
"version": "v3.3.1",
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
'name' => 'topthink/think',
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'reference' => 'c119ea160bba5b4a4a66a8e378c2b112c789143a',
|
||||
'reference' => '68951aabafc2dea38eda4ad270d23540f05b1e62',
|
||||
'type' => 'project',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
|
@ -46,6 +46,15 @@
|
|||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'dh2y/think-qrcode' => array(
|
||||
'pretty_version' => '2.0',
|
||||
'version' => '2.0.0.0',
|
||||
'reference' => '977d032afa27b1852f5fc5441fad2497f6db7ff5',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../dh2y/think-qrcode',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'dragonmantank/cron-expression' => array(
|
||||
'pretty_version' => 'v3.3.1',
|
||||
'version' => '3.3.1.0',
|
||||
|
@ -598,7 +607,7 @@
|
|||
'topthink/think' => array(
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'reference' => 'c119ea160bba5b4a4a66a8e378c2b112c789143a',
|
||||
'reference' => '68951aabafc2dea38eda4ad270d23540f05b1e62',
|
||||
'type' => 'project',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
# think-qrcode
|
||||
The ThinkPHP5 qrcode
|
||||
二维码生成 SDK
|
||||
## 安装
|
||||
|
||||
### 一、执行命令安装
|
||||
```
|
||||
composer require dh2y/think-qrcode
|
||||
```
|
||||
|
||||
或者
|
||||
|
||||
### 二、require安装
|
||||
|
||||
##### thinkphp5.0 安装
|
||||
```
|
||||
"require": {
|
||||
"dh2y/think-qrcode":"1.*"
|
||||
},
|
||||
```
|
||||
|
||||
##### thinkphp5.1 安装
|
||||
```
|
||||
"require": {
|
||||
"dh2y/think-qrcode":"2.*"
|
||||
},
|
||||
```
|
||||
|
||||
或者
|
||||
### 三、autoload psr-4标准安装
|
||||
```
|
||||
a) 进入vendor/dh2y目录 (没有dh2y目录 mkdir dh2y)
|
||||
b) git clone
|
||||
c) 修改 git clone下来的项目名称为think-qrcode
|
||||
d) 添加下面配置
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"dh2y\\qrcode\\": "vendor/dh2y/think-qrcode/src"
|
||||
}
|
||||
},
|
||||
e) php composer.phar update
|
||||
```
|
||||
|
||||
|
||||
## 使用
|
||||
#### 添加配置文件
|
||||
```
|
||||
return [
|
||||
'cache_dir' => 'uploads'.DS.'qrcode', //缓存地址
|
||||
'background'=> 'static/image/icon_cover.png' //背景图
|
||||
];
|
||||
```
|
||||
|
||||
#### 使用方法
|
||||
```
|
||||
$code = new QRcode();
|
||||
$code_path = $code->png($register_url) //生成二维码
|
||||
->logo('static/image/avatar-m.jpg') //生成logo二维码
|
||||
->background(180,500) //给二维码加上背景
|
||||
->text($role,20,['center',740],'#ff4351') //添加文字水印
|
||||
->text($nick_name,20,['center',780],'#000000')
|
||||
->getPath(); //获取二维码生成的地址
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"name": "dh2y/think-qrcode",
|
||||
"description": "qrcode for thinkphp5",
|
||||
"homepage": "https://github.com/cinaofdai/think-qrcode",
|
||||
"license": "MIT",
|
||||
"minimum-stability": "stable",
|
||||
"version": "2.0",
|
||||
"authors": [
|
||||
{
|
||||
"name": "dh2y",
|
||||
"email": "xiaodai54_long@163.com"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/cinaofdai/think-qrcode/issues"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"dh2y\\qrcode\\": "src/"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,227 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by dh2y.
|
||||
* Date: 2018/8/8 14:38
|
||||
* for: 二维码生成
|
||||
*/
|
||||
|
||||
namespace dh2y\qrcode;
|
||||
|
||||
|
||||
|
||||
use think\Exception;
|
||||
use think\facade\Config;
|
||||
use think\facade\Request;
|
||||
|
||||
|
||||
|
||||
class QRcode
|
||||
{
|
||||
|
||||
|
||||
protected $config = []; //相关配置
|
||||
protected $cache_dir = ''; //二维码缓存
|
||||
protected $outfile = ''; //输出二维码文件
|
||||
|
||||
protected $error = ''; //错误信息
|
||||
|
||||
public function __construct(){
|
||||
|
||||
$this->config= Config::get('qrcode.');
|
||||
|
||||
if(isset($this->config['cache_dir'])&&$this->config['cache_dir']!=''){
|
||||
$this->cache_dir = $this->config['cache_dir'];
|
||||
}else{
|
||||
$this->cache_dir = 'uploads/qrcode';
|
||||
}
|
||||
|
||||
|
||||
if (!file_exists($this->cache_dir)){
|
||||
mkdir ($this->cache_dir,0775,true);
|
||||
}
|
||||
|
||||
require("phpqrcode/qrlib.php");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 生成普通二维码
|
||||
* @param string $url 生成url地址
|
||||
* @param bool $outfile
|
||||
* @param int $size
|
||||
* @param string $evel
|
||||
* @return $this
|
||||
*/
|
||||
public function png($url,$outfile=false,$size=5,$evel='H'){
|
||||
|
||||
if(!$outfile){
|
||||
$outfile = $this->cache_dir.'/'.time().'.png';
|
||||
}
|
||||
|
||||
$this->outfile = $outfile;
|
||||
|
||||
\QRcode::png($url,$outfile,$evel,$size,2);
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 显示二维码
|
||||
*/
|
||||
public function show(){
|
||||
$url = Request::instance()->domain().'/'.$this->outfile;
|
||||
exit('<img src="'.$url.'"/>');
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回url路径
|
||||
* @return string
|
||||
*/
|
||||
public function entry(){
|
||||
return Request::instance()->domain().'/'.$this->outfile;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回生成二维码的相对路径
|
||||
* @param bool $ds
|
||||
* @return string
|
||||
*/
|
||||
public function getPath($ds=true){
|
||||
if($ds){
|
||||
return '/'.$this->outfile;
|
||||
}else{
|
||||
return $this->outfile;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 销毁内容
|
||||
*/
|
||||
public function destroy(){
|
||||
@unlink($this->outfile);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 添加logo到二维码中
|
||||
* @param $logo
|
||||
* @return bool|mixed
|
||||
*/
|
||||
public function logo($logo){
|
||||
if (!isset($logo)||$logo=='') {
|
||||
$this->error = 'logo不存在';
|
||||
return false;
|
||||
}
|
||||
$QR = imagecreatefromstring(file_get_contents($this->outfile));
|
||||
$logo = imagecreatefromstring(file_get_contents($logo));
|
||||
$QR_width = imagesx($QR);//二维码图片宽度
|
||||
$QR_height = imagesy($QR);//二维码图片高度
|
||||
$logo_width = imagesx($logo);//logo图片宽度
|
||||
$logo_height = imagesy($logo);//logo图片高度
|
||||
$logo_qr_width = $QR_width / 5;
|
||||
$scale = $logo_width/$logo_qr_width;
|
||||
$logo_qr_height = $logo_height/$scale;
|
||||
$from_width = ($QR_width - $logo_qr_width) / 2;
|
||||
//重新组合图片并调整大小
|
||||
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
|
||||
|
||||
$this->outfile = $this->cache_dir.'/'.time().'.png';
|
||||
imagepng($QR, $this->outfile);
|
||||
imagedestroy($QR);
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 添加背景图
|
||||
* @param int $x 二维码在背景图X轴未知
|
||||
* @param int $y 二维码在背景图Y轴未知
|
||||
* @param string $dst_path
|
||||
* @return $this
|
||||
*/
|
||||
public function background($x=200,$y=500,$dst_path = ''){
|
||||
|
||||
if($dst_path==''){
|
||||
$dst_path = $this->config['background'];
|
||||
}
|
||||
$src_path = $this->outfile;//覆盖图
|
||||
|
||||
//创建图片的实例
|
||||
$dst = imagecreatefromstring(file_get_contents($dst_path));
|
||||
$src = imagecreatefromstring(file_get_contents($src_path));
|
||||
|
||||
//获取覆盖图图片的宽高
|
||||
list($src_w, $src_h) = getimagesize($src_path);
|
||||
|
||||
//将覆盖图复制到目标图片上,最后个参数100是设置透明度(100是不透明),这里实现不透明效果
|
||||
imagecopymerge($dst, $src, $x, $y, 0, 0, $src_w, $src_h, 100);
|
||||
|
||||
$this->outfile = $this->cache_dir.'/'.time().'.png';
|
||||
imagepng($dst, $this->outfile);//根据需要生成相应的图片
|
||||
imagedestroy($dst);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function text($text,$size,$locate =[],$color = '#00000000',$font='simsun.ttc', $offset = 0, $angle = 0) {
|
||||
|
||||
$dst_path = $this->outfile;
|
||||
|
||||
//创建图片的实例
|
||||
$dst = imagecreatefromstring(file_get_contents($dst_path));
|
||||
|
||||
/* 设置颜色 */
|
||||
if (is_string($color) && 0 === strpos($color, '#')) {
|
||||
$color = str_split(substr($color, 1), 2);
|
||||
$color = array_map('hexdec', $color);
|
||||
if (empty($color[3]) || $color[3] > 127) {
|
||||
$color[3] = 0;
|
||||
}
|
||||
} elseif (!is_array($color)) {
|
||||
throw new Exception('错误的颜色值');
|
||||
}
|
||||
|
||||
//如果字体不存在 用composer项目自己的字体
|
||||
if(!is_file($font)){
|
||||
$font = dirname(__FILE__).'/'.$font;
|
||||
}
|
||||
|
||||
//获取文字信息
|
||||
$info = imagettfbbox($size, $angle, $font, $text);
|
||||
$minx = min($info[0], $info[2], $info[4], $info[6]);
|
||||
$maxx = max($info[0], $info[2], $info[4], $info[6]);
|
||||
$miny = min($info[1], $info[3], $info[5], $info[7]);
|
||||
$maxy = max($info[1], $info[3], $info[5], $info[7]);
|
||||
/* 计算文字初始坐标和尺寸 */
|
||||
$x = $minx;
|
||||
$y = abs($miny);
|
||||
$w = $maxx - $minx;
|
||||
$h = $maxy - $miny;
|
||||
|
||||
//背景图信息
|
||||
list($dst_w, $dst_h) = getimagesize($dst_path);
|
||||
|
||||
if (is_array($locate)) {
|
||||
list($posx, $posy) = $locate;
|
||||
$x += ($posx=='center')?(($dst_w - $w) / 2):$posx;
|
||||
$y += ($posy=='center')?(($dst_h - $h) / 2):$posy;
|
||||
} else {
|
||||
throw new Exception('不支持的文字位置类型');
|
||||
}
|
||||
|
||||
//字体颜色
|
||||
$black = imagecolorallocate($dst, $color[0], $color[1], $color[2]);
|
||||
|
||||
//加入文字
|
||||
imagefttext($dst, $size, $angle, $x, $y, $black,$font, $text);
|
||||
|
||||
|
||||
//生成图片
|
||||
$this->outfile = $this->cache_dir.'/'.time().'.png';
|
||||
imagepng($dst, $this->outfile);
|
||||
imagedestroy($dst);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
2018-08-08 15:16:58: imagepng(/data/wwwroot/web/www.shiyongxiu.com/runtime/QRcode_cache/1533712618.png): failed to open stream: No such file or directory
|
|
@ -0,0 +1 @@
|
|||
2018-08-08 15:17:01: imagepng(/data/wwwroot/web/www.shiyongxiu.com/runtime/QRcode_cache/1533712621.png): failed to open stream: No such file or directory
|
|
@ -0,0 +1,38 @@
|
|||
* 1.0.0 build 2010031920
|
||||
|
||||
- first public release
|
||||
- help in readme, install
|
||||
- cleanup ans separation of QRtools and QRspec
|
||||
- now TCPDF binding requires minimal changes in TCPDF, having most of job
|
||||
done in QRtools tcpdfBarcodeArray
|
||||
- nicer QRtools::timeBenchmark output
|
||||
- license and copyright notices in files
|
||||
- indent cleanup - from tab to 4spc, keep it that way please :)
|
||||
- sf project, repository, wiki
|
||||
- simple code generator in index.php
|
||||
|
||||
* 1.1.0 build 2010032113
|
||||
|
||||
- added merge tool wich generate merged version of code
|
||||
located in phpqrcode.php
|
||||
- splited qrconst.php from qrlib.php
|
||||
|
||||
* 1.1.1 build 2010032405
|
||||
|
||||
- patch by Rick Seymour allowing saving PNG and displaying it at the same time
|
||||
- added version info in VERSION file
|
||||
- modified merge tool to include version info into generated file
|
||||
- fixed e-mail in almost all head comments
|
||||
|
||||
* 1.1.2 build 2010032722
|
||||
|
||||
- full integration with TCPDF thanks to Nicola Asuni, it's author
|
||||
- fixed bug with alphanumeric encoding detection
|
||||
|
||||
* 1.1.3 build 2010081807
|
||||
|
||||
- short opening tags replaced with standard ones
|
||||
|
||||
* 1.1.4 build 2010100721
|
||||
|
||||
- added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC)
|
|
@ -0,0 +1,67 @@
|
|||
== REQUIREMENTS ==
|
||||
|
||||
* PHP5
|
||||
* PHP GD2 extension with JPEG and PNG support
|
||||
|
||||
== INSTALLATION ==
|
||||
|
||||
If you want to recreate cache by yourself make sure cache directory is
|
||||
writable and you have permisions to write into it. Also make sure you are
|
||||
able to read files in it if you have cache option enabled
|
||||
|
||||
== CONFIGURATION ==
|
||||
|
||||
Feel free to modify config constants in qrconfig.php file. Read about it in
|
||||
provided comments and project wiki page (links in README file)
|
||||
|
||||
== QUICK START ==
|
||||
|
||||
Notice: probably you should'nt use all of this in same script :)
|
||||
|
||||
<?phpb
|
||||
|
||||
//include only that one, rest required files will be included from it
|
||||
include "qrlib.php"
|
||||
|
||||
//write code into file, Error corection lecer is lowest, L (one form: L,M,Q,H)
|
||||
//each code square will be 4x4 pixels (4x zoom)
|
||||
//code will have 2 code squares white boundary around
|
||||
|
||||
QRcode::png('PHP QR Code :)', 'test.png', 'L', 4, 2);
|
||||
|
||||
//same as above but outputs file directly into browser (with appr. header etc.)
|
||||
//all other settings are default
|
||||
//WARNING! it should be FIRST and ONLY output generated by script, otherwise
|
||||
//rest of output will land inside PNG binary, breaking it for sure
|
||||
QRcode::png('PHP QR Code :)');
|
||||
|
||||
//show benchmark
|
||||
QRtools::timeBenchmark();
|
||||
|
||||
//rebuild cache
|
||||
QRtools::buildCache();
|
||||
|
||||
//code generated in text mode - as a binary table
|
||||
//then displayed out as HTML using Unicode block building chars :)
|
||||
$tab = $qr->encode('PHP QR Code :)');
|
||||
QRspec::debug($tab, true);
|
||||
|
||||
== TCPDF INTEGRATION ==
|
||||
|
||||
Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php.
|
||||
Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge)
|
||||
2dbarcodes.php
|
||||
|
||||
Then use similar as example #50 from TCPDF examples:
|
||||
|
||||
<?php
|
||||
|
||||
$style = array(
|
||||
'border' => true,
|
||||
'padding' => 4,
|
||||
'fgcolor' => array(0,0,0),
|
||||
'bgcolor' => false, //array(255,255,255)
|
||||
);
|
||||
|
||||
//code name: QR, specify error correction level after semicolon (L,M,Q,H)
|
||||
$pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N');
|
|
@ -0,0 +1,165 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
|
@ -0,0 +1,45 @@
|
|||
This is PHP implementation of QR Code 2-D barcode generator. It is pure-php
|
||||
LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi.
|
||||
|
||||
== LICENSING ==
|
||||
|
||||
Copyright (C) 2010 by Dominik Dzienia
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file)
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with this library; if not, write to the Free Software Foundation, Inc., 51
|
||||
Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
== INSTALATION AND USAGE ==
|
||||
|
||||
* INSTALL file
|
||||
* http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page
|
||||
|
||||
== CONTACT ==
|
||||
|
||||
Fell free to contact me via e-mail (deltalab at poczta dot fm) or using
|
||||
folowing project pages:
|
||||
|
||||
* http://sourceforge.net/projects/phpqrcode/
|
||||
* http://phpqrcode.sourceforge.net/
|
||||
|
||||
== ACKNOWLEDGMENTS ==
|
||||
|
||||
Based on C libqrencode library (ver. 3.1.1)
|
||||
Copyright (C) 2006-2010 by Kentaro Fukuchi
|
||||
http://megaui.net/fukuchi/works/qrencode/index.en.html
|
||||
|
||||
QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other
|
||||
countries.
|
||||
|
||||
Reed-Solomon code encoder is written by Phil Karn, KA9Q.
|
||||
Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
1.1.4
|
||||
2010100721
|
|
@ -0,0 +1,2 @@
|
|||
xÚ<EFBFBD><EFBFBD>Á
À E9³u<06><>`³"PÅ„CÛ牗T!0$
|
||||
E•É²Q™<EFBFBD>Ém½úhÛ¾9{kI"› 9Ln)Ap¤åÖ¾Ë>ß^‡Õz³mënÅ–;ü´mßn†ú¦Ë
|
After Width: | Height: | Size: 126 B |
After Width: | Height: | Size: 202 B |
After Width: | Height: | Size: 205 B |
After Width: | Height: | Size: 216 B |
After Width: | Height: | Size: 210 B |
After Width: | Height: | Size: 213 B |
After Width: | Height: | Size: 219 B |
|
@ -0,0 +1 @@
|
|||
xÚí™A„ E]sëIX´;¸Ün6€È`‚q”êêW6ñ奚`Œ%A/3!¢°‚¢Š!g–ÈÌ¡’1N)éE¢Ï|;®—>6â¸<C3A2>Þ97$ëÄôëc]kkö<6B>wé1Öü[·mCÍœcÊRºÄê¹>¦èµ¾šE,•hʼnp„#áxF<1C>yWÏÇVWGçòÕ3¼Õ+шþàË“úSŽâ}Äž<C384>#áG8b^c^cÏÀŽp„c&3YQ"ñŽ÷çÌvµù›…ñàÎþþ¼–¹kÞ9ŠÜ‡÷}”¹³ï×ú ¢Ä¿<C384>QäÿL—/ÝÔÀÏ
|
After Width: | Height: | Size: 211 B |
After Width: | Height: | Size: 211 B |
|
@ -0,0 +1,2 @@
|
|||
xÚí™A
|
||||
ƒ0E]çÖ…,2;sƒä&ÉÍšh¥ÛêO¡ôÝÈàã1&09OIv@DDÒÌ&§Ù‰K<E280B0>XÈÕFv•<Ádqò9Ö<%h•¹Yïs!(d¥²ës;~||b(ÏøYůg#µ`œK ±S¼Åô¹Ä¶˜ùsàidß<64>Lg:Ó™Îtþ/gmª<6D>™ƒkÅMâ3³{4rTÈQýÿe¥·s·>ó<Ó™Ît¦3<C2A6>éÌ;ïH¼#Ñ™Ît¦3<C2A6>ÍYœ+og©hù¶óµÙ½¬lnðûF>Øi^»#awm;gè~pÛgìNs{6z’‘»ãºïÞäp¾Ê'
|
After Width: | Height: | Size: 228 B |
|
@ -0,0 +1,3 @@
|
|||
xÚíšA
|
||||
Ä E»öÖ.ĚNo 7Ń›Ť¶iiRÚN2‹áW%đxÁ@ÚÚśę'
|
||||
u<EFBFBD>6×ę<EFBFBD>.ť*S;}<7D>«ŇĂ ĎTúčĚzrŤtąď%ç,ŇĹÚâÎ}ç;“âç)ąź<C485>âÝZÚîLĺčą÷¬Pçç$Ż×÷ĎqËgśLÂôdJ‡;Üáw¸Ăý.]z#źľ«[Íť˝ďOg‚Ćô"ĐË áBíî¦}Ç}‡;Üáw¸Ăî<>#1GbŽ„;Üáw¸Ăý_ÝC+w˘@Dfî÷ďç™uťř2™ĹÚÉNţű9R7|pWßkďű®ż“ßßkşöżşú»ĽÎÓ
|
After Width: | Height: | Size: 225 B |
|
@ -0,0 +1 @@
|
|||
xÚÍ’Í
À F{vë& à&°Y+?Z1öÐSŸ'y!¢ŸÌÁa<C381>815&£•Û´ŽÙHå£Ùžc³•l«ÏFÆè1º#é6fÊÖü©§6Äø•O7ˆ¨†C¦«›ðÖ<C3B0>ž<EFBFBD>Ï8gI®ÏöfB¦ÃÄÿæ\DÔ»(
|
After Width: | Height: | Size: 144 B |
After Width: | Height: | Size: 225 B |
|
@ -0,0 +1 @@
|
|||
xÚíšA„ E]sëIX´;¹Ün6Up‚<13>“в™ÿ]Ù˜þ<i-eWö‹¶˜)×äÅ•¼ÉÂ…H\jvqÙHL\6–šÝÐ…rI›¢LܹÜÕ%ÅÓ@´þ±V—vÆÂúý¤(ÏP4|ÎXnÒgÉ<>ß¼~]D¾ÉÕ×u1Us S\À°€,ÿÅ2Þ¢N§Ã?D›KºüF-:“eJ]p_À°€,˜a0Ã`†ÁÝXÀ°`†Áƒw,`X´]˜ˆ™‚¹‹˜°5‰®Y4{å±æñ2íûåvçJs†±Ûí9±˜í)õu±Û¹êÏØ,«]¸“‹Ù^_§7$ƒ_Í
|
After Width: | Height: | Size: 235 B |
|
@ -0,0 +1,3 @@
|
|||
xÚíšA
|
||||
„0E]{ë<>.’]{{{³©Z¥BepÆÞwe@<1F>V›ERZ3»Á"*2o€4¦y‰)i#dÒbdFÒ…´ŒI"ú‘—4ž½WIíuŠÓ45ßx«.ZSÙ{ÁŸ¯8åËÿk={o.±qÊÙ£[œÍ:帒q»õƒy
|
||||
)t#á„N8ádCj<43>-O<>OG}¼:/Ÿ:s<>z!Å)^<ùe½·S·uâ{ 'œp 'ú=ú=ú=¾'œp 'œp¢ß£ß£ßã<1F>N8á„Óÿ9©ªˆôpQQõ]HÔpz¾<7A>ØGœ^æ½Qº˜I|¾ß³<C39F>u;9™ÎïÕëd;“X~$ËÙÑÉt¶ÊÛédy
|
After Width: | Height: | Size: 226 B |
|
@ -0,0 +1,3 @@
|
|||
xÚíšA
|
||||
à E³öÖfo 7Ñ›U<E280BA>) %M!ΔÂûYu(<šð“sK²“Tœ›Ó
|
||||
É&§IÚ\i+¥Ðª™(m®´FQ¡¹¯h±æöüèv~n1„oÏ]sëçÖï¤_ÞŸÊ3`î_w2õȹ•lc[¼•;·Ûc֟ˤ’Nóª4ÜpÃ
7ÜpÃímTÿ¸œ›‘ÝêrÞiñä_ƒç¿pS=7Þ7ÜpÃ
7ÜpÃ<70>>IŸ¤Oò-Á
7ÜpÃ
7ú$}’>É·7ÜpÃ
·tss‰Órs
§åVÍÎÜÆ÷’mýï¡Ò¹ò‡<C3B2>Þñ}R~7ôà&¾÷º?7ù<37>Þý<C39E>Ô¦Iïbhâ{æ»<ÀMi-
|
After Width: | Height: | Size: 220 B |
|
@ -0,0 +1 @@
|
|||
xΪν›Aƒ E»φΦMX0;Έ<>άnVP4ΪHSS»xίU3±/O΄ύLiJ4<4A><34>±VβJC<4A>%ύ‰6VR&ΓήD‘B<E28098>HjDω‚JΟ??™―κBlcΗ±ρ½§'σUλXοUοή<CEBF>0ζΓywΝΔ―χj¬ιλ<CEB9>³€3Ε›Ύλ<CE8E>cj†ω£{¨¥½:GqΔG<1C>έρψ<CF81>ϋΪ°N†v;Ή¶η¬“J‡ΔΠ<ϋ‡Ι]<5D>κλΘσ<CE98>#<23>8β<38>#<23>8βH'§“ΣΙωΝΑGqΔGιδtr:9Ο#<23>8β<38>#<23>8βΨ“h<68>―NΤt”<74>΄Φ_έΨ>tΉeλμS―¦ζ<C2A6>ω^<5E>\g―υΞQe?ωvuφΜoοΥ;<3B>ο>μ<>*οwlςΧmΡ
|
After Width: | Height: | Size: 242 B |
|
@ -0,0 +1,3 @@
|
|||
xÚíÛA
|
||||
à …á¬së‚‹™]rƒx½Y51mMÈBG
|
||||
ÿ¸*Sx|Ua5Ƶ‚Z—Š„-,Ž1ä²HÑPÒRj–šX5§®i†©’áG©>W¥ŽžRïöÕ/Ëâ+uT廯åÏӯ嗴ªuæÏ¥Ú[Sía£[kví÷5•+5n§Á´JêÜ%+V¬X±bÅŠõ߬u'Á<07>±þÔû SRýå÷štzZ»ì+÷+V¬X±bÅŠ•ÙŸÙŸÙŸûŠ+V¬X±bÅÊìÏìÏìÏ}ÅŠ+V¬X±ö±ª¤¥ÖVI©¢ÖÖ‘+k«qÿ[úËtŽ·oVZÍþvoNV³wÇ}µ{³r<ýRÞ"<22>RÍÞ]ê
W«r}
|
After Width: | Height: | Size: 242 B |
|
@ -0,0 +1,2 @@
|
|||
xÚí›A
|
||||
à E³öÖ…,t§7ˆ7Ñ›U<E280BA> E)i7ï»*~cÃüÅÄXÖEBÆè°FC–˜³6¡:&çL,å¬Mv.ŽÂÎæKgŸÕ¸ãYMç>ŸÎí>ûmÛš·?ª•vô¹¾mg?<3F>ßÒ±Îþ³æηªd˜“Cµ¹U¦ÏIk•ÚÚE\ÕÙMs†f˜a†f˜a>œ[sÓˆ9쬩ެ8bö<kÕÙ7œ}ç†k³™§õ™ÿ3Ì0Ã3Ì0Ã3Ìä*r¹Š\Å7f˜a†f˜a†fr¹Š\Å7f˜a†f˜a†YÆÙ<18>Îæd›4ƒ9kíÆÌÔÝyûX y‰gŒØÙ)›«dw<64>nÌ¢ûU×>Ëî”]ßöLgÉÝÁ›³è¾äEo‚ w1
|
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 237 B |
After Width: | Height: | Size: 234 B |
|
@ -0,0 +1,2 @@
|
|||
xÚíÜA<0E> …a×Ţş ‹™ťÜ@n7+*¶šÖÚ4‘!Í?®Jšđň ł<>”抮«]Ş—ÉSźâTf)–ŮsŠIÂ"…Č”bžÝ0…Š|•"Luٸî,Ž×EÇ1\6®*ĎuQŢ?Ľ>aĚĎ…ăţńŽÄRő-r“÷n.ďꯋ\®Tżü:Ó*)|)°Ŕ,°Ŕ,ţŃâęóĺéx_ă¬}:^R„<52>Uoɢ‰uÁ~ÁމX`<60>XĐŹĐŹĐŹĐŹ°_`<60>X`<60>XĐŹĐŹĐŹ°_`<60>X`<60>XĐŹĐŹĐŹĐŹ°wb<77>X`<60>żĄPUőö)DÔŢ"cČ{‹zçÎő3ę›é<}¸óˇ^?b÷m˙ÎÂěž<C49B>íş°»óaűŽ´’Âę.<2E>]
|
||||
ł{Q6uáT,9
|
After Width: | Height: | Size: 232 B |
|
@ -0,0 +1 @@
|
|||
xÚí“Á
À E{vë& à&°Y+¢b¤öÐkŸ'yù‘¤¿ÌÁa :äÀTXl<58>Þ¶$W+Ó<>vû®îœ¢9}gRæ¬@H0YPB½ÆÃEmÚÚ?ûœÍ±ísœÖ"bµìt2cnÖé†É:½ïºë;¿Y§“ÃzÿQã«7¿Ô
|
After Width: | Height: | Size: 147 B |
After Width: | Height: | Size: 255 B |
|
@ -0,0 +1 @@
|
|||
xÚíÜAƒ …a×Þº ØÉ
à&r³‚ Á´¸ªÎ4ù§«†´yù‚Ä·!¥mV3I<33>µv!ÒœÖ2¢i\NSSä4EF2<46>+65Å¥‰e¾þÃ/Wœs]šñ¾‰!„Á?ÿpÅõû¦=S~ùüÄ<C3BC>?Ëý+þx¦Ö6r6yö³Ùƹ}“Ç´™ë×eR1-<2D>W•l°Ál°Á›ûÒŒÞXŸz/>Væ«·ù§:ñÒÒÄAš8üý-+mTíÎÎbl°Ál°ÁlèštMº&]“³l°Ál°Áº&]“®I×ä¼Ál°Ál°Áº&]“®Éyƒ
6Ø`ƒ
6Ø`ƒÍÝi¬uy´ØXWòè±Éi¬²\t†ýz•—Š>•.î”z¾kÊß
t²¿7©ß7òwJõÏ”¶4Òw‘<77>ÒˆßÓÖÍ85‰
|
After Width: | Height: | Size: 260 B |
|
@ -0,0 +1,2 @@
|
|||
xЪнЬБ
|
||||
„ …бЦѕхЂ‹л.Я ЯDЯl¬,¦љMz‰я6›†Г‡ gcJЛD;ф'.®A’IqћЮ‰ДI,IrўYЁ»‘ЛFk%‰DюOжy|EDЄDЧы(LУ_YЌК>*Яљ?aКOѓїk±L_Ј<[c—с¶п>КcЛ<63>хuФLIдХ%В#Њ0В#Њ0В#ЊЮotСўљхµ}ЕЬ4Нfќv_)‰ВEўpъЏ¬h5R·Џ8Џ8і1В#Њ0В#Њ0ўУТiйґtZО#Њ0В#Њ0В#Њ0ўУТiйґtZО#Њ0В#Њ0В#Њ0ўУТiйґtZОlЊ0В#Њ0ВЈч9q"ўЙHЬњH™Qюќµп"ЫХL5}-ЭЬYЧѕУкёkм`¤в>¶zйёі®юЦ4&Тpчб!‘Љы!«щ`ї:5
|
After Width: | Height: | Size: 262 B |
|
@ -0,0 +1,14 @@
|
|||
xЪнЬAѓ …aЧЮє‰‹™ќЬ@n7+*L++Ужџ®ут‰МbbЬ*LCп‘°‡‰ck™HҐrљ”j•ІђJ5Yнi~0•_«тЊыЧTКTх}е—e©>эц5‘b_еwРНџ?ї¤Ямж§ЦЬщ†\эRaЖi+7хЯW©¦\гюwLUNеL¦В
|
||||
+¬°В
|
||||
+¬°ВкяjЯТO·џkcлЮсфз\Л©|%•o<б‹k–Lо+О+Оv¬°В
|
||||
+¬°В
|
||||
+¬°ВЉ>}ъф8Ї°В
|
||||
+¬°В
|
||||
+¬°В
|
||||
+ъфи3РgајВ
|
||||
+¬°В
|
||||
+¬°В
|
||||
+¬и3Рg П@џЃу
|
||||
+¬°В
|
||||
+¬°В
|
||||
+¬°:R‰ЁЄXіЪB‰9«”IФ=зkЮЏ±o/SwзШ<D0B7>™ЩЇП`g¶бЕКМИr_Щ™™YѕѓVSY™ЕzIefnmQoz
>б
|
After Width: | Height: | Size: 253 B |
After Width: | Height: | Size: 256 B |
After Width: | Height: | Size: 243 B |
After Width: | Height: | Size: 272 B |
After Width: | Height: | Size: 279 B |
|
@ -0,0 +1 @@
|
|||
xÚíÝAªƒ0ÐŽÝuÁA2«;Ð<>èÎkü(üg¾Ày•tp9Äï$Ëò™¹Dœ”ò¼\ºe^'tÒ-aIºŠFMšSškÂðIóŤÓ:7®¤|LúkŸNã8N7®œöi}ö‡×Ÿi,Ÿ[W†¿g®Ó´Ì°ë?3ô1÷i™¾N·}}=ÂOM:4“”)S¦L™2eÊ”)S¦L#$½ÿ
ôÂJãþÂJM:}ý]˜•ÖL›Ù§ÎSÿQL™2eÊ”)S¦L™2Õ¡èPt(:Šó”)S¦L™2eÊ”)S¦:ŠE‡¢Cqž2eÊ”)S¦L™2eÊ”©E‡¢CÑ¡8O™2eÊ”)S¦L™2eÊT‡¢CÑ¡èPœ§L™2eÊ”)S¦L™2Ý“¦”sJCIKÖÔ‚iÍ93<7F>ônº_Ñòÿ¾¿ü¼“+R‡û®£“ièû£Žû4ö<34>\Çg¿¥¤‘ïŽ;%
}ßaÞnŽ£
|
After Width: | Height: | Size: 279 B |
After Width: | Height: | Size: 264 B |
|
@ -0,0 +1 @@
|
|||
xÚí”Á
À E=»uÐ
pجQ•ØCOMŸ'ÃË<C383>$ ³@à¨Ø3e–F©\FNXRyÉؾC{‰a8RæŃa2@ñ圉qküßÉH1ê(£<>ˆÅ`cç¦j³~Ë0ö¥¿ÃܨÖËÃعnXÿGåÿ<>Ä€
|
After Width: | Height: | Size: 149 B |
|
@ -0,0 +1,2 @@
|
|||
xΪνέA<EFBFBD>ƒ@Π¬½υ€‹ξ<E280B9>ή@oΆ7“<>`“QfeΊδ•«PA><3E>¦ΐΪτ<?jjo5WNiz<06>›yΊWύ‰σ΄&]ί…C?“I<>rώWβρ^;ο8·—
|
||||
γύs<Γ°ϋφS{Ε9^gEί}>γ°<]ίΥΠλί³bZ«nγ¥^A›φQ}[χ9^<5E>]«yώμnajMά‡KΜ<4B>1cΖ<63>3fΜ<66>1γΈΖ{ίW5}η½{ΝΡ7lMί<4D>οή<CEBF>xάI<ΌαK½¨ΖαΞ±yl3fΜ<66>1cΖ<63>3fΜ<66>1γ«Ϋ»Ω»={·“Ξ±yl3fΜ<66>1cΖ<63>3fΜ<66>1γ«Ϋ»Ω»={·“Ξ±yl3fΜ<66>1cΖ<63>3fΜ<66>1γ«Ϋ»Ω»={·“Ξ±yl3fΜ<66>1cΖ<63>3fΜ<66>1γ«Ϋ»Ω»={·“Ξ±yl3fΜ<66>1cΖ<63>3fΜ<66>ρχη<>SΚ‘<CE9A>Σ’7¥HΖKήΌg\ηΎβuυίΟ_<CE9F><5F>r'4ά[ηή-Ζ]›…q<E280A6>ϋL·η8Ζ<38>±ΫY1q„»<E2809E>‹Δ!ξ—ήΤ/(%ϋ
|
After Width: | Height: | Size: 267 B |
|
@ -0,0 +1 @@
|
|||
xÚí”1À E<>½u 7ЛÀÍZµ‡|N†—üDB0@R$l,-™>VKZ[<ýØÚz—qÆŽ¨ØYJ&ƒi<C692>åš‚‹ZyË:Y'ë¯YµÁVÿ&—e•RÄ"§sj©Ýrþö+Ëé‰ù.·MÆŽ»–Ó9ÓòzµsŽ”É,
|
After Width: | Height: | Size: 150 B |
After Width: | Height: | Size: 151 B |
After Width: | Height: | Size: 189 B |
After Width: | Height: | Size: 204 B |