任一存 1 年之前
父节点
当前提交
e85bee7437
共有 5 个文件被更改,包括 67 次插入35 次删除
  1. 2 2
      public/index.html
  2. 2 2
      src/api.js
  3. 2 2
      src/components/FeedBack.vue
  4. 21 10
      src/components/PrizeRedeem.vue
  5. 40 19
      src/views/ShopView.vue

+ 2 - 2
public/index.html

@@ -8,7 +8,7 @@
     <title>锡善云城</title>
   </head>
   <body>
-    <script src="https://cdn.bootcss.com/vConsole/3.2.0/vconsole.min.js"></script>
+    <!-- <script src="https://cdn.bootcss.com/vConsole/3.2.0/vconsole.min.js"></script> -->
     <noscript>
       <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
     </noscript>
@@ -16,7 +16,7 @@
     <!-- built files will be auto injected -->
 
     <script>
-      new VConsole()
+      // new VConsole()
     </script>
   </body>
 </html>

+ 2 - 2
src/api.js

@@ -7,7 +7,7 @@ axios.interceptors.response.use(function (response) {
   if (response.data.code === 5001 || response.data.code === 5002) {
     store.commit('logoutCallback')
     // router.push({ name: 'HomeView' })
-    location.href = `https://open.weixin.qq.com/connect/qrconnect?appid=wx3d4f2e0cfc3b8e54&redirect_uri=https%3A%2F%2Fsit-wuxicishan.4dage.com%2F%23%2Flogin-temp&response_type=code&scope=snsapi_login&state=${encodeURIComponent(router.currentRoute.name)}#wechat_redirect`
+    location.href = `https://open.weixin.qq.com/connect/qrconnect?appid=wx3d4f2e0cfc3b8e54&redirect_uri=https%3A%2F%2Fsit-wuxicishan.4dage.com%2F%23%2Flogin-temp&response_type=code&scope=snsapi_login&state=${encodeURIComponent(router.currentRoute.value.name)}#wechat_redirect`
     return Promise.reject('登录态过期')
   }
   return response
@@ -208,6 +208,6 @@ export function redeemApi(data) {
     },
     data
   }).then((res) => {
-    return res.data.data
+    return res.data
   })
 }

+ 2 - 2
src/components/FeedBack.vue

@@ -129,8 +129,8 @@ function onSubmit() {
     })
     emit('close')
   }).catch((err) => {
-    ElMessage.error(err)
-    emit('close')
+    ElMessage.error(err.msg)
+    // emit('close')
   })
 }
 

+ 21 - 10
src/components/PrizeRedeem.vue

@@ -139,8 +139,11 @@ const props = defineProps({
   }
 })
 
-const emit = defineEmits(['close', 'openCert', 'success'])
+const emit = defineEmits(['close', 'openCert', 'submitOver'])
 
+/**
+ * 没用吧。
+ */
 const isShowVerifiCode = ref(true)
 const onClickVerifiCode = utils.throttle(() => {
   isShowVerifiCode.value = false
@@ -169,22 +172,30 @@ const canSubmit = computed(() => {
 async function onSubmit() {
   try {
     loading.value = true
-    await redeemApi({
+    const redeemRes = await redeemApi({
       prizeId: props.prizeData.id,
       score: -props.prizeData.score,
       name: name.value,
       phone: contact.value,
       description: feedback.value
     })
-    ElMessage({
-      message: '提交成功,工作人员会与您及时联系',
-      type: 'success',
-      duration: 3000
-    })
-    if (props.prizeData.id === 1) {
-      emit('openCert', name.value)
+    if (redeemRes.code === 0) {
+      ElMessage({
+        message: '提交成功,工作人员会与您及时联系',
+        type: 'success',
+        duration: 3000
+      })
+      if (props.prizeData.id === 1) {
+        emit('openCert', name.value)
+      }
+    } else {
+      ElMessage({
+        message: redeemRes.msg,
+        type: 'warning',
+        duration: 3000
+      })
     }
-    emit('success')
+    emit('submitOver')
   } finally {
     loading.value = false
   }

+ 40 - 19
src/views/ShopView.vue

@@ -206,7 +206,7 @@
       :score="myScore"
       @open-cert="openCertImg"
       @close="redeemPrizeData = {}, isShowRedeem = false"
-      @success="handlePrizeSuccess"
+      @submit-over="handlePrizeSubmitOver"
     />
 
     <div
@@ -219,6 +219,13 @@
         alt=""
         draggable="false"
       >
+      <a
+        class="btn-download"
+        :href="certImgUrl"
+        download
+      >
+        下载证书
+      </a>
       <button
         class="close"
         @click="isShowCertImg = false"
@@ -286,7 +293,7 @@ getShopContact().then((res) => {
   redeemRecordContact.value = res.rtf
 })
 
-const handlePrizeSuccess = async() => {
+const handlePrizeSubmitOver = async() => {
   try {
     pageLoading.value = true
     await checkRedeem()
@@ -342,6 +349,11 @@ function onClickPrizeItem(prizeItem) {
     return
   }
 
+  if (prizeItem.stock < 1) {
+    ElMessage.warning('库存不足,无法兑换')
+    return
+  }
+
   redeemPrizeData.value = prizeItem
   isShowRedeem.value = true
 }
@@ -383,14 +395,9 @@ const certCanvas = ref()
 // const $isSafari = inject('$isSafari')
 const isShowCertImg = ref(false)
 const certImgUrl = ref('')
-
 const openCertImg = async(certName) => {
   try {
     pageLoading.value = true
-    // let winRef
-    // if ($isSafari) {
-    //   winRef = window.open('', '_blank')
-    // }
     if (isRedeemed.value) {
       await getRedeem()
     } else {
@@ -402,19 +409,23 @@ const openCertImg = async(certName) => {
     await nextTick(async() => {
       const canvas = await html2canvas(certCanvas.value, {
         width: certCanvas.value.offsetWidth,
-        scale: 1
-      })
-      canvas.toBlob((blob) => {
-        if (blob) {
-          certImgUrl.value = URL.createObjectURL(blob)
-          isShowCertImg.value = true
-          // if ($isSafari && winRef) {
-          //   winRef.location.href = URL.createObjectURL(blob)
-          // } else {
-          //   window.open(URL.createObjectURL(blob))
-          // }
-        }
+        scale: 1,
+        allowTaint: true,
+        useCORS: true,
       })
+      canvas.toBlob(
+        (blob) => {
+          if (blob) {
+            certImgUrl.value = URL.createObjectURL(blob)
+            isShowCertImg.value = true
+          }
+        },
+        'image/jpeg',
+        0.95,
+      )
+      // const dataUrl = canvas.toDataURL()
+      // certImgUrl.value = dataUrl
+      // isShowCertImg.value = true
     })
   } finally {
     pageLoading.value = false
@@ -804,6 +815,16 @@ const getRedeem = async() => {
       height: 80%;
       object-fit: contain;
     }
+    >a.btn-download{
+      position: absolute;
+      left: 50%;
+      transform: translateX(-50%);
+      bottom: 40px;
+      font-family: Source Han Sans CN, Source Han Sans CN;
+      font-weight: bold;
+      font-size: 20px;
+      color: #000;
+    }
     >button.close{
       position: absolute;
       top: 20px;