first commit
This commit is contained in:
236
extensions/app/assets/lib/storage/storage.ts
Normal file
236
extensions/app/assets/lib/storage/storage.ts
Normal file
@@ -0,0 +1,236 @@
|
||||
import { error, js, log, sys } from 'cc';
|
||||
|
||||
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||||
|
||||
function encode(text: string, key: string) {
|
||||
key = key || chars;
|
||||
let encrypted = '';
|
||||
for (let i = 0; i < text.length; i++) {
|
||||
const charCode = text.charCodeAt(i) ^ key.charCodeAt(i % key.length);
|
||||
encrypted += String.fromCharCode(charCode);
|
||||
}
|
||||
return encrypted;
|
||||
}
|
||||
|
||||
function decode(encryptedText: string, key: string) {
|
||||
key = key || chars;
|
||||
let decrypted = '';
|
||||
for (let i = 0; i < encryptedText.length; i++) {
|
||||
const charCode = encryptedText.charCodeAt(i) ^ key.charCodeAt(i % key.length);
|
||||
decrypted += String.fromCharCode(charCode);
|
||||
}
|
||||
return decrypted;
|
||||
}
|
||||
|
||||
const weekOfYear = function (curDate?: Date) {
|
||||
/*
|
||||
date1是当前日期
|
||||
date2是当年第一天
|
||||
d是当前日期是今年第多少天
|
||||
用d + 当前年的第一天的周差距的和在除以7就是本年第几周
|
||||
*/
|
||||
curDate = curDate || new Date();
|
||||
let a = curDate.getFullYear();
|
||||
let b = curDate.getMonth() + 1;
|
||||
let c = curDate.getDate();
|
||||
|
||||
let date1 = new Date(a, b - 1, c), date2 = new Date(a, 0, 1),
|
||||
d = Math.round((date1.valueOf() - date2.valueOf()) / 86400000);
|
||||
return Math.ceil(
|
||||
(d + ((date2.getDay() + 1) - 1)) / 7
|
||||
);
|
||||
};
|
||||
|
||||
const getWeekUpdateTime = function () {
|
||||
const date = new Date();
|
||||
const year = date.getFullYear();
|
||||
const week = weekOfYear(date);
|
||||
return year + '' + week;
|
||||
};
|
||||
|
||||
const getDayUpdateTime = function (curDate?: Date) {
|
||||
curDate = curDate || new Date();
|
||||
return curDate.toLocaleDateString();
|
||||
};
|
||||
|
||||
export class Storage {
|
||||
static setting: {
|
||||
/**
|
||||
* 加密密钥
|
||||
* - 如果需要加密内容,请设置密钥的值
|
||||
*/
|
||||
secretKey: string
|
||||
} = {
|
||||
secretKey: ''
|
||||
};
|
||||
|
||||
private _cache = {};
|
||||
|
||||
/**
|
||||
* 返回值为false代表调用失败
|
||||
*/
|
||||
set(key: string, value: unknown) {
|
||||
if (typeof key === 'string' && typeof value !== 'undefined') {
|
||||
try {
|
||||
const data = JSON.stringify(value);
|
||||
if (Storage.setting.secretKey) {
|
||||
sys.localStorage.setItem(key, encode(data, Storage.setting.secretKey));
|
||||
} else {
|
||||
sys.localStorage.setItem(key, data);
|
||||
}
|
||||
// 设置缓存
|
||||
this._cache[key] = data;
|
||||
return true;
|
||||
} catch (err) { log(err); }
|
||||
} else {
|
||||
error('storage set error');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回值为undefined代表调用失败
|
||||
*/
|
||||
get(key: string) {
|
||||
// 先读取缓存
|
||||
if (typeof this._cache[key] !== 'undefined') {
|
||||
return JSON.parse(this._cache[key]);
|
||||
}
|
||||
|
||||
let result = null;
|
||||
try {
|
||||
let data = sys.localStorage.getItem(key);
|
||||
if (data && typeof data === 'string') {
|
||||
if (Storage.setting.secretKey) data = decode(data, Storage.setting.secretKey);
|
||||
// 设置缓存
|
||||
this._cache[key] = data;
|
||||
result = JSON.parse(data);
|
||||
} else if (data !== '' && data !== null) {
|
||||
result = undefined;
|
||||
}
|
||||
} catch (e) {
|
||||
result = undefined;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回值为false代表调用失败
|
||||
*/
|
||||
add(key: string, value: number = 1) {
|
||||
let result = this.get(key);
|
||||
if (result !== undefined) {
|
||||
result = result || 0;
|
||||
result += value;
|
||||
if (this.set(key, result)) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回值为false代表调用失败
|
||||
*/
|
||||
remove(key: string) {
|
||||
try {
|
||||
sys.localStorage.removeItem(key);
|
||||
delete this._cache[key];
|
||||
return true;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回值为false代表调用失败
|
||||
*/
|
||||
clear() {
|
||||
try {
|
||||
sys.localStorage.clear();
|
||||
js.clear(this._cache);
|
||||
return true;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置本周数据 [返回值为false代表调用失败]
|
||||
* @param {Function} cb 当已存在本周的数据时,会根据cb的返回决定是否存储,true代表存储
|
||||
*/
|
||||
setWeek(key: string, value: unknown, cb?: (oldValue: unknown, newValue: unknown) => boolean) {
|
||||
const updateTime = getWeekUpdateTime();
|
||||
|
||||
if (cb) {
|
||||
const data = this.getWeek(key);
|
||||
if (data !== undefined) {
|
||||
if (data === null || cb(data, value)) {
|
||||
return this.set(key, {
|
||||
data: value,
|
||||
updateTime: updateTime
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return this.set(key, {
|
||||
data: value,
|
||||
updateTime: updateTime
|
||||
});
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取本周数据 [返回值为undefined代表调用失败]
|
||||
*/
|
||||
getWeek(key: string) {
|
||||
const data = this.get(key);
|
||||
if (data && data.updateTime == getWeekUpdateTime()) {
|
||||
return data.data;
|
||||
}
|
||||
return data && null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置本天数据 [返回值为false代表调用失败]
|
||||
* @param {Function} cb 当已存在本天的数据时,会根据cb的返回决定是否存储,true代表存储
|
||||
*/
|
||||
setDay(key: string, value: unknown, cb?: (oldValue: unknown, newValue: unknown) => boolean) {
|
||||
const updateTime = getDayUpdateTime();
|
||||
|
||||
if (cb) {
|
||||
const data = this.getDay(key);
|
||||
if (data !== undefined) {
|
||||
if (data === null || cb(data, value)) {
|
||||
return this.set(key, {
|
||||
data: value,
|
||||
updateTime: updateTime
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return this.set(key, {
|
||||
data: value,
|
||||
updateTime: updateTime
|
||||
});
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取本天数据 [返回值为undefined代表调用失败]
|
||||
* @param {*} key
|
||||
*/
|
||||
getDay(key: string) {
|
||||
const data = this.get(key);
|
||||
if (data && data.updateTime == getDayUpdateTime()) {
|
||||
return data.data;
|
||||
}
|
||||
return data && null;
|
||||
}
|
||||
}
|
||||
|
||||
export default new Storage();
|
||||
Reference in New Issue
Block a user