王新阳

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

mysql快速查询值是否存在

SELECT EXISTS(SELECT 1 FROM users WHERE id_number = '1234567890');

SELECT 1:在子查询中,选择常量 1 而不是实际的列数据,因为这里我们只关心是否存在匹配的行,而不关心具体的列数据。
FROM users:指定要查询的表。
WHERE id_number = '1234567890':指定查询条件,即证件号码必须匹配 '1234567890'。

php随机生成有效的公网ipv4地址

//随机生成有效的公网ipv4地址
function generateRandomPublicIPv4() {
	// 排除的IP范围(局域网、保留地址等)
	$excludedRanges = [
		['0.0.0.0', '0.255.255.255'],	   // 当前网络
		['10.0.0.0', '10.255.255.255'],	 // 私有网络
		['100.64.0.0', '100.127.255.255'],  // Carrier-grade NAT
		['127.0.0.0', '127.255.255.255'],   // 环回地址
		['169.254.0.0', '169.254.255.255'], // 链路本地
		['172.16.0.0', '172.31.255.255'],   // 私有网络
		['192.0.0.0', '192.0.0.255'],	   // IETF协议分配
		['192.0.2.0', '192.0.2.255'],	   // TEST-NET-1
		['192.88.99.0', '192.88.99.255'],   // 6to4中继
		['192.168.0.0', '192.168.255.255'], // 私有网络
		['198.18.0.0', '198.19.255.255'],   // 网络基准测试
		['198.51.100.0', '198.51.100.255'], // TEST-NET-2
		['203.0.113.0', '203.0.113.255'],   // TEST-NET-3
		['224.0.0.0', '239.255.255.255'],   // 组播地址
		['240.0.0.0', '255.255.255.254'],   // 保留地址
		['255.255.255.255', '255.255.255.255'] // 广播地址
	];
	foreach($excludedRanges as &$row){
		$row[0]=ip2long($row[0]);
		$row[1]=ip2long($row[1]);
	}
	
	// 生成随机IP直到找到有效的公网IP
	do {
		// 生成随机IP
		$ipLong = mt_rand(ip2long('1.0.0.0'), ip2long('223.255.255.255'));
		$ip = long2ip($ipLong);
		
		$isValid = true;
		
		// 检查是否在排除范围内
		foreach ($excludedRanges as $range) {
			list($start,$end)=$range;
			
			if ($ipLong >= $start && $ipLong <= $end) {
				$isValid = false;
				break;
			}
		}
		
		// 额外检查:排除以0或255结尾的地址(通常有问题)
		$parts = explode('.', $ip);
		if ($parts[3] == 0 || $parts[3] == 255) {
			$isValid = false;
		}
		
	} while (!$isValid);
	
	return $ip;
}

云主机遭遇挖矿病毒处理方法

https://blog.csdn.net/qq_61872115/article/details/136987258

https://blog.csdn.net/qq_35573061/article/details/138495615

优秀开源项目

微信支付SDK
https://easywechat.com/
https://github.com/w7corp/easywechat

中国农历(阴历)与阳历(公历)转换与查询工具
https://github.com/overtrue/chinese-calendar/tree/master

更准确的 PHP 汉字转拼音解决方案
https://overtrue.me/php-chinese-to-pinyin/
https://overtrue.me/pinyin/
https://github.com/overtrue/pinyin

几个excel公式

根据单元格的值设置文字颜色等

>开始》条件设置》新建格式规则》使用公式确定要设置格式的单元格
=OR(D2="请填写",D2="号码错误")
或者
=AND(D2<>"校验通过")
点击“格式”自行设置

根据C列的证件号码校验身份证号是否正确

=IF(LEN(C2)=18,IF(AND(ISNUMBER(--LEFT(C2,17)),OR(RIGHT(C2,1)="X",ISNUMBER(--RIGHT(C2,1)))),IF(RIGHT(C2,1)=MID("10X98765432",MOD(SUMPRODUCT(MID(C2,ROW(INDIRECT("1:17")),1)*MOD(2^(18-ROW(INDIRECT("1:17"))),11)),11)+1,1),"校验通过","号码错误"),"号码错误"),"身份证号码应该为18位")

