【uniapp】文件授权验真系统(含代码)

news2024/11/19 7:29:43

在这里插入图片描述

文章目录

  • 前言
  • 一、框架选用
  • 二、数据库设计
  • 三、设计上传列表
  • 四、上传操作
    • 1.前端
    • 2.后端
  • 五、修改操作
  • 六、访问操作
  • 七、二维码生成
  • 八、二维码访问
  • 九、删除操作
  • 总结


前言

吐槽:终于开通了【资源绑定】的功能了,之前还要一个一个的去贴链接
在这里插入图片描述

之前的同学联系我说,他们公司想做一个能将客户的证明材料通过二维码扫描显示验真结果的一个系统(经他们公司核对无误后的验真),这个功能不难开发,我们先梳理一下思路:

  1. 设计上传后显示的文件列表
  2. 具有替换、访问、删除、生成二维码、插入的功能
  3. 二维码扫描后显示验真结果

一、框架选用

这里用的是黄河爱浪大佬的B-ui插件
在这里插入图片描述

二、数据库设计

由于项目比较简单,只用了一个表
在这里插入图片描述

数据表字段说明
id自增id
name文件名(废弃)
path_name文件路径
cre_time创建时间

三、设计上传列表

在这里插入图片描述
index.vue

<template>
	<view>
		<view class="b-flex-x b-bg-white b-p-32">
			<image src="/static/logo.png" mode="aspectFit" class="logo b-radius-8"></image>
			<view class="b-flex-item b-ml-32">
				<view class="b-text-B b-text-48 b-text-black">B-ui v{{BuiVersion}}</view>
				<view class="b-font-24 b-mt-8 b-text-black-dd">@园游会永不打烊</view>
			</view>
		</view>
		<!-- <view class="b-flex-grow b-ml-32" style="width: 680rpx;">
			<input type="text" class="b-form-input" placeholder="请输入名称" style="width: 680rpx;" v-model="name">
		</view> -->
		<view class="b-bg-white b-pl-32 b-pr-32 b-pt-24 b-pb-24">
			<button class="b-btn b-btn-blue b-btn-block b-btn-lg" @click="upload()">上传图片</button>
		</view>
		<view class="b-pt-32 b-pr-32 b-pl-32 b-pb-24 b-text-black-dd">图片列表</view>
		<view class="b-list-user b-bg-white">
			<view class="b-list-item"
				  v-for="(item,index) in list" :key="index">
				<view class="b-flex-x">
					<view class="b-icon b-text-black-d">
						<image src="/static/tabBar/api.png" mode="widthFix" style="width: 50rpx;height: 50rpx;"></image>
					</view>
					<view style="font-size:20rpx;">{{item.cre_time}}</view>
				</view>
				<view class="btns-box">
					<button class="b-btn b-btn-blue b-btn-sm" @click="jumps_edit(item.id)"></button>
					<button class="b-btn b-btn-blue b-btn-sm" @click="jump(item.path_name)" style="margin-left: 10rpx;">访</button>
					<button class="b-btn b-btn-blue b-btn-sm" style="margin-left: 10rpx;" @click="jumps(item.id)"></button>
					<button class="b-btn b-btn-blue b-btn-sm" style="margin-left: 10rpx;" @click="delete_(item.id)"></button>
				</view>
			</view>
		</view>

		<view class="b-p-32 b-text-black-dd b-text-c b-text-20">
			<view>欢迎使用 B-ui </view>
			<view class="b-mt-8">&copy; 园游会永不打烊</view>
		</view>
	</view>
</template>



四、上传操作

在这里插入图片描述

1.前端

视图

<view class="b-bg-white b-pl-32 b-pr-32 b-pt-24 b-pb-24">
	<button class="b-btn b-btn-blue b-btn-block b-btn-lg" @click="upload()">上传图片</button>
</view>

js

upload(){
let that=this;
console.log("我被点击了");
uni.chooseImage({
success: (chooseImageRes) => {
const tempFilePaths = chooseImageRes.tempFilePaths;
console.log(tempFilePaths);
uni.uploadFile({
url: 'http://域名/upload.php', //仅为示例,非真实的接口地址
filePath: tempFilePaths[0],
name: 'file',
formData: {
// name:that.name
},
methods:"POST",
success: (uploadFileRes) => {
let json_data = JSON.parse(uploadFileRes.data)
console.log(uploadFileRes);
if (json_data['errCode']==0) {
uni.showToast({
title: json_data['error_message'],
icon:'none',
duration: 2000
});
} else{

}

that.get_list();
}
});
}
});

},

