音乐播放APP初步开发(二)自动登录和 扫码识别设备

在登录页面login.html初次登录时,发送post请求,对返回的数据判断,如果code=0,表示已经登录成功的用户。则将其_id数据设置到类似cookie的全局中去。

if(data.code==0){
                        window.localStorage.setItem("user",data.data._id);
                        // console.log(window.localStorage.getItem("user"));
                        console.log(JSON.stringify(data.data))
                        mui.openWindow({
                        url:"userinfo.html",
                        id:"userinfo.html",
                        styles:{
                            top:"0px",
                            bottom:"50px"
                        },
                        extras:data.data,
                        createNew:true
                        })
                    }

createNew:true 是对页面刷新数据,不刷新页面会默认使用原页面,无法获取到数据

在index.html点击设置时,会先取出公共变量中的数据,若有值,则直接跳转个人中心,否则跳转登录页面

document.getElementById(‘self‘).addEventListener(‘tap‘, function() {
                if (window.localStorage.getItem("user")) {
                    mui.post(window.serv_auto,{
                            "_id":window.localStorage.getItem("user")
                        },function(data){
                            console.log(JSON.stringify(data))
                            mui.openWindow({
                                "url": "userinfo.html",
                                "id": "userinfo.html",
                                styles: {
                                    top: "0px",
                                    bottom: "50px"
                                },
                                extras:data.data,
                                // createNew:true
                            })
                        },‘json‘
                    );

                } else {
                    mui.openWindow({
                        "url": "login.html",
                        "id": "login.html",
                        styles: {
                            top: "0px",
                            bottom: "50px"
                        },

                    })
                }

            })

本质上 window.localStorage.getItem("user")返回的就是用户在MongoDB中的objectID值: 5cc6c01b2893361a88b70189

创建二维码:

在个人中心点击扫码,跳转至识别二维码页面,扫码判断该设备是否为授权设备,在页面识别成功时,返回提示信息

1.先去创建授权的二维码,存放到MongoDB

这里采用联图网二维码开放平台去生成二维码:http://www.liantu.com/pingtai/

创建二维码的脚本:

import requests,os,time,hashlib
from setting import LT_URL,QR_CODE,mongoDB
from uuid import uuid4

def creat_QR(number):
    qr_list=[]
    for i in range(number):
        qr=hashlib.md5(f‘{uuid4()}{time.time()}{uuid4()}‘.encode("utf8")).hexdigest()
        res=requests.get(LT_URL%(qr))

        QR_PATH=os.path.join(QR_CODE,f‘{qr}.jpg‘)
        with open(QR_PATH,"wb")as f:
            f.write(res.content)
        qr_dict={"device_key":qr}
        qr_list.append(qr_dict)
        time.sleep(0.5)
    print(qr_list)

    mongoDB.devices.insert_many(qr_list)

creat_QR(5)

该接口返回的数据为二进制流图片二维码,将其存放至指定目录,并将文件名存放至MongoDB

2.创建二维码识别页面:

在个人中心跳转至扫码页面

document.getElementById(‘qr_code‘).addEventListener(‘tap‘,function () {
                    mui.openWindow({
                                "url":"device.html",
                                "id":"device.html",
                                styles:{
                                    top:"0px",
                                    bottom:"0px"
                                },

                            })
            })

扫码页面完整代码:

