先下载github代码,下面的操作,都是基于这个版本来的!

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

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

请参考链接:

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

一、玩具管理页面

点击下面的标签,页面还没有反应。

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图1

点击之后,需要进入玩具管理页面!

进入HBuilder项目MyApp,新建文件toy_info.html

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图2

修改 toy_info.html

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <link rel="stylesheet" type="text/css" href="css/mui.css" />
  8. </head>
  9. <body>
  10. <header class="mui-bar mui-bar-nav">
  11. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  12. <h1 class="mui-title">玩具详情</h1>
  13. </header>
  14. <div class="mui-content">
  15. <div class="mui-row" style="text-align: center;">
  16. <img src="" id="avatar" style="width: 300px;height: 300px;border-radius: 50%;" />
  17. </div>
  18. <ul class="mui-table-view">
  19. <li class="mui-table-view-cell">
  20. 玩具名称 :<span id="toy_name"></span>
  21. </li>
  22. <li class="mui-table-view-cell">
  23. 所属主人 :<span id="baby_name"></span>
  24. </li>
  25. <li class="mui-table-view-cell">
  26. 设备编号 :<span id="device_id"></span>
  27. </li>
  28. </ul>
  29. </div>
  30. </body>
  31. <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
  32. <script type="text/javascript">
  33. mui.init()
  34. var Sdata = null;
  35. mui.plusReady(function() {
  36. Sdata = plus.webview.currentWebview();
  37. mui.post(
  38. window.serv + "/toy_info", {
  39. toy_id: Sdata.toy_id
  40. },
  41. function(data) {
  42. console.log(JSON.stringify(data));
  43. document.getElementById("avatar").src = "avatar/" + data.data.avatar;
  44. document.getElementById("toy_name").innerText = data.data.toy_name;
  45. document.getElementById("baby_name").innerText = data.data.baby_name;
  46. document.getElementById("device_id").innerText = data.data.device_id;
  47. }
  48. );
  49. })
  50. </script>
  51. </html>

修改 toy_manager.html,点击时,打开玩具管理页面

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <link rel="stylesheet" type="text/css" href="css/mui.css" />
  8. </head>
  9. <body>
  10. <header class="mui-bar mui-bar-nav">
  11. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  12. <h1 class="mui-title">管理我的玩具</h1>
  13. </header>
  14. <div class="mui-content">
  15. <ul class="mui-table-view" id="toy_list">
  16. <li class="mui-table-view-cell mui-media">
  17. <a id="add_toy">
  18. <img class="mui-media-object mui-pull-left" src="images/add.png">
  19. <div class="mui-media-body">
  20. 你还没有玩具
  21. <p class="mui-ellipsis">点击此处扫描二维码添加玩具</p>
  22. </div>
  23. </a>
  24. </li>
  25. </ul>
  26. </div>
  27. </body>
  28. <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
  29. <script type="text/javascript">
  30. mui.init();
  31. mui.plusReady(function(){
  32. // 发送POST请求,访问玩具列表
  33. mui.post(
  34. window.serv + "/toy_list",
  35. {user_id:plus.storage.getItem("user")},
  36. function(data){
  37. console.log(JSON.stringify(data));
  38. // for循环玩具列表
  39. for (var i = 0; i < data.data.length; i++) {
  40. // 调用自定义函数,渲染玩具列表
  41. create_content(data.data[i]);
  42. }
  43. }
  44. )
  45. });
  46. function create_content(content) { //玩具列表
  47. var litag = document.createElement("li");
  48. litag.className = "mui-table-view-cell mui-media";
  49. var atag = document.createElement("a");
  50. atag.id = content._id;
  51. atag.onclick = function() {
  52. console.log(this.id);
  53. open_toy_info(this.id); //打开玩具管理页面
  54. }
  55. var imgtag = document.createElement("img");
  56. imgtag.className = "mui-media-object mui-pull-left";
  57. imgtag.style = "border-radius: 50%;width: 45px;height: 45px; "
  58. imgtag.src = "avatar/" + content.avatar;
  59. var divtag = document.createElement("div");
  60. divtag.className = "mui-media-body";
  61. divtag.innerText = content.baby_name;
  62. var ptag = document.createElement("p");
  63. ptag.className = "mui-ellipsis";
  64. ptag.innerText = content.toy_name;
  65. litag.appendChild(atag);
  66. atag.appendChild(imgtag);
  67. atag.appendChild(divtag);
  68. divtag.appendChild(ptag);
  69. document.getElementById("toy_list").appendChild(litag);
  70. }
  71. document.getElementById("add_toy").addEventListener("tap", function() {
  72. mui.openWindow({
  73. url: "qrcode.html",
  74. id: "qrcode.html",
  75. })
  76. });
  77. function open_toy_info(toy_id) { //打开玩具管理页面
  78. mui.openWindow({
  79. url: "toy_info.html",
  80. id: "toy_info.html",
  81. extras: {
  82. toy_id: toy_id
  83. }
  84. })
  85. }
  86. </script>
  87. </html>

进入flask后端,修改 serv—>toys.py,增加接口

  1. from flask import Blueprint, request, jsonify
  2. from setting import MONGO_DB
  3. from setting import RET
  4. from bson import ObjectId
  5. toy = Blueprint("toy", __name__)
  6. @toy.route("/toy_list", methods=["POST"])
  7. def toy_list(): # 玩具列表
  8. user_id = request.form.get("user_id") # 用户id
  9. # 查看用户信息
  10. user_info = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
  11. bind_toy = user_info.get("bind_toy") # 获取绑定的玩具
  12. bind_toy_id = [] # 玩具列表
  13. for toy_id in bind_toy: # 获取玩具列表中的所有玩具id
  14. bind_toy_id.append(ObjectId(toy_id))
  15. # 一次性查询多个玩具
  16. toys_list = list(MONGO_DB.toys.find({"_id": {"$in": bind_toy_id}}))
  17. for index,item in enumerate(toys_list):
  18. # 将_id转换为字符串
  19. toys_list[index]["_id"] = str(item.get("_id"))
  20. RET["code"] = 0
  21. RET["msg"] = ""
  22. RET["data"] = toys_list
  23. return jsonify(RET)
  24. @toy.route("/device_toy_id", methods=["POST"])
  25. def device_toy_id(): # 验证设备id
  26. RET["code"] = 0
  27. RET["msg"] = "开机成功"
  28. RET["data"] = {}
  29. device_id = request.form.get("device_id") # 获取设备id
  30. # 判断设备id是否在设备表中
  31. if MONGO_DB.devices.find_one({"device_id": device_id}):
  32. # 查询设备id是否在玩具表中
  33. toy_info = MONGO_DB.toys.find_one({"device_id": device_id})
  34. if toy_info:
  35. # RET添加键值,获取玩具id
  36. RET["data"]["toy_id"] = str(toy_info.get("_id"))
  37. # 音频文件
  38. RET["data"]["audio"] = "success.mp3"
  39. return jsonify(RET)
  40. else:
  41. # 已授权的设备,但是没有绑定主人
  42. RET["msg"] = "找小主人"
  43. RET["data"]["audio"] = "Nobind.mp3"
  44. return jsonify(RET)
  45. else:
  46. # 不在设备表中,说明是未授权,或者是冒牌的!
  47. RET["msg"] = "联系玩具厂"
  48. RET["data"]["audio"] = "Nodevice.mp3"
  49. return jsonify(RET)
  50. @toy.route("/toy_info", methods=["POST"])
  51. def toy_info(): # 玩具管理页面
  52. toy_id = request.form.get("toy_id")
  53. toy = MONGO_DB.toys.find_one({"_id":ObjectId(toy_id)})
  54. toy["_id"] = str(toy.get("_id"))
  55. RET["code"] = 0
  56. RET["msg"] = ""
  57. RET["data"] = toy
  58. return jsonify(RET)