2.后端

<?php 
include 'conn.php';
// 上传图片 
function uploadimg($conn) { 
    $file = $_FILES['file'];
    // $name = $_REQUEST['name'];
    if ($file) { 
        // 获取文件后缀名
        $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
        // 创建随机文件夹
        $folder = 'upload/' . uniqid();
        if (!is_dir($folder)) {
            mkdir($folder, 0777, true);
        }
        // 生成文件名
        $filename = '验证结果.' . $ext;
        $target = $folder . '/' . $filename;
        // 转移图片地址
        if (!move_uploaded_file($file['tmp_name'], $target)) {
            $GLOBALS['error_message'] = '上传图片失败';
            echo error_message;
        }
        $sql="INSERT INTO `img_` (`id`, `name`, `path_name`, `cre_time`) VALUES (NULL, '', '$target', CURRENT_TIMESTAMP)";
        $resss=$conn->query($sql);
        die(
            json_encode(
                array(
                    'errCode' => 0,
                    'error_message'=>'图片上传成功',
                    'file'=>$target
                ),480)
        );
    }
}

uploadimg($conn);
?>

五、修改操作

在这里插入图片描述

因为他们可能会对,已经上传了的文件进行替换,所以替换需要根据记录id来进行修改,将新的文件替换对应记录

所以,只需要前端传值对应的id即可

<button class="b-btn b-btn-blue b-btn-sm" @click="jumps_edit(item.id)"></button>

js
进行图片上传,将新的地址对应id修改到数据库中

jumps_edit(id){
console.log(id)
uni.showToast({
title:'选择一张图片进行替换',
icon:'none'
})
setTimeout(function() {}, 1200);
uni.chooseImage({
success: (chooseImageRes) => {
const tempFilePaths = chooseImageRes.tempFilePaths;
console.log(tempFilePaths);
uni.uploadFile({
url: 'http://fzj.taila.club/upload_edit.php', //仅为示例,非真实的接口地址
filePath: tempFilePaths[0],
name: 'file',
formData: {
id:id
},
methods:"POST",
success: (uploadFileRes) => {
let json_data = JSON.parse(uploadFileRes.data)
console.log(uploadFileRes);
if (json_data['errCode']==0) {
uni.showToast({
title: json_data['error_message'],
icon:'none',
duration: 2000
});
uni.showToast({
title:'替换成功刷新生效',
icon:'none'
})

} else{
}
that.get_list();
}
});
}
});



}

六、访问操作

在这里插入图片描述

首页点击访问视图

<button class="b-btn b-btn-blue b-btn-sm" @click="jump(item.path_name)" style="margin-left: 10rpx;">访</button>

点击事件js

jumps(path){
console.log(path)
uni.navigateTo({
url:'/pages/qrcode/qrcode?path='+path
})
},

新建一个vue文件,将前端传过来的path与域名拼接即可,得到完整的文件地址,在onload事件中接收即可

video.vue

<template>
    <view>
      <view style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
      	<image :src="src" mode="widthFix" style="margin: auto;"></image>
      </view>
    </view>
</template>

<script>
export default {
    data() {
        return {
            src: ''
        }
    },
   
	onLoad(options) {
		this.src="http://fzj.taila.club/"+options.path
		
	},
    methods: {
      
    }
}
</script>


七、二维码生成

二维码生成用的链接可以是图片的url或者是上面访问操作的页面,但是客户要的效果是这个样子的:
在这里插入图片描述
也就是,标题必须是验真结果
所以就必须还要新建一个HTML用于显示标题,还要将图片显示出来

新建qrcode.vue文件
这里采用了qocode插件,具体是哪一个我忘记了,可以下载资源包看
二维码的url,对应拼接一下就行,例如:
"http://域名/show.php?id="+options.path,这里options.path在后面改成了id,因为替换的路径会变会导致二维码生成的图片不唯一,改成id用id去查询即可