<!doctype html>
<html>

    <head>
        <meta charset="utf-8">
        <title></title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <link href="css/mui.css" rel="stylesheet" />
    </head>

    <body>
        <header class="mui-bar mui-bar-nav">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title">二维码/条形码</h1>
        </header>
        <div class="mui-content">
            <div id="bcid" style="width: 100%; height: 580px;"></div>
        </div>
        <script src="js/mui.min.js"></script>
        <script type="text/javascript">
            mui.init()

            function inmarked(type, result) {
                var text = "未知: ";
                switch (type) {
                    case plus.barcode.QR:
                        text = "QR: "
                        break;
                    case plus.barcode.EAN13:
                        text = ‘EAN13: ‘;
                        break;
                    case plus.barcode.EAN8:
                        text = ‘EAN8: ‘;
                        break;
                }
                alert(text+result);

                mui.post(window.serv_qr,{
                        "device_key":result
                    },function(data){
                        mui.toast(JSON.stringify(data))
                        console.log(JSON.stringify(data))
                    },‘json‘
                );
            }
            var scan = null;
            mui.plusReady(function() {
                scan = new plus.barcode.Barcode("bcid");
                scan.start();
                scan.onmarked = inmarked;

            })
        </script>
    </body>

</html>

device.html

mui.init()

            function inmarked(type, result) {
                var text = "未知: ";
                switch (type) {
                    case plus.barcode.QR:
                        text = "QR: "
                        break;
                    case plus.barcode.EAN13:
                        text = ‘EAN13: ‘;
                        break;
                    case plus.barcode.EAN8:
                        text = ‘EAN8: ‘;
                        break;
                }
                alert(text+result);

                mui.post(window.serv_qr,{
                        "device_key":result
                    },function(data){
                        mui.toast(JSON.stringify(data))
                        console.log(JSON.stringify(data))
                    },‘json‘
                );
            }
            var scan = null;
            mui.plusReady(function() {
                scan = new plus.barcode.Barcode("bcid");
                scan.start();
                scan.onmarked = inmarked;

            })

创建一个扫码对象,并启用该对象

在扫码识别成功后,将数据以post方式发送给后端,去处理逻辑。

后台蓝图代码:

from flask import Blueprint,request,jsonify
from setting import mongoDB,RET

device_code=Blueprint("device_code",__name__)

@device_code.route(‘/qr_code‘,methods=["POST",])
def qr_code():
    qr=request.form.to_dict()
    ret=mongoDB.devices.find_one(qr,{"_id":0})
    if ret:
        RET["code"]=0
        RET["msg"]="合法的设备,开始绑定"
        RET["data"]=ret

    else:
        RET["code"] = 2
        RET["msg"] = "非法的设备,请更换!"
        RET["data"]={}

    return jsonify(RET)

返回的数据作为页面的提示信息页面效果图:

识别非数据库中的二维码:

识别数据库中的二维码:

原文地址:https://www.cnblogs.com/wen-kang/p/10799213.html

时间: 2024-08-27 18:56:27

音乐播放APP初步开发(二)自动登录和 扫码识别设备的相关文章

Android开发之自动登录功能的实现

在我们平时使用的手机应用都可以实现只需要登陆一次账号后,第二次进入应用直接跳转到效果界面的效果,还有QQ的登陆框是如何记忆我们的隐身登陆,保存账号选项的呢,这些都是通过使用SharedPreferences共享参数效果实现的,而无须使用数据库来存储.以下我们直接看详细代码分析. package com.example.account.login; import java.util.HashMap; import java.util.Map; import com.android.dao.MySQ

高仿天天动听音乐播放器,可联网下载歌词_Android源码

Android源码仿天天动听音乐播放器,可联网下载歌词 功能分类:影音 支持平台:Android 运行环境:Eclipse 开发语言:Java 开发工具:Eclipse 源码大小:1.94MB 下载地址:http://www.dwz.cn/wGVt2 源码简介 Android源码仿天天动听音乐播放器,可联网下载歌词. 源码运行截图

Delphi制作QQ自动登录器源码

Delphi制作QQ自动登录器源码 http://www.cnblogs.com/sunsoft/archive/2011/02/25/1964967.html 以TM2009为例,检查了一下,未登录之前一个窗体,上边两个控件,登录以后,窗体捕获到一个控件,根据这个,首先找到QQ登录框,输入用户名,密码的位置,获取窗体句柄的具体代码如下: 这里先定义了一个record类型, 1   TQQWnd= record 2     QQWnd,QStatusWnd: HWND;  //QQ窗口句柄,QQ