重启 manager.py,使用模拟器访问,效果如下:

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图3

二、控制玩具通讯录

玩具管理页面,还需要展示 通讯录。

修改 toy_info.html

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <link rel="stylesheet" type="text/css" href="css/mui.css" />
  8. </head>
  9. <body>
  10. <header class="mui-bar mui-bar-nav">
  11. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  12. <h1 class="mui-title">玩具详情</h1>
  13. </header>
  14. <div class="mui-content">
  15. <div class="mui-row" style="text-align: center;">
  16. <img src="" id="avatar" style="width: 300px;height: 300px;border-radius: 50%;" />
  17. </div>
  18. <ul class="mui-table-view">
  19. <li class="mui-table-view-cell">
  20. 玩具名称 :<span id="toy_name"></span>
  21. </li>
  22. <li class="mui-table-view-cell">
  23. 所属主人 :<span id="baby_name"></span>
  24. </li>
  25. <li class="mui-table-view-cell">
  26. 设备编号 :<span id="device_id"></span>
  27. </li>
  28. </ul>
  29. <div class="mui-row" style="text-align: center;">
  30. 玩具通讯录
  31. </div>
  32. <ul class="mui-table-view mui-grid-view" id="contacts">
  33. <li class="mui-table-view-cell mui-media mui-col-xs-3">
  34. <a id="add_friend">
  35. <img class="mui-media-object" src="images/add.png" style="border-radius: 50%;width: 75px;height: 75px;">
  36. <div class="mui-media-body">添加好友</div>
  37. </a>
  38. </li>
  39. </ul>
  40. </div>
  41. </body>
  42. <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
  43. <script type="text/javascript">
  44. mui.init()
  45. var Sdata = null;
  46. mui.plusReady(function() {
  47. Sdata = plus.webview.currentWebview();
  48. mui.post(
  49. window.serv + "/toy_info", {
  50. toy_id: Sdata.toy_id
  51. },
  52. function(data) {
  53. console.log(JSON.stringify(data));
  54. document.getElementById("avatar").src = "avatar/" + data.data.avatar;
  55. document.getElementById("toy_name").innerText = data.data.toy_name;
  56. document.getElementById("baby_name").innerText = data.data.baby_name;
  57. document.getElementById("device_id").innerText = data.data.device_id;
  58. for(var i = 0; i < data.data.friend_list.length; i++) {
  59. create_friend(data.data.friend_list[i]);
  60. }
  61. }
  62. );
  63. });
  64. function create_friend(friend) {
  65. var litag = document.createElement("li");
  66. litag.className = "mui-table-view-cell mui-media mui-col-xs-3";
  67. var atag = document.createElement("a");
  68. atag.id = friend.friend_id
  69. var imgtag = document.createElement("img");
  70. imgtag.className = "mui-media-object";
  71. imgtag.style.borderRadius = "50%";
  72. imgtag.style.width = "75px";
  73. imgtag.style.height = "75px";
  74. imgtag.src = "avatar/" + friend.friend_avatar;
  75. var divtag = document.createElement("div");
  76. divtag.innerText = friend.friend_remark;
  77. divtag.className = "mui-media-body";
  78. litag.appendChild(atag);
  79. atag.appendChild(imgtag);
  80. atag.appendChild(divtag);
  81. document.getElementById("contacts").appendChild(litag);
  82. }
  83. </script>
  84. </html>

使用模拟器访问,效果如下:

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图4

三、基于请求的好友关系建立

加好友流程图

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图5

同意流程图

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图6

修改 qrcode.html

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <link rel="stylesheet" type="text/css" href="css/mui.css" />
  8. </head>
  9. <body>
  10. <header class="mui-bar mui-bar-nav">
  11. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  12. <h1 class="mui-title">扫描玩具二维码</h1>
  13. </header>
  14. <div class="mui-content">
  15. <div style="height: 550px;" id="qr"></div>
  16. </div>
  17. </body>
  18. <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
  19. <script type="text/javascript">
  20. mui.init()
  21. var Sdata = null;
  22. mui.plusReady(function() {
  23. Sdata = plus.webview.currentWebview();
  24. // var barcode = new plus.barcode.Barcode('qr');
  25. // // plus.webview.currentWebview().append(barcode);
  26. // barcode.onmarked = chenggong;
  27. // barcode.start();
  28. chenggong(0,"864aad3ca55d9fe9bdcbef70e174fc3f")
  29. })
  30. function chenggong(type, code) {
  31. mui.post(
  32. window.serv + "/yanzheng_qr", {
  33. device_id: code
  34. },
  35. function(data) {
  36. console.log(JSON.stringify(data));
  37. mui.toast(data.msg);
  38. if(data.code == 2) {
  39. mui.back();
  40. }
  41. if(data.code == 1) {
  42. //加好友的小逻辑 跳转到加好友页面
  43. if(Sdata.toy_id) {
  44. //1.玩具 添加好友 toys toys
  45. mui.openWindow({
  46. url: "add_req.html",
  47. id: "add_req.html",
  48. extras: {
  49. req_type: "toy",
  50. user_id: Sdata.toy_id,
  51. friend_id: data.data.toy_id
  52. }
  53. })
  54. } else {
  55. // 2.手机app 添加好友 users toys
  56. mui.openWindow({
  57. url: "add_req.html",
  58. id: "add_req.html",
  59. extras: {
  60. req_type: "user",
  61. user_id: plus.storage.getItem("user"),
  62. friend_id: data.data.toy_id
  63. }
  64. })
  65. }
  66. }
  67. if(data.code == 0) {
  68. //今天的逻辑 创建玩具 绑定用户 成为玩具的第一个好友
  69. //1.创建玩具:打开创建玩具的页面
  70. if(Sdata.toy_id) {
  71. mui.back()
  72. } else {
  73. mui.openWindow({
  74. url: "bind_toy.html",
  75. id: "bind_toy.html",
  76. extras: {
  77. device_id: code
  78. }
  79. })
  80. }
  81. }
  82. }
  83. )
  84. }
  85. </script>
  86. </html>

