提问交流

提问交流

使用问题咨询
经验分享

经验分享

开发经验交流分享
功能建议

功能建议

官方开发功能建议
BUG反馈

BUG反馈

使用BUG反馈
模块&插件&数据包

模块&插件&数据包

模块插件数据包分享
框架发布

框架发布

Tp5中api开发中异常输出为html的问题

经验分享dragonlhp 发表了文章 • 0 个评论 • 236 次浏览 • 2018-02-05 20:06 • 来自相关话题

现在谁不开发接口的呢?但是在接口开发过程中,报错误异常后居然返回错误的信息依然是html信息!TP官方也不知道为啥不添加,说好的为接口而生,我的解决方案也很简单,把系统的异常处理类复制出来,去掉模板相关,直接以json方式输出;下面是解决方案:

1:按照TP扩展异常的方式引用这个文件
看云 /manual/thinkphp5_1/354092

2:判断一下配置文件的默认输出类型
配置文件:
    //    判断默认输出类型
    if ($app['default_return_type'] == 'json') {
        // 异常处理handle类 留空使用 \think\exception\Handle
        $app['exception_handle'] = '\\app\\common\\exception\\JsonException';
    }


    return $app;

  查看全部
现在谁不开发接口的呢?但是在接口开发过程中,报错误异常后居然返回错误的信息依然是html信息!TP官方也不知道为啥不添加,说好的为接口而生,我的解决方案也很简单,把系统的异常处理类复制出来,去掉模板相关,直接以json方式输出;下面是解决方案:

1:按照TP扩展异常的方式引用这个文件
看云 /manual/thinkphp5_1/354092

2:判断一下配置文件的默认输出类型
配置文件:
    //    判断默认输出类型
    if ($app['default_return_type'] == 'json') {
        // 异常处理handle类 留空使用 \think\exception\Handle
        $app['exception_handle'] = '\\app\\common\\exception\\JsonException';
    }


    return $app;

 

阿里短信

模块&插件simone 发表了文章 • 3 个评论 • 666 次浏览 • 2017-10-27 10:08 • 来自相关话题

 
AccessKeyId 与 AccessKeySecret 在阿里云Access Key管理页面获取。
 
短信签名及短信模板 短信服务内申请
 
阿里短信系统升级 现更新源码。
 
使用:
plugin_action('AliyunSms','AliyunSms','sendSms',['phoneNumbers'=>18888888888,'templateParam'=>array('name'=>'test')]);
  查看全部
 
AccessKeyId 与 AccessKeySecret 在阿里云Access Key管理页面获取。
 
短信签名及短信模板 短信服务内申请
 
阿里短信系统升级 现更新源码。
 
使用:
plugin_action('AliyunSms','AliyunSms','sendSms',['phoneNumbers'=>18888888888,'templateParam'=>array('name'=>'test')]);
 

markdown插件

回复

模块&插件gyh9711 发起了问题 • 2 人关注 • 0 个回复 • 412 次浏览 • 2017-10-26 11:43 • 来自相关话题

关于linkages标签 三个选项框不能对应三层结构数据的问题

经验分享chhnang 发表了文章 • 0 个评论 • 221 次浏览 • 2017-10-23 16:13 • 来自相关话题

在做省市县三个选项框时, 经常出现 直辖市: 两级结构;  省: 四级结构(市多一个市辖区)  ,导致linkages标签不能愉快的使用, 在下做了一个数据调整,供大家参考!
在做省市县三个选项框时, 经常出现 直辖市: 两级结构;  省: 四级结构(市多一个市辖区)  ,导致linkages标签不能愉快的使用, 在下做了一个数据调整,供大家参考!

后台【两步验证】插件

模块&插件流风回雪 发表了文章 • 10 个评论 • 775 次浏览 • 2017-10-20 14:39 • 来自相关话题

为了防止网站后台工作人员账号密码意外泄露带来的安全问题(如CSDN事件),可以考虑给后台登录加一个两步验证
 
一、安装
解压附件中的插件到 /plugins 目录修改 application/admin/controller/Admin.php 在 protected function _initialize() 方法的第一行添加代码
/**
* 初始化
* @author 蔡伟明 <314013107@qq.com>
*/
protected function _initialize()
{
// 两步验证钩子
$hook_result = \think\Hook::listen('two_step');
if (!empty($hook_result) && true !== $hook_result[0]) {
$current_url = request()->url(); // 当前 url
if ( // 下面三个 URL 不跳转到两步验证页
strpos ( $current_url , plugin_url('TwoStep/Admin/verification') ) === false && // 两步验证页
strpos ( $current_url , plugin_url('TwoStep/Admin/signin') ) === false && // 验证两步验证码
strpos ( $current_url , url('user/publics/signout') ) === false // 登出账号
){
$this->redirect(plugin_url('TwoStep/Admin/verification'));
}
}
.
.
.
.
.
}
修改 application/admin/controller/Index.php 用下面代码覆盖 public function profile() 方法
/**
* 个人设置
* @author 蔡伟明 <314013107@qq.com>
*/
public function profile()
{
// 保存数据
if ($this->request->isPost()) {
$data = $this->request->post();

$data['nickname'] == '' && $this->error('昵称不能为空');
$data['id'] = UID;

// 如果没有填写密码,则不更新密码
if ($data['password'] == '') {
unset($data['password']);
}

$UserModel = new UserModel();
if ($user = $UserModel->allowField(['nickname', 'email', 'password', 'mobile', 'avatar'])->update($data)) {
// 记录行为
action_log('user_edit', 'admin_user', UID, UID, get_nickname(UID));
$this->success('编辑成功');
} else {
$this->error('编辑失败');
}
}

// 获取数据
$info = UserModel::where('id', UID)->field('password', true)->find();

// 开启两步验证功能
$generate_secret_url = plugin_url('TwoStep/Admin/generateSecret');
$js = <<<EOF
<script type="text/javascript">
$(function(){
$("#is_two_step").change(function() {
if($('#is_two_step').is(':checked')) {
$.get("{$generate_secret_url}", function(res){
if(res.code == 0){
Dolphin.notify(res.msg, 'danger');
$("#is_two_step").removeAttr("checked");
} else {
$("#two_step_secret").val(res.secret);
$("#form_group_is_two_step > .col-sm-12").after("<img src='"+res.QRCode+"' id='QRCode' alt='QRCode'>");
}
});
} else {
$("#two_step_secret").val('');
$("#QRCode").remove();
}
});

});
</script>
EOF;

$items = [ // 批量添加表单项
['static', 'username', '用户名', '不可更改'],
['text', 'nickname', '昵称', '可以是中文'],
['text', 'email', '邮箱', ''],
['password', 'password', '密码', '必填,6-20位'],
['text', 'mobile', '手机号'],
['image', 'avatar', '头像']
];

if (isset($info['two_step_secret'])){ // 两步验证插件已安装
if ($info['two_step_secret']){
array_push ( $items , ['switch', 'is_two_step', '两步验证', '关闭后再开启可重新生成二维码', 1] );
}else{
array_push ( $items , ['switch', 'is_two_step', '两步验证', '开启后用 <code>Google Authenticator</code> 扫描二维码', 0] );
}
array_push ( $items , ['hidden', 'two_step_secret'] );
}else{
$js = '';
}

// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->addFormItems($items)
->setFormData($info) // 设置表单数据
->setExtraJs($js)
->fetch();
}
到后台“扩展中心”安装“两步验证”插件安装后再“设置插件”,把主机名改成自己的




