App.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <script>
  2. import instApi from "./api/inst";
  3. import to from "await-to-js";
  4. const module = uni.requireNativePlugin("leven-arcFace-ArcFaceModule");
  5. export default {
  6. onLaunch: function () {
  7. this.getAllPhoto();
  8. setInterval(() => {
  9. this.getAllPhoto();
  10. }, 60000);
  11. plus.navigator.hideSystemNavigation();
  12. plus.screen.lockOrientation("landscape-primary");
  13. plus.navigator.setFullscreen(true); //隐藏状态栏(应用全屏:只能隐藏状态栏,标题栏和虚拟返回键都还可以显示)
  14. },
  15. onShow: function () {
  16. console.log("App Show");
  17. },
  18. onHide: function () {
  19. console.log("App Hide");
  20. },
  21. methods: {
  22. // 获取本地和线上注册的人脸图片信息
  23. async getAllPhoto() {
  24. let onLineFacePhoto = [];
  25. let localFacePhoto = [];
  26. // 获取线上所有的人脸图片
  27. let [err, res] = await to(instApi.getPhoto({}));
  28. if (err) return;
  29. if (res.code == 200 && res.data.length > 0) {
  30. onLineFacePhoto = res.data.map((item) => {
  31. console.log("头像", this.completionImgPath(item.url));
  32. return {
  33. ...item,
  34. url: this.completionImgPath(item.url),
  35. name: btoa(encodeURIComponent(this.completionImgPath(item.url))),
  36. };
  37. });
  38. console.log("在线", onLineFacePhoto);
  39. // 获取注册了的人脸信息
  40. module.getAllFace((localRes) => {
  41. localFacePhoto = localRes.code == 0 ? localRes.data.list : [];
  42. console.log("本地", localFacePhoto);
  43. // 如果本地注册量0 并且 线上有图片 则直接全部注册
  44. if (localFacePhoto.length == 0 && onLineFacePhoto.length > 0) {
  45. this.register(onLineFacePhoto);
  46. } else if (
  47. localFacePhoto.length > 0 &&
  48. onLineFacePhoto.length > 0
  49. ) {
  50. this.handleFacePhoto(onLineFacePhoto, localFacePhoto);
  51. }
  52. });
  53. }
  54. },
  55. completionImgPath(path) {
  56. let url = path;
  57. if (url.indexOf("http") == -1) {
  58. url = process.uniEnv.VITE_FILE + url;
  59. }
  60. return url;
  61. },
  62. // 对比在线人脸和本地人脸的数组是否有差异
  63. diffFacePhoto(onlineArr, localArr) {
  64. const unregistered = onlineArr.filter(
  65. (onlineItem) =>
  66. !localArr.some((localItem) => localItem.id === onlineItem.id)
  67. );
  68. console.log("unregistered", unregistered);
  69. return unregistered;
  70. },
  71. // 批量注册
  72. register(list) {
  73. console.log("需注册的人脸列表", list);
  74. if (list.length > 0) {
  75. module.batchRegister(
  76. {
  77. // 同一人是否可以多次注册,默认true
  78. registerMultiple: false,
  79. list,
  80. },
  81. (res) => {
  82. console.log("注册信息", res);
  83. }
  84. );
  85. }
  86. },
  87. handleFacePhoto(onLineFacePhoto, localFacePhoto) {
  88. let localArr = localFacePhoto;
  89. let onlineArr = onLineFacePhoto;
  90. // 创建两个空数组来存放结果
  91. let notInLocalArr = [];
  92. let nameUrlMismatch = [];
  93. // 将localArr转换为对象以便快速查找
  94. let localArrMap = new Map();
  95. localArr.forEach((item) => {
  96. localArrMap.set(item.id, decodeURIComponent(atob(item.name)));
  97. });
  98. // 遍历onlineArr来检查id是否在localArr中不存在,以及name和url是否匹配
  99. onlineArr.forEach((item) => {
  100. if (!localArrMap.has(item.id)) {
  101. notInLocalArr.push(item);
  102. } else if (localArrMap.get(item.id) !== item.url) {
  103. nameUrlMismatch.push(item);
  104. }
  105. });
  106. console.log("IDs not in localArr:", notInLocalArr);
  107. console.log("Name and URL mismatch:", nameUrlMismatch);
  108. // 如果有需要注册的人脸,则进行注册
  109. if (notInLocalArr.length > 0) {
  110. this.register(notInLocalArr);
  111. }
  112. // 如果有需要更新的人脸,则进行删除更新
  113. if (nameUrlMismatch.length > 0) {
  114. this.updateFace(nameUrlMismatch);
  115. }
  116. },
  117. // 更新人脸(删除后重新注册)
  118. updateFace(list) {
  119. console.log("需更新的人脸列表", list);
  120. if (list.length > 0) {
  121. list.map((item) => {
  122. // 先删除
  123. console.log("item.id", item.id);
  124. module.getFace(
  125. {
  126. id: item.id,
  127. },
  128. (res) => {
  129. console.log("是否存在要删除的人脸", res);
  130. module.deleteFace(
  131. {
  132. id: item.id,
  133. },
  134. (res) => {
  135. console.log("删除信息", res);
  136. if (res.code == 0) {
  137. module.imageFaceRegister(
  138. {
  139. url: item.url,
  140. id: item.id,
  141. name: item.name,
  142. // 同一人是否可以多次注册,默认true
  143. registerMultiple: false,
  144. },
  145. (res) => {
  146. console.log(res);
  147. }
  148. );
  149. }
  150. }
  151. );
  152. }
  153. );
  154. });
  155. }
  156. },
  157. },
  158. };
  159. </script>
  160. <style lang="scss">
  161. /* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
  162. @import "@/uni_modules/uview-ui/index.scss";
  163. @import "./style/common.scss";
  164. </style>