feat: first add
This commit is contained in:
+24
@@ -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
@@ -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,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
@@ -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
|
||||||
@@ -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;
|
||||||
@@ -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";
|
||||||
@@ -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
|
||||||
|
};
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
export default async function sleep(timeout) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
resolve(true);
|
||||||
|
}, timeout);
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -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'
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user