<template xlang="wxml">
	<view class="container">
		<view class="qrimg">
			<view class="qrimg-i">
				<tki-qrcode v-if="ifShow" cid="qrcode1" ref="qrcode" :val="val" :size="size" :unit="unit" :background="background" :foreground="foreground" :pdground="pdground" :icon="icon" :iconSize="iconsize" :lv="lv" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
			</view>
			<!-- <view class="qrimg-i">
				<tki-qrcode v-if="ifShow" cid="qrcode2" ref="qrcode2" val="第二个二维码" :size="size" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
			</view> -->
		</view>


		<view class="uni-padding-wrap uni-common-mt">
			<view class="uni-title">设置二维码大小</view>
		</view>
		<view class="body-view">
			<slider :value="size" @change="sliderchange" min="50" max="500" show-value />
		</view>
		<view class="uni-padding-wrap">
			<view class="btns">
				<button type="primary" @tap="selectIcon">选择二维码图标</button>
				<button type="primary" @tap="creatQrcode">生成二维码</button>
				<button type="primary" @tap="saveQrcode">保存到图库</button>
				<!-- 		<button type="warn" @tap="clearQrcode">清除二维码</button>
				<button type="warn" @tap="ifQrcode">显示隐藏二维码</button> -->
			</view>
		</view>
	</view>
</template>
<script>
	import tkiQrcode from '@/components/tki-qrcode/tki-qrcode.vue'
	export default {
		data() {
			return {
				ifShow: true,
				val: 'http://www.taila.club', // 要生成的二维码值
				size: 300, // 二维码大小
				unit: 'upx', // 单位
				background: '#ffffff', // 背景色
				foreground: '#252625', // 前景色
				pdground: '#252625', // 角标色
				icon: '', // 二维码图标/static/logo.jpg
				iconsize: 40, // 二维码图标大小
				lv: 3, // 二维码容错级别 , 一般不用设置,默认就行
				onval: false, // val值变化时自动重新生成二维码
				loadMake: true, // 组件加载完成后自动生成二维码
				src: '' // 二维码生成后的图片地址或base64
			}
		},
		methods: {
			sliderchange(e) {
				this.size = e.detail.value
			},
			creatQrcode() {
				this.$refs.qrcode._makeCode()
			},
			saveQrcode() {
				this.$refs.qrcode._saveCode()
			},
			qrR(res) {
				this.src = res
			},
			clearQrcode() {
				this.$refs.qrcode._clearCode()
				this.val = ''
			},
			ifQrcode() {
				this.ifShow = !this.ifShow
			},
			selectIcon() {
				let that = this
				uni.chooseImage({
					count: 1, //默认9
					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
					sourceType: ['album'], //从相册选择
					success: function (res) {
						that.icon = res.tempFilePaths[0]
						setTimeout(() => {
							that.creatQrcode()
						}, 100);
						// console.log(res.tempFilePaths);
					}
				});
			}
		},
		components: {
			tkiQrcode
		},
		onLoad(options) {
			let that = this;
			that.val="http://fzj.taila.club/show.php?id="+options.path
		   
		},
	}
</script>

<style>
	/* @import "../../../common/icon.css"; */
	.container {
		display: flex;
		flex-direction: column;
		width: 100%;
	}
	
	.qrimg {
		display: flex;
		justify-content: center;
	}
	.qrimg-i{
		margin-right: 10px;
	}
	
	slider {
		width: 100%;
	}
	
	input {
		width: 100%;
		margin-bottom: 20upx;
	}
	
	.btns {
		display: flex;
		flex-direction: column;
		width: 100%;
	}
	
	button {
		width: 100%;
		margin-top: 10upx;
	}
</style>

八、二维码访问

二维码生成后,访问到"http://域名/show.php文件
新建show.php

<?php
include("conn.php");
?>
<!DOCTYPE html>
<html>
<head>
    <title>验真结果查询</title>
</head>
<body>
    <?php
     $id=$_GET['id'];
    // 图片路径
    
    $sql="SELECT `path_name` FROM `img_` WHERE `id`='$id'";
    $res=$conn->query($sql);
    if ($row=mysqli_fetch_assoc($res)) {
        // code...
        $imagePath = $row['path_name'];

    // 获取图片的宽度和高度
    list($width, $height) = getimagesize($imagePath);

    // 设置网页标题
    echo '<script>document.title = "验真结果";</script>';

    // 加载图片
    // echo '<div style="display: flex;justify-content: center;">';
    echo '<img src="' . $imagePath . '" alt="图片">';
    // echo '</div>';
    } else {
       die("查询不到数据");
    }
    
    
    
    ?>
</body>
</html>

在加载图片的时候将标题改为“验真结果”

 // 设置网页标题
    echo '<script>document.title = "验真结果";</script>';

