shareDetail.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <template>
  2. <div>
  3. <el-form :model="form" ref="form" class="form">
  4. <el-form-item label="分享对象" v-if="row.os !== 'mobile'">
  5. <el-radio-group v-model="form.shareTarget" @change="changeShareTarget">
  6. <el-radio v-model="form.shareTarget" label="1">主讲人</el-radio>
  7. <el-radio v-model="form.shareTarget" label="2">学员</el-radio>
  8. </el-radio-group>
  9. </el-form-item>
  10. <el-form-item label="分享方式" v-if="form.shareTarget == 2">
  11. <el-radio v-model="form.shareType" label="1">链接分享</el-radio>
  12. <el-radio v-model="form.shareType" label="2">二维码分享</el-radio>
  13. <el-radio v-model="form.shareType" label="3">群聊分享</el-radio>
  14. </el-form-item>
  15. </el-form>
  16. <div>
  17. <div class="linkWrap" v-if="form.shareType == 1">
  18. <div class="shareWrap">
  19. <h2>乐团老师邀请您参与直播课!</h2>
  20. <h4>{{ row.roomTitle }}</h4>
  21. <p v-if="form.shareTarget != 1">主讲人:{{ row.speakerName }}</p>
  22. <p>开播时间:{{ row.liveStartTime }}</p>
  23. <p>直播内容:{{ row.liveRemark }}</p>
  24. <!-- 为1是主讲人的 -->
  25. <p v-if="form.shareTarget == 1">直播地址:{{ Teacherurl }}</p>
  26. <p v-else>直播地址:{{ url }}</p>
  27. <p v-if="form.shareTarget == 1">
  28. 请在电脑浏览器中打开以上链接进行直播
  29. </p>
  30. </div>
  31. <div
  32. class="shareBtn shareText"
  33. :class="row.liveState == 2 ? 'disabled' : ''"
  34. data-clipboard-action="copy"
  35. data-clipboard-target=".shareBtn"
  36. @click="copyText"
  37. >
  38. 复制分享内容
  39. </div>
  40. </div>
  41. <div class="codeWrap" v-if="form.shareType == 2">
  42. <div class="shareWrap">
  43. <preview :form="row" id="preview" :url="url" />
  44. </div>
  45. <div
  46. class="shareBtn"
  47. :class="row.liveState == 2 ? 'disabled' : ''"
  48. @click="shareImage"
  49. >
  50. 下载图片
  51. </div>
  52. </div>
  53. <div class="groupWrap" v-if="form.shareType == 3">
  54. <!-- im分享 -->
  55. <groupChat ref="groupChat" />
  56. <div
  57. class="shareBtn"
  58. :class="row.liveState == 2 ? 'disabled' : ''"
  59. @click="shareChat"
  60. >
  61. 发送分享信息
  62. </div>
  63. </div>
  64. </div>
  65. </div>
  66. </template>
  67. <script>
  68. import { toPng } from "html-to-image";
  69. // import copy from "copy-to-clipboard";
  70. import Clipboard from "clipboard";
  71. import preview from "./preview";
  72. import groupChat from "./groupChat";
  73. import { shareGroup } from "../api";
  74. import { vaildStudentUrl } from "@/utils/validate";
  75. export default {
  76. props: ["row"],
  77. components: { preview, groupChat },
  78. data() {
  79. return {
  80. form: {
  81. shareTarget: "1",
  82. shareType: "1"
  83. },
  84. content: "",
  85. url: "",
  86. Teacherurl: "",
  87. clipboard: null
  88. };
  89. },
  90. mounted() {
  91. this.url =
  92. vaildStudentUrl() + `/#/liveClassTransfer?roomUid=${this.row.roomUid}`;
  93. let domain = window.location.origin;
  94. this.Teacherurl = domain
  95. ? domain + `/live/?roomUid=${this.row.roomUid}`
  96. : "https://test.dayaedu.com" + `/live/?roomUid=${this.row.roomUid}`;
  97. // this.copyText()
  98. // 判断一下
  99. if (this.row.os == "mobile") {
  100. console.log("设置学员观看");
  101. this.form.shareTarget = "2";
  102. } else {
  103. this.form.shareTarget = "1";
  104. }
  105. },
  106. methods: {
  107. copyText(e) {
  108. if (this.row.liveState == 2) {
  109. return;
  110. }
  111. let text = "";
  112. if (this.form.shareTarget == 1) {
  113. text = `乐团老师邀请您参与直播课!\n${this.row.roomTitle ||
  114. ""}\n开播时间:${this.row.liveStartTime || ""}\n直播内容:${this.row
  115. .liveRemark || ""}\n直播地址:${
  116. this.Teacherurl
  117. }\n请在电脑浏览器中打开以上链接进行直播`;
  118. } else {
  119. text = `乐团老师邀请您参与直播课!\n${this.row.roomTitle ||
  120. ""}\n主讲人:${this.row.speakerName}\n开播时间:${this.row
  121. .liveStartTime || ""}\n直播内容:${this.row.liveRemark ||
  122. ""}\n直播地址:${this.url}\n`;
  123. }
  124. var clipboard = new Clipboard(".shareText", {
  125. text: function(trigger) {
  126. // console.log(trigger,text)
  127. return text;
  128. }
  129. });
  130. clipboard.on("success", e => {
  131. this.$message.success("复制成功");
  132. this.$emit("close");
  133. // 释放内存
  134. clipboard.destroy();
  135. });
  136. clipboard.on("error", e => {
  137. // 不支持复制
  138. console.log("该浏览器不支持自动复制");
  139. // 释放内存
  140. clipboard.destroy();
  141. });
  142. // if (text) {
  143. // console.log(clipboard)
  144. // clipboard.on("success", function (e) {
  145. // console.info("Action:", e.action);
  146. // console.info("Text:", e.text);
  147. // console.info("Trigger:", e.trigger);
  148. // this.$message.success("复制成功");
  149. // this.$emit("close");
  150. // e.clearSelection();
  151. // });
  152. // }
  153. // return text
  154. },
  155. shareImage() {
  156. if (this.row.liveState == 2) {
  157. return;
  158. }
  159. var node = document.getElementById("preview");
  160. toPng(node)
  161. .then(dataUrl => {
  162. var img = new Image();
  163. img.src = dataUrl;
  164. // 在这里下载
  165. let link = document.createElement("a");
  166. let fname = this.row.roomTitle || "分享图片文件.png"; //下载文件的名字
  167. link.href = dataUrl;
  168. link.setAttribute("download", fname);
  169. document.body.appendChild(link);
  170. link.click();
  171. this.$emit("close");
  172. })
  173. .catch(function(error) {
  174. console.error("oops, something went wrong!", error);
  175. });
  176. },
  177. async shareChat() {
  178. if (this.row.liveState == 2) {
  179. return;
  180. }
  181. let checkList = this.$refs.groupChat.checkList;
  182. if (!(checkList.length > 0)) {
  183. this.$message.error("请至少选择一个群聊");
  184. return;
  185. }
  186. try {
  187. let obj = {
  188. groupIds: checkList.join(","),
  189. roomUid: this.row.roomUid
  190. };
  191. const res = await shareGroup(obj);
  192. this.$message.success("分享成功");
  193. this.$emit("close");
  194. } catch (e) {
  195. console.log(e);
  196. }
  197. },
  198. changeShareTarget(val) {
  199. if (val == 2) {
  200. this.form.shareType = "1";
  201. }
  202. if (val == 1) {
  203. this.form.shareType = "1";
  204. }
  205. }
  206. }
  207. };
  208. </script>
  209. <style lang="scss" scoped>
  210. .shareWrap {
  211. background: #f9f9f9;
  212. padding: 16px;
  213. h2 {
  214. font-size: 18px;
  215. font-family: PingFangSC-Semibold, PingFang SC;
  216. font-weight: 600;
  217. color: #333333;
  218. line-height: 25px;
  219. margin-bottom: 18px;
  220. }
  221. h4 {
  222. font-size: 16px;
  223. font-family: PingFangSC-Medium, PingFang SC;
  224. font-weight: 500;
  225. color: #333333;
  226. line-height: 28px;
  227. }
  228. p {
  229. font-size: 16px;
  230. font-family: PingFangSC-Medium, PingFang SC;
  231. font-weight: 500;
  232. color: #333333;
  233. line-height: 30px;
  234. }
  235. }
  236. .shareBtn {
  237. height: 48px;
  238. background: var(--color-primary);
  239. border-radius: 32px;
  240. width: 192px;
  241. color: #fff;
  242. margin: 24px auto 0;
  243. text-align: center;
  244. line-height: 48px;
  245. font-size: 20px;
  246. cursor: pointer;
  247. &.disabled {
  248. background: #80d3ce;
  249. border-color: #80d3ce;
  250. color: #fff;
  251. cursor: not-allowed;
  252. }
  253. }
  254. </style>