2023年9月

由于项目需要,有些内容固定了。

    function sharePNG($id, $avatarPath = '', $name = '', $desc = '')
    {
        if(substr($avatarPath,0,2) == '//'){
            $avatarPath = (\request()->protocol() == 'HTTP/1.1'?'http':'https').":$avatarPath";
        }
        $len = mb_strlen($name);
        if($len > 11){
            $name = mb_substr($name,0,11).'...';
        }
        $path = public_path("/static");
        $path_2 = empty($avatarPath) ? "{$path}fe/avatar.png" : $avatarPath;
        //背景图片对象
        $fromImageInfo = getimagesize($path_2);
        if (!isset($fromImageInfo['bits']) || $fromImageInfo['bits'] >= 1024) {
            $path_2 = "{$path}fe/avatar.png";
        }
        $path_1 = "{$path}fe/share-bg.png";
        $ttf = "{$path}font/weiruanyahei.ttf";
        //创建图片对象
        $image_1 = imagecreatefrompng($path_1);
        $image_2 = radius_img($path_2); // 见 /index.php/archives/146/

        //缩放图片
        // 获取图像信息
        list($bigWidth, $bigHight) = $fromImageInfo;
        //图片缩放,可以根据原图片大小在这里计算等比缩放
        $width = 30;
        $height = 30;
        // 创建缩略图画板
        $newImage = imagecreatetruecolor($width, $height);
        // 启用混色模式
        imagealphablending($newImage, false);
        // 保存PNG alpha通道信息
        imagesavealpha($newImage, true);
        //缩放
        imagecopyresampled($newImage, $image_2, 0, 0, 0, 0, $width, $height, $bigWidth, $bigHight);

        //合成图片
        //imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )---拷贝并合并图像的一部分
        //将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。
        //两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时对于调色板图像本函数和 imagecopy() 完全一样,它对真彩色图像实现了 alpha 透明。
        imagecopymerge($image_1, $newImage, 10, 125, 0, 0, imagesx($newImage), imagesy($newImage), 100);
        $col = imagecolorallocatealpha($image_1, 0, 0, 0, 0);
        // 设置文字
        imagettftext($image_1, 10, 0, 47, 138, $col, $ttf, $name);
        $col2 = imagecolorallocatealpha($image_1, 171, 171, 171, 0);
        imagettftext($image_1, 8, 0, 47, 153, $col2, $ttf, $desc);
        if (!is_dir("{$path}/sharePNG")) {
            mkdir("{$path}/sharePNG", 755);
        }
        $fullPath = "{$path}/sharePNG/$id.png";
        if (file_exists($fullPath)) {
            unlink($fullPath);
        }
        if (imagepng($image_1, $fullPath)) {
            return "/static/sharePNG/$id.png";
        }
        return false;
    }

参考:

PHP缩放并合成图片
php 合成图片、合成圆形图片

话不多说上代码

function radius_img($imgpath, $radius = 0){
    $index = strpos($imgpath,"?");
    if($index !== false){
        $imgpath = substr($imgpath,0,$index);
    }
    $ext = pathinfo($imgpath);
    $src_img = null;
    switch ($ext['extension']){
        case 'jpg':
        case 'jpeg':
            $src_img = imagecreatefromjpeg($imgpath);
            break;
        case 'png':
            $src_img = imagecreatefrompng($imgpath);
            break;
        case 'gif':
            $src_img = imagecreatefromgif($imgpath);
            break;
    }
    $wh = getimagesize($imgpath);
    $w = $wh[0];
    $h = $wh[1];
    $radius = $radius == 0 ? (min($w, $h) / 2) : $radius;
    $img = imagecreatetruecolor($w, $h);
    //这一句一定要有
    imagesavealpha($img, true);
    //拾取一个完全透明的颜色,最后一个参数127为全透明
    $bg = imagecolorallocatealpha($img, 255, 255, 255, 0);
    imagefill($img, 0, 0, $bg);
    $r = $radius; //圆 角半径
    for ($x = 0; $x < $w; $x++){
        for ($y = 0; $y < $h; $y++){
            $rgbColor = imagecolorat($src_img, $x, $y);
            if (($x >= $radius && $x <= ($w - $radius)) || ($y >= $radius && $y <= ($h - $radius))){
                //不在四角的范围内,直接画
                imagesetpixel($img, $x, $y, $rgbColor);
            }else{
                //在四角的范围内选择画
                //上左
                $y_x = $r; //圆心X坐标
                $y_y = $r; //圆心Y坐标
                if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))){
                    imagesetpixel($img, $x, $y, $rgbColor);
                }
                //上右
                $y_x = $w - $r; //圆心X坐标
                $y_y = $r; //圆心Y坐标
                if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))){
                    imagesetpixel($img, $x, $y, $rgbColor);
                }
                //下左
                $y_x = $r; //圆心X坐标
                $y_y = $h - $r; //圆心Y坐标
                if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))){
                    imagesetpixel($img, $x, $y, $rgbColor);
                }
                //下右
                $y_x = $w - $r; //圆心X坐标
                $y_y = $h - $r; //圆心Y坐标
                if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))){
                    imagesetpixel($img, $x, $y, $rgbColor);
                }
            }
        }
    }
    return $img;
}

客户误删数据库。删了10来条用户。想办法恢复下。
从数据库删掉的,只能从数据库这边找了。通过活动记录可以关联到删除用户的ID。有了一丝希望,但不多。
没有其他数据做支撑,空有id,啥也不是!

网上查了查,mysql 有binlog, 若开启可记录文件操作,insert,update操作。

-- 查询binlog开启状态
show variables like 'log_%';

使用mysqlbinlog,可以使用 find / -name "mysqlbinlog" 查找这家伙在哪里。
直接全部导出太大 可筛选范围 并将 筛选内容 导出到 /www/0907.sql 这个文件中

/www/server/mysql/bin/mysqlbinlog --start-datetime="2023-09-07 08:00:00" --stop-datetime="2023-09-07 13:59:59" /www/server/data/mysql-bin.000023 -r  /www/0907.sql

然后 就可以搜索到 写入记录 ,再根据之前缺少的ID恢复数据即可。

扩展:
mysqlbinlog /data/mysql_data/bin.000008 --database EpointFrame --base64-output=decode-rows -vv --skip-gtids=true |grep -C 1 -i "delete from Audit_Orga_Specialtype" > /opt/sql.log

/data/mysql_data/bin.000008:需要解析的 binlog 日志。

database:只列出该数据库下的行数据,但无法过滤 Rows_query_event。

base64-output=decode-rows -vv:显示具体 SQL 语句。

skip-gtids=true:忽略 GTID 显示。

grep -C 1 -i "delete from dataex_trigger_record":通过管道命令筛选出所需 SQL 及执行时间。

/opt/sql.log:将结果导入到日志文件,方便查看。
参考:
技术分享 | MySQL binlog 日志解析
mysql查看binlog日志