Просмотр исходного кода

Merge branch 'iteration-20260411' into jenkins-test

lex-wxl 1 день назад
Родитель
Сommit
6b7d4d0a6f

+ 7 - 2
src/App.tsx

@@ -21,10 +21,14 @@ export default defineComponent({
   setup() {
     // VIP购买弹窗状态
     const showVipModal = ref(false);
+    const hasClose = ref(false); // 是否允许关闭弹窗
 
     // 监听VIP购买弹窗事件(必须在setup开头同步注册,否则路由守卫emit时监听还未准备好)
-    eventGlobal.on('show-vip-purchase', () => {
+    eventGlobal.on('show-vip-purchase', (val?: boolean) => {
       showVipModal.value = true;
+      if (val) {
+        hasClose.value = true;
+      }
     });
 
     // const { needRefresh, offlineReady, updateServiceWorker } = useRegisterSW({
@@ -153,7 +157,7 @@ export default defineComponent({
           <NModal
             maskClosable={false}
             closeOnEsc={false}
-            closable={false}
+            closable={hasClose.value || false}
             displayDirective="show"
             preset="card"
             title="VIP会员续费"
@@ -162,6 +166,7 @@ export default defineComponent({
             v-model:show={showVipModal.value}
           >
             <VipPurchaseModal
+              hasCancel={hasClose.value}
               onClose={() => (showVipModal.value = false)}
               onSuccess={() => (showVipModal.value = false)}
             />

+ 1 - 1
src/components/VipPurchaseModal/index.module.less

@@ -131,7 +131,7 @@
     :global {
       .n-button {
         height: 64px;
-        width: 50%;
+        width: 38%;
         font-size: 20px;
         font-weight: 600;
         border-radius: 32px;

+ 15 - 8
src/components/VipPurchaseModal/index.tsx

@@ -37,6 +37,13 @@ interface VipPackage {
 
 export default defineComponent({
   name: 'VipPurchaseModal',
+  props: {
+    /** 是否有取消按钮 */
+    hasCancel: {
+      type: Boolean,
+      default: false
+    }
+  },
   emits: ['close', 'success'],
   setup(_, { emit }) {
     const userStore = useUserStore();
@@ -159,12 +166,10 @@ export default defineComponent({
       pollingTimer.value = window.setInterval(async () => {
         try {
           const { data } = await getOrderDetail(orderNo.value);
-          if (
-            data &&
-            (data.orderStatus === 'PAID' || data.status === 'SUCCESS')
-          ) {
+          if (data && data.status === 'PAID') {
             stopPolling();
             window.$message.success('支付成功');
+            handleCancel()
             await userStore.getInfo();
             emit('success');
             emit('close');
@@ -241,6 +246,7 @@ export default defineComponent({
           // getHttpOrigin() +
           qrCodeUrl.value =
             'https://test.kt.colexiu.com/classroom-app/#/payDefine?' + params;
+          console.log(qrCodeUrl.value);
           showQrCode.value = true;
           console.log(qrCodeUrl.value, 'value');
           startPolling();
@@ -278,8 +284,7 @@ export default defineComponent({
                       styles.packageItem,
                       selectedPackageId.value === pkg.id ? styles.selected : ''
                     ]}
-                    onClick={() => (selectedPackageId.value = pkg.id)}
-                  >
+                    onClick={() => (selectedPackageId.value = pkg.id)}>
                     <div class={styles.packageName}>{pkg.name}</div>
                     <div class={styles.freeText}>{pkg.freeText || ''}</div>
                     <div class={styles.packagePrice}>
@@ -293,14 +298,16 @@ export default defineComponent({
               </div>
 
               <div class={styles.btnGroup}>
+                <NButton round size="large" onClick={() => emit('close')}>
+                  取消
+                </NButton>
                 <NButton
                   round
                   size="large"
                   type="primary"
                   loading={loading.value}
                   disabled={loading.value || hasClicked.value}
-                  onClick={handlePurchase}
-                >
+                  onClick={handlePurchase}>
                   续费 ¥{currentPackage.value?.price}
                 </NButton>
               </div>

+ 17 - 0
src/components/layout/layoutTop.tsx

@@ -132,6 +132,10 @@ export default defineComponent({
       }
     };
 
+    const onOpenVip = () => {
+      eventGlobal.emit('show-vip-purchase', true);
+    };
+
     onMounted(() => {
       window.addEventListener('message', onImMessage);
       showImGroupLoading.value = true;
@@ -411,6 +415,19 @@ export default defineComponent({
                     previewDisabled></NImage>
                   <p class={styles.smallTitle}>关于我们</p>
                 </div>
+                <div class={styles.propWrapItem} onClick={() => onOpenVip()}>
+                  <svg
+                    class={styles.smallIcon}
+                    style={{ marginTop: '4px' }}
+                    xmlns="http://www.w3.org/2000/svg"
+                    xmlns:xlink="http://www.w3.org/1999/xlink"
+                    viewBox="0 0 24 24">
+                    <path
+                      d="M18.5 11.5c.92 0 1.75.26 2.49.69V5c0-1.1-.89-2-1.99-2H5c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h8.55c-.02-.17-.05-.33-.05-.5c0-2.76 2.24-5 5-5zm-5.61-1.45c-.56.28-1.23.28-1.79 0l-5.61-2.8a.893.893 0 0 1-.49-.8c0-.66.7-1.1 1.29-.8L12 8.5l5.71-2.85a.89.89 0 0 1 1.29.8c0 .34-.19.65-.49.8l-5.62 2.8zM18.5 13c-1.93 0-3.5 1.57-3.5 3.5s1.57 3.5 3.5 3.5s3.5-1.57 3.5-3.5s-1.57-3.5-3.5-3.5zm2 3.5c0 .28-.22.5-.5.5h-3c-.28 0-.5-.22-.5-.5s.22-.5.5-.5h3c.28 0 .5.22.5.5z"
+                      fill="currentColor"></path>
+                  </svg>
+                  <p class={styles.smallTitle}>会员续费</p>
+                </div>
               </div>
               <div
                 class={styles.logoutInfo}