修改 toy_info.html

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <link rel="stylesheet" type="text/css" href="css/mui.css" />
  8. </head>
  9. <body>
  10. <header class="mui-bar mui-bar-nav">
  11. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  12. <h1 class="mui-title">玩具详情</h1>
  13. </header>
  14. <div class="mui-content">
  15. <div class="mui-row" style="text-align: center;">
  16. <img src="" id="avatar" style="width: 300px;height: 300px;border-radius: 50%;" />
  17. </div>
  18. <ul class="mui-table-view">
  19. <li class="mui-table-view-cell">
  20. 玩具名称 :<span id="toy_name"></span>
  21. </li>
  22. <li class="mui-table-view-cell">
  23. 所属主人 :<span id="baby_name"></span>
  24. </li>
  25. <li class="mui-table-view-cell">
  26. 设备编号 :<span id="device_id"></span>
  27. </li>
  28. </ul>
  29. <div class="mui-row" style="text-align: center;">
  30. 玩具通讯录
  31. </div>
  32. <ul class="mui-table-view mui-grid-view" id="contacts">
  33. <li class="mui-table-view-cell mui-media mui-col-xs-3">
  34. <a id="add_friend">
  35. <img class="mui-media-object" src="images/add.png" style="border-radius: 50%;width: 75px;height: 75px;">
  36. <div class="mui-media-body">添加好友</div>
  37. </a>
  38. </li>
  39. </ul>
  40. </div>
  41. </body>
  42. <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
  43. <script type="text/javascript">
  44. mui.init()
  45. var Sdata = null;
  46. mui.plusReady(function() {
  47. Sdata = plus.webview.currentWebview();
  48. mui.post(
  49. window.serv + "/toy_info", {
  50. toy_id: Sdata.toy_id
  51. },
  52. function(data) {
  53. console.log(JSON.stringify(data));
  54. document.getElementById("avatar").src = "avatar/" + data.data.avatar;
  55. document.getElementById("toy_name").innerText = data.data.toy_name;
  56. document.getElementById("baby_name").innerText = data.data.baby_name;
  57. document.getElementById("device_id").innerText = data.data.device_id;
  58. for(var i = 0; i < data.data.friend_list.length; i++) {
  59. create_friend(data.data.friend_list[i]);
  60. }
  61. }
  62. );
  63. })
  64. function create_friend(friend) {
  65. var litag = document.createElement("li");
  66. litag.className = "mui-table-view-cell mui-media mui-col-xs-3";
  67. var atag = document.createElement("a");
  68. atag.id = friend.friend_id
  69. var imgtag = document.createElement("img");
  70. imgtag.className = "mui-media-object";
  71. imgtag.style.borderRadius = "50%";
  72. imgtag.style.width = "75px";
  73. imgtag.style.height = "75px";
  74. imgtag.src = "avatar/" + friend.friend_avatar;
  75. var divtag = document.createElement("div");
  76. divtag.innerText = friend.friend_remark;
  77. divtag.className = "mui-media-body";
  78. litag.appendChild(atag);
  79. atag.appendChild(imgtag);
  80. atag.appendChild(divtag);
  81. document.getElementById("contacts").appendChild(litag);
  82. }
  83. document.getElementById("add_friend").addEventListener("tap", function() {
  84. mui.openWindow({
  85. url: "qrcode.html",
  86. id: "qrcode.html",
  87. extras:{
  88. toy_id:Sdata.toy_id
  89. }
  90. })
  91. })
  92. </script>
  93. </html>

进入flask项目,修改devices.py,修改 yanzheng_qr函数

  1. from flask import Blueprint, request, jsonify
  2. from setting import MONGO_DB
  3. from setting import RET
  4. from bson import ObjectId
  5. devs = Blueprint("devs", __name__)
  6. @devs.route("/yanzheng_qr", methods=["POST"])
  7. def yanzheng_qr(): # 验证二维码
  8. device_id = request.form.get("device_id") # 获取设备id
  9. if MONGO_DB.devices.find_one({"device_id": device_id}): # 从数据库中查询设备id
  10. # 查询该玩具是不是已被用户绑定
  11. toy_info = MONGO_DB.toys.find_one({"device_id": device_id})
  12. # 未绑定开启绑定逻辑
  13. if not toy_info:
  14. RET["code"] = 0
  15. RET["msg"] = "感谢购买本公司产品"
  16. RET["data"] = {}
  17. # 如果被绑定加好友逻辑开启
  18. if toy_info:
  19. RET["code"] = 1
  20. RET["msg"] = "添加好友"
  21. RET["data"] = {"toy_id": str(toy_info.get("_id"))}
  22. else:
  23. RET["code"] = 2
  24. RET["msg"] = "二货,这不是本公司设备,快去买正版!"
  25. RET["data"] = {}
  26. return jsonify(RET)
  27. @devs.route("/bind_toy", methods=["POST"])
  28. def bind_toy(): # 绑定玩具
  29. chat_window = MONGO_DB.chat.insert_one({}) # 插入一个空数据
  30. chat_id = chat_window.inserted_id # 获取聊天id
  31. user_id = request.form.get("user_id") # 用户id
  32. res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)}) # 查询用户id是否存在
  33. device_id = request.form.get("device_id") # 设备id
  34. toy_name = request.form.get("toy_name") # 玩具的昵称
  35. baby_name = request.form.get("baby_name") # 小主人的名字
  36. remark = request.form.get("remark") # 玩具主人对您的称呼
  37. gender = request.form.get("gender") # 性别
  38. toy_info = {
  39. "device_id": device_id,
  40. "toy_name": toy_name,
  41. "baby_name": baby_name,
  42. "gender": gender,
  43. "avatar": "boy.jpg" if gender == 1 else "girl.jpg",
  44. # 绑定用户
  45. "bind_user": str(res.get("_id")),
  46. # 第一个好友
  47. "friend_list": [{
  48. "friend_id": str(res.get("_id")), # 好友id
  49. "friend_name": res.get("nickname"), # 好友昵称
  50. "friend_remark": remark, # 好友称呼
  51. "friend_avatar": res.get("avatar"), # 好友头像
  52. "friend_chat": str(chat_id), # 好友聊天id
  53. }]
  54. }
  55. toy_res = MONGO_DB.toys.insert_one(toy_info) # 插入玩具表数据
  56. if res.get("friend_list"): # 判断用户好友列表是否为空
  57. # 追加好友
  58. res["bind_toy"].append(str(toy_res.inserted_id))
  59. res["friend_list"].append({
  60. "friend_id": str(toy_res.inserted_id),
  61. "friend_name": toy_name,
  62. "friend_remark": baby_name,
  63. "friend_avatar": toy_info.get("avatar"),
  64. "friend_chat": str(chat_id),
  65. })
  66. else:
  67. # 更新好友
  68. res["bind_toy"] = [str(toy_res.inserted_id)]
  69. res["friend_list"] = [{
  70. "friend_id": str(toy_res.inserted_id),
  71. "friend_name": toy_name,
  72. "friend_remark": baby_name,
  73. "friend_avatar": toy_info.get("avatar"),
  74. "friend_chat": str(chat_id),
  75. }]
  76. MONGO_DB.users.update_one({"_id": ObjectId(user_id)}, {"$set": res}) # 更新用户记录
  77. # 更新聊天表
  78. # user_list有2个值。第一个是玩具id,第2个是用户id
  79. # 这样,用户和玩具就能通讯了
  80. MONGO_DB.chat.update_one({"_id": chat_id},
  81. {"$set":
  82. {"user_list":
  83. [str(toy_res.inserted_id),
  84. str(res.get("_id"))]}})
  85. RET["code"] = 0
  86. RET["msg"] = "绑定成功"
  87. RET["data"] = {}
  88. return jsonify(RET)

