yzx преди 3 седмици
родител
ревизия
03c505f7a9
променени са 100 файла, в които са добавени 4052 реда и са изтрити 0 реда
  1. 1 0
      unpackage/dist/dev/mp-weixin/api/adv.js
  2. 1 0
      unpackage/dist/dev/mp-weixin/api/article.js
  3. 1 0
      unpackage/dist/dev/mp-weixin/api/common.js
  4. 1 0
      unpackage/dist/dev/mp-weixin/api/companyUser.js
  5. 1 0
      unpackage/dist/dev/mp-weixin/api/coupon.js
  6. 1 0
      unpackage/dist/dev/mp-weixin/api/course.js
  7. 1 0
      unpackage/dist/dev/mp-weixin/api/courseOrder.js
  8. 1 0
      unpackage/dist/dev/mp-weixin/api/department.js
  9. 1 0
      unpackage/dist/dev/mp-weixin/api/disease.js
  10. 1 0
      unpackage/dist/dev/mp-weixin/api/doctor.js
  11. 1 0
      unpackage/dist/dev/mp-weixin/api/doctorArticle.js
  12. 1 0
      unpackage/dist/dev/mp-weixin/api/drugReport.js
  13. 1 0
      unpackage/dist/dev/mp-weixin/api/follow.js
  14. 1 0
      unpackage/dist/dev/mp-weixin/api/healthRecords.js
  15. 1 0
      unpackage/dist/dev/mp-weixin/api/healthTongue.js
  16. 1 0
      unpackage/dist/dev/mp-weixin/api/hospital.js
  17. 1 0
      unpackage/dist/dev/mp-weixin/api/index.js
  18. 1 0
      unpackage/dist/dev/mp-weixin/api/inquiryOrder.js
  19. 1 0
      unpackage/dist/dev/mp-weixin/api/integral.js
  20. 1 0
      unpackage/dist/dev/mp-weixin/api/package.js
  21. 1 0
      unpackage/dist/dev/mp-weixin/api/packageOrder.js
  22. 1 0
      unpackage/dist/dev/mp-weixin/api/patient.js
  23. 1 0
      unpackage/dist/dev/mp-weixin/api/prescribe.js
  24. 1 0
      unpackage/dist/dev/mp-weixin/api/storeAfterSales.js
  25. 1 0
      unpackage/dist/dev/mp-weixin/api/storeOrder.js
  26. 1 0
      unpackage/dist/dev/mp-weixin/api/test.js
  27. 1 0
      unpackage/dist/dev/mp-weixin/api/user.js
  28. 1 0
      unpackage/dist/dev/mp-weixin/api/userAddress.js
  29. 1 0
      unpackage/dist/dev/mp-weixin/api/userVipOrder.js
  30. 0 0
      unpackage/dist/dev/mp-weixin/app.js
  31. 209 0
      unpackage/dist/dev/mp-weixin/app.json
  32. 0 0
      unpackage/dist/dev/mp-weixin/app.wxss
  33. 1 0
      unpackage/dist/dev/mp-weixin/common/assets.js
  34. 1 0
      unpackage/dist/dev/mp-weixin/common/request.js
  35. 0 0
      unpackage/dist/dev/mp-weixin/common/vendor.js
  36. 1 0
      unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/Layout.js
  37. 4 0
      unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/Layout.json
  38. 1 0
      unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/Layout.wxml
  39. 1 0
      unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/Layout.wxss
  40. 1 0
      unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/index.js
  41. 6 0
      unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/index.json
  42. 1 0
      unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/index.wxml
  43. 1 0
      unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/index.wxss
  44. 1 0
      unpackage/dist/dev/mp-weixin/components/Loading.js
  45. 4 0
      unpackage/dist/dev/mp-weixin/components/Loading.json
  46. 1 0
      unpackage/dist/dev/mp-weixin/components/Loading.wxml
  47. 1 0
      unpackage/dist/dev/mp-weixin/components/Loading.wxss
  48. 1 0
      unpackage/dist/dev/mp-weixin/components/Menu.js
  49. 4 0
      unpackage/dist/dev/mp-weixin/components/Menu.json
  50. 1 0
      unpackage/dist/dev/mp-weixin/components/Menu.wxml
  51. 1 0
      unpackage/dist/dev/mp-weixin/components/Menu.wxss
  52. 13 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/@tencentcloud/call-uikit-wechat/index.js
  53. 1 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/@tencentcloud/call-uikit-wechat/index.js.map
  54. 7 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/tim-wx-sdk/index.js
  55. 0 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/tim-wx-sdk/index.js.map
  56. 7 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/trtc-wx-sdk/index.js
  57. 0 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/trtc-wx-sdk/index.js.map
  58. 7 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/tsignaling-wx/index.js
  59. 0 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/tsignaling-wx/index.js.map
  60. 7 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/tuicall-engine-wx/index.js
  61. 0 0
      unpackage/dist/dev/mp-weixin/miniprogram_npm/tuicall-engine-wx/index.js.map
  62. 50 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/README.md
  63. 927 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/TUICallKit.js
  64. 11 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/TUICallKit.json
  65. 52 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/TUICallKit.wxml
  66. 25 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/TUICallKit.wxss
  67. 108 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/calling/calling.js
  68. 4 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/calling/calling.json
  69. 106 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/calling/calling.wxml
  70. 258 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/calling/calling.wxss
  71. 155 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/connected/connected.js
  72. 4 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/connected/connected.json
  73. 118 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/connected/connected.wxml
  74. 253 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/connected/connected.wxss
  75. 112 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupCalling/groupCalling.js
  76. 4 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupCalling/groupCalling.json
  77. 135 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupCalling/groupCalling.wxml
  78. 380 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupCalling/groupCalling.wxss
  79. 181 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupConnected/groupConnected.js
  80. 7 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupConnected/groupConnected.json
  81. 162 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupConnected/groupConnected.wxml
  82. 414 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupConnected/groupConnected.wxss
  83. 39 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall.js
  84. 8 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall.json
  85. 5 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall.wxml
  86. 0 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall.wxss
  87. 30 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall_uni.vue
  88. 49 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/serve/bellContext.js
  89. 143 0
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/serve/callManager.js
  90. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/audio-false.png
  91. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/audio-true.png
  92. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/camera-false.png
  93. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/camera-true.png
  94. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/default_avatar.png
  95. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/dialing.png
  96. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/hangup.png
  97. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/loading.png
  98. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/phone_dialing.mp3
  99. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/phone_ringing.mp3
  100. BIN
      unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/speaker-false.png

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/adv.js

@@ -0,0 +1 @@
+"use strict";var t=require("../common/request.js");let s=new t.Request().http;function r(e){return s("/app/adv/getAdvList",e,"GET")}exports.getAdvList=r;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/article.js

@@ -0,0 +1 @@
+"use strict";var r=require("../common/request.js");let e=new r.Request().http;function i(t){return e("/app/article/getArticleList",t,"GET")}function c(t){return e("/app/article/getArticleById",t,"GET")}function l(t){return e("/app/article/getArticleCateList",t,"GET")}exports.getArticleById=c;exports.getArticleCateList=l;exports.getArticleList=i;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/common.js

@@ -0,0 +1 @@
+"use strict";var n=require("../common/request.js");let e=new n.Request().http;function i(t){return e("/app/common/getCitys",t,"GET")}function o(t){return e("/app/common/getTlsSig",t,"GET")}function g(t){return e("/app/common/getDictByKey",t,"GET")}function r(t){return e("/app/common/getConfigByKey",t,"GET")}function s(t){return e("/app/common/getHospitalList",t,"GET")}function m(t){return e("/app/common/getDepartmentList",t,"GET")}exports.getCitys=i;exports.getConfigByKey=r;exports.getDepartmentList=m;exports.getDictByKey=g;exports.getHospitalList=s;exports.getTlsSig=o;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/companyUser.js

@@ -0,0 +1 @@
+"use strict";var o=require("../common/request.js");let e=new o.Request().http;function r(n){return e("/app/companyUser/login",n,"POST","application/json;charset=UTF-8")}function t(n){return e("/app/companyUser/getUserInfo",n,"GET","application/json;charset=UTF-8")}function s(n){return e("/app/companyUser/bindCompanyUser",n,"POST","application/json;charset=UTF-8")}function a(n){return e("/app/companyUser/getBindInfo",n,"GET","application/json;charset=UTF-8")}function p(n){return e("/app/companyCompanyFsUser/bind/"+n,null,"GET","application/json;charset=UTF-8")}exports.bindCompanyFsUser=p;exports.bindCompanyUser=s;exports.getBindInfo=a;exports.getUserInfo=t;exports.login=r;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/coupon.js

@@ -0,0 +1 @@
+"use strict";var n=require("../common/request.js");let o=new n.Request().http;function t(e){return o("/app/coupon/getCouponList",e,"GET")}function u(e){return o("/app/coupon/getCouponById",e,"GET")}function p(e){return o("/app/coupon/genCode",e,"GET")}function r(e){return o("/app/coupon/receive",e,"POST","application/json;charset=UTF-8")}exports.genCode=p;exports.getCouponById=u;exports.getCouponList=t;exports.receive=r;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/course.js

@@ -0,0 +1 @@
+"use strict";var r=require("../common/request.js");let t=new r.Request().http;function s(e){return t("/app/wx/courseLogin",e,"POST","application/json;charset=UTF-8","https://h5api.his.cdwjyyh.com")}function i(e){return t("/app/course/getRealLink",e,"GET","","https://h5api.his.cdwjyyh.com")}function n(e){return t("/app/course/getH5CourseByVideoId",e,"GET","","https://h5api.his.cdwjyyh.com")}function o(e){return t("/app/course/getH5CourseVideoDetails",e,"GET","","https://h5api.his.cdwjyyh.com")}function c(e){return t("/app/course/courseAnswer",e,"POST","application/json;charset=UTF-8","https://h5api.his.cdwjyyh.com")}function a(e){return t("/app/course/updateWatchDuration",e,"POST","application/json;charset=UTF-8","https://h5api.his.cdwjyyh.com")}function p(e){return t("/app/course/isAddKf",e,"POST","application/json;charset=UTF-8","https://h5api.his.cdwjyyh.com")}function h(e){return t("/app/course/getInternetTraffic",e,"POST","application/json;charset=UTF-8","https://h5api.his.cdwjyyh.com")}function u(e){return t("/app/course/getIntegralByH5Video",e,"POST","application/json;charset=UTF-8","https://h5api.his.cdwjyyh.com")}function d(e){return t("/app/course/sendReward",e,"POST","application/json;charset=UTF-8","https://h5api.his.cdwjyyh.com")}function g(e){return t("/app/course/getErrMsg",e,"POST","application/x-www-form-urlencoded","https://h5api.his.cdwjyyh.com")}function y(e){return t("/barrage/barrage/list/"+e,null,"GET","","https://h5api.his.cdwjyyh.com")}exports.courseAnswer=c;exports.getDanmuList=y;exports.getErrMsg=g;exports.getFinishCourseVideo=a;exports.getH5CourseByVideoId=n;exports.getH5CourseVideoDetails=o;exports.getIntegralByH5Video=u;exports.getInternetTraffic=h;exports.getIsAddKf=p;exports.getRealLink=i;exports.loginByMp=s;exports.sendReward=d;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/courseOrder.js

@@ -0,0 +1 @@
+"use strict";var t=require("../common/request.js");let r=new t.Request().http;function u(e){return r("/app/courseOrder/weChatPayment",e,"POST","application/json;charset=UTF-8")}function n(e){return r("/app/courseOrder/getCourseOrderById",e,"GET")}exports.getCourseOrderById=n;exports.payment=u;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/department.js

@@ -0,0 +1 @@
+"use strict";var t=require("../common/request.js");let r=new t.Request().http;function n(e){return r("/app/department/getDepartmentList",e,"GET")}exports.getDepartmentList=n;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/disease.js

@@ -0,0 +1 @@
+"use strict";var t=require("../common/request.js");let s=new t.Request().http;function i(e){return s("/app/disease/getDiseaseList",e,"GET")}function a(e){return s("/app/disease/getDiseaseById",e,"GET")}exports.getDiseaseById=a;exports.getDiseaseList=i;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/doctor.js

@@ -0,0 +1 @@
+"use strict";var e=require("../common/request.js");let o=new e.Request().http;function r(t){return o("/app/doctor/getMyDoctorList",t,"GET")}function c(t){return o("/app/doctor/getDoctorDetails",t,"GET")}function n(t){return o("/app/doctor/getDoctorPingList",t,"GET")}function i(t){return o("/app/doctor/getDoctorList",t,"GET")}function s(t){return o("/app/doctor/checkFollow",t,"GET")}function u(t){return o("/app/doctor/doFollow",t,"POST","application/json;charset=UTF-8")}exports.checkFollow=s;exports.doFollow=u;exports.getDoctorDetails=c;exports.getDoctorList=i;exports.getDoctorPingList=n;exports.getMyDoctorList=r;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/doctorArticle.js

@@ -0,0 +1 @@
+"use strict";var r=require("../common/request.js");let e=new r.Request().http;function o(t){return e("/app/doctorArticle/getDoctorArticleCateList",t,"GET")}function c(t){return e("/app/doctorArticle/getDoctorArticleList",t,"GET")}function i(t){return e("/app/doctorArticle/getDoctorArticleById",t,"GET")}exports.getDoctorArticleById=i;exports.getDoctorArticleCateList=o;exports.getDoctorArticleList=c;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/drugReport.js

@@ -0,0 +1 @@
+"use strict";var e=require("../common/request.js");let r=new e.Request().http;function o(){return r("/app/drugReport/getUserFollowDoctor",null,"GET")}function p(t){return r("/app/drugReport/getDrugReportList",t,"GET")}function u(t){return r("/app/drugReport/getDrugReportById",t,"GET")}function g(t){return r("/app/drugReport/pingReport",t,"POST","application/json;charset=UTF-8")}function n(t){return r("/app/drugReport/startDrugReport",t,"POST","application/json;charset=UTF-8")}exports.getDrugReportById=u;exports.getDrugReportList=p;exports.getUserFollowDoctor=o;exports.pingReport=g;exports.startDrugReport=n;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/follow.js

@@ -0,0 +1 @@
+"use strict";var t=require("../common/request.js");let l=new t.Request().http;function e(o){return l("/app/follow/getFollowList",o,"GET")}function n(o){return l("/app/follow/getFollowById",o,"GET")}function r(o){return l("/app/follow/doFollow",o,"POST","application/json;charset=UTF-8")}exports.doFollow=r;exports.getFollowById=n;exports.getFollowList=e;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/healthRecords.js

@@ -0,0 +1 @@
+"use strict";var a=require("../common/request.js");let t=new a.Request().http;function r(){return t("/app/healthRecord/myRecord",null,"GET")}function o(e){return t("/app/healthRecord/HealthLife",e,"GET")}function h(){return t("/app/healthRecord/healthHistoryTempList",null,"GET")}function i(e){return t("/app/healthRecord/HealthDataList",e,"GET")}function c(e){return t("/app/healthRecord/editRecord",e,"PUT","application/json;charset=UTF-8")}function n(e){return t("/app/healthRecord/addRecord",e,"POST","application/json;charset=UTF-8")}function d(e){return t("/app/healthRecord/addFsHealthLife",e,"POST","application/json;charset=UTF-8")}exports.HealthDataList=i;exports.HealthLife=o;exports.addFsHealthLife=d;exports.addRecord=n;exports.editRecord=c;exports.healthHistoryTempList=h;exports.myRecord=r;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/healthTongue.js

@@ -0,0 +1 @@
+"use strict";var n=require("../common/request.js");let t=new n.Request().http;function u(e){return t("/app/healthTongue/getHealthTongueList",e,"GET")}function o(e){return t("/app/healthTongue/getCount",e,"GET")}function a(e){return t("/app/healthTongue/getHealthTongueById/"+e,null,"GET")}function g(e){return t("/app/healthTongue/add",e,"POST","application/json;charset=UTF-8")}exports.add=g;exports.getCount=o;exports.getHealthTongueById=a;exports.getHealthTongueList=u;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/hospital.js

@@ -0,0 +1 @@
+"use strict";var s=require("../common/request.js");let e=new s.Request().http;function i(t){return e("/app/hospital/getHospitalList",t,"GET")}function o(t){return e("/app/hospital/getHospitalById",t,"GET")}exports.getHospitalById=o;exports.getHospitalList=i;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/index.js

@@ -0,0 +1 @@
+"use strict";var i=require("../common/request.js");let t=new i.Request().http;function s(e){return t("/app/index/getFamousPrescribeList",e,"GET")}function n(e){return t("/app/index/getFamousPrescribeById",e,"GET")}function d(e){return t("/app/index/getQuestionsList",e,"GET")}function r(e){return t("/app/index/getQuestionsById",e,"GET")}function o(e){return t("/app/index/getMedicatedFoodList",e,"GET")}function u(e){return t("/app/index/getMedicatedFoodById",e,"GET")}function c(e){return t("/app/index/getVesselList",e,"GET")}function g(e){return t("/app/index/getVesselById",e,"GET")}function a(e){return t("/app/index/getChineseMedicineList",e,"GET")}function p(e){return t("/app/index/getChineseMedicineById",e,"GET")}exports.getChineseMedicineById=p;exports.getChineseMedicineList=a;exports.getFamousPrescribeById=n;exports.getFamousPrescribeList=s;exports.getMedicatedFoodById=u;exports.getMedicatedFoodList=o;exports.getQuestionsById=r;exports.getQuestionsList=d;exports.getVesselById=g;exports.getVesselList=c;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/inquiryOrder.js

@@ -0,0 +1 @@
+"use strict";var n=require("../common/request.js");let e=new n.Request().http;function i(r){return e("/app/inquiryOrder/confirm",r,"POST","application/json;charset=UTF-8")}function t(r){return e("/app/inquiryOrder/create",r,"POST","application/json;charset=UTF-8")}function u(r){return e("/app/inquiryOrder/pay",r,"POST","application/json;charset=UTF-8")}function p(r){return e("/app/inquiryOrder/compute",r,"POST","application/json;charset=UTF-8")}function y(r){return e("/app/inquiryOrder/payment",r,"POST","application/json;charset=UTF-8")}function a(r){return e("/app/inquiryOrder/cancel",r,"POST","application/json;charset=UTF-8")}function d(r){return e("/app/inquiryOrder/getMyInquiryOrderList",r,"GET")}function o(r){return e("/app/inquiryOrder/getMyInquiryOrderById",r,"GET")}function c(r){return e("/app/inquiryOrder/getMyInquiryOrderPingList",r,"GET")}function O(r){return e("/app/inquiryOrder/getInquiryOrderById",r,"GET")}function q(r){return e("/app/inquiryOrder/getCompanyUserInquiryOrderById",r,"GET")}function s(r){return e("/app/inquiryOrder/pingOrder",r,"POST","application/json;charset=UTF-8")}function I(r){return e("/app/inquiryOrder/getInquiryTemp",r,"GET")}function g(r){return e("/app/inquiryOrder/getInquiryOrderReport",r,"GET")}function T(r){return e("/app/inquiryOrder/getCompanyUserInquiryOrderList",r,"GET")}exports.cancel=a;exports.compute=p;exports.confirm=i;exports.create=t;exports.getCompanyUserInquiryOrderById=q;exports.getCompanyUserInquiryOrderList=T;exports.getInquiryOrderById=O;exports.getInquiryOrderReport=g;exports.getInquiryTemp=I;exports.getMyInquiryOrderById=o;exports.getMyInquiryOrderList=d;exports.getMyInquiryOrderPingList=c;exports.pay=u;exports.payment=y;exports.pingOrder=s;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/integral.js

@@ -0,0 +1 @@
+"use strict";var r=require("../common/request.js");let t=new r.Request().http;function n(e){return t("/app/integral/getIntegralGoodsList",e,"GET")}function g(e){return t("/app/integral/getIntegralGoodsById",e,"GET")}function a(e){return t("/app/integral/getUserIntegralLogsList",e,"GET")}function i(e){return t("/app/integral/getIntegralOrderList",e,"GET")}function s(e){return t("/app/integral/getIntegralOrderById",e,"GET")}function o(e){return t("/app/integral/createOrder",e,"POST","application/json;charset=UTF-8")}function l(){return t("/app/integral/getUserSign",null,"GET")}function d(e){return t("/app/integral/sign",e,"POST","application/json;charset=UTF-8")}exports.createOrder=o;exports.doSign=d;exports.getIntegralGoodsById=g;exports.getIntegralGoodsList=n;exports.getIntegralOrderById=s;exports.getIntegralOrderList=i;exports.getUserIntegralLogsList=a;exports.getUserSign=l;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/package.js

@@ -0,0 +1 @@
+"use strict";var t=require("../common/request.js");let a=new t.Request().http;function g(e){return a("/app/package/getPackagCateList",e,"GET")}function c(e){return a("/app/package/getPackageList",e,"GET")}function r(e){return a("/app/package/getPackageById",e,"GET")}function k(e){return a("/app/package/getPackageDoctorList",e,"GET")}function n(e){return a("/app/packageOrder/getNewOrderByPackageId",e,"GET")}exports.getNewOrderByPackageId=n;exports.getPackagCateList=g;exports.getPackageById=r;exports.getPackageDoctorList=k;exports.getPackageList=c;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/packageOrder.js

