xiongzhu 3 лет назад
Родитель
Сommit
c39f9afb33

+ 1 - 0
android/app/capacitor.build.gradle

@@ -9,6 +9,7 @@ android {
 
 apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
 dependencies {
+    implementation project(':capacitor-community-media')
     implementation project(':capacitor-action-sheet')
     implementation project(':capacitor-app')
     implementation project(':capacitor-app-launcher')

+ 2 - 0
android/app/src/main/AndroidManifest.xml

@@ -48,4 +48,6 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 </manifest>

+ 3 - 0
android/capacitor.settings.gradle

@@ -2,6 +2,9 @@
 include ':capacitor-android'
 project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
 
+include ':capacitor-community-media'
+project(':capacitor-community-media').projectDir = new File('../node_modules/@capacitor-community/media/android')
+
 include ':capacitor-action-sheet'
 project(':capacitor-action-sheet').projectDir = new File('../node_modules/@capacitor/action-sheet/android')
 

+ 2 - 1
package.json

@@ -9,6 +9,7 @@
     "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore"
   },
   "dependencies": {
+    "@capacitor-community/media": "^3.0.0",
     "@capacitor/action-sheet": "^4.1.0",
     "@capacitor/android": "^4.6.1",
     "@capacitor/app": "^4.1.1",
@@ -43,7 +44,7 @@
     "mathjs": "^11.5.0",
     "normalize.css": "^8.0.1",
     "pinia": "^2.0.26",
-    "qrcode": "1",
+    "qrcode": "^1.5.1",
     "qs": "^6.11.0",
     "swiper": "^8.4.5",
     "vant": "^4.0.2",

BIN
src/assets/share_img.png


+ 7 - 7
src/main.js

@@ -82,11 +82,11 @@ if (Capacitor.isNativePlatform()) {
             err => console.error('Failed to get insets top:', err)
         )
     }
+    Openinstall.init()
+    Openinstall.addListener('wakeUp', data => {
+        console.log('wakeUp', data)
+    })
+    Openinstall.getInstallCanRetry(data => {
+        console.log('getInstallCanRetry', data)
+    })
 }
-Openinstall.init()
-Openinstall.addListener('wakeUp', data => {
-    console.log('wakeUp', data)
-})
-Openinstall.getInstallCanRetry(data => {
-    console.log('getInstallCanRetry', data)
-})

+ 79 - 5
src/views/DistributionPage.vue

@@ -19,7 +19,7 @@
                         <ion-icon :icon="caretForwardCircleOutline"></ion-icon>
                     </div>
                 </div> -->
-                <div class="btn-invite" @click="showShareModal = true"></div>
+                <div class="btn-invite" @click="drawQr"></div>
             </div>
             <div class="stat">
                 <div class="bg">
@@ -62,9 +62,9 @@
                 </ion-content>
             </ion-modal>
             <ion-modal class="share-modal dialog" :is-open="showShareModal" @didDismiss="showShareModal = false">
-                <img class="share-img" src="@/assets/share_img.png" />
-                <div class="btn-save">{{ $t('distribution.saveImg') }}</div>
-                <div class="btn-cancel" @click="showShareModal = fales">{{ $t('common.cancel') }}</div>
+                <img class="share-img" :src="posterUrl" />
+                <div class="btn-save" @click="save">{{ $t('distribution.saveImg') }}</div>
+                <div class="btn-cancel" @click="showShareModal = false">{{ $t('common.cancel') }}</div>
             </ion-modal>
         </ion-content>
     </ion-page>
@@ -77,6 +77,12 @@ import CommissionItem from '@/components/CommissionItem.vue'
 import VueQrcode from '@chenfengyuan/vue-qrcode'
 import { useRoute } from 'vue-router'
 import { computed } from 'vue'
+import qrcode from 'qrcode'
+import shareImg from '@/assets/share_img.png'
+import { Capacitor } from '@capacitor/core'
+import { Filesystem, Directory, Encoding } from '@capacitor/filesystem'
+import { Media } from '@capacitor-community/media'
+
 export default {
     components: {
         CommissionItem,
@@ -93,7 +99,8 @@ export default {
             records: [],
             superior: null,
             showShareModal: false,
-            showToolbar: false
+            showToolbar: false,
+            posterUrl: null
         }
     },
     setup() {
@@ -134,6 +141,73 @@ export default {
             this.$http.get('/commission/records').then(res => {
                 this.records = res.content
             })
+        },
+        drawQr() {
+            let qrImg = new Image()
+            let bgImg = new Image()
+            let userId = this.user.id
+            function loadQR(text) {
+                return new Promise((resolve, reject) => {
+                    qrcode.toDataURL(
+                        `http://35.76.121.189/download.html?invitor=${userId}`,
+                        { width: 335, height: 335, margin: 0 },
+                        function (err, url) {
+                            if (err) {
+                                reject(err)
+                            }
+                            qrImg.onload = () => {
+                                resolve()
+                            }
+                            qrImg.src = url
+                        }
+                    )
+                })
+            }
+            function loadBg() {
+                return new Promise((resolve, reject) => {
+                    bgImg.onload = () => {
+                        resolve()
+                    }
+                    bgImg.src = shareImg
+                })
+            }
+            this.$toast.loading('loading...')
+            Promise.all([loadQR(), loadBg()]).then(() => {
+                this.$toast.dismiss()
+                let canvas = document.createElement('canvas')
+                canvas.width = 1125
+                canvas.height = 1740
+                let ctx = canvas.getContext('2d')
+                ctx.drawImage(bgImg, 0, 0)
+                ctx.drawImage(qrImg, 395, 1095, 335, 335)
+                let dataUrl = canvas.toDataURL('image/png')
+                this.posterUrl = dataUrl
+                this.showShareModal = true
+            })
+        },
+        async save() {
+            if (Capacitor.isNativePlatform) {
+                //
+                try {
+                    const savedFile = await Filesystem.writeFile({
+                        path: 'share.png',
+                        data: this.posterUrl,
+                        directory: Directory.Data
+                    })
+                    await Media.savePhoto({
+                        path: savedFile.uri,
+                        album: 'FirstCash'
+                    })
+                    this.$toast.success('Saved')
+                } catch (e) {
+                    console.log(e)
+                }
+            } else {
+                var link = document.createElement('a')
+                link.setAttribute('download', 'Share.png')
+                link.setAttribute('href', this.posterUrl.replace('image/png', 'image/octet-stream'))
+                link.click()
+            }
         }
     }
 }

+ 7 - 2
yarn.lock

@@ -14,6 +14,11 @@
   dependencies:
     regenerator-runtime "^0.13.11"
 
+"@capacitor-community/media@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/@capacitor-community/media/-/media-3.0.0.tgz#363b450cd150d6aa9050cb4762b85a3450b2edb9"
+  integrity sha512-B9Q0ouigEmmmdLGFaZTDJE8DRbQD5o8Mz+HO7W9Vyw51m6lzPKdxt0UpELvsY27/kVZZk74JqrvhgKvv25JfMg==
+
 "@capacitor/action-sheet@^4.1.0":
   version "4.1.0"
   resolved "https://registry.npmmirror.com/@capacitor/action-sheet/-/action-sheet-4.1.0.tgz#6ce5b849fff52bf45a6e6832d5de00ff6fc2b97a"
@@ -3502,9 +3507,9 @@ punycode@^2.1.0:
   resolved "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz"
   integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
 
-qrcode@1:
+qrcode@^1.5.1:
   version "1.5.1"
-  resolved "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz"
+  resolved "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb"
   integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==
   dependencies:
     dijkstrajs "^1.0.1"