最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书

这篇具有很好参考价值的文章主要介绍了最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前提:朋友弄了一个培训机构,培训考试合格后,给发证书,需要一个证书查询系统。委托我给弄一个,花了几个晚上给写的证书查询系统。

实现功能:

  1. 前端按照姓名+手机号码进行证书查询
  2. 证书信息展示+证书展示,支持点击下载
  3. 后端证书信息录入+带一寸照片数据批量导入

技术栈:
4. ThinkPHP8.0
5. MySQL8.0.12
6. layui

有几个技术点,得记录下:
1、给一个证书模板、一寸照片、两个电子印章图片,这个技术点是:GD库添加水印技术,水印添加也包括文字水印

添加扩展:

"ext-gd": "*",

相关代码:

// 向不同格式的图片中间画一个字符串(也是文字水印)
public function image()
 {
     // $id = Request::param('id');
     $one = Db::table('certificate')->where(Request::param())->find();


     // $this->pic($one['id']);

     /*$one = [
         "certificate_no" => "440420230078",
         "create_time" => "2022-10-10",
         "end_time" => "2032-10-10",
         "id" => 8,
         "id_no" => "4404202206223919",
         "id_type" => "身份证",
         "institution" => "智能研究院",
         "job" => "电工",
         "name" => "曹操",
         "occupation" => "低压电工证",
         "phone" => "13588889999",
         "sex" => "男",
         "skill_level" => "中级",
         "start_time" => "2022-10-10"
     ];*/
     // 图片路径
     $imagePath = './static/images/zsmb.png';
     // 图片信息
     $imageInfo = getimagesize($imagePath);
     //  [0] => 2000 [1] => 1414 [2] => 3 [3] => width="2000" height="1414" [bits] => 8 [mime] => image/png

     // 图片扩展名
     $imageExtension = image_type_to_extension($imageInfo[2], false);
     // png

     // 获取图片
     $func = 'imagecreatefrom' . $imageExtension;
     // imagecreatefrompng
     $image = $func($imagePath);
     /***************************** 文字水印开始 ********************************/
     // 水印字体
     $font = './static/fonts/SourceHanSansSC-Medium-2.otf';
     // 水印文字
     // $content = '曹操';
     // 水印颜色
     $color = imagecolorallocatealpha($image, 0, 0, 0, 30);
     // 添加水印
     imagettftext($image, 22, 0, 1450, 650, $color, $font, $one['name']);
     imagettftext($image, 22, 0, 1450, 740, $color, $font, $one['id_type']);
     imagettftext($image, 22, 0, 1450, 830, $color, $font, $one['id_no']);
     imagettftext($image, 22, 0, 1450, 910, $color, $font, $one['occupation']);
     imagettftext($image, 22, 0, 1480, 985, $color, $font, $one['job']);
     imagettftext($image, 22, 0, 1480, 1075, $color, $font, $one['skill_level']);
     imagettftext($image, 22, 0, 1450, 1155, $color, $font, $one['certificate_no']);
     imagettftext($image, 22, 0, 750, 1080, $color, $font, date("Y年n月j日", strtotime($one['create_time'])));
     imagettftext($image, 22, 0, 300, 1080, $color, $font, date("Y年n月j日", strtotime($one['create_time'])));
     imagettftext($image, 22, 0, 500, 498, $color, $font, $one['institution']);

     /***************************** 文字水印开始 ********************************/

     /***************************** 图片水印开始 ********************************/
     // 获取水印图片
     $watermarkPath = './static/images/water.png';
     $watermarkInfo = getimagesize($watermarkPath);
     $watermarkExtension = image_type_to_extension(getimagesize($watermarkPath)[2], false);
     $func = 'imagecreatefrom' . $watermarkExtension;
     $watermark = $func($watermarkPath);
     // 添加图片水印
     imagecopymerge($image, $watermark, 1280, 180, 0, 0, $watermarkInfo[0], $watermarkInfo[1], 100);
     // 销毁水印图片
     imagedestroy($watermark);

     // 生成二维码
     $qr = "./static/images/qr.png";
     $str = 'http://thinkcms.cc/index/index/image?id=' . $one['id'];
     $img_data = \tekintian\TekinQR::getQRImg($str, 5, null, 3);
     file_put_contents($qr, $img_data);

     $watermarkInfo = getimagesize($qr);
     $watermarkExtension = image_type_to_extension(getimagesize($qr)[2], false);
     $func = 'imagecreatefrom' . $watermarkExtension;
     $watermark = $func($qr);
     // 添加图片水印
     imagecopymerge($image, $watermark, 1580, 370, 0, 0, $watermarkInfo[0], $watermarkInfo[1], 100);
     // 销毁水印图片
     imagedestroy($watermark);

     $watermarkPath = './static/images/nyyz.png';
     $watermarkInfo = getimagesize($watermarkPath);
     $watermarkExtension = image_type_to_extension(getimagesize($watermarkPath)[2], false);
     $func = 'imagecreatefrom' . $watermarkExtension;
     $watermark = $func($watermarkPath);
     // 添加图片水印
     imagecopymerge($image, $watermark, 220, 850, 0, 0, $watermarkInfo[0], $watermarkInfo[1], 100);
     // 销毁水印图片
     imagedestroy($watermark);

     $watermarkPath = './static/images/gjyz.png';
     $watermarkInfo = getimagesize($watermarkPath);
     $watermarkExtension = image_type_to_extension(getimagesize($watermarkPath)[2], false);
     $func = 'imagecreatefrom' . $watermarkExtension;
     $watermark = $func($watermarkPath);
     // 添加图片水印
     imagecopymerge($image, $watermark, 720, 850, 0, 0, $watermarkInfo[0], $watermarkInfo[1], 100);
     // 销毁水印图片
     imagedestroy($watermark);

     /***************************** 图片水印开始 ********************************/

     // 输出图片
     header('Content-Type:' . $imageInfo['mime']);
     $func = 'image' . $imageExtension;
     $func($image, null, 6);
     // 销毁图片
     imagedestroy($image);
     exit;
 }

