Greasy Fork

Greasy Fork is available in English.

mock快照

mock数据快照,会把上一次成功的数据保存起来,等下一次访问报错的时候 把上一次的数据返回给你

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         mock快照
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  mock数据快照,会把上一次成功的数据保存起来,等下一次访问报错的时候 把上一次的数据返回给你
// @author       You
// @match        http://*/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @license MIT
// @run-at document-start
// @require      https://unpkg.com/[email protected]/dist/ajaxhook.min.js
// ==/UserScript==

(function () {
  'use strict';
  // 创建/更新一个数据库
  let creatUpdateStore = function (name, verson = 1) {
    console.log('creatUpdateStore');
    // 打开数据库
    let request = window.indexedDB.open(name, verson);

    request.onsuccess = function (event) {
      console.log('open success');
    };

    request.onerror = function (event) {
      console.log('open fail');
    };

    request.onupgradeneeded = function (event) {
      let db = event.target.result;
      if (!db.objectStoreNames.contains(name)) {
        // 创建仓库对象(创建表格)
        // 这里我将主键设置为id
        let objectStore = db.createObjectStore(name, {
          keyPath: 'id',
          autoIncrement: true,
        });
      }
    };
  };

  // 往数据库中加数据
  let addDataStore = function (storeName, data, verson) {
    console.log('addDataStore');
    return new Promise((resolve, reject) => {
      let databaseName = storeName;
      let databaseVersion = verson || 1;
      let db;
      let request = indexedDB.open(databaseName, databaseVersion);
      request.onsuccess = function (event) {
        db = event.target.result;
        db = event.target.result;
        // 将数据保存到新建的对象仓库
        let objectStore = db
          .transaction(databaseName, 'readwrite')
          .objectStore(databaseName);

        try {
          objectStore.get(data.id);
          objectStore.put(data);
        } catch (e) {
          if (Array.isArray(data)) {
            data.forEach(function (dataItem) {
              // 添加一条数据
              objectStore.add(dataItem);
            });
            resolve();
          } else {
            // 添加一条数据
            objectStore.add(data);
            resolve();
          }
        }
      };
      request.onupgradeneeded = function (event) {
        let db = event.target.result;
        if (!db.objectStoreNames.contains(storeName)) {
          // 创建仓库对象(创建表格)
          // 这里我将主键设置为id
          let objectStore = db.createObjectStore(storeName, {
            keyPath: 'id',
            autoIncrement: true,
          });
        }
      };
    });
  };

  // 获取数据
  let getStoreData = function (name, key = 1) {
    console.log('getStoreData');
    return new Promise((resolve, reject) => {
      let request = indexedDB.open(name);
      request.onsuccess = function (event) {
        let db = event.target.result;
        let req;
        try {
          req = db.transaction(name, 'readwrite').objectStore(name).get(key); // 这里的“1”也是主键的键值
        } catch (e) {
          reject('用户失败');
        }
        if (!req) {
          return;
        }
        req.onsuccess = function () {
          resolve(req.result.value);
        };
        req.onerror = function () {
          reject('获取失败');
        };
      };
      request.onupgradeneeded = function (event) {
        let db = event.target.result;
        if (!db.objectStoreNames.contains(name)) {
          // 创建仓库对象(创建表格)
          // 这里我将主键设置为id
          let objectStore = db.createObjectStore(name, {
            keyPath: 'id',
            autoIncrement: true,
          });
        }
      };
    });
  };
  // 删除数据
  let delectStoreData = function (name, key) {
    console.log('delectStoreData');
    return new Promise((resolve, reject) => {
      let databaseName = name;
      let db;
      let request = window.indexedDB.open(databaseName);
      request.onsuccess = function (event) {
        db = event.target.result;
        let req = db
          .transaction(databaseName, 'readwrite')
          .objectStore(databaseName)
          .delete(key); // 这里指定的是主键的键值

        req.onsuccess = function () {
          resolve('删除成功');
        };

        req.onerror = function () {
          reject('删除失败');
        };
      };
    });
  };
  // 更新
  let updateStoreData = function (storeName, newData, key) {
    console.log('updateStoreData');
    return new Promise((resolve, reject) => {
      let request = window.indexedDB.open(storeName);
      let db;
      request.onsuccess = function (event) {
        db = event.target.result;
        let transaction = db.transaction(storeName, 'readwrite');
        let store = transaction.objectStore(storeName);
        let storeData = store.get(key);

        storeData.onsuccess = function (e) {
          let data = e.target.result || {};
          for (a in newData) {
            data[a] = newData[a];
          }
          store.put(data);
          resolve();
        };
      };
      request.onupgradeneeded = function (event) {
        let db = event.target.result;
        if (!db.objectStoreNames.contains(storeName)) {
          // 创建仓库对象(创建表格)
          // 这里我将主键设置为id
          let objectStore = db.createObjectStore(storeName, {
            keyPath: 'id',
            autoIncrement: true,
          });
        }
      };
    });
  };
  // 遍历获取
  let storeDataList = function (storeName) {
    console.log('storeDataList');
    return new Promise((resolve, reject) => {
      let request = window.indexedDB.open(storeName);
      let db;
      request.onsuccess = function (event) {
        db = event.target.result;
        let transaction = db.transaction(storeName);
        let store = transaction.objectStore(storeName);
        let cursor = store.openCursor(); //打开游标
        let dataList = new Array();
        cursor.onsuccess = function (e) {
          var cursorVal = e.target.result;
          if (cursorVal) {
            dataList.push(cursorVal.value);
            cursorVal.continue();
          } else {
            // 遍历结束
            resolve(dataList);
          }
        };
      };
      request.onupgradeneeded = function (event) {
        let db = event.target.result;
        if (!db.objectStoreNames.contains(storeName)) {
          // 创建仓库对象(创建表格)
          // 这里我将主键设置为id
          let objectStore = db.createObjectStore(storeName, {
            keyPath: 'id',
            autoIncrement: true,
          });
        }
      };
    });
  };

  // 批量删除
  function batchDelete(storeName, keys) {
    console.log('batchDelete');
    let allKeys = keys.map((item) => {
      item = +item;
      return delectStoreData(storeName, item);
    });
    return allKeys;
    /* Promise.all(allKeys).then(data => {
           console.log(data);
           resolve(data);
       });*/
  }
  creatUpdateStore('chenliwen');
  ah.proxy(
    {
      //请求发起前进入
      onRequest: (config, handler) => {
        console.log(config.url);
        handler.next(config);
      },
      //请求发生错误时进入,比如超时;注意,不包括http状态码错误,如404仍然会认为请求成功
      onError: (err, handler) => {
        // getStoreData(
        //   'chenliwen',
        //   handler.xhr.responseURL.replace(/&_t=.*/g, '')
        // );
        console.log(err);
        handler.next(err);
      },
      //请求成功后进入
      onResponse: async (response, handler) => {
        const key = handler.xhr.responseURL.replace(/_t=.*/g, '');
        if (response.statusText === 'Gateway Timeout') {
          response.status = 200;
          response.statusText = 'OK';
          const res = await getStoreData('chenliwen', key);
          response.response = res;
        } else {
          addDataStore('chenliwen', {
            id: key,
            value: response.response,
          });
        }
        handler.next(response);
      },
    },
    window
  );
  // Your code here...
})();