@@ -0,0 +1 @@
+"use strict";var a=require("../common/request.js");let r=new a.Request().http;function t(e){return r("/app/packageOrder/create",e,"POST","application/json;charset=UTF-8")}function n(e){return r("/app/packageOrder/compute",e,"POST","application/json;charset=UTF-8")}function c(e){return r("/app/packageOrder/pay",e,"POST","application/json;charset=UTF-8")}function p(e){return r("/app/packageOrder/payment",e,"POST","application/json;charset=UTF-8")}function g(e){return r("/app/packageOrder/getPackageOrderById",e,"GET")}function o(e){return r("/app/packageOrder/getMyPackageOrderList",e,"GET")}function d(e){return r("/app/packageOrder/getCompanyUserPackageOrderList",e,"GET")}function O(e){return r("/app/packageOrder/getSharePackageOrderById",e,"GET")}function u(e){return r("/app/packageOrder/getCompanyUserPackageOrderById",e,"GET")}function i(e){return r("/app/packageOrder/cancel",e,"POST","application/json;charset=UTF-8")}function s(e){return r("/app/packageOrder/getOrderCount",e,"GET")}function k(e){return r("/app/pop",e,"POST","application/json;charset=UTF-8")}exports.cancelOrder=i;exports.compute=n;exports.create=t;exports.getCompanyUserPackageOrderById=u;exports.getCompanyUserPackageOrderList=d;exports.getMyPackageOrderList=o;exports.getOrderCount=s;exports.getPackageOrderById=g;exports.getSharePackageOrderById=O;exports.giftCreate=k;exports.pay=c;exports.payment=p;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/patient.js

@@ -0,0 +1 @@
+"use strict";var n=require("../common/request.js");let e=new n.Request().http;function i(){return e("/app/patient/getPatientList",null,"GET")}function a(t){return e("/app/patient/getPatientById",t,"GET")}function p(t){return e("/app/patient/delPatient",t,"POST","application/json;charset=UTF-8")}function r(t){return e("/app/patient/addPatient",t,"POST","application/json;charset=UTF-8")}function P(t){return e("/app/patient/editPatient",t,"POST","application/json;charset=UTF-8")}exports.addPatient=r;exports.delPatient=p;exports.editPatient=P;exports.getPatientById=a;exports.getPatientList=i;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/prescribe.js

@@ -0,0 +1 @@
+"use strict";var t=require("../common/request.js");let r=new t.Request().http;function s(e){return r("/app/prescribe/getPrescribeList",e,"GET")}function i(e){return r("/app/prescribe/getPrescribeById",e,"GET")}exports.getPrescribeById=i;exports.getPrescribeList=s;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/storeAfterSales.js

@@ -0,0 +1 @@
+"use strict";var r=require("../common/request.js");let t=new r.Request().http;function s(e){return t("/app/storeAfterSales/getStoreOrderItems",e,"GET")}function a(e){return t("/app/storeAfterSales/applyAfterSales",e,"POST","application/json;charset=UTF-8")}function o(e){return t("/app/storeAfterSales/getStoreAfterSalesList",e,"GET")}function n(e){return t("/app/storeAfterSales/getStoreAfterSalesById",e,"GET")}function S(e){return t("/app/storeAfterSales/revoke",e,"POST","application/json;charset=UTF-8")}function l(e){return t("/app/storeAfterSales/addDelivery",e,"POST","application/json;charset=UTF-8")}exports.addDelivery=l;exports.applyAfterSales=a;exports.getStoreAfterSalesById=n;exports.getStoreAfterSalesList=o;exports.getStoreOrderItems=s;exports.revoke=S;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/storeOrder.js

@@ -0,0 +1 @@
+"use strict";var t=require("../common/request.js");let e=new t.Request().http;function n(r){return e("/app/storeOrder/getMyStoreOrderList",r,"GET")}function o(r){return e("/app/storeOrder/getCompanyUserStoreOrderList",r,"GET")}function p(r){return e("/app/storeOrder/getMyStoreOrderById",r,"GET")}function s(r){return e("/app/storeOrder/getStoreOrderById",r,"GET")}function a(r){return e("/app/storeOrder/getCompanyUserStoreOrderById",r,"GET")}function d(r){return e("/app/storeOrder/pay",r,"POST","application/json;charset=UTF-8")}function O(r){return e("/app/storeOrder/payment",r,"POST","application/json;charset=UTF-8")}function i(r){return e("/app/storeOrder/compute",r,"POST","application/json;charset=UTF-8")}function c(r){return e("/app/storeOrder/cancelOrder",r,"POST","application/json;charset=UTF-8")}function u(r){return e("/app/storeOrder/finishOrder",r,"POST","application/json;charset=UTF-8")}function y(r){return e("/app/storeOrder/getExpress",r,"POST","application/json;charset=UTF-8")}exports.cancelOrder=c;exports.compute=i;exports.finishOrder=u;exports.getCompanyUserStoreOrderById=a;exports.getCompanyUserStoreOrderList=o;exports.getExpress=y;exports.getMyStoreOrderById=p;exports.getMyStoreOrderList=n;exports.getStoreOrderById=s;exports.pay=d;exports.payment=O;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/test.js

@@ -0,0 +1 @@
+"use strict";var s=require("../common/request.js");let e=new s.Request().http;function r(t){return e("/app/test/getTestList",t,"GET")}function p(t){return e("/app/test/getTestDetails",t,"GET")}function T(t){return e("/app/test/getTestTempDetails",t,"GET")}function o(t){return e("/app/test/getTestReport",t,"GET")}function n(t){return e("/app/test/getTestReportImg",t,"GET")}function i(t){return e("/app/test/doReport",t,"POST","application/json;charset=UTF-8")}exports.doReport=i;exports.getTestDetails=p;exports.getTestList=r;exports.getTestReport=o;exports.getTestReportImg=n;exports.getTestTempDetails=T;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/user.js

@@ -0,0 +1 @@
+"use strict";var n=require("../common/request.js");let t=new n.Request().http;function o(e){return t("/app/wx/login",e,"POST","application/json;charset=UTF-8")}function r(){return t("/app/user/getUserInfo",null,"GET")}function u(){return t("/app/user/checkLogin",null,"GET")}function p(e){return t("/app/user/editUser",e,"POST","application/json;charset=UTF-8")}function s(e){return t("/app/user/registerDoctor",e,"POST","application/json;charset=UTF-8")}function i(e){return t("/app/user/getMyCouponList",e,"GET")}function c(e){return t("/app/user/getMyEnableCouponList",e,"GET")}function a(e){return t("/app/user/getAppContactWay/"+e,null,"GET")}exports.checkLogin=u;exports.editUser=p;exports.getAppContactWay=a;exports.getMyCouponList=i;exports.getMyEnableCouponList=c;exports.getUserInfo=r;exports.registerDoctor=s;exports.wxLogin=o;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/userAddress.js

@@ -0,0 +1 @@
+"use strict";var d=require("../common/request.js");let e=new d.Request().http;function r(){return e("/app/userAddress/getAddressByDefault",null,"GET")}function t(){return e("/app/userAddress/getAddressList",null,"GET")}function n(s){return e("/app/userAddress/getAddressById",s,"GET")}function u(s){return e("/app/userAddress/delAddress",s,"POST","application/json;charset=UTF-8")}function a(s){return e("/app/userAddress/addAddress",s,"POST","application/json;charset=UTF-8")}function A(s){return e("/app/userAddress/editAddress",s,"POST","application/json;charset=UTF-8")}function p(s){return e("/app/userAddress/parseAddress",s,"POST","application/json;charset=UTF-8")}exports.addAddress=a;exports.delAddress=u;exports.editAddress=A;exports.getAddressByDefault=r;exports.getAddressById=n;exports.getAddressList=t;exports.parseAddress=p;

+ 1 - 0
unpackage/dist/dev/mp-weixin/api/userVipOrder.js

@@ -0,0 +1 @@
+"use strict";var r=require("../common/request.js");let t=new r.Request().http;function n(e){return t("/app/userVip/weChatPayment",e,"POST","application/json;charset=UTF-8")}function p(e){return t("/app/userVip/getVipOrderById",e,"GET")}exports.getVipOrderById=p;exports.payment=n;

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
unpackage/dist/dev/mp-weixin/app.js


+ 209 - 0
unpackage/dist/dev/mp-weixin/app.json

@@ -0,0 +1,209 @@
+{
+  "pages": [
+    "pages/common/launch",
+    "pages/auth/login",
+    "pages/index/index",
+    "pages/index/h5",
+    "pages/index/content",
+    "pages/doctor/index",
+    "pages/store/index",
+    "pages/user/index",
+    "pages/TUIKit/TUIPages/TUIConversation/index",
+    "pages/TUIKit/TUIPages/TUIConversation/create",
+    "pages/TUIKit/TUIPages/TUIChat/index",
+    "pages/TUIKit/TUIPages/TUIChat/components/message-elements/video-play"
+  ],
+  "subPackages": [
+    {
+      "root": "pages_index",
+      "pages": [
+        "testList",
+        "testDetails",
+        "test",
+        "testResult",
+        "testResultImg",
+        "articleList",
+        "articleDetails",
+        "diseaseList",
+        "diseaseDetails",
+        "hospitalList",
+        "hospitalDetails",
+        "search",
+        "famousPrescribeList",
+        "famousPrescribeDetails",
+        "vesselList",
+        "vesselDetails",
+        "chineseMedicineList",
+        "chineseMedicineDetails",
+        "medicatedFoodList",
+        "medicatedFoodDetails",
+        "questionsList",
+        "questionsDetails",
+        "packageList",
+        "packageDetails",
+        "packageForm"
+      ]
+    },
+    {
+      "root": "pages_doctor",
+      "pages": [
+        "doctorArticleList",
+        "doctorArticleDetails",
+        "doctorList",
+        "doctorDetails",
+        "doctorPingList",
+        "doctorInfo",
+        "doctorImgs"
+      ]
+    },
+    {
+      "root": "pages_order",
+      "pages": [
+        "inquiryOrderList",
+        "inquiryOrderDetails",
+        "inquiryOrderPingList",
+        "inquirySelect",
+        "inquirySelectType",
+        "inquiryForm1",
+        "inquiryForm2_1",
+        "inquiryForm2_2",
+        "inquiryForm3",
+        "inquiryPay",
+        "inquiryPayment",
+        "tzPay",
+        "tzWeixinPay",
+        "inquiryOrderPaySuccess",
+        "storeOrderPaySuccess",
+        "courseOrderPayment",
+        "courseOrderPaySuccess",
+        "userVipOrderPayment",
+        "userVipOrderOrderPaySuccess",
+        "pingOrder",
+        "prescribeList",
+        "prescribeDetails",
+        "storeOrderList",
+        "storeOrderDetail",
+        "storeOrderPay",
+        "storeOrderPayment",
+        "inquiryOrderReport",
+        "packageOrderDetails",
+        "packageOrderList",
+        "packageOrderPay",
+        "packageOrderPaySuccess",
+        "storeOrderDelivery",
+        "storeOrderRefundApply",
+        "storeOrderRefundSubmit",
+        "storeOrderRefundList",
+        "storeOrderRefundDetails",
+        "storeOrderRefundAddDelivery",
+        "packageOtherPayment",
+        "packagePayment"
+      ]
+    },
+    {
+      "root": "pages_user",
+      "pages": [
+        "registerDoctor",
+        "about",
+        "address",
+        "addEditAddress",
+        "personInfo",
+        "agreement",
+        "myDoctorList",
+        "patient",
+        "addEditPatient",
+        "myCouponList",
+        "cert",
+        "followList",
+        "followDetails",
+        "drugReportList",
+        "drugReportPing",
+        "drugReportDetails",
+        "doFollow",
+        "integralGoodsList",
+        "integralGoodsDetails",
+        "integralOrderList",
+        "integralOrderDetails",
+        "integralLogsList",
+        "integralOrderPay",
+        "integralOrderPaySuccess",
+        "integral",
+        "price",
+        "healthRecords/index",
+        "healthRecords/add",
+        "healthRecords/edit",
+        "tongue/index",
+        "tongue/report",
+        "tongue/photoPreview",
+        "tongue/tongueList",
+        "addHealthButler",
+        "bindCompanyUser",
+        "downApp"
+      ]
+    },
+    {
+      "root": "pages_company",
+      "pages": [
+        "login",
+        "index",
+        "packageList",
+        "packageDetails",
+        "packageOrderList",
+        "packageOrderDetails",
+        "couponList",
+        "couponDetails",
+        "inquiryOrderList",
+        "inquiryOrderDetails",
+        "storeOrderList",
+        "storeOrderDetail",
+        "storeOrderDelivery",
+        "bindInfo"
+      ]
+    },
+    {
+      "root": "pages_course",
+      "pages": [
+        "video"
+      ]
+    }
+  ],
+  "window": {
+    "navigationBarTextStyle": "white",
+    "navigationBarTitleText": "彩虹惠医互联网医院",
+    "navigationBarBackgroundColor": "#C39A58",
+    "backgroundColor": "#ffffff"
+  },
+  "tabBar": {
+    "color": "#7e7e7e",
+    "selectedColor": "#C39A58",
+    "borderStyle": "white",
+    "backgroundColor": "#ffffff",
+    "list": [
+      {
+        "pagePath": "pages/index/index",
+        "iconPath": "/static/images/home.png",
+        "selectedIconPath": "/static/images/home_select.png",
+        "text": "首页"
+      },
+      {
+        "pagePath": "pages/TUIKit/TUIPages/TUIConversation/index",
+        "iconPath": "/static/images/inquiry.png",
+        "selectedIconPath": "/static/images/inquiry_select.png",
+        "text": "问诊"
+      },
+      {
+        "pagePath": "pages/store/index",
+        "iconPath": "/static/images/store.png",
+        "selectedIconPath": "/static/images/store_select.png",
+        "text": "疗法"
+      },
+      {
+        "pagePath": "pages/user/index",
+        "iconPath": "/static/images/my.png",
+        "selectedIconPath": "/static/images/my_select.png",
+        "text": "我的"
+      }
+    ]
+  },
+  "usingComponents": {}
+}

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
unpackage/dist/dev/mp-weixin/app.wxss


+ 1 - 0
unpackage/dist/dev/mp-weixin/common/assets.js

@@ -0,0 +1 @@
+"use strict";var s="/pages/TUIKit/assets/icon/singlePerson.svg",i="/pages/TUIKit/assets/icon/multiPerson.svg",t="/pages/TUIKit/assets/icon/selected.svg",_="/pages/TUIKit/assets/icon/mute.svg",o="/pages/TUIKit/assets/icon/revoked.svg",a="/pages/TUIKit/assets/icon/delete.svg",r="/pages/TUIKit/assets/icon/forword.svg",p="/pages/TUIKit/assets/icon/play_normal@2x.png",e="/pages/TUIKit/assets/icon/audio-play.svg",m="/pages/TUIKit/assets/icon/audio.svg",g="/pages/TUIKit/assets/icon/emoji.svg",v="/pages/TUIKit/assets/icon/more.svg",n="/pages/TUIKit/assets/icon/take-photo.svg",c="/pages/TUIKit/assets/icon/send-img.svg",$="/pages/TUIKit/assets/icon/take-video.svg",I="/pages/TUIKit/assets/icon/audio-calling.svg",K="/pages/TUIKit/assets/icon/inquiry.svg";exports._imports_0=s;exports._imports_0$1=t;exports._imports_0$2=_;exports._imports_0$3=o;exports._imports_0$4=p;exports._imports_0$5=e;exports._imports_0$6=m;exports._imports_1=i;exports._imports_1$1=a;exports._imports_1$2=g;exports._imports_2=r;exports._imports_2$1=v;exports._imports_3=n;exports._imports_4=c;exports._imports_5=$;exports._imports_6=I;exports._imports_7=K;

+ 1 - 0
unpackage/dist/dev/mp-weixin/common/request.js

@@ -0,0 +1 @@
+"use strict";var t=require("./vendor.js");class f{http(p,g={},l,r,i){var n=t.index.getStorageSync("requestPath");let a="";return i!=null?(n=i,a=t.index.getStorageSync("AppTokenmini_RTCourse")):(t.index.setStorageSync("requestPath",n),a=t.index.getStorageSync("AppToken")),new Promise((d,h)=>{let c=t.index.getStorageSync("CompanyUserToken");var s="application/x-www-form-urlencoded";r!=null&&(s=r),t.index.request({header:{"Content-Type":s,AppToken:a,CompanyUserToken:c},url:`${n}${p}`,data:g,method:l,success:e=>{if(e.data.code==401){let u=getCurrentPages(),o=u[u.length-1];if(console.log(o),o!=null&&o.route=="pages/auth/login"){d(e.data);return}t.index.navigateTo({url:"/pages/auth/login",success:()=>{},fail:()=>{}});return}e.data.token&&t.index.setStorageSync("AppToken",e.data.token),d(e.data)},fail:e=>{},complete:e=>{if(e.data.code==401)return!1}})})}}exports.Request=f;

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
unpackage/dist/dev/mp-weixin/common/vendor.js


+ 1 - 0
unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/Layout.js

@@ -0,0 +1 @@
+"use strict";var e=require("../../../common/vendor.js"),i=require("../../../api/healthTongue.js");require("../../../common/request.js");const s={data(){return{baseUrl:e.index.getStorageSync("requestPath"),cameraHeight:"",optionsHeight:"",counts:0,url:null}},onLoad(){this.getCount()},methods:{switchCamera(){this.$emit("switchCamera")},getCount(){i.getCount().then(t=>{t.code==200?this.counts=t.data:e.index.showToast({icon:"none",title:"\u8BF7\u6C42\u5931\u8D25"})},t=>{})},takePhoto(){const t=wx.createCameraContext();console.log("ctx",t),t.takePhoto({quality:"high",success:n=>{e.index.setStorageSync("tongueUrl",n.tempImagePath),console.log("res",n.tempImagePath),this.$emit("takePhoto")}})},handleClikFn(t){this.$emit("instruct",t)}},mounted(){e.index.createSelectorQuery().in(this).select("#camera-footer").boundingClientRect(n=>{this.cameraHeight=e.index.getSystemInfoSync().screenHeight-n.height}).exec()}};function c(t,n,u,m,o,a){return{a:o.cameraHeight+"px",b:e.t(o.counts||0),c:o.baseUrl+"/images/album_icon.png",d:e.o(r=>a.handleClikFn("album")),e:e.o(r=>a.takePhoto()),f:o.baseUrl+"/images/tongue_info.png",g:e.o(r=>a.handleClikFn("reportlist")),h:e.o(r=>a.switchCamera())}}var h=e._export_sfc(s,[["render",c],["__scopeId","data-v-0404ee55"],["__file","E:/Project/2023/\u95EE\u8BCA\u5E73\u53F0/his_user_miniapp/components/CustomCamera/WeChat/Layout.vue"]]);wx.createComponent(h);

+ 4 - 0
unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/Layout.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/Layout.wxml

@@ -0,0 +1 @@
+<view class="custom-camera data-v-0404ee55"><view class="camera-wrap data-v-0404ee55" style="{{'height:' + a}}"><slot></slot></view><view class="camera-footer data-v-0404ee55" id="camera-footer"><view class="usenum data-v-0404ee55">当前可免费试用<text class="data-v-0404ee55" style="color:#F54D04;margin:0 6rpx">{{b}}</text>次</view><view class="camera-options data-v-0404ee55"><view class="camera-options-left camera-item data-v-0404ee55"><image class="data-v-0404ee55" src="{{c}}" mode="scaleToFill" style="width:65rpx;height:60rpx" bindtap="{{d}}"></image><text class="data-v-0404ee55">相册上传</text></view><view class="camera-options-center camera-item data-v-0404ee55" bindtap="{{e}}"><view class="photograph-btn data-v-0404ee55"></view></view><view class="camera-options-ritht camera-item data-v-0404ee55" bindtap="{{h}}"><image class="data-v-0404ee55" src="{{f}}" mode="scaleToFill" style="width:67rpx;height:60rpx" bindtap="{{g}}"></image><text class="data-v-0404ee55">切换摄像头</text></view></view></view></view>

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/Layout.wxss