微信小程序使用场景延伸:扫码登录、扫码支付

微信小程序使用场景延伸:扫码登录.扫码支付 小程序最适合的使用场景有哪些?相比大家能列举出来很多,但这个场景,大家可能多数没想到_^ 笔者团队近期接到了一个PC项目:转转游戏租号PC官网,该项目要求在PC端实现整个交易流程,问题来了,我司(转转)一直深耕于移动端,在PC端几乎啥都没有,甚至都没有个像样的登录流程.购买流程...当大家在探讨如何接入微信授权登录.微信扫码支付等一大套流程之际,笔者力排众议,机智的提出:为什么不用小程序来实现这些功能! 备注:『转转官方』是我司开发的一款小程序,实现了

软件开发必会的设备知识——扫描枪扫码识别解析视频课程

课程目标现在是信息化时代,也是扫描时代,作为软件开发IT人士,在开发软件的同时特别需要了解相关的硬件设备知识,只有了解硬件才可以开发与之相配套的软件.通过本课程的学习,了解扫描枪设备工作原理,以及如何识别整件条形码和单件条形码商品.适用人群电脑爱好者.所有职场人士,IT软件开发人员课程简介现在是信息化时代,也是扫描时代,作为软件开发IT人士,在开发软件的同时特别需要了解相关的硬件设备知识,只有了解硬件才可以开发与之相配套的软件.通过本课程的学习,了解扫描枪设备工作原理,以及如何识别整件条形码和单

app后端开发二:API接口文档工具

悲伤的历史 在进行app后端开发过程中,后端会提供出来很多的api接口供前端开发使用,为了让前端开发人员顺利使用,我们会写好一份文档,告诉他们这个接口你该用 GET 还是 POST 来访问,同时访问的时候该给我传递一些什么参数,以及正确的时候我会返回什么给你,已经返回的数据样式以及字段解释等等这些事情,我们都需要在文档中写好写清楚. 在 app后端开发一:基于swagger-ui构建api接口文档工具 这篇博客中,我写了 swagger-ui 的好处以及优势.但是在使用过程中,发现不够给力.我想

8. PHP接入微信的三种支付:APP支付、公众号支付、扫码支付

微信的支付逻辑与支付宝的支付有一些差别.为了让客户端忽略这些差别,统一调用.本sdk做了对应处理. # SDK调用 微信支付不同接口需要的参数会有差别.请大家在使用接口时,仔细查看文档. use Payment\ChargeContext; use Payment\Config; use Payment\Common\PayException; // 微信支付,必须设置时区,否则发生错误 date_default_timezone_set('Asia/Shanghai'); // 生成订单号 便

像音乐播放App一样移动背景

假设你常常听歌.你会发现歌曲app的背景会随着音乐移动的,从左到右或者从上到下.这样的动画尽管简单,可是这里有一个技巧. 假设你还不明确这样的动效看看以下的demo (很多其它具体请參考:https://github.com/flavienlaurent/PanningView) 一,使用setImageMatrix播放图片动画 以下是官方文档给出的解释 你能够看到这里的解释非常easy.就是取代ImageView的图像矩阵.然后configureBounds和invalidate被调用. 在j

Qt音乐播放器制作(二)Easy Player

自上次发布第一个版本以来,又进行了多次修改,主要变化在于: (1)按照上次的计划重新设计了界面. (2)当上一首结束之后,自动播放下一首.默认当播放列表到底时停止播放.后期考虑增加多种循环方式. (3)增加进度控制和剩余时间显示. (4)目前拥有两个列表:一个搜索,一个播放.从搜索列表右边的按钮添加歌曲到播放列表,播放列表右边的按钮支持下载歌曲. (5)右上方增加显示当前播放曲目. 可以改进的地方: (1)仍然是歌词滚动,上次以来未动过. (2)增加上一首. (3)增加多种循环方式. (4)支持