修复分类设置

This commit is contained in:
taoser 2022-09-23 11:03:10 +08:00
parent e37fc82280
commit 6d59293477
155 changed files with 1030 additions and 404 deletions

View File

@ -488,10 +488,10 @@ abstract class BaseController
return $upRes;
}
//获取artcile所有图片
//获取artcile内容所有图片,返回数组
protected function getArticleAllpic($str)
{
// <img src="http://img.com" />
//正则匹配<img src="http://img.com" />
$pattern = "/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>/";
preg_match_all($pattern,$str,$matchContent);
if(isset($matchContent[1])){
@ -505,7 +505,7 @@ abstract class BaseController
}
//下载图片
//下载远程图片
private function downloadImage($url)
{
$ch = curl_init();
@ -520,7 +520,7 @@ abstract class BaseController
}
//保存图片
//把图片保存到本地
private function saveAsImage($url, $file)
{
$filename = pathinfo($url, PATHINFO_BASENAME);
@ -561,19 +561,18 @@ abstract class BaseController
$images = $this->getArticleAllpic($content);
if(count($images)) {
foreach($images as $image){
//1.网络图片
//halt((stripos($image, Request::domain()) === false));
if((stripos($image,'http') !== false) && (stripos($image, Request::domain()) === false)) {
//2.下载远程图片
$newImageUrl = $this->downloadImage($image);
$content = str_replace($image,Request::domain().$newImageUrl,$content);
//1.带http地址的图片2.非本站的网络图片 3.非带有?号等参数的图片
if((stripos($image,'http') !== false) && (stripos($image, Request::domain()) === false) && (stripos($image, '?') === false)) {
// 如果图片中没有带参数或者加密可下载
//下载远程图片(可下载)
$newImageUrl = $this->downloadImage($image);
//替换图片链接
$content = str_replace($image,Request::domain().$newImageUrl,$content);
}
}
//不可下载的图片如加密或者带有参数的图片如type=jpeg,直接返回content
}
return $content;
}

View File

@ -3,4 +3,6 @@ Version.php
TimeLine.php
Plugins.php
App.php
AddonsMarket.php
ViewsMarket.php

View File

@ -5,7 +5,6 @@ use app\common\controller\AdminController;
use think\facade\View;
use think\facade\Db;
use think\facade\Request;
use think\facade\Cache;
use think\facade\Config;
use app\admin\model\Addons as AddonsModel;
use taoler\com\Files;
@ -75,8 +74,9 @@ class Addons extends AdminController
['field' => 'price','title'=> '价格(元)'],
['field' => 'status','title'=> '状态', 'width'=> 100],
['field' => 'install','title'=> '安装', 'width'=> 100],
['field' => 'vers','title'=> '版本选择','exportTemplet' => "function(d, obj){console.log(obj) var td = obj.td(this.field); return td.find('select').val();}"],
['field' => 'ctime','title'=> '时间', 'width'=> 150],
['title' => '操作', 'width'=> 150, 'align'=>'center', 'toolbar'=> '#addons-tool']
['title' => '操作', 'width'=> 300, 'align'=>'center', 'toolbar'=> '#addons-tool']
];
} else {
$res = ['code'=>-1,'msg'=>'未获取到服务器信息'];

View File

@ -164,6 +164,7 @@ class Forum extends AdminController
$msg = $addOrEdit ? lang('edit') : lang('add');
if(Request::isAjax()) {
$data = Request::param();
if(isset($data['id']) && $data['pid'] == $data['id']) return json(['code'=>-1,'msg'=> $msg.'不能作为自己的子类']);
$list = Db::name('cate')->cache('catename')->save($data);
if($list){

View File

@ -1,2 +1,3 @@
App.php
Version.php
Plugins.php

View File

@ -1,4 +1,7 @@
/key_auth
/time_line
/version
/plugins
/plugins
/addons_market
/views_market
/app

View File

@ -4,48 +4,54 @@
<div class="layui-fluid">
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
<div class="layui-form-item">
<div class="layui-inline">
插件分类
</div>
<div class="layui-inline">
<select name="id" lay-filter="LAY-user-adminrole-type">
<option value="">全部插件</option>
<option value="">支付</option>
<option value="">第三方登陆</option>
<form class="layui-form layui-card-header layuiadmin-card-header-auto">
<div class="layui-form-item">
<div class="layui-inline">
插件分类
</div>
<div class="layui-inline">
<select name="id" lay-filter="LAY-user-adminrole-type">
<option value="">全部插件</option>
<option value="">支付</option>
<option value="">第三方登陆</option>
</select>
</div>
</div>
<table id="addons-list" lay-filter="addons-list"></table>
<script type="text/html" id="toolbar">
<div class="layui-btn-group" style="padding-bottom: 10px;">
<button type="button" class="layui-btn layui-btn-sm" lay-event="onlineAddons">在线</button>
<button type="button" class="layui-btn layui-btn-sm" lay-event="installed">已安装</button>
<button type="button" class="layui-btn layui-btn-sm" lay-event="freeAddons">免费</button>
<button type="button" class="layui-btn layui-btn-sm" lay-event="payAddons">付费</button>
</div>
<div class="layui-btn-group" style="padding-bottom: 10px;">
<button class="layui-btn layui-btn-sm layuiadmin-btn-admin" data-type="add">离线安装</button>
</div>
</script>
<script type="text/html" id="addons-installed-tool">
{{# if(d.status == 1){ }}
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="shutdown"><i class="layui-icon layui-icon-pause"></i>禁用</a>
{{# } else { }}
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="start"><i class="layui-icon layui-icon-play"></i>启动</a>
{{# } }}
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="config"><i class="layui-icon layui-icon-set"></i>设置</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>卸载</a>
</script>
<script type="text/html" id="addons-tool">
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="install"><i class="layui-icon layui-icon-edit"></i>安装</a>
<select id="vers{{d.name}}" name="sss" class="layui-border" lay-ignore lay-filter="versSelect">
{{# d.vers.forEach(function(item, index){ }}
<option value="{{ item }}">{{ item }}</option>
{{# }); }}
</select>
</div>
</div>
</div>
<table id="addons-list" lay-filter="addons-list"></table>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="config"><i class="layui-icon layui-icon-set"></i>设置</a>
</script>
</form>
<script type="text/html" id="toolbar">
<div class="layui-btn-group" style="padding-bottom: 10px;">
<button type="button" class="layui-btn layui-btn-sm" lay-event="onlineAddons">在线</button>
<button type="button" class="layui-btn layui-btn-sm" lay-event="installed">已安装</button>
<button type="button" class="layui-btn layui-btn-sm" lay-event="freeAddons">免费</button>
<button type="button" class="layui-btn layui-btn-sm" lay-event="payAddons">付费</button>
</div>
<div class="layui-btn-group" style="padding-bottom: 10px;">
<button class="layui-btn layui-btn-sm layuiadmin-btn-admin" data-type="add">离线安装</button>
</div>
</script>
<script type="text/html" id="addons-installed-tool">
{{# if(d.status == 1){ }}
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="shutdown"><i class="layui-icon layui-icon-pause"></i>禁用</a>
{{# } else { }}
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="start"><i class="layui-icon layui-icon-play"></i>启动</a>
{{# } }}
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="config"><i class="layui-icon layui-icon-set"></i>设置</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>卸载</a>
</script>
<script type="text/html" id="addons-tool">
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="install"><i class="layui-icon layui-icon-edit"></i>安装</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="config"><i class="layui-icon layui-icon-set"></i>设置</a>
</script>
</div>
</div>
</div>
@ -72,7 +78,14 @@
,table = layui.table
,form = layui.form
,upload = layui.upload;
form.render('select'); // 渲染所在容器内的 select 元素
//监听版本选择
form.on('select(versSelect)', function(obj){
console.log(111)
layer.tips(this.value + ' ' + this.name + ''+ obj.elem.checked, obj.othis);
});
//事件
var active = {
add: function(){

View File

@ -113,7 +113,7 @@ overflow: visible;
treeTable.on('tool(Article-cate-list)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.confirm('确定删除此分类', function(index){
layer.confirm('是否删除此分类及分类下内容', function(index){
$.ajax({
type:'post',
url:forumTagsDelete,

View File

@ -20,7 +20,7 @@
{block name="css"}{/block}
<script src="/static/layui/layui.js"></script>
</head>
<body {if($Request.url == url('index/index'))}class="layui-layout-body"{/if}>
<body class="{if($Request.url == url('index/index'))} layui-layout-body {/if}">
{block name="body"}内容{/block}
<script type="text/javascript" charset="utf-8">
var AdminLogin = "{:url('Login/index')}",

View File

@ -30,7 +30,7 @@
</li>
</ul>
<ul class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
<li class="layui-nav-item" lay-unselect>
<li class="layui-nav-item layui-hide" lay-unselect>
<a lay-href="app/message/index.html" layadmin-event="message" lay-text="消息中心">
<i class="layui-icon layui-icon-notice"></i>

View File

@ -12,7 +12,7 @@
<div class="layui-side layui-side-menu">
<div class="layui-side-scroll">
<div class="layui-logo" lay-href="home/console.html">
<span>TaoLer_Admin</span>
<span>TaoLerAdmin</span>
</div>
<ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu" lay-filter="layadmin-system-side-menu">

View File

@ -281,4 +281,22 @@ function getOnepic($str)
}
return $img;
}
//判断蜘蛛函数
function find_spider(){
$useragent = strtolower(empty($useragent) ? $_SERVER['HTTP_USER_AGENT'] : '');
$spider_arr=array(
'bot',
'spider',
'slurp',
'ia_archiver',
);
foreach($spider_arr as $spider){
$spider = strtolower($spider);
if(strstr($useragent,$spider)){
return true;
}
}
return false;
}

View File

@ -28,7 +28,7 @@ class Article extends Model
//文章关联栏目表
public function cate()
{
return $this->belongsTo('Cate','cate_id','id');
return $this->belongsTo(Cate::class);
}
//文章关联评论

View File

@ -19,6 +19,12 @@ class Cate extends Model
use SoftDelete;
protected $deleteTime = 'delete_time';
protected $defaultSoftDelete = 0;
//关联文章
public function article()
{
return $this->hasMany(Article::class);
}
// 查询类别信息
public function getCateInfo(string $ename)
@ -30,15 +36,20 @@ class Cate extends Model
// 删除类别
public function del($id)
{
$cates = $this->find($id);
$res = $cates->delete();
if($res){
return 1;
}else{
return '删除分类失败';
$cates = $this::field('id,pid')->with('article')->find($id);
$sonCate = $this::field('id,pid')->where('pid',$cates['id'])->find();
if(empty($sonCate)) {
$res = $cates->together(['article'])->delete();
if($res){
return 1;
}else{
return '删除分类失败';
}
} else {
return '存在子分类,无法删除';
}
}

View File

@ -265,7 +265,7 @@ class Article extends BaseController
// 处理内容
$data['content'] = $this->downUrlPicsReaplace($data['content']);
// 把,转换为,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
// 把中文,转换为英文,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
$data['keywords'] = implode(',',array_filter(explode(',',trim(str_replace('',',',$data['keywords'])))));
// 获取分类ename
@ -275,6 +275,7 @@ class Article extends BaseController
$result = $article->add($data);
if ($result['code'] == 1) {
// 获取到的最新ID
$aid = $result['data']['id'];
//写入taglist表
$tagArr = [];
@ -285,8 +286,6 @@ class Article extends BaseController
}
}
Db::name('taglist')->insertAll($tagArr);
// 获取到的最新ID
//$aid = Db::name('article')->max('id');
// 清除文章tag缓存
Cache::tag('tagArtDetail')->clear();

View File

@ -273,30 +273,31 @@ INSERT INTO `tao_auth_rule` VALUES ('112', 'Tag/index', 'Tag设置', '', '1', '1
-- Table structure for tao_cate
-- ----------------------------
DROP TABLE IF EXISTS `tao_cate`;
CREATE TABLE `tao_cate` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`catename` varchar(20) NOT NULL COMMENT '导航名称',
`ename` varchar(20) NOT NULL DEFAULT '' COMMENT '分类别名',
`detpl` varchar(20) NOT NULL COMMENT '详情模板',
`icon` varchar(50) DEFAULT NULL COMMENT '图标',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`status` enum('0','1') NOT NULL DEFAULT '1' COMMENT '状态1启用0禁用',
`type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0帖子1文章',
`desc` varchar(255) NOT NULL,
`is_hot` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否是热点',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`updata_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`delete_time` int(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
PRIMARY KEY (`id`),
KEY `ename` (`ename`) COMMENT '英文名称索引'
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='分类表';
CREATE TABLE `tao_cate` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
`pid` smallint NOT NULL DEFAULT 0 COMMENT '上级id',
`catename` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '导航名称',
`ename` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '分类别名',
`detpl` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '详情模板',
`icon` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`status` enum('0','1') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '状态1启用0禁用',
`type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0帖子1文章',
`desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`is_hot` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否是热点',
`create_time` int NOT NULL DEFAULT 0 COMMENT '创建时间',
`updata_time` int NOT NULL DEFAULT 0 COMMENT '更新时间',
`delete_time` int NOT NULL DEFAULT 0 COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `ename`(`ename`) USING BTREE COMMENT '英文名称索引'
) ENGINE = MyISAM AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '分类表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tao_cate
-- ----------------------------
INSERT INTO `tao_cate` VALUES ('1', '提问', 'ask', 'ask', 'layui-icon-help', '1', '1', '0', 'TaoLer社区提问专栏1', '0', '0', '0', '0');
INSERT INTO `tao_cate` VALUES ('2', '分享', 'share', 'posts', 'layui-icon-share', '2', '1', '0', '', '0', '0', '0', '0');
INSERT INTO `tao_cate` VALUES ('3', '讨论', 'talk', 'posts', 'layui-icon-dialogue', '3', '1', '0', '', '1', '0', '0', '0');
INSERT INTO `tao_cate` VALUES (1, 0, '提问', 'ask', 'ask', 'layui-icon-help', 1, '1', 0, 'TaoLer社区提问专栏1', 0, 0, 0, 0);
INSERT INTO `tao_cate` VALUES (2, 0, '分享', 'share', 'posts', 'layui-icon-share', 2, '1', 0, '', 0, 0, 0, 0);
INSERT INTO `tao_cate` VALUES (3, 0, '讨论', 'talk', 'posts', 'layui-icon-dialogue', 3, '1', 0, '', 1, 0, 0, 0);
-- ----------------------------
-- Table structure for tao_collection

75
composer.lock generated
View File

@ -109,16 +109,16 @@
},
{
"name": "endroid/qr-code",
"version": "4.4.9",
"version": "4.5.0",
"source": {
"type": "git",
"url": "https://github.com/endroid/qr-code.git",
"reference": "bf087fa1e93a1b7310e2d94d187e26ae51db199d"
"reference": "36681470bd10352b53bcb9731bdf2270e0d79b22"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/endroid/qr-code/zipball/bf087fa1e93a1b7310e2d94d187e26ae51db199d",
"reference": "bf087fa1e93a1b7310e2d94d187e26ae51db199d",
"url": "https://api.github.com/repos/endroid/qr-code/zipball/36681470bd10352b53bcb9731bdf2270e0d79b22",
"reference": "36681470bd10352b53bcb9731bdf2270e0d79b22",
"shasum": ""
},
"require": {
@ -169,7 +169,7 @@
],
"support": {
"issues": "https://github.com/endroid/qr-code/issues",
"source": "https://github.com/endroid/qr-code/tree/4.4.9"
"source": "https://github.com/endroid/qr-code/tree/4.5.0"
},
"funding": [
{
@ -177,7 +177,7 @@
"type": "github"
}
],
"time": "2022-05-10T07:25:08+00:00"
"time": "2022-08-21T09:22:43+00:00"
},
{
"name": "firebase/php-jwt",
@ -323,16 +323,16 @@
},
{
"name": "guzzlehttp/promises",
"version": "1.5.1",
"version": "1.5.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
"reference": "b94b2807d85443f9719887892882d0329d1e2598"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598",
"reference": "b94b2807d85443f9719887892882d0329d1e2598",
"shasum": ""
},
"require": {
@ -387,7 +387,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/1.5.1"
"source": "https://github.com/guzzle/promises/tree/1.5.2"
},
"funding": [
{
@ -403,7 +403,7 @@
"type": "tidelift"
}
],
"time": "2021-10-22T20:56:57+00:00"
"time": "2022-08-28T14:55:35+00:00"
},
{
"name": "guzzlehttp/psr7",
@ -517,25 +517,26 @@
},
{
"name": "laravel/serializable-closure",
"version": "v1.2.0",
"version": "v1.2.2",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
"reference": "09f0e9fb61829f628205b7c94906c28740ff9540"
"reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/09f0e9fb61829f628205b7c94906c28740ff9540",
"reference": "09f0e9fb61829f628205b7c94906c28740ff9540",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae",
"reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae",
"shasum": ""
},
"require": {
"php": "^7.3|^8.0"
},
"require-dev": {
"pestphp/pest": "^1.18",
"phpstan/phpstan": "^0.12.98",
"symfony/var-dumper": "^5.3"
"nesbot/carbon": "^2.61",
"pestphp/pest": "^1.21.3",
"phpstan/phpstan": "^1.8.2",
"symfony/var-dumper": "^5.4.11"
},
"type": "library",
"extra": {
@ -572,7 +573,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
"time": "2022-05-16T17:09:47+00:00"
"time": "2022-09-08T13:45:54+00:00"
},
{
"name": "league/flysystem",
@ -1069,16 +1070,16 @@
},
{
"name": "phpmailer/phpmailer",
"version": "v6.6.3",
"version": "v6.6.4",
"source": {
"type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "9400f305a898f194caff5521f64e5dfa926626f3"
"reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/9400f305a898f194caff5521f64e5dfa926626f3",
"reference": "9400f305a898f194caff5521f64e5dfa926626f3",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a94fdebaea6bd17f51be0c2373ab80d3d681269b",
"reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b",
"shasum": ""
},
"require": {
@ -1135,7 +1136,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.3"
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.4"
},
"funding": [
{
@ -1143,7 +1144,7 @@
"type": "github"
}
],
"time": "2022-06-20T09:21:02+00:00"
"time": "2022-08-22T09:22:00+00:00"
},
{
"name": "psr/cache",
@ -2270,20 +2271,20 @@
},
{
"name": "workerman/workerman",
"version": "v4.0.42",
"version": "v4.1.0",
"source": {
"type": "git",
"url": "https://github.com/walkor/workerman.git",
"reference": "83f09b50eaf7412504604030daa9e1f9c767e6c3"
"reference": "88ddf517e5c35bee072b2e453c4fcca0c6f1e59a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/walkor/workerman/zipball/83f09b50eaf7412504604030daa9e1f9c767e6c3",
"reference": "83f09b50eaf7412504604030daa9e1f9c767e6c3",
"url": "https://api.github.com/repos/walkor/workerman/zipball/88ddf517e5c35bee072b2e453c4fcca0c6f1e59a",
"reference": "88ddf517e5c35bee072b2e453c4fcca0c6f1e59a",
"shasum": ""
},
"require": {
"php": ">=5.4"
"php": ">=7.0"
},
"suggest": {
"ext-event": "For better performance. "
@ -2329,20 +2330,20 @@
"type": "patreon"
}
],
"time": "2022-07-29T09:06:29+00:00"
"time": "2022-08-20T10:16:22+00:00"
},
{
"name": "yansongda/pay",
"version": "v3.1.10",
"version": "v3.1.12",
"source": {
"type": "git",
"url": "https://github.com/yansongda/pay.git",
"reference": "e02069503b608f2cb8fcb75011cdd0810bbfe88a"
"reference": "7ff004f05f9d6e288ff9b4deef585d30395f37f2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/yansongda/pay/zipball/e02069503b608f2cb8fcb75011cdd0810bbfe88a",
"reference": "e02069503b608f2cb8fcb75011cdd0810bbfe88a",
"url": "https://api.github.com/repos/yansongda/pay/zipball/7ff004f05f9d6e288ff9b4deef585d30395f37f2",
"reference": "7ff004f05f9d6e288ff9b4deef585d30395f37f2",
"shasum": ""
},
"require": {
@ -2406,7 +2407,7 @@
"issues": "https://github.com/yansongda/pay/issues",
"source": "https://github.com/yansongda/pay"
},
"time": "2022-08-09T13:49:29+00:00"
"time": "2022-09-03T05:39:21+00:00"
},
{
"name": "yansongda/supports",

2
public/.gitignore vendored
View File

@ -1,3 +1,5 @@
install.lock
/home
/addons
/sys
*.xml

View File

@ -44,6 +44,8 @@ layui.define(["table", "form", "upload"], function (exports) {
}
});
//监听工具条
table.on("tool(addons-list)", function (obj) {
var data = obj.data;
@ -168,6 +170,7 @@ layui.define(["table", "form", "upload"], function (exports) {
},
});
} else if (obj.event === "install") {
var index = layer.load(1);
//安装插件
$.post(

View File

@ -134,7 +134,13 @@ i{font-style: normal;}
/* 辅助 */
a:hover{color: #009688; transition: all .3s;}
pre{position: relative; margin: 10px 0; padding: 15px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}
/*pre{position: relative; margin: 10px 0; padding: 15px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}*/
pre{overflow-y: auto;
background-color: #fdfbfb;
border: 0;
border-radius: 2px;
padding: 1.25rem;
margin: 1.5rem 0;}
.layui-container{padding: 0;}
.fly-main{width: 1079px; min-height: 600px; margin: 0 auto 15px;}
@ -225,9 +231,6 @@ pre{position: relative; margin: 10px 0; padding: 15px; line-height: 20px; border
/* 底部 */
.fly-footer {margin: 50px 0 0; padding: 20px 0 30px; line-height: 30px; text-align: center; color: #737573; border-top: 1px solid #e2e2e2;}
.fly-footer a{padding:0 6px; font-weight: 300;color: rgb(230, 227, 227);}
.fly-footer a:hover{color: #fff;}
.fly-union{margin-top: 10px; color: #999;}
.fly-union>*{display: inline-block; vertical-align: middle;}
.fly-union a[upyun] img{width: 80px;}
@ -483,7 +486,8 @@ body .layui-edit-face .layui-layer-content{padding:0; background-color:#fff; co
.detail-hits .layui-btn+.layui-btn{margin-left: 5px;}
.detail-hits .jie-admin{margin-right: 1px;}
.detail-body{margin: 10px 0 0; min-height: 50px; line-height: 26px; font-size: 16px; color: #333; word-wrap: break-word;}
.detail-body p{margin-bottom:15px;}
.detail-body p{margin-bottom: .6rem;font-size: .9375rem;line-height: 1.875;color: var(--color-secondary);word-wrap: break-word;}
.detail-body img{max-width: 100%; cursor: pointer;}
/*
.detail-body table{margin: 10px 0 15px;}
@ -529,12 +533,12 @@ body .layui-edit-face .layui-layer-content{padding:0; background-color:#fff; co
/* 详情页的底部操作条 */
.site-tree-mobile-detail-bottom{display: block!important; position: fixed; z-index: 1000; bottom: 0px; left: 0px; width: 100%; height: 30px; line-height: 30px; border-radius: 2px; text-align: center; color: #e2e2e2;background:#eeeeee}
.site-home .site-tree-mobile-detail-bottom{display: none!important;}
.site-mobile .site-tree-mobile-detail-bottom{display: none !important;}
.site-mobile .site-menu{left: 0;}
.site-mobile .site-tree-mobile-detail-bottom{content: ''; position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0,0,0,.8); z-index: 999;}
.site-tree-mobile-detail-bottom i{font-size: 30px;}
.site-tree-mobile-detail-bottom{display: block!important; position: fixed; z-index: 1000; bottom: 0px; left: 0px; width: 100%; height: 30px; line-height: 30px; border-radius: 2px; text-align: center; color: #e2e2e2;background:#eeeeee}
.site-home .site-tree-mobile-detail-bottom{display: none!important;}
.site-mobile .site-tree-mobile-detail-bottom{display: none !important;}
.site-mobile .site-menu{left: 0;}
.site-mobile .site-tree-mobile-detail-bottom{content: ''; position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0,0,0,.8); z-index: 999;}
.site-tree-mobile-detail-bottom i{font-size: 30px;}
/*标题颜色展示方式*/
.layui-colorpicker.layui-colorpicker-xs {width: 30px;height: 20px;line-height: 16px;border: 0px solid #e6e6e6;padding: 0;vertical-align: top;border-radius: 0;}
@ -724,9 +728,6 @@ body .fly-user-main{position: relative; min-height: 600px;}
.fly-column-right{right: 10px;}
.fly-column ul li.layui-this:after{display: none;}
/* 页脚 */
.fly-footer{margin-top: 0; border-top: none;}
/* 分页 */
.laypage-main a, .laypage-main span{display: none;}
.laypage-main .laypage-prev,
@ -758,4 +759,127 @@ body .fly-user-main{position: relative; min-height: 600px;}
}
/*前台公用样式*/
table {
border-collapse: collapse;
margin: 0 0 1rem;
word-break: normal;
}
th, td {
border: 1px solid #f2f2f5;
padding: 8px 12px;
}
p {
color: #393e46;
margin: 0;
white-space: normal;
word-break: break-all;
-webkit-user-select: none;
}
code[class*="language-"], pre[class*="language-"] {
color: #000;
text-shadow: 0 1px #ffffff00;
font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;
direction: ltr;
/* text-align: left; */
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
blockquote {
position: relative;
margin: 2rem 0;
padding: 0 0 0 1.75rem;
border-left: 5px solid #f2f2f5;
}
/*页脚*/
.footer {margin-top:10px;padding:50px 0;color:rgba(255,255,255,.7);background:#2d3236}
@media (max-width:991px) {.footer {padding:25px 10px;text-align:center}
}
@media (max-width:767px) {.footer {padding:20px 0}
}
.footer a:hover {color:rgba(255,255,255,.9);text-decoration:none}
.footer .copyright {font-size:14px;}
@media (max-width:767px) {.footer .copyright {font-size:12px}
}
.footer .copyright p {margin:0 0 5px;color: rgba(250, 250, 250, 0.7);}
.footer .footer-nav li a,.footer .copyright a{color:#fff}
.footer .footer-nav li a:hover,.footer .copyright a:hover{color:#0055ff}
.footer .footer-nav,.footer .menu ul,.footer ul.menu {padding:0;margin:0 0 12px;font-size:14px;list-style:none}
.footer .footer-nav li,.footer .menu ul li,.footer ul.menu li {display:inline-block;margin-right:10px;line-height:18px}
.footer .footer-nav li:after,.footer .menu ul li:after,.footer ul.menu li:after {display:inline-block;font-size:12px;line-height:18px;opacity:.8;content:"|";vertical-align:top}
.footer .footer-nav li:last-child:after,.footer .menu ul li:last-child:after,.footer ul.menu li:last-child:after {display:none}
.footer .footer-nav a,.footer .menu ul a,.footer ul.menu a {display:inline-block;padding-right:10px;vertical-align:top}
.footer-col {display:inline-block;font-size:0;vertical-align:middle;margin-right:32px}
@media (max-width:767px) {.footer-col {margin-right:0}
}
@media (max-width:1239px) {
.footer-col-logo {display:none}
}
.footer-col-logo img {display:block;max-width:160px;max-height:60px;height:auto}
.footer-col-sns {float:right;margin-right:0}
@media (max-width:991px) {.footer-col-sns {display:none}
}
.footer-sns {display:inline-block;margin-top:3px;font-size:0}
.footer-sns a {display:inline-block;margin:7px 0 7px 20px;vertical-align:top}
.footer-sns .sns-icon {display:inline-block;position:relative;width:40px;height:40px;font-size:20px;line-height:40px;border-radius:50%;text-align:center;background:rgba(255,255,255,.1);color:rgba(255,255,255,.8);z-index:0}
.footer-sns .sns-icon svg,.footer-sns .sns-icon:before {position:relative;z-index:1}
.footer-sns .sns-icon:after {position:absolute;left:0;top:0;width:100%;height:100%;background:var(--theme-hover);border-radius:50%;content:"";opacity:0;filter:alpha(opacify=0);-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}
.footer-sns .sns-icon.material-icons:after {z-index:-1}
.footer-sns .sns-icon:hover {color:#fff}
.footer-sns .sns-icon:hover:after {-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1;filter:alpha(opacify=100);-webkit-transition:all .5s cubic-bezier(.3,0,0,1.3) 0s;-o-transition:all .5s cubic-bezier(.3,0,0,1.3) 0s;transition:all .5s cubic-bezier(.3,0,0,1.3) 0s}
.sns-wx {position:relative;overflow:hidden}
.sns-wx span,.sns-wx:hover span {-webkit-transition:all .2s ease-out .1s;-o-transition:all .2s ease-out .1s;transition:all .2s ease-out .1s}
.sns-wx span {position:absolute;z-index:1;top:-170px;left:0;margin-left:-57px;width:150px;height:150px;background-color:#fff;background-size:95% auto;background-position:50%;background-repeat:no-repeat;-webkit-box-shadow:0 0 5px 1px rgba(0,0,0,.3);box-shadow:0 0 5px 1px rgba(0,0,0,.3);opacity:0;filter:alpha(opacify=0)}
.sns-wx span:after {position:absolute;bottom:-16px;left:50%;width:0;height:0;margin-left:-8px;line-height:0;border:8px solid transparent;border-top-color:#fff;content:""}
.sns-wx:hover {overflow:visible}
.sns-wx:hover span {top:-165px;opacity:1;filter:alpha(opacify=100)}
.container {
margin-right: auto;
margin-left: auto;
padding-left: 15px;
padding-right: 15px;
}
@media (min-width: 768px) {
.container {
width:750px;
}
}
@media (min-width: 992px) {
.container {
width:970px;
}
}
@media (min-width: 1200px) {
.container {
width:1170px;
}
}
.container-fluid {
margin-right: auto;
margin-left: auto;
padding-left: 15px;
padding-right: 15px;
}
/* 右下角固定栏*/
.layui-fixbar li {
border-radius:100%;
}

View File

@ -903,7 +903,7 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util', 'imgcom'],
var stop = $(window).scrollTop();
if($(window).width() <= 992) return;
var bottom = $('.fly-footer').offset().top - $(window).height();
var bottom = $('.footer').offset().top - $(window).height();
if(stop > 60){ //211
if(!main.hasClass('site-fix')){

View File

@ -109,17 +109,17 @@
},
{
"name": "endroid/qr-code",
"version": "4.4.9",
"version_normalized": "4.4.9.0",
"version": "4.5.0",
"version_normalized": "4.5.0.0",
"source": {
"type": "git",
"url": "https://github.com/endroid/qr-code.git",
"reference": "bf087fa1e93a1b7310e2d94d187e26ae51db199d"
"reference": "36681470bd10352b53bcb9731bdf2270e0d79b22"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/endroid/qr-code/zipball/bf087fa1e93a1b7310e2d94d187e26ae51db199d",
"reference": "bf087fa1e93a1b7310e2d94d187e26ae51db199d",
"url": "https://api.github.com/repos/endroid/qr-code/zipball/36681470bd10352b53bcb9731bdf2270e0d79b22",
"reference": "36681470bd10352b53bcb9731bdf2270e0d79b22",
"shasum": ""
},
"require": {
@ -138,7 +138,7 @@
"roave/security-advisories": "Makes sure package versions with known security issues are not installed",
"setasign/fpdf": "Enables you to use the PDF writer"
},
"time": "2022-05-10T07:25:08+00:00",
"time": "2022-08-21T09:22:43+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -172,7 +172,7 @@
],
"support": {
"issues": "https://github.com/endroid/qr-code/issues",
"source": "https://github.com/endroid/qr-code/tree/4.4.9"
"source": "https://github.com/endroid/qr-code/tree/4.5.0"
},
"funding": [
{
@ -338,17 +338,17 @@
},
{
"name": "guzzlehttp/promises",
"version": "1.5.1",
"version_normalized": "1.5.1.0",
"version": "1.5.2",
"version_normalized": "1.5.2.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
"reference": "b94b2807d85443f9719887892882d0329d1e2598"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598",
"reference": "b94b2807d85443f9719887892882d0329d1e2598",
"shasum": ""
},
"require": {
@ -357,7 +357,7 @@
"require-dev": {
"symfony/phpunit-bridge": "^4.4 || ^5.1"
},
"time": "2021-10-22T20:56:57+00:00",
"time": "2022-08-28T14:55:35+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -405,7 +405,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/1.5.1"
"source": "https://github.com/guzzle/promises/tree/1.5.2"
},
"funding": [
{
@ -538,28 +538,29 @@
},
{
"name": "laravel/serializable-closure",
"version": "v1.2.0",
"version_normalized": "1.2.0.0",
"version": "v1.2.2",
"version_normalized": "1.2.2.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
"reference": "09f0e9fb61829f628205b7c94906c28740ff9540"
"reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/09f0e9fb61829f628205b7c94906c28740ff9540",
"reference": "09f0e9fb61829f628205b7c94906c28740ff9540",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae",
"reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae",
"shasum": ""
},
"require": {
"php": "^7.3|^8.0"
},
"require-dev": {
"pestphp/pest": "^1.18",
"phpstan/phpstan": "^0.12.98",
"symfony/var-dumper": "^5.3"
"nesbot/carbon": "^2.61",
"pestphp/pest": "^1.21.3",
"phpstan/phpstan": "^1.8.2",
"symfony/var-dumper": "^5.4.11"
},
"time": "2022-05-16T17:09:47+00:00",
"time": "2022-09-08T13:45:54+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -1131,17 +1132,17 @@
},
{
"name": "phpmailer/phpmailer",
"version": "v6.6.3",
"version_normalized": "6.6.3.0",
"version": "v6.6.4",
"version_normalized": "6.6.4.0",
"source": {
"type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "9400f305a898f194caff5521f64e5dfa926626f3"
"reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/9400f305a898f194caff5521f64e5dfa926626f3",
"reference": "9400f305a898f194caff5521f64e5dfa926626f3",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a94fdebaea6bd17f51be0c2373ab80d3d681269b",
"reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b",
"shasum": ""
},
"require": {
@ -1168,7 +1169,7 @@
"stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
"symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)"
},
"time": "2022-06-20T09:21:02+00:00",
"time": "2022-08-22T09:22:00+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -1200,7 +1201,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.3"
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.4"
},
"funding": [
{
@ -2863,26 +2864,26 @@
},
{
"name": "workerman/workerman",
"version": "v4.0.42",
"version_normalized": "4.0.42.0",
"version": "v4.1.0",
"version_normalized": "4.1.0.0",
"source": {
"type": "git",
"url": "https://github.com/walkor/workerman.git",
"reference": "83f09b50eaf7412504604030daa9e1f9c767e6c3"
"reference": "88ddf517e5c35bee072b2e453c4fcca0c6f1e59a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/walkor/workerman/zipball/83f09b50eaf7412504604030daa9e1f9c767e6c3",
"reference": "83f09b50eaf7412504604030daa9e1f9c767e6c3",
"url": "https://api.github.com/repos/walkor/workerman/zipball/88ddf517e5c35bee072b2e453c4fcca0c6f1e59a",
"reference": "88ddf517e5c35bee072b2e453c4fcca0c6f1e59a",
"shasum": ""
},
"require": {
"php": ">=5.4"
"php": ">=7.0"
},
"suggest": {
"ext-event": "For better performance. "
},
"time": "2022-07-29T09:06:29+00:00",
"time": "2022-08-20T10:16:22+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -2929,17 +2930,17 @@
},
{
"name": "yansongda/pay",
"version": "v3.1.10",
"version_normalized": "3.1.10.0",
"version": "v3.1.12",
"version_normalized": "3.1.12.0",
"source": {
"type": "git",
"url": "https://github.com/yansongda/pay.git",
"reference": "e02069503b608f2cb8fcb75011cdd0810bbfe88a"
"reference": "7ff004f05f9d6e288ff9b4deef585d30395f37f2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/yansongda/pay/zipball/e02069503b608f2cb8fcb75011cdd0810bbfe88a",
"reference": "e02069503b608f2cb8fcb75011cdd0810bbfe88a",
"url": "https://api.github.com/repos/yansongda/pay/zipball/7ff004f05f9d6e288ff9b4deef585d30395f37f2",
"reference": "7ff004f05f9d6e288ff9b4deef585d30395f37f2",
"shasum": ""
},
"require": {
@ -2973,7 +2974,7 @@
"illuminate/container": "Laravel 框架下使用 SDK请安装",
"php-di/php-di": "其它/无框架下使用 SDK请安装"
},
"time": "2022-08-09T13:49:29+00:00",
"time": "2022-09-03T05:39:21+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {

View File

@ -3,7 +3,7 @@
'name' => 'taoser/taoler',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b7290931244a7ca51d61cdc44ac0e774d54a44d9',
'reference' => '2f7a73366c80586c404f620fc440626d4c033930',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@ -29,9 +29,9 @@
'dev_requirement' => false,
),
'endroid/qr-code' => array(
'pretty_version' => '4.4.9',
'version' => '4.4.9.0',
'reference' => 'bf087fa1e93a1b7310e2d94d187e26ae51db199d',
'pretty_version' => '4.5.0',
'version' => '4.5.0.0',
'reference' => '36681470bd10352b53bcb9731bdf2270e0d79b22',
'type' => 'library',
'install_path' => __DIR__ . '/../endroid/qr-code',
'aliases' => array(),
@ -56,9 +56,9 @@
'dev_requirement' => false,
),
'guzzlehttp/promises' => array(
'pretty_version' => '1.5.1',
'version' => '1.5.1.0',
'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
'pretty_version' => '1.5.2',
'version' => '1.5.2.0',
'reference' => 'b94b2807d85443f9719887892882d0329d1e2598',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/promises',
'aliases' => array(),
@ -74,9 +74,9 @@
'dev_requirement' => false,
),
'laravel/serializable-closure' => array(
'pretty_version' => 'v1.2.0',
'version' => '1.2.0.0',
'reference' => '09f0e9fb61829f628205b7c94906c28740ff9540',
'pretty_version' => 'v1.2.2',
'version' => '1.2.2.0',
'reference' => '47afb7fae28ed29057fdca37e16a84f90cc62fae',
'type' => 'library',
'install_path' => __DIR__ . '/../laravel/serializable-closure',
'aliases' => array(),
@ -155,9 +155,9 @@
'dev_requirement' => false,
),
'phpmailer/phpmailer' => array(
'pretty_version' => 'v6.6.3',
'version' => '6.6.3.0',
'reference' => '9400f305a898f194caff5521f64e5dfa926626f3',
'pretty_version' => 'v6.6.4',
'version' => '6.6.4.0',
'reference' => 'a94fdebaea6bd17f51be0c2373ab80d3d681269b',
'type' => 'library',
'install_path' => __DIR__ . '/../phpmailer/phpmailer',
'aliases' => array(),
@ -292,7 +292,7 @@
'taoser/taoler' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b7290931244a7ca51d61cdc44ac0e774d54a44d9',
'reference' => '2f7a73366c80586c404f620fc440626d4c033930',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@ -443,18 +443,18 @@
'dev_requirement' => false,
),
'workerman/workerman' => array(
'pretty_version' => 'v4.0.42',
'version' => '4.0.42.0',
'reference' => '83f09b50eaf7412504604030daa9e1f9c767e6c3',
'pretty_version' => 'v4.1.0',
'version' => '4.1.0.0',
'reference' => '88ddf517e5c35bee072b2e453c4fcca0c6f1e59a',
'type' => 'library',
'install_path' => __DIR__ . '/../workerman/workerman',
'aliases' => array(),
'dev_requirement' => false,
),
'yansongda/pay' => array(
'pretty_version' => 'v3.1.10',
'version' => '3.1.10.0',
'reference' => 'e02069503b608f2cb8fcb75011cdd0810bbfe88a',
'pretty_version' => 'v3.1.12',
'version' => '3.1.12.0',
'reference' => '7ff004f05f9d6e288ff9b4deef585d30395f37f2',
'type' => 'library',
'install_path' => __DIR__ . '/../yansongda/pay',
'aliases' => array(),

View File

@ -1,4 +1,4 @@
Copyright 2020 (c) Jeroen van den Enden
Copyright 2022 (c) Jeroen van den Enden
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -14,6 +14,10 @@ for validating generated QR codes. Further extended with Twig extensions, genera
Symfony bundle for easy installation and configuration. Different writers are provided to generate the QR code
as PNG, SVG, EPS or in binary format.
## Sponsored by
[![Blackfire.io](assets/blackfire.png)](https://www.blackfire.io)
## Installation
Use [Composer](https://getcomposer.org/) to install the library. Also make sure you have enabled and configured the

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -29,10 +29,10 @@ final class Label implements LabelInterface
ColorInterface $textColor = null
) {
$this->text = $text;
$this->font = isset($font) ? $font : new Font(__DIR__.'/../../assets/noto_sans.otf', 16);
$this->alignment = isset($alignment) ? $alignment : new LabelAlignmentCenter();
$this->margin = isset($margin) ? $margin : new Margin(0, 10, 10, 10);
$this->textColor = isset($textColor) ? $textColor : new Color(0, 0, 0);
$this->font = $font ?? new Font(__DIR__.'/../../assets/noto_sans.otf', 16);
$this->alignment = $alignment ?? new LabelAlignmentCenter();
$this->margin = $margin ?? new Margin(0, 10, 10, 10);
$this->textColor = $textColor ?? new Color(0, 0, 0);
}
public static function create(string $text): self

View File

@ -0,0 +1,29 @@
<?php
declare(strict_types=1);
namespace Endroid\QrCode\Writer;
use Endroid\QrCode\Bacon\MatrixFactory;
use Endroid\QrCode\Label\LabelInterface;
use Endroid\QrCode\Logo\LogoInterface;
use Endroid\QrCode\QrCodeInterface;
use Endroid\QrCode\Writer\Result\ConsoleResult;
use Endroid\QrCode\Writer\Result\ResultInterface;
/**
* Writer of QR Code for CLI.
*/
class ConsoleWriter implements WriterInterface
{
/**
* {@inheritDoc}
*/
public function write(QrCodeInterface $qrCode, LogoInterface $logo = null, LabelInterface $label = null, $options = []): ResultInterface
{
$matrixFactory = new MatrixFactory();
$matrix = $matrixFactory->create($qrCode);
return new ConsoleResult($matrix, $qrCode->getForegroundColor(), $qrCode->getBackgroundColor());
}
}

View File

@ -0,0 +1,73 @@
<?php
declare(strict_types=1);
namespace Endroid\QrCode\Writer\Result;
use Endroid\QrCode\Color\ColorInterface;
use Endroid\QrCode\Matrix\MatrixInterface;
/**
* Implementation of ResultInterface for printing a QR-Code on command line interface.
*/
class ConsoleResult extends AbstractResult
{
protected MatrixInterface $matrix;
protected string $colorEscapeCode;
public const twoblocks = [
0 => ' ',
1 => "\xe2\x96\x80",
2 => "\xe2\x96\x84",
3 => "\xe2\x96\x88",
];
/**
* Ctor.
*/
public function __construct(MatrixInterface $matrix, ColorInterface $foreground, ColorInterface $background)
{
$this->matrix = $matrix;
$this->colorEscapeCode = sprintf(
"\e[38;2;%d;%d;%dm\e[48;2;%d;%d;%dm",
$foreground->getRed(),
$foreground->getGreen(),
$foreground->getBlue(),
$background->getRed(),
$background->getGreen(),
$background->getBlue()
);
}
public function getMimeType(): string
{
return 'text/plain';
}
public function getString(): string
{
$side = $this->matrix->getBlockCount();
$marginLeft = $this->colorEscapeCode.self::twoblocks[0].self::twoblocks[0];
$marginRight = self::twoblocks[0].self::twoblocks[0]."\e[0m".PHP_EOL;
$marginVertical = $marginLeft.str_repeat(self::twoblocks[0], $side).$marginRight;
ob_start();
echo $marginVertical; // margin-top
for ($rowIndex = 0; $rowIndex < $side; $rowIndex += 2) {
echo $marginLeft; // margin-left
for ($columnIndex = 0; $columnIndex < $side; ++$columnIndex) {
$combined = $this->matrix->getBlockValue($rowIndex, $columnIndex);
if (($rowIndex + 1) < $side) {
$combined |= $this->matrix->getBlockValue($rowIndex + 1, $columnIndex) << 1;
}
echo self::twoblocks[$combined];
}
echo $marginRight; // margin-right
}
echo $marginVertical; // margin-bottom
return (string) ob_get_clean();
}
}

View File

@ -17,6 +17,7 @@ final class SvgWriter implements WriterInterface
public const DECIMAL_PRECISION = 10;
public const WRITER_OPTION_BLOCK_ID = 'block_id';
public const WRITER_OPTION_EXCLUDE_XML_DECLARATION = 'exclude_xml_declaration';
public const WRITER_OPTION_EXCLUDE_SVG_WIDTH_AND_HEIGHT = 'exclude_svg_width_and_height';
public const WRITER_OPTION_FORCE_XLINK_HREF = 'force_xlink_href';
public function write(QrCodeInterface $qrCode, LogoInterface $logo = null, LabelInterface $label = null, array $options = []): ResultInterface
@ -29,13 +30,19 @@ final class SvgWriter implements WriterInterface
$options[self::WRITER_OPTION_EXCLUDE_XML_DECLARATION] = false;
}
if (!isset($options[self::WRITER_OPTION_EXCLUDE_SVG_WIDTH_AND_HEIGHT])) {
$options[self::WRITER_OPTION_EXCLUDE_SVG_WIDTH_AND_HEIGHT] = false;
}
$matrixFactory = new MatrixFactory();
$matrix = $matrixFactory->create($qrCode);
$xml = new \SimpleXMLElement('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>');
$xml->addAttribute('version', '1.1');
$xml->addAttribute('width', $matrix->getOuterSize().'px');
$xml->addAttribute('height', $matrix->getOuterSize().'px');
if (!$options[self::WRITER_OPTION_EXCLUDE_SVG_WIDTH_AND_HEIGHT]) {
$xml->addAttribute('width', $matrix->getOuterSize().'px');
$xml->addAttribute('height', $matrix->getOuterSize().'px');
}
$xml->addAttribute('viewBox', '0 0 '.$matrix->getOuterSize().' '.$matrix->getOuterSize());
$xml->addChild('defs');

View File

@ -1,5 +1,11 @@
# CHANGELOG
## 1.5.2 - 2022-08-07
### Changed
- Officially support PHP 8.2
## 1.5.1 - 2021-10-22
### Fixed
@ -12,10 +18,11 @@
### Changed
- Call handler when waiting on fulfilled/rejected Promise
- Officially support PHP 8.1
### Fixed
- Fix manually settle promises generated with Utils::task
- Fix manually settle promises generated with `Utils::task`
## 1.4.1 - 2021-02-18

View File

@ -17,7 +17,7 @@ for a general introduction to promises.
- [Implementation notes](#implementation-notes)
# Features
## Features
- [Promises/A+](https://promisesaplus.com/) implementation.
- Promise resolution and chaining is handled iteratively, allowing for
@ -29,15 +29,14 @@ for a general introduction to promises.
`GuzzleHttp\Promise\Coroutine::of()`.
# Quick start
## Quick Start
A *promise* represents the eventual result of an asynchronous operation. The
primary way of interacting with a promise is through its `then` method, which
registers callbacks to receive either a promise's eventual value or the reason
why the promise cannot be fulfilled.
## Callbacks
### Callbacks
Callbacks are registered with the `then` method by providing an optional
`$onFulfilled` followed by an optional `$onRejected` function.
@ -60,12 +59,11 @@ $promise->then(
```
*Resolving* a promise means that you either fulfill a promise with a *value* or
reject a promise with a *reason*. Resolving a promises triggers callbacks
registered with the promises's `then` method. These callbacks are triggered
reject a promise with a *reason*. Resolving a promise triggers callbacks
registered with the promise's `then` method. These callbacks are triggered
only once and in the order in which they were added.
## Resolving a promise
### Resolving a Promise
Promises are fulfilled using the `resolve($value)` method. Resolving a promise
with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger
@ -92,8 +90,7 @@ $promise
$promise->resolve('reader.');
```
## Promise forwarding
### Promise Forwarding
Promises can be chained one after the other. Each then in the chain is a new
promise. The return value of a promise is what's forwarded to the next
@ -123,7 +120,7 @@ $promise->resolve('A');
$nextPromise->resolve('B');
```
## Promise rejection
### Promise Rejection
When a promise is rejected, the `$onRejected` callbacks are invoked with the
rejection reason.
@ -140,7 +137,7 @@ $promise->reject('Error!');
// Outputs "Error!"
```
## Rejection forwarding
### Rejection Forwarding
If an exception is thrown in an `$onRejected` callback, subsequent
`$onRejected` callbacks are invoked with the thrown exception as the reason.
@ -195,7 +192,8 @@ $promise
$promise->reject('Error!');
```
# Synchronous wait
## Synchronous Wait
You can synchronously force promises to complete using a promise's `wait`
method. When creating a promise, you can provide a wait function that is used
@ -247,8 +245,7 @@ $promise->wait();
> PHP Fatal error: Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo'
## Unwrapping a promise
### Unwrapping a Promise
When synchronously waiting on a promise, you are joining the state of the
promise into the current state of execution (i.e., return the value of the
@ -275,7 +272,7 @@ wait function will be the value delivered to promise B.
**Note**: when you do not unwrap the promise, no value is returned.
# Cancellation
## Cancellation
You can cancel a promise that has not yet been fulfilled using the `cancel()`
method of a promise. When creating a promise you can provide an optional
@ -283,10 +280,9 @@ cancel function that when invoked cancels the action of computing a resolution
of the promise.
# API
## API
## Promise
### Promise
When creating a promise object, you can provide an optional `$waitFn` and
`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is
@ -349,7 +345,7 @@ A promise has the following methods:
Rejects the promise with the given `$reason`.
## FulfilledPromise
### FulfilledPromise
A fulfilled promise can be created to represent a promise that has been
fulfilled.
@ -366,7 +362,7 @@ $promise->then(function ($value) {
```
## RejectedPromise
### RejectedPromise
A rejected promise can be created to represent a promise that has been
rejected.
@ -383,7 +379,7 @@ $promise->then(null, function ($reason) {
```
# Promise interop
## Promise Interoperability
This library works with foreign promises that have a `then` method. This means
you can use Guzzle promises with [React promises](https://github.com/reactphp/promise)
@ -409,7 +405,7 @@ a foreign promise. You will need to wrap a third-party promise with a Guzzle
promise in order to utilize wait and cancel functions with foreign promises.
## Event Loop Integration
### Event Loop Integration
In order to keep the stack size constant, Guzzle promises are resolved
asynchronously using a task queue. When waiting on promises synchronously, the
@ -437,10 +433,9 @@ $loop->addPeriodicTimer(0, [$queue, 'run']);
*TODO*: Perhaps adding a `futureTick()` on each tick would be faster?
# Implementation notes
## Implementation Notes
## Promise resolution and chaining is handled iteratively
### Promise Resolution and Chaining is Handled Iteratively
By shuffling pending handlers from one owner to another, promises are
resolved iteratively, allowing for "infinite" then chaining.
@ -476,8 +471,7 @@ all of its pending handlers to the new promise. When the new promise is
eventually resolved, all of the pending handlers are delivered the forwarded
value.
## A promise is the deferred.
### A Promise is the Deferred
Some promise libraries implement promises using a deferred object to represent
a computation and a promise object to represent the delivery of the result of
@ -505,7 +499,10 @@ $promise->resolve('foo');
## Upgrading from Function API
A static API was first introduced in 1.4.0, in order to mitigate problems with functions conflicting between global and local copies of the package. The function API will be removed in 2.0.0. A migration table has been provided here for your convenience:
A static API was first introduced in 1.4.0, in order to mitigate problems with
functions conflicting between global and local copies of the package. The
function API will be removed in 2.0.0. A migration table has been provided here
for your convenience:
| Original Function | Replacement Method |
|----------------|----------------|
@ -536,10 +533,12 @@ A static API was first introduced in 1.4.0, in order to mitigate problems with f
If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/promises/security/policy) for more information.
## License
Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.
## For Enterprise
Available as part of the Tidelift Subscription

View File

@ -81,16 +81,8 @@ class EachPromise implements PromisorInterface
$this->iterable->rewind();
$this->refillPending();
} catch (\Throwable $e) {
/**
* @psalm-suppress NullReference
* @phpstan-ignore-next-line
*/
$this->aggregate->reject($e);
} catch (\Exception $e) {
/**
* @psalm-suppress NullReference
* @phpstan-ignore-next-line
*/
$this->aggregate->reject($e);
}

View File

@ -21,9 +21,10 @@
"php": "^7.3|^8.0"
},
"require-dev": {
"pestphp/pest": "^1.18",
"phpstan/phpstan": "^0.12.98",
"symfony/var-dumper": "^5.3"
"nesbot/carbon": "^2.61",
"pestphp/pest": "^1.21.3",
"phpstan/phpstan": "^1.8.2",
"symfony/var-dumper": "^5.4.11"
},
"autoload": {
"psr-4": {

View File

@ -3,6 +3,7 @@
namespace Laravel\SerializableClosure\Serializers;
use Closure;
use DateTimeInterface;
use Laravel\SerializableClosure\Contracts\Serializable;
use Laravel\SerializableClosure\SerializableClosure;
use Laravel\SerializableClosure\Support\ClosureScope;
@ -460,6 +461,12 @@ class Native implements Serializable
$instance = $data;
if ($data instanceof DateTimeInterface) {
$this->scope[$instance] = $data;
return;
}
if ($data instanceof UnitEnum) {
$this->scope[$instance] = $data;

View File

@ -83,6 +83,9 @@ class Signed implements Serializable
throw new InvalidSignatureException();
}
$this->closure = unserialize($signature['serializable'])->getClosure();
/** @var \Laravel\SerializableClosure\Contracts\Serializable $serializable */
$serializable = unserialize($signature['serializable']);
$this->closure = $serializable->getClosure();
}
}

View File

@ -2,6 +2,7 @@
namespace Laravel\SerializableClosure\Support;
#[\AllowDynamicProperties]
class ClosureStream
{
/**

View File

@ -10,6 +10,7 @@
[![Total Downloads](https://poser.pugx.org/phpmailer/phpmailer/downloads)](https://packagist.org/packages/phpmailer/phpmailer)
[![License](https://poser.pugx.org/phpmailer/phpmailer/license.svg)](https://packagist.org/packages/phpmailer/phpmailer)
[![API Docs](https://github.com/phpmailer/phpmailer/workflows/Docs/badge.svg)](https://phpmailer.github.io/PHPMailer/)
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer/badge)](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer)
## Features
- Probably the world's most popular code for sending email from PHP!

View File

@ -1 +1 @@
6.6.3
6.6.4

View File

@ -5,22 +5,29 @@
* @package PHPMailer
*/
$PHPMAILER_LANG['authenticate'] = 'SMTP Σφάλμα: Αδυναμία πιστοποίησης (authentication).';
$PHPMAILER_LANG['connect_host'] = 'SMTP Σφάλμα: Αδυναμία σύνδεσης στον SMTP-Host.';
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Σφάλμα: Τα δεδομένα δεν έγιναν αποδεκτά.';
$PHPMAILER_LANG['empty_message'] = 'Το E-Mail δεν έχει περιεχόμενο .';
$PHPMAILER_LANG['encoding'] = 'Αγνωστο Encoding-Format: ';
$PHPMAILER_LANG['execute'] = 'Αδυναμία εκτέλεσης ακόλουθης εντολής: ';
$PHPMAILER_LANG['file_access'] = 'Αδυναμία προσπέλασης του αρχείου: ';
$PHPMAILER_LANG['file_open'] = 'Σφάλμα Αρχείου: Δεν είναι δυνατό το άνοιγμα του ακόλουθου αρχείου: ';
$PHPMAILER_LANG['from_failed'] = 'Η παρακάτω διεύθυνση αποστολέα δεν είναι σωστή: ';
$PHPMAILER_LANG['instantiate'] = 'Αδυναμία εκκίνησης Mail function.';
$PHPMAILER_LANG['invalid_address'] = 'Το μήνυμα δεν εστάλη, η διεύθυνση δεν είναι έγκυρη: ';
$PHPMAILER_LANG['authenticate'] = 'Σφάλμα SMTP: Αδυναμία πιστοποίησης.';
$PHPMAILER_LANG['buggy_php'] = 'Η έκδοση PHP που χρησιμοποιείτε παρουσιάζει σφάλμα που μπορεί να έχει ως αποτέλεσμα κατεστραμένα μηνύματα. Για να το διορθώσετε, αλλάξτε τον τρόπο αποστολής σε SMTP, απενεργοποιήστε την επιλογή mail.add_x_header στο αρχείο php.ini, αλλάξτε λειτουργικό σε MacOS ή Linux ή αναβαθμίστε την PHP σε έκδοση 7.0.17+ ή 7.1.3+.';
$PHPMAILER_LANG['connect_host'] = 'Σφάλμα SMTP: Αδυναμία σύνδεσης με τον φιλοξενητή SMTP.';
$PHPMAILER_LANG['data_not_accepted'] = 'Σφάλμα SMTP: Μη αποδεκτά δεδομένα.';
$PHPMAILER_LANG['empty_message'] = 'Η ηλεκτρονική επιστολή δεν έχει περιεχόμενο.';
$PHPMAILER_LANG['encoding'] = 'Άγνωστη μορφή κωδικοποίησης: ';
$PHPMAILER_LANG['execute'] = 'Αδυναμία εκτέλεσης: ';
$PHPMAILER_LANG['extension_missing'] = 'Απουσία επέκτασης: ';
$PHPMAILER_LANG['file_access'] = 'Αδυναμία πρόσβασης στο αρχείο: ';
$PHPMAILER_LANG['file_open'] = 'Σφάλμα Αρχείου: Αδυναμία ανοίγματος αρχείου: ';
$PHPMAILER_LANG['from_failed'] = 'Η ακόλουθη διεύθυνση αποστολέα δεν είναι σωστή: ';
$PHPMAILER_LANG['instantiate'] = 'Αδυναμία εκκίνησης συνάρτησης Mail.';
$PHPMAILER_LANG['invalid_address'] = 'Μη έγκυρη διεύθυνση: ';
$PHPMAILER_LANG['invalid_header'] = 'Μη έγκυρο όνομα κεφαλίδας ή τιμή';
$PHPMAILER_LANG['invalid_hostentry'] = 'Μη έγκυρη εισαγωγή φιλοξενητή: ';
$PHPMAILER_LANG['invalid_host'] = 'Μη έγκυρος φιλοξενητής: ';
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer δεν υποστηρίζεται.';
$PHPMAILER_LANG['provide_address'] = 'Παρακαλούμε δώστε τουλάχιστον μια e-mail διεύθυνση παραλήπτη.';
$PHPMAILER_LANG['recipients_failed'] = 'SMTP Σφάλμα: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: ';
$PHPMAILER_LANG['provide_address'] = 'Δώστε τουλάχιστον μια ηλεκτρονική διεύθυνση παραλήπτη.';
$PHPMAILER_LANG['recipients_failed'] = 'Σφάλμα SMTP: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: ';
$PHPMAILER_LANG['signing'] = 'Σφάλμα υπογραφής: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'Αποτυχία σύνδεσης στον SMTP Server.';
$PHPMAILER_LANG['smtp_error'] = 'Σφάλμα από τον SMTP Server: ';
$PHPMAILER_LANG['variable_set'] = 'Αδυναμία ορισμού ή αρχικοποίησης μεταβλητής: ';
//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: ';
$PHPMAILER_LANG['smtp_code'] = 'Κώδικάς SMTP: ';
$PHPMAILER_LANG['smtp_code_ex'] = 'Πρόσθετες πληροφορίες SMTP: ';
$PHPMAILER_LANG['smtp_connect_failed'] = 'Αποτυχία σύνδεσης SMTP.';
$PHPMAILER_LANG['smtp_detail'] = 'Λεπτομέρεια: ';
$PHPMAILER_LANG['smtp_error'] = 'Σφάλμα με τον διακομιστή SMTP: ';
$PHPMAILER_LANG['variable_set'] = 'Αδυναμία ορισμού ή επαναφοράς μεταβλητής: ';

View File

@ -350,8 +350,8 @@ class PHPMailer
public $Password = '';
/**
* SMTP auth type.
* Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2, attempted in that order if not specified.
* SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2.
* If not specified, the first one from that list that the server supports will be selected.
*
* @var string
*/
@ -750,7 +750,7 @@ class PHPMailer
*
* @var string
*/
const VERSION = '6.6.3';
const VERSION = '6.6.4';
/**
* Error severity: message only, continue processing.
@ -1096,7 +1096,7 @@ class PHPMailer
return false;
}
if ($name !== null) {
if ($name !== null && is_string($name)) {
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
} else {
$name = '';
@ -1288,7 +1288,7 @@ class PHPMailer
*/
public function setFrom($address, $name = '', $auto = true)
{
$address = trim($address);
$address = trim((string)$address);
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
//Don't validate now addresses with IDN. Will be done in send().
$pos = strrpos($address, '@');
@ -1891,7 +1891,14 @@ class PHPMailer
foreach ($this->to as $toaddr) {
$toArr[] = $this->addrFormat($toaddr);
}
$to = implode(', ', $toArr);
$to = trim(implode(', ', $toArr));
//If there are no To-addresses (e.g. when sending only to BCC-addresses)
//the following should be added to get a correct DKIM-signature.
//Compare with $this->preSend()
if ($to === '') {
$to = 'undisclosed-recipients:;';
}
$params = null;
//This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
@ -4470,6 +4477,7 @@ class PHPMailer
'ics' => 'text/calendar',
'xml' => 'text/xml',
'xsl' => 'text/xml',
'csv' => 'text/csv',
'wmv' => 'video/x-ms-wmv',
'mpeg' => 'video/mpeg',
'mpe' => 'video/mpeg',

View File

@ -46,7 +46,7 @@ class POP3
*
* @var string
*/
const VERSION = '6.6.3';
const VERSION = '6.6.4';
/**
* Default POP3 port number.

View File

@ -35,7 +35,7 @@ class SMTP
*
* @var string
*/
const VERSION = '6.6.3';
const VERSION = '6.6.4';
/**
* SMTP line break constant.

2
vendor/services.php vendored
View File

@ -1,5 +1,5 @@
<?php
// This file is automatically generated at:2022-08-15 14:50:32
// This file is automatically generated at:2022-09-15 15:52:54
declare (strict_types = 1);
return array (
0 => 'taoser\\addons\\Service',

View File

@ -13,6 +13,9 @@
*/
namespace Workerman\Events;
use Throwable;
use Workerman\Worker;
/**
* select eventloop
*/
@ -211,6 +214,7 @@ class Select implements EventInterface
*/
protected function tick()
{
$tasks_to_insert = [];
while (!$this->_scheduler->isEmpty()) {
$scheduler_data = $this->_scheduler->top();
$timer_id = $scheduler_data['data'];
@ -228,14 +232,28 @@ class Select implements EventInterface
$task_data = $this->_eventTimer[$timer_id];
if ($task_data[2] === self::EV_TIMER) {
$next_run_time = $time_now + $task_data[3];
$this->_scheduler->insert($timer_id, -$next_run_time);
$tasks_to_insert[] = [$timer_id, -$next_run_time];
}
try {
\call_user_func_array($task_data[0], $task_data[1]);
} catch (Throwable $e) {
Worker::stopAll(250, $e);
}
\call_user_func_array($task_data[0], $task_data[1]);
if (isset($this->_eventTimer[$timer_id]) && $task_data[2] === self::EV_TIMER_ONCE) {
$this->del($timer_id, self::EV_TIMER_ONCE);
}
continue;
} else {
break;
}
}
foreach ($tasks_to_insert as $item) {
$this->_scheduler->insert($item[0], $item[1]);
}
if (!$this->_scheduler->isEmpty()) {
$scheduler_data = $this->_scheduler->top();
$next_run_time = -$scheduler_data['priority'];
$time_now = \microtime(true);
$this->_selectTimeout = \max((int) (($next_run_time - $time_now) * 1000000), 0);
return;
}
$this->_selectTimeout = 100000000;
@ -275,10 +293,8 @@ class Select implements EventInterface
} else {
$this->_selectTimeout >= 1 && usleep($this->_selectTimeout);
$ret = false;
}
if (!$this->_scheduler->isEmpty()) {
$this->tick();
}

View File

@ -596,7 +596,7 @@ class Request
*/
protected static function createSessionId()
{
return \bin2hex(\pack('d', \microtime(true)) . \pack('N', \mt_rand()));
return \bin2hex(\pack('d', \microtime(true)) . random_bytes(8));
}
/**

View File

@ -410,7 +410,7 @@ class Session
public function __destruct()
{
$this->save();
if (\rand(1, static::$gcProbability[1]) <= static::$gcProbability[0]) {
if (\random_int(1, static::$gcProbability[1]) <= static::$gcProbability[0]) {
$this->gc();
}
}

View File

@ -87,7 +87,7 @@ class FileSessionHandler implements SessionHandlerInterface
*/
public function write($session_id, $session_data)
{
$temp_file = static::$_sessionSavePath.uniqid(mt_rand(), true);
$temp_file = static::$_sessionSavePath . uniqid(bin2hex(random_bytes(8)), true);
if (!\file_put_contents($temp_file, $session_data)) {
return false;
}

View File

@ -355,7 +355,7 @@ class Ws
$port = $connection->getRemotePort();
$host = $port === 80 ? $connection->getRemoteHost() : $connection->getRemoteHost() . ':' . $port;
// Handshake header.
$connection->websocketSecKey = \base64_encode(\md5(\mt_rand(), true));
$connection->websocketSecKey = \base64_encode(random_bytes(16));
$user_header = isset($connection->headers) ? $connection->headers :
(isset($connection->wsHttpHeader) ? $connection->wsHttpHeader : null);
$user_header_str = '';

View File

@ -33,7 +33,7 @@ class Worker
*
* @var string
*/
const VERSION = '4.0.42';
const VERSION = '4.1.0';
/**
* Status starting.
@ -183,7 +183,7 @@ class Worker
public $onBufferDrain = null;
/**
* Emitted when worker processes stoped.
* Emitted when worker processes stopped.
*
* @var callable
*/
@ -1693,11 +1693,9 @@ class Worker
// onWorkerExit
if ($worker->onWorkerExit) {
try {
call_user_func($worker->onWorkerExit, $worker, $status, $pid);
} catch (\Exception $e) {
static::log("worker[{$worker->name}] onWorkerExit $e");
} catch (\Error $e) {
static::log("worker[{$worker->name}] onWorkerExit $e");
($worker->onWorkerExit)($worker, $status, $pid);
} catch (\Throwable $exception) {
static::log("worker[{$worker->name}] onWorkerExit $exception");
}
}

View File

@ -24,7 +24,7 @@
"source": "https://github.com/walkor/workerman"
},
"require": {
"php": ">=5.4"
"php": ">=7.0"
},
"suggest": {
"ext-event": "For better performance. "

View File

@ -1,3 +1,19 @@
## v3.1.12
### fixed
- fix: 微信代金券详情 url 不正确(#663)
### refactor
- refactor: 优化代码 (#661)
## v3.1.11
### added
- feat: 微信退款自动增加回调url(#649)
## v3.1.10
### added

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) yansongda <me@yansongda.cn>
Copyright (c) 2017 yansongda <me@yansongda.cn>
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
@ -17,4 +17,4 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,8 +1,9 @@
<p align="center">
<a href="https://pay.yansongda.cn" target="_blank" rel="noopener noreferrer"><img width="200" src="https://cdn.jsdelivr.net/gh/yansongda/pay-site/.vuepress/public/images/logo.png" alt="Logo"></a>
<a href="https://pay.yansongda.cn" target="_blank" rel="noopener noreferrer"><img width="200" src="https://pay.yansongda.cn/images/logo.png" alt="Logo"></a>
</p>
<p align="center">
<a href="https://codecov.io/gh/yansongda/pay" ><img src="https://codecov.io/gh/yansongda/pay/branch/master/graph/badge.svg?token=tYMV0YT5jj"/></a>
<a href="https://scrutinizer-ci.com/g/yansongda/pay/?branch=master"><img src="https://scrutinizer-ci.com/g/yansongda/pay/badges/quality-score.png?b=master" alt="scrutinizer"></a>
<a href="https://github.com/yansongda/pay/actions"><img src="https://github.com/yansongda/pay/workflows/Linter/badge.svg" alt="Linter Status"></a>
<a href="https://github.com/yansongda/pay/actions"><img src="https://github.com/yansongda/pay/workflows/Tester/badge.svg" alt="Tester Status"></a>

View File

@ -12,11 +12,11 @@ interface ProviderInterface
/**
* pay.
*
* @return \Psr\Http\Message\MessageInterface|\Yansongda\Supports\Collection|array|null
*
* @throws \Yansongda\Pay\Exception\ContainerException
* @throws \Yansongda\Pay\Exception\InvalidParamsException
* @throws \Yansongda\Pay\Exception\ServiceNotFoundException
*
* @return \Psr\Http\Message\MessageInterface|\Yansongda\Supports\Collection|array|null
*/
public function pay(array $plugins, array $params);

View File

@ -300,9 +300,9 @@ if (!function_exists('decrypt_wechat_resource')) {
if (!function_exists('decrypt_wechat_resource_aes_256_gcm')) {
/**
* @throws \Yansongda\Pay\Exception\InvalidResponseException
*
* @return array|string
*
* @throws \Yansongda\Pay\Exception\InvalidResponseException
*/
function decrypt_wechat_resource_aes_256_gcm(string $ciphertext, string $secret, string $nonce, string $associatedData)
{

View File

@ -79,10 +79,10 @@ class Pay
}
/**
* @return mixed
*
* @throws \Yansongda\Pay\Exception\ContainerException
* @throws \Yansongda\Pay\Exception\ServiceNotFoundException
*
* @return mixed
*/
public static function __callStatic(string $service, array $config)
{
@ -143,9 +143,9 @@ class Pay
}
/**
* @throws \Yansongda\Pay\Exception\ContainerException
*
* @return mixed
*
* @throws \Yansongda\Pay\Exception\ContainerException
*/
public static function make(string $service, array $parameters = [])
{
@ -167,10 +167,10 @@ class Pay
}
/**
* @return mixed
*
* @throws \Yansongda\Pay\Exception\ServiceNotFoundException
* @throws \Yansongda\Pay\Exception\ContainerException
*
* @return mixed
*/
public static function get(string $service)
{

View File

@ -109,7 +109,11 @@ class PreparePlugin implements PluginInterface
$cert = file_get_contents($path);
$ssl = openssl_x509_parse($cert);
return $this->getCertSn($ssl['issuer'], $ssl['serialNumber']);
if (false === $ssl) {
throw new InvalidConfigException(Exception::ALIPAY_CONFIG_ERROR, 'Parse `app_public_cert_path` Error');
}
return $this->getCertSn($ssl['issuer'] ?? [], $ssl['serialNumber'] ?? '');
}
/**
@ -169,8 +173,8 @@ class PreparePlugin implements PluginInterface
protected function formatCert(array $ssl): array
{
if (0 === strpos($ssl['serialNumber'], '0x')) {
$ssl['serialNumber'] = $this->hex2dec($ssl['serialNumberHex']);
if (0 === strpos($ssl['serialNumber'] ?? '', '0x')) {
$ssl['serialNumber'] = $this->hex2dec($ssl['serialNumberHex'] ?? '');
}
return $ssl;

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_1.shtml
*/
class ApplyPlugin extends GeneralPlugin
{
/**

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_2.shtml
*/
class FindPlugin extends GeneralPlugin
{
/**

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_5.shtml
*/
class FindReturnAdvancePlugin extends GeneralPlugin
{
/**

View File

@ -10,6 +10,9 @@ use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
use Yansongda\Supports\Collection;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_4.shtml
*/
class ReturnAdvancePlugin extends GeneralPlugin
{
/**

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_7.shtml
*/
class CreateBillReceiptPlugin extends GeneralPlugin
{
/**

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_9.shtml
*/
class CreateDetailReceiptPlugin extends GeneralPlugin
{
/**

View File

@ -10,6 +10,9 @@ use Yansongda\Pay\Rocket;
use Yansongda\Pay\Traits\HasWechatEncryption;
use Yansongda\Supports\Collection;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_1.shtml
*/
class CreatePlugin extends GeneralPlugin
{
use HasWechatEncryption;

View File

@ -10,6 +10,9 @@ use Yansongda\Pay\Parser\OriginResponseParser;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_11.shtml
*/
class DownloadReceiptPlugin extends GeneralPlugin
{
/**

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_3.shtml
*/
class QueryBatchDetailIdPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_2.shtml
*/
class QueryBatchIdPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_8.shtml
*/
class QueryBillReceiptPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_10.shtml
*/
class QueryDetailReceiptPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_6.shtml
*/
class QueryOutBatchDetailNoPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_5.shtml
*/
class QueryOutBatchNoPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -40,9 +40,9 @@ class LaunchPlugin implements PluginInterface
}
/**
* @throws \Yansongda\Pay\Exception\InvalidResponseException
*
* @return array|\Psr\Http\Message\MessageInterface|\Yansongda\Supports\Collection|null
*
* @throws \Yansongda\Pay\Exception\InvalidResponseException
*/
protected function validateResponse(Rocket $rocket)
{

View File

@ -7,6 +7,9 @@ namespace Yansongda\Pay\Plugin\Wechat\Marketing\Coupon;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_1.shtml
*/
class CreatePlugin extends GeneralPlugin
{
protected function doSomething(Rocket $rocket): void

View File

@ -10,6 +10,9 @@ use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
use Yansongda\Supports\Collection;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_13.shtml
*/
class PausePlugin extends GeneralPlugin
{
/**

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_9.shtml
*/
class QueryCouponDetailPlugin extends GeneralPlugin
{
protected function getMethod(): string
@ -38,7 +41,7 @@ class QueryCouponDetailPlugin extends GeneralPlugin
return 'v3/marketing/favor/users/'.
$payload->get('openid').
'coupons/'.$payload->get('coupon_id').
'/coupons/'.$payload->get('coupon_id').
'?appid='.$appid;
}
}

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_5.shtml
*/
class QueryStockDetailPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_8.shtml
*/
class QueryStockItemsPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_7.shtml
*/
class QueryStockMerchantsPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_11.shtml
*/
class QueryStockRefundFlowPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_10.shtml
*/
class QueryStockUseFlowPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -7,6 +7,9 @@ namespace Yansongda\Pay\Plugin\Wechat\Marketing\Coupon;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_4.shtml
*/
class QueryStocksPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_9.shtml
*/
class QueryUserCouponsPlugin extends GeneralPlugin
{
protected function getMethod(): string

View File

@ -10,6 +10,9 @@ use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
use Yansongda\Supports\Collection;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_14.shtml
*/
class RestartPlugin extends GeneralPlugin
{
/**

View File

@ -10,6 +10,9 @@ use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
use Yansongda\Supports\Collection;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_2.shtml
*/
class SendPlugin extends GeneralPlugin
{
protected function doSomething(Rocket $rocket): void

View File

@ -7,6 +7,9 @@ namespace Yansongda\Pay\Plugin\Wechat\Marketing\Coupon;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_12.shtml
*/
class SetCallbackPlugin extends GeneralPlugin
{
/**

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Plugin\Wechat\GeneralPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_3.shtml
*/
class StartPlugin extends GeneralPlugin
{
protected function doSomething(Rocket $rocket): void

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\App;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_3.shtml
*/
class ClosePlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\ClosePlugin
{
}

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\App;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_8.shtml
*/
class DownloadBillPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\DownloadBillPlugin
{
}

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\App;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_10.shtml
*/
class FindRefundPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\FindRefundPlugin
{
}

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\App;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_7.shtml
*/
class GetFlowBillPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\GetFlowBillPlugin
{
}

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\App;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_6.shtml
*/
class GetTradeBillPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\GetTradeBillPlugin
{
}

View File

@ -9,6 +9,9 @@ use Yansongda\Supports\Collection;
use Yansongda\Supports\Config;
use Yansongda\Supports\Str;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml
*/
class InvokePrepayPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\InvokePrepayPlugin
{
/**

View File

@ -6,6 +6,9 @@ namespace Yansongda\Pay\Plugin\Wechat\Pay\App;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml
*/
class PrepayPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\PrepayPlugin
{
protected function getUri(Rocket $rocket): string

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\App;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_2.shtml
*/
class QueryPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\QueryPlugin
{
}

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\App;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_9.shtml
*/
class RefundPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\RefundPlugin
{
}

View File

@ -7,6 +7,9 @@ namespace Yansongda\Pay\Plugin\Wechat\Pay\Combine;
use Yansongda\Pay\Plugin\Wechat\Pay\Common\CombinePrepayPlugin;
use Yansongda\Pay\Rocket;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_1.shtml
*/
class AppPrepayPlugin extends CombinePrepayPlugin
{
protected function getUri(Rocket $rocket): string

View File

@ -9,6 +9,9 @@ use Yansongda\Pay\Exception\InvalidParamsException;
use Yansongda\Pay\Rocket;
use Yansongda\Supports\Collection;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_12.shtml
*/
class ClosePlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\ClosePlugin
{
protected function getUri(Rocket $rocket): string

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\Combine;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_19.shtml
*/
class DownloadBillPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\DownloadBillPlugin
{
}

View File

@ -4,6 +4,9 @@ declare(strict_types=1);
namespace Yansongda\Pay\Plugin\Wechat\Pay\Combine;
/**
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_15.shtml
*/
class FindRefundPlugin extends \Yansongda\Pay\Plugin\Wechat\Pay\Common\FindRefundPlugin
{
}

Some files were not shown because too many files have changed in this diff Show More