根据B列的证件类型和C列的证件号码校验身份证号是否正确

=IF(B2="身份证",IF(LEN(C2)=18,IF(AND(ISNUMBER(--LEFT(C2,17)),OR(RIGHT(C2,1)="X",ISNUMBER(--RIGHT(C2,1)))),IF(RIGHT(C2,1)=MID("10X98765432",MOD(SUMPRODUCT(MID(C2,ROW(INDIRECT("1:17")),1)*MOD(2^(18-ROW(INDIRECT("1:17"))),11)),11)+1,1),"校验通过","号码错误"),"号码错误"),"身份证号码应该为18位"),"")

通过注册表编辑器禁用TLS1.0、TLS1.1

定位到注册表项:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

  1. 创建或修改TLS 1.0键值
    如果不存在 TLS 1.0 键,右键点击 Protocols → 新建 → 项,命名为 TLS 1.0。
  2. 在 TLS 1.0 下分别创建 Client 和 Server 子项。
    设置禁用参数
    Client项:
     新建DWORD值:
     Enabled → 值设为 0
    Server项:
     同样新建Enabled → 值设为 0
  3. 重启服务器
    关闭注册表编辑器,重启系统使设置生效。

TLS 1.1 禁用步骤同上。

另外,可下载图形化工具 IIS Crypto 来禁用相关功能,下载地址:https://www.nartac.com/products/IISCrypto/download


php登录后台时一直提示验证码错误

查日志发现是新部署的业务 php/temp 目录没有写入权限

Session: Configured save path 'D:\php\temp' is not writable by the PHP process
Severity: Warning --> session_start(): Failed to initialize storage module: user (path: D:\php\temp\) D:\webroot\system\Session.php 143

我的LODOP打印控件代码备份

<script src="/static/lodop/LodopFuncs.js?v=reg"></script>
<script>
//定义打印控件
var LODOP = null;
//已打印标识
var printFlag = [0,0]; //打印次数、页数
window.onload=function(){LODOP=getLodop();};

function createPage(data){
/**
 * LODOP基础知识
 * 计量单位关系如下(其中px单位与像素类似,但不是一个概念)
 * 1in = 2.54cm = 25.4mm = 72pt = 96px
 * 1mm = 2.83465pt = 3.77953px
 * 1pt = 0.352777mm = 1.333333px
 * 1px = 0.264583mm = 0.75pt
 *
 * 字号默认单位为pt,不设置默认为9pt
 * 长度单位默认为px(SET_PRINT_PAGESIZE中的PageWidth和PageHeight除外,默认为0.1mm)
 *
 * 设置纸张大小(initOrient为1-3时会锁定打印方向,为0时由用户控制)
 * SET_PRINT_PAGESIZE(intOrient, PageWidth,PageHeight,strPageName)
 * 不调用此函数则由用户在打印设置中自主设置
 */
	
	//LODOP.PRINT_INIT('证书打印');
	LODOP.PRINT_INITA(0,0,'330mm','240mm','证书打印'); //top,left,width,height,printName,整体打印有偏差时,只需要调整top和left值即可
	LODOP.SET_PRINT_MODE('CUSTOM_TASK_NAME', data.name); //打印任务名
	LODOP.SET_PRINT_MODE('POS_BASEON_PAPER',true); //true以纸张边缘为基点;false可打区域边缘为基点
	LODOP.SET_PRINT_MODE('AUTO_CLOSE_PREWINDOW',1); //打印后自动关闭预览窗口
	//LODOP.SET_PRINT_PAGESIZE(0, '240mm','330mm', 'CreateCustomPage'); // 第一个参数:1纵向打印2横向打印3宽度固定高度自适应0用户控制
	LODOP.SET_PRINT_PAGESIZE(2,0,0,''); //后三个值无效时只用来设置打印方向
	
	LODOP.SET_PRINT_STYLE('FontSize',13.5);  //全局字号,单位pt
	LODOP.SET_PRINT_STYLE('FontName', '新宋体'); //全局字体(宋体、新宋体设置加粗无效)
	LODOP.SET_PRINT_STYLE('Bold',1); //全局加粗
	LODOP.SET_SHOW_MODE('BKIMG_PRINT',false); //是否打印背景图
	//LODOP.SET_PRINT_STYLE('Alignment', 2); //全局水平居中
	
	//LODOP.ADD_PRINT_TEXT(top, left, width, height, textContent); //默认单位px
	LODOP.ADD_PRINT_TEXT(157,912,234,30, data.name);
	//LODOP.SET_PRINT_STYLEA(0, 'FontSize', 13.5); //为前面刚添加的项目设置字号、字体、颜色等打印式样
	LODOP.ADD_PRINT_TEXT(231,912,234,30, data.gender);
	LODOP.ADD_PRINT_TEXT(306,912,234,30, data.nationality);
	LODOP.ADD_PRINT_TEXT(381,912,234,30, data.ethnic_group);
	LODOP.ADD_PRINT_TEXT(455,946,234,30, data.birth);
	LODOP.ADD_PRINT_TEXT(338,289,260,30, data.major_name);
	LODOP.ADD_PRINT_TEXT(418,254,260,30, data.grade);
	LODOP.ADD_PRINT_TEXT(498,289,260,30, data.certdate);
	LODOP.ADD_PRINT_TEXT(578,289,260,30, data.certno);
	LODOP.ADD_PRINT_TEXT(659,275,260,30, data.grade_begin_end);

	if(data.photo){
		LODOP.ADD_PRINT_IMAGE(155,659,'36mm','49mm','<img border="0" src="'+data.photo+'?rnd='+Math.random()+'">');
		LODOP.SET_PRINT_STYLEA(0,'Stretch',2);//默认不设置或0为截取模式;1按打印区域尺寸缩放(变形);2按原图比例(不变形)缩放模式
	}
}

