【Uniapp】支付链转二维码

前言


提示:这个是一个很小的项目,大概30分钟就能搞定
在这里插入图片描述
实现方式:输入支付代码,存储到对应的数据库表中,二维码访问一个PHP文件通过id来进行重定向,这样就可以使每张二维码都是固定的,替换二维码内容也只需改数据库的即可

文章目录

  • 前言
  • 一、设计UI界面
  • 二、设计数据库
  • 三、设计接口
    • 列表接口
    • 数据更新接口
  • 四、设计重定向访问页面
  • 四、解决跨域问题
    • 第一步
    • 第二步
    • 第三步
  • 总结


提示:以下代码需要导入B-ui插件,或者在页面顶部直接下载资源即可

一、设计UI界面

在这里插入图片描述
在这里插入图片描述

index.vue
<template>
	<view>


		<view class="b-popup " v-if="showPopup" :class="[directionClass,{'b-popup-round':round},{'b-popup-animation':animation}]">
			<view class="b-popup-shade" @click="showPopup = false"></view>
			<view class="b-popup-content">
				<!-- 你的内容写在这里 -->
				<view class="b-p-32" style="width: 500rpx;height: 300rpx;display: flex;flex-direction: column;justify-content: center;align-items: center;">
					<input placeholder="填入新的支付代码" v-model="update_url" style="background-color: #ccc;height: 80rpx;width: 487rpx;" />
					<view style="margin-top: 20rpx;">
						<button class="b-btn b-btn-blue" @click="update__()">确认</button>
						<button class="b-btn b-btn-red" @click="show(false)" style="margin-left: 50rpx;">取消</button>
					</view>

				</view>
			</view>
		</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">支付链接转二维码 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.id}}</view>
				</view>
				<view class="btns-box">
					<button class="b-btn b-btn-blue b-btn-sm" @click="jumps_edit(item.id)">修改URL</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>

<script>
	export default {
			
			data() {
				return {
					select_id:'',
					update_url:'',
					showPopup:false,
					directionClass:"",
					round:true,
					animation:true,
					name:"",
					BuiVersion:"",
					list:[],
			
			}},
		
			onLoad() {
				this.BuiVersion = uni.Bui.version;
				this.get_list();
			},
			methods: {
				
				update__(){
					let that=this;
						uni.request({
						url: 'https://*****/update.php', 
							data: {
								url:that.update_url,
								id:that.select_id
								},
								method: 'POST',
								header: {
								'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
								},
								success: (res) => {
									if (res.data.code==200) {
										uni.showToast({
											title:res.data.msg
										})
									} else{
										uni.showToast({
											title:res.data.msg
										})
									}
									this.update_url='';
									that.showPopup=false;
								}
						})
				},
				show(status = true){
					this.showPopup = status;
					this.update_url='';
				},
				get_list(){
					 let that=this;
									uni.request({
									url: 'https://*****/get_list.php', 
									data: {
									},
									method: 'POST',
									header: {
									'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
									},
									success: (res) => {
										console.log(res.data)
										that.list=res.data.data;
									}
									})
				},
				
		jump(path){
			uni.navigateTo({
				url:'/pages/video/video?path='+path
			})
		},
		jumps(path){
			console.log(path)
			uni.navigateTo({
				url:'/pages/qrcode/qrcode?path='+path
			})
		},
		jumps_edit(id){
			let that=this;
			that.select_id=id;
			
			that.showPopup = true;
			
			}
				}
		}
</script>

<style lang="scss">
	.logo{
			width: 140rpx;
			height: 140rpx;
		}
		
	
		
		.line-top{
			border-top: #eee solid 1px;
		}
</style>
qrcode.vue
<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: '', // 要生成的二维码值
			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="https://******/location.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>

二、设计数据库

在这里插入图片描述


三、设计接口

列表接口

固定位置在数据库即可,前端刷新出来通过id进行操作

get_list.php
<?php
// 假设你已经建立了数据库连接 $conn
// 这里我们假设数据库表名为 url_list
include 'conn.php';
// 查询数据库,获取数据
$query = "SELECT * FROM url_list";
$result = $conn->query($query);

// 检查查询结果是否成功
if (!$result) {
    die(
        json_encode(
            array(
                'code' => 500,
                'msg' => '查询失败',
            ),
            JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
        )
    );
}

