Przeglądaj źródła

Features:Fetch increase cache

陈帅 7 lat temu
rodzic
commit
cb3c382bc3
4 zmienionych plików z 77 dodań i 34 usunięć
  1. 0 27
      .stylelintrc
  2. 1 4
      src/pages/Dashboard/Analysis.js
  3. 48 3
      src/utils/request.js
  4. 28 0
      stylelint.config.js

+ 0 - 27
.stylelintrc

@@ -1,27 +0,0 @@
-{
-  "extends": ["stylelint-config-standard", "stylelint-config-prettier"],
-  "rules": {
-    "selector-pseudo-class-no-unknown": null,
-    "shorthand-property-no-redundant-values": null,
-    "at-rule-empty-line-before": null,
-    "at-rule-name-space-after": null,
-    "comment-empty-line-before": null,
-    "declaration-bang-space-before": null,
-    "declaration-empty-line-before": null,
-    "function-comma-newline-after": null,
-    "function-name-case": null,
-    "function-parentheses-newline-inside": null,
-    "function-max-empty-lines": null,
-    "function-whitespace-after": null,
-    "number-leading-zero": null,
-    "number-no-trailing-zeros": null,
-    "rule-empty-line-before": null,
-    "selector-combinator-space-after": null,
-    "selector-descendant-combinator-no-non-space": null,
-    "selector-list-comma-newline-after": null,
-    "selector-pseudo-element-colon-notation": null,
-    "unit-no-unknown": null,
-    "no-descending-specificity": null,
-    "value-list-max-empty-lines": null
-  }
-}

+ 1 - 4
src/pages/Dashboard/Analysis.js

@@ -236,10 +236,7 @@ class Analysis extends Component {
         sorter: (a, b) => a.range - b.range,
         render: (text, record) => (
           <Trend flag={record.status === 1 ? 'down' : 'up'}>
-            <span style={{ marginRight: 4 }}>
-              {text}
-              %
-            </span>
+            <span style={{ marginRight: 4 }}>{text}%</span>
           </Trend>
         ),
         align: 'right',

+ 48 - 3
src/utils/request.js

@@ -1,7 +1,7 @@
 import fetch from 'dva/fetch';
 import { notification } from 'antd';
 import router from 'umi/router';
-
+import hash from 'hash.js';
 const codeMessage = {
   200: '服务器成功返回请求的数据。',
   201: '新建或修改数据成功。',
@@ -41,7 +41,18 @@ function checkStatus(response) {
  * @param  {object} [options] The options we want to pass to "fetch"
  * @return {object}           An object containing either "data" or "err"
  */
-export default function request(url, options) {
+export default function request(url, options = {}) {
+  console.log(url);
+  /**
+   * Produce fingerprints based on url and parameters
+   * Maybe url has the same parameters
+   */
+  const fingerprint = url + options.body ? JSON.stringify(options.body) : '';
+  const hashcode = hash
+    .sha256()
+    .update(fingerprint)
+    .digest('hex');
+
   const defaultOptions = {
     credentials: 'include',
   };
@@ -66,10 +77,42 @@ export default function request(url, options) {
       };
     }
   }
-
+  let cached = localStorage.getItem(hashcode);
+  let whenCached = localStorage.getItem(hashcode + ':timestamp');
+  const expirys = options.expirys || 60;
+  if (cached !== null && whenCached !== null && expirys !== false) {
+    let age = (Date.now() - whenCached) / 1000;
+    if (age < expirys) {
+      let response = new Response(new Blob([cached]));
+      return response.json();
+    } else {
+      localStorage.removeItem(hashcode);
+      localStorage.removeItem(hashcode + ':timestamp');
+    }
+  }
   return fetch(url, newOptions)
     .then(checkStatus)
     .then(response => {
+      /**
+       * Clone a response data and store it in localStorage
+       * Does not support data other than json, Cache only json
+       */
+      let contentType = response.headers.get('Content-Type');
+      if (contentType && contentType.match(/application\/json/i)) {
+        // All data is saved as text
+        response
+          .clone()
+          .text()
+          .then(content => {
+            localStorage.setItem(hashcode, content);
+            localStorage.setItem(hashcode + ':timestamp', Date.now());
+          });
+      }
+      return response;
+    })
+    .then(response => {
+      // DELETE and 204 do not return data by default
+      // using .json will report an error.
       if (newOptions.method === 'DELETE' || response.status === 204) {
         return response.text();
       }
@@ -78,12 +121,14 @@ export default function request(url, options) {
     .catch(e => {
       const status = e.name;
       if (status === 401) {
+        // @HACK
         /* eslint-disable no-underscore-dangle */
         window.g_app._store.dispatch({
           type: 'login/logout',
         });
         return;
       }
+      // environment should not be used
       if (status === 403) {
         router.push('/exception/403');
         return;

+ 28 - 0
stylelint.config.js

@@ -0,0 +1,28 @@
+export default {
+  extends: ['stylelint-config-standard', 'stylelint-config-prettier'],
+  rules: {
+    'selector-pseudo-class-no-unknown': null,
+    'shorthand-property-no-redundant-values': null,
+    'at-rule-empty-line-before': null,
+    'at-rule-name-space-after': null,
+    'comment-empty-line-before': null,
+    'declaration-bang-space-before': null,
+    'declaration-empty-line-before': null,
+    'function-comma-newline-after': null,
+    'function-name-case': null,
+    'function-parentheses-newline-inside': null,
+    'function-max-empty-lines': null,
+    'function-whitespace-after': null,
+    'number-leading-zero': null,
+    'number-no-trailing-zeros': null,
+    'rule-empty-line-before': null,
+    'selector-combinator-space-after': null,
+    'selector-descendant-combinator-no-non-space': null,
+    'selector-list-comma-newline-after': null,
+    'selector-pseudo-element-colon-notation': null,
+    'unit-no-unknown': null,
+    'no-descending-specificity': null,
+    'value-list-max-empty-lines': null,
+    'no-missing-end-of-source-newline': null,
+  },
+};