开启非“超级管理员”的插件运行权限




 
PS: 如果插件设置和权限设置没生效,请清空缓存!


二、使用
打开“个人设置”页




拖到页面底部,开启两步验证




开启后立即用 Google Authenticator 扫描二维码(不过我还是推荐使用 Authy 这款APP,即使刷机也不怕验证码丢失)




确定扫描成功后再提交保存!退出后台重新登录,在系统验证完账号密码后,如果要登录的用户开启了两步验证,则会再要求输入验证码,验证成功后方可进入后台





三、关闭两步验证
若要关闭两步验证只需要在“个人设置”页关闭并保存即可
 

本插件基于 DolphinPHP 1.0.7 开发
 
目前测试下来支持 DolphinPHP 1.1.0 !但如果你从低版本升级到 1.1.0 后发现无法登录后台,请先删除 runtime 目录;如果还使用了Redis缓存,需要清空下Redis缓存数据的内容!


TwoStep.zip 查看全部
为了防止网站后台工作人员账号密码意外泄露带来的安全问题(如CSDN事件),可以考虑给后台登录加一个两步验证
 
一、安装
  • 解压附件中的插件到 /plugins 目录
  • 修改 application/admin/controller/Admin.php 在 protected function _initialize() 方法的第一行添加代码

    /**
* 初始化
* @author 蔡伟明 <314013107@qq.com>
*/
protected function _initialize()
{
// 两步验证钩子
$hook_result = \think\Hook::listen('two_step');
if (!empty($hook_result) && true !== $hook_result[0]) {
$current_url = request()->url(); // 当前 url
if ( // 下面三个 URL 不跳转到两步验证页
strpos ( $current_url , plugin_url('TwoStep/Admin/verification') ) === false && // 两步验证页
strpos ( $current_url , plugin_url('TwoStep/Admin/signin') ) === false && // 验证两步验证码
strpos ( $current_url , url('user/publics/signout') ) === false // 登出账号
){
$this->redirect(plugin_url('TwoStep/Admin/verification'));
}
}
.
.
.
.
.
}

  • 修改 application/admin/controller/Index.php 用下面代码覆盖 public function profile() 方法

    /**
* 个人设置
* @author 蔡伟明 <314013107@qq.com>
*/
public function profile()
{
// 保存数据
if ($this->request->isPost()) {
$data = $this->request->post();

$data['nickname'] == '' && $this->error('昵称不能为空');
$data['id'] = UID;

// 如果没有填写密码,则不更新密码
if ($data['password'] == '') {
unset($data['password']);
}

$UserModel = new UserModel();
if ($user = $UserModel->allowField(['nickname', 'email', 'password', 'mobile', 'avatar'])->update($data)) {
// 记录行为
action_log('user_edit', 'admin_user', UID, UID, get_nickname(UID));
$this->success('编辑成功');
} else {
$this->error('编辑失败');
}
}

// 获取数据
$info = UserModel::where('id', UID)->field('password', true)->find();

// 开启两步验证功能
$generate_secret_url = plugin_url('TwoStep/Admin/generateSecret');
$js = <<<EOF
<script type="text/javascript">
$(function(){
$("#is_two_step").change(function() {
if($('#is_two_step').is(':checked')) {
$.get("{$generate_secret_url}", function(res){
if(res.code == 0){
Dolphin.notify(res.msg, 'danger');
$("#is_two_step").removeAttr("checked");
} else {
$("#two_step_secret").val(res.secret);
$("#form_group_is_two_step > .col-sm-12").after("<img src='"+res.QRCode+"' id='QRCode' alt='QRCode'>");
}
});
} else {
$("#two_step_secret").val('');
$("#QRCode").remove();
}
});

});
</script>
EOF;

$items = [ // 批量添加表单项
['static', 'username', '用户名', '不可更改'],
['text', 'nickname', '昵称', '可以是中文'],
['text', 'email', '邮箱', ''],
['password', 'password', '密码', '必填,6-20位'],
['text', 'mobile', '手机号'],
['image', 'avatar', '头像']
];

if (isset($info['two_step_secret'])){ // 两步验证插件已安装
if ($info['two_step_secret']){
array_push ( $items , ['switch', 'is_two_step', '两步验证', '关闭后再开启可重新生成二维码', 1] );
}else{
array_push ( $items , ['switch', 'is_two_step', '两步验证', '开启后用 <code>Google Authenticator</code> 扫描二维码', 0] );
}
array_push ( $items , ['hidden', 'two_step_secret'] );
}else{
$js = '';
}

// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->addFormItems($items)
->setFormData($info) // 设置表单数据
->setExtraJs($js)
->fetch();
}

  • 到后台“扩展中心”安装“两步验证”插件
  • 安装后再“设置插件”,把主机名改成自己的

QQ截图20171020134353.png

  • 开启非“超级管理员”的插件运行权限

QQ截图20171020140227.png

 
PS: 如果插件设置和权限设置没生效,请清空缓存!


二、使用
  • 打开“个人设置”页

QQ截图20171020134456.png

  • 拖到页面底部,开启两步验证

QQ截图20171020134955.png

  • 开启后立即用 Google Authenticator 扫描二维码(不过我还是推荐使用 Authy 这款APP,即使刷机也不怕验证码丢失)

IMG_2652(20171020-143848).jpg

  • 确定扫描成功后再提交保存!
  • 退出后台重新登录,在系统验证完账号密码后,如果要登录的用户开启了两步验证,则会再要求输入验证码,验证成功后方可进入后台

QQ截图20171020135521.png


三、关闭两步验证
  • 若要关闭两步验证只需要在“个人设置”页关闭并保存即可

 

本插件基于 DolphinPHP 1.0.7 开发
 