修改 serv—>friend.py,增加add_req函数

  1. from flask import Blueprint, request, jsonify
  2. from setting import MONGO_DB
  3. from setting import RET
  4. from bson import ObjectId
  5. fri = Blueprint("fri", __name__)
  6. @fri.route("/friend_list", methods=["POST"])
  7. def friend_list(): # 好友列表
  8. user_id = request.form.get("user_id")
  9. # 查询用户id信息
  10. res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
  11. friend_list = res.get("friend_list") # 获取好友列表
  12. RET["code"] = 0
  13. RET["msg"] = ""
  14. RET["data"] = friend_list
  15. return jsonify(RET)
  16. @fri.route("/add_req", methods=["POST"])
  17. def add_req():
  18. user_id = request.form.get("user_id") # 有可能是 toy_id or user_id
  19. friend_id = request.form.get("friend_id") # 100%是toy_id
  20. req_type = request.form.get("req_type")
  21. req_msg = request.form.get("req_msg") # 描述
  22. remark = request.form.get("remark") # 备注
  23. if req_type == "toy":
  24. user_info = MONGO_DB.toys.find_one({"_id": ObjectId(user_id)})
  25. else:
  26. user_info = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
  27. req_str = {
  28. "req_user": str(user_info.get("_id")),
  29. "req_type": req_type,
  30. "req_toy": friend_id,
  31. "req_msg": req_msg,
  32. "avatar": user_info.get("avatar"),
  33. "user_remark": remark,
  34. # 昵称,玩具是没有的
  35. "user_nick": user_info.get("nickname") if user_info.get("nickname") else user_info.get("baby_name"),
  36. # 状态,1通过,2拒绝,0中间状态(可切换到1和2)。
  37. "status": 0
  38. }
  39. MONGO_DB.req.insert_one(req_str)
  40. RET["code"] = 0
  41. RET["msg"] = "请求发送成功"
  42. RET["data"] = {}
  43. return jsonify(RET)

进入HBuilder项目MyApp,新建文件add_req.html

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图7

修改 add_req.html

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <link rel="stylesheet" type="text/css" href="css/mui.css" />
  8. </head>
  9. <body>
  10. <header class="mui-bar mui-bar-nav">
  11. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  12. <h1 class="mui-title">请求加为好友</h1>
  13. </header>
  14. <div class="mui-content">
  15. <form class="mui-input-group">
  16. <div class="mui-input-row">
  17. <label>请求内容</label>
  18. <input type="text" class="mui-input-clear" placeholder="快来打个招呼把" id="req_content">
  19. </div>
  20. <div class="mui-input-row">
  21. <label>好友备注</label>
  22. <input type="text" class="mui-input-clear" placeholder="给好友起的响亮的2B名字" id="remark">
  23. </div>
  24. <div class="mui-button-row">
  25. <button type="button" class="mui-btn mui-btn-primary" id="send_req">发送请求</button>
  26. <button type="button" class="mui-btn mui-btn-danger mui-action-back">取消</button>
  27. </div>
  28. </form>
  29. </div>
  30. <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
  31. <script type="text/javascript">
  32. mui.init()
  33. var Sdata = null;
  34. mui.plusReady(function() {
  35. Sdata = plus.webview.currentWebview();
  36. })
  37. document.getElementById("send_req").addEventListener("tap", function() {
  38. mui.post(
  39. window.serv + "/add_req", {
  40. user_id: Sdata.user_id,
  41. req_type: Sdata.req_type,
  42. friend_id: Sdata.friend_id,
  43. req_msg: document.getElementById("req_content").value,
  44. remark: document.getElementById("remark").value
  45. },
  46. function(data) {
  47. console.log(JSON.stringify(data));
  48. }
  49. )
  50. })
  51. </script>
  52. </body>
  53. </html>

