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

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

前言

吐槽:终于开通了【资源绑定】的功能了,之前还要一个一个的去贴链接

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

  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)
);
}

总结

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

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
3月前
|
监控 数据可视化 关系型数据库
微服务架构+Java+Spring Cloud +UniApp +MySql智慧工地系统源码
项目管理:项目名称、施工单位名称、项目地址、项目地址、总造价、总面积、施工准可证、开工日期、计划竣工日期、项目状态等。
308 6
|
4月前
|
存储 JavaScript 开发工具
uniapp-实现微信授权登录
uniapp-实现微信授权登录
756 0
|
6月前
|
小程序 API
uniapp小程序选择文件并上传到uniCloud
uniapp小程序选择文件并上传到uniCloud
155 0
|
12天前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的医院核酸检测服务系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的医院核酸检测服务系统的详细设计和实现
35 0
|
2月前
|
移动开发 监控 小程序
mPaaS常见问题之uniapp ios端云打包的配置config文件如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
30 0
|
3月前
|
人工智能 监控 安全
智慧工地uniapp项目管理系统源码
智慧工地是指应用物联网、大数据、云计算、人工智能等新兴技术,对建筑工地进行数字化、信息化、智能化改造的一种新型工地管理模式
35 0
|
3月前
|
数据采集 机器学习/深度学习 移动开发
uniapp+springboot医院智能导诊系统源码,自动兼容小程序与H5版本
技术架构:Uniapp+springboot+redis+mybatis plus+mysql+RocketMQ
74 0
|
3月前
|
API
uniapp怎么实现授权登录
uniapp怎么实现授权登录
46 2
|
4月前
|
开发者
uniapp-微信授权登录
uniapp-微信授权登录
146 0
|
5月前
|
JSON JavaScript 小程序
uniapp的配置文件、入口文件、主组件、页面管理部分
uniapp的配置文件、入口文件、主组件、页面管理部分

热门文章

最新文章