最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书,php,证书查询系统,添加图片水印、添加文字水印,电子证书技术实现,扫码查看电子证书

2、证书里的二维码,扫码就能扫码出来,是PHP生成二维码,其二维码中间也是支持加logo的

添加扩展:

"tekintian/phpqrcode": "^1.1",

相关代码:

// 生成二维码
$qr = "./static/images/qr.png";
// 这个本地测试域名,不是外网,扫码不了,上线改成外网扫了才有效
$str = 'http://thinkcms.cc/index/index/image?id=' . $one['id'];
$img_data = \tekintian\TekinQR::getQRImg($str, 5, null, 3);
file_put_contents($qr, $img_data);

3、后台实现带图片excel数据导入,这个摸索了点时间,因为PHPExcel停止维护了,改了半天源码还有问题,最后放弃了,换了一个扩展。

添加扩展:

"phpoffice/phpspreadsheet": "^1.20.0"

相关代码:

/**
 * 字母序列化为数字
 */
public function ABC2decimal($abc)
{
    $ten = 0;
    $len = strlen($abc);
    for ($i = 1; $i <= $len; $i++) {
        $char = substr($abc, 0 - $i, 1);//反向获取单个字符
        $int = ord($char);
        $ten += ($int - 65) * pow(26, $i - 1);
    }
    return $ten;
}