修改 index.html,将 底部选项卡中的 邮件,改为 好友请求

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  6. <title></title>
  7. <script src="js/mui.js"></script>
  8. <link href="css/mui.min.css" rel="stylesheet" />
  9. </head>
  10. <body>
  11. <!--底部选项卡-->
  12. <nav class="mui-bar mui-bar-tab">
  13. <a class="mui-tab-item mui-active" id="index">
  14. <span class="mui-icon mui-icon-home"></span>
  15. <span class="mui-tab-label">首页</span>
  16. </a>
  17. <a class="mui-tab-item" id="message">
  18. <span class="mui-icon mui-icon-chat">
  19. <span class="mui-badge mui-badge-red" id="msg_count">0</span>
  20. </span>
  21. <span class="mui-tab-label">消息</span>
  22. </a>
  23. <a class="mui-tab-item" id="req">
  24. <span class="mui-icon mui-icon-email"></span>
  25. <span class="mui-tab-label">好友请求</span>
  26. </a>
  27. <a class="mui-tab-item" id="login">
  28. <span class="mui-icon mui-icon-gear"></span>
  29. <span class="mui-tab-label">设置</span>
  30. </a>
  31. </nav>
  32. </body>
  33. <script type="text/javascript" charset="utf-8">
  34. var ws = null; // websocket对象
  35. var msg_data = null; // 消息数据
  36. mui.init({
  37. subpages: [{
  38. url: "main.html",
  39. id: "main.html",
  40. styles: window.styles
  41. }]
  42. });
  43. mui.plusReady(function() {
  44. // console.log(JSON.stringify(plus.webview.currentWebview()))
  45. if(plus.storage.getItem("user")) { // 判断是否登录
  46. console.log('已结登录了!');
  47. //连接websocket连接
  48. ws = new WebSocket("ws://" + window.ws_serv + "/app/" + plus.storage.getItem("user"))
  49. // 发送post请求
  50. console.log(window.serv + "/get_msg_list");
  51. mui.post(
  52. // 访问消息列表
  53. window.serv + "/get_msg_list", {
  54. user_id: plus.storage.getItem("user")
  55. },
  56. function(data) {
  57. console.log(JSON.stringify(data));
  58. // {"code":0,"data":{"5ba0f1f2e12532418089bf88":1,"count":1},"msg":""}
  59. msg_data = data.data;
  60. // 修改消息选项卡的角标数字
  61. document.getElementById("msg_count").innerText = msg_data.count;
  62. }
  63. );
  64. // 客户端接收服务端数据时触发
  65. ws.onmessage = function(data) {
  66. console.log(data.data);
  67. var msg = JSON.parse(data.data);
  68. var chat = plus.webview.getWebviewById("chat.html");
  69. mui.fire(chat, "new_msg", { // 向chat.html传值
  70. data: msg
  71. });
  72. var msg_count = document.getElementById("msg_count");
  73. // 当前页面加1
  74. msg_count.innerText = parseInt(msg_count.innerText) + 1;
  75. // 加1,用于message.html显示
  76. msg_data[msg.from_user]++;
  77. };
  78. }
  79. // 自动重连
  80. ws.onclose = function() {
  81. window.location.reload();
  82. }
  83. });
  84. // 消息
  85. document.getElementById("message").addEventListener("tap", function() {
  86. mui.openWindow({
  87. url: "message.html",
  88. id: "message.html",
  89. styles: window.styles,
  90. extras: {
  91. // 传输用户id,给message.html
  92. user_id: plus.storage.getItem("user"),
  93. msg_data: msg_data,
  94. // "data":{"5ba0f1f2e12532418089bf88":1,"count":1}
  95. }
  96. })
  97. });
  98. document.getElementById("index").addEventListener("tap", function() {
  99. mui.openWindow({
  100. url: "main.html",
  101. id: "main.html",
  102. styles: window.styles
  103. })
  104. })
  105. document.getElementById("req").addEventListener("tap", function() {
  106. mui.openWindow({
  107. url: "req_list.html",
  108. id: "req_list.html",
  109. styles: window.styles
  110. })
  111. })
  112. document.getElementById("login").addEventListener("tap", function() {
  113. // 自动登录,判断storage中的user存在,就跳转到user_info,否则跳转login
  114. if(plus.storage.getItem("user")) {
  115. mui.openWindow({
  116. url: "user_info.html",
  117. id: "user_info.html",
  118. styles: window.styles,
  119. extras: {
  120. user_id: plus.storage.getItem("user")
  121. }
  122. })
  123. } else {
  124. mui.openWindow({
  125. url: "login.html",
  126. id: "login.html",
  127. styles: window.styles
  128. })
  129. }
  130. })
  131. document.addEventListener("login", function(data) {
  132. // fire事件接收消息,使用data.detail
  133. // index是为做显示区分
  134. mui.toast("index" + data.detail.msg)
  135. });
  136. document.addEventListener("send_music", function(data) { //监听send_music事件
  137. var music_name = data.detail.music_name; //获取player.html使用fire发送的music_name值
  138. var toy_id = data.detail.toy_id; //获取发送的玩具id
  139. send_str = { //构造数据
  140. data: music_name,
  141. to_user: toy_id, // 目标用户,这里统一格式
  142. msg_type: "music", // 类型为音乐
  143. }
  144. // 发送数据给后端,注意要json序列化
  145. ws.send(JSON.stringify(send_str));
  146. });
  147. document.addEventListener("send_msg", function(data) { //发送消息
  148. var filename = data.detail.filename
  149. var to_user = data.detail.to_user
  150. send_str = {
  151. to_user: to_user
  152. }
  153. ws.send(JSON.stringify(send_str))
  154. plus.io.resolveLocalFileSystemURL(filename, function(entry) {
  155. // 可通过entry对象操作test.html文件
  156. entry.file(function(file) {
  157. // FileReader文件系统中的读取文件对象,用于获取文件的内容
  158. var fileReader = new plus.io.FileReader();
  159. // alert("getFile:" + JSON.stringify(file));
  160. // readAsDataURL: 以URL编码格式读取文件数据内容
  161. fileReader.readAsDataURL(file, 'utf-8');
  162. // onloadend: 文件读取操作完成时的回调函数
  163. fileReader.onloadend = function(evt) {
  164. console.log(evt.target.result);
  165. var b = dataURLtoBlob(evt.target.result);
  166. ws.send(b); // 发送blob数据
  167. }
  168. // alert(file.size + '--' + file.name)
  169. });
  170. });
  171. });
  172. // 监听cut_msg_count事件,由message.html向index.html执行fire
  173. document.addEventListener("cut_msg_count", function(data) {
  174. var msg_count = document.getElementById("msg_count");
  175. var cut = parseInt(data.detail.cut); // parseInt表示强制转换
  176. var count = parseInt(msg_count.innerText); // 默认获取innerText是字符串,需要强制转换
  177. msg_count.innerText = count - cut; // 总数 减去 点击聊天会话的数量,比如小甜甜的
  178. });
  179. function dataURLtoBlob(dataurl) { // 数据转换为Blob
  180. // 逻辑很复杂,这里不解释了。直接用就可以了!
  181. var arr = dataurl.split(','),
  182. mime = arr[0].match(/:(.*?);/)[1],
  183. bstr = atob(arr[1]),
  184. n = bstr.length,
  185. u8arr = new Uint8Array(n);
  186. while(n--) {
  187. u8arr[n] = bstr.charCodeAt(n);
  188. }
  189. var a = new Blob([u8arr], {
  190. type: mime
  191. });
  192. return a
  193. }
  194. </script>
  195. </html>

新建文件 req_list.html

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图8

