• python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)


    昨日内容回顾

    1.app播放音乐
        plus.audio.createPlayer(文件路径/URL)
        player.play()     播放音乐
        player.pause()    暂停播放
        player.resume()    继续播放
        player.stop()    停止播放,清空player对象 # 当停止之后,无法在使用play() resume()继续播放
    
    
    2.app遥控玩具播放内容
        Websocket通讯 实现手机遥控app
        app:{content_id:123,to_user:123456}    {music_name:"123.wav",to_user:123456}
        服务器端:拿到to_user的websocket 如果使用content_id做查询     music_name:直接返回
        玩具端:返回给玩具端{code:0,from_user:654321,data:music_name}
        
    
    3.玩具控制管理页面
    View Code

    下载代码:

    https://github.com/987334176/Intelligent_toy/archive/v1.1.zip

    注意:由于涉及到版权问题,此附件没有图片和音乐。请参考链接,手动采集一下!

    请参考链接:

    https://www.cnblogs.com/xiao987334176/p/9647993.html#autoid-3-4-0

    一、创建二维码

    为什么要创建二维码呢?主要是做防伪的!

    一个玩具,很容易就会被其他厂商复制处理。那么如何区分,一个玩具就是我生产的呢?

    出厂时,将设备id写入数据库。同时将设备id生成二维码,贴在玩具背后!那么用户扫码,就可以判断玩具的真伪了!

    打开联图的二维码官网:

    http://www.liantu.com/

    打开MongoDB,复制一条id,粘贴到官网。它会即时生成!

    它还有一个API接口,也可以生成二维码。

    比如将123,生成二维码

    http://qr.liantu.com/api.php?text=123

    浏览器直接访问上面这个地址,效果如下:

    接下来,就使用这个API生成二维码!

    进入flask后端,修改settings.py,增加二维码API以及保存目录

    import pymongo
    
    client = pymongo.MongoClient(host="127.0.0.1", port=27017)
    MONGO_DB = client["bananabase"]
    
    RET = {
        # 0: false 2: True
        "code": 0,
        "msg": "",  # 提示信息
        "data": {}
    }
    
    XMLY_URL = "http://m.ximalaya.com/tracks/"  # 喜马拉雅链接
    CREATE_QR_URL = "http://qr.liantu.com/api.php?text="  # 生成二维码API
    
    # 文件目录
    import os
    
    AUDIO_FILE = os.path.join(os.path.dirname(__file__), "audio")  # 音频
    AUDIO_IMG_FILE = os.path.join(os.path.dirname(__file__), "audio_img")  # 音频图片
    
    DEVICE_CODE_PATH = os.path.join(os.path.dirname(__file__), "device_code")  # 二维码
    View Code

    新建目录device_code

    新建一个文件QRcode.py,用来生成二维码图片

    from uuid import uuid4
    import hashlib, time,os
    import requests
    import setting
    
    
    # 生成唯一设备id,f-string是Python 3.6语法
    device_id = f"{uuid4()}{time.time()}"
    device_id_md5 = hashlib.md5(device_id.encode("utf8"))  # 生成md5对象
    
    qr_code = device_id_md5.hexdigest()  # 获取md5的值
    qr_url = f"{setting.CREATE_QR_URL}{qr_code}"  # 生成二维码访问链接
    res = requests.get(qr_url)  # 使用GET请求
    # 拼接二维码图片保存路径
    code_file = os.path.join(setting.DEVICE_CODE_PATH,f"{qr_code}.jpg")
    
    with open(code_file, "wb") as f:
        f.write(res.content)  # 写入文件
    View Code

    此时目录结构如下:

    ./
    ├── audio
    ├── audio_img
    ├── device_code
    ├── im_serv.py
    ├── manager.py
    ├── QRcode.py
    ├── serv
    │   ├── content.py
    │   └── get_file.py
    ├── setting.py
    ├── static
    │   └── recorder.js
    ├── templates
    │   └── index.html
    └── xiaopapa.py
    View Code

    执行QRcode.py,此时device_code目录会生成一个图片

    接下来,将这部分代码封装成函数。并写入MongoDB中

    修改 QRcode.py 

    from uuid import uuid4
    import hashlib, time,os
    import requests
    import setting
    
    def create_device_id(count=1):
        device_list = []
        for i in range(count):
    
            # 生成唯一设备id,f-string是Python 3.6语法
            device_id = f"{uuid4()}{time.time()}"
            device_id_md5 = hashlib.md5(device_id.encode("utf8"))  # 生成md5对象
    
            qr_code = device_id_md5.hexdigest()  # 获取md5的值
            qr_url = f"{setting.CREATE_QR_URL}{qr_code}"  # 生成二维码访问链接
            res = requests.get(qr_url)  # 使用GET请求
            # 拼接二维码图片保存路径
            code_file = os.path.join(setting.DEVICE_CODE_PATH,f"{qr_code}.jpg")
    
            with open(code_file, "wb") as f:
                f.write(res.content)  # 写入文件
    
            device_list.append({"device_id": qr_code})  # 追加到列表中
    
            time.sleep(0.2)  # 睡眠0.2秒,防止被封锁IP
    
        setting.MONGO_DB.devices.insert_many(device_list)  # 写入多条记录
    
    
    create_device_id(5)  # 生成5条记录
    View Code

    清空device_code目录,并执行QRcode.py。等待10秒左右,就会有5个图片了

    二、扫码

    barcode

    Barcode模块管理条码扫描,支持常见的条码(一维码及二维码)的扫描识别功能。可调用设备的摄像头对条码图片扫描进行数据输入,解码后返回码数据及码类型。通过plus.barcode可获取条码码管理对象。

    参考链接:

    http://www.html5plus.org/doc/zh_cn/barcode.html

    create

    创建Barcode对象

    Barcode plus.barcode.create(id, filters, styles);

    说明:

    调用此方法创建后并不会显示,需要调用Webview窗口的append方法将其添加到Webview窗口后才能显示。 注意:此时需要通过styles参数的top/left/width/height属性设置控件的位置及大小。

    参数:

      • id: String ) 必选 Barcode对象的全局标识
        可用于通过plus.barcode.getBarcodeById()方法查找已经创建的Barcode对象。
      • filters: ArrayNumber ] ) 可选 要识别的条码类型过滤器,为条码类型常量数组
        条码识别引擎可支持多种二维码及一维码类型,默认情况支持QR、EAN13、EAN8三种类型。 可通过此参数设置需要支持的更多条码类型(注意:设置支持的条码类型越多,扫码识别效率将会降低)。
      • styles: BarcodeStyles ) 可选 Barcode扫码控件的样式
        可定义Barcode扫码控件的样式,如扫码框、扫码条的颜色等。

    返回值:

    Barcode : Barcode扫码控件对象

    示例:

    <!DOCTYPE html>
    <html>
        <head>
        <meta charset="utf-8">
        <title>Barcode Example</title>
        <script type="text/javascript" >
    var barcode = null;
    // 扫码成功回调
    function onmarked(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 );
    }
    // 创建Barcode扫码控件
    function createBarcode() {
        if(!barcode){
            barcode = plus.barcode.create('barcode', [plus.barcode.QR], {
                top:'100px',
                left:'0px',
                 '100%',
                height: '200px',
                position: 'static'
            });
            barcode.onmarked = onmarked;
            plus.webview.currentWebview().append(barcode);
        }
        barcode.start();
    }
        </script>
        <style type="text/css">
    *{
        -webkit-user-select: none;
    }
    html,body{
        margin: 0px;
        padding: 0px;
        height: 100%;
    }
        </style>
        </head>
        <body >
            <button onclick="createBarcode()">创建扫码控件</button>
        </body>
    </html>
    View Code

    Barcode

    Barcode扫码控件对象

    interface plus.barcode.Barcode {
        // Methods
        function void start(options);
        function void cancel();
        function void close();
        function void setFlash(open);
    
        // Events
        function void onmarked();
        function void onerror();
    }

    说明:

    Barcode对象表示条码识别控件对象,在窗口中显示条码识别控件,使用此对象可自定义条码识别界面。

    构造:

    方法:

    • start: 开始条码识别
    • cancel: 结束条码识别
    • close: 关闭条码识别控件
    • setFlash: 是否开启闪光灯
    • setStyles: 设置Barcode扫码控件的配置参数

    事件:

    示例:

    <!DOCTYPE html>
    <html>
        <head>
        <meta charset="utf-8">
        <title>Barcode Example</title>
        <script type="text/javascript" >
    // 扩展API加载完毕后调用onPlusReady回调函数 
    document.addEventListener( "plusready", onPlusReady, false );
    // 扩展API加载完毕,现在可以正常调用扩展API
    function onPlusReady() {
        var e = document.getElementById("scan");
        e.removeAttribute( "disabled" );
    }
    var scan = null;
    function onmarked( 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 );
    }
    function startRecognize() {
        scan = new plus.barcode.Barcode('bcid');
        scan.onmarked = onmarked; 
    }
    function startScan() {
        scan.start();
    }
    function cancelScan() {
        scan.cancel();
    }
    function setFlash() {
        scan.setFlash();
    }
        </script>
        <style type="text/css">
    *{
        -webkit-user-select: none;
    }
    html,body{
        margin: 0px;
        padding: 0px;
        height: 100%;
    }
    #bcid {
        background:#0F0;
        height:480px;
        360px;
    }
        </style>
        </head>
        <body >
            <input type='button' onclick='startRecognize()' value='创建扫码控件' />
            <input type='button' onclick='startScan()' value='开始扫码' />
            <input type='button' onclick='cancelScan()' value='取消扫码' />
            <input type='button' onclick='setFlash()' value='开启闪光灯' />
            <div id= "bcid"></div>
            <input type='text' id='text'/>
        </body>
    </html>
    View Code

    参考链接:

    http://www.html5plus.org/doc/zh_cn/barcode.html#plus.barcode.create

    打开HBuilder项目MyApp,新建一个文件qrcode.html

    修改 toy_manager.html,将 扫描二维码.html 改成 qrcode.html

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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">
                <ul class="mui-table-view" id="toy_list">
                    <li class="mui-table-view-cell mui-media">
                        <a id="add_toy">
                            <img class="mui-media-object mui-pull-left" src="images/add.png">
                            <div class="mui-media-body">
                                你还没有玩具
                                <p class="mui-ellipsis">点击此处扫描二维码添加玩具</p>
                            </div>
                        </a>
                    </li>
                </ul>
            </div>
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init()
    
            document.getElementById("add_toy").addEventListener("tap", function() {
                mui.openWindow({
                    url: "qrcode.html",
                    id: "qrcode.html",
                })
            })
        </script>
    
    </html>
    View Code

    修改 qrcode.html,创建Barcode对象并开启扫码

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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 style="height: 550px;" id="qr"></div>
            </div>
    
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init()
    
            mui.plusReady(function() {
                // 创建Barcode对象
                var barcode = new plus.barcode.Barcode('qr');
                barcode.start();  // 开始条码识别
            })
        </script>
    
    </html>
    View Code

    连接真机

    由于模拟器调用摄像头,这里必须要用真实的手机连接才行!

    那么如何连接呢?使用360手机助手!

    360手机助手

    我的手机是华为P9,其实华为手机助手,也可以将手机屏幕映射到电脑上面!但是,由于演示时,是全屏的!

    无法缩小,不好做演示!所以我才选择了360手机助手!

    360手机助手下载地址:

    http://sj.360.cn/index.html

    注意:需要电脑和手机同时安装!使用电脑连接手机时,务必使用USB模式!因为演示模式时,只能使用USB!

    默认华为P9,在设置里面开启USB之后,过一会就关闭了!怎么解决呢?进入工程菜单,开启USB才行!

    详情,请参考链接:

    https://club.huawei.com/thread-10239881-1-1.html

    注意:先选择Google模式,再开启USB调试! 

    连接成功后,点击底部的小三角

     右侧,会显示手机画面,比如:

    打开HBuilder,连接自己的手机

    运行之后,它会在你的手机上面,自动安装HBuilder的APP。并自动打开HBuilder,效果如下:

    这里 没有加载图文列表,是因为 mui.js的IP不对。

    修改mui.js,改为本机IP地址

    window.ws_serv = "192.168.0.108:9528";
    window.serv = "http://192.168.0.108:9527";

    注意:请确保手机网络,能访问http://192.168.0.108:9528

    有2个解决办法:

    1. 电脑和手机连接同一wifi

    2. 电脑开启wifi。wind10自带就有!用手机连接这个wifi即可!

    请确保电脑的防火墙是关闭状态打开控制面板-->系统和安全-->Windows Defender 防火墙。关闭防火墙!

    关闭手机进程,再次访问,就可以了

    重新登录一次,点击 管理我的玩具,效果如下:

    点击添加按钮

    它会跳转到 扫描二维码页面。看到中间的会动的红色线条没?说明它在识别中!

    BarcodeSuccessCallback

    扫码识别成功回调函数

    说明:

    当Barcode控件扫码成功时的回调函数,返回识别成功的扫码数据。

    参数:

    • type: Number ) 必选 识别到的条码类型
      Number类型的值,与Barcode对象定义的条码类型常量一致。
    • code: String ) 必选 识别到的条码数据
      扫码识别出的数据内容,字符串类型,采用UTF8编码格式。
    • file: String ) 可选 扫码成功的截图文件路径
      扫码识别到的截图,png格式文件,如果设置为不保存截图,则返回undefined。

    返回值:

    void : 无

    参考链接:

    http://www.html5plus.org/doc/zh_cn/barcode.html#plus.barcode.BarcodeSuccessCallback

    修改qrcdoe.html,增加回调函数

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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 style="height: 550px;" id="qr"></div>
            </div>
    
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init()
            
            function chenggong(type, code) {  //扫码成功回调函数
                mui.toast(code);  // 显示二维码的内容
            }
            
            mui.plusReady(function() {
                // 创建Barcode对象
                var barcode = new plus.barcode.Barcode('qr');
                barcode.start();  // 开始条码识别
                barcode.onmarked = chenggong;  // 扫码成功后,执行函数chenggong
            })
        </script>
    
    </html>
    View Code

    进入flask项目,打开device_code目录。打开一张图片,使用真机,扫描一下二维码,效果如下:

    二维码3种情况

    用户扫描的二维码,有3种情况

    1.当前设备根本不是我们授权生产的玩具 无效二维码 code=2
    2.二维码有效,创建玩具,绑定用户 code=0
    3.二维码有效,且已绑定用户,加好友 code=1

    这3种情况,需要后端来校验!

    进入flask项目,在serv目录下,新建一个文件devices.py

    from flask import Blueprint, request, jsonify
    from setting import MONGO_DB
    from setting import RET
    from bson import ObjectId
    
    devs = Blueprint("devs", __name__)
    
    
    @devs.route("/yanzheng_qr", methods=["POST"])
    def yanzheng_qr():  # 验证二维码
        device_id = request.form.get("device_id")  # 获取设备id
        if MONGO_DB.devices.find_one({"device_id": device_id}):  # 从数据库中查询设备id
            # 查询该玩具是不是已被用户绑定
            toy_info = MONGO_DB.toys.find_one({"device_id": device_id})
            # 未绑定开启绑定逻辑
            if not toy_info:
                RET["code"] = 0
                RET["msg"] = "感谢购买本公司产品"
                RET["data"] = {}
    
            # 如果被绑定加好友逻辑开启
            if toy_info:
                pass
    
        else:
            RET["code"] = 2
            RET["msg"] = "二货,这不是本公司设备,快去买正版!"
            RET["data"] = {}
    
        return jsonify(RET)
    View Code

    修改 manager.py,注册蓝图

    from flask import Flask, request,jsonify,render_template
    from setting import MONGO_DB
    from setting import RET
    from bson import ObjectId
    from serv import get_file
    from serv import content
    from serv import devices
    
    app = Flask(__name__)
    
    app.register_blueprint(get_file.getfile)
    app.register_blueprint(content.cont)
    app.register_blueprint(devices.devs)
    
    @app.route('/')
    def hello_world():
        return render_template("index.html")
    
    
    @app.route('/login',methods=["POST"])
    def login():
        """
        登陆验证
        :return: settings -> RET
        """
        try:
            RET["code"] = 1
            RET["msg"] = "用户名或密码错误"
            RET["data"] = {}
    
            username = request.form.get("username")
            password = request.form.get("password")
    
            user = MONGO_DB.users.find_one({"username": username, "password": password})
    
            if user:
                # 由于user中的_id是ObjectId对象,需要转化为字符串
                user["_id"] = str(user.get("_id"))
                RET["code"] = 0
                RET["msg"] = "欢迎登陆"
                RET["data"] = {"user_id": user.get("_id")}
    
        except Exception as e:
            RET["code"] = 1
            RET["msg"] = "登陆失败"
    
        return jsonify(RET)
    
    
    @app.route('/reg',methods=["POST"])
    def reg():
        """
        注册
        :return: {"code":0,"msg":"","data":""}
        """
        try:
            username = request.form.get("username")
            password = request.form.get("password")
            age = request.form.get("age")
            nickname = request.form.get("nickname")
            gender = request.form.get("gender")
            phone = request.form.get("phone")
    
            user_info = {
                "username": username,
                "password": password,
                "age": age,
                "nickname": nickname,
                # 判断gender==2,成立时为girl.jpg,否则为boy.jpg
                "avatar": "girl.jpg" if gender == 2 else "boy.jpg",
                "gender": gender,
                "phone": phone
            }
    
            res = MONGO_DB.users.insert_one(user_info)
            user_id = str(res.inserted_id)
    
            RET["code"] = 0
            RET["msg"] = "注册成功"
            RET["data"] = user_id
        except Exception as e:
            RET["code"] = 1
            RET["msg"] = "注册失败"
    
        return jsonify(RET)
    
    
    @app.route('/user_info', methods=["POST"])
    def user_info():
        user_id = request.form.get("user_id")
    
        # "password": 0 表示忽略密码字段
        res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)}, {"password": 0})
        if res:
            res["_id"] = str(res.get("_id"))
    
        RET["code"] = 0
        RET["msg"] = ""
        RET["data"] = res
    
        return jsonify(res)
    
    if __name__ == '__main__':
        app.run("0.0.0.0", 9527, debug=True)
    View Code

    重启 manager.py

    进入HBuilder项目MyApp,修改qrcode.html,发送POST请求,将设备id发过去

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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 style="height: 550px;" id="qr"></div>
            </div>
    
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init()
            
            function chenggong(type, code) {  //扫码成功回调函数
                mui.post(
                    // 验证二维码
                    window.serv + "/yanzheng_qr", {
                        // 发送设备id
                        device_id: code
                    },
                    function(data) {
                        console.log(JSON.stringify(data));
                        mui.toast(data.msg);  //显示结果
                    }
                )
            }
            
            mui.plusReady(function() {
                // 创建Barcode对象
                var barcode = new plus.barcode.Barcode('qr');
                barcode.start();  // 开始条码识别
                barcode.onmarked = chenggong;  // 扫码成功后,执行函数chenggong
            })
        </script>
    
    </html>
    View Code

    先扫描一个冒牌的二维码

    再来扫描一个正版的

    修改 qrcode.html,判断3种情况。先写伪代码!

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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 style="height: 550px;" id="qr"></div>
            </div>
    
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init()
            
            function chenggong(type, code) {  //扫码成功回调函数
                mui.post(
                    // 验证二维码
                    window.serv + "/yanzheng_qr", {
                        // 发送设备id
                        device_id: code
                    },
                    function(data) {
                        console.log(JSON.stringify(data));
                        mui.toast(data.msg);  //显示结果
                        if(data.code == 2) {
                            mui.back();  //返回页面
                        }
                        if(data.code == 1) {
                            //加好友的小逻辑 跳转到加好友页面
                        }
                        if(data.code == 0) {
                            //今天的逻辑 创建玩具 绑定用户 成为玩具的第一个好友
                        }
                    }
                )
            }
            
            mui.plusReady(function() {
                // 创建Barcode对象
                var barcode = new plus.barcode.Barcode('qr');
                barcode.start();  // 开始条码识别
                barcode.onmarked = chenggong;  // 扫码成功后,执行函数chenggong
            })
        </script>
    
    </html>
    View Code

    三、创建玩具的基本属性

    扫描成功后,需要跳转到绑定玩具页面!

    新建文件bind_toy.html

    bind_toy.html

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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">
                <form class="mui-input-group">
                    <div class="mui-input-row">
                        <label>玩具的昵称</label>
                        <input type="text" class="mui-input-clear" placeholder="请输入玩具的昵称" id="toy_name">
                    </div>
                    <div class="mui-input-row mui-radio mui-left">
                        <label>男</label>
                        <input name="gender" type="radio" value="1">
                    </div>
                    <div class="mui-input-row mui-radio mui-left">
                        <label>女</label>
                        <input name="gender" type="radio" value="2" checked>
                    </div>
                    <div class="mui-input-row">
                        <label>玩具的主人</label>
                        <input type="text" class="mui-input-clear" placeholder="请输入小主人的名字" id="baby_name">
                    </div>
                    <div class="mui-input-row">
                        <label>主人的称呼</label>
                        <input type="text" class="mui-input-clear" placeholder="玩具主人对您的称呼" id="remark">
                    </div>
                    <div class="mui-button-row">
                        <button type="button" class="mui-btn mui-btn-primary" id="bind">绑定</button>
                        <button type="button" class="mui-btn mui-btn-danger mui-action-back">取消</button>
                    </div>
                </form>
            </div>
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init()
            
            var Sdata = null;
            mui.plusReady(function() {
                Sdata = plus.webview.currentWebview();
    
            })
    
        </script>
    
    </html>
    View Code

    修改 qrcode.html,将设置id,传给bind_toy.html

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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 style="height: 550px;" id="qr"></div>
            </div>
    
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init()
            
            function chenggong(type, code) {  //扫码成功回调函数
                mui.post(
                    // 验证二维码
                    window.serv + "/yanzheng_qr", {
                        // 发送设备id
                        device_id: code
                    },
                    function(data) {
                        console.log(JSON.stringify(data));
                        mui.toast(data.msg);  //显示结果
                        if(data.code == 2) {
                            mui.back();  //返回页面
                        }
                        if(data.code == 1) {
                            //加好友的小逻辑 跳转到加好友页面
                        }
                        if(data.code == 0) {
                            //今天的逻辑 创建玩具 绑定用户 成为玩具的第一个好友
                            //1.创建玩具:打开创建玩具的页面
                            mui.openWindow({
                                url:"bind_toy.html",
                                id:"bind_toy.html",
                                extras:{
                                    device_id:code
                                }
                            })
                        }
                    }
                )
            }
            
            mui.plusReady(function() {
                // 创建Barcode对象
                var barcode = new plus.barcode.Barcode('qr');
                barcode.start();  // 开始条码识别
                barcode.onmarked = chenggong;  // 扫码成功后,执行函数chenggong
            })
        </script>
    
    </html>
    View Code

    修改 bind_toy.html,将表单数据传给后端

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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">
                <form class="mui-input-group">
                    <div class="mui-input-row">
                        <label>玩具的昵称</label>
                        <input type="text" class="mui-input-clear" placeholder="请输入玩具的昵称" id="toy_name">
                    </div>
                    <div class="mui-input-row mui-radio mui-left">
                        <label>男</label>
                        <input name="gender" type="radio" value="1">
                    </div>
                    <div class="mui-input-row mui-radio mui-left">
                        <label>女</label>
                        <input name="gender" type="radio" value="2" checked>
                    </div>
                    <div class="mui-input-row">
                        <label>玩具的主人</label>
                        <input type="text" class="mui-input-clear" placeholder="请输入小主人的名字" id="baby_name">
                    </div>
                    <div class="mui-input-row">
                        <label>主人的称呼</label>
                        <input type="text" class="mui-input-clear" placeholder="玩具主人对您的称呼" id="remark">
                    </div>
                    <div class="mui-button-row">
                        <button type="button" class="mui-btn mui-btn-primary" id="bind">绑定</button>
                        <button type="button" class="mui-btn mui-btn-danger mui-action-back">取消</button>
                    </div>
                </form>
            </div>
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init()
            
            var Sdata = null;
            mui.plusReady(function() {
                Sdata = plus.webview.currentWebview();
                console.log(plus.storage.getItem("user"))
            })
    
            document.getElementById("bind").addEventListener("tap", function() {
                var toy_name = document.getElementById("toy_name").value;
                var baby_name = document.getElementById("baby_name").value;
                var remark = document.getElementById("remark").value;
                var gender_list = document.getElementsByName("gender");
                var gender = null;
                for(var i = 0; i < gender_list.length; i++) {
                    if(gender_list[i].checked) {
                        gender = gender_list[i].value;
                    }
                }
    
                mui.post(
                    window.serv + "/bind_toy", {
                        device_id: Sdata.device_id,
                        toy_name:toy_name,
                        baby_name:baby_name,
                        remark:remark,
                        gender:gender,
                        // 全局变量,从plus.storage中获取
                        user_id:plus.storage.getItem("user")
                        
                    },
                    function(data){
                        console.log(JSON.stringify(data));
                        mui.toast(data.msg);
                    }
                )
            })
        </script>
    
    </html>
    View Code

    bind_toy.html页面,效果是这个样子:

    创建玩具的基本属性

    进入flask项目,修改devices.py,新建一个视图函数bind_toy,用来绑定玩具

    from flask import Blueprint, request, jsonify
    from setting import MONGO_DB
    from setting import RET
    from bson import ObjectId
    
    devs = Blueprint("devs", __name__)
    
    
    @devs.route("/yanzheng_qr", methods=["POST"])
    def yanzheng_qr():  # 验证二维码
        device_id = request.form.get("device_id")  # 获取设备id
        if MONGO_DB.devices.find_one({"device_id": device_id}):  # 从数据库中查询设备id
            # 查询该玩具是不是已被用户绑定
            toy_info = MONGO_DB.toys.find_one({"device_id": device_id})
            # 未绑定开启绑定逻辑
            if not toy_info:
                RET["code"] = 0
                RET["msg"] = "感谢购买本公司产品"
                RET["data"] = {}
    
            # 如果被绑定加好友逻辑开启
            if toy_info:
                pass
    
        else:
            RET["code"] = 2
            RET["msg"] = "二货,这不是本公司设备,快去买正版!"
            RET["data"] = {}
    
        return jsonify(RET)
    
    @devs.route("/bind_toy", methods=["POST"])
    def bind_toy():  # 绑定玩具
    
        device_id = request.form.get("device_id")  # 设备id
        toy_name = request.form.get("toy_name")  # 玩具的昵称
        baby_name = request.form.get("baby_name")  # 小主人的名字
        remark = request.form.get("remark")  # 玩具主人对您的称呼
        gender = request.form.get("gender")  # 性别
    
        user_id = request.form.get("user_id")  # 用户id
        res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})  # 查询用户id是否存在
    
        toy_info = {
            "device_id": device_id,
            "toy_name": toy_name,
            "baby_name": baby_name,
            "gender": gender,
            "avatar": "boy.jpg" if gender == 1 else "girl.jpg",
            # 绑定用户
            "bind_user": str(res.get("_id")),
        }
    View Code

    用户和玩具的绑定关系

    玩具还有和APP进行通信,需要一个chat表,记录聊天id

    修改 devices.py,修改 bind_toy视图函数

    @devs.route("/bind_toy", methods=["POST"])
    def bind_toy():  # 绑定玩具
        chat_window = MONGO_DB.chat.insert_one({})  # 插入一个空数据
        chat_id = chat_window.inserted_id  # 获取聊天id
    
        user_id = request.form.get("user_id")  # 用户id
        res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})  # 查询用户id是否存在
    
        device_id = request.form.get("device_id")  # 设备id
        toy_name = request.form.get("toy_name")  # 玩具的昵称
        baby_name = request.form.get("baby_name")  # 小主人的名字
        remark = request.form.get("remark")  # 玩具主人对您的称呼
        gender = request.form.get("gender")  # 性别
    
        toy_info = {
            "device_id": device_id,
            "toy_name": toy_name,
            "baby_name": baby_name,
            "gender": gender,
            "avatar": "boy.jpg" if gender == 1 else "girl.jpg",
            # 绑定用户
            "bind_user": str(res.get("_id")),
        }
    View Code

    既然是聊天,需要有好友列表,并插入玩具表

    修改 devices.py,修改 bind_toy视图函数

    @devs.route("/bind_toy", methods=["POST"])
    def bind_toy():  # 绑定玩具
        chat_window = MONGO_DB.chat.insert_one({})  # 插入一个空数据
        chat_id = chat_window.inserted_id  # 获取聊天id
    
        user_id = request.form.get("user_id")  # 用户id
        res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})  # 查询用户id是否存在
    
        device_id = request.form.get("device_id")  # 设备id
        toy_name = request.form.get("toy_name")  # 玩具的昵称
        baby_name = request.form.get("baby_name")  # 小主人的名字
        remark = request.form.get("remark")  # 玩具主人对您的称呼
        gender = request.form.get("gender")  # 性别
    
        toy_info = {
            "device_id": device_id,
            "toy_name": toy_name,
            "baby_name": baby_name,
            "gender": gender,
            "avatar": "boy.jpg" if gender == 1 else "girl.jpg",
            # 绑定用户
            "bind_user": str(res.get("_id")),
            # 第一个好友
            "friend_list": [{
                "friend_id": str(res.get("_id")),  # 好友id
                "friend_name": res.get("nickname"),  # 好友昵称
                "friend_remark": remark,  # 好友称呼
                "friend_avatar": res.get("avatar"),  # 好友头像
                "friend_chat": str(chat_id),  # 好友聊天id
            }]
        }
    
        toy_res = MONGO_DB.toys.insert_one(toy_info)  # 插入数据
    View Code

    用户难道只有一个好友吗?当然不是,他可以有很多个。

    修改 devices.py,修改 bind_toy视图函数,做一个判断

    @devs.route("/bind_toy", methods=["POST"])
    def bind_toy():  # 绑定玩具
        chat_window = MONGO_DB.chat.insert_one({})  # 插入一个空数据
        chat_id = chat_window.inserted_id  # 获取聊天id
    
        user_id = request.form.get("user_id")  # 用户id
        res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})  # 查询用户id是否存在
    
        device_id = request.form.get("device_id")  # 设备id
        toy_name = request.form.get("toy_name")  # 玩具的昵称
        baby_name = request.form.get("baby_name")  # 小主人的名字
        remark = request.form.get("remark")  # 玩具主人对您的称呼
        gender = request.form.get("gender")  # 性别
    
        toy_info = {
            "device_id": device_id,
            "toy_name": toy_name,
            "baby_name": baby_name,
            "gender": gender,
            "avatar": "boy.jpg" if gender == 1 else "girl.jpg",
            # 绑定用户
            "bind_user": str(res.get("_id")),
            # 第一个好友
            "friend_list": [{
                "friend_id": str(res.get("_id")),  # 好友id
                "friend_name": res.get("nickname"),  # 好友昵称
                "friend_remark": remark,  # 好友称呼
                "friend_avatar": res.get("avatar"),  # 好友头像
                "friend_chat": str(chat_id),  # 好友聊天id
            }]
        }
    
        toy_res = MONGO_DB.toys.insert_one(toy_info)  # 插入玩具表数据
    
        if res.get("friend_list"):  # 判断用户好友列表是否为空
            # 追加好友
            res["bind_toy"].append(str(toy_res.inserted_id))
            res["friend_list"].append({
                "friend_id": str(toy_res.inserted_id),
                "friend_name": toy_name,
                "friend_remark": baby_name,
                "friend_avatar": toy_info.get("avatar"),
                "friend_chat": str(chat_id),
            })
        else:
            # 更新好友
            res["bind_toy"] = [str(toy_res.inserted_id)]
            res["friend_list"] = [{
                "friend_id": str(toy_res.inserted_id),
                "friend_name": toy_name,
                "friend_remark": baby_name,
                "friend_avatar": toy_info.get("avatar"),
                "friend_chat": str(chat_id),
            }]
    
        MONGO_DB.users.update_one({"_id": ObjectId(user_id)}, {"$set": res})  # 更新用户记录
    View Code

    玩具通讯录中的第一个好友

    那么 上面的chat_id是属于哪个用户的呢?需要更新chat表,做一个绑定!

    修改 devices.py,修改 bind_toy视图函数。完整代码如下:

    from flask import Blueprint, request, jsonify
    from setting import MONGO_DB
    from setting import RET
    from bson import ObjectId
    
    devs = Blueprint("devs", __name__)
    
    
    @devs.route("/yanzheng_qr", methods=["POST"])
    def yanzheng_qr():  # 验证二维码
        device_id = request.form.get("device_id")  # 获取设备id
        if MONGO_DB.devices.find_one({"device_id": device_id}):  # 从数据库中查询设备id
            # 查询该玩具是不是已被用户绑定
            toy_info = MONGO_DB.toys.find_one({"device_id": device_id})
            # 未绑定开启绑定逻辑
            if not toy_info:
                RET["code"] = 0
                RET["msg"] = "感谢购买本公司产品"
                RET["data"] = {}
    
            # 如果被绑定加好友逻辑开启
            if toy_info:
                pass
    
        else:
            RET["code"] = 2
            RET["msg"] = "二货,这不是本公司设备,快去买正版!"
            RET["data"] = {}
    
        return jsonify(RET)
    
    
    @devs.route("/bind_toy", methods=["POST"])
    def bind_toy():  # 绑定玩具
        chat_window = MONGO_DB.chat.insert_one({})  # 插入一个空数据
        chat_id = chat_window.inserted_id  # 获取聊天id
    
        user_id = request.form.get("user_id")  # 用户id
        res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})  # 查询用户id是否存在
    
        device_id = request.form.get("device_id")  # 设备id
        toy_name = request.form.get("toy_name")  # 玩具的昵称
        baby_name = request.form.get("baby_name")  # 小主人的名字
        remark = request.form.get("remark")  # 玩具主人对您的称呼
        gender = request.form.get("gender")  # 性别
    
        toy_info = {
            "device_id": device_id,
            "toy_name": toy_name,
            "baby_name": baby_name,
            "gender": gender,
            "avatar": "boy.jpg" if gender == 1 else "girl.jpg",
            # 绑定用户
            "bind_user": str(res.get("_id")),
            # 第一个好友
            "friend_list": [{
                "friend_id": str(res.get("_id")),  # 好友id
                "friend_name": res.get("nickname"),  # 好友昵称
                "friend_remark": remark,  # 好友称呼
                "friend_avatar": res.get("avatar"),  # 好友头像
                "friend_chat": str(chat_id),  # 好友聊天id
            }]
        }
    
        toy_res = MONGO_DB.toys.insert_one(toy_info)  # 插入玩具表数据
    
        if res.get("friend_list"):  # 判断用户好友列表是否为空
            # 追加好友
            res["bind_toy"].append(str(toy_res.inserted_id))
            res["friend_list"].append({
                "friend_id": str(toy_res.inserted_id),
                "friend_name": toy_name,
                "friend_remark": baby_name,
                "friend_avatar": toy_info.get("avatar"),
                "friend_chat": str(chat_id),
            })
        else:
            # 更新好友
            res["bind_toy"] = [str(toy_res.inserted_id)]
            res["friend_list"] = [{
                "friend_id": str(toy_res.inserted_id),
                "friend_name": toy_name,
                "friend_remark": baby_name,
                "friend_avatar": toy_info.get("avatar"),
                "friend_chat": str(chat_id),
            }]
    
        MONGO_DB.users.update_one({"_id": ObjectId(user_id)}, {"$set": res})  # 更新用户记录
    
        # 更新聊天表
        # user_list有2个值。第一个是玩具id,第2个是用户id
        # 这样,用户和玩具就能通讯了
        MONGO_DB.chat.update_one({"_id": chat_id},
                                 {"$set":
                                      {"user_list":
                                           [str(toy_res.inserted_id),
                                            str(res.get("_id"))]}})
    
        RET["code"] = 0
        RET["msg"] = "绑定成功"
        RET["data"] = {}
    
        return jsonify(RET)
    View Code

    重启 manager.py

    使用手机扫描正版的二维码。它会跳转到这个页面

    填写相关信息

    点击绑定,页面底部提示:绑定成功!

    先来查看用户表,会发现有一个id

    在看下面的好友列表

    看聊天表,只有一条记录

    看玩具表,只有一条记录

    看下面的好友列表

    绑定完成之后,需要跳转页面。跳转到哪里呢?跳转到 toy_manager.html页面

    这个页面,需要加载当前登录用户的玩具

    修改toy_manager.html,发送post请求

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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">
                <ul class="mui-table-view" id="toy_list">
                    <li class="mui-table-view-cell mui-media">
                        <a id="add_toy">
                            <img class="mui-media-object mui-pull-left" src="images/add.png">
                            <div class="mui-media-body">
                                你还没有玩具
                                <p class="mui-ellipsis">点击此处扫描二维码添加玩具</p>
                            </div>
                        </a>
                    </li>
                </ul>
            </div>
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init();
            mui.plusReady(function(){
                // 发送POST请求,访问玩具列表
                mui.post(
                    window.serv + "/toy_list",
                    {user_id:plus.storage.getItem("user")},
                    function(data){
                        console.log(JSON.stringify(data));
                    }
                )
            });
    
            document.getElementById("add_toy").addEventListener("tap", function() {
                mui.openWindow({
                    url: "qrcode.html",
                    id: "qrcode.html",
                })
            });
        </script>
    
    </html>
    View Code

    进入flask后端,在serv目录下,新建文件 toys.py

    from flask import Blueprint, request, jsonify
    from setting import MONGO_DB
    from setting import RET
    from bson import ObjectId
    
    toy = Blueprint("toy", __name__)
    
    
    @toy.route("/toy_list", methods=["POST"])
    def toy_list():  # 玩具列表
        user_id = request.form.get("user_id")  # 用户id
        # 查看用户信息
        user_info = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
        bind_toy = user_info.get("bind_toy")  # 获取绑定的玩具
        bind_toy_id = []  # 玩具列表
        for toy_id in bind_toy:  # 获取玩具列表中的所有玩具id
            bind_toy_id.append(ObjectId(toy_id))
    
        # 一次性查询多个玩具
        toys_list = list(MONGO_DB.toys.find({"_id": {"$in": bind_toy_id}}))
    
        for index,item in enumerate(toys_list):
            # 将_id转换为字符串
            toys_list[index]["_id"] = str(item.get("_id"))
    
        RET["code"] = 0
        RET["msg"] = ""
        RET["data"] = toys_list
    
        return jsonify(RET)
    View Code

    修改manager.py,注册蓝图

    from flask import Flask, request,jsonify,render_template
    from setting import MONGO_DB
    from setting import RET
    from bson import ObjectId
    from serv import get_file
    from serv import content
    from serv import devices
    from serv import toys
    
    app = Flask(__name__)
    
    app.register_blueprint(get_file.getfile)
    app.register_blueprint(content.cont)
    app.register_blueprint(devices.devs)
    app.register_blueprint(toys.toy)
    
    @app.route('/')
    def hello_world():
        return render_template("index.html")
    
    
    @app.route('/login',methods=["POST"])
    def login():
        """
        登陆验证
        :return: settings -> RET
        """
        try:
            RET["code"] = 1
            RET["msg"] = "用户名或密码错误"
            RET["data"] = {}
    
            username = request.form.get("username")
            password = request.form.get("password")
    
            user = MONGO_DB.users.find_one({"username": username, "password": password})
    
            if user:
                # 由于user中的_id是ObjectId对象,需要转化为字符串
                user["_id"] = str(user.get("_id"))
                RET["code"] = 0
                RET["msg"] = "欢迎登陆"
                RET["data"] = {"user_id": user.get("_id")}
    
        except Exception as e:
            RET["code"] = 1
            RET["msg"] = "登陆失败"
    
        return jsonify(RET)
    
    
    @app.route('/reg',methods=["POST"])
    def reg():
        """
        注册
        :return: {"code":0,"msg":"","data":""}
        """
        try:
            username = request.form.get("username")
            password = request.form.get("password")
            age = request.form.get("age")
            nickname = request.form.get("nickname")
            gender = request.form.get("gender")
            phone = request.form.get("phone")
    
            user_info = {
                "username": username,
                "password": password,
                "age": age,
                "nickname": nickname,
                # 判断gender==2,成立时为girl.jpg,否则为boy.jpg
                "avatar": "girl.jpg" if gender == 2 else "boy.jpg",
                "gender": gender,
                "phone": phone
            }
    
            res = MONGO_DB.users.insert_one(user_info)
            user_id = str(res.inserted_id)
    
            RET["code"] = 0
            RET["msg"] = "注册成功"
            RET["data"] = user_id
        except Exception as e:
            RET["code"] = 1
            RET["msg"] = "注册失败"
    
        return jsonify(RET)
    
    
    @app.route('/user_info', methods=["POST"])
    def user_info():
        user_id = request.form.get("user_id")
    
        # "password": 0 表示忽略密码字段
        res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)}, {"password": 0})
        if res:
            res["_id"] = str(res.get("_id"))
    
        RET["code"] = 0
        RET["msg"] = ""
        RET["data"] = res
    
        return jsonify(res)
    
    if __name__ == '__main__':
        app.run("0.0.0.0", 9527, debug=True)
    View Code

    直接访问管理我的玩具页面,它会发起POST请求

    查看HBuilder控制台输出:

     {"code":0,"data":[{"_id":"5ba0f1f2e12532418089bf88","avatar":"girl.jpg","baby_name":"小甜甜","bind_user":"5b9bb768e1253281608e96eb","device_id":"01f9bf1bac93eddd8397d0455abbeddb","friend_list":[{"friend_avatar":"boy.jpg","friend_chat":"5ba0f1f2e12532418089bf87","friend_id":"5b9bb768e1253281608e96eb","friend_name":"xiao","friend_remark":"小鱼"}],"gender":"2","toy_name":"小可爱"}],"msg":""} at toy_manager.html:39

    那么拿到数据了,就可以渲染页面了!

    修改 toy_manager.html,渲染ul标签

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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">
                <ul class="mui-table-view" id="toy_list">
                    <li class="mui-table-view-cell mui-media">
                        <a id="add_toy">
                            <img class="mui-media-object mui-pull-left" src="images/add.png">
                            <div class="mui-media-body">
                                你还没有玩具
                                <p class="mui-ellipsis">点击此处扫描二维码添加玩具</p>
                            </div>
                        </a>
                    </li>
                </ul>
            </div>
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init();
            mui.plusReady(function(){
                // 发送POST请求,访问玩具列表
                mui.post(
                    window.serv + "/toy_list",
                    {user_id:plus.storage.getItem("user")},
                    function(data){
                        console.log(JSON.stringify(data));
                        // for循环玩具列表
                        for (var i = 0; i < data.data.length; i++) {
                            // 调用自定义函数,渲染玩具列表
                            create_content(data.data[i]);
                        }
                    }
                )
            });
            
            function create_content(content) {  //玩具列表
                var litag = document.createElement("li");
                litag.className = "mui-table-view-cell mui-media";
                var atag = document.createElement("a");
                atag.id = content._id;
                atag.onclick = function() {
                    console.log(this.id);
                    //openPlayer(this.id);
                }
    
                var imgtag = document.createElement("img");
                imgtag.className = "mui-media-object mui-pull-left";
                imgtag.style = "border-radius: 50%; 45px;height: 45px; "
                imgtag.src = "avatar/" + content.avatar;
    
                var divtag = document.createElement("div");
                divtag.className = "mui-media-body";
                divtag.innerText = content.baby_name;
                var ptag = document.createElement("p");
                ptag.className = "mui-ellipsis";
                ptag.innerText = content.toy_name;
    
                litag.appendChild(atag);
                atag.appendChild(imgtag);
                atag.appendChild(divtag);
                divtag.appendChild(ptag);
     
                document.getElementById("toy_list").appendChild(litag);
    
            }
    
            document.getElementById("add_toy").addEventListener("tap", function() {
                mui.openWindow({
                    url: "qrcode.html",
                    id: "qrcode.html",
                })
            });
        </script>
    
    </html>
    View Code

    重新访问 管理我的玩具页面,效果如下:

    这里有一个坑,绑定玩具之后,不要跳转到 管理我的玩具页面!它有可能会加载失败

    修改bind_toy.html,跳转改为user_info页面

    <!doctype html>
    <html lang="en">
    
        <head>
            <meta charset="UTF-8" />
            <title>Document</title>
            <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
            <link rel="stylesheet" type="text/css" href="css/mui.css" />
        </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">
                <form class="mui-input-group">
                    <div class="mui-input-row">
                        <label>玩具的昵称</label>
                        <input type="text" class="mui-input-clear" placeholder="请输入玩具的昵称" id="toy_name">
                    </div>
                    <div class="mui-input-row mui-radio mui-left">
                        <label>男</label>
                        <input name="gender" type="radio" value="1">
                    </div>
                    <div class="mui-input-row mui-radio mui-left">
                        <label>女</label>
                        <input name="gender" type="radio" value="2" checked>
                    </div>
                    <div class="mui-input-row">
                        <label>玩具的主人</label>
                        <input type="text" class="mui-input-clear" placeholder="请输入小主人的名字" id="baby_name">
                    </div>
                    <div class="mui-input-row">
                        <label>主人的称呼</label>
                        <input type="text" class="mui-input-clear" placeholder="玩具主人对您的称呼" id="remark">
                    </div>
                    <div class="mui-button-row">
                        <button type="button" class="mui-btn mui-btn-primary" id="bind">绑定</button>
                        <button type="button" class="mui-btn mui-btn-danger mui-action-back">取消</button>
                    </div>
                </form>
            </div>
        </body>
        <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            mui.init()
            
            var Sdata = null;
            mui.plusReady(function() {
                Sdata = plus.webview.currentWebview();
                console.log(plus.storage.getItem("user"))
            })
    
            document.getElementById("bind").addEventListener("tap", function() {
                var toy_name = document.getElementById("toy_name").value;
                var baby_name = document.getElementById("baby_name").value;
                var remark = document.getElementById("remark").value;
                var gender_list = document.getElementsByName("gender");
                var gender = null;
                for(var i = 0; i < gender_list.length; i++) {
                    if(gender_list[i].checked) {
                        gender = gender_list[i].value;
                    }
                }
    
                mui.post(
                    window.serv + "/bind_toy", {
                        device_id: Sdata.device_id,
                        toy_name:toy_name,
                        baby_name:baby_name,
                        remark:remark,
                        gender:gender,
                        // 全局变量,从plus.storage中获取
                        user_id:plus.storage.getItem("user")
                        
                    },
                    function(data){
                        console.log(JSON.stringify(data));
                        mui.toast(data.msg);
                        // 绑定玩具成功之后
                        if(data.code==0){
                            // 跳转到用户信息页面
                            mui.openWindow({
                                url:"user_info.html",
                                id:"user_info.html",
                                styles:window.styles
                            })
                        }
                    }
                )
            })
        </script>
    
    </html>
    View Code

    今日总结:

    1.创建二维码
        device_id = f"{uuid4()}{time.time()}"
        device_id_md5 = hashlib.md5(device_id.encode("utf8"))
        requests.get("http://qr.liantu.com/api.php?text=%s" %(device_id_md5))
        
    2.扫码
        var barcode = new plus.barcode.Barcode('qr'); 创建HTML5PLUS的Barcode扫码对象
        var barcode = plus.barcode.create('qr',[plus.barcode.QR],sytles={top,left,weith,heigh}) 
        创建完成之后还得webview.append
        
        1.当前设备根本不是我们授权生产的玩具 无效二维码 2
        2.二维码有效,创建玩具,绑定用户 0
        3.二维码有效,且已绑定用户,加好友 1
        
    3.创建玩具的基本属性 
        toy_info = {
            "device_id": device_id,
            "toy_name": toy_name,
            "baby_name": baby_name,
            "gender": gender,
            "avatar": "boy.jpg" if gender == 1 else "girl.jpg",
            "bind_user":str(res.get("_id"))
        }
        玩具还要和 APP 进行通讯 ,chat chat_id
        详见代码
    
    4.用户和玩具的绑定关系 
        用户添加玩具为好友和绑定关系
        详见代码
        
    5.玩具通讯录中的第一个好友
        详见代码
    
    刚刚开机的时候:
    1.授权问题(MD5授权码)提示语 : 请联系玩具厂商
    2.绑定问题 提示语 : 快给我找一个小主人
    3.成功 提示语:欢迎使用
    View Code

    完整代码,请参考github:

    https://github.com/987334176/Intelligent_toy/archive/v1.2.zip

  • 相关阅读:
    【年度总结】——踏雪留痕
    ios提交程序后出现的各种问题
    c++动态库中使用命名空间的问题
    第八章 网络的时代—网络开发(4)
    USB otg 学习笔记
    servlet_3
    Windows server 2012清除并重建SID
    实时监听输入框值变化:oninput & onpropertychange
    JQuery 自动触发事件
    jquery input change事件
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/9670063.html
Copyright © 2020-2023  润新知