目前测试下来支持 DolphinPHP 1.1.0 !但如果你从低版本升级到 1.1.0 后发现无法登录后台,请先删除 runtime 目录;如果还使用了Redis缓存,需要清空下Redis缓存数据的内容!

Multifield多维数组字段-扩展form单序列化字段

模块&插件yangweijie 发表了文章 • 6 个评论 • 564 次浏览 • 2017-10-04 08:47 • 来自相关话题

使用
form

addMultifield($name = '', $title = '', $tips = '', $options = [], $default = [],$extra_class='') 添加多维字段序列化存储,每一行记录由options控制,field_name=>field_title

存储时 如 input('no') 获取出来是 [['name'=>'', 'value'=>'']]这样的结构;

测试代码
public function test(){
if(request()->isAjax()){
$mult_attribute = I('mult_attribute/a', []);
$this->checkPackagePrice($mult_attribute);
}else{
return ZBuilder::make('form')
->setPageTitle('新增商品-选择店铺')
->addMultifield('mult_attribute', '商品', '', ['name'=>'名称','value'=>'值'], '')
->fetch();
}
}

public function checkPackagePrice($mult_attribute){
$empty_num = 0;
foreach ($mult_attribute as $key => $row) {
if (empty($row['attribute_value']) || empty($row['attribute_name'])) {
$empty_num++;
}
}
if ($empty_num > 0) {
$this->error('每个子项的属性名或属性值必填');
}
}效果图:










  查看全部
使用
form


addMultifield($name = '', $title = '', $tips = '', $options = [], $default = [],$extra_class='') 添加多维字段序列化存储,每一行记录由options控制,field_name=>field_title

存储时 如 input('no') 获取出来是 [['name'=>'', 'value'=>'']]这样的结构;

测试代码
public function test(){
if(request()->isAjax()){
$mult_attribute = I('mult_attribute/a', []);
$this->checkPackagePrice($mult_attribute);
}else{
return ZBuilder::make('form')
->setPageTitle('新增商品-选择店铺')
->addMultifield('mult_attribute', '商品', '', ['name'=>'名称','value'=>'值'], '')
->fetch();
}
}

public function checkPackagePrice($mult_attribute){
$empty_num = 0;
foreach ($mult_attribute as $key => $row) {
if (empty($row['attribute_value']) || empty($row['attribute_name'])) {
$empty_num++;
}
}
if ($empty_num > 0) {
$this->error('每个子项的属性名或属性值必填');
}
}
效果图:

TIM截图20171004084505.jpg


TIM截图20171004084440.jpg

 

扩展表格按树状显示

经验分享freebirdy 发表了文章 • 2 个评论 • 577 次浏览 • 2017-08-24 21:05 • 来自相关话题

先看显示效果




 
具体修改方法:
 
第一步:在table的Builder.php里面增加一个方法 setTreeMode/**
* 设置树状表格,此模式建议设置为无分页模式
* @param string $key 唯一标识字段
* @param string $pkey 父结点字段
* @param int $pos 可控制列位置,默认为0,即第一列
* @param int $expand 默认展开层级,默认为1
*/
public function setTreeMode($key = "id", $pkey = "pid", $pos = 0, $expand = 1)
{
if (!empty($key) && !empty($pkey)) {
$this->_vars['tree_mode'] = [
'key' => $key,
'pkey' => $pkey,
'pos' => $pos,
'expand' => $expand,
];
}
return $this;
}第二步:修改table的layout.html
 
找到 tbody元素,加入属性<tbody{present name='tree_mode'} id="tree_table" expand="{$tree_mode.expand|default=1}" pos="{$tree_mode.pos|default=0}"{/present}</tbody>在tbody的循环体的tr里面,加入属性<tr class="{$row['_tr_class']|default=''}"{present name='tree_mode'} id="{$row[$tree_mode['key']]}" pid="{$row[$tree_mode['pkey']]}"{/present}></tr>
第三步:下载附件 treeTable.zip,解压后放至 __LIBS__ 目录,并利用dolphinPHP引入css和js的方法,将相应的JS和CSS文件引入,即可

第四步:加入树特效的执行代码,可以放到layout.html,也可以引入自定义的js文件$('#tree_table').treeTable({
expandLevel:$('#tree_table').attr("expand"),
column:$('#tree_table').attr("pos")
}); 
第五步:在控制器输出表格之前调用 setTreeMode 方法return ZBuilder::make('table')
....
->setTreeMode("id", "pid", 1, 99)
->noPages() //建议使用无分页模式,取数据的时候,一次性将数据取出来
->fetch();

记↓得↓不↓要↓忘↓了↓下↓载↓附↓件!
  查看全部
先看显示效果
1.png

 
具体修改方法:
 
第一步:在table的Builder.php里面增加一个方法 setTreeMode
/**
* 设置树状表格,此模式建议设置为无分页模式
* @param string $key 唯一标识字段
* @param string $pkey 父结点字段
* @param int $pos 可控制列位置,默认为0,即第一列
* @param int $expand 默认展开层级,默认为1
*/
public function setTreeMode($key = "id", $pkey = "pid", $pos = 0, $expand = 1)
{
if (!empty($key) && !empty($pkey)) {
$this->_vars['tree_mode'] = [
'key' => $key,
'pkey' => $pkey,
'pos' => $pos,
'expand' => $expand,
];
}
return $this;
}
第二步:修改table的layout.html
 
找到 tbody元素,加入属性
<tbody{present name='tree_mode'} id="tree_table" expand="{$tree_mode.expand|default=1}" pos="{$tree_mode.pos|default=0}"{/present}</tbody>
在tbody的循环体的tr里面,加入属性
<tr class="{$row['_tr_class']|default=''}"{present name='tree_mode'} id="{$row[$tree_mode['key']]}" pid="{$row[$tree_mode['pkey']]}"{/present}></tr>

第三步:下载附件 treeTable.zip,解压后放至 __LIBS__ 目录,并利用dolphinPHP引入css和js的方法,将相应的JS和CSS文件引入,即可

第四步:加入树特效的执行代码,可以放到layout.html,也可以引入自定义的js文件
$('#tree_table').treeTable({
expandLevel:$('#tree_table').attr("expand"),
column:$('#tree_table').attr("pos")
});
 
第五步:在控制器输出表格之前调用 setTreeMode 方法
return ZBuilder::make('table')
....
->setTreeMode("id", "pid", 1, 99)
->noPages() //建议使用无分页模式,取数据的时候,一次性将数据取出来
->fetch();

记↓得↓不↓要↓忘↓了↓下↓载↓附↓件!
 

【定时/计划任务】模块发布

模块&插件流风回雪 发表了文章 • 30 个评论 • 2325 次浏览 • 2017-07-14 09:11 • 来自相关话题

简介:
 