//更新打印日志
function update_print_log(row){
	row.print=parseInt(row.print)+1;
	table.updateRow('myTable', {index:row.LAY_INDEX, data:row}, true);
	$.ajax({
		type: 'POST',
		data: {act:'update_print_log', id:row.id},
		success: function(res){
			if(res.code)return layer.alert(res.msg);
		}
	});
}

function batch_print(){
	var data=table.checkStatus('myTable').dataCache;
	if(!data.length)return layer.msg('请选择要打印的记录', {time:2e3});
	
	$.each(data, function(index,row){
		createPage(row);
		LODOP.PRINT();
		update_print_log(row)
	});
}

//选择打印机
function print_printer(){
	//return layer.alert('请在打印预览界面中点击菜单栏的"设置"选择打印机或打印设置。');
/*
	var printer_list=[];
	for(var i=0; i<LODOP.GET_PRINTER_COUNT(); ++i){
		printer_list.push(LODOP.GET_PRINTER_NAME(i));
	}
	console.log(printer_list);
	return;
*/
}
//打印维护
function print_edit(){
	var row=create_data();
	if(row===null)return layer.alert('无数据');
	createPage(row);
	LODOP.ADD_PRINT_SETUP_BKIMG('<img border="0" src="/static/images/cert.jpg">');
	LODOP.SET_SHOW_MODE('SHOW_SCALEBAR',1); //显示标尺
	LODOP.SET_SHOW_MODE("BKIMG_LEFT",0);
	LODOP.SET_SHOW_MODE("BKIMG_TOP",0);
	LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_SETUP',true);
	LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_PREVIEW',true);
	LODOP.PRINT_SETUP();
}
//打印预览
function print_view(){
	var row=create_data();
	if(row===null)return layer.alert('无数据');
	createPage(row);
	LODOP.ADD_PRINT_SETUP_BKIMG('<img border="0" src="/static/images/cert.jpg">');
	LODOP.SET_SHOW_MODE('BKIMG_IN_PREVIEW',1); //打印预览显示背景图
	LODOP.SET_SHOW_MODE('SHOW_SCALEBAR',1); //显示标尺
	LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD',1); //隐藏打印预览背景进纸版的图案
	LODOP.SET_SHOW_MODE("BKIMG_LEFT",0);
	LODOP.SET_SHOW_MODE("BKIMG_TOP",0);
	LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_SETUP',true);
	LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_PREVIEW',true);
	LODOP.PREVIEW();
}
function print_design(){
	LODOP.PRINT_INITA(0,0, '330mm','240mm', '打印设计');
	LODOP.PRINT_DESIGN();
}
//版本检测
function print_version(){
	try{
		if(LODOP.VERSION) {
			let str=LODOP.CVERSION ? 'C-Lodop版本:'+LODOP.CVERSION+'<br>Lodop版本:'+LODOP.VERSION : '本机已安装Lodop控件!<br>版本号:'+LODOP.VERSION;
			layer.alert(str);
		};
	}catch(e){}
}
//打印预览、打印维护时展示的数据
function create_data(){
	var data=table.getData('myTable');
	if(!data.length)return null;
	var checkData=table.checkStatus('myTable').data;
	return checkData.length ? checkData[0] : data[0];
}
</script>

