zbDetails.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. const tools = require('../../utils/tools.js');
  2. const getusersig = require('../../utils/getUserSig.js');
  3. const TIM = require('../../utils/tim-wx.js');
  4. const COS = require('../../utils/cos-wx-v5.js');
  5. const util = require('../../utils/util.js');
  6. Page({
  7. data: {
  8. rtcConfig: {
  9. sdkAppID: 1400404379, // 必要参数 开通实时音视频服务创建应用后分配的 sdkAppID
  10. userID: '', // 必要参数 用户 ID 可以由您的帐号系统指定
  11. userSig: '', // 必要参数 身份签名,相当于登录密码的作用
  12. template: '1v1', // 必要参数 组件模版,支持的值 1v1 grid custom ,注意:不支持动态修改, iOS 不支持 pusher 动态渲染
  13. },
  14. roomIdandcourseId: "",
  15. currentGroup: null,
  16. chatContent: [],
  17. inputValue: '',
  18. // second: 5,
  19. showmodal: false,
  20. bottom: "", //滑到底状态 防止弹出消息不跳到最后一条
  21. talkStatus: true, //初始值为true
  22. onSdkReady: function (event) {
  23. let _this = this;
  24. console.log(event, "im准备好了")
  25. let promise = _this.data.tim.getGroupList();
  26. console.log(promise, "我获取到promise的值了")
  27. promise.then((imResponse) => {
  28. console.log(imResponse.data.groupList, "我是群组列表"); // 群组列表
  29. if (imResponse.data.groupList.length == 0) {
  30. let promise = _this.data.tim.joinGroup({
  31. groupID: _this.data.roomIdandcourseId,
  32. type: TIM.TYPES.GRP_MEETING
  33. });
  34. promise.then((imResponse) => {
  35. switch (imResponse.data.status) {
  36. case TIM.TYPES.JOIN_STATUS_WAIT_APPROVAL:
  37. console.log(_this.data.currentGroup, "等待管理员同意")
  38. break;
  39. case TIM.TYPES.JOIN_STATUS_SUCCESS: // 加群成功
  40. _this.setData({
  41. currentGroup: imResponse.data.group
  42. })
  43. _this.getjyList(imResponse.data.group)
  44. console.log(_this.data.currentGroup, "加群成功") // 加入的群组资料
  45. break;
  46. case TIM.TYPES.JOIN_STATUS_ALREADY_IN_GROUP: // 已经在群中
  47. console.log(imResponse, "已经在群中")
  48. break;
  49. default:
  50. break;
  51. }
  52. }).catch(function (imError) {
  53. console.warn('申请加群失败的相关信息', imError); // 申请加群失败的相关信息
  54. });
  55. } else {
  56. for (let i = 0; i < imResponse.data.groupList.length; i++) {
  57. if (imResponse.data.groupList[i].groupID == _this.data.roomIdandcourseId) {
  58. // console.log(imResponse.data.groupList[i])
  59. // let pushArr = this.data.currentGroup.push(imResponse.data.groupList[i])
  60. // console.log(pushArr, "我是push完的东西")
  61. _this.setData({
  62. currentGroup: imResponse.data.groupList[i]
  63. })
  64. _this.getjyList(imResponse.data.groupList[i])
  65. }
  66. if (_this.data.currentGroup == null) {
  67. let promise = _this.data.tim.joinGroup({
  68. groupID: _this.data.roomIdandcourseId,
  69. type: TIM.TYPES.GRP_MEETING
  70. });
  71. promise.then((imResponse) => {
  72. switch (imResponse.data.status) {
  73. case TIM.TYPES.JOIN_STATUS_WAIT_APPROVAL:
  74. break; // 等待管理员同意
  75. case TIM.TYPES.JOIN_STATUS_SUCCESS: // 加群成功
  76. console.log(imResponse.data.group, "加群成功"); // 加入的群组资料
  77. break;
  78. case TIM.TYPES.JOIN_STATUS_ALREADY_IN_GROUP: // 已经在群中
  79. break;
  80. default:
  81. break;
  82. }
  83. _this.setData({
  84. currentGroup: imResponse.data.group
  85. })
  86. _this.getjyList(imResponse.data.group)
  87. console.log(_this.data.currentGroup, "0000000000000000")
  88. }).catch(function (imError) {
  89. console.warn('申请加群失败的相关信息', imError); // 申请加群失败的相关信息
  90. });
  91. }
  92. }
  93. }
  94. }).catch(function (imError) {
  95. console.log(imError, "获取群组列表失败的相关信息"); // 获取群组列表失败的相关信息
  96. });
  97. //修改成员名字
  98. let promise1 = _this.data.tim.updateMyProfile({
  99. nick: _this.data.miniName
  100. });
  101. promise1.then(function (imResponse) {
  102. console.log(imResponse.data, "更新资料成功"); // 群组列表
  103. }).catch(function (imError) {
  104. console.log(imError, "更新资料失败"); // 获取群组列表失败的相关信息
  105. });
  106. },
  107. onSdkRecived: function (event) {
  108. let _this = this;
  109. console.log(event.data[0], "我收到消息了")
  110. if (event.data[0].conversationType == "GROUP" && event.data[0].to == _this.data.currentGroup.groupID) {
  111. console.log("我找到这个会话了", _this.data.chatContent)
  112. let currentTime = util.formatTime(new Date());
  113. if (_this.data.chatContent.length > 0) { // 表示不是第一次填数据,可以使用push
  114. console.log("表示不是第一次填数据,可以使用push", _this.data.chatContent)
  115. const chatContent = _this.data.chatContent
  116. event.data[0].currentTime = currentTime;
  117. chatContent.push(event.data[0])
  118. // chatContent.push({
  119. // currentTime: currentTime
  120. // })
  121. console.log(chatContent, "我是收到消息的数组")
  122. _this.setData({
  123. chatContent: chatContent,
  124. bottom: 'scrollBottom'
  125. // currentTime: currentTime
  126. })
  127. } else { // 表示第一次填数据
  128. // let currentTime = util.formatTime(new Date());
  129. console.log("表示第一次填数据", _this.data.chatContent)
  130. // const chatContent = _this.data.chatContent
  131. // let Arr = [];
  132. event.data[0].currentTime = currentTime
  133. let chatContent = []
  134. chatContent.push(event.data[0])
  135. // Arr.push(event.data)
  136. // console.log(event.data)
  137. // Arr.push({currentTime:currentTime})
  138. _this.setData({
  139. chatContent: chatContent,
  140. bottom: 'scrollBottom'
  141. // currentTime: currentTime
  142. })
  143. }
  144. }
  145. if (event.data[0].payload.data == "stopLive") {
  146. wx.showModal({
  147. content: "当前直播结束了!",
  148. showCancel: false,
  149. success(res) {
  150. if (res.confirm) {
  151. wx.navigateBack({
  152. delta: 1
  153. })
  154. }
  155. }
  156. })
  157. }
  158. if (event.data[0].payload.data == "putLocalStream") {
  159. _this.trtcRoomContext.publishLocalVideo();
  160. _this.trtcRoomContext.publishLocalAudio();
  161. }
  162. if (event.data[0].payload.data == "stopPutLocalStream") {
  163. _this.trtcRoomContext.unpublishLocalVideo();
  164. _this.trtcRoomContext.unpublishLocalAudio();
  165. }
  166. if (event.data[0].payload.data == "readyPutLocalStream") {
  167. _this.trtcRoomContext.showTeacherTalk();
  168. // _this.setData({
  169. // showmodal: true
  170. // })
  171. // _this.countdown()
  172. }
  173. if (event.data[0].payload.data == "stopTalk") {
  174. _this.setData({
  175. talkStatus: false
  176. })
  177. wx.showToast({
  178. title: '您被老师禁言啦', //提示文字
  179. duration: 3000, //显示时长
  180. mask: true, //是否显示透明蒙层,防止触摸穿透,默认:false
  181. icon: 'none' //图标,支持"success"、"loading"
  182. })
  183. }
  184. if (event.data[0].payload.data == "keepTalk") {
  185. _this.setData({
  186. talkStatus: true
  187. })
  188. wx.showToast({
  189. title: '您的禁言被解除了,可以正常发言啦', //提示文字
  190. duration: 3000, //显示时长
  191. mask: true, //是否显示透明蒙层,防止触摸穿透,默认:false
  192. icon: 'none' //图标,支持"success"、"loading"
  193. })
  194. }
  195. // if (event.data[0].payload.data == "stopTalkList") {
  196. // console.log(event.data[0].payload, "1111111111")
  197. // if (event.data[0].payload.description == "false") {
  198. // _this.setData({
  199. // talkStatus: false
  200. // })
  201. // wx.showToast({
  202. // title: '您被老师禁言啦', //提示文字
  203. // duration: 3000, //显示时长
  204. // mask: true, //是否显示透明蒙层,防止触摸穿透,默认:false
  205. // icon: 'none' //图标,支持"success"、"loading"
  206. // })
  207. // }
  208. // }
  209. }
  210. },
  211. answer() {
  212. // this.setData({
  213. // showmodal: false,
  214. // second: 5
  215. // });
  216. // clearTimeout(this.data.timer);
  217. let _this = this;
  218. let message = _this.data.tim.createCustomMessage({
  219. to: "teacher-" + _this.data.currentGroup.groupID,
  220. conversationType: TIM.TYPES.CONV_C2C,
  221. payload: {
  222. data: 'yesStudentPutHand'
  223. }
  224. });
  225. let promise = _this.data.tim.sendMessage(message);
  226. promise.then(function (imResponse) {
  227. console.log(imResponse, "我给老师发消息说我同意啦");
  228. }).catch(function (imError) {
  229. console.warn('我给老师发消息说我同意失败啦', imError);
  230. });
  231. },
  232. refuse() {
  233. // this.setData({
  234. // showmodal: false,
  235. // second: 5
  236. // });
  237. // clearTimeout(this.data.timer);
  238. let _this = this;
  239. let message = _this.data.tim.createCustomMessage({
  240. to: "teacher-" + _this.data.currentGroup.groupID,
  241. conversationType: TIM.TYPES.CONV_C2C,
  242. payload: {
  243. data: 'notStudentPutHand'
  244. }
  245. });
  246. let promise = _this.data.tim.sendMessage(message);
  247. promise.then(function (imResponse) {
  248. console.log(imResponse, "我给老师发消息说我不同意");
  249. }).catch(function (imError) {
  250. console.warn('我给老师发消息说我不同意失败啦', imError);
  251. });
  252. },
  253. // countdown() {
  254. // var second = this.data.second
  255. // if (second == 0) {
  256. // this.refuse();
  257. // return;
  258. // }
  259. // this.setData({
  260. // timer: setTimeout(() => {
  261. // this.setData({
  262. // second: second - 1
  263. // });
  264. // this.countdown();
  265. // }, 1000)
  266. // })
  267. // },
  268. // 举手
  269. handsup() {
  270. console.log(this.data.currentGroup, "0000000000")
  271. if (this.data.talkStatus) {
  272. let message = this.data.tim.createCustomMessage({
  273. to: "teacher-" + this.data.currentGroup.groupID,
  274. conversationType: TIM.TYPES.CONV_C2C,
  275. payload: {
  276. data: 'studentPutHand'
  277. }
  278. });
  279. let promise = this.data.tim.sendMessage(message);
  280. promise.then(function (imResponse) {
  281. console.log(imResponse);
  282. wx.showToast({
  283. title: '举手成功',
  284. icon: 'success',
  285. duration: 2000,
  286. mask: true
  287. })
  288. }).catch(function (imError) {
  289. console.warn('sendMessage error:', imError);
  290. });
  291. } else {
  292. wx.showToast({
  293. title: '您被老师禁言啦', //提示文字
  294. duration: 3000, //显示时长
  295. mask: true, //是否显示透明蒙层,防止触摸穿透,默认:false
  296. icon: 'none' //图标,支持"success"、"loading"
  297. })
  298. }
  299. },
  300. //发送禁言列表消息
  301. getjyList(e) {
  302. let message = this.data.tim.createCustomMessage({
  303. to: "teacher-" + e.groupID,
  304. conversationType: TIM.TYPES.CONV_C2C,
  305. payload: {
  306. data: 'getStopTalkList'
  307. }
  308. });
  309. let promise = this.data.tim.sendMessage(message);
  310. promise.then(function (imResponse) {
  311. console.log("成功", imResponse);
  312. }).catch(function (imError) {
  313. console.warn('sendMessage error:', imError);
  314. });
  315. },
  316. // 发消息
  317. sendMessage() {
  318. if (this.data.talkStatus) {
  319. if (this.data.inputValue == null || this.data.inputValue == "") {
  320. wx.showModal({
  321. content: "不可以发送空消息哦!",
  322. showCancel: false
  323. })
  324. return false
  325. }
  326. console.log(this.data.currentGroup)
  327. let message = this.data.tim.createTextMessage({
  328. to: this.data.currentGroup.groupID,
  329. conversationType: TIM.TYPES.CONV_GROUP,
  330. priority: TIM.TYPES.MSG_PRIORITY_NORMAL,
  331. payload: {
  332. text: this.data.inputValue
  333. }
  334. });
  335. let promise = this.data.tim.sendMessage(message);
  336. promise.then((imResponse) => {
  337. console.log(imResponse, "发送成功");
  338. let currentTime = util.formatTime(new Date());
  339. console.log(currentTime, "00000")
  340. if (this.data.chatContent.length > 0) { // 表示不是第一次填数据,可以使用push
  341. console.log("表示不是第一次填数据,可以使用push", this.data.chatContent)
  342. const chatContent = this.data.chatContent
  343. chatContent.push({
  344. nick: this.data.miniName,
  345. payload: {
  346. text: this.data.inputValue
  347. },
  348. currentTime: currentTime
  349. })
  350. console.log(chatContent, "11111")
  351. this.setData({
  352. chatContent: chatContent,
  353. bottom: 'scrollBottom'
  354. })
  355. } else { // 表示第一次填数据
  356. console.log("表示第一次填数据", this.data.chatContent)
  357. this.setData({
  358. chatContent: [{
  359. nick: this.data.miniName,
  360. payload: {
  361. text: this.data.inputValue
  362. },
  363. currentTime: currentTime
  364. }],
  365. bottom: 'scrollBottom'
  366. })
  367. console.log(this.data.chatContent, "2222")
  368. }
  369. this.setData({
  370. inputValue: ''
  371. })
  372. }).catch(function (imError) {
  373. console.warn('发送失败', imError);
  374. });
  375. } else {
  376. wx.showToast({
  377. title: '您被老师禁言啦', //提示文字
  378. duration: 3000, //显示时长
  379. mask: true, //是否显示透明蒙层,防止触摸穿透,默认:false
  380. icon: 'none' //图标,支持"success"、"loading"
  381. })
  382. }
  383. },
  384. bindKeyInput: function (e) {
  385. this.setData({
  386. inputValue: e.detail.value
  387. })
  388. },
  389. // 滑动聊天室
  390. scrollToTop() {
  391. this.setAction({
  392. scrollTop: 0
  393. })
  394. },
  395. async onTim() {
  396. this.data.tim.on(TIM.EVENT.SDK_READY, this.data.onSdkReady, this);
  397. this.data.tim.on(TIM.EVENT.MESSAGE_RECEIVED, this.data.onSdkRecived, this);
  398. const sig = await getusersig.genTestUserSig(this.data.rtcConfig.userID, this.data.rtcConfig.sdkAppID, "f1ca85809aed35d82d8bb76612787e38dada5d0a6f233662777b42bdb7eb880b")
  399. let promise = this.data.tim.login({
  400. userID: this.data.rtcConfig.userID,
  401. userSig: sig.userSig
  402. });
  403. promise.then((imResponse) => {
  404. console.log(imResponse.data, "登录成功"); // 登录成功
  405. if (imResponse.data.repeatLogin === true) {
  406. console.log(imResponse.data.errorInfo);
  407. }
  408. }).catch(function (imError) {
  409. console.warn('登录失败的相关信息', imError); // 登录失败的相关信息
  410. });
  411. },
  412. offTim() {
  413. this.data.tim.off(TIM.EVENT.SDK_READY, this.data.onSdkReady);
  414. this.data.tim.off(TIM.EVENT.MESSAGE_RECEIVED, this.data.onSdkRecived);
  415. console.log(this.data.roomIdandcourseId, "我是退出的群组")
  416. this.data.tim.quitGroup(this.data.roomIdandcourseId);
  417. let promise = this.data.tim.logout();
  418. promise.then(function (imResponse) {
  419. console.log(imResponse.data, " 登出成功");
  420. }).catch(function (imError) {
  421. console.warn(' 登出失败:', imError);
  422. });
  423. },
  424. bindTRTCRoomEvent: function () {
  425. console.log(this.data.roomIdandcourseId, typeof (this.data.roomIdandcourseId), "我开始监听了。。。。。")
  426. this.trtcRoomContext.enterRoom({
  427. roomID: Number(this.data.roomIdandcourseId) //课程id
  428. // userID: this.data.rtcConfig.userID
  429. })
  430. const TRTC_EVENT = this.trtcRoomContext.EVENT
  431. this.trtcRoomContext.on(TRTC_EVENT.LOCAL_JOIN, (event) => {
  432. console.log('我加入房间了', event)
  433. })
  434. this.trtcRoomContext.on(TRTC_EVENT.LOCAL_LEAVE, (event) => {
  435. console.log('我离开房间了', event)
  436. })
  437. this.trtcRoomContext.on(TRTC_EVENT.ERROR, (event) => {
  438. console.log('进入房间出错了', event)
  439. })
  440. // 远端用户进入房间
  441. this.trtcRoomContext.on(TRTC_EVENT.REMOTE_USER_JOIN, (event) => {
  442. console.log('远端用户进入房间')
  443. })
  444. // 远端用户退出
  445. this.trtcRoomContext.on(TRTC_EVENT.REMOTE_USER_LEAVE, (event) => {
  446. console.log('远端用户退出')
  447. })
  448. this.trtcRoomContext.on(TRTC_EVENT.REMOTE_AUDIO_ADD, (event) => {
  449. console.log(event, "lalalallalalalalal")
  450. this.trtcRoomContext.subscribeRemoteAudio({
  451. userID: event.data.userID
  452. }).then(() => {
  453. console.log("音频订阅成功")
  454. })
  455. })
  456. // 远端用户取消推送音频
  457. this.trtcRoomContext.on(TRTC_EVENT.REMOTE_AUDIO_REMOVE, (event) => {
  458. this.trtcRoomContext.unsubscribeRemoteAudio({
  459. userID: event.data.userID
  460. }).then(() => {
  461. console.log("音频取消订阅")
  462. })
  463. })
  464. this.trtcRoomContext.on(TRTC_EVENT.REMOTE_VIDEO_ADD, (event) => {
  465. this.trtcRoomContext.subscribeRemoteVideo({
  466. userID: event.data.userID,
  467. streamType: event.data.streamType
  468. }).then(() => {
  469. console.log("远端视频订阅成功")
  470. })
  471. })
  472. this.trtcRoomContext.on(TRTC_EVENT.REMOTE_VIDEO_REMOVE, (event) => {
  473. this.trtcRoomContext.unsubscribeRemoteVideo({
  474. userID: event.data.userID,
  475. streamType: event.data.streamType
  476. }).then(() => {
  477. console.log("远端视频取消订阅")
  478. })
  479. })
  480. },
  481. onLoad(options) {
  482. console.log(options, "99999");
  483. this.setData({
  484. roomIdandcourseId: options.id
  485. })
  486. },
  487. async onShow() {
  488. const sessionKey = await tools.checkSessionAndLogin();
  489. const information = await tools.request('/wx/student/selStudentSessionKeyEcho', {
  490. sessionKey
  491. }, 'POST');
  492. this.setData({
  493. miniName: information.data.data.miniName,
  494. ['rtcConfig.userID']: information.data.data.id.toString()
  495. })
  496. const sig = await getusersig.genTestUserSig(this.data.rtcConfig.userID, this.data.rtcConfig.sdkAppID, "f1ca85809aed35d82d8bb76612787e38dada5d0a6f233662777b42bdb7eb880b")
  497. this.setData({
  498. ['rtcConfig.userSig']: sig.userSig
  499. })
  500. //保持页面常亮
  501. wx.setKeepScreenOn({
  502. keepScreenOn: true,
  503. })
  504. this.trtcRoomContext = this.selectComponent('#trtcroom')
  505. this.bindTRTCRoomEvent()
  506. let option = {
  507. SDKAppID: 1400404379 // 接入时需要将0替换为您的即时通信 IM 应用的 SDKAppID
  508. };
  509. this.setData({
  510. tim: TIM.create(option)
  511. })
  512. this.data.tim.setLogLevel(0); // 普通级别,日志量较多,接入时建议使用
  513. this.data.tim.registerPlugin({
  514. 'cos-wx-sdk': COS
  515. });
  516. this.onTim();
  517. },
  518. onHide() {
  519. console.log("我onhide了")
  520. this.trtcRoomContext.unpublishLocalVideo();
  521. this.trtcRoomContext.unpublishLocalAudio();
  522. this.offTim();
  523. },
  524. onUnload() {
  525. console.log("onUnload")
  526. this.trtcRoomContext.unpublishLocalVideo();
  527. this.trtcRoomContext.unpublishLocalAudio();
  528. this.offTim();
  529. }
  530. })