此模块可以在网站系统的后台管理定时任务,让系统自动的定时的执行SQL,Shell或者请求指定的URL。
任务计划使用与 linux 一致的的 cron 表达式进行配置,所以非常灵活。例如:0 23 ? * MON-FRI 这样配置就可以设置任务在 每周一至周五晚上11点30分 执行计划任务。至于  cron 表达式请自行百度查询!

模块大量抄袭了 FastAdmin 的设计,但 FastAdmin 不能后台查看任务的执行结果,只能在服务器上查看日志文件,而且日志记录还不完整。不过我们还是要感谢FastAdmin作者!
FastAdmin项目地址: git.oschina.net/karson/fastadmin
 
 
应用场景举例:
定时执行SQL,比如定时清理某些日志表;定时访问某个本地路径或者远程的URL,让其做某些工作;定时执行Shell命令,比如定时更新网站搜索引擎的索引。
  

安装流程:
 1. 安装这两个依赖包composer require mtdowling/cron-expression

composer require guzzlehttp/guzzle
说明:
mtdowling/cron-expression 是用来解析、计算 cron 表达式的关键组件;
guzzlehttp/guzzle 用来请求远程 url 的。

2. 安装模块
把模块包解压后放到 application 目录,然后进系统后台安装本模块。
 
3. 把系统入口文件 index.php 改为下面代码
 
DolphinPHP V1.0.8 版本使用下面代码// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();
 
DolphinPHP V1.1.0 以上版本使用下面代码// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/../data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/../thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();
 说明:
把相对路径改成绝对路径的目的是为了使定时任务可以在命令行下的任意位置执行;cli模式下必须关闭系统的路由功能,否则 ThinkPHP 在检查路由的时候会报错,这貌似是 ThinkPHP 的BUG;
 
4. 开启PHP的 shell_exec() 函数
打开 php.ini ,在里面搜索 disable_functions ,然后把等号后面的 shell_exec 删掉执行 /etc/init.d/httpd restart 重启 Apache ,如果是 Nginx 的话执行 /etc/init.d/php-fpm restart 重启 PHP
 
5. 添加一个Linux上的crontab定时任务
执行 crontab -e ,在里面添加一条定时任务,让服务器每1分钟访问一次我们的任务执行接口* * * * * /usr/bin/php /你网站的完整根路径(绝对路径)/index.php /crontab/autotask(1、注意空格;2、注意 DolphinPHP V1.1.0 以上版本入口文件是在 public 目录) 

6. 到网站后台添加任务即可
 
 
截图:





 任务列表





 请求本地路径配置





 配置定时执行SQL





请求远程URL,这里故意把url写错,用来测试请求失败的效果





 执行的任务日志列表





 可以看到,上面请求远程URL的任务内容配置错了,这里执行失败后便记录下了错误内容





 执行Shell命令后记录返回的结果
 

模块包:
适用于 DolphinPHP V1.0.8

crontab_v1_0_8.zip




适用于 DolphinPHP V1.1.0 以上版本

crontab_v1_1_0.zip




从 DolphinPHP 1.0.8 升级到 1.1.0
1、升级时如果用升级包里的 vendor 替换了原系统的 vendor,请检查模块需要的那两个依赖包是否存在,如果被替换或删除了,请重新安装;
2、升级后如果覆盖了 index.php 入口文件,请照文中方法修改;
3、重新下载文中适用于 DolphinPHP V1.1.0 以上版本的模块包进行覆盖(实际上是需要覆盖 /crontab/view/admin/index/add.html 文件和 /crontab/home/Autotask.php 即可)
4、执行 crontab -e 命令,修改 Linux 定时任务中网站系统入口文件的绝对路径,因为 1.1.0 把入口调整到了 public 目录,这里也需要在 index.php 前面加上 public
  
更新日志:
2018-02-21:
1. 修复升级到 Dolphinphp v1.1.0 后本地 URL 任务执行错误问题;
 
2018-01-24:
1. 修改模板文件以支持 DolphinPHP V1.1.0 以上版本;
2. 上文中的安装说明新增 DolphinPHP V1.1.0 以上版本注意事项;

 2017-10-27:
1. 支持 DolphinPHP V1.0.8(V1.0.8以下版本需要删除表格构建器的raw()方法,V1.0.7系统有BUG,所以不支持);
2. 把 rmccue/requests 组件换成 guzzlehttp/guzzle;

 2017-07-15:
1. 更换掉后台任务管理模板的那种蛋疼的写法;
2. 修改任务执行接口上的一个小bug;
 

注意:
 
不支持windows环境 查看全部
简介:
 
此模块可以在网站系统的后台管理定时任务,让系统自动的定时的执行SQL,Shell或者请求指定的URL。
任务计划使用与 linux 一致的的 cron 表达式进行配置,所以非常灵活。例如:0 23 ? * MON-FRI 这样配置就可以设置任务在 每周一至周五晚上11点30分 执行计划任务。至于  cron 表达式请自行百度查询!

模块大量抄袭了 FastAdmin 的设计,但 FastAdmin 不能后台查看任务的执行结果,只能在服务器上查看日志文件,而且日志记录还不完整。不过我们还是要感谢FastAdmin作者!
FastAdmin项目地址: git.oschina.net/karson/fastadmin
 
 
应用场景举例:
  1. 定时执行SQL,比如定时清理某些日志表;
  2. 定时访问某个本地路径或者远程的URL,让其做某些工作;
  3. 定时执行Shell命令,比如定时更新网站搜索引擎的索引。

  

安装流程:
 1. 安装这两个依赖包
composer require mtdowling/cron-expression

composer require guzzlehttp/guzzle

说明:
mtdowling/cron-expression 是用来解析、计算 cron 表达式的关键组件;
guzzlehttp/guzzle 用来请求远程 url 的。

2. 安装模块
把模块包解压后放到 application 目录,然后进系统后台安装本模块。
 
3. 把系统入口文件 index.php 改为下面代码
 
DolphinPHP V1.0.8 版本使用下面代码
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();

 
DolphinPHP V1.1.0 以上版本使用下面代码
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/../data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/../thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();

 说明:
  1. 把相对路径改成绝对路径的目的是为了使定时任务可以在命令行下的任意位置执行;
  2. cli模式下必须关闭系统的路由功能,否则 ThinkPHP 在检查路由的时候会报错,这貌似是 ThinkPHP 的BUG;

 
4. 开启PHP的 shell_exec() 函数
  1. 打开 php.ini ,在里面搜索 disable_functions ,然后把等号后面的 shell_exec 删掉
  2. 执行 /etc/init.d/httpd restart 重启 Apache ,如果是 Nginx 的话执行 /etc/init.d/php-fpm restart 重启 PHP

 
