Explorar el Código

feat: 临时加离线包code

gemercheung hace 6 meses
padre
commit
b2b65b30ea
Se han modificado 5 ficheros con 143 adiciones y 3 borrados
  1. 16 0
      offline.html
  2. 112 0
      src/api/offline.ts
  3. 2 2
      src/api/setup.ts
  4. 1 1
      src/env/index.ts
  5. 12 0
      src/utils/params.ts

+ 16 - 0
offline.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/favicon.ico" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>案件信息</title>
+    <link rel="stylesheet" type="text/css" href="./lib/Cesium/Widgets/CesiumWidget/CesiumWidget.css">
+    <link rel="stylesheet" type="text/css" href="./lib/Cesium/Widgets/CesiumWidget/lighter.css">
+    <script>window.offline = true</script>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

+ 112 - 0
src/api/offline.ts

@@ -0,0 +1,112 @@
+import { params as envParams } from "@/env";
+import { paramsToStr, strToParams } from "@/utils/params";
+import { AxiosInstance } from "axios";
+import {namespace} from '@/env'
+import Axios from 'axios'
+
+export const offlinePrev = import.meta.env.DEV ? './offlineData/' : './'
+export const setOfflineAxios = (axios: AxiosInstance) => {
+  const data: {[key in string]: any} = {}
+  Axios.get(`./${offlinePrev}package/data.json`, {headers: { Accept: "application/json"}}).then(res => {
+    Object.assign(data, res.data)
+    const prev = import.meta.env.DEV ? offlinePrev : offlinePrev.substring(0, offlinePrev.length - 1)
+    for (const key in data) {
+      data[prev + key] = data[key]
+    }
+    ;(window as any).__data = data
+    ;(window as any).offlineData = new Proxy({}, {
+      get(t, key) {
+        if (key in data) {
+          return data[key as any]
+        } else {
+          console.log('请求', key)
+          return Axios.get(key as any, {headers: { Accept: "application/json"}})
+            .then((res) => {
+              data[key as any] = res.data
+              return res.data
+            })
+        }
+      }
+    })
+    
+  })
+
+  // 流接口
+  const files = {
+    [`${namespace}/caseExtractDetail/downDocx`]: './package/resource/caseExtractDetail.doc',
+    [`${namespace}/caseInquest/downDocx`]: './package/resource/caseInquest.doc',
+  } as any
+
+
+  // 添加请求拦截器
+  axios.interceptors.request.use(
+    async function (config) {
+      const params = {...config.params}
+      if (envParams.caseId) {
+        params.caseId = envParams.caseId
+      }
+      let item = data[config.url!+ paramsToStr(params)] 
+      console.log(data, item)
+      if (!item) {
+        delete params.caseId
+        item = data[config.url!+ paramsToStr(params)] 
+      }
+
+      if (item) {
+        throw {
+          isFakeResponse: true,
+            config,
+            response: {
+              data: item,
+              status: 200,
+              statusText: 'OK',
+              headers: {},
+              config: config,
+            }
+        }
+      } else if (files[config.url!]) {
+        const res = await Axios.get(files[config.url!], {responseType: 'blob'})
+        throw {
+          isFakeResponse: true,
+          response: {
+            data: res.data,
+            status: 200,
+            statusText: 'OK',
+            headers: {},
+            config: config,
+          },
+        }
+      } else {
+        console.error(config.url, '未在离线包中!')
+      }
+      return config
+    },
+    function (error) {
+      // 对请求错误做些什么
+      return Promise.reject(error);
+    }
+  );
+
+
+  // 添加响应拦截器
+  axios.interceptors.response.use(
+    function (response) {
+      if (!files[response.config.url!]) {
+        console.error(response.config.url + paramsToStr(response.config.params), '正在添加到离线包中!')
+        data[response.config.url+ paramsToStr(response.config.params)!] = response.data
+      }
+      // 对响应数据做点什么
+      return response;
+    },
+    err => {
+      if (err.isFakeResponse) {
+        return Promise.resolve(err.response);
+      }
+    }
+  );
+
+  (window as any).proxyData = () => {
+    console.log(data)
+    console.log(JSON.stringify(data))
+  };
+}

+ 2 - 2
src/api/setup.ts

@@ -1,6 +1,6 @@
 import Axios from 'axios'
 import { ResCode } from './constant'
-
+import { setOfflineAxios } from './offline'
 import type { AxiosResponse, AxiosRequestConfig } from 'axios'
 
 export type ResErrorHandler = <D, T extends ResData<D>>(response: AxiosResponse<T>, data?: T) => void
@@ -148,7 +148,7 @@ export const axiosFactory = () => {
       return config
     }
   )
-
+  offline && setOfflineAxios(axiosRaw)
   axiosRaw.interceptors.response.use(
     (response: AxiosResponse<ResData<any>>) => {
       for (const hook of axiosConfig.hook) {

+ 1 - 1
src/env/index.ts

@@ -2,7 +2,7 @@ import { stackFactory, flatStacksValue, strToParams } from '@/utils'
 import { reactive, ref } from 'vue'
 
 import type { FuseModel, TaggingPosition, View } from '@/store'
-
+export const namespace = '/fusion'
 export const viewModeStack = stackFactory(ref<'full' | 'auto'>('auto'))
 export const showToolbarStack = stackFactory(ref<boolean>(false))
 export const showHeadBarStack = stackFactory(ref<boolean>(true))

+ 12 - 0
src/utils/params.ts

@@ -15,4 +15,16 @@ export const strToParams = (str: string) => {
   }
 
   return result
+}
+
+
+export const paramsToStr = (params: {[key in string]: string}) => {
+  
+  if (params && Object.keys(params).length > 0) {
+    const entitys = Object.entries(params)
+    entitys.sort((a, b) => a[0].localeCompare(b[0]))
+    return '?' + entitys.map(([k, v]) => `${k}=${v}`).join('&')
+  } else {
+    return ''
+  }
 }