0%

php实现简单的excel导出案例如下,能很方便、便捷的导出所需数据,性能比较好;如需定制化导出,比如需要设置行高宽度、颜色填充、居中等效果建议使用PHPExcel插件去做,该插件具有更强大的定制化功能,能满足你各种样式需求

以下是php导出代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public function exportcos() {
set_time_limit(0); // 设置长时执行
ini_set('memory_limit', '512M'); // 设置执行内存
$fileName = date('ymd').'_cos.csv'; // 导出的excel文件名
//设置header头
header('Content-Description: File Transfer');
header("Content-Type: application/vnd.ms-excel;charset=UTF-8");
header('Content-Disposition: attachment;filename="' . $fileName . '"');
header('Expires: 0');
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') === false) {
header('Cache-Control: no-cache');
header('Pragma: no-cache');
} else {
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
}
//打开php数据输入缓冲区
$fp = fopen('php://output', 'ab');
$header = ['序号','姓名','性别','学校','班级']; // 设置excel表头
fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
fputcsv($fp, $header);


// 数据列表处理
for ($i = 1; $i <= 50000; $i++) { // 如是真实查询数据,加入筛选条件得到过滤后需要的数据
$item['id'] = $i;
$item['name'] = "谢晨奕";
$item['sex'] = "女";
$item['school'] = "璞普幼儿园";
$item['class'] = "中二班";
fputcsv($fp, $item); // 写一行excel
}
fclose($fp); // 最后关闭缓冲区
}

可能是因为slim框架大家使用少,加上官方文档也非常的简单,这里整理一下slim4所有所有路由的方式;问:为什么要获取所有的路由? 答:肯定是用来做权限控制啦~~~

路由设置

本文的方式在通过中间件的方式去获取所有路由,在用户登录的时候会触发中间件去整理所有的路由

1
2
3
4

$app->group('/admin', function(Group $group) use ($app){
$group->post('/go_login', LoginController::class.':login')->addMiddleware(new AuthNodesMiddleware($app));
});
阅读全文 »

1、登录失效如何跳转外层页面

当登录失效时,如果使用header(“location:/admin/login”);的方式跳转,就会在内层页面跳转到登录页面,体验非常不好,正确应该使用下面的跳转能跳转到外层页面的登录

1
exit('<script>top.location.href= "/admin/login"</script>'); 

2、如何弹窗页面保存完后跳转并刷新父级页面

1
2
3
4
5
6
// 获得frame索引
var index = parent.layer.getFrameIndex(window.name);
//关闭当前frame
parent.layer.close(index);
// 父页面刷新
parent.location.reload();

3、弹窗页面如何更好的提交体验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//监听提交
form.on('submit(add)', function(data){
console.log(data);
var a = true;

$.post('/admin/menu_save', data.field, function(res){
res = JSON.parse(res);
if(res.success){
// 获得frame索引
var index = parent.layer.getFrameIndex(window.name);
//关闭当前frame
parent.layer.close(index);
// 父页面刷新
parent.location.reload();
return false;
} else {
layer.msg(res.msg)
return false;
}
});
return false; // 这个return false一定要加
});

在用x-admin前端模板的时候,发现了一个问题,对于左侧的菜单栏,如果点击之后(即菜单页为展开)再退出了系统,重新登录后,发现菜单栏和退出时是一样的

而我们的要求是在刷新或者重新登录后,需要清除左侧菜单的选中效果

清除选中

我们只需要在页面加载的地方加如下js代码:

1
2
3
//清除缓存
sessionStorage.clear();
localStorage.clear();

手动添加选中

但是现在又有问题了,清除完缓存之后,就发现任何的标签页都没有被选中,真的好丑,解决这个问题很简单,只要在x-admin模板中找到相应的菜单栏,找到初始管理相对应的a标签

1
2
3
4
5
6
7
<li>
<a onclick="xadmin.add_tab('首页','/admin/wel')" class="active">
<i class="iconfont left-nav-li" lay-tips="首页">&#xe6b8;</i>
<cite>首页</cite>
<i class="iconfont nav_right">&#xe697;</i>
</a>
</li>

x-admin的原生是没有页面刷新(外层)清除tab的,而且是刷新后会停留在最后一个tab上,体验不是很好,这里做下更改

因为tab部分的代码全部是由js生成的,需要在body上添加一个事件(onbeforeunload)去触发

onbeforeunload

在即将离开当前页面(刷新或关闭)时执行 JavaScript :

1
<body onbeforeunload="return myFunction()">

将 放在外层iframe里面

代码实例

1
<body class="index" onbeforeunload="close_tabs()"> <!--在即将离开当前页面(刷新或关闭)时执行 JavaScript :-->
1
2
3
4
5
function close_tabs(){
$('.layui-tab-title li[lay-id]').find('.layui-tab-close').click();
$('#tab_right').hide();
$('#tab_show').hide();
}

搞定!也可以在退出、切换账号的时候触发这个关闭所有tab

本文通过php代码通过抖音链接去获取抖音无水印视频,也可以批量获取下载抖音视频,禁止转载

请求过程分析

我们还是先获取一个抖音链接

1
https://v.douyin.com/S2pF3G8/

通过访问重定向

1
https://www.douyin.com/video/7190042191169883427

然后提取到其中的视频ID

1
7190042191169883427

URL参数X-Bogus

X-Bogus你可以理解为是一个根据视频ID及user-agent通过JS生成的用户信息参数,它可以用于校验,详细的一篇分析可以参考Freebuf上的《【JS 逆向百例】某音 X-Bogus 逆向分析,JSVMP 纯算法还原》

X-Bogus简单的理解就是通过js算法生成的一个秘钥,抖音通过这个秘钥能得到身份验证

文章后面会详细介绍X-Bogus的获取

阅读全文 »

本文只针对于centos7以上系统

supervisor简介

supervisor是一个用python语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制。

supervisor 会涉及三个重要的命令

  • supervisord

运行supervisor时会启动一个进程supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启

  • supervisorctl

可以理解成supervisor的客户端,upervisorctl是命令行管理工具,可以用如下命令来进行子进程的管理

  • echo_supervisord_conf

用来生成默认的配置文件,一般生成默认文件为 supervisor.conf

supervisor是用python写的运行在linux下的进程管理工具,安装supervisor的时候依赖 python的一些包,它依赖:python、setuptools、meld3

阅读全文 »

问题描述

docker创建的容器内部无法访问网络

解决方案

在容器内部执行

1
echo "nameserver 114.114.114.114" >> /etc/resolv.conf

问题描述

用redis作 消息队列,php连接redis,用brpop函数消费队列时,60秒连接会自动断开,报错:read error on connection

redis

原因分析

查看了下php.ini文件里面有个参数default_socket_timeout = 60,就是这个配置导致redis过60秒会自动断开。
这个配置是什么意思?default_socket_timeout是socket流的超时参数,即socket流从建立到传输再到关闭整个过程必须要在这个参数设置的时间以内完成,如果不能完成,那么PHP将自动结束这个socket并返回一个警告。

阅读全文 »