// 将查询结果转换为关联数组
$data = array();
while ($row = mysqli_fetch_assoc($result)) {
    $data[] = $row;
}

// 释放查询结果资源
mysqli_free_result($result);

// 输出JSON格式的数据
die(
    json_encode(
        array(
            'code' => 200,
            'data' => $data,
            'msg' => '查询成功',
        ),
        JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
    )
);
?>

数据更新接口

既然要实现,不更改二维码替换内容,那数据库的数据需要改变,就不得不弄一个能修改的操作

update.php
<?php
include 'conn.php';
if ($_POST) {
    $url=$_POST['url'];
    $id=$_POST['id'];
    $sql="UPDATE `url_list` SET `url` = '$url' WHERE `id` = '$id'";
    $res=$conn->query($sql);
     die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '更改成功'
        ),480)
);
} else {
   die(
        json_encode(
            array(
            'code' => 100,
            'msg' => '请求失败'
        ),480)
);
}




四、设计重定向访问页面

上述工作都做完了,现在就差重定向页面。什么是重定向?

重定向是指将一个网页、URL或文件请求从一个位置转发到另一个位置的过程。在互联网和计算机领域,重定向是一种常见的技术,用于将用户从一个网址或链接导向到另一个网址或链接。

重定向通常有两种类型:

  1. 服务器端重定向:当用户访问一个网页或URL时,服务器会检测到这个请求,并根据预先设定的规则,将用户的请求从原始网址转发到新的目标网址。这个过程是在服务器端完成的,用户通常无法察觉到重定向的发生。服务器端重定向是通过HTTP状态码实现的,如301永久重定向、302临时重定向等。
  2. 客户端重定向:这种重定向是通过网页上的特定代码(通常是JavaScript或HTML的标签)来实现的。当用户访问一个网页时,网页上的代码会检测到用户的请求,并将用户自动导向到新的目标网址。客户端重定向可以通过页面刷新或页面跳转来实现。
    重定向在网站管理和维护中有多种用途。一些常见的应用包括:
  3. 网址更改:当网站的URL发生变化时,可以使用重定向将原始URL导向到新的URL,以确保用户仍能够访问到所需内容。
  4. 域名重定向:当网站的域名更改或网站需要多个域名来访问时,可以使用重定向将用户从一个域名导向到另一个域名。
  5. 错误页面处理:当用户访问一个不存在的页面或出现错误时,可以使用重定向将用户引导到一个有效的页面,或者返回一个合适的错误信息。
  6. 流量管理:通过重定向,网站管理员可以控制特定页面的访问量,将用户导向不同的内容或服务。

总之,重定向是一种有用的技术,能够为网站提供更好的用户体验和更有效的管理,可实现域名跳转。

我们通过对二维码的设置使每个栏位根据id来生成二维码,通过传递id给重定向文件,然后重定向文件去数据库查询最新的URL来实现跳转

onLoad(options) {
		let that = this;
		that.val="https://******/location.php?id="+options.path
	   
	},
location.php
<?php
// 重定向的目标链接
include("conn.php");
if ($_GET['id']) {
$id=$_GET['id'];
$query = "SELECT url FROM `url_list` WHERE `id` = '$id'";
$result = $conn->query($query);

if ($result->num_rows > 0) {
    // If at least one row is found, extract the id
    $row = $result->fetch_assoc();
    $url = $row['url'];
    $redirect_url = $url;
    // 执行重定向
    header("Location: " . $redirect_url);
} else {
    // If no data is found, display a message
    echo "没有数据";
}

// Don't forget to close the database connection after using it
$conn->close();
exit();
   



} else {
 die("参数不合法");
}


?>

四、解决跨域问题

第一步

打开manifest.json,勾选Https等其他如图
在这里插入图片描述

第二步

替换所有的域名http为https

第三步

服务端配置SSL证书,设置为强制
在这里插入图片描述

总结

以上就是今天记录的内容,本次项目很简单,是一个新手练手的项目,重定向解决办法就是保持协议一致,你也可以不按我的来,只要统一即可

🍋希望你能喜欢我的其他作品
《记一次云之家签到抓包》
《记一次视频抓包m3u8解密过程》
《抓包部分软件时无网络+过代理检测 解决办法 安卓黄鸟httpcanary+vmos》
《Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)》
《某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架》

推荐专栏:

《Python爬虫脚本项目实战》

