feat: first add

This commit is contained in:
2025-01-19 13:22:58 +08:00
commit 7f53f82fd4
16 changed files with 2337 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
+273
View File
@@ -0,0 +1,273 @@
import cuid from "cuid";
import _ from "lodash";
import LogHelper from "./LogHelper.mjs";
class DataLogHelper {
name = "";
type = "";
id = null;
constructor({
name,
type
}) {
this.name = name;
this.type = type;
}
async addDataLog({
data
}) {
const {
name,
type
} = this;
if (name != "dataLog") {
// 记录数据操作日志
const {
data: _dataLogData
} = await LogHelper.addDataLog({
tableName: name,
type,
data
});
this.id = _dataLogData.id;
}
}
async modifyDataLogStatus() {
const {
name,
id
} = this;
if (name != "dataLog" && id) {
// 更新日志状态
await LogHelper.modifyDataLogStatus({
id
});
}
}
}
// 它代表创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。
export default class CURDHelper {
/**
* 读取列表数据
* @param {*} param0
* @returns
*/
static async retrieveList({
db,
name,
params
}) {
await db.read();
/******************************参数过滤**********************************/
const data = db.data[name].filter((item) => {
let isMatch = true;
for (let field in params) {
if (["page", "pageSize"].includes(field)) {
continue;
}
if (typeof (item[field]) == "string") {
isMatch = item[field].indexOf(params[field]) > -1;
} else if (typeof (item[field]) == "number") {
isMatch = item[field] == params[field];
}
else if (item[field] instanceof Array) {
// 数据为数组的情况进行比较
isMatch = item[field].includes(params[field]);
}
if (!isMatch)
break;
}
return isMatch;
});
/******************************参数过滤**********************************/
/******************************分页过滤**********************************/
const {
page,
pageSize
} = params;
let batchData = data;
if (page && pageSize) {
batchData = data.slice((page - 1) * pageSize, page * pageSize);
}
/******************************分页过滤**********************************/
return {
code: 0,
data: batchData.sort((a, b) => {
return a.sort - b.sort;
}) || [],
total: data.length
};
}
/**
* 读取单条数据
* @param {*} param0
*/
static async retrieveSingle({
db,
name,
params
}) {
await db.read();
const data = db.data[name];
const query = params;
let detail = {};
if (query.id && data) {
detail = data.find((item) => {
return item.id == query.id;
});
}
return {
code: 0,
data: detail || {}
};
}
/**
* 修改数据
* @param {*} param0
*/
static async update({
db,
name,
data
}) {
await db.read();
// You can also use this syntax if you prefer
if (!db.data[name])
db.data[name] = [];
const dataList = db.data[name];
const id = data.id;
if (id && dataList) {
const currentDetail = dataList.find(item => item.id == id);
if (currentDetail) {
_.merge(currentDetail, data);
}
const dLH = new DataLogHelper({
name,
type: "upd"
});
await dLH.addDataLog({
data: currentDetail
});
// Write db.data content to db.json
await db.write()
await dLH.modifyDataLogStatus();
}
return {
code: 0,
};
}
/**
* 创建数据
* @param {*} param0
*/
static async create({
db,
name,
data
}) {
await db.read();
if (!db.data[name])
db.data[name] = [];
const dataList = db.data[name];
data.id = cuid();
data.createTime = new Date();
dataList.push(data)
const dLH = new DataLogHelper({
name,
type: "add"
});
await dLH.addDataLog({
data
});
// Write db.data content to db.json
await db.write()
await dLH.modifyDataLogStatus();
return {
code: 0,
data
};
}
/**
* 删除数据
* @param {*} param0
* @returns
*/
static async delete({
db,
name,
data
}) {
await db.read();
// You can also use this syntax if you prefer
if (!db.data[name])
db.data[name] = [];
const dataList = db.data[name];
const ids = data.ids;
if (ids.length > 0 && dataList) {
let id = null;
const delDataList = [];
for (let i = 0; i < ids.length; i++) {
id = ids[i];
const idx = dataList.findIndex(item => item.id == id);
if (idx != -1) {
delDataList.push(dataList[idx]);
dataList.splice(idx, 1);
}
}
const dLH = new DataLogHelper({
name,
type: "del"
});
await dLH.addDataLog({
data: delDataList
});
// Write db.data content to db.json
await db.write()
await dLH.modifyDataLogStatus();
}
return {
code: 0,
};
}
}
+12
View File
@@ -0,0 +1,12 @@
import yaml from "yaml";
import fs from "fs";
/**
* 配置信息帮助类
*/
export default class ConfigHelper {
static config = null;
static initConfig() {
this.config = yaml.parse(fs.readFileSync("./config.yml").toString());
}
}
+30
View File
@@ -0,0 +1,30 @@
import {
getDb,
getResourceDb,
getBackupDb,
getLogDb
} from "./dbServer.mjs";
export default class DBHelper {
static baseDB = null;
static resourceDB = null;
static backupDB = null;
static logDB = null;
static async init() {
this.baseDB = await getDb();
this.resourceDB = await getResourceDb();
this.backupDB = await getBackupDb();
this.logDB = await getLogDb();
}
static getBackupDb() {
// return getBackupDb();
return this.backupDB;
}
static getLogDb() {
// return getLogDb();
return this.logDB;
}
}
+53
View File
@@ -0,0 +1,53 @@
import DBHelper from "./DBHelper.mjs";
import CURDHelper from "./CURDHelper.mjs";
export default class LogHelper {
static async addDataLog({
tableName,
type,
data
}) {
const db = await DBHelper.getLogDb();
return CURDHelper.create({
db,
name: "dataLog",
data: {
dataId: data.id,
type,
tableName,
data,
// 待生效
status: 0,
createTime: new Date()
}
})
}
static async modifyDataLogStatus({
id
}) {
const db = await DBHelper.getLogDb();
const {
data,
code
} = await CURDHelper.retrieveSingle({
db,
name: "dataLog",
params: {
id
}
})
if (code == 0) {
await CURDHelper.update({
db,
name: "dataLog",
data: {
...data,
// 生效
status: 1
}
});
}
}
}
+144
View File
@@ -0,0 +1,144 @@
import CURDHelper from "./CURDHelper.mjs";
export default class RouterFactor {
name = "";
db = null;
router = null;
constructor({
router: _router,
db: _db,
name: _name
}) {
this.router = _router;
this.db = _db;
this.name = _name;
}
/**
* 创建列表数据路由
*/
createGetList() {
const {
name,
db,
router
} = this;
router.post(`/api/${name}/list`, async (ctx) => {
// 设置头类型, 如果不设置,会直接下载该页面
ctx.type = 'application/json';
const body = ctx.request.body;
const data = await CURDHelper.retrieveList({
db,
name,
params: body
});
ctx.body = data;
});
}
/**
* 创建详情路由
*/
createGetDetail() {
const {
name,
db,
router
} = this;
router.get(`/api/${name}`, async (ctx) => {
// 设置头类型, 如果不设置,会直接下载该页面
ctx.type = 'application/json';
const query = ctx.request.query;
const data = await CURDHelper.retrieveSingle({
db,
name,
params: query
});
ctx.body = data;
});
}
/**
* 修改数据
*/
createUpdate() {
const {
name,
db,
router
} = this;
router.post(`/api/${name}/upd`, async (ctx) => {
// 设置头类型, 如果不设置,会直接下载该页面
ctx.type = 'application/json';
const body = ctx.request.body;
const data = await CURDHelper.update({
db,
name,
data: body
});
ctx.body = data;
});
}
/**
* 新增数据
*/
createAdd() {
const {
name,
db,
router
} = this;
router.post(`/api/${name}/add`, async (ctx) => {
// 设置头类型, 如果不设置,会直接下载该页面
ctx.type = 'application/json';
const body = ctx.request.body;
const data = await CURDHelper.create({
db,
name,
data: body
});
ctx.body = data;
});
}
/**
* 删除数据
*/
createDelete() {
const {
name,
db,
router
} = this;
router.post(`/api/${name}/delete`, async (ctx) => {
// 设置头类型, 如果不设置,会直接下载该页面
ctx.type = 'application/json';
const body = ctx.request.body;
const data = await CURDHelper.delete({
db,
name,
data: body
});
ctx.body = data;
});
}
creaetBaseRouter() {
this.createGetList();
this.createGetDetail();
this.createAdd();
this.createUpdate();
this.createDelete();
}
}
+145
View File
@@ -0,0 +1,145 @@
import fs from "fs";
import dayjs from "dayjs";
import _ from "lodash";
import CURDHelper from "./CURDHelper.mjs";
import DBHelper from "./DBHelper.mjs";
import child_process from "child_process";
import sleep from "./sleep.mjs";
import ConfigHelper from "./ConfigHelper.mjs";
/**
* 资源文件备份帮助类
*/
export default class BackupHelper {
/**
* 获取文件名称 fileName.ext
* @param {*} path
* @returns
*/
getFileName(path) {
const arr = path.split('\/');
if (arr.length >= 2) {
return arr.reverse()[0];
} else {
return path;
}
}
/**
* 获取文件后缀和文件名称
* @param {*} path
* @returns
*/
getFileExt(path) {
let arr = path.split('.');
if (arr.length >= 2) {
arr = arr.reverse();
return {
name: arr[1],
ext: "." + arr[0]
};
} else {
return {
name: path,
ext: ""
};
}
}
/**
* 创建文件夹(指定文件夹路径不存在时才创建)
* @param {*} filePath
*/
mkDir(filePath) {
const isExists = fs.existsSync(filePath);
if (!isExists) {
fs.mkdirSync(filePath)
}
}
addBackUPRecord = async (data) => {
return CURDHelper.create({
db: await DBHelper.getBackupDb(),
name: 'backupHistory',
data
})
}
updateBackUPRecord = async (data) => {
return CURDHelper.update({
db: await DBHelper.getBackupDb(),
name: 'backupHistory',
data
})
}
// backupToBaiduYunPan = () => {
// let cmd = 'python';
// let args = ('F:\\sourceCode\\2021\\test-baiduPan\\python\\getInfo.py').split(' ');
// let task = child_process.spawnSync(cmd, args);
// console.log("用户信息:", task.stdout.toString());
// }
/**
* 根据配置备份文件
* @param {*} data:[{original:string,dest:string}]
*/
async bakFile(data) {
for (const item of (data || [])) {
const isExists = fs.existsSync(item.original);
if (isExists) {
this.mkDir(item.dest);
const fileName = this.getFileName(item.original);
const fileInfo = this.getFileExt(fileName);
const timeSuffix = dayjs().format('YYYYMMDDHHmmss');
const fullFileName = fileInfo.name + timeSuffix + fileInfo.ext;
// 新增备份记录
const {
data: newRecord,
code
} = await this.addBackUPRecord({
name: fullFileName,
category: item.category
});
if (code == 0) {
// 备份文件到本地其它路径
fs.writeFileSync(item.dest + "\/" + fullFileName, fs.readFileSync(item.original));
// 更新备份记录状态
await this.updateBackUPRecord({
id: newRecord.id,
status: "1"
});
// await sleep(3 * 1000);
// this.backupToBaiduYunPan();
}
}
}
}
}
const startWebServer = () => {
let cmd = 'pm2';
let args = ('start computer-cms-server').split(' ');
let task = child_process.spawnSync(cmd, args);
console.log("pm2 log:", task);
}
const stopWebServer = () => {
let cmd = 'pm2';
let args = ('stop computer-cms-server').split(' ');
let task = child_process.spawnSync(cmd, args);
console.log("pm2 log:", task);
}
const bH = new BackupHelper();
(async () => {
ConfigHelper.initConfig();
await DBHelper.init();
stopWebServer();
await bH.bakFile(ConfigHelper.config.dbBak);
startWebServer();
})()
+23
View File
@@ -0,0 +1,23 @@
path: E:\sourceCode\2024\anki_admin\QuestionMakingSystem\server\db\
db: # 数据库配置
db: &db db.json
resourceDB: &resourceDB resourceDB.json
backupDB: &backupDB backupDB.json
logDB: &logDB logDB.json
dbBak: # 数据库备份配置
- #
original: *db
dest: F:/sourceCode/2022/compute-cms/bak/db
category: db
- #
original: *resourceDB
dest: F:/sourceCode/2022/compute-cms/bak/resourceDB
category: resourceDB
- #
original: *backupDB
dest: F:/sourceCode/2022/compute-cms/bak/backupDB
category: backupDB
- #
original: *logDB
dest: F:/sourceCode/2022/compute-cms/bak/logDB
category: logDB
+81
View File
@@ -0,0 +1,81 @@
import {
join,
dirname
} from 'path'
import {
Low,
JSONFile
} from 'lowdb'
import {
fileURLToPath
} from 'url'
import ConfigHelper from "./ConfigHelper.mjs";
const __dirname = dirname(fileURLToPath(
import.meta.url));
const getDbPath = (dbName, defPath) => {
let file = "";
if (ConfigHelper.config && ConfigHelper.config.db && ConfigHelper.config.db[dbName]) {
file = ConfigHelper.config.path + ConfigHelper.config.db[dbName];
} else {
file = defPath;
}
return file;
}
/**
* 基础数据库
* @returns
*/
export const getDb = async () => {
let file = getDbPath('db', join(__dirname, 'db.json'));
const adapter = new JSONFile(file)
const db = new Low(adapter)
await db.read();
return db;
}
/**
* 文件资源库
* @returns
*/
export const getResourceDb = async () => {
let file = getDbPath('resourceDB', join(__dirname, 'resourceDB.json'));
const adapter = new JSONFile(file)
const db = new Low(adapter)
await db.read();
return db;
}
/**
* 备份记录存储库
* @returns
*/
export const getBackupDb = async () => {
let file = getDbPath('backupDB', join(__dirname, 'backupDB.json'));
const adapter = new JSONFile(file)
const db = new Low(adapter)
await db.read();
return db;
}
/**
* 日志存储库
* @returns
*/
export const getLogDb = async () => {
let file = getDbPath('logDB', join(__dirname, 'logDB.json'));
const adapter = new JSONFile(file)
const db = new Low(adapter)
await db.read();
return db;
}
export default getDb;
+23
View File
@@ -0,0 +1,23 @@
// 备份
export * from "./backupHelper.mjs";
export { default as BackupHelper } from "./backupHelper.mjs";
// 配置
export * from "./ConfigHelper.mjs";
export { default as ConfigHelper } from "./ConfigHelper.mjs";
// 增删改查抽象方法
export * from "./CURDHelper.mjs";
export { default as CURDHelper } from "./CURDHelper.mjs";
// 数据库服务
export * from "./dbServer.mjs";
export { default as getDb } from "./dbServer.mjs";
// 日志服务
export * from "./LogHelper.mjs";
export { default as LogHelper } from "./LogHelper.mjs";
// 路由工厂类
export * from "./RouterFactory.mjs";
export { default as RouterFactory } from "./RouterFactory.mjs";
+464
View File
@@ -0,0 +1,464 @@
var F = Object.defineProperty;
var j = (o, t, a) => t in o ? F(o, t, { enumerable: !0, configurable: !0, writable: !0, value: a }) : o[t] = a;
var d = (o, t, a) => j(o, typeof t != "symbol" ? t + "" : t, a);
import f from "fs";
import v from "dayjs";
import R from "lodash";
import H from "cuid";
import { dirname as q, join as w } from "path";
import { JSONFile as m, Low as D } from "lowdb";
import { fileURLToPath as U } from "url";
import x from "yaml";
class y {
static initConfig() {
this.config = x.parse(f.readFileSync("./config.yml").toString());
}
}
d(y, "config", null);
const b = q(U(
import.meta.url
)), h = (o, t) => {
let a = "";
return y.config && y.config.db && y.config.db[o] ? a = y.config.path + y.config.db[o] : a = t, a;
}, E = async () => {
let o = h("db", w(b, "db.json"));
const t = new m(o), a = new D(t);
return await a.read(), a;
}, N = async () => {
let o = h("resourceDB", w(b, "resourceDB.json"));
const t = new m(o), a = new D(t);
return await a.read(), a;
}, P = async () => {
let o = h("backupDB", w(b, "backupDB.json"));
const t = new m(o), a = new D(t);
return await a.read(), a;
}, _ = async () => {
let o = h("logDB", w(b, "logDB.json"));
const t = new m(o), a = new D(t);
return await a.read(), a;
};
class g {
static async init() {
this.baseDB = await E(), this.resourceDB = await N(), this.backupDB = await P(), this.logDB = await _();
}
static getBackupDb() {
return this.backupDB;
}
static getLogDb() {
return this.logDB;
}
}
d(g, "baseDB", null), d(g, "resourceDB", null), d(g, "backupDB", null), d(g, "logDB", null);
class k {
static async addDataLog({
tableName: t,
type: a,
data: i
}) {
const e = await g.getLogDb();
return p.create({
db: e,
name: "dataLog",
data: {
dataId: i.id,
type: a,
tableName: t,
data: i,
// 待生效
status: 0,
createTime: /* @__PURE__ */ new Date()
}
});
}
static async modifyDataLogStatus({
id: t
}) {
const a = await g.getLogDb(), {
data: i,
code: e
} = await p.retrieveSingle({
db: a,
name: "dataLog",
params: {
id: t
}
});
e == 0 && await p.update({
db: a,
name: "dataLog",
data: {
...i,
// 生效
status: 1
}
});
}
}
class L {
constructor({
name: t,
type: a
}) {
d(this, "name", "");
d(this, "type", "");
d(this, "id", null);
this.name = t, this.type = a;
}
async addDataLog({
data: t
}) {
const {
name: a,
type: i
} = this;
if (a != "dataLog") {
const {
data: e
} = await k.addDataLog({
tableName: a,
type: i,
data: t
});
this.id = e.id;
}
}
async modifyDataLogStatus() {
const {
name: t,
id: a
} = this;
t != "dataLog" && a && await k.modifyDataLogStatus({
id: a
});
}
}
class p {
/**
* 读取列表数据
* @param {*} param0
* @returns
*/
static async retrieveList({
db: t,
name: a,
params: i
}) {
await t.read();
const e = t.data[a].filter((r) => {
let u = !0;
for (let c in i)
if (!["page", "pageSize"].includes(c) && (typeof r[c] == "string" ? u = r[c].indexOf(i[c]) > -1 : typeof r[c] == "number" ? u = r[c] == i[c] : r[c] instanceof Array && (u = r[c].includes(i[c])), !u))
break;
return u;
}), {
page: s,
pageSize: n
} = i;
let l = e;
return s && n && (l = e.slice((s - 1) * n, s * n)), {
code: 0,
data: l.sort((r, u) => r.sort - u.sort) || [],
total: e.length
};
}
/**
* 读取单条数据
* @param {*} param0
*/
static async retrieveSingle({
db: t,
name: a,
params: i
}) {
await t.read();
const e = t.data[a], s = i;
let n = {};
return s.id && e && (n = e.find((l) => l.id == s.id)), {
code: 0,
data: n || {}
};
}
/**
* 修改数据
* @param {*} param0
*/
static async update({
db: t,
name: a,
data: i
}) {
await t.read(), t.data[a] || (t.data[a] = []);
const e = t.data[a], s = i.id;
if (s && e) {
const n = e.find((r) => r.id == s);
n && R.merge(n, i);
const l = new L({
name: a,
type: "upd"
});
await l.addDataLog({
data: n
}), await t.write(), await l.modifyDataLogStatus();
}
return {
code: 0
};
}
/**
* 创建数据
* @param {*} param0
*/
static async create({
db: t,
name: a,
data: i
}) {
await t.read(), t.data[a] || (t.data[a] = []);
const e = t.data[a];
i.id = H(), i.createTime = /* @__PURE__ */ new Date(), e.push(i);
const s = new L({
name: a,
type: "add"
});
return await s.addDataLog({
data: i
}), await t.write(), await s.modifyDataLogStatus(), {
code: 0,
data: i
};
}
/**
* 删除数据
* @param {*} param0
* @returns
*/
static async delete({
db: t,
name: a,
data: i
}) {
await t.read(), t.data[a] || (t.data[a] = []);
const e = t.data[a], s = i.ids;
if (s.length > 0 && e) {
let n = null;
const l = [];
for (let u = 0; u < s.length; u++) {
n = s[u];
const c = e.findIndex((S) => S.id == n);
c != -1 && (l.push(e[c]), e.splice(c, 1));
}
const r = new L({
name: a,
type: "del"
});
await r.addDataLog({
data: l
}), await t.write(), await r.modifyDataLogStatus();
}
return {
code: 0
};
}
}
const B = {};
class $ {
constructor() {
d(this, "addBackUPRecord", async (t) => p.create({
db: await g.getBackupDb(),
name: "backupHistory",
data: t
}));
d(this, "updateBackUPRecord", async (t) => p.update({
db: await g.getBackupDb(),
name: "backupHistory",
data: t
}));
}
/**
* 获取文件名称 fileName.ext
* @param {*} path
* @returns
*/
getFileName(t) {
const a = t.split("/");
return a.length >= 2 ? a.reverse()[0] : t;
}
/**
* 获取文件后缀和文件名称
* @param {*} path
* @returns
*/
getFileExt(t) {
let a = t.split(".");
return a.length >= 2 ? (a = a.reverse(), {
name: a[1],
ext: "." + a[0]
}) : {
name: t,
ext: ""
};
}
/**
* 创建文件夹(指定文件夹路径不存在时才创建)
* @param {*} filePath
*/
mkDir(t) {
f.existsSync(t) || f.mkdirSync(t);
}
// backupToBaiduYunPan = () => {
// let cmd = 'python';
// let args = ('F:\\sourceCode\\2021\\test-baiduPan\\python\\getInfo.py').split(' ');
// let task = child_process.spawnSync(cmd, args);
// console.log("用户信息:", task.stdout.toString());
// }
/**
* 根据配置备份文件
* @param {*} data:[{original:string,dest:string}]
*/
async bakFile(t) {
for (const a of t || [])
if (f.existsSync(a.original)) {
this.mkDir(a.dest);
const e = this.getFileName(a.original), s = this.getFileExt(e), n = v().format("YYYYMMDDHHmmss"), l = s.name + n + s.ext, {
data: r,
code: u
} = await this.addBackUPRecord({
name: l,
category: a.category
});
u == 0 && (f.writeFileSync(a.dest + "/" + l, f.readFileSync(a.original)), await this.updateBackUPRecord({
id: r.id,
status: "1"
}));
}
}
}
const G = () => {
let o = "pm2", t = "start computer-cms-server".split(" "), a = B.spawnSync(o, t);
console.log("pm2 log:", a);
}, Y = () => {
let o = "pm2", t = "stop computer-cms-server".split(" "), a = B.spawnSync(o, t);
console.log("pm2 log:", a);
}, A = new $();
(async () => (y.initConfig(), await g.init(), Y(), await A.bakFile(y.config.dbBak), G()))();
class Q {
constructor({
router: t,
db: a,
name: i
}) {
d(this, "name", "");
d(this, "db", null);
d(this, "router", null);
this.router = t, this.db = a, this.name = i;
}
/**
* 创建列表数据路由
*/
createGetList() {
const {
name: t,
db: a,
router: i
} = this;
i.post(`/api/${t}/list`, async (e) => {
e.type = "application/json";
const s = e.request.body, n = await p.retrieveList({
db: a,
name: t,
params: s
});
e.body = n;
});
}
/**
* 创建详情路由
*/
createGetDetail() {
const {
name: t,
db: a,
router: i
} = this;
i.get(`/api/${t}`, async (e) => {
e.type = "application/json";
const s = e.request.query, n = await p.retrieveSingle({
db: a,
name: t,
params: s
});
e.body = n;
});
}
/**
* 修改数据
*/
createUpdate() {
const {
name: t,
db: a,
router: i
} = this;
i.post(`/api/${t}/upd`, async (e) => {
e.type = "application/json";
const s = e.request.body, n = await p.update({
db: a,
name: t,
data: s
});
e.body = n;
});
}
/**
* 新增数据
*/
createAdd() {
const {
name: t,
db: a,
router: i
} = this;
i.post(`/api/${t}/add`, async (e) => {
e.type = "application/json";
const s = e.request.body, n = await p.create({
db: a,
name: t,
data: s
});
e.body = n;
});
}
/**
* 删除数据
*/
createDelete() {
const {
name: t,
db: a,
router: i
} = this;
i.post(`/api/${t}/delete`, async (e) => {
e.type = "application/json";
const s = e.request.body, n = await p.delete({
db: a,
name: t,
data: s
});
e.body = n;
});
}
creaetBaseRouter() {
this.createGetList(), this.createGetDetail(), this.createAdd(), this.createUpdate(), this.createDelete();
}
}
export {
$ as BackupHelper,
p as CURDHelper,
y as ConfigHelper,
k as LogHelper,
Q as RouterFactory,
P as getBackupDb,
E as getDb,
_ as getLogDb,
N as getResourceDb
};
+32
View File
@@ -0,0 +1,32 @@
{
"name": "funjia-server",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build":"vite build",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"@koa/multer": "^3.0.0",
"@types/yaml": "^1.9.7",
"cuid": "^2.1.8",
"dayjs": "^1.11.3",
"koa": "^2.13.4",
"koa-body": "^4.2.0",
"koa-mount": "^4.0.0",
"koa-router": "^10.1.1",
"koa-static": "^5.0.0",
"lodash": "^4.17.21",
"lowdb": "^3.0.0",
"multer": "^1.4.5-lts.1",
"node-cron": "^3.0.1",
"uuid": "^8.3.2",
"yaml": "^2.1.1"
},
"devDependencies": {
"vite": "^6.0.7"
}
}
+7
View File
@@ -0,0 +1,7 @@
export default async function sleep(timeout) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(true);
}, timeout);
});
}
+1
View File
@@ -0,0 +1 @@
import { BackupHelper } from "./index.mjs";
+25
View File
@@ -0,0 +1,25 @@
import { defineConfig } from 'vite';
export default defineConfig({
build: {
lib: {
entry: './index.mjs', // 你的库的入口文件,这里假设是 src/main.mjs
name: 'funjia-server', // 库的全局名称,将在浏览器环境中使用
formats: ['es'], // 输出的模块格式,这里包含 ES 模块和 UMD 模块
// fileName: (format) => `your-library-name.${format}.js` // 输出的文件名,根据不同的格式生成不同的文件名
},
rollupOptions: {
// 确保不包含 Node.js 特定的模块,避免将 Node.js 模块错误地打包到浏览器代码中
external: ['fs', 'path','url','node','node-cron','cuid','dayjs','koa','koa-body',
'koa-mount','koa-router','koa-static','lodash','lowdb','multer','uuid','yaml','@koa/multer','@types/yaml'],
output: {
exports: 'named',
// 在 Node.js 环境中不需要全局变量,可将此设置为 undefined
globals: undefined
}
},
// 构建为 Node.js 库时,将输出目录设置为 lib 而不是 dist,可根据需要修改
outDir: 'lib'
}
});
+1000
View File
File diff suppressed because it is too large Load Diff