public function excel()
{
    if ($file = request()->file('excel')) {
        try {
            $saveName = Filesystem::disk('public')->putFile('/static/upload/excels', $file);
            if (!is_file($saveName)) {
                return json(['code' => 1, 'msg' => '文件不存在', 'data' => null]);
            }
            $ext = pathinfo($saveName, PATHINFO_EXTENSION);
            // xls不支持图片导入
            // if (!in_array($ext, ['xlsx', 'xls'])) {
            if (!in_array($ext, ['xlsx'])) {
                return json(['code' => 1, 'msg' => '文件类型不正确', 'data' => null]);
            }
            // 有两种格式,xlsx和xls
            if ($ext == 'xlsx') {
                $objReader = IOFactory::createReader('Xlsx');
            } else {
                $objReader = IOFactory::createReader('Xls');
            }
            // 图片保存路径
            $imageFilePath1 = root_path() . '/public/'; // 图片保存目录
            $imageFilePath2 = 'static/upload/images/' . date("Ymd") . '/';
            $imageFilePath = $imageFilePath1 . $imageFilePath2;
            if (!file_exists($imageFilePath)) {
                mkdir("$imageFilePath", 0777, true);
            }
            // 载入excel文件
            $excel = $objReader->load($saveName);
            // 读取第一张表
            $sheet = $excel->getActiveSheet();
            // 读取总行数
            $highestRow = $sheet->getHighestRow();
            // 读取第一张表转换成数组
            $data = $sheet->toArray();

            // 处理图片
            foreach ($sheet->getDrawingCollection() as $drawing) {
                list($startColumn, $startRow) = Coordinate::coordinateFromString($drawing->getCoordinates());
                $imageFileName = $drawing->getIndexedFilename();  // 获取文件名
                switch ($drawing->getExtension()) {
                    case 'jpg':
                    case 'jpeg':
                        $source = imagecreatefromjpeg($drawing->getPath());
                        imagejpeg($source, $imageFilePath . $imageFileName);
                        break;
                    case 'gif':
                        $source = imagecreatefromgif($drawing->getPath());
                        imagegif($source, $imageFilePath . $imageFileName);
                        break;
                    case 'png':
                        $source = imagecreatefrompng($drawing->getPath());
                        imagepng($source, $imageFilePath . $imageFileName);
                        break;
                }
                $startColumn = $this->ABC2decimal($startColumn);
                $data[$startRow - 1][$startColumn] = $imageFilePath2 . $imageFileName;
            }

            // 数据写入数据库
            $add_data = [];
            for ($i = 1; $i <= $highestRow - 1; $i++) {
                $add_data[$i]['institution'] = $data[$i][0];
                $add_data[$i]['name'] = $data[$i][1];
                $add_data[$i]['sex'] = $data[$i][2];
                $add_data[$i]['phone'] = $data[$i][3];
                $add_data[$i]['id_type'] = $data[$i][4];
                $add_data[$i]['id_no'] = $data[$i][5];
                $add_data[$i]['occupation'] = $data[$i][6];
                $add_data[$i]['job'] = $data[$i][7];
                $add_data[$i]['skill_level'] = $data[$i][8];
                $add_data[$i]['certificate_no'] = $data[$i][9];
                $add_data[$i]['create_time'] = $data[$i][10];
                $add_data[$i]['start_time'] = $data[$i][11];
                $add_data[$i]['end_time'] = $data[$i][12];
                $add_data[$i]['path'] = $data[$i][13];
            }

            // 数据插入数据库
            $success_count = Db::table('certificate')->insertAll($add_data);
            if ($success_count > 0) {
                return json(['code' => 0, 'msg' => '数据插入成功', 'data' => null]);
            } else {
                return json(['code' => 1, 'msg' => '数据插入失败', 'data' => null]);
            }
        } catch (\Exception $e) {
            return json(['code' => 1, 'msg' => $e->getMessage(), 'data' => null]);
        }
    } else {
        return json(['code' => 1, 'msg' => '上传文件不能为空', 'data' => null]);
    }
}
  1. ThinkPHP8.0开启session,没有采取前后端分离,就是前后端分离后,SEO不友好,再去前端优化搜索,那还不如直接MVC来的快,所以用到了session。根据官方手册没有配置成功,session没有生效,后面尝试了下面的方法,两者都进行配置才生效。这里记录下。

全局config配置middleware.php中

<?php
// 中间件配置
return [
    // 别名或分组
    'alias'    => [],
    // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
    'priority' => ['think\middleware\SessionInit'],
];

后端应用middleware.php中

<?php
// 这是系统自动生成的middleware定义文件
return [
	// 无关代码省略...
    \think\middleware\SessionInit::class
];

弄了写数据模拟下,最终实现的功能成果如下:
最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书,php,证书查询系统,添加图片水印、添加文字水印,电子证书技术实现,扫码查看电子证书
最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书,php,证书查询系统,添加图片水印、添加文字水印,电子证书技术实现,扫码查看电子证书
最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书,php,证书查询系统,添加图片水印、添加文字水印,电子证书技术实现,扫码查看电子证书文章来源地址https://www.toymoban.com/news/detail-819414.html