PHP按目标比例和尺寸缩小并裁切图片

/**
 * 按目标比例和尺寸缩小并裁切图片,如果原图尺寸小于目标尺寸,则只按比例裁切
 * @param $img_name 原图片名称(不是路径)
 * @param $width 目标图片宽度,如果原图宽度不等于目标宽度,则原图按目标比例缩放后再裁切
 * @param $width 目标图片高度
 */
function img_convert_do($img_name, $width, $height){
	$old_img=FCPATH.'photo/'.$img_name;
	$new_img=FCPATH.'photo2/'.$img_name;
	$size_arr = @getimagesize($old_img);
	if(is_array($size_arr)){
		$w = $size_arr[0];
		$h= $size_arr[1];
	}else{
		exit('图片尺寸获取失败:'.$img_name);
	}
	if($w/$h < $width/$height){
		$h=ceil($w*$height/$width);
	}else if($w/$h > $width/$height){
		$w=ceil($width*$h/$height);
	}else{ //比例一致,直接复制
		return copy($old_img,$new_img);
	}
	if($w<$width){
		$width=$w;
		$height=$h;
	}
		
	//新建真彩色图像
	$im = imagecreatetruecolor($width, $height);
	//为图像分配颜色
	//$color = imagecolorallocate($im, 255,255,255);
	//从指定坐标开始填充颜色
	//imagefill($im, 0,0, $color);
	//从字符串的图像流中新建图像,可以自动识别文件类型,但是比 imagecreatefromjpeg 等多消耗内存
	$source = imagecreatefromstring(file_get_contents($old_img));
/*
从 x、y 坐标 src_x、src_y 开始,将 src_image 的一部分复制到 dst_image 上,
宽度为 src_width,高度为 src_height。定义的部分将被复制到 x,y 坐标 dst_x 和 dst_y 上。
imagecopy(
    GdImage $dst_image,
    GdImage $src_image,
    int $dst_x,
    int $dst_y,
    int $src_x,
    int $src_y,
    int $src_width,
    int $src_height
): bool

从 src_image 中取出一个宽度为 src_width 高度为 src_height 的矩形区域,
在位置(src_x、src_y)
并将其放置在 dst_image 中宽度为 dst_width 高度为 dst_height 的矩形区域中,
位置为(dst_x、dst_y)。
imagecopyresampled(
    GdImage $dst_image,
    GdImage $src_image,
    int $dst_x,
    int $dst_y,
    int $src_x,
    int $src_y,
    int $dst_width,
    int $dst_height,
    int $src_width,
    int $src_height
): bool

输出图象到浏览器或文件
image 由图象创建函数(例如imagecreatetruecolor())返回的 GdImage 对象。
file 文件保存的路径或者已打开的流资源(此方法返回后自动关闭该流资源),如果未设置或为 null,将会直接输出原始图象流。
quality 为可选项,范围从 0(最差质量,文件最小)到 100(最佳质量,文件最大)。默认值(-1)使用 IJG 默认的质量值(大约 75)。
imagejpeg(GdImage $image, resource|string|null $file = null, int $quality = -1): bool
*/
	//执行剪裁(高质量重采样)
	imagecopyresampled($im, $source, 0,0, 0,0, $width,$height, $w,$h);
	imagedestroy($source);
		
	//保存到文件
	imagejpeg($im, $new_img, 90);
	imagedestroy($im);
}
2025-04-03 星期四 农历三月初六