소스 검색

完成链接模式协议文件跳转

yuanmingze 1 주 전
부모
커밋
e57f1a82c9
4개의 변경된 파일85개의 추가작업 그리고 10개의 파일을 삭제
  1. 11 2
      src/pages-auth/settlement-channel-sign/index.vue
  2. 22 8
      src/pages-mine/agreement/index.vue
  3. 45 0
      src/pages-mine/agreement/web-view.vue
  4. 7 0
      src/pages.json

+ 11 - 2
src/pages-auth/settlement-channel-sign/index.vue

@@ -67,7 +67,7 @@
             <text>已阅读并同意</text>
 
             <template v-for="(agreement, index) in agreementList" :key="agreement.templateUrl">
-              <text class="agreement-link" @click.stop="handlePreviewAgreementPdf(agreement)">
+              <text class="agreement-link" @click.stop="handlePreviewAgreement(agreement)">
                 《{{ agreement.name }}》
               </text>
 
@@ -147,6 +147,8 @@ interface AgreementPdfItem {
 }
 
 const SELECTABLE_CERT_STATUS = new Set(['UN_SIGN', 'FAIL_SIGN'])
+const WEB_VIEW_AGREEMENT_SUBJECT_LOCATION = 'CLOUD_ACCOUNT_LXLW'
+const WEB_VIEW_AGREEMENT_PAGE = '/pages-mine/agreement/web-view'
 
 const userStore = useUserStore()
 
@@ -407,7 +409,14 @@ const handleSignatureSuccess = async (payload: SignatureSuccessPayload) => {
   await certFn()
 }
 
-const handlePreviewAgreementPdf = (agreement: AgreementPdfItem): void => {
+const handlePreviewAgreement = (agreement: AgreementPdfItem): void => {
+  if (selectedSubjectLocation.value === WEB_VIEW_AGREEMENT_SUBJECT_LOCATION) {
+    uni.navigateTo({
+      url: `${WEB_VIEW_AGREEMENT_PAGE}?url=${encodeURIComponent(agreement.templateUrl)}`,
+    })
+    return
+  }
+
   void previewAgreementPdf({
     url: agreement.templateUrl,
   })

+ 22 - 8
src/pages-mine/agreement/index.vue

@@ -17,7 +17,7 @@
         :key="item.templateUrl"
         class="agreement-card"
         hover-class="agreement-card--active"
-        @click="handlePreviewPdf(item)"
+        @click="handlePreviewAgreement(item)"
       >
         <text class="agreement-card__title">《{{ item.name }}》</text>
         <text class="agreement-card__arrow">›</text>
@@ -43,19 +43,22 @@ interface StaticAgreementItem {
   path: string
 }
 
-interface AgreementPdfItem {
+interface AgreementItem {
   name: string
   templateUrl: string
+  subjectLocation: string
 }
 
 const AGREEMENT_PAGE_BASE = '/pages-mine/agreement'
 const CERT_SUCCESS_STATUS = 'CERT'
+const WEB_VIEW_AGREEMENT_SUBJECT_LOCATION = 'CLOUD_ACCOUNT_LXLW'
+const WEB_VIEW_AGREEMENT_PAGE = `${AGREEMENT_PAGE_BASE}/web-view`
 
 const userStore = useUserStore()
 
 const currentUserInfo = computed(() => userStore.currentUserInfo)
 
-const certSuccessList = ref<AgreementPdfItem[]>([])
+const certSuccessList = ref<AgreementItem[]>([])
 
 const hasSignedAgreement = (agreementCode: string): boolean => {
   const signedAgreement = currentUserInfo.value?.signedAgreement ?? []
@@ -115,19 +118,23 @@ const getCertifiedSubjectLocations = (): string[] => {
   return Array.from(new Set(subjectLocations))
 }
 
-const normalizeAgreementInfos = (list: agreementInfosItem[] = []): AgreementPdfItem[] => {
+const normalizeAgreementInfos = (
+  list: agreementInfosItem[] = [],
+  subjectLocation: string
+): AgreementItem[] => {
   return list
     .filter((item) => Boolean(item.templateUrl?.trim()))
     .map((item) => {
       return {
         name: item.name?.trim() || '协议',
         templateUrl: item.templateUrl.trim(),
+        subjectLocation,
       }
     })
 }
 
-const dedupeAgreementInfos = (list: AgreementPdfItem[]): AgreementPdfItem[] => {
-  const map = new Map<string, AgreementPdfItem>()
+const dedupeAgreementInfos = (list: AgreementItem[]): AgreementItem[] => {
+  const map = new Map<string, AgreementItem>()
 
   list.forEach((item) => {
     if (!map.has(item.templateUrl)) {
@@ -159,7 +166,7 @@ const getCertSuccessList = async (): Promise<void> => {
             subjectLocation,
           })
 
-          return normalizeAgreementInfos(res.data?.agreementInfos)
+          return normalizeAgreementInfos(res.data?.agreementInfos, subjectLocation)
         } catch (error) {
           console.log('getSubjectLocationAgreementApi error:', error)
           return []
@@ -179,7 +186,14 @@ const navigateToAgreementPage = (path: string): void => {
   })
 }
 
-const handlePreviewPdf = (item: AgreementPdfItem): void => {
+const handlePreviewAgreement = (item: AgreementItem): void => {
+  if (item.subjectLocation === WEB_VIEW_AGREEMENT_SUBJECT_LOCATION) {
+    uni.navigateTo({
+      url: `${WEB_VIEW_AGREEMENT_PAGE}?url=${encodeURIComponent(item.templateUrl)}`,
+    })
+    return
+  }
+
   void previewAgreementPdf({
     url: item.templateUrl,
   })

+ 45 - 0
src/pages-mine/agreement/web-view.vue

@@ -0,0 +1,45 @@
+<template>
+  <view class="agreement-web-view-page">
+    <web-view v-if="src" :src="src" />
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+
+import { onLoad } from '@dcloudio/uni-app'
+
+interface PageQuery {
+  url?: string
+}
+
+const src = ref('')
+
+const safeDecodeURIComponent = (value: string): string => {
+  try {
+    return decodeURIComponent(value)
+  } catch (error) {
+    console.error('decodeURIComponent error:', error)
+    return value
+  }
+}
+
+onLoad((query?: PageQuery) => {
+  if (!query?.url) {
+    uni.showToast({
+      title: '协议地址不存在',
+      icon: 'none',
+    })
+    return
+  }
+
+  src.value = safeDecodeURIComponent(query.url)
+})
+</script>
+
+<style lang="scss" scoped>
+.agreement-web-view-page {
+  width: 100%;
+  height: 100vh;
+}
+</style>

+ 7 - 0
src/pages.json

@@ -207,6 +207,13 @@
             "navigationBarTitleText": "个人信息使用授权书",
             "navigationStyle": "default"
           }
+        },
+        {
+          "path": "agreement/web-view",
+          "style": {
+            "navigationBarTitleText": "协议详情",
+            "navigationStyle": "default"
+          }
         }
       ]
     },