修改 req_list.html

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <link rel="stylesheet" type="text/css" href="css/mui.css" />
  8. </head>
  9. <body>
  10. <header class="mui-bar mui-bar-nav">
  11. <h1 class="mui-title">玩具的好友请求</h1>
  12. </header>
  13. <div class="mui-content" >
  14. <ul class="mui-table-view" id="req_list">
  15. </ul>
  16. </div>
  17. </body>
  18. <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
  19. <script type="text/javascript">
  20. mui.init()
  21. mui.plusReady(function(){
  22. mui.post(
  23. window.serv + "/req_list",
  24. {user_id:plus.storage.getItem("user")},
  25. function(data){
  26. console.log(JSON.stringify(data));
  27. for (var i = 0; i < data.data.length; i++) {
  28. create_req(data.data[i])
  29. }
  30. }
  31. )
  32. })
  33. function create_req(req){
  34. var litag = document.createElement("li");
  35. litag.className = "mui-table-view-cell mui-media";
  36. var atag = document.createElement("a");
  37. atag.id = req._id;
  38. // 点击事件 周一把这儿写了 绑定事件
  39. atag.onclick = function(){
  40. console.log(this.id);
  41. open_req(this.id);
  42. }
  43. var imgtag = document.createElement("img");
  44. imgtag.className = "mui-media-object mui-pull-left";
  45. imgtag.src = "avatar/" + req.avatar;
  46. var divtag = document.createElement("div");
  47. divtag.className = "mui-media-body";
  48. divtag.innerText = req.user_nick;
  49. var ptag = document.createElement("p");
  50. ptag.className = "mui-ellipsis";
  51. ptag.innerText = req.req_msg;
  52. litag.appendChild(atag);
  53. atag.appendChild(imgtag);
  54. atag.appendChild(divtag);
  55. divtag.appendChild(ptag);
  56. document.getElementById("req_list").appendChild(litag);
  57. }
  58. function open_req(req_id){
  59. mui.openWindow({
  60. url:"acc_ref_req.html",
  61. id:"acc_ref_req.html",
  62. extras:{
  63. req_id:req_id
  64. }
  65. })
  66. }
  67. </script>
  68. </html>

进入 flask项目,修改 serv—>friend.py,增加函数 req_list

  1. from flask import Blueprint, request, jsonify
  2. from setting import MONGO_DB
  3. from setting import RET
  4. from bson import ObjectId
  5. fri = Blueprint("fri", __name__)
  6. @fri.route("/friend_list", methods=["POST"])
  7. def friend_list(): # 好友列表
  8. user_id = request.form.get("user_id")
  9. # 查询用户id信息
  10. res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
  11. friend_list = res.get("friend_list") # 获取好友列表
  12. RET["code"] = 0
  13. RET["msg"] = ""
  14. RET["data"] = friend_list
  15. return jsonify(RET)
  16. @fri.route("/add_req", methods=["POST"])
  17. def add_req(): # 添加好友请求
  18. user_id = request.form.get("user_id") # 有可能是 toy_id or user_id
  19. friend_id = request.form.get("friend_id") # 100%是toy_id
  20. req_type = request.form.get("req_type")
  21. req_msg = request.form.get("req_msg") # 描述
  22. remark = request.form.get("remark") # 备注
  23. if req_type == "toy":
  24. user_info = MONGO_DB.toys.find_one({"_id": ObjectId(user_id)})
  25. else:
  26. user_info = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
  27. req_str = {
  28. "req_user": str(user_info.get("_id")),
  29. "req_type": req_type,
  30. "req_toy": friend_id,
  31. "req_msg": req_msg,
  32. "avatar": user_info.get("avatar"),
  33. "user_remark": remark,
  34. # 昵称,玩具是没有的
  35. "user_nick": user_info.get("nickname") if user_info.get("nickname") else user_info.get("baby_name"),
  36. # 状态,1通过,2拒绝,0中间状态(可切换到1和2)。
  37. "status": 0
  38. }
  39. MONGO_DB.req.insert_one(req_str)
  40. RET["code"] = 0
  41. RET["msg"] = "请求发送成功"
  42. RET["data"] = {}
  43. return jsonify(RET)
  44. @fri.route("/req_list", methods=["POST"])
  45. def req_list(): # 添加请求列表
  46. user_id = request.form.get("user_id")
  47. user_info = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
  48. bind_toy = user_info.get("bind_toy")
  49. reqs = list(MONGO_DB.req.find({"req_toy": {"$in": bind_toy}, "status": 0}))
  50. for index, req in enumerate(reqs):
  51. reqs[index]["_id"] = str(req.get("_id"))
  52. RET["code"] = 0
  53. RET["msg"] = ""
  54. RET["data"] = reqs
  55. return jsonify(RET)

用户收到 添加好友请求后,还可以拒绝请求。

进入HBuilder项目MyApp,新建文件acc_ref_req.html

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图9

修改文件 acc_ref_req.html

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <link rel="stylesheet" type="text/css" href="css/mui.css" />
  8. </head>
  9. <body>
  10. <header class="mui-bar mui-bar-nav">
  11. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  12. <h1 class="mui-title">处理好友请求</h1>
  13. </header>
  14. <div class="mui-content">
  15. <ul class="mui-table-view">
  16. <li class="mui-table-view-cell mui-media">
  17. <a href="javascript:;">
  18. <img class="mui-media-object mui-pull-left" src="" id="avatar">
  19. <div class="mui-media-body">
  20. <span id="user_nick"></span>
  21. <p class="mui-ellipsis" id="req_msg"></p>
  22. </div>
  23. </a>
  24. </li>
  25. </ul>
  26. <form class="mui-input-group">
  27. <div class="mui-input-row">
  28. <label>好友备注</label>
  29. <input type="text" class="mui-input-clear" placeholder="给好友起的响亮的2B名字" id="remark">
  30. </div>
  31. <div class="mui-button-row">
  32. <button type="button" class="mui-btn mui-btn-primary" id="ido">I Do</button>
  33. <button type="button" class="mui-btn mui-btn-danger mui-action-back" id="goodman">好人卡</button>
  34. </div>
  35. </form>
  36. </div>
  37. </body>
  38. <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
  39. <script type="text/javascript">
  40. mui.init()
  41. var Sdata = null;
  42. mui.plusReady(function() {
  43. Sdata = plus.webview.currentWebview();
  44. mui.post(
  45. window.serv + "/get_req", {
  46. req_id: Sdata.req_id
  47. },
  48. function(data) {
  49. console.log(JSON.stringify(data));
  50. document.getElementById("avatar").src = "avatar/" + data.data.avatar;
  51. document.getElementById("user_nick").innerText = data.data.user_nick;
  52. document.getElementById("req_msg").innerText = data.data.req_msg;
  53. }
  54. )
  55. })
  56. document.getElementById("ido").addEventListener("tap", function() {
  57. var remark = document.getElementById("remark").value;
  58. mui.post(
  59. window.serv + "/acc_req", {
  60. req_id: Sdata.req_id,
  61. remark:remark
  62. },
  63. function(data) {
  64. console.log(JSON.stringify(data));
  65. }
  66. )
  67. })
  68. document.getElementById("goodman").addEventListener("tap", function() {
  69. mui.post(
  70. window.serv + "/ref_req", {
  71. req_id: Sdata.req_id
  72. },
  73. function(data) {
  74. console.log(JSON.stringify(data));
  75. }
  76. )
  77. })
  78. </script>
  79. </html>

