0%

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并返回一个警告。

阅读全文 »

内容概述

php使用rabbitMQ做消息队列,这是一种常见的异步的工作方式,在很多的工作场景都能遇到,在阅读该文章之前,需要提前了解rabbitMQ的工作原理以及下面的几种工作模式,这样更有助于阅读这篇文章,以下代码是通过自行封装对amqplib的各种模式的使用,便于记忆,在此记录。

composer安装扩展

1
2
composer安装
composer require PHP-amqplib/PHP-amqplib
阅读全文 »

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
/**
* @todo 敏感词过滤,返回结果
* @param array $list 定义敏感词一维数组
* @param string $string 要过滤的内容
* @return string $log 处理结果
*/

function sensitive($list, $string){
$count = 0; //违规词的个数
$sensitiveWord = ''; //违规词
$stringAfter = $string; //替换后的内容
$pattern = "/".implode("|",$list)."/i"; //定义正则表达式
if(preg_match_all($pattern, $string, $matches)){ //匹配到了结果
$patternList = $matches[0]; //匹配到的数组
$count = count($patternList);
$sensitiveWord = implode(',', $patternList); //敏感词数组转字符串
$replaceArray = array_combine($patternList,array_fill(0,count($patternList),'*')); //把匹配到的数组进行合并,替换使用
$stringAfter = strtr($string, $replaceArray); //结果替换
}
$log = "原句为 [ {$string} ]<br/>";
if($count==0){
$log .= "暂未匹配到敏感词!";
}else{
$log .= "匹配到 [ {$count} ]个敏感词:[ {$sensitiveWord} ]<br/>".
"替换后为:[ {$stringAfter} ]";
}
return $log;
}
阅读全文 »

服务端

Notify.php

1
2
3
4
5
6
//获取通知消息
public function getNotifyCount()
{
$msg = db('message_logs')->where('isscan',0)->count();
RestfulTools::restData($msg); //这里是封装好的json_encode方法
}

前端

notify.js

1
2
3
<span class="am-icon-envelope-o"></span> 消息 <span class="am-badge am-badge-warning" id="msgCount"> 
{$msgCount} //这是是通过tp的 assign方法分配过来的变量,作为初始值
</span>
阅读全文 »