5. 添加一个Linux上的crontab定时任务
执行 crontab -e ,在里面添加一条定时任务,让服务器每1分钟访问一次我们的任务执行接口
* * * * * /usr/bin/php /你网站的完整根路径(绝对路径)/index.php /crontab/autotask
(1、注意空格;2、注意 DolphinPHP V1.1.0 以上版本入口文件是在 public 目录) 

6. 到网站后台添加任务即可
 
 
截图:

QQ截图20170714082128.png

 任务列表

QQ截图20170714082222.png

 请求本地路径配置

QQ截图20170714082359.png

 配置定时执行SQL

QQ截图20170714082450.png

请求远程URL,这里故意把url写错,用来测试请求失败的效果

QQ截图20170714082525.png

 执行的任务日志列表

QQ截图20170714082608.png

 可以看到,上面请求远程URL的任务内容配置错了,这里执行失败后便记录下了错误内容

QQ截图20170714082633.png

 执行Shell命令后记录返回的结果
 

模块包:
适用于 DolphinPHP V1.0.8



适用于 DolphinPHP V1.1.0 以上版本



从 DolphinPHP 1.0.8 升级到 1.1.0
1、升级时如果用升级包里的 vendor 替换了原系统的 vendor,请检查模块需要的那两个依赖包是否存在,如果被替换或删除了,请重新安装;
2、升级后如果覆盖了 index.php 入口文件,请照文中方法修改;
3、重新下载文中适用于 DolphinPHP V1.1.0 以上版本的模块包进行覆盖(实际上是需要覆盖 /crontab/view/admin/index/add.html 文件和 /crontab/home/Autotask.php 即可)
4、执行 crontab -e 命令,修改 Linux 定时任务中网站系统入口文件的绝对路径,因为 1.1.0 把入口调整到了 public 目录,这里也需要在 index.php 前面加上 public
  
更新日志:
2018-02-21:
1. 修复升级到 Dolphinphp v1.1.0 后本地 URL 任务执行错误问题;
 
2018-01-24:
1. 修改模板文件以支持 DolphinPHP V1.1.0 以上版本;
2. 上文中的安装说明新增 DolphinPHP V1.1.0 以上版本注意事项;

 2017-10-27:
1. 支持 DolphinPHP V1.0.8(V1.0.8以下版本需要删除表格构建器的raw()方法,V1.0.7系统有BUG,所以不支持);
2. 把 rmccue/requests 组件换成 guzzlehttp/guzzle;

 2017-07-15:
1. 更换掉后台任务管理模板的那种蛋疼的写法;
2. 修改任务执行接口上的一个小bug;
 

注意:
 
不支持windows环境

环迅支付插件

模块&插件cklnk 发表了文章 • 0 个评论 • 834 次浏览 • 2017-06-30 14:18 • 来自相关话题

调用
 $payment_data = [
'GoodsName' => '充值',
'MerBillNo' => '订单号',
'Amount' => '金额',
'Attach' => '备注',
'Merchanturl' => '',
'ServerUrl' => '',
'UserRealName' => '',//自动注册
'UserId' => '',//自动注册
];
plugin_action('Ipspay/Ipspay/payment', [$payment_data, 'h5']);

解压到plugins文件夹下即可 查看全部

QQ截图20170630141641.jpg

调用
 
$payment_data = [
'GoodsName' => '充值',
'MerBillNo' => '订单号',
'Amount' => '金额',
'Attach' => '备注',
'Merchanturl' => '',
'ServerUrl' => '',
'UserRealName' => '',//自动注册
'UserId' => '',//自动注册
];
plugin_action('Ipspay/Ipspay/payment', [$payment_data, 'h5']);


解压到plugins文件夹下即可

IIS 7.下面URL Rewrite的路由配置

经验分享小兔言言 发表了文章 • 0 个评论 • 447 次浏览 • 2017-06-28 22:17 • 来自相关话题

海豚PHP的源码Rewrite配置是针对Linux下面的Apache设置的.htaccess,但是像我使用的是Windows Server IIS 7的用户来说,需要手动设置URL Rewrite的规则,才可以使得前台通过index.php路由访问正常,具体的做法很简单,安装好Rewrite组件后,在网站根目录下新建一个web.config,然后复制以下内容,保存后,前台即可路由正常了
<?xml version="1.0" encoding="UTF-8"?>  
<configuration>  
  <system.webServer>  
    <rewrite>  
      <rules>  
        <rule name="thinkPhp" enabled="true" stopProcessing="true">  
          <match url=".*" />  
          <conditions logicalGrouping="MatchAll">  
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />  
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />  
          </conditions>  
          <action type="Rewrite" url="index.php/{R:0}" />  
        </rule>  
      </rules>  
    </rewrite>  
  </system.webServer>  
</configuration> 查看全部
海豚PHP的源码Rewrite配置是针对Linux下面的Apache设置的.htaccess,但是像我使用的是Windows Server IIS 7的用户来说,需要手动设置URL Rewrite的规则,才可以使得前台通过index.php路由访问正常,具体的做法很简单,安装好Rewrite组件后,在网站根目录下新建一个web.config,然后复制以下内容,保存后,前台即可路由正常了
<?xml version="1.0" encoding="UTF-8"?>  
<configuration>  
  <system.webServer>  
    <rewrite>  
      <rules>  
        <rule name="thinkPhp" enabled="true" stopProcessing="true">  
          <match url=".*" />  
          <conditions logicalGrouping="MatchAll">  
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />  
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />  
          </conditions>  
          <action type="Rewrite" url="index.php/{R:0}" />  
        </rule>  
      </rules>  
    </rewrite>  
  </system.webServer>  
</configuration>

PHPMailer邮件类插件

模块&插件july 发表了文章 • 2 个评论 • 806 次浏览 • 2017-06-27 13:49 • 来自相关话题

看到SwiftMailer似乎大概也许好像需要php: >=7.0.0,所以做了一个PHPMailer插件类
 
安装此插件前,请先使用命令composer require phpmailer/phpmailer 安装PHPMailer
 





 public function send_phpmailer(){
$res = PHPMailer::send_email('测试宝宝','测试内容','to_user_emial','alias');
dump($res);
}
  查看全部
看到SwiftMailer似乎大概也许好像需要php: >=7.0.0,所以做了一个PHPMailer插件类
 
安装此插件前,请先使用命令composer require phpmailer/phpmailer 安装PHPMailer
 

TIM图片20170627130540.png

 
public function send_phpmailer(){
$res = PHPMailer::send_email('测试宝宝','测试内容','to_user_emial','alias');
dump($res);
}

 