@@ -0,0 +1 @@
+.custom-camera.data-v-0404ee55{height:100vh;background-color:#000}.custom-camera .usenum.data-v-0404ee55{font-family:SourceHanSansCN;font-weight:400;font-size:24rpx;color:#fff;padding:14rpx;text-align:center}.custom-camera .camera-options.data-v-0404ee55{width:100%;padding-top:13rpx;padding-bottom:60rpx;box-sizing:border-box;font-family:SourceHanSansCN;font-weight:400;font-size:27rpx;color:#fff;display:flex;align-items:center;justify-content:space-evenly}.custom-camera .camera-options .camera-item.data-v-0404ee55{display:flex;flex-direction:column;align-items:center}.custom-camera .camera-options .camera-item image.data-v-0404ee55{margin-bottom:21rpx}.custom-camera .camera-options .camera-options-center.data-v-0404ee55{width:131rpx;height:131rpx;border-radius:50%;border:3px solid #FFFFFF;display:flex;align-items:center;justify-content:center}.custom-camera .camera-options .photograph-btn.data-v-0404ee55{width:109rpx;height:109rpx;background:#F54D04;border-radius:50%}

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/index.js

@@ -0,0 +1 @@
+"use strict";var e=require("../../../common/vendor.js");const c=()=>"./Layout.js",r={components:{Layout:c},data(){return{baseUrl:e.index.getStorageSync("requestPath"),statusBarHeight:e.index.getSystemInfoSync().statusBarHeight+"px",device:"back",cameraContext:null,shutterShow:!1,coverImage:null,menuLeft:"100%"}},mounted(){e.index.getSystemInfo({success:t=>{const s=e.index.getMenuButtonBoundingClientRect();this.menuLeft=s.left+"px"},fail:t=>{console.log(t)}}),this.cameraContext=e.index.createCameraContext()},methods:{switchCamera(){this.device=this.device==="back"?"front":"back"},back(){e.index.navigateBack()},error(t){console.log(t)},takePhoto(){this.$emit("takePhoto")},handleInstruct(t){switch(t){case"back":this.$emit("back");break;case"shutter":this.cameraContext.takePhoto({quality:"high",success:s=>{this.$emit("getImage",s.tempImagePath)}});break;case"reversal":this.device=this.device==="back"?"front":"back";break;case"album":e.index.chooseImage({count:1,sizeType:["original","compressed"],sourceType:["album"],success:s=>{e.index.setStorageSync("tongueUrl",s.tempFilePaths[0]),this.$emit("getImage")}});break}}}};Array||e.resolveComponent("Layout")();function i(t,s,u,h,n,a){return{a:n.statusBarHeight,b:e.o((...o)=>a.back&&a.back(...o)),c:n.baseUrl+"/images/ques.png",d:n.menuLeft,e:n.baseUrl+"/images/tongue.png",f:n.device,g:e.o((...o)=>a.error&&a.error(...o)),h:e.o(a.handleInstruct),i:e.o(o=>a.switchCamera()),j:e.o(a.takePhoto)}}var m=e._export_sfc(r,[["render",i],["__scopeId","data-v-4814c2d2"],["__file","E:/Project/2023/\u95EE\u8BCA\u5E73\u53F0/his_user_miniapp/components/CustomCamera/WeChat/index.vue"]]);wx.createComponent(m);

+ 6 - 0
unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "layout": "./Layout"
+  }
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/index.wxml

@@ -0,0 +1 @@
+<layout class="data-v-4814c2d2" u-s="{{['d']}}" bindinstruct="{{h}}" bindswitchCamera="{{i}}" bindtakePhoto="{{j}}" u-i="4814c2d2-0" bind:__l="__l"><camera class="camera data-v-4814c2d2" mode="normal" device-position="{{f}}" binderror="{{g}}" style="width:100%;height:100%"><cover-view class="cover-view data-v-4814c2d2"><cover-view class="uni-nav-bar data-v-4814c2d2"><cover-view class="data-v-4814c2d2" style="{{'height:' + a + ';' + ('width:' + '100%')}}"></cover-view><cover-view class="uni-nav-barbox data-v-4814c2d2" style="{{'width:' + d}}"><cover-view class="uni-nav-back data-v-4814c2d2" bindtap="{{b}}">返回 </cover-view><cover-view class="uni-nav-title data-v-4814c2d2"><cover-view class="data-v-4814c2d2">使用教程</cover-view><cover-image class="ques data-v-4814c2d2" src="{{c}}" mode="aspectFill"></cover-image></cover-view></cover-view></cover-view><cover-view class="title data-v-4814c2d2">请拍摄舌面</cover-view><cover-view class="tips data-v-4814c2d2">舌尖放松,舌面平展,舌尖略向下,口张大不要太用力</cover-view><cover-view class="imagebox data-v-4814c2d2"><cover-image class="tongue data-v-4814c2d2" src="{{e}}" mode="aspectFill"></cover-image></cover-view></cover-view></camera></layout>

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/CustomCamera/WeChat/index.wxss

@@ -0,0 +1 @@
+.imagebox.data-v-4814c2d2{width:100%;margin-top:30rpx;display:flex;flex-direction:column;align-items:center;justify-content:center}.tongue.data-v-4814c2d2{width:531rpx;height:592rpx;margin:0 auto;margin-top:30rpx}.cover-view.data-v-4814c2d2{width:100%;position:absolute;z-index:99;top:0;left:0}.title.data-v-4814c2d2{margin-top:calc(var(--status-bar-height) + 130rpx);font-family:SourceHanSansCN-Medium;font-weight:500;font-size:43rpx;color:#fff;text-align:center}.tips.data-v-4814c2d2{margin-top:38rpx;font-family:SourceHanSansSC-Regular;font-weight:400;font-size:24rpx;color:#fff;text-align:center}.uni-nav-bar.data-v-4814c2d2{position:fixed;top:0;left:0;width:100%;z-index:999;overflow:hidden;font-family:PingFang SC,PingFang SC;font-weight:500;color:#fff}.uni-nav-bar .uni-nav-barbox.data-v-4814c2d2{width:100%;height:88rpx;padding:0 24rpx;box-sizing:border-box;display:flex;flex-direction:row;align-items:center;justify-content:space-between;position:relative;font-size:32rpx}.uni-nav-bar .uni-nav-title.data-v-4814c2d2{flex-shrink:0;font-family:SourceHanSansSC;font-weight:400;color:#fff;font-size:32rpx;display:flex;flex-direction:row;align-items:center;justify-content:flex-start}.uni-nav-bar .uni-nav-title .ques.data-v-4814c2d2{flex-shrink:0;width:33rpx;height:33rpx;margin-left:9rpx}.uni-nav-bar .uni-nav-back.data-v-4814c2d2{width:100%;height:88rpx;line-height:88rpx}.camera.data-v-4814c2d2{position:relative}

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/Loading.js

@@ -0,0 +1 @@
+"use strict";var e=require("../common/vendor.js");const o={name:"Loading",props:{loaded:Boolean,loading:Boolean}};function a(i,c,n,t,l,_){return e.e({a:n.loading||!n.loaded},n.loading||!n.loaded?e.e({b:n.loading},n.loading?{}:{},{c:!n.loading},n.loading?{}:{}):{})}var d=e._export_sfc(o,[["render",a],["__file","E:/Project/2023/\u95EE\u8BCA\u5E73\u53F0/his_user_miniapp/components/Loading.vue"]]);wx.createComponent(d);

+ 4 - 0
unpackage/dist/dev/mp-weixin/components/Loading.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/Loading.wxml

@@ -0,0 +1 @@
+<view wx:if="{{a}}" class="Loads acea-row row-center-wrapper" style="margin-top:20rpx"><block wx:if="{{b}}"><view class="iconfont icon-jiazai loading acea-row row-center-wrapper"></view> 正在加载中 </block><block wx:if="{{c}}"> 上拉加载更多 </block></view>

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/Loading.wxss

@@ -0,0 +1 @@
+.Loads{height:80rpx;font-size:25rpx;color:#000}.Loads .iconfont{font-size:30rpx;margin-right:10rpx;height:32rpx;line-height:32rpx}@keyframes load{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.loadingpic{animation:load 3s linear 1s infinite}.loading{animation:load linear 1s infinite}

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/Menu.js

@@ -0,0 +1 @@
+"use strict";var e=require("../common/vendor.js");const d={components:{},data(){return{cateId:0,menuCurrent:0}},props:{list:{type:Array,default:[]},menu:{default:4},imgW:{type:Number,default:88}},computed:{carousel(){if(this.list)return this.sortData(this.list,this.menu*2)}},created(){},methods:{sortData(a,l){let t=[],n=[];return a.forEach(c=>{n.length===l&&(n=[]),n.length===0&&t.push(n),n.push(c)}),t},onSwiper(a){this.menuCurrent=a.detail.current},routerTo(a){this.cateId=a.cateId,this.$emit("menuClick",a)}}};function m(a,l,t,n,c,r){return e.e({a:r.carousel},r.carousel?e.e({b:e.f(r.carousel,(h,i,s)=>({a:e.f(h,(u,g,f)=>({a:u.imgUrl,b:e.t(u.cateName),c:e.n(c.cateId==u.cateId?"tab-title active":"tab-title"),d:u.cateId,e:e.o(_=>r.routerTo(u),u.cateId)})),b:i})),c:t.imgW+"rpx",d:t.imgW+"rpx",e:e.s(t.list.length<=t.menu?"height:200rpx":"height:340rpx"),f:e.s(t.list.length<=t.menu?"height:160rpx":"height:320rpx"),g:e.o((...h)=>r.onSwiper&&r.onSwiper(...h)),h:r.carousel.length>1},r.carousel.length>1?{i:e.f(r.carousel.length,(h,i,s)=>({a:e.n(c.menuCurrent===i?"dot-active":"dot"),b:i}))}:{},{j:e.s(t.list.length<=t.menu?"height:160rpx":"height:320rpx")}):{})}var o=e._export_sfc(d,[["render",m],["__file","E:/Project/2023/\u95EE\u8BCA\u5E73\u53F0/his_user_miniapp/components/Menu.vue"]]);wx.createComponent(o);

+ 4 - 0
unpackage/dist/dev/mp-weixin/components/Menu.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/Menu.wxml

@@ -0,0 +1 @@
+<view wx:if="{{a}}" class="menu-list-box" style="{{j}}"><swiper class="menu-swiper-box" style="{{f}}" bindchange="{{g}}" circular autoplay="{{false}}" interval="{{3000}}" duration="{{1000}}"><swiper-item wx:for="{{b}}" wx:for-item="itemList" wx:key="b" class="menu-swiper-item" style="{{e}}"><view class="menu-tab-box"><view wx:for="{{itemList.a}}" wx:for-item="item" wx:key="d" class="tab-list" bindtap="{{item.e}}"><image class="tab-img" style="{{'width:' + c + ';' + ('height:' + d)}}" src="{{item.a}}"></image><text class="{{item.c}}">{{item.b}}</text></view></view></swiper-item></swiper><view wx:if="{{h}}" class="menu-dots"><text wx:for="{{i}}" wx:for-item="dot" wx:key="b" class="{{dot.a}}"></text></view></view>

+ 1 - 0
unpackage/dist/dev/mp-weixin/components/Menu.wxss

@@ -0,0 +1 @@
+.menu-list-box{padding:0rpx;background:#fff;box-sizing:border-box}.menu-list-box,.menu-swiper-box{position:relative;background:#fff}.menu-list-box .menu-swiper-item,.menu-swiper-box .menu-swiper-item{background:#fff;height:100%;width:100%}.menu-list-box .menu-tab-box,.menu-swiper-box .menu-tab-box{display:flex;flex-wrap:wrap}.menu-list-box .menu-tab-box .tab-list,.menu-swiper-box .menu-tab-box .tab-list{width:25%;display:flex;flex-direction:column;align-items:center;font-size:22rpx;font-family:PingFang SC;font-weight:500;color:#333;padding-bottom:30rpx}.menu-list-box .menu-tab-box .tab-list .tab-img,.menu-swiper-box .menu-tab-box .tab-list .tab-img{border-radius:25rpx;margin-bottom:10rpx}.menu-list-box .menu-tab-box .tab-list .tab-title,.menu-swiper-box .menu-tab-box .tab-list .tab-title{font-size:24rpx;font-family:PingFang SC;font-weight:500;color:#111;margin-top:10rpx}.menu-list-box .menu-tab-box .tab-list .active,.menu-swiper-box .menu-tab-box .tab-list .active{color:#e2c99e}.menu-list-box .menu-dots,.menu-swiper-box .menu-dots{display:flex;position:absolute;left:50%;transform:translate(-50%)}.menu-list-box .menu-dots .dot,.menu-swiper-box .menu-dots .dot{width:40rpx;height:3rpx;background:#eeeeee;margin-right:10rpx}.menu-list-box .menu-dots .dot-active,.menu-swiper-box .menu-dots .dot-active{width:40rpx;height:3rpx;background:#2BC7B9;margin-right:10rpx}

+ 13 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/@tencentcloud/call-uikit-wechat/index.js

@@ -0,0 +1,13 @@
+module.exports = (function() {
+var __MODS__ = {};
+var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; };
+var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; };
+var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } };
+var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; };
+__DEFINE__(1747041225497, function(require, module, exports) {
+
+}, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); })
+return __REQUIRE__(1747041225497);
+})()
+//miniprogram-npm-outsideDeps=[]
+//# sourceMappingURL=index.js.map

+ 1 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/@tencentcloud/call-uikit-wechat/index.js.map

@@ -0,0 +1 @@
+{"version":3,"sources":["index.js"],"names":[],"mappings":";;;;;;;AAAA","file":"index.js","sourcesContent":[""]}

Файловите разлики са ограничени, защото са твърде много
+ 7 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/tim-wx-sdk/index.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/tim-wx-sdk/index.js.map


Файловите разлики са ограничени, защото са твърде много
+ 7 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/trtc-wx-sdk/index.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/trtc-wx-sdk/index.js.map


Файловите разлики са ограничени, защото са твърде много
+ 7 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/tsignaling-wx/index.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/tsignaling-wx/index.js.map


Файловите разлики са ограничени, защото са твърде много
+ 7 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/tuicall-engine-wx/index.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
unpackage/dist/dev/mp-weixin/miniprogram_npm/tuicall-engine-wx/index.js.map


+ 50 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/README.md