九、删除操作

同理,根据id删除数据库记录即可

首页视图层

<button class="b-btn b-btn-blue b-btn-sm" style="margin-left: 10rpx;" @click="delete_(item.id)"></button>

新建delete.php

<?php
include('conn.php');
if ($_POST) {
$id=$_POST['id'];
$sql="DELETE FROM `img_` WHERE `id` = '$id'";
$re=$conn->query($sql);
 die(
        json_encode(
            array(
            'code' => 100,
            'msg' => '删除成功'
        ),480)
);
} else {
   die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '缺少参数'
        ),480)
);
}

总结

以上就是今天记录的内容,本文仅仅简单介绍了文件授权验真系统的制作过程,具体的资源包下载在这里。

喜欢爬虫类文章的可以订阅我专栏哦
⭐⭐欢迎订阅⭐⭐ ⭐⭐欢迎订阅⭐⭐
🚀Python爬虫项目实战系列文章!!
⭐⭐欢迎订阅⭐⭐ ⭐⭐欢迎订阅⭐⭐

🚀Python爬虫项目实战系列文章!!
⭐⭐往期文章⭐⭐

【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)
【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口

⭐⭐往期文章⭐⭐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ts学习基础篇(一)

旨在记录&#xff01; 这篇人都学废了&#xff0c;本想记录常用类型&#xff0c;越学越多&#xff0c;每一个都很重要… 一、string: 字符串类型二、number: 数字类型三、boolean: 布尔值四、array:数组五、tuple: 元组六、字面量七、object:对象八、any: 任意类型九、unknown:…

【KingFusion】用趋势曲线组件实现实时曲线的步骤

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 本节学习测试用KingFusion趋势曲线组件实现电流的实时曲线的展示。 一、效果演示&#xff1a; 展示实时曲线的运行效果&#xff0c;效果为KingFunsion3.6通过KingIOServer连接现场系统中实际数据的演示效果。 二、…

代码随想录-单调栈|ACM模式实践

代码随想录感想 ​​​​​​739. 每日温度 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 496. 下一个更大元素 I 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 503. 下一个更大元素 II 题目描述&#xff1a; …

我开源了团队内部基于SpringBoot Web快速开发的API脚手架stater

我们现在使用SpringBoot 做Web 开发已经比之前SprngMvc 那一套强大很多了。 但是 用SpringBoot Web 做API 开发还是不够简洁有一些。 每次Web API常用功能都需要重新写一遍。或者复制之前项目代码。于是我封装了这么一个 抽出SpringBoot Web API 每个项目必备需要重复写的模块…

【100天精通python】Day3:python的基本数据类型和数据类型转换

一. python的基本数据类型 以下是一些常见的举例和详细解释&#xff1a; 整数&#xff08;int&#xff09;&#xff1a;表示整数值。例如&#xff1a; x 5&#xff1a;将整数值5赋给变量x。 y -10&#xff1a;将整数值-10赋给变量y。 浮点数&#xff08;float&#xff09;&a…

【聚焦机器学习与实践经验的实用指南——《Python机器学习项目实战》】

《Python机器学习项目实战》引领大家在构建实际项目的过程中&#xff0c;掌握关键的机器学习概念!使用机器学习&#xff0c;我们可完成客户行为分析、价格趋势预测、风险评估等任务。要想掌握机器学习&#xff0c;需要有优质的范例、清晰的讲解和大量的练习。本书完全满足这三点…

漏洞复现-CVE-2022-24112原理与复现

目录 漏洞原理漏洞描述影响范围 apisix学习漏洞复现config.yaml环境搭建exp代码 入侵检测与修复总结参考 漏洞原理 漏洞描述 An attacker can abuse the batch-requests plugin to send requests to bypass the IP restriction of Admin API. A default configuration of Apa…

基于JavaSwing+MySQL的电影票购票管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88051172?spm1001.2014.3001.5503 JDK1.8 MySQL5.7 功能&#xff1a;管理员与用户两个角色登录&#xff0c;管理员可以对电影进行增删改查处理&#xff0c;可以对影院增删改查管理&#x…

【C语言】类型转换和优先级

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

【Linux系统编程】Linux第一个小程序——进度条