SwiftMailer邮件类插件

模块&插件july 发表了文章 • 0 个评论 • 465 次浏览 • 2017-06-27 13:11 • 来自相关话题

需要用邮件所以做了个初版的SwiftMailer邮件类插件,静态方法调用

 
安装此插件前,请先使用命令composer require swiftmailer/swiftmailer 安装SwiftMailer
 





测试方法public function send_email(){
$res = SwiftMailer::send_email('测试宝宝','测试内容',to_user_emial);
dump($res);
} 查看全部
需要用邮件所以做了个初版的SwiftMailer邮件类插件,静态方法调用

 
安装此插件前,请先使用命令composer require swiftmailer/swiftmailer 安装SwiftMailer
 
TIM图片20170627130540.png


测试方法
public function send_email(){
$res = SwiftMailer::send_email('测试宝宝','测试内容',to_user_emial);
dump($res);
}

支付宝插件

模块&插件cklnk 发表了文章 • 2 个评论 • 950 次浏览 • 2017-06-23 14:57 • 来自相关话题

调用$data = [
'out_trade_no'=>time(),
'price'=>1,
'subject'=>'测试',
'show_url'=>'不能发连接',
'notify_url'=>'不能发连接',
'return_url'=>'不能发连接',
];
plugin_action('Alipay/Alipay/alipay', $data);
 解压到plugins文件夹下即可
  查看全部
QQ截图20170623145542.jpg

调用
$data = [
'out_trade_no'=>time(),
'price'=>1,
'subject'=>'测试',
'show_url'=>'不能发连接',
'notify_url'=>'不能发连接',
'return_url'=>'不能发连接',
];
plugin_action('Alipay/Alipay/alipay', $data);

 解压到plugins文件夹下即可
 

百度合成语音插件,初学初试,请各位指教

模块&插件july 发表了文章 • 0 个评论 • 564 次浏览 • 2017-06-20 17:52 • 来自相关话题

初学初试,试做了一个语音插件,可以使用,不知道代码是否臃肿,有更好的方法请各位指点迷津






根据百度合成语音的文档把基本能用的参数作为配置
因为是根据api测试的,所以报错直接$this->result();
 
下面是测试方法,请先引入use plugins\BaiduTTS\controller\BaiduTTS;测试方法public function test_tts(Request $request){
$msg = $request->param('msg');
$tts = new BaiduTTS();
$file = $tts->send($msg);
if (empty($file) || $file === false){
$this->result(null,400,'error','json');
}
$this->result(['audio'=>$file],200,'success','json');
}
在浏览器输入中文正常,postman中输入中文pathinfo接收到的参数似乎转码了,以 ? 的get参数能正常
还请各位多指教啦
  查看全部
初学初试,试做了一个语音插件,可以使用,不知道代码是否臃肿,有更好的方法请各位指点迷津

TIM图片20170620174657.png


根据百度合成语音的文档把基本能用的参数作为配置
因为是根据api测试的,所以报错直接$this->result();
 
下面是测试方法,请先引入
use plugins\BaiduTTS\controller\BaiduTTS;
测试方法
public function test_tts(Request $request){
$msg = $request->param('msg');
$tts = new BaiduTTS();
$file = $tts->send($msg);
if (empty($file) || $file === false){
$this->result(null,400,'error','json');
}
$this->result(['audio'=>$file],200,'success','json');
}

在浏览器输入中文正常,postman中输入中文pathinfo接收到的参数似乎转码了,以 ? 的get参数能正常
还请各位多指教啦
 

thinkphp+TCPDF生成PDF文件,最新版TCPDF6.2.13,熟肉!即拿即用

经验分享xin5288 发表了文章 • 1 个评论 • 533 次浏览 • 2017-06-07 17:33 • 来自相关话题

thinkphp+TCPDF生成PDF文件,最新版TCPDF6.2.13,熟肉!即拿即用!
 
新建文件夹 /    extend    /    Tcpdf
 
将附件压缩包内的东西解压到/    extend    /    Tcpdf
 
使用方法
use tcpdf\Tcpdf;

class PDF extends Common
{
public function index()
{
// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Nicola Asuni');
$pdf->SetTitle('TCPDF Example 001');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, test, guide');

// set default header data
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING, array(0,64,255), array(0,64,128));
$pdf->setFooterData(array(0,64,0), array(0,64,128));

// set header and footer fonts
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

// set some language-dependent strings (optional)
if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
require_once(dirname(__FILE__).'/lang/eng.php');
$pdf->setLanguageArray($l);
}

// ---------------------------------------------------------

// set default font subsetting mode
$pdf->setFontSubsetting(true);

// Set font
// dejavusans is a UTF-8 Unicode font, if you only need to
// print standard ASCII chars, you can use core fonts like
// helvetica or times to reduce file size.
$pdf->SetFont('dejavusans', '', 14, '', true);

// Add a page
// This method has several options, check the source code documentation for more information.
$pdf->AddPage();

// set text shadow effect
$pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));

// Set some content to print
$html = <<<EOD
<h1>Welcome to <a href="h提提p://www点tcpdf点org" style="text-decoration:none;background-color:#CC0000;color:black;"> <span style="color:black;">TC</span><span style="color:white;">PDF</span> </a>!</h1>
<i>This is the first example of TCPDF library.</i>
<p>This text is printed using the <i>writeHTMLCell()</i> method but you can also use: <i>Multicell(), writeHTML(), Write(), Cell() and Text()</i>.</p>
<p>Please check the source code documentation and other examples for further information.</p>
<p style="color:#CC0000;">TO IMPROVE AND EXPAND TCPDF I NEED YOUR SUPPORT, PLEASE <a href="h提提p://sourceforge点net/donate/index

php?group_id=128076">MAKE A DONATION!</a></p>
EOD;

// Print text using writeHTMLCell()
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);

// ---------------------------------------------------------

// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output('example_001.pdf', 'I');

//============================================================+
// END OF FILE
//============================================================+
}
} 查看全部
thinkphp+TCPDF生成PDF文件,最新版TCPDF6.2.13,熟肉!即拿即用!
 
新建文件夹 /    extend    /    Tcpdf
 
将附件压缩包内的东西解压到/    extend    /    Tcpdf
 
使用方法
use tcpdf\Tcpdf;

class PDF extends Common
{
public function index()
{
// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Nicola Asuni');
$pdf->SetTitle('TCPDF Example 001');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, test, guide');

// set default header data
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING, array(0,64,255), array(0,64,128));
$pdf->setFooterData(array(0,64,0), array(0,64,128));

// set header and footer fonts
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

// set some language-dependent strings (optional)
if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
require_once(dirname(__FILE__).'/lang/eng.php');
$pdf->setLanguageArray($l);
}

