// ==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...
})();