@@ -0,0 +1,50 @@
+# TUICallkit 组件接入说明
+TUICallkit 是小程序音视频通话 UI 组件,通过编写几行代码,就可以为您的小程序应用添加音视频通话功能。
+
+## 环境准备
+
+- 微信 App iOS 最低版本要求:7.0.9
+- 微信 App Android 最低版本要求:7.0.8
+- 小程序基础库最低版本要求:2.10.0
+- 由于小程序测试号不具备 live-pusher 和 live-player 的使用权限,请使用企业小程序账号申请相关权限进行开发
+- 由于微信开发者工具不支持原生组件(即 live-pusher 和 live-player 标签),需要在真机上进行运行体验
+
+## 特性
+- ⚡️ 功能全面 —— 支持单人/多人/音频/视频通话、支持视频转音频通话、支持自由选择通话设备
+- 🎨 灵活样式 —— 组件开源,可复用逻辑,自定义 UI 样式
+- 🛠 优秀生态 —— 与 [TUIKit](https://cloud.tencent.com/document/product/269/79737) 协同使用,可以在 [TIM](https://cloud.tencent.com/document/product/269) 会话中直接发起音视频通话
+- 🌍 跨平台 —— 支持 Android、iOS、Web、小程序、Flutter、UniApp 等 [多个开发平台](https://cloud.tencent.com/document/product/647/78742)
+- ☁️ 低延迟 —— 腾讯云全球链路资源储备,保证国际链路端到端平均时延 < 300ms
+- 🤙🏻 低卡顿 —— 抗丢包率超过 80%、抗网络抖动超过 1000ms,弱网环境仍顺畅稳定
+- 🌈 高品质 —— 支持 720P、1080P 高清画质,70% 丢包率仍可正常视频
+
+
+## 目录结构
+
+```
+TUICallkit
+├─ component             // UI 组件
+    ├─ calling           // 呼叫中 UI 组件(1v1通话)
+    └─ connected         // 通话中 UI 组件(1v1通话)
+    ├─ groupCalling      // 呼叫中 UI 组件(群组通话)
+    └─ groupConnected    // 通话中 UI 组件(群组通话)
+├─ pages                 
+    ├─ globalCall        // 全局监听页面
+├─ serve                 
+    ├─ callManager       // 全局监听类
+├─ static                // UI icon 图片
+```
+
+
+## 使用指引
+为方便您的使用,本组件配套多篇使用指引:
+- 如果您想要了解 TUICallKit,请阅读 [组件介绍 TUICallKit](https://cloud.tencent.com/document/product/647/78742)。
+- 如果您想把我们的功能直接嵌入到您的项目中,请阅读 [快速接入 TUICallKit](https://cloud.tencent.com/document/product/647/78733)。
+- 如果您想要了解详细 API,请阅读 [API 概览](https://cloud.tencent.com/document/product/647/78759)。
+
+## 附录
+
+- 如果你遇到了困难,可以先参阅 [常见问题](https://cloud.tencent.com/document/product/647/78733)。
+- 如果发现了示例代码的 bug,欢迎提交 issue。
+- 欢迎加入 QQ 群:**646165204**,进行技术交流和反馈~
+- 

+ 927 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/TUICallKit.js

@@ -0,0 +1,927 @@
+import TUICallEngine, { EVENT, MEDIA_TYPE, AUDIO_PLAYBACK_DEVICE, STATUS } from 'tuicall-engine-wx';
+import { BellContext } from './serve/bellContext';
+import { throttle, isTabBarPage, tabBarConfig } from './utils/commom';
+import { THROTTLE_TIME } from './utils/constants';
+// 组件旨在跨终端维护一个通话状态管理机,以事件发布机制驱动上层进行管理,并通过API调用进行状态变更。
+// 组件设计思路将UI和状态管理分离。您可以通过修改`component`文件夹下的文件,适配您的业务场景,
+// 在UI展示上,您可以通过属性的方式,将上层的用户头像,名称等数据传入组件内部,`static`下的icon和默认头像图片,
+// 只是为了展示基础的效果,您需要根据业务场景进行修改。
+
+export const PREFIX = 'TUICallKit';
+const version = '1.4.4';
+let INVITER_BELL_FILEPATH = 'TUICallKit/TUICallKit/static/phone_dialing.mp3';
+let INVITEE_BELL_FILEPATH = 'TUICallKit/TUICallKit/static/phone_ringing.mp3';
+// 记录组件是否初始化完成
+let tuiCallInitReady = false;
+// 是否需要隐藏 tabBar 页面
+let shouldHideTabBar = false;
+Component({
+  properties: {
+    config: {
+      type: Object,
+      value: {
+        sdkAppID: 0,
+        userID: '',
+        userSig: '',
+        type: 1,
+        tim: null,
+      },
+    },
+    backgroundMute: {
+      type: Boolean,
+      value: false,
+    },
+  },
+  data: {
+    callStatus: STATUS.IDLE,   // idle、calling、connection
+    isSponsor: false,          // 呼叫者身份 true为呼叫者 false为被叫者
+    pusher: {},                // TRTC 本地流
+    playerList: [],            // TRTC 远端流
+    playerProcess: {},         // 经过处理的的远端流(多人通话)
+    isGroup: false,            // 是否为多人通话
+    remoteUsers: [],           // 未排序的通话列表
+    allUsers: [],              // 排序后的通话列表
+    sponsor: '',               // 主叫方
+    screen: 'pusher',          // 视屏通话中,显示大屏幕的流(只限1v1聊天
+    soundMode: AUDIO_PLAYBACK_DEVICE.SPEAKER,  // 声音模式 听筒/扬声器
+    showToatTime: 0,           // 弹窗时长
+    ownUserId: '',
+    callingBell: null,
+    bellFilePath: '',          // 被叫方铃声地址
+  },
+  methods: {
+    initialUI() {
+      // 收起键盘
+      wx.hideKeyboard();
+      // 隐藏 tabBar
+      if (shouldHideTabBar) {
+        wx.hideTabBar();
+      }
+    },
+    // 新的邀请回调事件
+    async handleNewInvitationReceived(event) {
+      this.initialUI();
+      this.checkRunPlatform();
+      this.data.config.type = event.data.inviteData.callType;
+      this.data.callingBell.setBellSrc(this.data.bellFilePath || INVITEE_BELL_FILEPATH);
+      this.data.callingBell.play();
+      // 判断是否为多人通话
+      if (event.data.isFromGroup) {
+        this.setData({
+          isGroup: true,
+          sponsor: event.data.sponsor,
+        });
+        // 将主叫方和被叫列表合并在一起 组成全部通话人数
+        const newList = [...event.data.inviteeList, event.data.sponsor];
+        // 获取用户信息
+        await this.getUserProfile(newList);
+      } else {
+        await this.getUserProfile([event.data.sponsor]);
+      }
+      this.setData({
+        config: this.data.config,
+        callStatus: STATUS.CALLING,
+        isSponsor: false,
+      });
+    },
+    // 用户接听
+    handleUserAccept(event) {
+      // 主叫方则唤起通话页面
+      if (this.isSponsor()) {
+        this.data.callingBell && this.data.callingBell.stop();
+        this.setData({
+          callStatus: STATUS.CONNECTED,
+        });
+      }
+    },
+    // 远端用户进入通话
+    handleUserEnter(res) {
+      const newList = this.data.allUsers;
+      // 多人通话
+      if (this.data.isGroup) {
+        // 改变远端用户信息中的isEnter属性
+        for (let i = 0;i < newList.length;i++) {
+          if (newList[i].userID === res.data.userID) {
+            newList[i].isEnter = true;
+          }
+        }
+      }
+      this.setData({
+        playerList: res.playerList,
+        allUsers: newList,
+      });
+    },
+    // 远端用户离开通话
+    handleUserLeave(res) {
+      // 多人通话
+      if (this.data.isGroup) {
+        wx.showToast({
+          title: `${this.getUserNickName(res.data.userID)}离开通话`,
+        });
+        this.deleteUsers(this.data.allUsers, res.data.userID);
+      }
+      this.setData({
+        playerList: res.data.playerList,
+      });
+    },
+    // 用户数据更新
+    handleUserUpdate(res) {
+      this.handleNetStatus(res.data);
+      const newplayer = {};
+      const newres = res.data.playerList;
+      // 多人通话
+      if (this.data.isGroup) {
+        // 处理远端流
+        for (let i = 0;i < newres.length;i++) {
+          const  { userID } = newres[i];
+          newplayer[userID] = newres[i];
+        }
+      };
+      this.setData({
+        pusher: res.data.pusher,
+        playerList: res.data.playerList,
+        playerProcess: newplayer,
+      });
+    },
+    // 判断网络状态
+    handleNetStatus(data) {
+      if (data.pusher.netQualityLevel > 4) {
+        wx.showToast({
+          icon: 'none',
+          title: '您当前网络不佳',
+        });
+      }
+      data.playerList.map((item) => {
+        if (item.netStatus.netQualityLevel > 4) {
+          const name = data.playerList.length > 1 ? item.nick : '对方';
+          wx.showToast({
+            icon: 'none',
+            title: `${name}当前网络不佳`,
+          });
+        }
+        return item;
+      });
+    },
+    // 用户拒绝
+    handleInviteeReject(event) {
+      if (this.data.isGroup) {
+        this.deleteUsers(this.data.allUsers, event.data.invitee);
+      } else {
+        this.data.callingBell && this.data.callingBell.stop();
+      }
+      wx.showToast({
+        title: `${this.getUserNickName(event.data.invitee)}已拒绝`,
+      });
+    },
+    // 用户不在线
+    handleNoResponse(event) {
+      if (this.data.isGroup) {
+        this.deleteUsers(this.data.allUsers, event.data.timeoutUserList);
+      } else {
+        this.data.callingBell && this.data.callingBell.stop();
+      }
+      wx.showToast({
+        icon: 'none',
+        title: `${event.data.timeoutUserList}无应答`,
+      });
+    },
+    // 获取用户昵称
+    getUserNickName(userId) {
+      const { remoteUsers } = this.data;
+      const userObj = remoteUsers.find(item => item.userID === userId);
+      return userObj.nick ? userObj.nick : userObj.userID;
+    },
+    // 用户忙线
+    handleLineBusy(event) {
+      if (this.data.isGroup) {
+        this.deleteUsers(this.data.allUsers, event.data.invitee);
+      } else {
+        this.data.callingBell && this.data.callingBell.stop();
+      }
+      this.showToast(this.getUserNickName(event.data.invitee));
+    },
+    showToast(event) {
+      this.setData({
+        showToatTime: this.data.showToatTime + THROTTLE_TIME,
+      });
+      setTimeout(() => {
+        wx.showToast({
+          title: `${event}忙线中`,
+        });
+      }, this.data.showToatTime);
+    },
+    // 用户取消
+    handleCallingCancel(event) {
+      this.data.callingBell && this.data.callingBell.stop();
+      if (event.data.invitee !== this.data.config.userID) {
+        wx.showToast({
+          title: `${this.getUserNickName(event.data.invitee)}取消通话`,
+        });
+      }
+      this.reset();
+    },
+    // 通话超时未应答
+    handleCallingTimeout(event) {
+      if (this.data.isGroup) {
+        // 若是自身未应答 则不弹窗
+        if (this.data.config.userID === event.data.timeoutUserList[0]) {
+          this.reset();
+          return;
+        }
+        const newList = this.deleteUsers(this.data.allUsers, event.data.timeoutUserList);
+        this.setData({
+          allUsers: newList,
+        });
+      } else {
+        this.data.callingBell && this.data.callingBell.stop();
+      }
+      if (this.data.playerList.length === 0) {
+        this.reset();
+      }
+      wx.showToast({
+        title: `${event.data.timeoutUserList[0]}超时无应答`,
+      });
+    },
+    handleCallingUser(userIDList) {
+      const remoteUsers = [...this.data.remoteUsers];
+      const userProfile = remoteUsers.filter(item => userIDList.some(userItem => `${userItem}` === item.userID));
+      this.setData({
+        remoteUsers: remoteUsers.filter(item => userIDList.some(userItem => userItem !== item.userID)),
+      });
+      let nick = '';
+      for (let i = 0; i < userProfile.length; i++) {
+        nick += `${userProfile[i].nick}、`;
+      }
+      return nick.slice(0, -1);
+    },
+    // 通话结束
+    handleCallingEnd(event) {
+      wx.showToast({
+        title: '通话结束',
+        duration: 800,
+      });
+      this.reset();
+    },
+    // SDK Ready 回调
+    handleSDKReady() {
+      // 呼叫需在sdk ready之后
+    },
+    // 被踢下线
+    handleKickedOut() {
+      wx.showToast({
+        title: '您已被踢下线',
+      });
+    },
+    // 切换通话模式
+    handleCallMode(event) {
+      this.data.config.type = event.data.type;
+      this.setSoundMode(AUDIO_PLAYBACK_DEVICE.EAR);
+      this.setData({
+        config: this.data.config,
+      });
+    },
+    handleError(event) {
+      const { code, message } = event.data || {};
+      console.warn(`${PREFIX} errorCode: ${code}, errorMessage: ${message}`);
+    },
+    // 删除用户列表操作
+    deleteUsers(usersList, userID) {
+      // 若userID不是数组,则将其转换为数组
+      if (!Array.isArray(userID)) {
+        userID = [userID];
+      }
+      const list = usersList.filter(item => !userID.includes(item.userID));
+      this.setData({
+        allUsers: list,
+      });
+    },
+    // 增加用户列表操作
+    addUsers(usersList, userID) {
+      // 若userID不是数组,则将其转换为数组
+      if (!Array.isArray(userID)) {
+        userID = [userID];
+      }
+      const newList = [...usersList, ...userID];
+      return newList;
+    },
+    // 增加 tsignaling 事件监听
+    _addTSignalingEvent() {
+      wx.$TUICallEngine.on(EVENT.ERROR, this.handleError, this);
+      // 被邀请通话
+      wx.$TUICallEngine.on(EVENT.INVITED, this.handleNewInvitationReceived, this);
+      // 用户接听
+      wx.$TUICallEngine.on(EVENT.USER_ACCEPT, this.handleUserAccept, this);
+      // 用户进入通话
+      wx.$TUICallEngine.on(EVENT.USER_ENTER, this.handleUserEnter, this);
+      // 用户离开通话
+      wx.$TUICallEngine.on(EVENT.USER_LEAVE, this.handleUserLeave, this);
+      // 用户更新数据
+      wx.$TUICallEngine.on(EVENT.USER_UPDATE, this.handleUserUpdate, this);
+      // 用户拒绝通话
+      wx.$TUICallEngine.on(EVENT.REJECT, this.handleInviteeReject, this);
+      // 用户无响应
+      wx.$TUICallEngine.on(EVENT.NO_RESP, this.handleNoResponse, this);
+      // 用户忙线
+      wx.$TUICallEngine.on(EVENT.LINE_BUSY, this.handleLineBusy, this);
+      // 通话被取消
+      wx.$TUICallEngine.on(EVENT.CALLING_CANCEL, this.handleCallingCancel, this);
+      // 通话超时未应答
+      wx.$TUICallEngine.on(EVENT.CALLING_TIMEOUT, this.handleCallingTimeout, this);
+      // 通话结束
+      wx.$TUICallEngine.on(EVENT.CALL_END, this.handleCallingEnd, this);
+      // SDK Ready 回调
+      wx.$TUICallEngine.on(EVENT.SDK_READY, this.handleSDKReady, this);
+      // 被踢下线
+      wx.$TUICallEngine.on(EVENT.KICKED_OUT, this.handleKickedOut, this);
+      // 切换通话模式
+      wx.$TUICallEngine.on(EVENT.CALL_MODE, this.handleCallMode, this);
+      // 自己发送消息
+      wx.$TUICallEngine.on(EVENT.MESSAGE_SENT_BY_ME, this.messageSentByMe, this);
+    },
+    // 取消 tsignaling 事件监听
+    _removeTSignalingEvent() {
+      wx.$TUICallEngine.off(EVENT.ERROR, this.handleError);
+      // 被邀请通话
+      wx.$TUICallEngine.off(EVENT.INVITED, this.handleNewInvitationReceived);
+      // 用户接听
+      wx.$TUICallEngine.off(EVENT.USER_ACCEPT, this.handleUserAccept);
+      // 用户进入通话
+      wx.$TUICallEngine.off(EVENT.USER_ENTER, this.handleUserEnter);
+      // 用户离开通话
+      wx.$TUICallEngine.off(EVENT.USER_LEAVE, this.handleUserLeave);
+      // 用户更新数据
+      wx.$TUICallEngine.off(EVENT.USER_UPDATE, this.handleUserUpdate);
+      // 用户拒绝通话
+      wx.$TUICallEngine.off(EVENT.REJECT, this.handleInviteeReject);
+      // 用户无响应
+      wx.$TUICallEngine.off(EVENT.NO_RESP, this.handleNoResponse);
+      // 用户忙线
+      wx.$TUICallEngine.off(EVENT.LINE_BUSY, this.handleLineBusy);
+      // 通话被取消
+      wx.$TUICallEngine.off(EVENT.CALLING_CANCEL, this.handleCallingCancel);
+      // 通话超时未应答
+      wx.$TUICallEngine.off(EVENT.CALLING_TIMEOUT, this.handleCallingTimeout);
+      // 通话结束
+      wx.$TUICallEngine.off(EVENT.CALL_END, this.handleCallingEnd);
+      // SDK Ready 回调
+      wx.$TUICallEngine.off(EVENT.SDK_READY, this.handleSDKReady);
+      // 被踢下线
+      wx.$TUICallEngine.off(EVENT.KICKED_OUT, this.handleKickedOut);
+      // 切换通话模式
+      wx.$TUICallEngine.off(EVENT.CALL_MODE, this.handleCallMode);
+      // 自己发送消息
+      wx.$TUICallEngine.off(EVENT.MESSAGE_SENT_BY_ME, this.messageSentByMe);
+    },
+    /**
+     * C2C邀请通话,被邀请方会收到的回调
+     * 如果当前处于通话中,可以调用该函数以邀请第三方进入通话
+     * @param {Object} params 呼叫参数
+     * @param {String} params.userID 被邀请方
+     * @param {Number} params.type 0-未知,1-语音通话,2-视频通话
+     * @param {Number} params.roomID 数字房间号, 范围 1~2147483647
+     * @param {String=} params.userData 扩展字段: 用于在邀请信令中增加扩展信息
+     */
+    call: throttle(async function (params) {
+      this.initialUI();
+      if (this.data.callStatus !== STATUS.IDLE) {
+        return;
+      }
+      this.checkRunPlatform();
+      this.data.config.type = params.type;
+      // 检查设备权限
+      const deviceMap = {
+        microphone: true,
+        camera: params.type === MEDIA_TYPE.VIDEO,
+      };
+      const hasDevicePermission = await wx.$TUICallEngine.deviceCheck(deviceMap);
+      const callStatus = hasDevicePermission ? STATUS.CALLING : STATUS.IDLE;
+      this.setData({
+        callStatus,
+        isSponsor: true,
+        config: this.data.config,
+      });
+      try {
+        await this.getUserProfile([params.userID]);
+      } catch (error) {
+        console.warn(error);
+      }
+      wx.$TUICallEngine.call({ userID: params.userID, type: params.type, roomID: params.roomID, userData: params.userData }).then(async (res) => {
+        if (res) {
+          this.setData({
+            callStatus: STATUS.CALLING,
+            pusher: res.pusher,
+          });
+          this.data.callingBell.setBellSrc(INVITER_BELL_FILEPATH);
+          this.data.callingBell.play();
+          this.setSoundMode(this.data.config.type === MEDIA_TYPE.AUDIO ? AUDIO_PLAYBACK_DEVICE.EAR : AUDIO_PLAYBACK_DEVICE.SPEAKER);
+        }
+      })
+        .catch((error) => {
+          if (error.code === -1002) {
+            wx.showModal({
+              icon: 'none',
+              title: 'error',
+              content: error.message,
+              showCancel: false,
+            });
+          }
+          this.reset();
+          throw new Error(error);
+        });
+    }, THROTTLE_TIME),
+    /**
+     * IM群组邀请通话,被邀请方会收到的回调
+     * 如果当前处于通话中,可以继续调用该函数继续邀请他人进入通话,同时正在通话的用户会收到的回调
+     *
+     * @param {Object} params 呼叫参数
+     * @param {Array<String>} params.userIDList 邀请列表
+     * @param {Number} params.type 1-语音通话,2-视频通话
+     * @param {String} params.groupID IM群组ID
+     * @param {Number} params.roomID 数字房间号, 范围 1~2147483647
+     * @param {String=} params.userData 扩展字段: 用于在邀请信令中增加扩展信息
+     */
+    groupCall: throttle(async function (params) {
+      // 判断是否存在groupID
+      if (!params.groupID) {
+        wx.showToast({
+          title: '群ID为空',
+        });
+        return;
+      }
+      this.initialUI();
+      if (this.data.callStatus !== STATUS.IDLE) {
+        return;
+      }
+      this.checkRunPlatform();
+      this.data.config.type = params.type;
+      // 检查设备权限
+      const deviceMap = {
+        microphone: true,
+        camera: params.type === MEDIA_TYPE.VIDEO,
+      };
+      const hasDevicePermission = await wx.$TUICallEngine.deviceCheck(deviceMap);
+      const callStatus = hasDevicePermission ? STATUS.CALLING : STATUS.IDLE;
+      this.setData({
+        callStatus,
+        isSponsor: true,
+        isGroup: true,
+        sponsor: this.data.config.userID,
+        config: this.data.config,
+      });
+      // 将自身的userID插入到邀请列表中,组成完整的用户信息
+      const list = JSON.parse(JSON.stringify(params.userIDList));
+      list.unshift(this.data.config.userID);
+      // 获取用户信息
+      try {
+        await this.getUserProfile(list);
+      } catch (error) {
+        console.warn(error);
+      }
+      wx.$TUICallEngine.groupCall({
+        userIDList: params.userIDList,
+        type: params.type,
+        groupID: params.groupID,
+        roomID: params.roomID,
+        userData: params.userData,
+      }).then(async (res) => {
+        if (res) {
+          this.data.config.type = params.type;
+          this.setData({
+            pusher: res.pusher,
+            callStatus: STATUS.CALLING,
+          });
+          this.data.callingBell.setBellSrc(INVITER_BELL_FILEPATH);
+          this.data.callingBell.play();
+        }
+      })
+        .catch((error) => {
+          if (error.code === -1002) {
+            wx.showModal({
+              icon: 'none',
+              title: 'error',
+              content: error.message,
+              showCancel: false,
+            });
+          }
+          this.reset();
+          throw new Error(error);
+        });
+    }, THROTTLE_TIME),
+    /**
+     * 当您作为被邀请方收到 {@link TRTCCallingDelegate#onInvited } 的回调时,可以调用该函数接听来电
+     */
+    accept: throttle(async function () {
+      wx.$TUICallEngine.accept().then((res) => {
+        if (res) {
+          this.data.callingBell && this.data.callingBell.stop();
+          this.setData({
+            pusher: res.pusher,
+            callStatus: STATUS.CONNECTED,
+          });
+          // 多人通话需要对自身位置进行修正,将其放到首位
+          if (this.data.isGroup) {
+            const newList = this.data.allUsers;
+            for (let i = 0;i < newList.length;i++) {
+              if (newList[i].userID === this.data.config.userID) {
+                newList[i].isEnter = true;
+                [newList[i], newList[0]] = [newList[0], newList[i]];
+              }
+            };
+            this.setData({
+              allUsers: newList,
+            });
+          }
+        }
+      })
+        .catch((error) => {
+          console.error(error);
+          this.reset();
+        });
+    }, THROTTLE_TIME),
+    /**
+     * 当您作为被邀请方收到的回调时,可以调用该函数拒绝来电
+     */
+    reject: throttle(async function () {
+      wx.$TUICallEngine.reject().then((res) => {
+        this.data.callingBell && this.data.callingBell.stop();
+        this.reset();
+      })
+        .catch((error) => {
+          console.error(error);
+          this.reset();
+        });
+    }, THROTTLE_TIME),
+    messageSentByMe(event) {
+      const message = event.data.data;
+      this.triggerEvent('sendMessage', {
+        message,
+      });
+    },
+    // xml层,是否开启扬声器
+    setSoundMode(type) {
+      this.setData({
+        soundMode: wx.$TUICallEngine.selectAudioPlaybackDevice(type),
+      });
+    },
+    // xml层,挂断
+    hangup: throttle(async function () {
+      try {
+        await wx.$TUICallEngine.hangup();
+        this.reset();
+      } catch (error) {
+        console.error(error);
+        this.reset();
+      }
+    }, THROTTLE_TIME),
+    //  切换大小屏 (仅支持1v1聊天)
+    toggleViewSize(event) {
+      this.setData({
+        // FIXME _toggleViewSize 不应该为TUICallEngine的方法 后续修改
+        screen: wx.$TUICallEngine._toggleViewSize(event),
+      });
+    },
+    // 数据重置
+    reset() {
+      if (shouldHideTabBar) {
+        wx.showTabBar();
+      }
+      this.setData({
+        callStatus: STATUS.IDLE,
+        isSponsor: false,
+        isGroup: false,
+        soundMode: AUDIO_PLAYBACK_DEVICE.SPEAKER,
+        pusher: {}, // TRTC 本地流
+        playerList: [], // TRTC 远端流
+        showToatTime: 0,
+      });
+    },
+    // 呼叫中的事件处理
+    async handleCallingEvent(data) {
+      const { name, event } = data.detail;
+      switch (name) {
+        case 'accept':
+          this.setSoundMode(this.data.config.type === MEDIA_TYPE.AUDIO ? AUDIO_PLAYBACK_DEVICE.EAR : AUDIO_PLAYBACK_DEVICE.SPEAKER);
+          this.accept();
+          break;
+        case 'hangup':
+          await this.hangup();
+          break;
+        case 'reject':
+          await this.reject();
+          break;
+        case 'toggleSwitchCamera':
+          wx.$TUICallEngine.switchCamera();
+          break;
+        case 'switchAudioCall':
+          wx.$TUICallEngine.switchCallMediaType(MEDIA_TYPE.AUDIO).then((res) => {
+            this.data.config.type = MEDIA_TYPE.AUDIO;
+            this.setSoundMode(AUDIO_PLAYBACK_DEVICE.EAR);
+            this.setData({
+              config: this.data.config,
+            });
+          });
+          break;
+        case 'pusherErrorHandler':
+          this.pusherErrorHandler(event.errMsg);
+          break;
+        default:
+          break;
+      }
+    },
+    // 通话中的事件处理
+    async handleConnectedEvent(data) {
+      const { name, event } = data.detail;
+      switch (name) {
+        case 'toggleViewSize':
+          this.toggleViewSize(event);
+          break;
+        case 'pusherNetStatus':
+          wx.$TUICallEngine._pusherNetStatus(event);
+          break;
+        case 'playNetStatus':
+          wx.$TUICallEngine._playNetStatus(event);
+          break;
+        case 'pusherStateChangeHandler':
+          wx.$TUICallEngine._pusherStateChangeHandler(event);
+          break;
+        case 'pusherAudioVolumeNotify':
+          wx.$TUICallEngine._pusherAudioVolumeNotify(event);
+          break;
+        case 'playerStateChange':
+          wx.$TUICallEngine._playerStateChange(event);
+          break;
+        case 'playerAudioVolumeNotify':
+          wx.$TUICallEngine._playerAudioVolumeNotify(event);
+          break;
+        case 'pusherAudioHandler':
+          wx.$TUICallEngine._pusherAudioHandler(event);
+          break;
+        case 'hangup':
+          await this.hangup();
+          break;
+        case 'toggleSoundMode':
+          this.setSoundMode(this.data.soundMode === AUDIO_PLAYBACK_DEVICE.EAR ? AUDIO_PLAYBACK_DEVICE.SPEAKER : AUDIO_PLAYBACK_DEVICE.EAR);
+          break;
+        case 'pusherVideoHandler':
+          wx.$TUICallEngine._pusherVideoHandler(event);
+          break;
+        case 'toggleSwitchCamera':
+          wx.$TUICallEngine.switchCamera(event);
+          break;
+        case 'switchAudioCall':
+          wx.$TUICallEngine.switchCallMediaType(MEDIA_TYPE.AUDIO).then((res) => {
+            this.data.config.type = MEDIA_TYPE.AUDIO;
+            this.setData({
+              config: this.data.config,
+            });
+            this.setSoundMode(AUDIO_PLAYBACK_DEVICE.EAR);
+          });
+          break;
+        case 'pusherErrorHandler':
+          this.pusherErrorHandler(event.errMsg);
+          break;
+        default:
+          break;
+      }
+    },
+    // 处理 pusher 中的异常问题
+    pusherErrorHandler(code) {
+      switch (code) {
+        case 'fail:access denied':
+          wx.showModal({
+            icon: 'none',
+            title: '权限提示',
+            content: '当前小程序 appid 不具备 <live-pusher> 和 <live-player> 的使用权限,您将无法正常使用实时通话能力,请使用企业小程序账号申请权限后再进行开发体验',
+            showCancel: false,
+          });
+          break;
+
+        default:
+          break;
+      }
+    },
+    // 设置用户的头像、昵称
+    setSelfInfo(nickName, avatar) {
+      return wx.$TUICallEngine.setSelfInfo(nickName, avatar);
+    },
+    // 获取用户资料
+    async getUserProfile(userList) {
+      const imResponse = await this.getTim().getUserProfile({ userIDList: userList });
+      // 修正用户资料
+      this.modifyUser(imResponse.data);
+    },
+    // 修正用户资料
+    modifyUser(userIDList) {
+      const { sponsor } = this.data;
+      if (this.data.isGroup) {
+        // 多人通话需要将呼叫者放到第一位 isEnter的作用是区分用户是否进入房间
+        for (let i = 0;i < userIDList.length;i++) {
+          // 主叫方的标志位设置成true
+          if (userIDList[i].userID === sponsor) {
+            userIDList[i].isEnter = true;
+            // 对主叫方位置进行修正 将其放到首位
+            [userIDList[i], userIDList[0]] = [userIDList[0], userIDList[i]];
+          } else {
+          // 其他用户默认未进入房间 设置为false
+            userIDList[i].isEnter = false;
+          }
+        }
+        this.setData({
+          allUsers: userIDList,
+        });
+      }
+      this.setData({
+        remoteUsers: userIDList,
+      });
+    },
+    // 获取 tim 实例
+    getTim() {
+      return wx.$TUICallEngine.getTim();
+    },
+
+    // 设置日志级别,低于 level 的日志将不会输出
+    setLogLevel(leave) {
+      wx.$TUICallEngine.setLogLevel(leave);
+    },
+
+    // 初始化TUICallKit
+    async init(params) {
+      if (tuiCallInitReady) return;
+      tuiCallInitReady = true;
+      // 关于 tabBar 页面的特化逻辑
+      this.handleTabBarLogic();
+      // 兼容从config和init中传值
+      const { sdkAppID, tim, userID, userSig, SDKAppID } = { ...this.data.config, ...params };
+      this.setData({
+        ownUserId: userID,
+        config: {
+          ...this.data.config,
+          sdkAppID: sdkAppID || SDKAppID,
+          userID,
+          userSig,
+        },
+      });
+      // 取消全局监听
+      if (wx.$globalCallSign) {
+        wx.$CallManagerInstance.removeEngineInvite();
+      }
+      this.setUniBellFilePath();
+      if (!this.data.callingBell) {  // 创建铃声实例
+        const bellContext = new BellContext();
+        this.setData({
+          callingBell: bellContext,
+        });
+      }
+      if (!wx.$TUICallEngine) {
+        wx.$TUICallEngine = TUICallEngine.createInstance({
+          tim,
+          sdkAppID: sdkAppID || SDKAppID,
+        });
+        /*
+        _addTSignalingEvent 需要在 init 之前,回调才能正常触发
+        tap:https://tapd.woa.com/20396022/prong/stories/view/1020396022885781069
+        */
+        this._addTSignalingEvent();
+        try {
+          await wx.$TUICallEngine.init({
+            userID,
+            userSig,
+          });
+        } catch (error) {
+          tuiCallInitReady = false;
+          throw new Error(error);
+        }
+        // 用于全局监听进入 TUICallKit 页面中绑定上当前页面的监听。
+      } else {
+        this._addTSignalingEvent();
+      }
+      console.log(`${PREFIX} init Ready!`);
+    },
+    // 销毁 TUICallEngine
+    async destroyed() {
+      if (!wx.$TUICallEngine || !tuiCallInitReady) return;
+      tuiCallInitReady = false;
+      this._removeTSignalingEvent();
+      // 全局监听模式下,离开页面需要重新绑定全局监听,但不卸载 TUICallEngine
+      if (wx.$globalCallSign) {
+        // 处理异常退出
+        if (this.getCallStatus() !== STATUS.IDLE) {
+          await this.handleExceptionExit();
+        }
+        wx.$CallManagerInstance.addEngineInvite();
+      } else {
+        // 非全局监听模式下,离开页面需要卸载 TUICallEngine
+        wx.$TUICallEngine.destroyInstance();
+        wx.$TUICallEngine = null;
+      }
+      if (this.data.callingBell) {
+        this.data.callingBell.destroyInstance();
+        this.setData({
+          callingBell: null,
+        });
+      }
+      this.reset();
+      console.log(`${PREFIX} destroyed OK!`);
+    },
+
+    /*
+      以下两种情况需要全部符合,则需要隐藏 tabBar
+      1.用户当前处于 tabBar 页面, isTabBar 为 true
+      2.用户没有使用了自定义 tabBar, isCustomTabBar 为 fales
+      */
+    handleTabBarLogic() {
+      const isTabBar = isTabBarPage();
+      const isCustomTabBar = tabBarConfig().custom || false;
+      shouldHideTabBar = isTabBar && !isCustomTabBar;
+    },
+
+    // 检测运行时环境
+    checkRunPlatform() {
+      const systemInfo = wx.getSystemInfoSync();
+      if (systemInfo.platform === 'devtools') {
+      // 当前运行在微信开发者工具里
+        wx.showModal({
+          icon: 'none',
+          title: '运行环境提醒',
+          content: '微信开发者工具不支持原生推拉流组件(即 <live-pusher> 和 <live-player> 标签),请使用真机调试或者扫码预览。',
+          showCancel: false,
+        });
+      }
+    },
+    // 运行在 uniapp 小程序需要修改铃声地址
+    setUniBellFilePath() {
+      // 防止用户退出再进入,在地址前重复拼接
+      if (INVITER_BELL_FILEPATH.indexOf('wxcomponents') !== -1) {
+        return;
+      }
+      // comType 用于 Vue2 的判断,wxcomponents 用于 Vue3 的判断
+      if (this.dataset.comType === 'wx' || this.is.indexOf('wxcomponents') !== -1) {
+        INVITER_BELL_FILEPATH = `wxcomponents/${INVITER_BELL_FILEPATH}`;
+        INVITEE_BELL_FILEPATH = `wxcomponents/${INVITEE_BELL_FILEPATH}`;
+      }
+    },
+    // 自定义铃声
+    setCallingBell(filePath) {
+      // 如需恢复默认铃声,filePath 传空即可
+      this.setData({
+        bellFilePath: filePath,
+      });
+    },
+    // 处理用户异常退出的情况,处理了右滑退出,以及返回退出的情况。
+    async handleExceptionExit() {
+      // 在呼叫状态下,被叫调用 reject,主叫调用 hangup
+      if (this.getCallStatus() === STATUS.CALLING) {
+        if (this.isSponsor()) {
+          await this.hangup();
+        } else {
+          await this.reject();
+        }
+      }
+      // 在通话状态下,统一调用 hangup 接口
+      if (this.getCallStatus() === STATUS.CONNECTED) {
+        await this.hangup();
+      }
+    },
+
+    getCallStatus() {
+      return this.data.callStatus;
+    },
+
+    isSponsor() {
+      return this.data.isSponsor;
+    },
+  },
+  /**
+   * 生命周期方法
+   */
+  lifetimes: {
+    created() {
+      this.reset();
+    },
+    attached() {
+
+    },
+    ready() {
+      console.log(`${PREFIX} SDK Version: ${version}`);
+    },
+    async detached() {
+      await this.destroyed();
+    },
+    error() {
+    },
+  },
+  pageLifetimes: {
+    async show() {
+      if (this.data.config.sdkAppID) {
+        await this.init(this.data.config);
+      }
+    },
+    async hide() {
+      if (this.getCallStatus() === STATUS.IDLE) {
+        await this.destroyed();
+      }
+    },
+    resize() {
+    },
+  },
+});

+ 11 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/TUICallKit.json

@@ -0,0 +1,11 @@
+{
+  "component": true,
+  "usingComponents": {
+    "TUI-Calling": "./component/calling/calling",
+    "TUI-Connected": "./component/connected/connected",
+    "TUI-groupCalling": "./component/groupCalling/groupCalling",
+    "TUI-groupConnected": "./component/groupConnected/groupConnected"
+  },
+  "navigationStyle": "custom",
+  "disableScroll": true
+}

+ 52 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/TUICallKit.wxml

@@ -0,0 +1,52 @@
+<view class="TUICalling {{callStatus === 'idle' ? 'hidden': 'show'}}">
+  <view class="TRTCCaling-container {{isGroup && config.type === 2 ?'groupConnected':''}}">
+    <TUI-Calling
+      wx:if="{{callStatus === 'calling' && !isGroup}}"
+      isSponsor="{{isSponsor}}"
+      pusher="{{pusher}}"
+      isGroup="{{isGroup}}"
+      callType="{{config.type}}"
+      remoteUsers="{{remoteUsers}}"
+      bind:callingEvent="handleCallingEvent"
+    ></TUI-Calling>
+
+    <TUI-groupCalling
+      wx:if="{{callStatus === 'calling' && isGroup}}"
+      isSponsor="{{isSponsor}}"
+      pusher="{{pusher}}"
+      isGroup="{{isGroup}}"
+      callType="{{config.type}}"
+      allUsers="{{allUsers}}"
+      ownUserId="{{ownUserId}}"
+      bind:callingEvent="handleCallingEvent"
+    ></TUI-groupCalling>
+
+
+    <TUI-Connected
+      wx:if="{{callStatus === 'connected' && !isGroup}}"
+      playerList="{{playerList}}"
+      isGroup="{{isGroup}}"
+      userList="{{userList}}"
+      pusher="{{pusher}}"
+      callType="{{config.type}}"
+      soundMode="{{soundMode}}"
+      screen="{{screen}}"
+      bind:connectedEvent="handleConnectedEvent"
+    ></TUI-Connected>
+
+    <TUI-groupConnected
+      wx:if="{{callStatus === 'connected'  && isGroup}}"
+      allUsers="{{allUsers}}"
+      playerList="{{playerList}}"
+      userList="{{userList}}"
+      isGroup="{{isGroup}}"
+      pusher="{{pusher}}"
+      callType="{{config.type}}"
+      soundMode="{{soundMode}}"
+      screen="{{screen}}"
+      ownUserId="{{ownUserId}}"
+      playerProcess="{{ playerProcess}}"
+      bind:connectedEvent="handleConnectedEvent"
+    ></TUI-groupConnected>
+  </view>
+</view>

+ 25 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/TUICallKit.wxss

@@ -0,0 +1,25 @@
+.TRTCCaling-container {
+	width: 100vw;
+	height: 100vh;
+	overflow: hidden;
+	/* background-image: url(https://mc.qcloudimg.com/static/img/7da57e0050d308e2e1b1e31afbc42929/bg.png); */
+	margin: 0;
+}
+.hidden {
+	display: none;
+}
+.TUICalling {
+	position: fixed;
+	width: 100vw;
+	height: 100vh;
+	z-index: 10;
+	background: #ffffff;
+}
+.show {
+	top: 0;
+	left: 0;
+}
+
+.groupConnected{
+	background-color: #2c292923;
+}

+ 108 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/calling/calling.js

@@ -0,0 +1,108 @@
+// components/tui-calling/TUICalling/component/calling.js
+Component({
+  /**
+   * 组件的属性列表
+   */
+  properties: {
+    isSponsor: {
+      type: Boolean,
+      value: false,
+    },
+    pusher: {
+      type: Object,
+    },
+    callType: {
+      type: Number,
+    },
+    remoteUsers: {
+      type: Array,
+    },
+    isGroup: {
+      type: Boolean,
+    },
+  },
+  /**
+   * 组件的初始数据
+   */
+  data: {
+
+  },
+
+  /**
+   * 生命周期方法
+   */
+  lifetimes: {
+    created() {
+
+    },
+    attached() {
+    },
+    ready() {
+    },
+    detached() {
+    },
+    error() {
+    },
+  },
+
+  /**
+   * 组件的方法列表
+   */
+  methods: {
+    accept(event) {
+      const data = {
+        name: 'accept',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    hangup(event) {
+      const data = {
+        name: 'hangup',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    reject(event) {
+      const data = {
+        name: 'reject',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    handleErrorImage(e) {
+      const { id } = e.target;
+      const remoteUsers = this.data.remoteUsers.map((item) => {
+        if (item.userID === id) {
+          item.avatar = '../../static/default_avatar.png';
+        }
+        return item;
+      });
+      this.setData({
+        remoteUsers,
+      });
+    },
+    toggleSwitchCamera(event) {
+      const data = {
+        name: 'toggleSwitchCamera',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    switchAudioCall(event) {
+      const data = {
+        name: 'switchAudioCall',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    pusherErrorHandler(event) {
+      const { detail = '' } = event;
+      const data = {
+        name: 'pusherErrorHandler',
+        event: detail,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+  },
+});

+ 4 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/calling/calling.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 106 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/calling/calling.wxml

@@ -0,0 +1,106 @@
+<view class="invite-call transition-animation" wx:if="{{callType === 2}}">
+    <!-- wx:if="{{pusher.frontCamera}}" 为了处理下滑动画卡顿的问题 -->
+    <live-pusher class="local-video" wx:if="{{pusher.frontCamera}}" device-position="{{pusher.frontCamera}}" binderror="pusherErrorHandler"/>
+    <view class="invite-calling">
+        <view class="invite-calling-header" wx:if="{{remoteUsers.length === 1}}">
+            <!-- <view class="invite-calling-header-left">
+                <image src="../../static/swtich-camera.png" data-device="{{pusher.frontCamera}}"
+                    catch:tap="toggleSwitchCamera" />
+            </view> -->
+            <view class="invite-calling-header-right">
+                <view class="invite-calling-header-message">
+                    <label class="tips">{{remoteUsers[0].nick || remoteUsers[0].userID}}</label>
+                    <text class="tips-subtitle" wx:if="{{!isSponsor}}">邀请你视频通话</text>
+                    <text class="tips-subtitle" wx:else>等待对方接受</text>
+                </view>
+                <image class="avatar" src="{{remoteUsers[0].avatar || '../../static/default_avatar.png'}}"
+                    id="{{remoteUsers[0].userID}}" binderror="handleErrorImage" />
+            </view>
+        </view>
+        <view class="invite-calling-header invite-calling-list" wx:else>
+            <view class="invite-calling-item" wx:for="{{remoteUsers}}" wx:key="userID">
+                <image class="avatar" src="{{item.avatar || '../../static/default_avatar.png'}}" id="{{item.userID}}"
+                    binderror="handleErrorImage" />
+                <view class="invite-calling-item-message">
+                    <label class="tips">{{item.nick || item.userID}}</label>
+                    <text class="tips-subtitle" wx:if="{{!isSponsor}}">邀请你视频通话</text>
+                    <text class="tips-subtitle" wx:else>等待对方接受</text>
+                </view>
+            </view>
+        </view>
+        <view class="footer">
+            <view class="btn-operate" wx:if="{{isSponsor}}">
+                <view class="btn-operate-item call-switch" catch:tap="switchAudioCall">
+                    <view class="call-operate">
+                        <image src="../../static/trans.png" />
+                    </view>
+                    <text>切到语音通话</text>
+                </view>
+            </view>
+            <view class="btn-operate" wx:if="{{isSponsor}}">
+                <view class="btn-operate-item">
+                    <view class="btn-container">
+                        <view class="call-operate" catch:tap="hangup">
+                            <image src="../../static/hangup.png" />
+                        </view>
+                        <view class="invite-calling-header-left">
+                            <image src="../../static/switch_camera.png" data-device="{{pusher.frontCamera}}"
+                                catch:tap="toggleSwitchCamera" />
+                        </view>
+                    </view>
+                    <text>挂断</text>
+                </view>
+
+            </view>
+            <view class="btn-operate" wx:if="{{!isSponsor}}">
+                <view class="btn-operate-item">
+                    <view class="call-operate" style="background-color: red" catch:tap="reject">
+                        <image src="../../static/hangup.png" />
+                    </view>
+                    <text>挂断</text>
+                </view>
+                <view class="btn-operate-item">
+                    <view class="call-operate" catch:tap="accept">
+                        <image src="../../static/dialing.png" />
+                    </view>
+                    <text>接听</text>
+                </view>
+            </view>
+        </view>
+    </view>
+</view>
+
+
+<view class="incoming-call audio-call transition-animation" wx:if="{{callType === 1}}">
+    <view class="invite-calling-single">
+        <image class="avatar" src="{{remoteUsers[0].avatar || '../../static/default_avatar.png'}}"
+            id="{{remoteUsers[0].userID}}" binderror="handleErrorImage" />
+        <view class="tips">{{remoteUsers[0].nick || remoteUsers[0].userID}}</view>
+        <view wx:if="{{isSponsor && callType === 1}}" class="tips-subtitle">{{'等待对方接受'}}</view>
+    </view>
+   
+    <view class="footer">
+        <view wx:if="{{!isSponsor && callType === 1}}" class="btn-operate">
+            <view class="button-container">
+                <view class="call-operate" style="background-color: red" catch:tap="reject">
+                    <image src="../../static/hangup.png" />
+                </view>
+                <view style="margin-top:10px">挂断</view>
+            </view>
+            <view class="button-container">
+                <view class="call-operate" catch:tap="accept">
+                    <image src="../../static/dialing.png"/>
+                </view>
+                <view style="margin-top:10px">接听</view>
+            </view>
+        </view>
+        <view wx:if="{{isSponsor && callType === 1}}" class="btn-operate">
+            <view class="button-container">
+                <view class="call-operate" style="background-color: red" catch:tap="hangup">
+                    <image src="../../static/hangup.png" />
+                </view>
+                <view style="margin-top:10px">挂断</view>
+            </view>
+        </view>
+    </view>
+</view>

+ 258 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/calling/calling.wxss

@@ -0,0 +1,258 @@
+.footer {
+	position: absolute;
+	bottom: 5vh;
+	width: 100%;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+}
+.button-container {
+	display: flex;
+	flex-direction: column;
+	text-align: center;
+}
+
+.btn-operate {
+	display: flex;
+	justify-content: space-between;
+	/* flex-direction: column;
+    text-align: center; */
+
+}
+.btn-operate-item{
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	margin-bottom: 20px;
+}
+.btn-operate-item text {
+	font-size: 14px;
+	color: #f0e9e9;
+	padding: 5px;
+	letter-spacing: 0;
+	font-weight: 400;
+}
+
+.call-switch text{
+	padding: 5px;
+	color: #f0e9e9;
+	font-size: 14px;
+}
+
+.call-operate {
+	width: 8vh;
+	height: 8vh;
+	border-radius: 8vh;
+	margin: 0 15vw;
+	box-sizing: border-box;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+.call-switch .call-operate {
+	width: 4vh;
+	height: 3vh;
+}
+
+.call-operate image {
+	width: 100%;
+	height: 100%;
+	background: none;
+}
+
+.tips {
+	font-size: 20px;
+	color: #FFFFFF;
+	letter-spacing: 0;
+	margin: 0 auto;
+	/* text-shadow: 0 1px 2px rgba(0,0,0,0.40); */
+	font-weight: 600;
+	max-width: 150px;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+.tips-subtitle {
+	font-family: PingFangSC-Regular;
+	font-size: 14px;
+	color: #FFFFFF;
+	letter-spacing: 0;
+	text-align: right;
+	/* text-shadow: 0 1px 2px rgba(0,0,0,0.30); */
+	font-weight: 400;
+}
+
+.invite-call {
+	/* background: #ffffff; */
+	position: absolute;
+	top: 0;
+	z-index: 100;
+	width: 100vw;
+	height: 100vh;
+	background-color: black;
+}
+
+.transition-animation {
+	transform: translateY(-100%);
+	animation: slideInDown 0.5s ease forwards;
+}
+
+@keyframes slideInDown {
+	from {
+	  transform: translateY(-100%);
+	}
+	to {
+	  transform: translateY(0);
+	}
+}
+
+.invite-call .local-video {
+	width: 100vw;
+	height: 100vh;
+}
+.invite-call .invite-calling {
+	position: absolute;
+	top: 0;
+	z-index: 101;
+	width: 100vw;
+	height: 100vh;
+}
+.invite-calling-header {
+	margin-top:107px;
+	display: flex;
+	justify-content: flex-end;
+	padding: 0 16px;
+
+}
+.btn-container {
+	display: flex;
+	align-items: center;
+	position: relative;
+}
+.invite-calling-header-left {
+	position: absolute;
+	right: 0;
+}
+.invite-calling-header-left image {
+	width: 32px;
+	height: 32px;
+}
+.invite-calling-header-right {
+	display: flex;
+	align-items: center;
+}
+.invite-calling-header-message {
+	display: flex;
+	flex-direction: column;
+	padding: 0 16px;
+}
+.invite-calling-header-right image {
+	width: 100px;
+	height: 100px;
+	border-radius: 12px;
+}
+.invite-calling .footer {
+	position: absolute;
+	bottom: 5vh;
+	width: 100%;
+}
+.invite-calling .btn-operate{
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+
+
+.hidden {
+	display: none;
+}
+
+.trtc-calling {
+	width: 100vw;
+	height: 100vh;
+	overflow: hidden;
+	margin: 0;
+	z-index: 99;
+}
+
+.audio-call {
+	width: 100vw;
+	height: 100vh;
+	position: absolute;
+	top: 0;
+	z-index: 100;
+	background: #FFFFFF;
+}
+.audio-call > .btn-operate{
+	display: flex;
+	justify-content: center;
+}
+
+.audio-call > image {
+	width: 40vw;
+	height: 40vw;
+	display: block;
+	margin: 20vw 30vw;
+	margin-top: 40vw;
+}
+
+.invite-calling-single > image {
+	width: 120px;
+	height: 120px;
+	border-radius: 12px;
+	display: block;
+	margin: 140px auto 15px;
+	/* margin: 20vw 30vw; */
+}
+
+.invite-calling-single .tips {
+	width: 100%;
+	height: 40px;
+	line-height: 40px;
+	text-align: center;
+	font-size: 20px;
+	color: #333333;
+	letter-spacing: 0;
+	font-weight: 500;
+}
+.invite-calling-single .tips-subtitle {
+	height: 20px;
+	font-family: PingFangSC-Regular;
+	font-size: 14px;
+	color: #97989C;
+	letter-spacing: 0;
+	font-weight: 400;
+	text-align: center;
+}
+
+.invite-calling-list {
+	justify-content: flex-start;
+}
+
+.invite-calling-item {
+	position: relative;
+	margin: 0 12px;
+}
+.invite-calling-item image {
+	width: 100px;
+	height: 100px;
+	border-radius: 12px;
+}
+.invite-calling-item-message {
+	position: absolute;
+	background: rgba(0, 0, 0, 0.5);
+	width: 100px;
+	height: 100px;
+	top: 0;
+	left: 0;
+	z-index: 2;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+}
+
+.avatar {
+	background: #dddddd;
+}

+ 155 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/connected/connected.js

@@ -0,0 +1,155 @@
+Component({
+  /**
+   * 组件的属性列表
+   */
+  properties: {
+    playerList: {
+      type: Array,
+    },
+    pusher: {
+      type: Object,
+    },
+    callType: {
+      type: Number,
+    },
+    soundMode: {
+      type: String,
+    },
+    screen: {
+      type: String,
+    },
+    userList: {
+      type: Object,
+    },
+  },
+
+  /**
+   * 组件的初始数据
+   */
+  data: {
+
+  },
+
+  /**
+   * 组件的方法列表
+   */
+  methods: {
+    toggleViewSize(event) {
+      const data = {
+        name: 'toggleViewSize',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherNetStatus(event) {
+      const data = {
+        name: 'pusherNetStatus',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    playNetStatus(event) {
+      const data = {
+        name: 'playNetStatus',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherStateChangeHandler(event) {
+      const data = {
+        name: 'pusherStateChangeHandler',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherAudioVolumeNotify(event) {
+      const data = {
+        name: 'pusherAudioVolumeNotify',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherErrorHandler(event) {
+      const { detail = '' } = event;
+      const data = {
+        name: 'pusherErrorHandler',
+        event: detail,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    playerStateChange(event) {
+      const data = {
+        name: 'playerStateChange',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    playerAudioVolumeNotify(event) {
+      const data = {
+        name: 'playerAudioVolumeNotify',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherAudioHandler(event) {
+      const data = {
+        name: 'pusherAudioHandler',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    hangup(event) {
+      const data = {
+        name: 'hangup',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    toggleSoundMode(event) {
+      const data = {
+        name: 'toggleSoundMode',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherVideoHandler(event) {
+      const data = {
+        name: 'pusherVideoHandler',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    toggleSwitchCamera(event) {
+      const data = {
+        name: 'toggleSwitchCamera',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    switchAudioCall(event) {
+      const data = {
+        name: 'switchAudioCall',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    handleConnectErrorImage(e) {
+      const {  flag, key, index } = e.target.dataset;
+      if (flag === 'pusher') {
+        this.data.pusher.avatar = '../../static/default_avatar.png';
+        this.setData({
+          pusher: this.data.pusher,
+        });
+      } else {
+        this.data[key][index].avatar = '../../static/default_avatar.png';
+        if (this.data.playerList[index]) {
+          this.data.playerList[index].avatar = '../../static/default_avatar.png';
+        }
+        this.setData({
+          playerList: this.data.playerList,
+          [key]: this.data[key],
+        });
+      }
+    },
+  },
+});

+ 4 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/connected/connected.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 118 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/connected/connected.wxml

@@ -0,0 +1,118 @@
+<view class="TUICalling-connected-layout {{callType === 1 ? 'audio' : 'video'}}">
+    <view
+        class="{{callType === 1 ? 'pusher-audio' : playerList.length > 1 ? 'stream-box' : (screen === 'pusher' ? 'pusher-video' : 'player')}}"
+        data-screen="pusher" catch:tap="toggleViewSize">
+        <live-pusher class="{{callType === 1 ? 'pusher-audio' : 'live'}}" url="{{pusher.url}}" mode="{{pusher.mode}}"
+            autopush="{{true}}" enable-camera="{{pusher.enableCamera}}" enable-mic="{{true}}"
+            muted="{{!pusher.enableMic}}" enable-agc="{{true}}" enable-ans="{{true}}"
+            enable-ear-monitor="{{pusher.enableEarMonitor}}" auto-focus="{{pusher.enableAutoFocus}}"
+            zoom="{{pusher.enableZoom}}" min-bitrate="{{pusher.minBitrate}}" max-bitrate="{{pusher.maxBitrate}}"
+            video-width="{{pusher.videoWidth}}" video-height="{{pusher.videoHeight}}" beauty="{{pusher.beautyLevel}}"
+            whiteness="{{pusher.whitenessLevel}}" orientation="{{pusher.videoOrientation}}"
+            aspect="{{pusher.videoAspect}}" device-position="{{pusher.frontCamera}}"
+            remote-mirror="{{pusher.enableRemoteMirror}}" local-mirror="{{pusher.localMirror}}"
+            background-mute="{{pusher.enableBackgroundMute}}" audio-quality="{{pusher.audioQuality}}"
+            audio-volume-type="{{pusher.audioVolumeType}}" audio-reverb-type="{{pusher.audioReverbType}}"
+            waiting-image="{{pusher.waitingImage}}" beauty-style="{{pusher.beautyStyle}}" filter="{{pusher.filter}}"
+            bindstatechange="pusherStateChangeHandler" bindnetstatus="pusherNetStatus" binderror="pusherErrorHandler"
+            bindaudiovolumenotify="pusherAudioVolumeNotify" />
+    </view>
+    <view wx:if="{{callType === 1}}" class="TRTCCalling-call-audio-box {{playerList.length > 1 && 'mutil-img'}}">
+        <view class="TRTCCalling-call-audio-img" wx:if="{{playerList.length > 1}}">
+            <image src="{{pusher.avatar || '../../static/default_avatar.png'}}" class="img-place-holder avatar"
+                data-value="{{pusher.userID}}" data-flag="pusher" binderror="handleConnectErrorImage" />
+            <text class="audio-name">{{pusher.nick || pusher.userID}}(自己)</text>
+        </view>
+        <view class="TRTCCalling-call-audio-img" wx:for="{{userList || playerList}}" wx:key="userID">
+            <image src="{{item.avatar || '../../static/default_avatar.png'}}" class="img-place-holder avatar"
+                data-value="{{item}}" data-flag="player" data-key="userList" data-index="{{index}}" binderror="handleConnectErrorImage" />
+            <text class="audio-name">{{item.nick || item.userID}}</text>
+        </view>
+    </view>
+    <view wx:for="{{playerList}}" wx:key="streamID"
+        class="view-container player-container {{callType === 1 ? 'player-audio' : ''}}">
+        <view
+            class="{{callType === 1 ? 'player-audio' : playerList.length > 1 ? 'stream-box' : (screen === 'player' ? 'pusher-video' : 'player')}}"
+            data-screen="player" catch:tap="toggleViewSize">
+            <live-player class="live" wx:if="{{ item.hasAudio || item.hasVideo }}" id="{{item.id}}" data-userid="{{item.userID}}" data-streamid="{{item.streamID}}"
+                data-streamtype="{{item.streamType}}" src="{{item.src}}" mode="RTC" autoplay="{{item.autoplay}}"
+                mute-audio="{{item.muteAudio}}" mute-video="{{item.muteVideo}}" orientation="{{item.orientation}}"
+                object-fit="{{item.objectFit}}" background-mute="{{item.enableBackgroundMute}}"
+                min-cache="{{item.minCache}}" max-cache="{{item.maxCache}}" sound-mode="{{soundMode}}"
+                enable-recv-message="{{item.enableRecvMessage}}" auto-pause-if-navigate="{{item.autoPauseIfNavigate}}"
+                auto-pause-if-open-native="{{item.autoPauseIfOpenNative}}" bindstatechange="playerStateChange"
+                bindfullscreenchange="playerFullscreenChange" bindnetstatus="playNetStatus"
+                bindaudiovolumenotify="playerAudioVolumeNotify" />
+        </view>
+    </view>
+    <view class="handle-btns">
+        <view class="other-view {{callType === 1 ? 'black' : 'white'}}">
+            <text>{{pusher.chatTime}}</text>
+        </view>
+        <view class="btn-operate-item call-switch" catch:tap="switchAudioCall">
+            <view class="call-operate">
+                <image src="../../static/trans.png" />
+            </view>
+            <text>切到语音通话</text>
+        </view>
+        <view class="btn-list">
+            <view class="button-container">
+                <view class="btn-normal" bindtap="pusherAudioHandler">
+                    <image class="btn-image"
+                        src="{{pusher.enableMic? '../../static/audio-true.png': '../../static/audio-false.png'}} ">
+                    </image>
+                </view>
+                <view class="{{callType === 2 ? 'white' : ''}}">麦克风</view>
+            </view>
+            <view class="button-container" wx:if="{{callType === 1}}">
+                <view class="btn-hangup" bindtap="hangup">
+                    <image class="btn-image" src="../../static/hangup.png"></image>
+                </view>
+
+                <view class="{{callType === 2 ? 'white' : ''}}">挂断</view>
+            </view>
+            <view class="button-container">
+                <view class="btn-normal" bindtap="toggleSoundMode">
+                    <image class="btn-image"
+                        src="{{soundMode === 'ear' ? '../../static/speaker-false.png': '../../static/speaker-true.png'}} ">
+                    </image>
+                </view>
+                <text class="{{callType === 2 ? 'white' : ''}}">扬声器</text>
+            </view>
+
+            <view class="button-container" wx:if="{{callType === 2}}">
+                <view class="btn-normal" bindtap="pusherVideoHandler">
+                    <image class="btn-image"
+                        src="{{pusher.enableCamera ? '../../static/camera-true.png': '../../static/camera-false.png'}} ">
+                    </image>
+                </view>
+                <text class="white">摄像头</text>
+            </view>
+        </view>
+        <view class="btn-list" wx:if="{{callType===2}}">
+            <!-- <view class="btn-list-item">
+                <view wx:if="{{playerList.length === 1}}" class="btn-normal" bindtap="switchAudioCall">
+                    <image class="btn-image btn-image-small" src="{{ '../../static/trans.png'}} "></image>
+                </view>
+            </view> -->
+            <view class="btn-list-item other-view">
+                <view class="btn-container">
+                    <view class="btn-hangup" bindtap="hangup">
+                        <image class="btn-image" src="../../static/hangup.png"></image>
+                    </view>
+                    <view wx:if="{{pusher.enableCamera}}" class="invite-calling-header-left">
+                        <image src="../../static/switch_camera.png" data-device="{{pusher.frontCamera}}"
+                            catch:tap="toggleSwitchCamera" />
+                    </view>
+                </view>
+                <text class="white">挂断</text>
+            </view>
+            <!-- <view class="btn-list-item btn-footer">
+                <view wx:if="{{pusher.enableCamera}}" class="{{playerList.length > 1 ? 'multi-camera' : 'camera'}}">
+                    <image class="camera-image" src="../../static/swtich-camera.png"
+                        data-device="{{pusher.frontCamera}}" catch:tap="toggleSwitchCamera" />
+                </view>
+            </view> -->
+        </view>
+    </view>
+</view>

+ 253 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/connected/connected.wxss

@@ -0,0 +1,253 @@
+.player {
+    position: absolute;
+    right: 16px;
+    top: 107px;
+    width: 100px;
+    height: 178px;
+    padding: 16px;
+    z-index: 3;
+}
+
+.pusher-video {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    /* background-color: #f75c45; */
+    z-index: 1;
+}
+
+.stream-box {
+    position: relative;
+    float: left;
+    width: 50vw;
+    height: 260px;
+    /* background-color: #f75c45; */
+    z-index: 3;
+}
+
+.handle-btns {
+    position: absolute;
+    bottom: 44px;
+    width: 100vw;
+    z-index: 3;
+    display: flex;
+    flex-direction: column;
+}
+
+.handle-btns .btn-list {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-around;
+    align-items: center;
+}
+
+.button-container {
+    display: flex;
+    flex-direction: column;
+    text-align: center;
+}
+
+.btn-normal {
+    width: 8vh;
+    height: 8vh;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    /* background: white; */
+    justify-content: center;
+    align-items: center;
+    border-radius: 50%;
+}
+
+.btn-image {
+    width: 100%;
+    height: 100%;
+    background: none;
+}
+
+.btn-hangup {
+    width: 8vh;
+    height: 8vh;
+    /*background: #f75c45;*/
+    box-sizing: border-box;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    border-radius: 50%;
+}
+
+.btn-hangup > .btn-image {
+    width: 100%;
+    height: 100%;
+    background: none;
+}
+
+.TRTCCalling-call-audio {
+    width: 100%;
+    height: 100%;
+}
+
+.btn-footer {
+    position: relative;
+}
+
+.btn-footer .multi-camera {
+    width: 32px;
+    height: 32px;
+}
+
+.btn-footer .camera {
+    width: 64px;
+    height: 64px;
+    position: fixed;
+    left: 16px;
+    top: 107px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    background: rgba(255, 255, 255, 0.7);
+}
+
+.btn-footer .camera .camera-image {
+    width: 32px;
+    height: 32px;
+}
+
+.TUICalling-connected-layout {
+    width: 100%;
+    height: 100%;
+}
+
+.audio {
+    padding-top: 15vh;
+    background: #ffffff;
+}
+
+.pusher-audio {
+    width: 0;
+    height: 0;
+}
+
+.player-audio {
+    width: 0;
+    height: 0;
+}
+
+.live {
+    width: 100%;
+    height: 100%;
+}
+
+.other-view {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    font-size: 18px;
+    letter-spacing: 0;
+    font-weight: 400;
+    padding: 16px;
+}
+
+.white {
+    color: #f0e9e9;
+    padding: 5px;
+    font-size: 14px;
+}
+
+.black {
+    color: #000000;
+    padding: 5px;
+}
+
+.TRTCCalling-call-audio-box {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+}
+
+.mutil-img {
+    justify-content: flex-start !important;
+}
+
+.TRTCCalling-call-audio-img {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+.TRTCCalling-call-audio-img > image {
+    width: 25vw;
+    height: 25vw;
+    margin: 0 4vw;
+    border-radius: 4vw;
+    position: relative;
+}
+
+.TRTCCalling-call-audio-img text {
+    font-size: 20px;
+    color: #333333;
+    letter-spacing: 0;
+    font-weight: 500;
+}
+
+.btn-list-item {
+    flex: 1;
+    display: flex;
+    justify-content: center;
+    padding: 16px 0;
+}
+
+.btn-image-small {
+    transform: scale(.7);
+}
+
+.avatar {
+    background: #dddddd;
+}
+
+.btn-container {
+    display: flex;
+    align-items: center;
+    position: relative;
+}
+
+.invite-calling-header-left {
+    position: absolute;
+    right: -88px;
+}
+
+.invite-calling-header-left image {
+    width: 32px;
+    height: 32px;
+}
+
+.call-switch .call-operate {
+    width: 4vh;
+    height: 3vh;
+}
+
+.call-operate image {
+  width: 100%;
+  height: 100%;
+  background: none;
+}
+
+.call-switch text {
+    padding: 0;
+    font-size: 14px;
+}
+
+.btn-operate-item {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+.btn-operate-item text {
+    padding: 8px 0;
+    font-size: 18px;
+    color: #FFFFFF;
+    letter-spacing: 0;
+    font-weight: 400;
+    font-size: 14px;
+}

+ 112 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupCalling/groupCalling.js

@@ -0,0 +1,112 @@
+// components/tui-calling/TUICalling/component/calling.js
+Component({
+  /**
+   * 组件的属性列表
+   */
+  properties: {
+    isSponsor: {
+      type: Boolean,
+    },
+    pusher: {
+      type: Object,
+    },
+    callType: {
+      type: Number,
+    },
+    allUsers: {
+      type: Array,
+    },
+    isGroup: {
+      type: Boolean,
+    },
+    ownUserId: {
+      type: String,
+    },
+  },
+
+  /**
+   * 组件的初始数据
+   */
+  data: {
+    userID: null,
+  },
+
+  /**
+   * 生命周期方法
+   */
+  lifetimes: {
+    created() {
+    },
+    attached() {
+    },
+    ready() {
+
+    },
+    detached() {
+
+    },
+    error() {
+    },
+  },
+
+  /**
+   * 组件的方法列表
+   */
+  methods: {
+    accept(event) {
+      const data = {
+        name: 'accept',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    hangup(event) {
+      const data = {
+        name: 'hangup',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    reject(event) {
+      const data = {
+        name: 'reject',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    handleErrorImage(e) {
+      const { id } = e.target;
+      const allUsers = this.data.allUsers.map((item) => {
+        if (item.userID === id) {
+          item.avatar = '../../static/default_avatar.png';
+        }
+        return item;
+      });
+      this.setData({
+        allUsers,
+      });
+    },
+    toggleSwitchCamera(event) {
+      const data = {
+        name: 'toggleSwitchCamera',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    switchAudioCall(event) {
+      const data = {
+        name: 'switchAudioCall',
+        event,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+    pusherErrorHandler(event) {
+      const { detail = '' } = event;
+      const data = {
+        name: 'pusherErrorHandler',
+        event: detail,
+      };
+      this.triggerEvent('callingEvent', data);
+    },
+  },
+});

+ 4 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupCalling/groupCalling.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 135 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupCalling/groupCalling.wxml

@@ -0,0 +1,135 @@
+    <!-- 视频通话 -->
+    <view class="invite-call transition-animation" wx:if="{{callType === 2}}">
+        <live-pusher class="local-video" wx:if="{{isGroup===false}}" device-position="{{pusher.frontCamera}}" binderror="pusherErrorHandler"/>
+        <view class="invite-calling">
+            <!-- 主叫方 -->
+            <swiper class="swiper" wx:if="{{isSponsor}}" indicator-dots="{{allUsers.length/4 > 1}}" indicator-color="white" indicator-active-color="black">
+                <block wx:for="{{(allUsers.length)/4}}" wx:key="*this" wx:for-index="pos">
+                    <swiper-item class="invite-calling-list">
+                        <view wx:for="{{allUsers}}" wx:key="userID" class="invite-calling-item" wx:if="{{index >= pos*4 && index < pos*4+4}}">
+                            <view id="{{item.userID}}" class="invite-calling-item-message" wx:if="{{item.userID !== ownUserId}}">
+                                <view class="invite-calling-item-loadimg">
+                                    <image src="../../static/loading.png"></image>
+                                </view>
+                                <view class="invite-calling-item-id">{{item.nick || item.userID}}</view>
+                            </view>
+                            <image class="avatar" src="{{item.avatar || '../../static/default_avatar.png'}}" binderror="handleErrorImage" />
+                            <view class="invite-calling-item-id">{{item.nick || item.userID}}</view>
+                        </view>
+                    </swiper-item>
+                </block>
+            </swiper>
+            <!-- 被叫方 -->
+            <view wx:else>
+                <view class="invite-calling-single">
+                    <image class="avatar" src="{{allUsers[0].avatar || '../../static/default_avatar.png'}}" id="{{allUsers[0].userID}}" binderror="handleErrorImage" />
+                    <view class="tips">{{allUsers[0].nick || allUsers[0].userID }}</view>
+                    <view class="invite-txt">邀请你参加多人通话</view>
+                </view>
+                <view class="invite-other-txt">参与通话的还有:</view>
+                <view class="invite-other-list">
+                    <view class="invite-other-item" wx:if="{{index>0}}" wx:for="{{allUsers}}" wx:key="item">
+                        <image class="avatar" src="{{item.avatar || '../../static/default_avatar.png'}}" binderror="handleErrorImage" />
+                        <view class="invite-other-item-name">{{ item.nick || item.userID}}</view>
+                    </view>
+                </view>
+            </view>
+            <view class="footer">
+                <!-- <view class="btn-operate" wx:if="{{isSponsor}}">
+                <view class="btn-operate-item call-switch" catch:tap="switchAudioCall">
+                    <view class="call-operate">
+                        <image src="../../static/trans.png" />
+                    </view>
+                    <text>切到语音通话</text>
+                </view>
+            </view> -->
+                <view class="btn-operate" wx:if="{{isSponsor}}">
+                    <view class="btn-operate-item">
+                        <view class="btn-container">
+                            <view class="call-operate" catch:tap="hangup">
+                                <image src="../../static/hangup.png" />
+                            </view>
+                            <!-- <view class="invite-calling-header-left">
+                                <image src="../../static/switch_camera.png" data-device="{{pusher.frontCamera}}" catch:tap="toggleSwitchCamera" />
+                            </view> -->
+                        </view>
+                        <text style="color: #666666">挂断</text>
+                    </view>
+                </view>
+                <view class="btn-operate" wx:if="{{!isSponsor}}">
+                    <view class="btn-operate-item">
+                        <view class="call-operate" style="background-color: red" catch:tap="reject">
+                            <image src="../../static/hangup.png" />
+                        </view>
+                        <text style="color: #666666">挂断</text>
+                    </view>
+                    <view class="btn-operate-item">
+                        <view class="call-operate" catch:tap="accept">
+                            <image src="../../static/dialing.png" />
+                        </view>
+                        <text style="color: #666666">接听</text>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+    <!-- 语音通话 -->
+    <view class="incoming-call audio-call transition-animation" wx:if="{{callType === 1}}">
+        <!-- 主叫方 -->
+        <swiper class="swiper" wx:if="{{isSponsor}}" indicator-dots="{{allUsers.length/4 > 1}}" indicator-color="white" indicator-active-color="black">
+            <block wx:for="{{(allUsers.length)/4}}" wx:key="*this" wx:for-index="pos">
+                <swiper-item class="invite-calling-list">
+                    <view wx:for="{{allUsers}}" wx:key="userID" class="invite-calling-item" wx:if="{{index >= pos*4 && index < pos*4+4}}">
+                        <view id="{{item.userID}}" class="invite-calling-item-message" wx:if="{{item.userID !== ownUserId}}">
+                            <view class="invite-calling-item-loadimg">
+                                <image src="../../static/loading.png"></image>
+                            </view>
+                            <view class="invite-calling-item-id">{{item.nick || item.userID}}</view>
+                        </view>
+                        <image class="avatar" src="{{item.avatar || '../../static/default_avatar.png'}}" binderror="handleErrorImage" />
+                        <view class="invite-calling-item-id">{{item.nick || item.userID}}</view>
+                    </view>
+                </swiper-item>
+            </block>
+        </swiper>
+        <!-- 被叫方 -->
+        <view wx:else>
+            <view class="invite-calling-single">
+                <image class="avatar" src="{{allUsers[0].avatar || '../../static/default_avatar.png'}}" id="{{allUsers[0].userID}}" binderror="handleErrorImage" />
+                <view class="tips">{{allUsers[0].nick || allUsers[0].userID  }}</view>
+                <view class="invite-txt">邀请你参加多人通话</view>
+            </view>
+            <view class="invite-other-txt">参与通话的还有:</view>
+            <view class="invite-other-list">
+                <view class="invite-other-item" wx:if="{{index>0}}" wx:for="{{allUsers}}" wx:key="item">
+                    <image class="avatar" src="{{item.avatar || '../../static/default_avatar.png'}}" binderror="handleErrorImage" />
+                    <view class="invite-other-item-name">{{item.nick || item.userID}}</view>
+                </view>
+            </view>
+        </view>
+        <!-- 菜单 -->
+        <view class="footer">
+            <view wx:if="{{!isSponsor && callType === 1}}" class="btn-operate">
+                <view class="button-container">
+                    <view class="call-operate" style="background-color: red" catch:tap="reject">
+                        <image src="../../static/hangup.png" />
+                    </view>
+                    <view style="margin-top:10px;color: #666666">挂断</view>
+                </view>
+                <view class="button-container">
+                    <view class="call-operate" catch:tap="accept">
+                        <image src="../../static/dialing.png" />
+                    </view>
+                    <view style="margin-top:10px;color: #666666">接听</view>
+                </view>
+            </view>
+            <view wx:if="{{isSponsor && callType === 1}}" class="btn-operate">
+                <view class="button-container">
+                    <view class="call-operate" style="background-color: red" catch:tap="hangup">
+                        <image src="../../static/hangup.png" />
+                    </view>
+                    <view style="margin-top:10px;color: #666666">挂断</view>
+                </view>
+            </view>
+        </view>
+    </view>

+ 380 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupCalling/groupCalling.wxss

@@ -0,0 +1,380 @@
+.transition-animation {
+	transform: translateY(-100%);
+	animation: slideInDown 0.5s ease forwards;
+}
+
+@keyframes slideInDown {
+	from {
+	  transform: translateY(-100%);
+	}
+	to {
+	  transform: translateY(0);
+	}
+}
+
+.footer {
+	position: absolute;
+	bottom: 5vh;
+	width: 100%;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+}
+
+.button-container {
+	display: flex;
+	flex-direction: column;
+	text-align: center;
+}
+
+.btn-operate {
+	display: flex;
+	justify-content: space-between;
+	/* flex-direction: column;
+    text-align: center; */
+
+}
+
+.btn-operate-item {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	margin-bottom: 20px;
+}
+
+.btn-operate-item text {
+	font-size: 14px;
+	color: #f0e9e9;
+	padding: 5px;
+	letter-spacing: 0;
+	font-weight: 400;
+}
+
+.call-switch text {
+	padding: 5px;
+	color: #f0e9e9;
+	font-size: 14px;
+}
+
+.call-operate {
+	width: 8vh;
+	height: 8vh;
+	border-radius: 8vh;
+	margin: 0 15vw;
+	box-sizing: border-box;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+
+.call-switch .call-operate {
+	width: 4vh;
+	height: 3vh;
+}
+
+.call-operate image {
+	width: 100%;
+	height: 100%;
+	background: none;
+}
+
+.tips {
+	font-size: 20px;
+	color: #FFFFFF;
+	letter-spacing: 0;
+	margin: 0 auto;
+	/* text-shadow: 0 1px 2px rgba(0,0,0,0.40); */
+	font-weight: 600;
+	max-width: 150px;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+
+.tips-subtitle {
+	font-family: PingFangSC-Regular;
+	font-size: 14px;
+	color: #FFFFFF;
+	letter-spacing: 0;
+	text-align: right;
+	/* text-shadow: 0 1px 2px rgba(0,0,0,0.30); */
+	font-weight: 400;
+}
+
+.invite-call {
+	/* background: #ffffff; */
+	position: absolute;
+	top: 0;
+	z-index: 100;
+	width: 100px;
+	height: 187px;
+}
+
+.invite-call .local-video {
+	width: 100px;
+	height: 187px;
+}
+
+.invite-call .invite-calling {
+	position: absolute;
+	top: 0;
+	z-index: 101;
+	width: 100vw;
+	height: 100vh;
+}
+
+.invite-calling-header {
+	margin-top: 107px;
+	display: flex;
+	justify-content: flex-end;
+	padding: 0 16px;
+}
+
+.btn-container {
+	display: flex;
+	align-items: center;
+	position: relative;
+}
+
+.invite-calling-header-left {
+	position: absolute;
+	right: 0;
+}
+
+.invite-calling-header-left image {
+	width: 32px;
+	height: 32px;
+}
+
+.invite-calling-header-right {
+	display: flex;
+	align-items: center;
+}
+
+.invite-calling-header-message {
+	display: flex;
+	flex-direction: column;
+	padding: 0 16px;
+}
+
+.invite-calling-header-right image {
+	width: 100px;
+	height: 100px;
+	border-radius: 12px;
+}
+
+.invite-calling .footer {
+	position: absolute;
+	bottom: 5vh;
+	width: 100%;
+}
+
+.invite-calling .btn-operate {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+
+
+.hidden {
+	display: none;
+}
+
+.trtc-calling {
+	width: 100vw;
+	height: 100vh;
+	overflow: hidden;
+	margin: 0;
+	z-index: 99;
+}
+
+.audio-call {
+	width: 100vw;
+	height: 100vh;
+	position: absolute;
+	top: 0;
+	z-index: 100;
+	background: #FFFFFF;
+}
+
+.audio-call>.btn-operate {
+	display: flex;
+	justify-content: center;
+}
+
+.audio-call>image {
+	width: 40vw;
+	height: 40vw;
+	display: block;
+	margin: 20vw 30vw;
+	margin-top: 40vw;
+}
+
+.invite-calling-single>image {
+	width: 120px;
+	height: 120px;
+	border-radius: 12px;
+	display: block;
+	margin: 120px auto 15px;
+	/* margin: 20vw 30vw; */
+}
+
+.invite-calling-single .tips {
+	width: 100%;
+	height: 40px;
+	line-height: 40px;
+	text-align: center;
+	font-size: 20px;
+	color: #333333;
+	letter-spacing: 0;
+	font-weight: 500;
+}
+
+.invite-calling-single .tips-subtitle {
+	height: 20px;
+	font-family: PingFangSC-Regular;
+	font-size: 14px;
+	color: #97989C;
+	letter-spacing: 0;
+	font-weight: 400;
+	text-align: center;
+}
+
+.swiper {
+	margin-top: 107px;
+	min-height: 374px;
+}
+
+.invite-calling-list {
+
+	display: flex;
+	flex-wrap: wrap;
+	width: 100%;
+	justify-content: flex-start
+}
+
+.invite-calling-item {
+	flex: 0.5;
+	/*设置最小宽度,才会让元素排不下,导致换行排列*/
+	min-width: 50%;
+	height: 187px;
+	position: relative;
+}
+
+.invite-calling-item image {
+	width: 100%;
+	height: 100%;
+}
+
+.invite-calling-item-message {
+	position: absolute;
+	top: 0;
+	left: 0;
+	float: left;
+	background: rgba(0, 0, 0, 0.60);
+	width: 100%;
+	height: 100%;
+	z-index: 2;
+}
+
+.invite-calling-item-loadimg {
+	position: absolute;
+	left: calc(50% - 20px);
+	top: calc(50% - 20px);
+	width: 40px;
+	height: 40px;
+	-webkit-transform: rotate(360deg);
+	animation: rotation 2s linear infinite;
+	-moz-animation: rotation 2s linear infinite;
+	-webkit-animation: rotation 2s linear infinite;
+	-o-animation: rotation 2s linear infinite;
+}
+
+
+@-webkit-keyframes rotation {
+	from {
+		-webkit-transform: rotate(0deg);
+	}
+
+	to {
+		-webkit-transform: rotate(360deg);
+	}
+}
+
+.invite-calling-item-loadimg image {
+	width: 100%;
+	height: 100%;
+}
+
+.invite-calling-item-id {
+	position: absolute;
+	left: 2%;
+	bottom: 2%;
+	font-family: PingFangSC-Regular;
+	font-weight: 400;
+	font-size: 12px;
+	color: #FFFFFF;
+}
+
+.avatar {
+	background-color: black;
+}
+
+
+/* 被叫者 */
+.invite-txt {
+	width: 126px;
+	height: 20px;
+	font-family: PingFangSC-Regular;
+	font-weight: 400;
+	font-size: 14px;
+	color: #333333;
+	letter-spacing: 0;
+	margin: 16px auto 60px auto;
+}
+
+.invite-other-txt {
+	width: 112px;
+	height: 20px;
+	font-family: PingFangSC-Regular;
+	font-weight: 400;
+	font-size: 14px;
+	color: #333333;
+	letter-spacing: 0;
+	margin: 0 auto 24px auto;
+}
+
+.invite-other-list {
+	position: absolute;
+	left: 14vw;
+	margin-top: 0 auto;
+	display: flex;
+	flex-wrap: wrap;
+	width: 272px;
+	justify-content: center;
+	flex-wrap: wrap;
+}
+
+.invite-other-item {
+	flex: 0.25;
+	/*设置最小宽度,才会让元素排不下,导致换行排列*/
+	text-align: center;
+	max-width: 64px;
+	margin: 2px;
+}
+
+.invite-other-item image {
+	border-radius: 10%;
+	max-width: 64px;
+	height: 64px;
+}
+
+.invite-other-item-name {
+	font-family: PingFangSC-Regular;
+	font-weight: 400;
+	font-size: 12px;
+	color: #666666;
+	letter-spacing: 0;
+	line-height: 18px;
+}

+ 181 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupConnected/groupConnected.js

@@ -0,0 +1,181 @@
+Component({
+  /**
+   * 组件的属性列表
+   */
+  properties: {
+    playerList: {
+      type: Array,
+    },
+    pusher: {
+      type: Object,
+    },
+    callType: {
+      type: Number,
+    },
+    soundMode: {
+      type: String,
+    },
+    screen: {
+      type: String,
+    },
+    userList: {
+      type: Object,
+    },
+    isGroup: {
+      type: Boolean,
+    },
+    allUsers: {
+      type: Array,
+    },
+    playerProcess: {
+      type: Object,
+    },
+    ownUserId: {
+      type: String,
+    },
+  },
+
+  /**
+   * 组件的初始数据
+   */
+  data: {
+    userID: null,
+  },
+  /**
+   * 生命周期方法
+   */
+  lifetimes: {
+    created() {
+    },
+    attached() {
+    },
+    ready() {
+    },
+    detached() {
+    },
+    error() {
+    },
+  },
+  /**
+   * 组件的方法列表
+   */
+  methods: {
+    toggleViewSize(event) {
+      const data = {
+        name: 'toggleViewSize',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherNetStatus(event) {
+      const data = {
+        name: 'pusherNetStatus',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    playNetStatus(event) {
+      const data = {
+        name: 'playNetStatus',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherStateChangeHandler(event) {
+      const data = {
+        name: 'pusherStateChangeHandler',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherAudioVolumeNotify(event) {
+      const data = {
+        name: 'pusherAudioVolumeNotify',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    playerStateChange(event) {
+      const data = {
+        name: 'playerStateChange',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherErrorHandler(event) {
+      const { detail = '' } = event;
+      const data = {
+        name: 'pusherErrorHandler',
+        event: detail,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    playerAudioVolumeNotify(event) {
+      const data = {
+        name: 'playerAudioVolumeNotify',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherAudioHandler(event) {
+      const data = {
+        name: 'pusherAudioHandler',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    hangup(event) {
+      const data = {
+        name: 'hangup',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    toggleSoundMode(event) {
+      const data = {
+        name: 'toggleSoundMode',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    pusherVideoHandler(event) {
+      const data = {
+        name: 'pusherVideoHandler',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    toggleSwitchCamera(event) {
+      const data = {
+        name: 'toggleSwitchCamera',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    switchAudioCall(event) {
+      const data = {
+        name: 'switchAudioCall',
+        event,
+      };
+      this.triggerEvent('connectedEvent', data);
+    },
+    handleConnectErrorImage(e) {
+      const {  flag, key, index } = e.target.dataset;
+      if (flag === 'pusher') {
+        this.data.pusher.avatar = '../../static/default_avatar.png';
+        this.setData({
+          pusher: this.data.pusher,
+        });
+      } else {
+        this.data[key][index].avatar = '../../static/default_avatar.png';
+        if (this.data.playerList[index]) {
+          this.data.playerList[index].avatar = '../../static/default_avatar.png';
+        }
+        this.setData({
+          playerList: this.data.playerList,
+          [key]: this.data[key],
+        });
+      }
+    },
+  },
+});

+ 7 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupConnected/groupConnected.json

@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {},
+  "window": {
+    "backgroundColor": "#2c292923;"
+}
+}

+ 162 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupConnected/groupConnected.wxml

@@ -0,0 +1,162 @@
+<view class="{{callType === 2?'TUICalling-connected-video':'TUICalling-connected-layout'}}">
+    <!-- 语音通话 -->
+    <view wx:if="{{callType === 1}}">
+        <swiper class="swiper" indicator-dots="{{allUsers.length/4 > 1}}" indicator-color="white"
+                indicator-active-color="black">
+            <block wx:for="{{(allUsers.length)/4}}" wx:key="*this" wx:for-index="pos">
+                <swiper-item class="invite-calling-list">
+                    <view wx:for="{{allUsers}}" wx:key="userID" class="invite-calling-item"
+                          wx:if="{{index >= pos*4 && index < pos*4+4}}">
+                        <view id="{{item.userID}}" class="invite-calling-item-message" wx:if="{{!item.isEnter}}">
+                            <view class="invite-calling-item-loadimg">
+                                <image src="../../static/loading.png"></image>
+                            </view>
+                            <view class="invite-calling-item-id">{{item.nick || item.userID}}</view>
+                        </view>
+                        <image class="avatar" src="{{item.avatar || '../../static/default_avatar.png'}}"
+                               binderror="handleErrorImage"/>
+                        <!-- 音量图标 -->
+                        <view class="player-control">
+                            <image src="{{item.avatar || '../../static/default_avatar.png'}}"></image>
+                            <view class="name">{{item.userID===ownUserId?'我':item.nick || item.userID}}</view>
+                        </view>
+                    </view>
+                </swiper-item>
+            </block>
+        </swiper>
+    </view>
+    <view class="{{callType === 1 ? 'pusher-audio' : ''}}">
+        <swiper class="swiper" indicator-dots="{{allUsers.length/4 > 1}}" indicator-color="white"
+                indicator-active-color="black">
+            <block wx:for="{{(allUsers.length)/4}}" wx:key="*this" wx:for-index="pos">
+                <swiper-item class="invite-calling-list">
+                    <view wx:for="{{allUsers}}" wx:key="userID" class="invite-calling-item"
+                          wx:if="{{index >= pos*4 && index < pos*4+4}}">
+                        <view id="{{item.userID}}" class="invite-calling-item-message" wx:if="{{!item.isEnter}}">
+                            <view class="invite-calling-item-loadimg">
+                                <image src="../../static/loading.png"></image>
+                            </view>
+                            <image class="avatar" src="{{item.avatar || '../../static/default_avatar.png'}}" binderror="handleErrorImage" />
+                            <view class="invite-calling-item-id">{{item.nick || item.userID}}</view>
+                        </view>
+                        <view wx:else>
+                            <!-- 本地流 -->
+                            <view wx:if="{{item.userID===ownUserId}}"
+                                  class="{{callType === 1 ? 'pusher-audio' : 'play-item'}}" data-screen="pusher"
+                                  catch:tap="toggleViewSize">
+                                <live-pusher class="{{callType === 1 ? 'pusher-audio' : 'pusher-ownvideo'}}"
+                                             url="{{pusher.url}}" mode="{{pusher.mode}}" autopush="{{true}}"
+                                             enable-camera="{{pusher.enableCamera}}" enable-mic="{{true}}"
+                                             muted="{{!pusher.enableMic}}" enable-agc="{{true}}" enable-ans="{{true}}"
+                                             enable-ear-monitor="{{pusher.enableEarMonitor}}"
+                                             auto-focus="{{pusher.enableAutoFocus}}" zoom="{{pusher.enableZoom}}"
+                                             min-bitrate="{{pusher.minBitrate}}" max-bitrate="{{pusher.maxBitrate}}"
+                                             video-width="{{pusher.videoWidth}}" video-height="{{pusher.videoHeight}}"
+                                             beauty="{{pusher.beautyLevel}}" whiteness="{{pusher.whitenessLevel}}"
+                                             orientation="{{pusher.videoOrientation}}" aspect="{{pusher.videoAspect}}"
+                                             device-position="{{pusher.frontCamera}}"
+                                             remote-mirror="{{pusher.enableRemoteMirror}}"
+                                             local-mirror="{{pusher.localMirror}}"
+                                             background-mute="{{pusher.enableBackgroundMute}}"
+                                             audio-quality="{{pusher.audioQuality}}"
+                                             audio-volume-type="{{pusher.audioVolumeType}}"
+                                             audio-reverb-type="{{pusher.audioReverbType}}"
+                                             waiting-image="{{pusher.waitingImage}}"
+                                             beauty-style="{{pusher.beautyStyle}}" filter="{{pusher.filter}}"
+                                             bindstatechange="pusherStateChangeHandler" bindnetstatus="pusherNetStatus"
+                                             binderror="pusherErrorHandler"
+                                             bindaudiovolumenotify="pusherAudioVolumeNotify"/>
+                                <view class="player-control">
+                                    <image src="{{item.avatar || '../../static/default_avatar.png'}}"></image>
+                                    <view class="name">我</view>
+                                </view>
+                            </view>
+                            <!-- 远端流 -->
+                            <view catch:tap="toggleViewSize" class="{{callType === 1 ? 'pusher-audio' : 'play-item'}}"
+                                  wx:else>
+                                <live-player
+                                        wx:if="{{playerProcess[item.userID]}}"
+                                        wx:if="{{ playerProcess[item.userID].hasAudio || playerProcess[item.userID].hasVideo }}"
+                                        class="{{callType === 1 ? 'pusher-audio' : 'pusher-ownvideo'}}"
+                                        id="{{playerProcess[item.userID].id}}"
+                                        data-userid="{{playerProcess[item.userID].userID}}"
+                                        data-streamid="{{playerProcess[item.userID].streamID}}"
+                                        data-streamtype="{{playerProcess[item.userID].streamType}}"
+                                        src="{{playerProcess[item.userID].src}}" mode="RTC"
+                                        autoplay="{{playerProcess[item.userID].autoplay}}"
+                                        mute-audio="{{playerProcess[item.userID].muteAudio}}"
+                                        mute-video="{{playerProcess[item.userID].muteVideo}}"
+                                        orientation="{{playerProcess[item.userID].orientation}}"
+                                        object-fit="{{playerProcess[item.userID].objectFit}}"
+                                        background-mute="{{playerProcess[item.userID].enableBackgroundMute}}"
+                                        min-cache="{{playerProcess[item.userID].minCache}}"
+                                        max-cache="{{playerProcess[item.userID].maxCache}}"
+                                        sound-mode="{{soundMode}}"
+                                        enable-recv-message="{{playerProcess[item.userID].enableRecvMessage}}"
+                                        auto-pause-if-navigate="{{playerProcess[item.userID].autoPauseIfNavigate}}"
+                                        auto-pause-if-open-native="{{playerProcess[item.userID].autoPauseIfOpenNative}}"
+                                        bindstatechange="playerStateChange"
+                                        bindfullscreenchange="playerFullscreenChange" bindnetstatus="playNetStatus"
+                                        bindaudiovolumenotify="playerAudioVolumeNotify"/>
+                                <!-- 音量图标 -->
+                                <view class="player-control">
+                                    <image src="{{item.avatar || '../../static/default_avatar.png'}}"></image>
+                                    <view class="name">{{item.nick || item.userID}}</view>
+                                </view>
+                            </view>
+                        </view>
+                    </view>
+                </swiper-item>
+            </block>
+        </swiper>
+    </view>
+    <!-- 菜单 -->
+    <view class="handle-btns">
+        <view class="other-view {{callType === 1 ? 'black' : 'white'}}">
+            <text>{{pusher.chatTime}}</text>
+        </view>
+        <view class="btn-list">
+            <view class="button-container">
+                <view class="btn-normal" bindtap="pusherAudioHandler">
+                    <image class="btn-image"
+                           src="{{pusher.enableMic? '../../static/audio-true.png': '../../static/audio-false.png'}} "></image>
+                </view>
+                <view class="{{callType === 2 ? 'white' : ''}}">麦克风</view>
+            </view>
+            <view class="button-container" wx:if="{{callType === 1}}">
+                <view class="btn-hangup" bindtap="hangup">
+                    <image class="btn-image" src="../../static/hangup.png"></image>
+                </view>
+                <view class="{{callType === 2 ? 'white' : ''}}">挂断</view>
+            </view>
+            <view class="button-container">
+                <view class="btn-normal" bindtap="toggleSoundMode">
+                    <image class="btn-image"
+                           src="{{soundMode === 'ear' ? '../../static/speaker-false.png': '../../static/speaker-true.png'}} "></image>
+                </view>
+                <text class="{{callType === 2 ? 'white' : ''}}">扬声器</text>
+            </view>
+            <view class="button-container" wx:if="{{callType === 2}}">
+                <view class="btn-normal" bindtap="pusherVideoHandler">
+                    <image class="btn-image"
+                           src="{{pusher.enableCamera ? '../../static/camera-true.png': '../../static/camera-false.png'}} "></image>
+                </view>
+                <text class="white">摄像头</text>
+            </view>
+        </view>
+        <view class="btn-list" wx:if="{{callType===2}}">
+            <view class="btn-list-item other-view">
+                <view class="btn-container">
+                    <view class="btn-hangup" bindtap="hangup">
+                        <image class="btn-image" src="../../static/hangup.png"></image>
+                    </view>
+                    <view wx:if="{{pusher.enableCamera}}" class="invite-calling-header-left">
+                        <image src="../../static/switch_camera.png" data-device="{{pusher.frontCamera}}"
+                               catch:tap="toggleSwitchCamera"/>
+                    </view>
+                </view>
+                <text class="white">挂断</text>
+            </view>
+        </view>
+    </view>
+</view>

+ 414 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/component/groupConnected/groupConnected.wxss

@@ -0,0 +1,414 @@
+/* 全屏设置 */
+.TUICalling-connected-layout {
+  width: 100%;
+  height: 100%;
+}
+
+.TUICalling-connected-video {
+  width: 100%;
+  height: 180%;
+}
+
+/* 本地音频 */
+.stream-box {
+  float: left;
+  width: 187px;
+  height: 187px;
+  position: absolute;
+  top: 13vh;
+}
+
+/* 远端音频列表 */
+.swiper {
+  margin-top: 107px;
+  min-height: 374px;
+}
+
+.invite-calling-list {
+  display: flex;
+  flex-wrap: wrap;
+  width: 100%;
+  justify-content: flex-start
+}
+
+.invite-calling-item {
+  flex: 0.5;
+  /*设置最小宽度,才会让元素排不下,导致换行排列*/
+  min-width: 50%;
+  height: 187px;
+  position: relative;
+}
+
+.invite-calling-item image {
+  width: 100%;
+  height: 100%;
+}
+
+/* 本地视频 */
+.play-item {
+  width: 100%;
+  height: 187px;
+  position: relative;
+}
+
+.pusher-ownvideo {
+  width: 100%;
+  height: 100%;
+}
+
+
+/* 远端视频列表 */
+.swiper-list {
+  min-height: 189px;
+}
+
+.player-list {
+  display: flex;
+  flex-wrap: wrap;
+  width: 100%;
+  justify-content: center
+}
+
+.player-item {
+  flex: 0.5;
+  /*设置最小宽度,才会让元素排不下,导致换行排列*/
+  min-width: 50%;
+  min-height: 187px;
+}
+
+/* 音量图标 */
+.player-control {
+  background-color: rgba(0, 0, 0, .4);
+  border-radius: 0 6px 6px 0;
+  color: #fff;
+  z-index: 999;
+  position: absolute;
+  bottom: 0px;
+  left: 0px;
+  display: flex;
+  align-items: center;
+  height: 32px;
+  max-width: 50%;
+  z-index: 99;
+}
+
+.player-control image {
+  width: 32px;
+  height: 32px;
+}
+
+.player-control .name {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  margin-left: 10px;
+  margin-right: 10px;
+  flex: 1;
+  font-family: PingFangSC-Regular;
+  font-weight: 400;
+  font-size: 12px;
+  color: #FFFFFF;
+}
+
+.control-buttons {
+  display: flex;
+}
+
+.icon-button {
+  margin-right: 10px;
+}
+
+/* 菜单 */
+.handle-btns {
+  position: absolute;
+  bottom: 44px;
+  width: 100vw;
+  z-index: 3;
+  display: flex;
+  flex-direction: column;
+}
+
+.handle-btns .btn-list {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-around;
+  align-items: center;
+}
+
+.button-container {
+  display: flex;
+  flex-direction: column;
+  text-align: center;
+}
+
+.btn-normal {
+  width: 8vh;
+  height: 8vh;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  /* background: white; */
+  justify-content: center;
+  align-items: center;
+  border-radius: 50%;
+}
+
+.btn-image {
+  width: 100%;
+  height: 100%;
+  background: none;
+}
+
+.btn-hangup {
+  width: 8vh;
+  height: 8vh;
+  /*background: #f75c45;*/
+  box-sizing: border-box;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  border-radius: 50%;
+}
+
+.btn-hangup>.btn-image {
+  width: 100%;
+  height: 100%;
+  background: none;
+}
+
+.TRTCCalling-call-audio {
+  width: 100%;
+  height: 100%;
+}
+
+.btn-footer {
+  position: relative;
+}
+
+.btn-footer .multi-camera {
+  width: 32px;
+  height: 32px;
+}
+
+.btn-footer .camera {
+  width: 64px;
+  height: 64px;
+  position: fixed;
+  left: 16px;
+  top: 107px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background: rgba(255, 255, 255, 0.7);
+}
+
+.btn-footer .camera .camera-image {
+  width: 32px;
+  height: 32px;
+}
+
+.audio {
+  padding-top: 15vh;
+  background: #ffffff;
+}
+
+.pusher-audio {
+  width: 0;
+  height: 0;
+}
+
+.player-audio {
+  width: 0;
+  height: 0;
+}
+
+.other-view {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  font-size: 18px;
+  letter-spacing: 0;
+  font-weight: 400;
+  padding: 16px;
+}
+
+.white {
+  font-weight: 400;
+  font-size: 14px;
+  color: #666666;
+  padding: 5px;
+}
+
+.black {
+  color: #000000;
+  padding: 5px;
+}
+
+.TRTCCalling-call-audio-box {
+  margin-top: 100px;
+  display: flex;
+  flex-wrap: wrap;
+  width: 100%;
+  justify-content: center
+}
+
+/*
+.mutil-img {
+    justify-content: flex-start !important;
+} */
+
+/* .TRTCCalling-call-audio-img {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+.TRTCCalling-call-audio-img > image {
+    width: 25vw;
+    height: 25vw;
+    margin: 0 4vw;
+    border-radius: 4vw;
+    position: relative;
+}
+
+.TRTCCalling-call-audio-img text {
+    font-size: 20px;
+    color: #333333;
+    letter-spacing: 0;
+    font-weight: 500;
+}  */
+
+.TRTCCalling-calling-list {
+  flex: 0.5;
+  /*设置最小宽度,才会让元素排不下,导致换行排列*/
+  min-width: 50%;
+  min-height: 187px;
+  position: relative;
+}
+
+.TRTCCalling-calling-list image {
+  width: 100%;
+  height: 100%;
+}
+
+.TRTCCalling-calling-item-id {
+  position: absolute;
+  left: 2%;
+  bottom: 2%;
+  font-family: PingFangSC-Regular;
+  font-weight: 400;
+  font-size: 12px;
+  color: #FFFFFF;
+}
+
+.btn-list-item {
+  flex: 1;
+  display: flex;
+  justify-content: center;
+  padding: 16px 0;
+}
+
+.btn-image-small {
+  transform: scale(.7);
+}
+
+.avatar {
+  background: #dddddd;
+}
+
+.btn-container {
+  display: flex;
+  align-items: center;
+  position: relative;
+}
+
+.invite-calling-header-left {
+  position: absolute;
+  right: -88px;
+}
+
+.invite-calling-header-left image {
+  width: 32px;
+  height: 32px;
+}
+
+.call-switch .call-operate {
+  width: 4vh;
+  height: 3vh;
+}
+
+.call-operate image {
+  width: 100%;
+  height: 100%;
+  background: none;
+}
+
+.call-switch text {
+  padding: 0;
+  font-size: 14px;
+}
+
+.btn-operate-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.btn-operate-item text {
+  padding: 8px 0;
+  font-size: 18px;
+  color: #666666;
+  letter-spacing: 0;
+  font-weight: 400;
+  font-size: 14px;
+}
+
+.invite-calling-item-message {
+  position: absolute;
+  top: 0;
+  left: 0;
+  float: left;
+  background: rgba(0, 0, 0, 0.60);
+  width: 100%;
+  height: 100%;
+  z-index: 2;
+}
+
+.invite-calling-item-loadimg {
+  position: absolute;
+  left: calc(50% - 20px);
+  top: calc(50% - 20px);
+  width: 40px;
+  height: 40px;
+  -webkit-transform: rotate(360deg);
+  animation: rotation 2s linear infinite;
+  -moz-animation: rotation 2s linear infinite;
+  -webkit-animation: rotation 2s linear infinite;
+  -o-animation: rotation 2s linear infinite;
+}
+
+
+@-webkit-keyframes rotation {
+  from {
+    -webkit-transform: rotate(0deg);
+  }
+
+  to {
+    -webkit-transform: rotate(360deg);
+  }
+}
+
+.invite-calling-item-loadimg image {
+  width: 100%;
+  height: 100%;
+}
+
+.invite-calling-item-id {
+  position: absolute;
+  left: 2%;
+  bottom: 2%;
+  font-family: PingFangSC-Regular;
+  font-weight: 400;
+  font-size: 12px;
+  color: #FFFFFF;
+}

+ 39 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall.js

@@ -0,0 +1,39 @@
+import { MEDIA_TYPE } from '../../utils/constants';
+Page({
+  TUICallKit: null,
+  data: {
+    config: {
+    },
+  },
+  async onLoad(option) {
+    const config = JSON.parse(option.configData);
+    this.setData(
+      {
+        config: { ...this.data.config, ...config },
+      },
+      async () => {
+        this.TUICallKit = this.selectComponent('#TUICallKit-component');
+        try {
+          await this.TUICallKit.init(config);
+          const event = JSON.parse(option.data);
+          wx.$TUICallEngine.setPusherAttributesHandler({
+            enableCamera: event.data.inviteData.callType === MEDIA_TYPE.VIDEO,
+          });
+          wx.$TUICallEngine.TRTCCallingDelegate.onInvited(event.data);
+          wx.createLivePusherContext().startPreview();
+        } catch (error) {
+          console.error(error);
+        }
+      },
+    );
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+    this.TUICallKit.destroyed();
+  },
+
+  onShow() {},
+});

+ 8 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall.json

@@ -0,0 +1,8 @@
+{
+    "usingComponents": {
+      "TUICallKit": "../../TUICallKit"
+    },
+    "navigationStyle": "custom",
+    "disableScroll": true
+  }
+  

+ 5 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall.wxml

@@ -0,0 +1,5 @@
+<view class="">
+    <TUICallKit
+    id="TUICallKit-component"
+  ></TUICallKit>
+</view>

+ 0 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall.wxss


+ 30 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/pages/globalCall/globalCall_uni.vue

@@ -0,0 +1,30 @@
+<template>
+    <tuicallkit ref="TUICallKit"></tuicallkit>
+</template>
+
+<script>
+import { MEDIA_TYPE } from '../../utils/constants';
+export default {
+    onLoad(option) {
+        const config = JSON.parse(option.configData);
+        this.$nextTick(async () => {
+           await this.$refs.TUICallKit.init(config);
+           const event = JSON.parse(option.data);
+           wx.$TUICallEngine.setPusherAttributesHandler({
+            enableCamera: event.data.inviteData.callType === MEDIA_TYPE.VIDEO,
+          });
+           wx.$TUICallEngine.TRTCCallingDelegate.onInvited(event.data);
+           wx.createLivePusherContext().startPreview();
+        })
+    },
+    created() {
+
+    },
+    onUnload() {
+        this.$refs.TUICallKit.destroyed();
+    },
+}
+</script>
+
+<style>
+</style>

+ 49 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/serve/bellContext.js

@@ -0,0 +1,49 @@
+import { PREFIX } from '../TUICallKit';
+export class BellContext {
+  constructor() {
+    this.context = wx.createInnerAudioContext();
+    this.context.loop = true;
+    this.context.onError((res) => {
+      this.handleError(res.errCode);
+    });
+  }
+  setBellSrc(filePath) {
+    const fs = wx.getFileSystemManager();
+    try {
+      fs.readFileSync(filePath, 'utf8', 0);
+    } catch (e) {
+      console.warn(`${PREFIX}-setCallingBell: 媒体铃声路径错误`, filePath);
+    }
+    this.context.src = filePath;
+  }
+  play() {
+    this.context.play();
+  }
+  stop() {
+    this.context.stop();
+  }
+  handleError(code) {
+    let errMsg = '';
+    switch (code) {
+      case 10001:
+        errMsg = '系统错误';
+        break;
+      case 10002:
+        errMsg = '网络错误';
+        break;
+      case 10003:
+        errMsg = '文件错误';
+        break;
+      case 10004:
+        errMsg = '格式错误';
+        break;
+      default:
+        errMsg = '未知错误';
+        break;
+    }
+    console.warn(`${PREFIX}-setCallingBell: 媒体铃声${errMsg}`);
+  }
+  destroyInstance() {
+    this.context.destroy();
+  }
+}

+ 143 - 0
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/serve/callManager.js

@@ -0,0 +1,143 @@
+import TIM from 'tim-wx-sdk';
+import TUICallEngine, { EVENT } from 'tuicall-engine-wx';
+
+/**
+ * @param {Number} sdkAppID      用户的sdkAppID           必传
+ * @param {String} userID        用户的userID             必传
+ * @param {String} userSig       用户的userSig            必传
+ * @param {String} globalCallPagePath  跳转的路径                必传
+ * @param {ChatSDK} tim           tim实例                 非必传
+ */
+const PREFIX = 'callManager';
+export class CallManager {
+  sdkAppID = 0;
+  userID = '';
+  userSig = '';
+  tim = null;
+  globalCallPagePath = '';
+  currentListenStatus  = false;
+  async init(params) {
+    if (wx.$globalCallSign) return;
+    const { sdkAppID, SDKAppID, userID, tim, globalCallPagePath, userSig } = params;
+    this.sdkAppID = sdkAppID || SDKAppID;
+    this.userID = userID;
+    this.userSig = userSig;
+    this.globalCallPagePath = globalCallPagePath;
+    this.tim = tim;
+    // 挂载全局变量
+    wx.$globalCallSign = true;
+    // 设置标志位 用于移除监听
+    wx.$CallManagerInstance = this;
+    if (!this.tim) {
+      this.tim = TIM.create({
+        SDKAppID: this.sdkAppID,
+      });
+    }
+    // 创建 TUICallEngine 实例
+    wx.$TUICallEngine = TUICallEngine.createInstance({
+      sdkAppID: this.sdkAppID,
+      tim: this.tim,
+    });
+    // 调用 init 方法
+    try {
+      await wx.$TUICallEngine.init({
+        userID: this.userID,
+        userSig: this.userSig,
+      });
+      // 监听 TUICallEngine 内部的 TSignaling 事件
+      this.addEngineInvite();
+    } catch (error) {
+      wx.$globalCallSign = false;
+      wx.$CallManagerInstance = null;
+    }
+    console.log(`${PREFIX} init Ready!`);
+  };
+
+  addEngineInvite() {
+    if (this.currentListenStatus) return;
+    this.currentListenStatus = true;
+    wx.$TUICallEngine.on(EVENT.INVITED, this.handleNewInvitationReceived, this);
+  };
+
+  addEngineCallEnd() {
+    // 通话被取消
+    wx.$TUICallEngine.on(EVENT.CALLING_CANCEL, this.handleCallEnd, this);
+    // 通话结束
+    wx.$TUICallEngine.on(EVENT.CALL_END, this.handleCallEnd, this);
+  }
+
+  removeEngineInvite() {
+    this.currentListenStatus = false;
+    wx.$TUICallEngine.off(EVENT.INVITED, this.handleNewInvitationReceived, this);
+    this.removeEngineCallEnd();
+  }
+
+  removeEngineCallEnd() {
+    // 若当前已在globalCall页面 则无需处理
+    if (this.getRoute().route === this.globalCallPagePath) {
+      return;
+    }
+    // 通话被取消
+    wx.$TUICallEngine.off(EVENT.CALLING_CANCEL, this.handleCallEnd, this);
+    // 通话结束
+    wx.$TUICallEngine.off(EVENT.CALL_END, this.handleCallEnd, this);
+  }
+
+
+  handleNewInvitationReceived(event) {
+    // 若当前已在globalCall页面 则无需处理
+    if (this.getRoute().route === this.globalCallPagePath) {
+      return;
+    }
+
+    // 监听 TUICallEngine 自身的通话结束事件
+    this.addEngineCallEnd();
+    const configData = {
+      sdkAppID: this.sdkAppID,
+      userID: this.userID,
+      userSig: this.userSig,
+    };
+    wx.navigateTo({
+      url: `/${this.globalCallPagePath}?data=${JSON.stringify(event)}&configData=${JSON.stringify(configData)}`,
+    });
+  };
+
+  handleCallEnd() {
+    wx.$TUICallEngine._resetTUICallEngine();
+    wx.navigateBack({
+      success: () => {
+      },
+      fail: () => {
+      },
+      complete: () => {
+        wx.$TUICallEngine.off(EVENT.CALLING_CANCEL, this.handleCallEnd, this);
+        wx.$TUICallEngine.off(EVENT.CALL_END, this.handleCallEnd, this);
+      },
+    });
+  }
+
+  // 获取当前的页面地址
+  getRoute() {
+    const pages = getCurrentPages();
+    const currentPage = pages[pages.length - 1];
+    return currentPage;
+  }
+
+  // 卸载 callManger
+  async destroyed() {
+    this.removeEngineInvite();
+    this.reset();
+    await wx.$TUICallEngine.destroyInstance();
+    wx.$globalCallSign = false;
+    wx.$TUICallEngine = null;
+  }
+  reset() {
+    this.sdkAppID = 0;
+    this.userID = '';
+    this.userSig = '';
+    this.tim = null;
+    this.globalCallPagePath = '';
+  }
+};
+
+

BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/audio-false.png


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/audio-true.png


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/camera-false.png


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/camera-true.png


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/default_avatar.png


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/dialing.png


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/hangup.png


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/loading.png


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/phone_dialing.mp3


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/phone_ringing.mp3


BIN
unpackage/dist/dev/mp-weixin/node_modules/@tencentcloud/call-uikit-wechat/TUICallKit/static/speaker-false.png


Някои файлове не бяха показани, защото твърде много файлове са промени