// ---------------------------------------------------------

// set default font subsetting mode
$pdf->setFontSubsetting(true);

// Set font
// dejavusans is a UTF-8 Unicode font, if you only need to
// print standard ASCII chars, you can use core fonts like
// helvetica or times to reduce file size.
$pdf->SetFont('dejavusans', '', 14, '', true);

// Add a page
// This method has several options, check the source code documentation for more information.
$pdf->AddPage();

// set text shadow effect
$pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));

// Set some content to print
$html = <<<EOD
<h1>Welcome to <a href="h提提p://www点tcpdf点org" style="text-decoration:none;background-color:#CC0000;color:black;"> <span style="color:black;">TC</span><span style="color:white;">PDF</span> </a>!</h1>
<i>This is the first example of TCPDF library.</i>
<p>This text is printed using the <i>writeHTMLCell()</i> method but you can also use: <i>Multicell(), writeHTML(), Write(), Cell() and Text()</i>.</p>
<p>Please check the source code documentation and other examples for further information.</p>
<p style="color:#CC0000;">TO IMPROVE AND EXPAND TCPDF I NEED YOUR SUPPORT, PLEASE <a href="h提提p://sourceforge点net/donate/index

php?group_id=128076">MAKE A DONATION!</a></p>
EOD;

// Print text using writeHTMLCell()
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);

// ---------------------------------------------------------

// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output('example_001.pdf', 'I');

//============================================================+
// END OF FILE
//============================================================+
}
}

开发模块

模块&插件yangweijie 发表了文章 • 5 个评论 • 1040 次浏览 • 2017-05-29 12:06 • 来自相关话题

因为新建模块和插件要手动建很多目录结构,所以按照onethink原来就有的快速创建插件功能,写了dp的 快速创建功能,




同时移植了laravel-admin 的 脚手架里的 database 。目前只支持一个数据库。




 
使用方法,将附件dev 压缩包 解压到dev 目录,然后放入application模块目录里去,将dev目录里的public 覆盖根目录public里去。其实就是用了codemirror插件。
 
装好后,在cmd 切换到应用根目录,里 执行 composer 安装   symfony/console,  symfony/var-dumper  这两个组件,最后在 应用的函数库里 添加以下代码use Symfony\Component\VarDumper\VarDumper;
if (!function_exists('vardump')) {
/**
* @author Nicolas Grekas <p@tchwork.com>
*/
function vardump($var)
{
foreach (func_get_args() as $var) {
VarDumper::dump($var);
}
}
}然后装好模块就可以使用该模块的功能了。如果有使用问题,请论坛@我
  查看全部
因为新建模块和插件要手动建很多目录结构,所以按照onethink原来就有的快速创建插件功能,写了dp的 快速创建功能,
TIM截图20170529104719.png

同时移植了laravel-admin 的 脚手架里的 database 。目前只支持一个数据库。
TIM截图20170529104806.png

 
使用方法,将附件dev 压缩包 解压到dev 目录,然后放入application模块目录里去,将dev目录里的public 覆盖根目录public里去。其实就是用了codemirror插件。
 
装好后,在cmd 切换到应用根目录,里 执行 composer 安装   symfony/console,  symfony/var-dumper  这两个组件,最后在 应用的函数库里 添加以下代码
use Symfony\Component\VarDumper\VarDumper;
if (!function_exists('vardump')) {
/**
* @author Nicolas Grekas <p@tchwork.com>
*/
function vardump($var)
{
foreach (func_get_args() as $var) {
VarDumper::dump($var);
}
}
}
然后装好模块就可以使用该模块的功能了。如果有使用问题,请论坛@我
 

轻量级Dolphin微信插件

模块&插件herd21 发表了文章 • 3 个评论 • 1733 次浏览 • 2017-05-24 05:47 • 来自相关话题

拒绝庞然大物 我只要又轻又快! - Dolphin WeChatSDK 1.0.0

        作为一名Composer重度患者,我当然承认Composer是时下最快最爽的包管理方式,但是有时候Composer会为我们带来大量的依赖链,仅仅因为使用了其他包内极少数的几个功能,无奈之下必须加载长长一串甚至有时多达3-5M的依赖包,然而我只是想弄一个微信登录,我真的有必要安装这么多我连看都看不懂的包么?
 
        答案当然是No,这次为大家带来了一款又快又爽的轻量级WeChatSDK,整个插件包大小不到250k,仅20个文件,完整的实现了微信SDK的封装,麻雀虽小五脏俱全,使用方便友好,超乎你的想象!
 
        介绍一下使用条件:
PHP Version > 5.4Curl支持拥有一个微信公众号
 
          还有安装方法:
下载末尾附带的WeChatSDK.zip将压缩包解压到项目的plugins目录进入后台配置AppKey/AppSecret/Token等参数开始享受潇洒的微信开发之旅
 
        还有一个简单的例子:// 引入插件包类库
use plugins\WeChatSDK\controller\WeChat;

// 发起微信授权
WeChat::instance()->Oauth_Redirect('yourCallbackUrl',true);

// 在Callback内获取用户信息
WeChat::instance()->Oauth_UserInfo();
        是的没错,仅此三步,就获得了微信用户授权后的用户信息
 
        另外还有一些事情:
在插件的Wechat文件夹下,按微信开发平台的模块封装了类库例如:WechatUser 类封装了用户管理相关的操作方法操作方法的类库都可以通过插件提供的load_wechat方法实现单例加载
// 以单例模式取得了WechatUser类的实例化对象
$UserObj = WeChat::instance()->load_wechat('User');

// 批量获取关注公众号的粉丝列表
$UserList = $UserObj->getUserList();
        更多的操作请查看类文件,注释是最好的帮助手册!特别感谢开源微信SDK类库 zoujingli/wechat-php-sdk 开源不只是口号,更是一种态度!
 
        下载地址: 查看全部


拒绝庞然大物 我只要又轻又快! - Dolphin WeChatSDK 1.0.0


        作为一名Composer重度患者,我当然承认Composer是时下最快最爽的包管理方式,但是有时候Composer会为我们带来大量的依赖链,仅仅因为使用了其他包内极少数的几个功能,无奈之下必须加载长长一串甚至有时多达3-5M的依赖包,然而我只是想弄一个微信登录,我真的有必要安装这么多我连看都看不懂的包么?
 
        答案当然是No,这次为大家带来了一款又快又爽的轻量级WeChatSDK,整个插件包大小不到250k,仅20个文件,完整的实现了微信SDK的封装,麻雀虽小五脏俱全,使用方便友好,超乎你的想象!
 
        介绍一下使用条件:
  • PHP Version > 5.4
  • Curl支持
  • 拥有一个微信公众号

 
          还有安装方法:
  1. 下载末尾附带的WeChatSDK.zip
  2. 将压缩包解压到项目的plugins目录
  3. 进入后台配置AppKey/AppSecret/Token等参数
  4. 开始享受潇洒的微信开发之旅

 
        还有一个简单的例子:
