SharePopup.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. <template>
  2. <div class="share-popup">
  3. <van-popup
  4. v-model="show"
  5. :close-on-click-overlay="false"
  6. >
  7. <div class="share-wrap">
  8. <div class="top-raduis bg-whiter">
  9. <!-- 用户信息 -->
  10. <div class="userinfo-wrap pl-4 pr-4 pt-4 pb-4">
  11. <img class="avatar mr-1" src="~assets/image/activity/invite-user/invite-new-user/avatar.png" alt="">
  12. <div class="userinfo-text ml-1">
  13. <div class="userinfo-name">{{ nickname }}</div>
  14. <div class="userinfo-describe">邀请您使用云手机</div>
  15. </div>
  16. </div>
  17. </div>
  18. <!-- 二维码区域 -->
  19. <div class="qrcode-container bg-whiter pl-6 pr-6 pt-6 pb-6">
  20. <div class="qrcode-img">
  21. <div class="qrcode">
  22. <vue-qr
  23. ref="qrcode"
  24. :text="qrText"
  25. :size="size"
  26. :margin="10"
  27. colorDark="#000"
  28. colorLight="#fff"
  29. :logoSrc="logoSrc"
  30. :logoScale="0.2"
  31. :dotScale="0.7"
  32. />
  33. </div>
  34. </div>
  35. </div>
  36. <!-- <div class="arc tips-text bg-whiter">使用微信扫码注册云手机</div> -->
  37. <!-- <div class="btm-raduis bg-whiter pt-6 mb-6"></div> -->
  38. <div class="btm-raduis tips-text bg-whiter pb-6 pt-1 mb-6">使用微信扫码注册云手机</div>
  39. <div class="share-btn-wrap">
  40. <div class="operate-wrap">
  41. <div class="copy-link" @click="copyCode">复制链接</div>
  42. <div class="save-img" @click="saveImg">保存图片</div>
  43. </div>
  44. <div class="close-wrap mt-5">
  45. <span @click="onClose" class="cancel-btn">取消分享</span>
  46. </div>
  47. </div>
  48. </div>
  49. </van-popup>
  50. </div>
  51. </template>
  52. <script>
  53. import vueQr from 'vue-qr/src/packages/vue-qr.vue';
  54. export default {
  55. name: 'SharePopup',
  56. props: {
  57. nickname: {
  58. type: String,
  59. default: ''
  60. },
  61. qrText: {
  62. type: String,
  63. default: ''
  64. },
  65. logoSrc: {
  66. type: String,
  67. default: ''
  68. },
  69. size: {
  70. type: Number,
  71. default: 190
  72. },
  73. },
  74. components: {
  75. vueQr
  76. },
  77. data() {
  78. return {
  79. show: false,
  80. };
  81. },
  82. computed: {
  83. // 是否是ios环境
  84. isIos() {
  85. return this.$userAgent.isIos;
  86. },
  87. // 是否是安卓环境
  88. isAndroid() {
  89. return this.$userAgent.isAndroid;
  90. },
  91. // 是否是App环境
  92. isApp() {
  93. return this.$userAgent.isSzx || this.$userAgent.isSzxBrowser;
  94. }
  95. },
  96. methods: {
  97. showPopup() {
  98. this.show = true;
  99. },
  100. onClose() {
  101. this.show = false;
  102. },
  103. async copyCode() {
  104. try {
  105. await this.$native.clipboard.writeText(this.qrText || '复制的连接为空');
  106. this.$toast.success('复制成功');
  107. this.onClose();
  108. } catch (error) {
  109. console.log(error)
  110. }
  111. },
  112. async saveImg() {
  113. console.log(this.$userAgent)
  114. // http://192.168.0.101:3000/h5/activity/invite-user/invite-new-user/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyYW5kb20iOiIyMjg4MiIsImNsaWVudCI6IjciLCJ1c2VyVHlwZSI6IjIiLCJtZXJjaGFudFNpZ24iOiJTWlgiLCJleHAiOjE3NDcyNjEwNjAsInVzZXJuYW1lIjoiMEVzSDAxNjY2MTc1NTMwU1pYIn0.0s0DI-hf_pFhgQUOQIueUAjzJ34WTv-XQLv0qBaYC1k
  115. try {
  116. const img = this.$refs.qrcode.$el;
  117. const base64Data = img.src; // 获取图片的base64数据
  118. if(this.isApp && this.isIos) {
  119. window.webkit.messageHandlers.picture.postMessage(base64Data);
  120. }else if(this.isApp && this.isAndroid) {
  121. window.native.saveImg(base64Data);
  122. }else {
  123. // h5 保存图片
  124. // 创建Blob对象
  125. const byteString = atob(base64Data.split(',')[1]);
  126. const mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0];
  127. const ab = new ArrayBuffer(byteString.length);
  128. const ia = new Uint8Array(ab);
  129. for (let i = 0; i < byteString.length; i++) {
  130. ia[i] = byteString.charCodeAt(i);
  131. }
  132. const blob = new Blob([ab], { type: mimeString });
  133. // 创建下载链接
  134. const url = window.URL.createObjectURL(blob);
  135. const a = document.createElement('a');
  136. a.style.display = 'none';
  137. a.href = url;
  138. // 设置下载的文件名
  139. a.download = '1.png';
  140. document.body.appendChild(a);
  141. a.click();
  142. // 清理
  143. window.URL.revokeObjectURL(url);
  144. document.body.removeChild(a);
  145. this.onClose();
  146. }
  147. } catch (error) {
  148. console.log(error)
  149. }
  150. }
  151. },
  152. /* 示例参照代码
  153. downloadFile (url) {
  154. Toast.clear()
  155. if (this.isiOS) {
  156. try {
  157. window.webkit.messageHandlers.picture.postMessage(url)
  158. } catch (error) {
  159. console.log(error)
  160. }
  161. }
  162. if (this.isAndroid) {
  163. try {
  164. window.native.saveImg(url)
  165. } catch (error) {
  166. console.log(error)
  167. }
  168. }
  169. },
  170. downloadFileByBase64 (base64) {
  171. this.downloadFile(base64)
  172. switch (this.current) {
  173. case 0:
  174. this.makePoint('si_game_script_images');
  175. break
  176. case 1:
  177. this.makePoint('si_crack_resource_images');
  178. break
  179. case 2:
  180. this.makePoint('si_location_service_images');
  181. break
  182. case 3:
  183. this.makePoint('si_entertainment_images');
  184. break
  185. case 4: this.makePoint('si_game_images');
  186. break
  187. }
  188. },
  189. */
  190. }
  191. </script>
  192. <style lang="scss" scoped>
  193. .bg-whiter{
  194. background-color: #fff;
  195. }
  196. .share-popup ::v-deep .van-popup {
  197. background-color: transparent;
  198. width: 290px;
  199. }
  200. .top-raduis{
  201. border-top-left-radius: 8px;
  202. border-top-right-radius: 8px;
  203. }
  204. .btm-raduis{
  205. border-bottom-left-radius: 8px;
  206. border-bottom-right-radius: 8px;
  207. }
  208. .arc{
  209. overflow: hidden;
  210. display: flex;
  211. position: relative;
  212. flex-wrap: nowrap;
  213. justify-content: center;
  214. align-items: center;
  215. &::before,&::after{
  216. content: "";
  217. position: absolute;
  218. display: block;
  219. width: 22px;
  220. height: 22px;
  221. background-color: #171611;
  222. border-radius: 50%;
  223. }
  224. &::before{
  225. left: 0;
  226. -webkit-transform: translateX(-50%);
  227. transform: translateX(-50%);
  228. }
  229. &::after{
  230. right: 0;
  231. -webkit-transform: translateX(50%);
  232. transform: translateX(50%);
  233. }
  234. }
  235. .userinfo-wrap{
  236. display: flex;
  237. background-image: url('~/assets/image/activity/invite-user/invite-new-user/share-popup-bg.png');
  238. background-size: 100% 100%;
  239. background-repeat: no-repeat;
  240. background-position: center;
  241. background-origin: padding-box;
  242. .avatar{
  243. flex: 0 0 40px;
  244. width: 40px;
  245. height: 40px;
  246. border-radius: 50%;
  247. background-color: #fff;
  248. }
  249. .userinfo-text{
  250. .userinfo-name{
  251. font-size: 14px;
  252. color: #242424;
  253. }
  254. .userinfo-describe{
  255. color: #979797;
  256. }
  257. }
  258. }
  259. .qrcode-container{
  260. display: flex;
  261. justify-content: center;
  262. align-items: center;
  263. .qrcode-img{
  264. .qrcode{
  265. display: flex;
  266. width: 190px;
  267. height: 190px;
  268. }
  269. }
  270. }
  271. .tips-text{
  272. font-weight: 600;
  273. font-size: 16px;
  274. color: #0A132B;
  275. text-align: center;
  276. }
  277. .share-btn-wrap{
  278. .operate-wrap{
  279. display: flex;
  280. justify-content: space-around;
  281. align-items: center;
  282. .copy-link, .save-img{
  283. width: 113px;
  284. flex: 0 0 113px;
  285. font-weight: 400;
  286. font-size: 16px;
  287. line-height: 36px;
  288. text-align: center;
  289. border-radius: 18px;
  290. position: relative;
  291. }
  292. .copy-link{
  293. color: #0A132B;
  294. background-color: #fff;
  295. &::before{
  296. position: absolute;
  297. top: 50%;
  298. left: 50%;
  299. width: 100%;
  300. height: 100%;
  301. background-color: #000;
  302. border: inherit;
  303. border-color: #000;
  304. border-radius: inherit;
  305. -webkit-transform: translate(-50%, -50%);
  306. transform: translate(-50%, -50%);
  307. opacity: 0;
  308. content: ' ';
  309. }
  310. &:active::before{
  311. opacity: .1;
  312. }
  313. }
  314. .save-img{
  315. background-color: #3370FF;
  316. color: #fff;
  317. &::before{
  318. position: absolute;
  319. top: 50%;
  320. left: 50%;
  321. width: 100%;
  322. height: 100%;
  323. background-color: #000;
  324. border: inherit;
  325. border-color: #000;
  326. border-radius: inherit;
  327. -webkit-transform: translate(-50%, -50%);
  328. transform: translate(-50%, -50%);
  329. opacity: 0;
  330. content: ' ';
  331. }
  332. &:active::before{
  333. opacity: .1;
  334. }
  335. }
  336. }
  337. .close-wrap{
  338. display: flex;
  339. justify-content: center;
  340. align-items: center;
  341. .cancel-btn{
  342. display: inline-block;
  343. font-weight: 400;
  344. font-size: 14px;
  345. color: #FFF;
  346. line-height: 26px;
  347. }
  348. }
  349. }
  350. </style>