Commit c0c5718e57c65c0b15eac4e45a9ad25fa26ca231
1 parent
2177fc7a
判断站内点击还是站外点击
Showing
2 changed files
with
622 additions
and
448 deletions
src/pages/common/common.vue
| 1 | <template> | 1 | <template> |
| 2 | <div class="common"> | 2 | <div class="common"> |
| 3 | 3 | ||
| 4 | - <!-- iOS QQ内 & Android WeChat内无法唤起APP,提示用Safari或浏览器打开蒙层 --> | ||
| 5 | - <mask-layer ref="maskLayer" | ||
| 6 | - :maskLayers="maskLayers"> | ||
| 7 | - </mask-layer> | ||
| 8 | - | ||
| 9 | - <!-- showModal --> | ||
| 10 | - <show-modal | ||
| 11 | - :options="showModals"> | ||
| 12 | - </show-modal> | ||
| 13 | - | ||
| 14 | - <router-view></router-view> | 4 | + <!-- iOS QQ内 & Android WeChat内无法唤起APP,提示用Safari或浏览器打开蒙层 --> |
| 5 | + <mask-layer ref="maskLayer" | ||
| 6 | + :maskLayers="maskLayers"> | ||
| 7 | + </mask-layer> | ||
| 8 | + | ||
| 9 | + <!-- 通用弹窗 --> | ||
| 10 | + <show-modal ref="showModal" | ||
| 11 | + :options="showOptions"> | ||
| 12 | + </show-modal> | ||
| 13 | + | ||
| 14 | + <!-- 唤起APP弹窗 --> | ||
| 15 | + <show-modal ref="callAppModal" | ||
| 16 | + :options="callAppModals"> | ||
| 17 | + </show-modal> | ||
| 18 | + | ||
| 19 | + <router-view ref="childCommon"></router-view> | ||
| 15 | </div> | 20 | </div> |
| 16 | </template> | 21 | </template> |
| 17 | 22 | ||
| @@ -19,10 +24,11 @@ | @@ -19,10 +24,11 @@ | ||
| 19 | 24 | ||
| 20 | // 引入组件 | 25 | // 引入组件 |
| 21 | import Helper from "@/common/helper.class"; | 26 | import Helper from "@/common/helper.class"; |
| 22 | - import maskLayer from "@/components/maskLayer/maskLayer"; | ||
| 23 | - import showModal from "@/components/showModal/showModal"; | ||
| 24 | - // 引入组件 | ||
| 25 | - import { Toast, Indicator } from 'mint-ui'; | 27 | + // 读取文件属性 |
| 28 | + import Exif from 'exif-js'; | ||
| 29 | + import maskLayer from "@/components/maskLayer/maskLayer"; | ||
| 30 | + import showModal from "@/components/showModal/showModal"; | ||
| 31 | + import {Toast, Indicator } from 'mint-ui'; | ||
| 26 | export default { | 32 | export default { |
| 27 | name: "common", | 33 | name: "common", |
| 28 | data () { | 34 | data () { |
| @@ -30,21 +36,31 @@ | @@ -30,21 +36,31 @@ | ||
| 30 | top: { | 36 | top: { |
| 31 | value: 0 | 37 | value: 0 |
| 32 | }, | 38 | }, |
| 33 | - helper: null, | ||
| 34 | - appShareParams: null, | 39 | + helper: null, |
| 40 | + appShareParams: null, | ||
| 35 | schemeParams: null, | 41 | schemeParams: null, |
| 36 | callApps: null, | 42 | callApps: null, |
| 37 | - maskLayers: null, | ||
| 38 | - showModals: null | 43 | + maskLayers: null, |
| 44 | + callAppModals: null, | ||
| 45 | + modals: null, | ||
| 46 | + showOptions: null, | ||
| 47 | + /* 上传图片参数开始 开始 */ | ||
| 48 | + files: { | ||
| 49 | + name: "", // 图片名字 | ||
| 50 | + type: "" // 图片类型 | ||
| 51 | + }, | ||
| 52 | + Orientation: null, // 旋转角度 | ||
| 53 | + headerImage: null | ||
| 54 | + /* 上传图片参数开始 结束 */ | ||
| 39 | } | 55 | } |
| 40 | }, | 56 | }, |
| 41 | components: { | 57 | components: { |
| 42 | - maskLayer, | ||
| 43 | - showModal | 58 | + maskLayer, |
| 59 | + showModal | ||
| 44 | }, | 60 | }, |
| 45 | created() { | 61 | created() { |
| 46 | 62 | ||
| 47 | - // 设置访问设备 | 63 | + // 设置访问设备 |
| 48 | this.setDeviceType(); | 64 | this.setDeviceType(); |
| 49 | 65 | ||
| 50 | // 设置浏览器类型 | 66 | // 设置浏览器类型 |
| @@ -55,55 +71,9 @@ | @@ -55,55 +71,9 @@ | ||
| 55 | 71 | ||
| 56 | // 实例化helper对象 | 72 | // 实例化helper对象 |
| 57 | this.helper = new Helper(this); | 73 | this.helper = new Helper(this); |
| 58 | - // 填写收货地址 | ||
| 59 | - var specianame = this.$route.name | ||
| 60 | - if(specianame==="luckyWheel"||specianame==="drawRecord") { | ||
| 61 | - if (this.isAndroid.value) { | ||
| 62 | - var addressId = localStorage.getItem('addressId'); | ||
| 63 | - var giftId = localStorage.getItem('ext').split("=")[1] | ||
| 64 | - } else { | ||
| 65 | - var addressId = this.$route.query.addressId; | ||
| 66 | - var giftId = this.$route.query.giftId; | ||
| 67 | - } | ||
| 68 | - if (addressId && giftId) { | ||
| 69 | - this.getaddLuckDrawAddress(); | ||
| 70 | - } | ||
| 71 | - } | ||
| 72 | }, | 74 | }, |
| 73 | methods: { | 75 | methods: { |
| 74 | - /** | ||
| 75 | - * 判断是否有获取头部高度的方法有这个方法证明该webview在咱们自己部门的view里面 | ||
| 76 | - */ | ||
| 77 | - isBackIcon(){ | ||
| 78 | - // 判断获取状态栏高度的方法存不存在 | ||
| 79 | - if(typeof window.webkit === "object" && typeof window.webkit.messageHandlers === "object" | ||
| 80 | - && typeof window.webkit.messageHandlers.getStatusHeight==="function"){ | ||
| 81 | - return true | ||
| 82 | - } | ||
| 83 | - }, | ||
| 84 | - /** | ||
| 85 | - * 返回上一页 | ||
| 86 | - */ | ||
| 87 | - back(){ | ||
| 88 | - // APP内 | ||
| 89 | - if (this.isCNLive.value) { | ||
| 90 | - | ||
| 91 | - // 调用App,返回按键 | ||
| 92 | - if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.destory) { | ||
| 93 | - | ||
| 94 | - // APP内,iOS销毁WebView | ||
| 95 | - window.webkit.messageHandlers.destory.postMessage({body: {}}); | ||
| 96 | - } else if (window.obj && window.obj.finish) { | ||
| 97 | - | ||
| 98 | - // APP内,Android销毁WebView | ||
| 99 | - window.obj.finish(); | ||
| 100 | - } | ||
| 101 | - } else { | ||
| 102 | 76 | ||
| 103 | - // 后退 | ||
| 104 | - window.history.go(-1); | ||
| 105 | - } | ||
| 106 | - }, | ||
| 107 | /** | 77 | /** |
| 108 | * 设置访问设备 | 78 | * 设置访问设备 |
| 109 | */ | 79 | */ |
| @@ -145,459 +115,663 @@ | @@ -145,459 +115,663 @@ | ||
| 145 | } else if (ua.match(/alipay/i) == "alipay") { | 115 | } else if (ua.match(/alipay/i) == "alipay") { |
| 146 | this.$store.commit("setBrowser", "AliPay"); | 116 | this.$store.commit("setBrowser", "AliPay"); |
| 147 | this.$set(this.isAliPay, "value", true); | 117 | this.$set(this.isAliPay, "value", true); |
| 148 | - } else if (ua.match(/company\/cnlive/i) == "company/cnlive") { | 118 | + } else if (ua.match(/company\/cnlive/i) == "company/cnlive") { |
| 149 | this.$store.commit("setBrowser", "CNLive"); | 119 | this.$store.commit("setBrowser", "CNLive"); |
| 150 | this.$set(this.isCNLive, "value", true); | 120 | this.$set(this.isCNLive, "value", true); |
| 151 | - } else { | ||
| 152 | - this.$store.commit("setBrowser", "Other"); | ||
| 153 | - } | 121 | + } else { |
| 122 | + this.$store.commit("setBrowser", "Other"); | ||
| 123 | + } | ||
| 154 | }, | 124 | }, |
| 155 | 125 | ||
| 156 | /** | 126 | /** |
| 157 | * 设置uid | 127 | * 设置uid |
| 158 | */ | 128 | */ |
| 159 | setUid() { | 129 | setUid() { |
| 160 | - | ||
| 161 | if (this.$route.query.uid) { | 130 | if (this.$route.query.uid) { |
| 162 | 131 | ||
| 163 | - let uid = this.$route.query.uid; | 132 | + let uid = this.$route.query.uid; |
| 164 | 133 | ||
| 165 | - // 容错,截取uid | ||
| 166 | - if (typeof uid === "object") { | ||
| 167 | - uid = uid.pop(); | ||
| 168 | - } | 134 | + // 容错,截取uid |
| 135 | + if (typeof uid === "object") { | ||
| 136 | + uid = uid.pop(); | ||
| 137 | + } | ||
| 169 | 138 | ||
| 170 | - // 设置uid | 139 | + // 设置uid |
| 171 | this.$store.commit("setUid", uid); | 140 | this.$store.commit("setUid", uid); |
| 172 | } | 141 | } |
| 173 | - }, | ||
| 174 | - | ||
| 175 | - /** | ||
| 176 | - * 通用跳转 | ||
| 177 | - * @param {object} item [服务详情对象] | ||
| 178 | - * @param {object} params [地址栏传参] | ||
| 179 | - */ | ||
| 180 | - gotoDetail(item, params = null) { | ||
| 181 | - | ||
| 182 | - // 判断App内 | ||
| 183 | - if (this.isCNLive.value) { | ||
| 184 | - | ||
| 185 | - // 提取key,判断是广告位还是详情 | ||
| 186 | - let keyArr = Object.keys(item); | ||
| 187 | - | ||
| 188 | - // 判断是Ads还是Detail | ||
| 189 | - let isAds = (keyArr.includes("type") && keyArr.includes("to") && keyArr.includes("shop_type")); | ||
| 190 | - | ||
| 191 | - // 初始化参数 | ||
| 192 | - let options = {}; | ||
| 193 | - console.log(isAds) | ||
| 194 | - // 广告处理 | ||
| 195 | - if (isAds) { | ||
| 196 | - | ||
| 197 | - // 设置参数 | ||
| 198 | - options = { | ||
| 199 | - type: item.type, | ||
| 200 | - to: item.to, | ||
| 201 | - shop_type: item.shop_type | ||
| 202 | - }; | ||
| 203 | - console.log(options) | ||
| 204 | - // 调用APP通用跳转,提交参数 | ||
| 205 | - if(window.webkit&&window.webkit.messageHandlers && window.webkit.messageHandlers.wjjToAppOnlineRetailers) { | ||
| 206 | - window.webkit.messageHandlers.wjjToAppOnlineRetailers.postMessage({body: options}); | ||
| 207 | - } else if(window.obj && window.obj.wjjToAppOnlineRetailers) { | ||
| 208 | - window.obj.wjjToAppOnlineRetailers(JSON.stringify(options)); | ||
| 209 | - } | ||
| 210 | - } | ||
| 211 | - } | ||
| 212 | - }, | 142 | + }, |
| 143 | + | ||
| 213 | /** | 144 | /** |
| 214 | - * 唤起APP | 145 | + * 投票 |
| 146 | + * @param {object} item [列表项对象] | ||
| 147 | + * @param {function} callback [回调函数] | ||
| 215 | */ | 148 | */ |
| 216 | - callApp() { | 149 | + doVote(item, callback) { |
| 217 | 150 | ||
| 218 | - // 唤起APP层 | ||
| 219 | - this.helper.schemeLayer(this.schemeParams, this.showModal); | 151 | + // 请求接口 |
| 152 | + this.http("/Api/" + (this.getApiVersion().index) + "/moviesVote", { | ||
| 153 | + id: item.id, | ||
| 154 | + uid: item.uid, | ||
| 155 | + type: 1 | ||
| 156 | + }, callback || function() {}, { | ||
| 157 | + method: "POST", | ||
| 158 | + item | ||
| 159 | + }); | ||
| 220 | }, | 160 | }, |
| 221 | 161 | ||
| 222 | - /* 获取并设置分享参数 开始 */ | ||
| 223 | - | ||
| 224 | - /** | ||
| 225 | - * 获取并设置分享参数 | ||
| 226 | - * @param {object} params [获取分享数据参数] | ||
| 227 | - */ | ||
| 228 | - getShareData(params) { | ||
| 229 | - | ||
| 230 | - // 请求接口 | ||
| 231 | - this.http("/Api/" + (this.getApiVersion().index) + "/getShareData", params, this.getShareDataCallback, { | ||
| 232 | - method: "POST" | ||
| 233 | - }) | ||
| 234 | - }, | ||
| 235 | - | ||
| 236 | - /** | ||
| 237 | - * 获取并设置分享参数回调 | ||
| 238 | - * @param {object} res [服务器返回数据] | ||
| 239 | - * @param {object} ext [扩展参数] | ||
| 240 | - */ | ||
| 241 | - getShareDataCallback(res, ext) { | ||
| 242 | - | ||
| 243 | - // 返回处理 | ||
| 244 | - if (res.code == 200) { | ||
| 245 | - | ||
| 246 | - // 解构数据 | ||
| 247 | - let {data: datas} = res; | ||
| 248 | - | ||
| 249 | - // 判断APP内 | ||
| 250 | - if (this.isCNLive.value) { | ||
| 251 | - | ||
| 252 | - /* 旧版APP内分享参数设置 开始 */ | ||
| 253 | - | ||
| 254 | - // APP内分享参数 | ||
| 255 | - this.$set(this, "appShareParams", { | ||
| 256 | - shareUrl: encodeURI(datas.url), | ||
| 257 | - shareIcon: datas.share_img, | ||
| 258 | - shareTitle: datas.share_title, | ||
| 259 | - shareContent: datas.share_desc, | ||
| 260 | - isShareWXMiniProgram: false, | ||
| 261 | - wxMiniProgramId: datas.mini_app_id, | ||
| 262 | - wxMiniProgramPath: datas.mini_app_url | ||
| 263 | - }); | ||
| 264 | - | ||
| 265 | - /* 旧版APP内分享参数设置 结束 */ | ||
| 266 | - | ||
| 267 | - } else { | ||
| 268 | - | ||
| 269 | - /* 设置唤起APP参数 开始 */ | ||
| 270 | - if (datas.inside_aes && datas.inside_aes.type && datas.inside_aes.to && datas.inside_aes.shop_type) { | ||
| 271 | - | ||
| 272 | - // 附加其它参数到唤起APP连接中 | ||
| 273 | - this.$set(this, "schemeParams", this.$route.query); | ||
| 274 | - | ||
| 275 | - // 设置唤起APP参数 | ||
| 276 | - Object.assign(this.schemeParams, { | ||
| 277 | - share_mold: "shop", | ||
| 278 | - shop_type: datas.inside_aes.type, | ||
| 279 | - shop_to: datas.inside_aes.to, | ||
| 280 | - shop_shop_type: datas.inside_aes.shop_type | ||
| 281 | - }); | ||
| 282 | - | ||
| 283 | - // 遍历对象,重新编码 | ||
| 284 | - for (let index in this.schemeParams) { | ||
| 285 | - this.schemeParams[index] = encodeURIComponent(decodeURIComponent(this.schemeParams[index])); | ||
| 286 | - } | ||
| 287 | - | ||
| 288 | - this.$set(this, "callApps", { | ||
| 289 | - funcs: { | ||
| 290 | - callApp: this.helper, | ||
| 291 | - callAppParams: this.schemeParams, | ||
| 292 | - callAppCallback: this.showModalCallback | ||
| 293 | - } | ||
| 294 | - }); | ||
| 295 | - } | ||
| 296 | - /* 设置唤起APP参数 结束 */ | ||
| 297 | - | ||
| 298 | - /* 设置微信分享参数 开始 */ | ||
| 299 | - if (this.isWeChat.value) { | ||
| 300 | - | ||
| 301 | - // 微信分享参数 | ||
| 302 | - let shares = { | ||
| 303 | - title: datas.share_title, // 分享标题 | ||
| 304 | - desc: datas.share_desc, // 分享描述 | ||
| 305 | - link: datas.url, // 分享链接 | ||
| 306 | - imgUrl: datas.share_img, // 分享图标 | ||
| 307 | - // type: "", // 分享类型,music、video或link,不填默认为link | ||
| 308 | - // dataUrl: "", // 如果type是music或video,则要提供数据链接,默认为空 | ||
| 309 | - } | ||
| 310 | - | ||
| 311 | - // 设置分享 | ||
| 312 | - this.getWxParams(shares); | ||
| 313 | - } | ||
| 314 | - /* 设置微信分享参数 结束 */ | ||
| 315 | - } | ||
| 316 | - } | ||
| 317 | - }, | ||
| 318 | - | ||
| 319 | - /** | ||
| 320 | - * 获取微信公众号JS-SDK签名的等参数 | ||
| 321 | - * @param {object} shares [分享参数] | ||
| 322 | - */ | ||
| 323 | - getWxParams(shares) { | ||
| 324 | - | ||
| 325 | - // 如果在微信内 | ||
| 326 | - if (this.isWeChat.value) { | ||
| 327 | - | ||
| 328 | - // 请求接口 | ||
| 329 | - this.http("/Api/" + (this.getApiVersion().miniapp) + "/getWxParams", { | ||
| 330 | - url: encodeURIComponent(window.location.href.split('#')[0]) | ||
| 331 | - }, this.getWxParamsCallback, { | ||
| 332 | - method: "POST", | ||
| 333 | - shares | ||
| 334 | - }) | ||
| 335 | - } | ||
| 336 | - }, | ||
| 337 | - | ||
| 338 | - /** | ||
| 339 | - * 获取微信公众号JS-SDK签名的等参数回调 | ||
| 340 | - * @param {object} res [服务器返回数据] | ||
| 341 | - * @param {object} ext [扩展参数] | ||
| 342 | - */ | ||
| 343 | - getWxParamsCallback(res, ext) { | ||
| 344 | - | ||
| 345 | - // 返回处理 | ||
| 346 | - if (res.code == 200) { | ||
| 347 | - | ||
| 348 | - // 解构数据 | ||
| 349 | - let {data: datas} = res; | ||
| 350 | - | ||
| 351 | - /* 微信JS-SDK 开始 */ | ||
| 352 | - | ||
| 353 | - // 上下文 | ||
| 354 | - let context = this; | ||
| 355 | - | ||
| 356 | - // 引入微信JS-SDK | ||
| 357 | - this.$set(this.jweixin, "value", require("jweixin-module")); | ||
| 358 | - | ||
| 359 | - //获取微信公众号的配置 | ||
| 360 | - this.jweixin.value.config({ | ||
| 361 | - debug: context.debug, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 | ||
| 362 | - appId: datas.appId, // 必填,公众号的唯一标识 | ||
| 363 | - timestamp: datas.timestamp, // 必填,生成签名的时间戳 | ||
| 364 | - nonceStr: datas.nonceStr, // 必填,生成签名的随机串 | ||
| 365 | - signature: datas.signature.toLowerCase(), // 必填,签名,见附录1 | ||
| 366 | - jsApiList: [ | ||
| 367 | - "onMenuShareTimeline", | ||
| 368 | - "onMenuShareAppMessage", | ||
| 369 | - "onMenuShareQQ", | ||
| 370 | - "onMenuShareWeibo", | ||
| 371 | - "onMenuShareQZone" | ||
| 372 | - ] | ||
| 373 | - }); | ||
| 374 | - | ||
| 375 | - // 上下文 | ||
| 376 | - let contextWX = this.jweixin.value; | ||
| 377 | - | ||
| 378 | - // 设置分享参数 | ||
| 379 | - let shares = ext.shares; | ||
| 380 | - | ||
| 381 | - // JS-SDK准备好之后 | ||
| 382 | - this.jweixin.value.ready(function() { | ||
| 383 | - | ||
| 384 | - // 分享参数 | ||
| 385 | - let sharesParams = { | ||
| 386 | - title: shares.title, // 分享标题 | ||
| 387 | - desc: shares.desc, // 分享描述 | ||
| 388 | - link: shares.link, // 分享链接 | ||
| 389 | - imgUrl: shares.imgUrl, // 分享图标 | ||
| 390 | - success: function () { | ||
| 391 | - // 用户确认分享后执行的回调函数 | ||
| 392 | - this.setStorageParams("message", "分享成功", true); | ||
| 393 | - }, | ||
| 394 | - cancel: function () { | ||
| 395 | - // 用户取消分享后执行的回调函数 | ||
| 396 | - this.setStorageParams("message", "取消分享", true); | ||
| 397 | - } | ||
| 398 | - } | ||
| 399 | - | ||
| 400 | - //获取“分享到QQ”按钮点击状态及自定义分享内容接口(即将废弃) | ||
| 401 | - contextWX.onMenuShareQQ(sharesParams); | ||
| 402 | - | ||
| 403 | - //获取“分享给朋友”按钮点击状态及自定义分享内容接口(即将废弃) | ||
| 404 | - contextWX.onMenuShareAppMessage(sharesParams); | ||
| 405 | - | ||
| 406 | - //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口(即将废弃) | ||
| 407 | - contextWX.onMenuShareTimeline(sharesParams); | ||
| 408 | - | ||
| 409 | - //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 | ||
| 410 | - contextWX.onMenuShareWeibo(sharesParams); | ||
| 411 | - | ||
| 412 | - //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口(即将废弃) | ||
| 413 | - contextWX.onMenuShareQZone(sharesParams); | ||
| 414 | - }); | ||
| 415 | - | ||
| 416 | - /* 微信JS-SDK 结束 */ | ||
| 417 | - } | ||
| 418 | - }, | ||
| 419 | - | ||
| 420 | - /** | ||
| 421 | - * 唤起APP弹窗 | ||
| 422 | - * @param {object} options [成功回调选项] | ||
| 423 | - */ | ||
| 424 | - showModal(options) { | ||
| 425 | - | ||
| 426 | - // 调用showModal层参数 | ||
| 427 | - this.$set(this, "showModals", { | ||
| 428 | - title: "", | ||
| 429 | - content: "即将离开页面<br />打开网家家APP", | ||
| 430 | - success: options.success, | ||
| 431 | - success_params: options.success_params, | ||
| 432 | - cb: this.showModalCallback, | ||
| 433 | - isShow: true | ||
| 434 | - }); | ||
| 435 | - }, | ||
| 436 | - | ||
| 437 | /** | 162 | /** |
| 438 | - * 唤起APP操作后回调 | ||
| 439 | - */ | ||
| 440 | - showModalCallback(options) { | 163 | + * APP内拉起分享 |
| 164 | + * @param {int} type [分享类型] | ||
| 165 | + * @param {int} id [页面id] | ||
| 166 | + */ | ||
| 167 | + toShare(type, id) { | ||
| 441 | 168 | ||
| 442 | - // 判断是否在Android WeChat内或在iOS QQ内 | ||
| 443 | - if ((this.isAndroid.value && this.isWeChat.value) || (this.isiPhone.value && this.isQQ.value)) { | 169 | + // 判断APP内 |
| 170 | + if (this.isCNLive.value) { | ||
| 444 | 171 | ||
| 445 | - // 判断微信或QQ,给出不同的图片 | ||
| 446 | - if (this.isiPhone.value && this.isQQ.value) { | 172 | + // 调用分享(新方法) |
| 173 | + if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.toShare) { | ||
| 447 | 174 | ||
| 448 | - // 设置蒙层图片 | ||
| 449 | - this.$set(this, "maskLayers", { | ||
| 450 | - img: "static/img/mask_layer_browser_iOS.png" | ||
| 451 | - }); | ||
| 452 | - } else { | 175 | + // 分享 |
| 176 | + window.webkit.messageHandlers.toShare.postMessage({body: {type: type, id: id}}); | ||
| 177 | + } else if (window.obj && window.obj.toShare) { | ||
| 453 | 178 | ||
| 454 | - // 设置蒙层图片 | ||
| 455 | - this.$set(this, "maskLayers", { | ||
| 456 | - img: "static/img/mask_layer_browser.png" | ||
| 457 | - }); | ||
| 458 | - } | 179 | + // 分享 |
| 180 | + window.obj.toShare(type, id); | ||
| 181 | + } | ||
| 459 | 182 | ||
| 460 | - // 显示蒙层 | ||
| 461 | - this.$refs.maskLayer.showLayer(); | ||
| 462 | - } else { | 183 | + // 调用分享(旧方法) |
| 184 | + if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.share) { | ||
| 463 | 185 | ||
| 464 | - // H5唤起APP | ||
| 465 | - options.success(options.success_params.callApp, options.success_params.path, options.success_params.param); | ||
| 466 | - } | ||
| 467 | - }, | 186 | + // 分享 |
| 187 | + window.webkit.messageHandlers.share.postMessage({body: this.appShareParams}); | ||
| 188 | + } else if (window.obj && window.obj.shareUrl) { | ||
| 468 | 189 | ||
| 469 | - /* 获取并设置分享参数 结束 */ | 190 | + // 分享 |
| 191 | + window.obj.shareUrl(JSON.stringify(this.appShareParams)); | ||
| 192 | + } | ||
| 193 | + } | ||
| 194 | + }, | ||
| 470 | 195 | ||
| 471 | /** | 196 | /** |
| 472 | - * 获取状态栏高度 | ||
| 473 | - */ | ||
| 474 | - getStatusHeight() { | ||
| 475 | - | ||
| 476 | - if (this.isCNLive.value) { | 197 | + * 唤起APP |
| 198 | + */ | ||
| 199 | + callApp() { | ||
| 477 | 200 | ||
| 478 | - // 获取状态栏高度 | ||
| 479 | - if(window.webkit && window.webkit.messageHandlers) { | 201 | + // 唤起APP层 |
| 202 | + this.helper.schemeLayer(this.schemeParams, this.callAppModal); | ||
| 203 | + }, | ||
| 480 | 204 | ||
| 481 | - // 请求状态栏高度,等待App调用 | ||
| 482 | - window.webkit.messageHandlers.getStatusHeight.postMessage({body: {}}); | ||
| 483 | - } else if(window.obj) { | 205 | + /* 获取并设置分享参数 开始 */ |
| 484 | 206 | ||
| 485 | - // 请求状态栏高度,等待App调用 | ||
| 486 | - window.obj.getStatusHeight(); | ||
| 487 | - } | ||
| 488 | - } | ||
| 489 | - }, | ||
| 490 | /** | 207 | /** |
| 491 | - * 获取最近使用的服务的接口 | ||
| 492 | - * @param {string} uid [用户] | ||
| 493 | - * @param {string} id [服务id] | 208 | + * 获取并设置分享参数 |
| 209 | + * @param {object} params [获取分享数据参数] | ||
| 494 | */ | 210 | */ |
| 495 | - gethistoryServiceApp(item) { | 211 | + getShareData(params) { |
| 212 | + | ||
| 496 | // 请求接口 | 213 | // 请求接口 |
| 497 | - this.http("/Api/" + (this.getApiVersion().serviceApp) + "/historyServiceApp", { | ||
| 498 | - uid: this.getStore("uid"), | ||
| 499 | - id: item.id, | ||
| 500 | - }, this.gethistoryServiceAppCallback, { | 214 | + this.http("/Api/" + (this.getApiVersion().index) + "/getShareData", params, this.getShareDataCallback, { |
| 501 | method: "POST" | 215 | method: "POST" |
| 502 | - }); | 216 | + }) |
| 503 | }, | 217 | }, |
| 504 | 218 | ||
| 505 | /** | 219 | /** |
| 506 | - * 获取最近使用的服务的接口 | 220 | + * 获取并设置分享参数回调 |
| 507 | * @param {object} res [服务器返回数据] | 221 | * @param {object} res [服务器返回数据] |
| 508 | * @param {object} ext [扩展参数] | 222 | * @param {object} ext [扩展参数] |
| 509 | */ | 223 | */ |
| 510 | - gethistoryServiceAppCallback(res, ext) { | ||
| 511 | - // 加载完成 | ||
| 512 | - Indicator.close(); | 224 | + getShareDataCallback(res, ext) { |
| 225 | + | ||
| 513 | // 返回处理 | 226 | // 返回处理 |
| 514 | if (res.code == 200) { | 227 | if (res.code == 200) { |
| 515 | 228 | ||
| 516 | - } else if (res.code == 400) { | ||
| 517 | - // 调取最近使用服务号失败 | ||
| 518 | - Toast(res.message); | ||
| 519 | - } else { | ||
| 520 | - // 调取最近使用服务号失败 | ||
| 521 | - Toast("调取最近使用服务号失败"); | 229 | + // 解构数据 |
| 230 | + let {data: datas} = res; | ||
| 231 | + | ||
| 232 | + // 判断APP内 | ||
| 233 | + if (this.isCNLive.value) { | ||
| 234 | + | ||
| 235 | + /* 旧版APP内分享参数设置 开始 */ | ||
| 236 | + | ||
| 237 | + // APP内分享参数 | ||
| 238 | + this.$set(this, "appShareParams", { | ||
| 239 | + shareUrl: encodeURI(datas.url), | ||
| 240 | + shareIcon: datas.share_img, | ||
| 241 | + shareTitle: datas.share_title, | ||
| 242 | + shareContent: datas.share_desc, | ||
| 243 | + isShareWXMiniProgram: false, | ||
| 244 | + wxMiniProgramId: datas.mini_app_id, | ||
| 245 | + wxMiniProgramPath: datas.mini_app_url | ||
| 246 | + }); | ||
| 247 | + | ||
| 248 | + /* 旧版APP内分享参数设置 结束 */ | ||
| 249 | + | ||
| 250 | + } else { | ||
| 251 | + | ||
| 252 | + /* 设置唤起APP参数 开始 */ | ||
| 253 | + if (datas.inside_aes && datas.inside_aes.type && datas.inside_aes.to && datas.inside_aes.shop_type) { | ||
| 254 | + | ||
| 255 | + // 附加其它参数到唤起APP连接中 | ||
| 256 | + this.$set(this, "schemeParams", this.$route.query); | ||
| 257 | + | ||
| 258 | + // 设置唤起APP参数 | ||
| 259 | + Object.assign(this.schemeParams, { | ||
| 260 | + share_mold: "shop", | ||
| 261 | + shop_type: datas.inside_aes.type, | ||
| 262 | + shop_to: datas.inside_aes.to, | ||
| 263 | + shop_shop_type: datas.inside_aes.shop_type | ||
| 264 | + }); | ||
| 265 | + | ||
| 266 | + // 遍历对象,重新编码 | ||
| 267 | + for (let index in this.schemeParams) { | ||
| 268 | + this.schemeParams[index] = encodeURIComponent(decodeURIComponent(this.schemeParams[index])); | ||
| 269 | + } | ||
| 270 | + | ||
| 271 | + this.$set(this, "callApps", { | ||
| 272 | + funcs: { | ||
| 273 | + callApp: this.helper, | ||
| 274 | + callAppParams: this.schemeParams, | ||
| 275 | + callAppCallback: this.callAppModalCallback | ||
| 276 | + } | ||
| 277 | + }); | ||
| 278 | + } | ||
| 279 | + /* 设置唤起APP参数 结束 */ | ||
| 280 | + | ||
| 281 | + /* 设置微信分享参数 开始 */ | ||
| 282 | + if (this.isWeChat.value) { | ||
| 283 | + | ||
| 284 | + // 微信分享参数 | ||
| 285 | + let shares = { | ||
| 286 | + title: datas.share_title, // 分享标题 | ||
| 287 | + desc: datas.share_desc, // 分享描述 | ||
| 288 | + link: datas.url, // 分享链接 | ||
| 289 | + imgUrl: datas.share_img, // 分享图标 | ||
| 290 | + // type: "", // 分享类型,music、video或link,不填默认为link | ||
| 291 | + // dataUrl: "", // 如果type是music或video,则要提供数据链接,默认为空 | ||
| 292 | + } | ||
| 293 | + | ||
| 294 | + // 设置分享 | ||
| 295 | + this.getWxParams(shares); | ||
| 296 | + } | ||
| 297 | + /* 设置微信分享参数 结束 */ | ||
| 298 | + } | ||
| 522 | } | 299 | } |
| 523 | }, | 300 | }, |
| 524 | - // 填写收货地址 | 301 | + |
| 525 | /** | 302 | /** |
| 526 | - * 填写收货地址 | ||
| 527 | - * @param {string} id [礼物订单id] | ||
| 528 | - * * @param {string} addressId [地址] | 303 | + * 获取微信公众号JS-SDK签名的等参数 |
| 304 | + * @param {object} shares [分享参数] | ||
| 529 | */ | 305 | */ |
| 530 | - getaddLuckDrawAddress() { | ||
| 531 | - // 加载中提示 | ||
| 532 | - Indicator.open('加载中...'); | ||
| 533 | - // 填写收货地址 | ||
| 534 | - var addressId,giftId | ||
| 535 | - if(this.isAndroid.value){ | ||
| 536 | - addressId = localStorage.getItem('addressId'); | ||
| 537 | - giftId = localStorage.getItem('ext').split("=")[1] | ||
| 538 | - }else { | ||
| 539 | - addressId = this.$route.query.addressId; | ||
| 540 | - giftId = this.$route.query.giftId; | 306 | + getWxParams(shares) { |
| 307 | + | ||
| 308 | + // 如果在微信内 | ||
| 309 | + if (this.isWeChat.value) { | ||
| 310 | + | ||
| 311 | + // 请求接口 | ||
| 312 | + this.http("/Api/" + (this.getApiVersion().miniapp) + "/getWxParams", { | ||
| 313 | + url: encodeURIComponent(window.location.href.split('#')[0]) | ||
| 314 | + }, this.getWxParamsCallback, { | ||
| 315 | + method: "POST", | ||
| 316 | + shares | ||
| 317 | + }) | ||
| 541 | } | 318 | } |
| 542 | - // 请求接口 | ||
| 543 | - this.http("/Api/" + (this.getApiVersion().LuckDraw) + "/addLuckDrawAddress", { | ||
| 544 | - addressId: addressId, | ||
| 545 | - id: giftId | ||
| 546 | - }, this.getaddLuckDrawAddressCallback, { | ||
| 547 | - method: "POST" | ||
| 548 | - }); | ||
| 549 | }, | 319 | }, |
| 550 | 320 | ||
| 551 | /** | 321 | /** |
| 552 | - * 填写收货地址回调 | 322 | + * 获取微信公众号JS-SDK签名的等参数回调 |
| 553 | * @param {object} res [服务器返回数据] | 323 | * @param {object} res [服务器返回数据] |
| 554 | * @param {object} ext [扩展参数] | 324 | * @param {object} ext [扩展参数] |
| 555 | */ | 325 | */ |
| 556 | - getaddLuckDrawAddressCallback(res, ext) { | ||
| 557 | - | ||
| 558 | - // 加载完成 | ||
| 559 | - Indicator.close(); | 326 | + getWxParamsCallback(res, ext) { |
| 560 | 327 | ||
| 561 | // 返回处理 | 328 | // 返回处理 |
| 562 | if (res.code == 200) { | 329 | if (res.code == 200) { |
| 563 | - // 在安卓环境下清除 | ||
| 564 | - if(this.isAndroid.value){ | ||
| 565 | - localStorage.removeItem('addressId'); | ||
| 566 | - localStorage.removeItem('ext'); | ||
| 567 | - } | 330 | + |
| 568 | // 解构数据 | 331 | // 解构数据 |
| 569 | let {data: datas} = res; | 332 | let {data: datas} = res; |
| 570 | 333 | ||
| 571 | - /* 填写收货地址 */ | ||
| 572 | - this.$set(this, "prize_list", { | ||
| 573 | - list: datas.gift | 334 | + /* 微信JS-SDK 开始 */ |
| 335 | + | ||
| 336 | + // 上下文 | ||
| 337 | + let context = this; | ||
| 338 | + | ||
| 339 | + // 引入微信JS-SDK | ||
| 340 | + this.$set(this.jweixin, "value", require("jweixin-module")); | ||
| 341 | + | ||
| 342 | + //获取微信公众号的配置 | ||
| 343 | + this.jweixin.value.config({ | ||
| 344 | + debug: context.debug, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 | ||
| 345 | + appId: datas.appId, // 必填,公众号的唯一标识 | ||
| 346 | + timestamp: datas.timestamp, // 必填,生成签名的时间戳 | ||
| 347 | + nonceStr: datas.nonceStr, // 必填,生成签名的随机串 | ||
| 348 | + signature: datas.signature.toLowerCase(), // 必填,签名,见附录1 | ||
| 349 | + jsApiList: [ | ||
| 350 | + "onMenuShareTimeline", | ||
| 351 | + "onMenuShareAppMessage", | ||
| 352 | + "onMenuShareQQ", | ||
| 353 | + "onMenuShareWeibo", | ||
| 354 | + "onMenuShareQZone" | ||
| 355 | + ] | ||
| 356 | + }); | ||
| 357 | + | ||
| 358 | + // 上下文 | ||
| 359 | + let contextWX = this.jweixin.value; | ||
| 360 | + | ||
| 361 | + // 设置分享参数 | ||
| 362 | + let shares = ext.shares; | ||
| 363 | + | ||
| 364 | + // JS-SDK准备好之后 | ||
| 365 | + this.jweixin.value.ready(function() { | ||
| 366 | + | ||
| 367 | + // 分享参数 | ||
| 368 | + let sharesParams = { | ||
| 369 | + title: shares.title, // 分享标题 | ||
| 370 | + desc: shares.desc, // 分享描述 | ||
| 371 | + link: shares.link, // 分享链接 | ||
| 372 | + imgUrl: shares.imgUrl, // 分享图标 | ||
| 373 | + success: function () { | ||
| 374 | + // 用户确认分享后执行的回调函数 | ||
| 375 | + this.setStorageParams("message", "分享成功", true); | ||
| 376 | + }, | ||
| 377 | + cancel: function () { | ||
| 378 | + // 用户取消分享后执行的回调函数 | ||
| 379 | + this.setStorageParams("message", "取消分享", true); | ||
| 380 | + } | ||
| 381 | + } | ||
| 382 | + | ||
| 383 | + //获取“分享到QQ”按钮点击状态及自定义分享内容接口(即将废弃) | ||
| 384 | + contextWX.onMenuShareQQ(sharesParams); | ||
| 385 | + | ||
| 386 | + //获取“分享给朋友”按钮点击状态及自定义分享内容接口(即将废弃) | ||
| 387 | + contextWX.onMenuShareAppMessage(sharesParams); | ||
| 388 | + | ||
| 389 | + //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口(即将废弃) | ||
| 390 | + contextWX.onMenuShareTimeline(sharesParams); | ||
| 391 | + | ||
| 392 | + //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 | ||
| 393 | + contextWX.onMenuShareWeibo(sharesParams); | ||
| 394 | + | ||
| 395 | + //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口(即将废弃) | ||
| 396 | + contextWX.onMenuShareQZone(sharesParams); | ||
| 574 | }); | 397 | }); |
| 575 | - /* 获取活动详情页 结束 */ | ||
| 576 | - } else if (res.code == 400) { | ||
| 577 | - // 填写收货地址失败 | ||
| 578 | - Toast(res.message); | 398 | + |
| 399 | + /* 微信JS-SDK 结束 */ | ||
| 400 | + } | ||
| 401 | + }, | ||
| 402 | + | ||
| 403 | + /** | ||
| 404 | + * 唤起APP弹窗 | ||
| 405 | + * @param {object} options [成功回调选项] | ||
| 406 | + */ | ||
| 407 | + callAppModal(options) { | ||
| 408 | + | ||
| 409 | + // 调用showModal层参数 | ||
| 410 | + this.$set(this, "callAppModals", { | ||
| 411 | + title: "", | ||
| 412 | + message: "即将离开页面<br />打开网家家APP", | ||
| 413 | + confirmButtonText: "允许", | ||
| 414 | + confirmButtonCallback: this.callAppModalCallback, | ||
| 415 | + showCancelButton: true, | ||
| 416 | + cancelButtonText: "取消", | ||
| 417 | + success: options.success, | ||
| 418 | + success_params: options.success_params | ||
| 419 | + }); | ||
| 420 | + | ||
| 421 | + // 显示唤起APP浮层 | ||
| 422 | + this.$refs.callAppModal.showLayer(); | ||
| 423 | + }, | ||
| 424 | + | ||
| 425 | + /** | ||
| 426 | + * 唤起APP操作后回调 | ||
| 427 | + */ | ||
| 428 | + callAppModalCallback(options) { | ||
| 429 | + | ||
| 430 | + // 判断是否在Android WeChat内或在iOS QQ内 | ||
| 431 | + if ((this.isAndroid.value && this.isWeChat.value) || (this.isiPhone.value && this.isQQ.value)) { | ||
| 432 | + | ||
| 433 | + // 判断微信或QQ,给出不同的图片 | ||
| 434 | + if (this.isiPhone.value && this.isQQ.value) { | ||
| 435 | + | ||
| 436 | + // 设置蒙层图片 | ||
| 437 | + this.$set(this, "maskLayers", { | ||
| 438 | + img: "static/img/mask_layer_browser_iOS.png" | ||
| 439 | + }); | ||
| 440 | + } else { | ||
| 441 | + | ||
| 442 | + // 设置蒙层图片 | ||
| 443 | + this.$set(this, "maskLayers", { | ||
| 444 | + img: "static/img/mask_layer_browser.png" | ||
| 445 | + }); | ||
| 446 | + } | ||
| 447 | + | ||
| 448 | + // 显示蒙层 | ||
| 449 | + this.$refs.maskLayer.showLayer(); | ||
| 579 | } else { | 450 | } else { |
| 580 | - // 填写收货地址失败 | ||
| 581 | - Toast("填写收货地址失败"); | 451 | + |
| 452 | + // H5唤起APP | ||
| 453 | + options.success(options.success_params.callApp, options.success_params.path, options.success_params.param); | ||
| 582 | } | 454 | } |
| 583 | }, | 455 | }, |
| 456 | + | ||
| 457 | + /* 获取并设置分享参数 结束 */ | ||
| 458 | + | ||
| 459 | + /** | ||
| 460 | + * 唤起APP弹窗 | ||
| 461 | + * @param {object} options [成功回调选项] | ||
| 462 | + */ | ||
| 463 | + showModal(options) { | ||
| 464 | + | ||
| 465 | + // 调用showModal层参数 | ||
| 466 | + this.$set(this, "showOptions", options); | ||
| 467 | + | ||
| 468 | + // 显示通用浮层 | ||
| 469 | + this.$refs.showModal.showLayer(); | ||
| 470 | + }, | ||
| 471 | + | ||
| 472 | + /** | ||
| 473 | + * 唤起APP操作后回调 | ||
| 474 | + */ | ||
| 475 | + showModalCallback(options) { | ||
| 476 | + | ||
| 477 | + // 暂未使用 | ||
| 478 | + | ||
| 479 | + }, | ||
| 480 | + | ||
| 481 | + /** | ||
| 482 | + * 获取状态栏高度 | ||
| 483 | + */ | ||
| 484 | + getStatusHeight() { | ||
| 485 | + | ||
| 486 | + if (this.isCNLive.value) { | ||
| 487 | + | ||
| 488 | + // 获取状态栏高度 | ||
| 489 | + if(window.webkit && window.webkit.messageHandlers) { | ||
| 490 | + | ||
| 491 | + // 请求状态栏高度,等待App调用 | ||
| 492 | + window.webkit.messageHandlers.getStatusHeight.postMessage({body: {}}); | ||
| 493 | + } else if(window.obj) { | ||
| 494 | + | ||
| 495 | + // 请求状态栏高度,等待App调用 | ||
| 496 | + window.obj.getStatusHeight(); | ||
| 497 | + } | ||
| 498 | + } | ||
| 499 | + }, | ||
| 500 | + | ||
| 501 | + /* 图片上传压缩/旋转优化 开始 */ | ||
| 502 | + | ||
| 503 | + /** | ||
| 504 | + * 待上传图片处理 | ||
| 505 | + * @param {object} file [文件对象] | ||
| 506 | + * @param {object} ext [扩展参数] | ||
| 507 | + */ | ||
| 508 | + imgPreview(file, ext) { | ||
| 509 | + | ||
| 510 | + // 定义变量 | ||
| 511 | + let context = this; | ||
| 512 | + | ||
| 513 | + /* 定义文件名/文件类型 开始 */ | ||
| 514 | + this.$set(this.files, { | ||
| 515 | + name: "", | ||
| 516 | + type: "" | ||
| 517 | + }); | ||
| 518 | + this.$set(this.files, "name", file.name); | ||
| 519 | + this.$set(this.files, "type", file.type); | ||
| 520 | + /* 定义文件名/文件类型 结束 */ | ||
| 521 | + | ||
| 522 | + // 初始化文件编码/图片方向对象 | ||
| 523 | + this.$set(this, "headerImage", null); | ||
| 524 | + this.$set(this, "Orientation", null); | ||
| 525 | + | ||
| 526 | + // 去获取拍照时的信息,解决拍出来的照片旋转问题 | ||
| 527 | + Exif.getData(file, function () { | ||
| 528 | + context.Orientation = Exif.getTag(this, "Orientation"); | ||
| 529 | + }); | ||
| 530 | + | ||
| 531 | + // 检测是否支持FileReader | ||
| 532 | + if (!file || !window.FileReader) { | ||
| 533 | + return; | ||
| 534 | + } | ||
| 535 | + | ||
| 536 | + if (/^image/.test(file.type)) { | ||
| 537 | + | ||
| 538 | + // 创建一个reader | ||
| 539 | + let reader = new FileReader(); | ||
| 540 | + | ||
| 541 | + // 将图片转成 base64 格式 | ||
| 542 | + reader.readAsDataURL(file); | ||
| 543 | + | ||
| 544 | + // 读取成功后的回调 | ||
| 545 | + reader.onloadend = function () { | ||
| 546 | + | ||
| 547 | + // 实例化图片对象 | ||
| 548 | + let result = this.result; | ||
| 549 | + let img = new Image(); | ||
| 550 | + img.src = result; | ||
| 551 | + | ||
| 552 | + // 判断图片是否大于500K,是就直接上传,反之压缩图片 | ||
| 553 | + if (this.result.length <= 500 * 1024) { | ||
| 554 | + context.headerImage = this.result; | ||
| 555 | + context.postImg(ext); | ||
| 556 | + } else { | ||
| 557 | + img.onload = function () { | ||
| 558 | + let data = context.compress(img, context.Orientation); | ||
| 559 | + context.headerImage = data; | ||
| 560 | + context.postImg(ext); | ||
| 561 | + }; | ||
| 562 | + } | ||
| 563 | + }; | ||
| 564 | + } | ||
| 565 | + }, | ||
| 566 | + | ||
| 567 | + /** | ||
| 568 | + * 压缩图片 | ||
| 569 | + * @param {object} img [待处理图片对象] | ||
| 570 | + * @param {int} Orientation [图片上传旋转值] | ||
| 571 | + */ | ||
| 572 | + compress(img, Orientation) { | ||
| 573 | + | ||
| 574 | + // 初始化canvas对象 | ||
| 575 | + let canvas = document.createElement("canvas"); | ||
| 576 | + let ctx = canvas.getContext("2d"); | ||
| 577 | + | ||
| 578 | + // 瓦片canvas | ||
| 579 | + let tCanvas = document.createElement("canvas"); | ||
| 580 | + let tctx = tCanvas.getContext("2d"); | ||
| 581 | + | ||
| 582 | + // let initSize = img.src.length; | ||
| 583 | + let width = img.width; | ||
| 584 | + let height = img.height; | ||
| 585 | + | ||
| 586 | + // 如果图片大于四百万像素,计算压缩比并将大小压至400万以下 | ||
| 587 | + | ||
| 588 | + // 缩放比例 | ||
| 589 | + let ratio; | ||
| 590 | + | ||
| 591 | + if ((ratio = (width * height) / 4000000) > 1) { | ||
| 592 | + | ||
| 593 | + // 大于400万像素 | ||
| 594 | + ratio = Math.sqrt(ratio); | ||
| 595 | + width /= ratio; | ||
| 596 | + height /= ratio; | ||
| 597 | + } else { | ||
| 598 | + | ||
| 599 | + // 等比不缩放 | ||
| 600 | + ratio = 1; | ||
| 601 | + } | ||
| 602 | + | ||
| 603 | + // 设置canvas宽高 | ||
| 604 | + canvas.width = width; | ||
| 605 | + canvas.height = height; | ||
| 606 | + | ||
| 607 | + // 背景色 | ||
| 608 | + ctx.fillStyle = "#fff"; | ||
| 609 | + ctx.fillRect(0, 0, canvas.width, canvas.height); | ||
| 610 | + | ||
| 611 | + // 如果图片像素大于100万则使用瓦片绘制 | ||
| 612 | + let count; | ||
| 613 | + | ||
| 614 | + if ((count = (width * height) / 1000000) > 1) { | ||
| 615 | + | ||
| 616 | + // 超过100万像素; | ||
| 617 | + count = ~~(Math.sqrt(count) + 1); //计算要分成多少块瓦片 | ||
| 618 | + | ||
| 619 | + // 计算每块瓦片的宽和高 | ||
| 620 | + let nw = ~~(width / count); | ||
| 621 | + let nh = ~~(height / count); | ||
| 622 | + tCanvas.width = nw; | ||
| 623 | + tCanvas.height = nh; | ||
| 624 | + for (let i = 0; i < count; i++) { | ||
| 625 | + for (let j = 0; j < count; j++) { | ||
| 626 | + tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh); | ||
| 627 | + ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh); | ||
| 628 | + } | ||
| 629 | + } | ||
| 630 | + } else { | ||
| 631 | + ctx.drawImage(img, 0, 0, width, height); | ||
| 632 | + } | ||
| 633 | + | ||
| 634 | + // 修复iOS上传图片的时候,被旋转的问题 | ||
| 635 | + if (Orientation != "" && Orientation != 1) { | ||
| 636 | + | ||
| 637 | + switch (Orientation) { | ||
| 638 | + case 6: // 需要顺时针(向左)90度旋转 | ||
| 639 | + this.rotateImg(img, "left", canvas); | ||
| 640 | + break; | ||
| 641 | + case 8: // 需要逆时针(向右)90度旋转 | ||
| 642 | + this.rotateImg(img, "right", canvas); | ||
| 643 | + break; | ||
| 644 | + case 3: // 需要180度旋转 | ||
| 645 | + this.rotateImg(img, "right", canvas); // 转两次 | ||
| 646 | + this.rotateImg(img, "right", canvas); | ||
| 647 | + break; | ||
| 648 | + } | ||
| 649 | + } | ||
| 650 | + | ||
| 651 | + // 进行最小压缩 | ||
| 652 | + let ndata = canvas.toDataURL("image/jpeg", 0.1); | ||
| 653 | + tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0; | ||
| 654 | + return ndata; | ||
| 655 | + }, | ||
| 656 | + | ||
| 657 | + /** | ||
| 658 | + * 旋转图片 | ||
| 659 | + * @param {object} img [图片对象] | ||
| 660 | + * @param {string} direction [旋转方向] | ||
| 661 | + * @param {object} canvas对象 | ||
| 662 | + */ | ||
| 663 | + rotateImg(img, direction, canvas) { | ||
| 664 | + | ||
| 665 | + // 最小与最大旋转方向,图片旋转4次后回到原方向 | ||
| 666 | + const min_step = 0; | ||
| 667 | + const max_step = 3; | ||
| 668 | + | ||
| 669 | + if (img == null) { | ||
| 670 | + return; | ||
| 671 | + } | ||
| 672 | + | ||
| 673 | + // img的高度和宽度不能在img元素隐藏后获取,否则会出错 | ||
| 674 | + let height = img.height; | ||
| 675 | + let width = img.width; | ||
| 676 | + let step = 2; | ||
| 677 | + if (step == null) { | ||
| 678 | + step = min_step; | ||
| 679 | + } | ||
| 680 | + if (direction == "right") { | ||
| 681 | + step++; | ||
| 682 | + | ||
| 683 | + //旋转到原位置,即超过最大值 | ||
| 684 | + step > max_step && (step = min_step); | ||
| 685 | + } else { | ||
| 686 | + step--; | ||
| 687 | + step < min_step && (step = max_step); | ||
| 688 | + } | ||
| 689 | + | ||
| 690 | + // 旋转角度以弧度值为参数 | ||
| 691 | + let degree = (step * 90 * Math.PI) / 180; | ||
| 692 | + let ctx = canvas.getContext("2d"); | ||
| 693 | + switch (step) { | ||
| 694 | + case 0: | ||
| 695 | + canvas.width = width; | ||
| 696 | + canvas.height = height; | ||
| 697 | + ctx.drawImage(img, 0, 0); | ||
| 698 | + break; | ||
| 699 | + case 1: | ||
| 700 | + canvas.width = height; | ||
| 701 | + canvas.height = width; | ||
| 702 | + ctx.rotate(degree); | ||
| 703 | + ctx.drawImage(img, 0, -height); | ||
| 704 | + break; | ||
| 705 | + case 2: | ||
| 706 | + canvas.width = width; | ||
| 707 | + canvas.height = height; | ||
| 708 | + ctx.rotate(degree); | ||
| 709 | + ctx.drawImage(img, -width, -height); | ||
| 710 | + break; | ||
| 711 | + case 3: | ||
| 712 | + canvas.width = height; | ||
| 713 | + canvas.height = width; | ||
| 714 | + ctx.rotate(degree); | ||
| 715 | + ctx.drawImage(img, -width, 0); | ||
| 716 | + break; | ||
| 717 | + } | ||
| 718 | + }, | ||
| 719 | + | ||
| 720 | + /** | ||
| 721 | + * 将base64字符串转成file对象 | ||
| 722 | + * @param {string} dataurl [图片URL/base64编码] | ||
| 723 | + */ | ||
| 724 | + dataURLtoFile(dataurl) { | ||
| 725 | + var arr = dataurl.split(","), | ||
| 726 | + bstr = atob(arr[1]), | ||
| 727 | + n = bstr.length, | ||
| 728 | + u8arr = new Uint8Array(n); | ||
| 729 | + while (n--) { | ||
| 730 | + u8arr[n] = bstr.charCodeAt(n); | ||
| 731 | + } | ||
| 732 | + | ||
| 733 | + return new File([u8arr], this.files.name, { | ||
| 734 | + type: this.files.type | ||
| 735 | + }); | ||
| 736 | + }, | ||
| 737 | + | ||
| 738 | + /** | ||
| 739 | + * 七牛云图片上传 | ||
| 740 | + * @param {object} ext [扩展参数] | ||
| 741 | + */ | ||
| 742 | + async postImg(ext) { | ||
| 743 | + | ||
| 744 | + // 设置返回参数,加上base64编码数据 | ||
| 745 | + let files = { | ||
| 746 | + content: this.headerImage, | ||
| 747 | + file: this.dataURLtoFile(this.headerImage) | ||
| 748 | + }; | ||
| 749 | + | ||
| 750 | + // 返回压缩后的文件数据 | ||
| 751 | + if (typeof ext.postImgCallback === "function") { | ||
| 752 | + ext.postImgCallback(files, ext); | ||
| 753 | + } | ||
| 754 | + } | ||
| 755 | + | ||
| 756 | + /* 图片上传压缩/旋转优化 结束 */ | ||
| 757 | + | ||
| 584 | }, | 758 | }, |
| 585 | mounted () { | 759 | mounted () { |
| 586 | 760 | ||
| 587 | - // 判断APP内 | 761 | + // 判断APP内 |
| 588 | if (this.isCNLive.value) { | 762 | if (this.isCNLive.value) { |
| 589 | 763 | ||
| 590 | - // 上下文 | 764 | + // 上下文 |
| 591 | let context = this; | 765 | let context = this; |
| 592 | 766 | ||
| 593 | - // 暴露方法,由App调用,接收返回 | ||
| 594 | - window.getStatusHeight = function(statusString) { | 767 | + // 暴露方法,由App调用,接收返回 |
| 768 | + window.getStatusHeight = function(statusString) { | ||
| 595 | 769 | ||
| 596 | - // 获取状态栏高度 | ||
| 597 | - let statusJSON = JSON.parse(statusString); | 770 | + // 获取状态栏高度 |
| 771 | + let statusJSON = JSON.parse(statusString); | ||
| 598 | 772 | ||
| 599 | - // 设置状态栏参数 | ||
| 600 | - context.$set(context.top, "value", statusJSON.statusHeight || context.top.value); | 773 | + // 设置状态栏参数 |
| 774 | + context.$set(context.top, "value", statusJSON.statusHeight || context.top.value); | ||
| 601 | }; | 775 | }; |
| 602 | 776 | ||
| 603 | this.$nextTick(function(){ | 777 | this.$nextTick(function(){ |
| @@ -605,7 +779,7 @@ | @@ -605,7 +779,7 @@ | ||
| 605 | // 获取状态栏高度,等待App调用window["getStatusHeight"] | 779 | // 获取状态栏高度,等待App调用window["getStatusHeight"] |
| 606 | this.getStatusHeight(); | 780 | this.getStatusHeight(); |
| 607 | }) | 781 | }) |
| 608 | - } | 782 | + } |
| 609 | } | 783 | } |
| 610 | } | 784 | } |
| 611 | </script> | 785 | </script> |
src/pages/index/index.vue