文章目录 1. 对回车&#xff08;\r&#xff09;和换行&#xff08;\n&#xff09;的理解1.1 概念理解1.2 测试 2. 缓冲区的理解2.1 观察现象2.2 原因解释 3. 倒计时小程序4. 进度条小程序4.1 基本思路及实现4.2 改进及优化4.3 增加百分比显示4.4 增加旋转光标4.5 给进度条配色 …

基于FT232HL的USB2.0转ARINC429板卡

基于FT232HL的USB2.0转ARINC429板卡 1 概述 《USB2.0转ARINC429板卡》采用底板子板&#xff0c;层叠安装的结构&#xff1b;使用同样的底板&#xff0c;变换不同功能的子板实现不同的功能版本。 a) 降低硬件设计复杂度&#xff1a;新板卡设计只需要设计子板&#xff0c;子板的…

类和对象(C++)( static成员、explicit、友元、内部类、匿名对象)

类和对象 static成员概念static成员“登场”特性static成员使用 注意 explicit从一段代码引入explicit和explicit相关特性 友元友元函数引入问题解决 小结 友元类 内部类概念特性 匿名对象引入使用 static成员 概念 类的静态成员&#xff1a;声明为static的类成员。 静态成员变…

【黑客】网络安全靠自学?只会毁了你!

1️⃣网安现状 ❗本文面向所有 想要涉足网安领域 或 已经涉足但仍处在迷茫期 的伙伴&#xff0c;如果你月薪达到了3w&#xff0c;那么请你离开。 如果没有&#xff0c;希望你继续看下去&#xff0c;因为你人生的转折点将从这篇文章开始。 ✈️网络安全&#xff0c;一个近几年大…

5 个能出色完成数据恢复的免费数据恢复软件知识分享。

有时&#xff0c;由于意外删除或某些问题&#xff0c;您可能会丢失 Windows 10 笔记本电脑或台式机上的重要数据。Windows 操作系统不提供任何内部工具来恢复已删除的数据。但是有一些非常好的数据恢复软件可以更专业地完成这项工作。最好的人总是有报酬的&#xff0c;但不用担…

按键精灵、auto.js等一些移动端脚本 如何连接云服务器的数据库, 进行读写操作

一、技术背景 按键手机版和auto.js&#xff0c;只支持连接本地数据库sqllite&#xff0c;该数据库只存在本地 其他设备无法读写&#xff0c;就像本地的txt一样。 而很多脚本作者的需求是&#xff1a;多个脚本&#xff0c;甚至在全国不同城市的脚本也能读取和写入同一批数据&…

AJAX-day01

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 AJAX 概念和 axios 使用 什么是 AJAX 怎么用 AJAX &#xff1f; axios 使用 认识 URL 什么是 URL&…

韦东山Linux教学视频中的makefile文件详细介绍

前言 &#xff08;1&#xff09;在学习韦东山Linux教学视频的时候&#xff0c;他的makefile并没有做详细的介绍。以至于我学了很长时间对他的makefile文件不理解。所以本文将会详细介绍韦东山Linux教学视频中的makefile文件含义。 &#xff08;2&#xff09;注意&#xff1a;我…

使用 docker-compose 部署 Jenkins

注&#xff1a;我是在虚拟机&#xff08;Ubuntu&#xff09;上部署了 docker-compose&#xff0c;然后才使用 docker-compose 部署 Jenkins&#xff01; 关于如何在 Ubuntu 部署 docker-compose&#xff0c;可以看我其它的文章。 本文目录 1. 创建 docker_jenkins_compose 目录…

【NI USRP】每一个USRP是如何命名的呢,和原厂Ettus型号有什么关联呢?

详细的硬件配置&#xff0c;非常有助于设备的选型。 如果您采购了X310子板&#xff0c;是可以将其转化为对应的USRP型号的设备。 B系列 EttusNI-USRP频段最大带宽通道B200mini无70 MHZ - 6 GHZ56 MHz1X1B200mini-i无70 MHZ - 6 GHZ56 MHz1X1B205mini-i无70 MHZ - 6 GHZ56 MHz…

三菱以太网通讯模块在哪

捷米特JM-ETH-FX采用工业级设计&#xff0c;导轨安装&#xff0c;带通讯线。不占用PLC编程口&#xff0c;上位机通过以太网对PLC数据监控的同时&#xff0c;触摸屏可以通过复用接口X2与PLC进行通讯。捷米特JM-ETH-FX支持工控领域内绝大多数SCADA软件&#xff0c;支持三菱MC以太…