// 引入插件包类库
use plugins\WeChatSDK\controller\WeChat;

// 发起微信授权
WeChat::instance()->Oauth_Redirect('yourCallbackUrl',true);

// 在Callback内获取用户信息
WeChat::instance()->Oauth_UserInfo();

        是的没错,仅此三步,就获得了微信用户授权后的用户信息
 
        另外还有一些事情:
  • 在插件的Wechat文件夹下,按微信开发平台的模块封装了类库
  • 例如:WechatUser 类封装了用户管理相关的操作方法
  • 操作方法的类库都可以通过插件提供的load_wechat方法实现单例加载

// 以单例模式取得了WechatUser类的实例化对象
$UserObj = WeChat::instance()->load_wechat('User');

// 批量获取关注公众号的粉丝列表
$UserList = $UserObj->getUserList();

        更多的操作请查看类文件,注释是最好的帮助手册!特别感谢开源微信SDK类库 zoujingli/wechat-php-sdk 开源不只是口号,更是一种态度!
 
        下载地址:

高德地图Dolphin插件

模块&插件herd21 发表了文章 • 4 个评论 • 863 次浏览 • 2017-05-21 16:44 • 来自相关话题

当前版本:v1.0 beta
封装了高德地图部分常用的API以便在项目中调用,使用方法参考注释,不详之处请参考高德开放平台WebServiceAPI开发者手册,再次感谢您关注本插件,开源是一种态度,享受开源生态,让我们共同为开源项目贡献一份微薄的力量!

 注意事项:
请自行注册高德地图APIKey,如选择了数字签名加密,请在后台开启数字签名并填写签名密钥调用时可以使用海豚提供的 plugin_action 助手函数,如果需要进行多项操作,建议直接实例化本插件类进行使用,使用了本插件的模块请注意声明插件依赖关系因手头项目开发时间较紧,本插件暂未封装所有的API,仅封装了作者项目中用到的API,如果有您需要使用但是没有封装的,可以在插件基础上自行封装,作者项目完工后会补充封装在使用中遇到Bug请在下方跟帖以便修复
 
封装进度:
(√)地理/逆地理编码(√)行政区域查询(√)IP定位(√)静态地图(√)天气查询路径规划搜索抓路服务批量请求接口坐标转换输入提示交通态势地理围栏
更新记录:
v1.0.1 将curl的初始化移动到类构造函数加快请求速度,避免重复初始化 
插件下载:
  查看全部


当前版本:v1.0 beta
封装了高德地图部分常用的API以便在项目中调用,使用方法参考注释,不详之处请参考高德开放平台WebServiceAPI开发者手册,再次感谢您关注本插件,开源是一种态度,享受开源生态,让我们共同为开源项目贡献一份微薄的力量!


 注意事项:
  • 请自行注册高德地图APIKey,如选择了数字签名加密,请在后台开启数字签名并填写签名密钥
  • 调用时可以使用海豚提供的 plugin_action 助手函数,如果需要进行多项操作,建议直接实例化本插件类进行使用,使用了本插件的模块请注意声明插件依赖关系
  • 因手头项目开发时间较紧,本插件暂未封装所有的API,仅封装了作者项目中用到的API,如果有您需要使用但是没有封装的,可以在插件基础上自行封装,作者项目完工后会补充封装
  • 在使用中遇到Bug请在下方跟帖以便修复

 
封装进度:
  • (√)地理/逆地理编码
  • (√)行政区域查询
  • (√)IP定位
  • (√)静态地图
  • (√)天气查询
  • 路径规划
  • 搜索
  • 抓路服务
  • 批量请求接口
  • 坐标转换
  • 输入提示
  • 交通态势
  • 地理围栏

更新记录:
  • v1.0.1 将curl的初始化移动到类构造函数加快请求速度,避免重复初始化 

插件下载:
 

【微信】开发模块发布

模块&插件caiaiqiu 回复了问题 • 22 人关注 • 11 个回复 • 3273 次浏览 • 2018-06-06 09:41 • 来自相关话题

DolphinPHP 框架 Excel 插件 《导出 Excel 教程》

经验分享tlerbao 发表了文章 • 4 个评论 • 1934 次浏览 • 2017-03-16 21:56 • 来自相关话题

原文链接:miaoqiang.name/archives/dolphinphp-excel-plugins.html
 
 下载插件:
 
请自行到群文件下载 Excel 导入导出插件。
 
安装插件:
 
将插件目录移动到 /plugins 目录下,并访问后台 系统 > 扩展中心 > 插件管理 > 安装 Excel 插件。
 
导出 Excel 代码示例
  public function export()
{
// 查询数据
$data = LevelModel::all();
// 设置表头信息(对应字段名,宽度,显示表头名称)
$cellName = [
['id', 'auto', 'ID'],
['name', 'auto', '级别名称'],
['score', 'auto', '积分要求'],
['discount', 'auto', '享受折扣'],
['create_time', 'auto', '创建时间'],
['update_time', 'auto', '更新时间']
];
// 调用插件(传入插件名,[导出文件名、表头信息、具体数据])
plugin_action('Excel/Excel/export', ['test', $cellName, $data]);
}
PS:so easy,下篇是 《导入 Excel 教程》,坑什么时候填不知道。 查看全部
原文链接:miaoqiang.name/archives/dolphinphp-excel-plugins.html
 
 下载插件:
 
请自行到群文件下载 Excel 导入导出插件。
 
安装插件:
 
将插件目录移动到 /plugins 目录下,并访问后台 系统 > 扩展中心 > 插件管理 > 安装 Excel 插件。
 
导出 Excel 代码示例
 
    public function export()
{
// 查询数据
$data = LevelModel::all();
// 设置表头信息(对应字段名,宽度,显示表头名称)
$cellName = [
['id', 'auto', 'ID'],
['name', 'auto', '级别名称'],
['score', 'auto', '积分要求'],
['discount', 'auto', '享受折扣'],
['create_time', 'auto', '创建时间'],
['update_time', 'auto', '更新时间']
];
// 调用插件(传入插件名,[导出文件名、表头信息、具体数据])
plugin_action('Excel/Excel/export', ['test', $cellName, $data]);
}

PS:so easy,下篇是 《导入 Excel 教程》,坑什么时候填不知道。