修改 qrcode.html,这里应该要扫描玩具二维码的。但是太麻烦了,直接固定设备编号!

固定设备编号为 小豆芽,发给后端。因为当前web玩具是小甜甜。它需要增加对方才行!

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <link rel="stylesheet" type="text/css" href="css/mui.css" />
  8. </head>
  9. <body>
  10. <header class="mui-bar mui-bar-nav">
  11. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  12. <h1 class="mui-title">扫描玩具二维码</h1>
  13. </header>
  14. <div class="mui-content">
  15. <div style="height: 550px;" id="qr"></div>
  16. </div>
  17. </body>
  18. <script src="js/mui.js" type="text/javascript" charset="utf-8"></script>
  19. <script type="text/javascript">
  20. mui.init()
  21. var Sdata = null;
  22. mui.plusReady(function() {
  23. Sdata = plus.webview.currentWebview();
  24. // var barcode = new plus.barcode.Barcode('qr');
  25. // // plus.webview.currentWebview().append(barcode);
  26. // barcode.onmarked = chenggong;
  27. // barcode.start();
  28. // 临时改为小豆芽的设备id,从MongoDB中的toys表查询
  29. chenggong(0,"02cc0fc7490b6ee08c31f38ac7a375eb")
  30. })
  31. function chenggong(type, code) {
  32. mui.post(
  33. window.serv + "/yanzheng_qr", {
  34. device_id: code
  35. },
  36. function(data) {
  37. console.log(JSON.stringify(data));
  38. mui.toast(data.msg);
  39. if(data.code == 2) {
  40. mui.back();
  41. }
  42. if(data.code == 1) {
  43. //加好友的小逻辑 跳转到加好友页面
  44. if(Sdata.toy_id) {
  45. //1.玩具 添加好友 toys toys
  46. mui.openWindow({
  47. url: "add_req.html",
  48. id: "add_req.html",
  49. extras: {
  50. req_type: "toy",
  51. user_id: Sdata.toy_id,
  52. friend_id: data.data.toy_id
  53. }
  54. })
  55. } else {
  56. // 2.手机app 添加好友 users toys
  57. mui.openWindow({
  58. url: "add_req.html",
  59. id: "add_req.html",
  60. extras: {
  61. req_type: "user",
  62. user_id: plus.storage.getItem("user"),
  63. friend_id: data.data.toy_id
  64. }
  65. })
  66. }
  67. }
  68. if(data.code == 0) {
  69. //今天的逻辑 创建玩具 绑定用户 成为玩具的第一个好友
  70. //1.创建玩具:打开创建玩具的页面
  71. if(Sdata.toy_id) {
  72. mui.back()
  73. } else {
  74. mui.openWindow({
  75. url: "bind_toy.html",
  76. id: "bind_toy.html",
  77. extras: {
  78. device_id: code
  79. }
  80. })
  81. }
  82. }
  83. }
  84. )
  85. }
  86. </script>
  87. </html>

进入flask项目,修改 serv—>friend.py,增加函数get_req,acc_req,ref_req

  1. from flask import Blueprint, request, jsonify
  2. from setting import MONGO_DB
  3. from setting import RET
  4. from bson import ObjectId
  5. fri = Blueprint("fri", __name__)
  6. @fri.route("/friend_list", methods=["POST"])
  7. def friend_list(): # 好友列表
  8. user_id = request.form.get("user_id")
  9. # 查询用户id信息
  10. res = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
  11. friend_list = res.get("friend_list") # 获取好友列表
  12. RET["code"] = 0
  13. RET["msg"] = ""
  14. RET["data"] = friend_list
  15. return jsonify(RET)
  16. @fri.route("/add_req", methods=["POST"])
  17. def add_req(): # 添加好友请求
  18. user_id = request.form.get("user_id") # 有可能是 toy_id or user_id
  19. friend_id = request.form.get("friend_id") # 100%是toy_id
  20. req_type = request.form.get("req_type")
  21. req_msg = request.form.get("req_msg") # 描述
  22. remark = request.form.get("remark") # 备注
  23. if req_type == "toy":
  24. user_info = MONGO_DB.toys.find_one({"_id": ObjectId(user_id)})
  25. else:
  26. user_info = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
  27. req_str = {
  28. "req_user": str(user_info.get("_id")),
  29. "req_type": req_type,
  30. "req_toy": friend_id,
  31. "req_msg": req_msg,
  32. "avatar": user_info.get("avatar"),
  33. "user_remark": remark,
  34. # 昵称,玩具是没有的
  35. "user_nick": user_info.get("nickname") if user_info.get("nickname") else user_info.get("baby_name"),
  36. # 状态,1通过,2拒绝,0中间状态(可切换到1和2)。
  37. "status": 0
  38. }
  39. MONGO_DB.req.insert_one(req_str)
  40. RET["code"] = 0
  41. RET["msg"] = "请求发送成功"
  42. RET["data"] = {}
  43. return jsonify(RET)
  44. @fri.route("/req_list", methods=["POST"])
  45. def req_list(): # 添加请求列表
  46. user_id = request.form.get("user_id")
  47. user_info = MONGO_DB.users.find_one({"_id": ObjectId(user_id)})
  48. bind_toy = user_info.get("bind_toy")
  49. reqs = list(MONGO_DB.req.find({"req_toy": {"$in": bind_toy}, "status": 0}))
  50. for index, req in enumerate(reqs):
  51. reqs[index]["_id"] = str(req.get("_id"))
  52. RET["code"] = 0
  53. RET["msg"] = ""
  54. RET["data"] = reqs
  55. return jsonify(RET)
  56. @fri.route("/get_req", methods=["POST"])
  57. def get_req(): # 获取好友请求
  58. req_id = request.form.get("req_id")
  59. req_info = MONGO_DB.req.find_one({"_id": ObjectId(req_id)})
  60. req_info["_id"] = str(req_info.get("_id"))
  61. RET["code"] = 0
  62. RET["msg"] = ""
  63. RET["data"] = req_info
  64. return jsonify(RET)
  65. @fri.route("/acc_req", methods=["POST"])
  66. def acc_req(): # 允许好友请求
  67. req_id = request.form.get("req_id")
  68. remark = request.form.get("remark")
  69. req_info = MONGO_DB.req.find_one({"_id": ObjectId(req_id)})
  70. # 1. 为 user 或 toy 添加 toy
  71. if req_info.get("req_type") == "toy":
  72. user_info = MONGO_DB.toys.find_one({"_id": ObjectId(req_info.get("req_user"))})
  73. else:
  74. user_info = MONGO_DB.users.find_one({"_id": ObjectId(req_info.get("req_user"))})
  75. toy = MONGO_DB.toys.find_one({"_id": ObjectId(req_info.get("req_toy"))})
  76. chat_window = MONGO_DB.chat.insert_one({"user_list": [str(toy.get("_id")), str(user_info.get("_id"))]})
  77. friend_info = {
  78. "friend_id": str(toy.get("_id")),
  79. "friend_name": toy.get("baby_name"),
  80. "friend_remark": req_info.get("user_remark"),
  81. "friend_avatar": toy.get("avatar"),
  82. "friend_chat": str(chat_window.inserted_id)
  83. }
  84. if req_info.get("req_type") == "toy":
  85. MONGO_DB.toys.update_one({"_id": ObjectId(req_info.get("req_user"))},
  86. {"$push": {"friend_list": friend_info}})
  87. else:
  88. MONGO_DB.users.update_one({"_id": ObjectId(req_info.get("req_user"))},
  89. {"$push": {"friend_list": friend_info}})
  90. # 2. 为 toy 添加 user 或 toy
  91. user_name = user_info.get("nickname") if user_info.get("nickname") else user_info.get("baby_name")
  92. friend_info2 = {
  93. "friend_id": str(user_info.get("_id")),
  94. "friend_name": user_name,
  95. # 同意方的备注
  96. "friend_remark": remark if remark else user_name,
  97. "friend_avatar": user_info.get("avatar"),
  98. "friend_chat": str(chat_window.inserted_id)
  99. }
  100. MONGO_DB.toys.update_one({"_id": ObjectId(req_info.get("req_toy"))},
  101. {"$push": {"friend_list": friend_info2}})
  102. RET["code"] = 0
  103. RET["msg"] = f"添加好友{remark}成功"
  104. RET["data"] = {}
  105. MONGO_DB.req.update_one({"_id": ObjectId(req_id)}, {"$set": {"status": 1}})
  106. return jsonify(RET)
  107. @fri.route("/ref_req", methods=["POST"])
  108. def ref_req(): # 拒绝好友请
  109. req_id = request.form.get("req_id")
  110. MONGO_DB.req.update_one({"_id": ObjectId(req_id)}, {"$set": {"status": 2}})
  111. RET["code"] = 0
  112. RET["msg"] = "已拒绝好友请求"
  113. RET["data"] = {}
  114. return jsonify(RET)