到了这里,关于最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 基于Java+Vue+uniapp微信小程序企业职工薪资查询系统设计和实现

    基于Java+Vue+uniapp微信小程序企业职工薪资查询系统设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作 ✌ 主要内容: SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P

    2024年02月04日
    浏览(6)
  • 《vue3实战》通过indexOf方法实现电影评价系统的模糊查询功能

    《vue3实战》通过indexOf方法实现电影评价系统的模糊查询功能

    目录 前言 一、indexOf是什么?indexOf有什么作用? 含义: 作用: 二、功能实现 这段是查询过程中过滤筛选功能的代码部分: 分析: 这段是查询用户和性别功能的代码部分: 分析: 三、最终效果图 查询输入框所在图: 输入姓名羊和性别男模糊查询后的效果图: 输入姓名羊和

    2024年02月10日
    浏览(9)
  • ASP.NET交通信息网上查询系统的设计与实现(源代码+论文+开题报告)

    当前我国交通网上信息系统的发展处于一个较落后的水平,广大乘客可以获得信息的方式很少,通常依赖于火车飞机时刻表,而汽车只能到车站查询。为了解决这种问题,加快发展交通信息化,设计一个交通信息网上查询系统是具有一定实际应用意义的。在此背景下,本文基于

    2024年02月09日
    浏览(9)
  • 基于微信小程序的公交车路线查询系统的设计与实现(源码+论文)_v_202

    基于微信小程序的公交车路线查询系统的设计与实现(源码+论文)_v_202

    摘 要 移动互联网时代的到来,智能手机的普及,在众多手机软件中,微信被广大用户认可并广泛被使用。随着微信的发展,为满足用户通过微信进行公交线路查询的需求,特开发了本基于微信小程序的公交车路线查询系统。 本文主要介绍了微信小程序的实时公交查询系统的

    2024年02月04日
    浏览(10)
  • 计算机毕业设计 基于java的高校竞赛和考级查询系统的设计与实现 Java实战项目 附源码+文档+视频讲解

    计算机毕业设计 基于java的高校竞赛和考级查询系统的设计与实现 Java实战项目 附源码+文档+视频讲解

    博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 ——————————

    2024年02月07日
    浏览(13)
  • 【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现

    【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现

    一个管理员编号对应一个密码,且需要有管理员注册密匙。 可以在图书信息表中录入、修改、删除图书。 可以在图书信息表中查询书籍。 可以编辑图书借阅、归还信息。 可以编辑欠款信息。 可以编辑读者信息表。 图书馆注册,获得读者编号。 可以在图书信息表中查阅书籍

    2024年02月10日
    浏览(12)
  • Linux 系统服务日志查询 journalctl:查询 systemd 日记

    Linux 系统服务日志查询 journalctl:查询 systemd 日记

    systemd 在取代 SUSE Linux Enterprise 12 中的传统 init 脚本时(参见第 13 章 “systemd 守护程序”),引入了自身的称为日记的日志记录系统。由于所有系统事件都将写入到日记中,因此,用户不再需要运行基于 syslog 的服务。 日记本身是 systemd 管理的系统服务,全名为 systemd-journal

    2024年02月07日
    浏览(8)
  • 大厂报价查询系统性能优化之道!

    大厂报价查询系统性能优化之道!

    机票查询系统,日均亿级流量,要求高吞吐,低延迟架构设计。提升缓存的效率以及实时计算模块长尾延迟,成为制约机票查询系统性能关键。本文介绍机票查询系统在缓存和实时计算两个领域的架构提升。 1.1 机票搜索的业务特点 机票搜索业务:输入目的地,然后点击搜索

    2024年03月25日
    浏览(8)
  • Php+sql成绩查询系统(系统+论文+答辩PPT)

    众所周知,现代信息技术是现代教育技术的基础和核心,培养和创新型的人才必须依靠现代教育技术。从这一层意义上讲,我们说掌握一定的计算机应用技能已经成为国家未来的合格建设者的必备素质,所以现在在大学中对非计算机系的学生开设了计算机文化基础课,并且通

    2024年02月09日
    浏览(6)
  • 基于java+springboot+vue城市轨道交通线路查询系统-公交车线路查询

    基于java+springboot+vue城市轨道交通线路查询系统-公交车线路查询

    本系统是针对目前交通管理的实际需求,从实际工作出发,对过去的市轨道交通线路查询系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的

    2024年02月05日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包