该专栏往期文章:
《【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)》

🥦如果感觉看完文章还不过瘾,欢迎查看我的其它专栏
🥦作者对python有很大的兴趣,完成过很多独立的项目:例如滇医通等等脚本,但是由于版权的原因下架了,爬虫这一类审核比较严谨,稍有不慎就侵权违规了,所以在保证质量的同时会对文章进行筛选

如果您对爬虫感兴趣请收藏或者订阅该专栏哦《Python爬虫脚本项目实战》,如果你有项目欢迎联系我,我会同步教程到本专栏!

🚀Python爬虫项目实战系列文章!!
⭐⭐欢迎订阅⭐⭐

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

⭐⭐欢迎订阅⭐⭐
在这里插入图片描述

Python爬虫脚本项目实战
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

blender 用蒙版添加材质

一、添加材质常规方法 选择物体新建材质&#xff0c;shift a 新建图像纹理&#xff0c;此时会发现添加上的纹理会有接缝&#xff0c;shift a 新建映射 纹理坐标&#xff0c;纹理坐标选择生成&#xff0c;此时&#xff0c;之前的接缝便会消失&#xff1b; 如何快捷添加纹理坐…

13个ChatGPT类实用AI工具汇总

在ChatGPT爆火后&#xff0c;各种工具如同雨后春笋一般层出不穷。以下汇总了13种ChatGPT类实用工具&#xff0c;可以帮助学习、教学和科研。 01 / ChatGPT for google/ 一个浏览器插件&#xff0c;可搭配现有的搜索引擎来使用 最大化搜索效率&#xff0c;对搜索体验的提升相…

Tomcat 安装配置教程及成功后,启动失败报错解决方案

解决方案 我的报错原因是因为我的JDK是1.8的而我的Tomcat是10版本的&#xff0c;可能是因为版本原因吧&#xff0c;我重新装了Tomcat 9就可以启动成功了&#xff01; 简单说下安装的时候需要注意哪些步骤吧 今天我在安装tomcat10的时候&#xff0c;安装成功后&#xff0c;启…

自定义类型讲解

&#x1f495;痛苦难道是白忍受的吗&#xff1f;&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;自定义类型讲解 一.结构体 定义&#xff1a; 数组&#xff1a;多组相同类型元素的集合 结构体&#xff1a;多组不同类型元素的集合-->管理多组不同类型数据…

Rust vs Go:常用语法对比(十三)

题图来自 Go vs. Rust: The Ultimate Performance Battle 241. Yield priority to other threads Explicitly decrease the priority of the current process, so that other execution threads have a better chance to execute now. Then resume normal execution and call f…

kettle 学习笔记

kettle 学习笔记 个人理解下载 / 安装kettle及测试环境准备kattle下载安装JDK安装配置MySQL安装配置 使用练习创建数据库连接转换练习 个人理解 ETL工具的一种&#xff0c;作用是将数据进行抽取&#xff0c;转换&#xff0c;应该是数据中心类型的项目用的比较多&#xff0c;将…

用html+javascript打造公文一键排版系统8:附件及标题排版

最近工作有点忙&#xff0c;所 以没能及时完善公文一键排版系统&#xff0c;现在只好熬夜更新一下。 有时公文有包括附件&#xff0c;招照公文排版规范&#xff1a; 附件应当另面编排&#xff0c;并在版记之前&#xff0c;与公文正文一起装订。“附件”二字及附件顺序号用3号黑…

网络层中一些零碎且易忘的知识点

异构网络&#xff1a;指传输介质、数据编码方式、链路控制协议以及数据单元格式和转发机制不同&#xff0c;异构即物理层和数据链路层均不同RIP、OSPF、BGP分别是哪一层的协议&#xff1a; -RIPOSPFBGP所属层次应用层网络层应用层封装在什么协议中UDPIPTCP 一个主机可以有多个I…

【2023年11月第四版教材】《第1章-信息化发展之<1信息与信息化>》

第01章-信息化发展 1 信息与信息化 大部分为新增内容&#xff0c;预计选择题考4分&#xff0c;案例和论文不考。本章与第三版相同内容将斜体表示。 1 信息与信息化 1、信息是物质、能量及其属性的标示的集合&#xff0c;是确定性的增加。 2、控制论的创始人维纳认为:信息就是信…