重启 manager.py

使用模拟器访问,点击添加好友,效果如下:

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图10

输入表单数据,效果如下:

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图11

点击发送请求,查看Pycharm控制台输出:

  1. 192.168.11.25 - - [25/Sep/2018 20:49:47] "POST /add_req HTTP/1.1" 200 -

请求成功了

查看表 req,发现有一条记录

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图12

点击底部选项卡的 好友请求—> 小甜甜

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图13

输入好友备注,点击 I Do

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图14

查看Pycharm

  1. 192.168.11.25 - - [25/Sep/2018 21:05:46] "POST /acc_req HTTP/1.1" 200 -

返回管理我的玩具,点击小甜甜,效果如下:

Day132 玩具管理页面,控制玩具通讯录,基于请求的好友关系建立 - 图15

发现多了一个好友

查看玩具表,查看 friend_list字段。有2个记录

  1. /* 1 createdAt:2018/9/19 下午5:53:08*/
  2. {
  3. "_id" : ObjectId("5ba21c84e1253229c4acbd12"),
  4. "device_id" : "02cc0fc7490b6ee08c31f38ac7a375eb",
  5. "toy_name" : "豆芽",
  6. "baby_name" : "小豆芽",
  7. "gender" : "2",
  8. "avatar" : "girl.jpg",
  9. "bind_user" : "5b9bb768e1253281608e96eb",
  10. "friend_list" : [
  11. {
  12. "friend_id" : "5b9bb768e1253281608e96eb",
  13. "friend_name" : "xiao",
  14. "friend_remark" : "小鱼",
  15. "friend_avatar" : "boy.jpg",
  16. "friend_chat" : "5ba21c84e1253229c4acbd11",
  17. "user_type" : "user"
  18. },
  19. {
  20. "friend_id" : "5ba0f1f2e12532418089bf88",
  21. "friend_name" : "小甜甜",
  22. "friend_remark" : "小甜甜",
  23. "friend_avatar" : "girl.jpg",
  24. "friend_chat" : "5bab7c19e125327ffc804459",
  25. "user_type" : "toy"
  26. }
  27. ]
  28. },
  29. /* 2 createdAt:2018/9/18 下午8:39:14*/
  30. {
  31. "_id" : ObjectId("5ba0f1f2e12532418089bf88"),
  32. "device_id" : "01f9bf1bac93eddd8397d0455abbeddb",
  33. "toy_name" : "小可爱",
  34. "baby_name" : "小甜甜",
  35. "gender" : "2",
  36. "avatar" : "girl.jpg",
  37. "bind_user" : "5b9bb768e1253281608e96eb",
  38. "friend_list" : [
  39. {
  40. "friend_id" : "5b9bb768e1253281608e96eb",
  41. "friend_name" : "xiao",
  42. "friend_remark" : "小鱼",
  43. "friend_avatar" : "boy.jpg",
  44. "friend_chat" : "5ba21c84e1253229c4acbd11",
  45. "user_type" : "user"
  46. },
  47. {
  48. "friend_id" : "5ba21c84e1253229c4acbd12",
  49. "friend_name" : "小豆芽",
  50. "friend_remark" : "豆芽",
  51. "friend_avatar" : "girl.jpg",
  52. "friend_chat" : "5bab7c19e125327ffc804459",
  53. "user_type" : "toy"
  54. }
  55. ]
  56. }

会发现,小甜甜和小豆芽,互为好友了!

今日总结:

  1. 1.玩具管理页面
  2. mui组件
  3. msl : 图文表格
  4. 2.控制玩具通讯录
  5. 3.基于请求的好友关系建立
  6. 发送请求:带上自己的所有信息 + 请求信息
  7. 接收请求:可以看到自己的所有消息
  8. 双方添加好友:
  9. 同意:
  10. 1.判断自己是玩具还是用户
  11. 2.查询好友的信息
  12. 3.建立好友的信息(friend_list 中的元素)
  13. 4.将建立的好友信息存放在自己的friend_list
  14. 5.建立自己的信息(好友的friend_list 中的元素)
  15. 6.将建立的自己信息存放在好友的friend_list
  16. 7.将请求的状态改为 1

完整代码,参考github:

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

注意:qrcode.html,固定设备编号为 小豆芽。需要修正一下!