王新阳

wangxinyang

未解之谜

百度搜索算法规范详解https://zy.baidu.com/act/guide?isResponsible=1

百度搜索优化知识大全https://zy.baidu.com/act/seo?isResponsible=1

阿里云开发者课堂 https://edu.aliyun.com/

spark-md5.js 计算文件md5值 :https://github.com/satazor/js-spark-md5

一个提供用户脚本的网站
https://greasyfork.org/zh-CN

用户脚本管理器:Tampermonkey中文文档
https://www.cnblogs.com/grubber/p/12560522.html

Js上传插件 Plupload

drupal

嵌入式WEB开发

CSRF 漏洞

fopen漏洞

Python
阿里云大学PYTHON学习路线
https://edu.aliyun.com/roadmap/python

ThinkPHP list_to_tree、tree_to_list、list_search

vue.js

C盘可以删除的临时文件,也可以用系统自带的磁盘清理程序清除
C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp
C:\Windows\SoftwareDistribution\Download
https://support.microsoft.com/zh-cn/windows?ui=zh-CN&rs=zh-CN&ad=CN
https://support.microsoft.com/zh-cn/windows/%E9%87%8A%E6%94%BE-windows-10-%E4%B8%AD%E7%9A%84%E9%A9%B1%E5%8A%A8%E5%99%A8%E7%A9%BA%E9%97%B4-85529ccb-c365-490d-b548-831022bc9b32

php获取指定目录的所有子孙目录

方法一:scandir + 递归

function getAllSubdirectories($path) {
    $subdirs = [];
    
    $items = scandir($path);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') continue;
        
        $fullPath = $path . DIRECTORY_SEPARATOR . $item;
        if (is_dir($fullPath)) {
            // 添加当前目录
            $subdirs[] = $fullPath;
            // 递归获取子目录的子目录
            $subdirs = array_merge($subdirs, getAllSubdirectories($fullPath));
        }
    }
    
    return $subdirs;
}

// 使用示例
$allSubdirs = getAllSubdirectories('/path/to/directory');
print_r($allSubdirs);

方法二:使用 RecursiveDirectoryIterator(推荐)

function getAllSubdirectoriesIterator($path) {
    $subdirs = [];
    
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::SELF_FIRST
    );
    
    foreach ($iterator as $fileinfo) {
        if ($fileinfo->isDir()) {
            $subdirs[] = $fileinfo->getPathname();
        }
    }
    
    return $subdirs;
}

// 使用示例
$allSubdirs = getAllSubdirectoriesIterator('/path/to/directory');
print_r($allSubdirs);

layui.prompt 监听回车键来触发确认操作

layer.prompt({
	title: '请输入密码:',
	formType: 1,
	success: function(layero, index){
		$(layero).find('.layui-layer-input').prop('autocomplete','new-password').on('keydown',function(e){
			if(e.which === 13){
				$(layero).find('.layui-layer-btn0').trigger('click');
			}
		});
	},
	yes: function(index, layero){
		let elem=$(layero).find('.layui-layer-input'), value=elem.val();
		if(value==='123456'){
			layer.close(index);
			layer.msg('密码正确');
		}else{
			elem.focus();
			layer.tips(value===''?'请输入':'密码错误',elem,{tips:1,time:2e3});
		}
	}
});

传统prompt方法无法监听输入

layer.prompt({
	title: '请输入密码:',
	formType: 1,
},function(value, index, elem){
	console.log(value);
	layer.close(index);
});

js加载远程图片转为base64格式

mysql两表组合查询的一种优化方法

表tab_product表为产品表

表tab_class为产品与分类对照表,一个产品可能属于多个分类

首页要确保 tab_class 表有 classid和productid 的复合索引

ALTER TABLE tab_class ADD INDEX idx_classid_productid (classid, productid);	

JOIN 组合查询:

SELECT `tab_product`.*
FROM `tab_product`
JOIN `tab_class` ON `tab_product`.`id`=`tab_class`.`productid`
WHERE `tab_class`.`classid` IN(3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606)
GROUP BY `tab_product`.`id`
ORDER BY `id` DESC LIMIT 10;

EXISTS 查询:

SELECT *
FROM `tab_product`
WHERE `id` IN(
    SELECT DISTINCT(productid) 
    FROM tab_class 
    WHERE classid IN(3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606)
)
ORDER BY `id` DESC LIMIT 10;

在CodeIgniter中的写法:

$class_ids = [3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606];