【大数据趋势】7月30日 汇率,恒指期货的大数据趋势概率分析。

1. 数据源头之一 : 汇率变化 从程序模拟趋势来看&#xff0c;美元在持续弱势状态&#xff0c;周线上正在构建一个新的下跌趋势&#xff0c;而且正在反抽过程中&#xff0c;即将完成&#xff0c;如果没有外部干预&#xff0c;会顺势往下。从月线来看&#xff0c;高点逐步降低&a…

学习记录——Octave Convolution、LSK

Octave Convolution 2019 ICCV 自然世界中的图像存在高低频&#xff0c;卷积层的输出特征图以及输入通道&#xff0c;也都存在高、低频分量。 低频分量支撑的是整体轮廓&#xff0c;高频分量则关注细节&#xff0c;显然&#xff0c;低频分量是存在冗余的&#xff0c;在编码过程…

区块链学习笔记

区块链技术与应用 数组 列表 二叉树 哈希函数 BTC中的密码学原理 cryptographic hash function collsion resistance(碰撞抵抗) 碰撞指的是找到两个不同的输入值&#xff0c;使得它们的哈希值相同。也就是说&#xff0c;如果存在任意两个输入x和y&#xff0c;满足x ≠ y…

AC+FIT(瘦AP)配置浅谈

FIT ensp实验材料 &#xff1a;pc、路由器、三层交换机、二层交换机、ac、ap 保证连通性&#xff1a; 根据ac与ap设计好的ip配置&#xff0c;使之可以通讯 ac与ap可以实现跨网段管理 1、设置三层交换机的vlan 与vlanif信息 dhcp enable //开启dhcp ip pool forap //…

WEB:unseping

背景知识 php序列化和反序列化 命令执行绕过方式 题目 进行代码审计 可知为反序列化 整体是创建case类&#xff0c;可接受post传来的ctf值 _consturuct函数,是在函数调动前启用&#xff0c;构造了$method和$args两个变量。 _dexstruct函数在变量摧毁的时使用&#xff0c;所…

SQL 执行计划管理(SPM)

一、SPM 需求背景 任何数据库应用程序的性能在很大程度上都依赖于查询执行&#xff0c;尽管优化器无需用户干预就可以评估最佳计划&#xff0c;但是 SQL 语句的执行计划仍可能由于以下多种原因发生意外更改&#xff1a;版本升级、重新收集优化器统计信息、改变优化器参数或模式…

IT技术面试中常见的问题及解答技巧

在IT技术面试中&#xff0c;面试官常常会问到一些常见的问题&#xff0c;针对这些问题&#xff0c;我们可以充分准备和提前准备一些解答技巧。下面我将分享一些我个人的经验和观察&#xff0c;希望对大家有所帮助。 请介绍一下你的项目经验。 在回答这个问题时&#xff0c;我们…

Linux命令大全

目录 第一章、系统命令1.1&#xff09;系统命令1.2&#xff09;目录结构1.3&#xff09;编辑命令vi/vim 第二章、文件操作命令&#xff08;区分大小写&#xff09;2.1&#xff09;查看查找文件和文件信息&#xff0c;切换目录2.2&#xff09;新建/删除/复制/移动修改文件和文件…

go 如何知道一个对象是分配在栈上还是堆上?

如何判断变量是分配在栈&#xff08;stack&#xff09;上还是堆&#xff08;heap&#xff09;上&#xff1f; Go和C不同&#xff0c;Go局部变量会进行逃逸分析。如果变量离开作用域后没有被引用&#xff0c;则优先分配到栈上&#xff0c;否则分配到堆上。判断语句&#xff1a;…

苍穹外卖day10——订单状态定时处理(Spring Task)、来单提醒和客户催单(WebSocket)

预期效果 对于超时没处理的需要定时程序处理。基于SpringTask实现。 来单提醒和客户催单。基于WebSocket实现。 Spring Task 介绍 Cron表达式 周几通常不能和日一起指定。 cron表达式在线生成器 在线Cron表达式生成器 入门案例 创建定时任务类 /*** 定义定时任务类*/ Slf4j…

HCIA实验四

一.实验要求&#xff1a; 1、R4为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4与其他所有直连设备间均使用共有IP&#xff1b; 2、R3 - R5/6/7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个网络配置OSPF环境&#xff0c;IP基于172.16.0.0/16网段划分&#x…