前提:朋友弄了一個培訓機構,培訓考試合格后,給發(fā)證書,需要一個證書查詢系統(tǒng)。委托我給弄一個,花了幾個晚上給寫的證書查詢系統(tǒng)。
實現(xiàn)功能:
- 前端按照姓名+手機號碼進行證書查詢
- 證書信息展示+證書展示,支持點擊下載
- 后端證書信息錄入+帶一寸照片數(shù)據(jù)批量導入
技術棧:
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;
}
2、證書里的二維碼,掃碼就能掃碼出來,是PHP生成二維碼,其二維碼中間也是支持加logo的
添加擴展:
"tekintian/phpqrcode": "^1.1",
相關代碼:
// 生成二維碼
$qr = "./static/images/qr.png";
// 這個本地測試域名,不是外網(wǎng),掃碼不了,上線改成外網(wǎng)掃了才有效
$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、后臺實現(xiàn)帶圖片excel數(shù)據(jù)導入,這個摸索了點時間,因為PHPExcel停止維護了,改了半天源碼還有問題,最后放棄了,換了一個擴展。
添加擴展:
"phpoffice/phpspreadsheet": "^1.20.0"
相關代碼:
/**
* 字母序列化為數(shù)字
*/
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();
// 讀取總行數(shù)
$highestRow = $sheet->getHighestRow();
// 讀取第一張表轉換成數(shù)組
$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;
}
// 數(shù)據(jù)寫入數(shù)據(jù)庫
$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];
}
// 數(shù)據(jù)插入數(shù)據(jù)庫
$success_count = Db::table('certificate')->insertAll($add_data);
if ($success_count > 0) {
return json(['code' => 0, 'msg' => '數(shù)據(jù)插入成功', 'data' => null]);
} else {
return json(['code' => 1, 'msg' => '數(shù)據(jù)插入失敗', 'data' => null]);
}
} catch (\Exception $e) {
return json(['code' => 1, 'msg' => $e->getMessage(), 'data' => null]);
}
} else {
return json(['code' => 1, 'msg' => '上傳文件不能為空', 'data' => null]);
}
}
- ThinkPHP8.0開啟session,沒有采取前后端分離,就是前后端分離后,SEO不友好,再去前端優(yōu)化搜索,那還不如直接MVC來的快,所以用到了session。根據(jù)官方手冊沒有配置成功,session沒有生效,后面嘗試了下面的方法,兩者都進行配置才生效。這里記錄下。
全局config配置middleware.php中
<?php
// 中間件配置
return [
// 別名或分組
'alias' => [],
// 優(yōu)先級設置,此數(shù)組中的中間件會按照數(shù)組中的順序優(yōu)先執(zhí)行
'priority' => ['think\middleware\SessionInit'],
];
后端應用middleware.php中文章來源:http://www.zghlxwxcb.cn/news/detail-819414.html
<?php
// 這是系統(tǒng)自動生成的middleware定義文件
return [
// 無關代碼省略...
\think\middleware\SessionInit::class
];
弄了寫數(shù)據(jù)模擬下,最終實現(xiàn)的功能成果如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-819414.html
到了這里,關于最新ThinkPHP版本實現(xiàn)證書查詢系統(tǒng),實現(xiàn)批量數(shù)據(jù)導入,自動生成電子證書的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!