$this->db->from('tab_product');
$this->db->where_in('id', "
    SELECT DISTINCT(productid) 
    FROM tab_class 
    WHERE classid IN (".implode(',', $class_ids).")
");
$this->db->order_by('id', 'DESC');
$this->db->limit(10);
$query = $this->db->get();

SELECT DISTINCT(productid) 中的 DISTINCT 可以省略,因为外层的 IN 会自动去重复。但如果结果集比较大还是建议加上。

也可以使用 EXPLAIN 查询两种方法的性能,择优使用

layui多图带预览的上传

<div class="layui-form-item">
	<label class="layui-form-label">图片上传</label>
	<div class="layui-input-block">
		<button type="button" class="layui-btn layui-btn-primary layui-border-blue" id="js-btn-upload"><i class="layui-icon layui-icon-upload"></i> 上传图片</button>
	</div>
</div>
<div class="layui-form-item">
	<ul id="upload-list" class="upload-list"></ul>
</div>

<script type="text/html" id="upload-tpl">
	<li id="js-image-{{ d.index }}">
		<div class="layui-progress" lay-filter="progress-{{ d.index }}"><div class="layui-progress-bar" lay-percent=""></div></div>
		<em><img src="{{ d.url }}"><a class="layui-btn layui-btn-xs layui-bg-red js-reupload">重新上传</a></em>
		<div class="layui-btn-group">
			<a class="layui-btn layui-btn-primary layui-btn-sm layui-border-blue js-left"><i class="layui-icon layui-icon-left"></i></a>
			<a class="layui-btn layui-btn-primary layui-btn-sm layui-border-red js-delete"><i class="layui-icon layui-icon-delete"></i></a>
			<a class="layui-btn layui-btn-primary layui-btn-sm layui-border-blue js-right"><i class="layui-icon layui-icon-right"></i></a>
		</div>
		<input type="hidden" name="imglist[]">
	</li>
</script>

<script>
//上传图片
var uploadInst = layui.upload.render({
	elem: '#js-btn-upload', //绑定元素
	elemList: $('#upload-list'), // 列表元素对象
	url: '<?=site_url('kindeditor/uploadjson?type=image&dir=product')?>',
	acceptMime: 'image/jpeg, image/png',
	exts: 'jpg|png',
	size: 1024,
	field: 'imgFile',
	multiple: true,
	number: 6,
	auto: false,
	choose: function(obj){
		uploadInst.config.elem.next()[0].value = ''; 
		var pics=this.elemList.find('li').length;
		if(pics>=this.number || pics+Object.keys(obj.getChooseFiles()).length>this.number){
			layer.msg('最多上传6张图片');
			return false;
		}
		// 读取本地文件
		var that = this;
		obj.preview(function(index, file, result){
			var li=$(laytpl($('#upload-tpl').html()).render({index:index,url:result}));
			li.find('.layui-progress').show();
			li.find('.js-reupload').on('click', function(){
				obj.upload(index, file);
				$(this).hide();
				element.progress('progress-'+ index, '0%');
			});
			that.elemList.append(li);
			element.render('progress'); // 渲染新加的进度条组件
			obj.upload(index, file);
		});
	},
	done: function(res, index, upload){ // 成功的回调
		var that = this;
		 if(res.error == 0){ // 上传成功
			var li = that.elemList.find('li#js-image-'+ index)
			li.find('.layui-progress').remove();
			li.find('input').val(res.url);
			return;
		}
		this.error(index, upload);
	},
	error: function(index, upload){ // 错误回调
		var that = this;
		var li = that.elemList.find('li#js-image-'+ index);
		 //显示重传
		li.find('.js-reupload').show();
		layer.msg('上传失败',{icon:5});
	},
	progress: function(n, elem, e, index){ // 注意:index 参数为 layui 2.6.6 新增
		element.progress('progress-'+ index, n + '%'); // 执行进度条。n 即为返回的进度百分比
	}
});
</script>

windows指定图片使用照片查看器打开

常见图片格式在右键》属性》打开方式中即可设置。

如果打开方式中没有"照片查看器",可以在注册表如下路径:

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations

新建字符串值,名称如:.webp,数值:PhotoViewer.FileAssoc.Tiff

注意:用Windows照片查看器浏览 webp格式 的图片可能会出现较大色差。

使用ffmpeg下载合并ts视频为mp4

1、下载ffmpeg

https://www.gyan.dev/ffmpeg/builds/

2、解压后,window dos 进入相应的bin目录

3、运行ffmpeg合并ts文件

ffmpeg -i "d:\下载.m3u8" -c copy "d:\合并.mp4"

出现下面错误时,可加相应参数解决:
Filename extension of 'd:\下载\crypt.key' is not a common multimedia extension, blocked for security reasons.If you wish to override this adjust allowed_extensions, you can set it to 'ALL' to allow all

ffmpeg -allowed_extensions ALL -i "d:\下载.m3u8" -c copy "d:\合并.mp4"

------------------------

关于 IV(初始化向量):

检查您的 M3U8 文件,#EXT-X-KEY 标签中是否包含了 IV 参数(例如 IV=0x1234567890ABCDEF1234567890ABCDEF)。

如果没有指定 IV,FFmpeg 可能会使用默认值(比如序列号或全零)。如果解密后视频花屏或无法播放,可以尝试在 FFmpeg 命令中手动指定 IV(如果已知):

ffmpeg -allowed_extensions ALL -decryption_iv 1234567890ABCDEF1234567890ABCDEF -i "input.m3u8" -c copy "output.ts"

密钥格式:FFmpeg 期望的密钥通常是二进制文件或十六进制字符串。如果您的密钥是 Base64 编码的,需要先解码。可以使用在线 Base64 解码工具,或者使用 Python/Node.js 等脚本语言进行转换

CSS改变png图标颜色

主要用途:改变纯色线描icon小图标颜色

<div class="masked-line"></div>
 
<style>
  .masked-line {
    width: 200px;
    height: 200px;
    background-color: purple; /* 目标颜色 */
    -webkit-mask-image: url('your-image.png');
    mask-image: url('your-image.png');
  }
</style>

原图:

变红

html根据坐标生成百度地图、高德地图导航地址

百度地图

https://map.baidu.com/?latlng=36.683544,117.032171&title=济南市大明湖公园&content=山东省济南市历下区大明湖路271号&autoOpen=true&l=

高德地图

http://ditu.amap.com/regeo?lng=104.06074583530426&lat=30.5379691198173

2025-11-01 星期六 农历九月十二