昨日内容回顾

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.玩具控制管理页面

下载代码:

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") # 二维码

新建目录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) # 写入文件

此时目录结构如下:

./
├── 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

执行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条记录

清空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: ( Array[ Number ] ) 可选 要识别的条码类型过滤器,为条码类型常量数组
      条码识别引擎可支持多种二维码及一维码类型,默认情况支持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',
width: '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>

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;
width: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>

参考链接:

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="data: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>

修改 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>

连接真机

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

那么如何连接呢?使用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>

进入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)

修改 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)

重启 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>

先扫描一个冒牌的二维码

再来扫描一个正版的

修改 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>

三、创建玩具的基本属性

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

新建文件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="">
</div>
<div class="mui-input-row mui-radio mui-left">
<label>女</label>
<input name="gender" type="radio" value="" 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>

修改 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>

修改 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="">
</div>
<div class="mui-input-row mui-radio mui-left">
<label>女</label>
<input name="gender" type="radio" value="" 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>

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")),
}

用户和玩具的绑定关系

玩具还有和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")),
}

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

修改 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) # 插入数据

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

修改 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}) # 更新用户记录

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

那么 上面的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)

重启 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="data: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>

进入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)

修改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)

直接访问管理我的玩具页面,它会发起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":"","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="data: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%;width: 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>

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

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

修改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="">
</div>
<div class="mui-input-row mui-radio mui-left">
<label>女</label>
<input name="gender" type="radio" value="" 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>

今日总结:

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.成功 提示语:欢迎使用

完整代码,请参考github:

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

python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)的更多相关文章

  1. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  2. Python全栈开发:Mysql(二)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT *FROM (SELEC ...

  3. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  4. 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂

    Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...

  5. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  6. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  7. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

  8. Python全栈开发【基础三】

    Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...

  9. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

  10. python全栈开发-Day2 布尔、流程控制、循环

    python全栈开发-Day2 布尔 流程控制 循环   一.布尔 1.概述 #布尔值,一个True一个False #计算机俗称电脑,即我们编写程序让计算机运行时,应该是让计算机无限接近人脑,或者说人 ...

随机推荐

  1. make_blobs

    一.make_blobs简介 scikit中的make_blobs方法常被用来生成聚类算法的测试数据,直观地说,make_blobs会根据用户指定的特征数量.中心点数量.范围等来生成几类数据,这些数据 ...

  2. 内联函数 —— C 中关键字 inline 用法解析

    一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...

  3. Linux记录-AWK语法(转载)

    1.原理 awk,一个行文本处理工具,逐行处理文件中的数据 语法:awk 'pattern + {action}' 说明:(1)单引号''是为了和shell命令区分开:(2)大括号{}表示一个命令分组 ...

  4. PHP7 学习笔记(八)JetBrains PhpStorm 2017.1 x64 MySQL数据库管理工具的使用

    填写基本信息 这时候我们可以看到已经连接成功的数据库了 打开一个表,我们可以很清楚的看到数据库表的数据 切换到DDL模式

  5. 10 SpringBoot全面接管SpringMVC

    Spring Boot官方文档描述 If you want to keep Spring Boot MVC features and you want to add additional MVC co ...

  6. Linux - DDOS检测

    netstat  netstat -na #显示所有连接到服务器的活跃的网络连接 netstat -an | grep : | sort # 只显示连接到80段口的活跃的网络连接,80是http端口, ...

  7. 在window系统下安装Sass

    1.Ruby下载 因为Sass依赖于Ruby环境,所以应先在window系统下安装Ruby,Ruby安装包下载链接:http://rubyinstaller.org/downloads/ 2.Ruby ...

  8. drozer工具的安装与使用:之一安装篇

    本教程针对于Windows平台下drozer的安装与使用   使用该工具需要JDK的支持,所以使用此工具之前请自行安装 JDK(如有问题的请自行百度其他教程,这里就不赘述了)   还需要安卓调试工具a ...

  9. ROS 时间同步问题

    0. 问题 两台ubuntu主机无法与一台debian主机使用分布式通信,摄像头发出的话题机器人收不到,考虑是时间同步的问题. 也可能是系统不统一的问题; 今天在家实验了一下,时间差6min,照样可以 ...

  10. 详解Jquery选择器

    1.常见的选择器 id,类,标签选择器. $("#a1") $(".myclass") $("div") 2.组合选择器 $("# ...