You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.2 KiB
93 lines
2.2 KiB
import { loadEnv } from "@build/utils";
|
|
import { LocalStorage, LowSync } from "lowdb";
|
|
import { chain, cloneDeep } from "lodash-es";
|
|
import { storageLocal } from ".";
|
|
import { cookies } from "./cookie";
|
|
type Data = {
|
|
database: {};
|
|
sys: {};
|
|
};
|
|
/**
|
|
* db 数据存储,采用 LocalStorage存储
|
|
*/
|
|
class DB {
|
|
private db: LowSync<Data>;
|
|
private static env = loadEnv();
|
|
constructor() {
|
|
this.db = new LowSync<Data>(
|
|
new LocalStorage<Data>(`${DB.env.VITE_TITLE}-${DB.env.VITE_VERSION}`)
|
|
);
|
|
this.initialization();
|
|
// @ts-ignore
|
|
this.db.chain = chain(this.db.data);
|
|
}
|
|
private initialization() {
|
|
this.db.data = storageLocal.getItem(
|
|
`${DB.env.VITE_TITLE}-${DB.env.VITE_VERSION}`
|
|
) || { database: {}, sys: {} };
|
|
this.db.write();
|
|
}
|
|
/**
|
|
* 检查路径是否存在 不存在的话初始化
|
|
* @param param0
|
|
* @returns path
|
|
*/
|
|
pathInit({
|
|
dbName = "database",
|
|
path = "",
|
|
user = true,
|
|
validator = () => true,
|
|
defaultValue = ""
|
|
}): string {
|
|
const uuid = cookies.get("uuid") || "ghost-uuid";
|
|
const currentPath = `${dbName}.${user ? `user.${uuid}` : "public"}${
|
|
path ? `.${path}` : ""
|
|
}`;
|
|
// @ts-ignore
|
|
const value = this.db.chain.get(currentPath).value();
|
|
// @ts-ignore
|
|
if (!(value !== undefined && validator(value))) {
|
|
// @ts-ignore
|
|
this.db.chain.set(currentPath, defaultValue).value();
|
|
this.db.write();
|
|
}
|
|
return currentPath;
|
|
}
|
|
/**
|
|
*将数据存储到指定位置 | 路径不存在会自动初始化
|
|
*
|
|
* 效果类似于取值 dbName.path = value
|
|
* @param param0
|
|
*/
|
|
dbSet({ dbName = "database", path = "", value = "", user = false }): void {
|
|
const currentPath = this.pathInit({
|
|
dbName,
|
|
path,
|
|
user
|
|
});
|
|
// @ts-ignore
|
|
this.db.chain.set(currentPath, value).value();
|
|
this.db.write();
|
|
}
|
|
/**
|
|
* 获取数据
|
|
*
|
|
* 效果类似于取值 dbName.path || defaultValue
|
|
* @param param0
|
|
* @returns
|
|
*/
|
|
dbGet({
|
|
dbName = "database",
|
|
path = "",
|
|
defaultValue = "",
|
|
user = false
|
|
}): any {
|
|
// @ts-ignore
|
|
const values = this.db.chain
|
|
.get(this.pathInit({ dbName, path, user, defaultValue }))
|
|
.value();
|
|
return cloneDeep(values);
|
|
}
|
|
}
|
|
|
|
export const db = new DB();
|