we0-cms-pgsql-api
Version:
A CMS API package for Next.js applications with dynamic table management
1,539 lines (1,432 loc) • 285 kB
JavaScript
import pg from 'pg';
import { Sequelize, DataTypes, Model, Op } from 'sequelize';
function asyncGeneratorStep(n, t, e, r, o, a, c) {
try {
var i = n[a](c),
u = i.value;
} catch (n) {
return void e(n);
}
i.done ? t(u) : Promise.resolve(u).then(r, o);
}
function _asyncToGenerator(n) {
return function () {
var t = this,
e = arguments;
return new Promise(function (r, o) {
var a = n.apply(t, e);
function _next(n) {
asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
}
function _throw(n) {
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
}
_next(void 0);
});
};
}
function getDefaultExportFromCjs (x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}
var regeneratorRuntime$1 = {exports: {}};
var OverloadYield = {exports: {}};
(function (module) {
function _OverloadYield(e, d) {
this.v = e, this.k = d;
}
module.exports = _OverloadYield, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (OverloadYield));
var OverloadYieldExports = OverloadYield.exports;
var regenerator$1 = {exports: {}};
var regeneratorDefine = {exports: {}};
(function (module) {
function _regeneratorDefine(e, r, n, t) {
var i = Object.defineProperty;
try {
i({}, "", {});
} catch (e) {
i = 0;
}
module.exports = _regeneratorDefine = function regeneratorDefine(e, r, n, t) {
if (r) i ? i(e, r, {
value: n,
enumerable: !t,
configurable: !t,
writable: !t
}) : e[r] = n;else {
var o = function o(r, n) {
_regeneratorDefine(e, r, function (e) {
return this._invoke(r, n, e);
});
};
o("next", 0), o("throw", 1), o("return", 2);
}
}, module.exports.__esModule = true, module.exports["default"] = module.exports, _regeneratorDefine(e, r, n, t);
}
module.exports = _regeneratorDefine, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (regeneratorDefine));
var regeneratorDefineExports = regeneratorDefine.exports;
(function (module) {
var regeneratorDefine = regeneratorDefineExports;
function _regenerator() {
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
var e,
t,
r = "function" == typeof Symbol ? Symbol : {},
n = r.iterator || "@@iterator",
o = r.toStringTag || "@@toStringTag";
function i(r, n, o, i) {
var c = n && n.prototype instanceof Generator ? n : Generator,
u = Object.create(c.prototype);
return regeneratorDefine(u, "_invoke", function (r, n, o) {
var i,
c,
u,
f = 0,
p = o || [],
y = !1,
G = {
p: 0,
n: 0,
v: e,
a: d,
f: d.bind(e, 4),
d: function d(t, r) {
return i = t, c = 0, u = e, G.n = r, a;
}
};
function d(r, n) {
for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {
var o,
i = p[t],
d = G.p,
l = i[2];
r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));
}
if (o || r > 1) return a;
throw y = !0, n;
}
return function (o, p, l) {
if (f > 1) throw TypeError("Generator is already running");
for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {
i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);
try {
if (f = 2, i) {
if (c || (o = "next"), t = i[o]) {
if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object");
if (!t.done) return t;
u = t.value, c < 2 && (c = 0);
} else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1);
i = e;
} else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;
} catch (t) {
i = e, c = 1, u = t;
} finally {
f = 1;
}
}
return {
value: t,
done: y
};
};
}(r, o, i), !0), u;
}
var a = {};
function Generator() {}
function GeneratorFunction() {}
function GeneratorFunctionPrototype() {}
t = Object.getPrototypeOf;
var c = [][n] ? t(t([][n]())) : (regeneratorDefine(t = {}, n, function () {
return this;
}), t),
u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);
function f(e) {
return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, regeneratorDefine(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e;
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, regeneratorDefine(u, "constructor", GeneratorFunctionPrototype), regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", regeneratorDefine(GeneratorFunctionPrototype, o, "GeneratorFunction"), regeneratorDefine(u), regeneratorDefine(u, o, "Generator"), regeneratorDefine(u, n, function () {
return this;
}), regeneratorDefine(u, "toString", function () {
return "[object Generator]";
}), (module.exports = _regenerator = function _regenerator() {
return {
w: i,
m: f
};
}, module.exports.__esModule = true, module.exports["default"] = module.exports)();
}
module.exports = _regenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (regenerator$1));
var regeneratorExports = regenerator$1.exports;
var regeneratorAsync = {exports: {}};
var regeneratorAsyncGen = {exports: {}};
var regeneratorAsyncIterator = {exports: {}};
(function (module) {
var OverloadYield = OverloadYieldExports;
var regeneratorDefine = regeneratorDefineExports;
function AsyncIterator(t, e) {
function n(r, o, i, f) {
try {
var c = t[r](o),
u = c.value;
return u instanceof OverloadYield ? e.resolve(u.v).then(function (t) {
n("next", t, i, f);
}, function (t) {
n("throw", t, i, f);
}) : e.resolve(u).then(function (t) {
c.value = t, i(c);
}, function (t) {
return n("throw", t, i, f);
});
} catch (t) {
f(t);
}
}
var r;
this.next || (regeneratorDefine(AsyncIterator.prototype), regeneratorDefine(AsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () {
return this;
})), regeneratorDefine(this, "_invoke", function (t, o, i) {
function f() {
return new e(function (e, r) {
n(t, i, e, r);
});
}
return r = r ? r.then(f, f) : f();
}, !0);
}
module.exports = AsyncIterator, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (regeneratorAsyncIterator));
var regeneratorAsyncIteratorExports = regeneratorAsyncIterator.exports;
(function (module) {
var regenerator = regeneratorExports;
var regeneratorAsyncIterator = regeneratorAsyncIteratorExports;
function _regeneratorAsyncGen(r, e, t, o, n) {
return new regeneratorAsyncIterator(regenerator().w(r, e, t, o), n || Promise);
}
module.exports = _regeneratorAsyncGen, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (regeneratorAsyncGen));
var regeneratorAsyncGenExports = regeneratorAsyncGen.exports;
(function (module) {
var regeneratorAsyncGen = regeneratorAsyncGenExports;
function _regeneratorAsync(n, e, r, t, o) {
var a = regeneratorAsyncGen(n, e, r, t, o);
return a.next().then(function (n) {
return n.done ? n.value : a.next();
});
}
module.exports = _regeneratorAsync, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (regeneratorAsync));
var regeneratorAsyncExports = regeneratorAsync.exports;
var regeneratorKeys = {exports: {}};
(function (module) {
function _regeneratorKeys(e) {
var n = Object(e),
r = [];
for (var t in n) r.unshift(t);
return function e() {
for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e;
return e.done = !0, e;
};
}
module.exports = _regeneratorKeys, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (regeneratorKeys));
var regeneratorKeysExports = regeneratorKeys.exports;
var regeneratorValues = {exports: {}};
var _typeof$1 = {exports: {}};
(function (module) {
function _typeof(o) {
"@babel/helpers - typeof";
return module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, module.exports.__esModule = true, module.exports["default"] = module.exports, _typeof(o);
}
module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (_typeof$1));
var _typeofExports = _typeof$1.exports;
(function (module) {
var _typeof = _typeofExports["default"];
function _regeneratorValues(e) {
if (null != e) {
var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"],
r = 0;
if (t) return t.call(e);
if ("function" == typeof e.next) return e;
if (!isNaN(e.length)) return {
next: function next() {
return e && r >= e.length && (e = void 0), {
value: e && e[r++],
done: !e
};
}
};
}
throw new TypeError(_typeof(e) + " is not iterable");
}
module.exports = _regeneratorValues, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (regeneratorValues));
var regeneratorValuesExports = regeneratorValues.exports;
(function (module) {
var OverloadYield = OverloadYieldExports;
var regenerator = regeneratorExports;
var regeneratorAsync = regeneratorAsyncExports;
var regeneratorAsyncGen = regeneratorAsyncGenExports;
var regeneratorAsyncIterator = regeneratorAsyncIteratorExports;
var regeneratorKeys = regeneratorKeysExports;
var regeneratorValues = regeneratorValuesExports;
function _regeneratorRuntime() {
var r = regenerator(),
e = r.m(_regeneratorRuntime),
t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor;
function n(r) {
var e = "function" == typeof r && r.constructor;
return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name));
}
var o = {
"throw": 1,
"return": 2,
"break": 3,
"continue": 3
};
function a(r) {
var e, t;
return function (n) {
e || (e = {
stop: function stop() {
return t(n.a, 2);
},
"catch": function _catch() {
return n.v;
},
abrupt: function abrupt(r, e) {
return t(n.a, o[r], e);
},
delegateYield: function delegateYield(r, o, a) {
return e.resultName = o, t(n.d, regeneratorValues(r), a);
},
finish: function finish(r) {
return t(n.f, r);
}
}, t = function t(r, _t, o) {
n.p = e.prev, n.n = e.next;
try {
return r(_t, o);
} finally {
e.next = n.n;
}
}), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n;
try {
return r.call(this, e);
} finally {
n.p = e.prev, n.n = e.next;
}
};
}
return (module.exports = _regeneratorRuntime = function _regeneratorRuntime() {
return {
wrap: function wrap(e, t, n, o) {
return r.w(a(e), t, n, o && o.reverse());
},
isGeneratorFunction: n,
mark: r.m,
awrap: function awrap(r, e) {
return new OverloadYield(r, e);
},
AsyncIterator: regeneratorAsyncIterator,
async: function async(r, e, t, o, u) {
return (n(e) ? regeneratorAsyncGen : regeneratorAsync)(a(r), e, t, o, u);
},
keys: regeneratorKeys,
values: regeneratorValues
};
}, module.exports.__esModule = true, module.exports["default"] = module.exports)();
}
module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports;
} (regeneratorRuntime$1));
var regeneratorRuntimeExports = regeneratorRuntime$1.exports;
// TODO(Babel 8): Remove this file.
var runtime = regeneratorRuntimeExports();
var regenerator = runtime;
// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=
try {
regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
if (typeof globalThis === "object") {
globalThis.regeneratorRuntime = runtime;
} else {
Function("r", "regeneratorRuntime = r")(runtime);
}
}
var _regeneratorRuntime = /*@__PURE__*/getDefaultExportFromCjs(regenerator);
var sequelizeInstance = null;
/**
* 初始化数据库连接
*/
function initializeDatabase$1(config) {
if (sequelizeInstance) {
return sequelizeInstance;
}
sequelizeInstance = new Sequelize({
dialect: "postgres",
dialectModule: pg,
host: config.host,
port: config.port,
database: config.database,
username: config.username,
password: config.password,
logging: config.logging || (process.env.NODE_ENV === "development" ? console.log : false),
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
define: {
timestamps: true,
underscored: true,
createdAt: "created_at",
updatedAt: "updated_at"
}
});
return sequelizeInstance;
}
/**
* 获取当前数据库实例
*/
function getDatabase() {
if (!sequelizeInstance) {
throw new Error("Database not initialized. Call initializeDatabase() first.");
}
return sequelizeInstance;
}
/**
* 测试数据库连接
*/
function testConnection() {
return _testConnection.apply(this, arguments);
}
/**
* 同步数据库模型
*/
function _testConnection() {
_testConnection = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
var sequelize, _t;
return _regeneratorRuntime.wrap(function (_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
sequelize = getDatabase();
_context.next = 1;
return sequelize.authenticate();
case 1:
console.log("PostgreSQL 数据库连接成功");
return _context.abrupt("return", true);
case 2:
_context.prev = 2;
_t = _context["catch"](0);
console.error("数据库连接失败:", _t);
return _context.abrupt("return", false);
case 3:
case "end":
return _context.stop();
}
}, _callee, null, [[0, 2]]);
}));
return _testConnection.apply(this, arguments);
}
function syncDatabase() {
return _syncDatabase.apply(this, arguments);
}
/**
* 关闭数据库连接
*/
function _syncDatabase() {
_syncDatabase = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
var sequelize, _t2;
return _regeneratorRuntime.wrap(function (_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
sequelize = getDatabase();
_context2.next = 1;
return sequelize.sync({
alter: true
});
case 1:
console.log("数据库模型同步成功");
return _context2.abrupt("return", true);
case 2:
_context2.prev = 2;
_t2 = _context2["catch"](0);
console.error("数据库同步失败:", _t2);
return _context2.abrupt("return", false);
case 3:
case "end":
return _context2.stop();
}
}, _callee2, null, [[0, 2]]);
}));
return _syncDatabase.apply(this, arguments);
}
function closeDatabase() {
return _closeDatabase.apply(this, arguments);
}
function _closeDatabase() {
_closeDatabase = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
return _regeneratorRuntime.wrap(function (_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
if (!sequelizeInstance) {
_context3.next = 2;
break;
}
_context3.next = 1;
return sequelizeInstance.close();
case 1:
sequelizeInstance = null;
case 2:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _closeDatabase.apply(this, arguments);
}
function _classCallCheck(a, n) {
if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
}
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, _typeof(o);
}
function toPrimitive(t, r) {
if ("object" != _typeof(t) || !t) return t;
var e = t[Symbol.toPrimitive];
if (void 0 !== e) {
var i = e.call(t, r || "default");
if ("object" != _typeof(i)) return i;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r ? String : Number)(t);
}
function toPropertyKey(t) {
var i = toPrimitive(t, "string");
return "symbol" == _typeof(i) ? i : i + "";
}
function _defineProperties(e, r) {
for (var t = 0; t < r.length; t++) {
var o = r[t];
o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);
}
}
function _createClass(e, r, t) {
return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
writable: !1
}), e;
}
function _assertThisInitialized(e) {
if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
return e;
}
function _possibleConstructorReturn(t, e) {
if (e && ("object" == _typeof(e) || "function" == typeof e)) return e;
if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined");
return _assertThisInitialized(t);
}
function _getPrototypeOf(t) {
return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {
return t.__proto__ || Object.getPrototypeOf(t);
}, _getPrototypeOf(t);
}
function _setPrototypeOf(t, e) {
return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {
return t.__proto__ = e, t;
}, _setPrototypeOf(t, e);
}
function _inherits(t, e) {
if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function");
t.prototype = Object.create(e && e.prototype, {
constructor: {
value: t,
writable: !0,
configurable: !0
}
}), Object.defineProperty(t, "prototype", {
writable: !1
}), e && _setPrototypeOf(t, e);
}
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
// CMS 模型类
var CmsModel = /*#__PURE__*/function (_Model) {
function CmsModel() {
_classCallCheck(this, CmsModel);
return _callSuper(this, CmsModel, arguments);
}
_inherits(CmsModel, _Model);
return _createClass(CmsModel, null, [{
key: "associate",
value:
// 关联方法
function associate() {
// 这里可以定义与其他模型的关联
}
}]);
}(Model);
/**
* 初始化 CMS 模型
*/
function initializeCmsModel() {
var sequelize = getDatabase();
CmsModel.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: "模型名称"
},
table_name: {
type: DataTypes.STRING(100),
allowNull: false,
comment: "表名"
},
json_schema: {
type: DataTypes.JSONB,
allowNull: false,
comment: "JSON 模式定义"
},
created_at: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW
},
updated_at: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW
}
}, {
sequelize: sequelize,
modelName: "CmsModel",
tableName: "cms_models",
timestamps: true,
underscored: true,
createdAt: "created_at",
updatedAt: "updated_at"
});
return CmsModel;
}
function _defineProperty(e, r, t) {
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
value: t,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[r] = t, e;
}
function _arrayWithHoles(r) {
if (Array.isArray(r)) return r;
}
function _iterableToArrayLimit(r, l) {
var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
if (null != t) {
var e,
n,
i,
u,
a = [],
f = !0,
o = !1;
try {
if (i = (t = t.call(r)).next, 0 === l) {
if (Object(t) !== t) return;
f = !1;
} else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
} catch (r) {
o = !0, n = r;
} finally {
try {
if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return;
} finally {
if (o) throw n;
}
}
return a;
}
}
function _arrayLikeToArray(r, a) {
(null == a || a > r.length) && (a = r.length);
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
return n;
}
function _unsupportedIterableToArray(r, a) {
if (r) {
if ("string" == typeof r) return _arrayLikeToArray(r, a);
var t = {}.toString.call(r).slice(8, -1);
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
}
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _slicedToArray(r, e) {
return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
}
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
// 字段类型映射
var fieldTypeMapping = {
string: DataTypes.STRING,
text: DataTypes.TEXT,
integer: DataTypes.INTEGER,
"float": DataTypes.FLOAT,
"boolean": DataTypes.BOOLEAN,
date: DataTypes.DATE,
datetime: DataTypes.DATE,
json: DataTypes.JSON,
email: DataTypes.STRING
};
var DynamicTableService = /*#__PURE__*/function () {
function DynamicTableService() {
_classCallCheck(this, DynamicTableService);
var sequelize = getDatabase();
this.queryInterface = sequelize.getQueryInterface();
}
/**
* 根据 JSON 模式创建数据表
*/
return _createClass(DynamicTableService, [{
key: "createTable",
value: (function () {
var _createTable = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(tableName, schema) {
var tableAttributes, _t;
return _regeneratorRuntime.wrap(function (_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
// 构建表结构
tableAttributes = {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
}
}; // 添加用户定义的字段
schema.fields.forEach(function (field) {
var fieldType = fieldTypeMapping[field.type] || DataTypes.STRING;
tableAttributes[field.name] = {
type: field.maxLength ? fieldType(field.maxLength) : fieldType,
allowNull: !field.required,
unique: field.unique || false,
defaultValue: field.defaultValue,
comment: field.comment
};
});
// 添加时间戳字段
tableAttributes.created_at = {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW
};
tableAttributes.updated_at = {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW
};
// 创建表
_context.next = 1;
return this.queryInterface.createTable(tableName, tableAttributes);
case 1:
console.log("\u8868 ".concat(tableName, " \u521B\u5EFA\u6210\u529F"));
return _context.abrupt("return", true);
case 2:
_context.prev = 2;
_t = _context["catch"](0);
console.error("\u521B\u5EFA\u8868 ".concat(tableName, " \u5931\u8D25:"), _t);
return _context.abrupt("return", false);
case 3:
case "end":
return _context.stop();
}
}, _callee, this, [[0, 2]]);
}));
function createTable(_x, _x2) {
return _createTable.apply(this, arguments);
}
return createTable;
}()
/**
* 删除数据表
*/
)
}, {
key: "dropTable",
value: (function () {
var _dropTable = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(tableName) {
var _t2;
return _regeneratorRuntime.wrap(function (_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
_context2.next = 1;
return this.queryInterface.dropTable(tableName);
case 1:
console.log("\u8868 ".concat(tableName, " \u5220\u9664\u6210\u529F"));
return _context2.abrupt("return", true);
case 2:
_context2.prev = 2;
_t2 = _context2["catch"](0);
console.error("\u5220\u9664\u8868 ".concat(tableName, " \u5931\u8D25:"), _t2);
return _context2.abrupt("return", false);
case 3:
case "end":
return _context2.stop();
}
}, _callee2, this, [[0, 2]]);
}));
function dropTable(_x3) {
return _dropTable.apply(this, arguments);
}
return dropTable;
}()
/**
* 检查表是否存在
*/
)
}, {
key: "tableExists",
value: (function () {
var _tableExists = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(tableName) {
var tables, _t3;
return _regeneratorRuntime.wrap(function (_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
_context3.next = 1;
return this.queryInterface.showAllTables();
case 1:
tables = _context3.sent;
return _context3.abrupt("return", tables.includes(tableName));
case 2:
_context3.prev = 2;
_t3 = _context3["catch"](0);
console.error("\u68C0\u67E5\u8868 ".concat(tableName, " \u662F\u5426\u5B58\u5728\u5931\u8D25:"), _t3);
return _context3.abrupt("return", false);
case 3:
case "end":
return _context3.stop();
}
}, _callee3, this, [[0, 2]]);
}));
function tableExists(_x4) {
return _tableExists.apply(this, arguments);
}
return tableExists;
}()
/**
* 获取表结构
*/
)
}, {
key: "getTableStructure",
value: (function () {
var _getTableStructure = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(tableName) {
var structure, _t4;
return _regeneratorRuntime.wrap(function (_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
_context4.prev = 0;
_context4.next = 1;
return this.queryInterface.describeTable(tableName);
case 1:
structure = _context4.sent;
return _context4.abrupt("return", structure);
case 2:
_context4.prev = 2;
_t4 = _context4["catch"](0);
console.error("\u83B7\u53D6\u8868 ".concat(tableName, " \u7ED3\u6784\u5931\u8D25:"), _t4);
return _context4.abrupt("return", null);
case 3:
case "end":
return _context4.stop();
}
}, _callee4, this, [[0, 2]]);
}));
function getTableStructure(_x5) {
return _getTableStructure.apply(this, arguments);
}
return getTableStructure;
}()
/**
* 执行原生 SQL 查询
*/
)
}, {
key: "executeQuery",
value: (function () {
var _executeQuery = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(sql, values) {
var sequelize, _yield$sequelize$quer, _yield$sequelize$quer2, results, _t5;
return _regeneratorRuntime.wrap(function (_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
_context5.prev = 0;
sequelize = getDatabase();
_context5.next = 1;
return sequelize.query(sql, {
replacements: values
});
case 1:
_yield$sequelize$quer = _context5.sent;
_yield$sequelize$quer2 = _slicedToArray(_yield$sequelize$quer, 1);
results = _yield$sequelize$quer2[0];
return _context5.abrupt("return", results);
case 2:
_context5.prev = 2;
_t5 = _context5["catch"](0);
console.error("执行 SQL 查询失败:", _t5);
throw _t5;
case 3:
case "end":
return _context5.stop();
}
}, _callee5, null, [[0, 2]]);
}));
function executeQuery(_x6, _x7) {
return _executeQuery.apply(this, arguments);
}
return executeQuery;
}()
/**
* 获取表数据(分页)
*/
)
}, {
key: "getTableData",
value: (function () {
var _getTableData = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(tableName) {
var page,
limit,
where,
offset,
whereClause,
countSql,
countResult,
total,
dataSql,
data,
_args6 = arguments,
_t6;
return _regeneratorRuntime.wrap(function (_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
page = _args6.length > 1 && _args6[1] !== undefined ? _args6[1] : 1;
limit = _args6.length > 2 && _args6[2] !== undefined ? _args6[2] : 10;
where = _args6.length > 3 ? _args6[3] : undefined;
_context6.prev = 1;
offset = (page - 1) * limit;
whereClause = where ? "WHERE ".concat(where) : ""; // 获取总数
countSql = "SELECT COUNT(*) as total FROM ".concat(tableName, " ").concat(whereClause);
_context6.next = 2;
return this.executeQuery(countSql);
case 2:
countResult = _context6.sent;
total = parseInt(countResult[0].total); // 获取数据
dataSql = "SELECT * FROM ".concat(tableName, " ").concat(whereClause, " ORDER BY id DESC LIMIT ").concat(limit, " OFFSET ").concat(offset);
_context6.next = 3;
return this.executeQuery(dataSql);
case 3:
data = _context6.sent;
return _context6.abrupt("return", {
data: data,
total: total,
page: page,
limit: limit,
totalPages: Math.ceil(total / limit)
});
case 4:
_context6.prev = 4;
_t6 = _context6["catch"](1);
console.error("\u83B7\u53D6\u8868 ".concat(tableName, " \u6570\u636E\u5931\u8D25:"), _t6);
throw _t6;
case 5:
case "end":
return _context6.stop();
}
}, _callee6, this, [[1, 4]]);
}));
function getTableData(_x8) {
return _getTableData.apply(this, arguments);
}
return getTableData;
}()
/**
* 插入数据
*/
)
}, {
key: "insertData",
value: (function () {
var _insertData = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7(tableName, data) {
var now, _insertData2, fields, values, placeholders, sql, result, _t7;
return _regeneratorRuntime.wrap(function (_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
_context7.prev = 0;
// 自动补充 created_at 和 updated_at 字段
now = new Date();
_insertData2 = _objectSpread(_objectSpread({}, data), {}, {
created_at: now,
updated_at: now
});
fields = Object.keys(_insertData2);
values = Object.values(_insertData2);
placeholders = fields.map(function () {
return "?";
}).join(", ");
sql = "INSERT INTO ".concat(tableName, " (").concat(fields.join(", "), ") VALUES (").concat(placeholders, ") RETURNING *");
_context7.next = 1;
return this.executeQuery(sql, values);
case 1:
result = _context7.sent;
return _context7.abrupt("return", result[0]);
case 2:
_context7.prev = 2;
_t7 = _context7["catch"](0);
console.error("\u63D2\u5165\u6570\u636E\u5230\u8868 ".concat(tableName, " \u5931\u8D25:"), _t7);
throw _t7;
case 3:
case "end":
return _context7.stop();
}
}, _callee7, this, [[0, 2]]);
}));
function insertData(_x9, _x0) {
return _insertData.apply(this, arguments);
}
return insertData;
}()
/**
* 更新数据
*/
)
}, {
key: "updateData",
value: (function () {
var _updateData = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee8(tableName, id, data) {
var fields, values, setClause, sql, result, _t8;
return _regeneratorRuntime.wrap(function (_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
_context8.prev = 0;
fields = Object.keys(data);
values = Object.values(data);
setClause = fields.map(function (field) {
return "".concat(field, " = ?");
}).join(", ");
sql = "UPDATE ".concat(tableName, " SET ").concat(setClause, ", updated_at = CURRENT_TIMESTAMP WHERE id = ? RETURNING *");
_context8.next = 1;
return this.executeQuery(sql, [].concat(values, [id]));
case 1:
result = _context8.sent;
return _context8.abrupt("return", result[0]);
case 2:
_context8.prev = 2;
_t8 = _context8["catch"](0);
console.error("\u66F4\u65B0\u8868 ".concat(tableName, " \u6570\u636E\u5931\u8D25:"), _t8);
throw _t8;
case 3:
case "end":
return _context8.stop();
}
}, _callee8, this, [[0, 2]]);
}));
function updateData(_x1, _x10, _x11) {
return _updateData.apply(this, arguments);
}
return updateData;
}()
/**
* 删除数据
*/
)
}, {
key: "deleteData",
value: (function () {
var _deleteData = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee9(tableName, id) {
var sql, result, _t9;
return _regeneratorRuntime.wrap(function (_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
_context9.prev = 0;
sql = "DELETE FROM ".concat(tableName, " WHERE id = ? RETURNING *");
_context9.next = 1;
return this.executeQuery(sql, [id]);
case 1:
result = _context9.sent;
return _context9.abrupt("return", result[0]);
case 2:
_context9.prev = 2;
_t9 = _context9["catch"](0);
console.error("\u5220\u9664\u8868 ".concat(tableName, " \u6570\u636E\u5931\u8D25:"), _t9);
throw _t9;
case 3:
case "end":
return _context9.stop();
}
}, _callee9, this, [[0, 2]]);
}));
function deleteData(_x12, _x13) {
return _deleteData.apply(this, arguments);
}
return deleteData;
}()
/**
* 根据 ID 获取单条数据
*/
)
}, {
key: "getDataById",
value: (function () {
var _getDataById = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee0(tableName, id) {
var sql, result, _t0;
return _regeneratorRuntime.wrap(function (_context0) {
while (1) switch (_context0.prev = _context0.next) {
case 0:
_context0.prev = 0;
sql = "SELECT * FROM ".concat(tableName, " WHERE id = ?");
_context0.next = 1;
return this.executeQuery(sql, [id]);
case 1:
result = _context0.sent;
return _context0.abrupt("return", result[0] || null);
case 2:
_context0.prev = 2;
_t0 = _context0["catch"](0);
console.error("\u83B7\u53D6\u8868 ".concat(tableName, " \u5355\u6761\u6570\u636E\u5931\u8D25:"), _t0);
throw _t0;
case 3:
case "end":
return _context0.stop();
}
}, _callee0, this, [[0, 2]]);
}));
function getDataById(_x14, _x15) {
return _getDataById.apply(this, arguments);
}
return getDataById;
}())
}]);
}();
// 创建默认实例
var defaultService = null;
function getDynamicTableService() {
if (!defaultService) {
defaultService = new DynamicTableService();
}
return defaultService;
}
var server = {exports: {}};
var request = {};
var nextUrl = {};
var detectDomainLocale = {};
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "detectDomainLocale", {
enumerable: true,
get: function() {
return detectDomainLocale;
}
});
function detectDomainLocale(domainItems, hostname, detectedLocale) {
if (!domainItems) return;
if (detectedLocale) {
detectedLocale = detectedLocale.toLowerCase();
}
for (const item of domainItems){
var _item_domain, _item_locales;
// remove port if present
const domainHostname = (_item_domain = item.domain) == null ? void 0 : _item_domain.split(':', 1)[0].toLowerCase();
if (hostname === domainHostname || detectedLocale === item.defaultLocale.toLowerCase() || ((_item_locales = item.locales) == null ? void 0 : _item_locales.some((locale)=>locale.toLowerCase() === detectedLocale))) {
return item;
}
}
}
} (detectDomainLocale));
var formatNextPathnameInfo = {};
var removeTrailingSlash = {};
/**
* Removes the trailing slash for a given route or page path. Preserves the
* root page. Examples:
* - `/foo/bar/` -> `/foo/bar`
* - `/foo/bar` -> `/foo/bar`
* - `/` -> `/`
*/
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "removeTrailingSlash", {
enumerable: true,
get: function() {
return removeTrailingSlash;
}
});
function removeTrailingSlash(route) {
return route.replace(/\/$/, '') || '/';
}
} (removeTrailingSlash));
var addPathPrefix = {};
var parsePath = {};
/**
* Given a path this function will find the pathname, query and hash and return
* them. This is useful to parse full paths on the client side.
* @param path A path to parse e.g. /foo/bar?id=1#hash
*/
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "parsePath", {
enumerable: true,
get: function() {
return parsePath;
}
});
function parsePath(path) {
const hashIndex = path.indexOf('#');
const queryIndex = path.indexOf('?');
const hasQuery = queryIndex > -1 && (hashIndex < 0 || queryIndex < hashIndex);
if (hasQuery || hashIndex > -1) {
return {
pathname: path.substring(0, hasQuery ? queryIndex : hashIndex),
query: hasQuery ? path.substring(queryIndex, hashIndex > -1 ? hashIndex : undefined) : '',
hash: hashIndex > -1 ? path.slice(hashIndex) : ''
};
}
return {
pathname: path,
query: '',
hash: ''
};
}
} (parsePath));
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "addPathPrefix", {
enumerable: true,
get: function() {
return addPathPrefix;
}
});
const _parsepath = parsePath;
function addPathPrefix(path, prefix) {
if (!path.startsWith('/') || !prefix) {
return path;
}
const { pathname, query, hash } = (0, _parsepath.parsePath)(path);
return "" + prefix + pathname + query + hash;
}
} (addPathPrefix));
var addPathSuffix = {};
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "addPathSuffix", {
enumerable: true,
get: function() {
return addPathSuffix;
}
});
const _parsepath = parsePath;
function addPathSuffix(path, suffix) {
if (!path.startsWith('/') || !suffix) {
return path;
}
const { pathname, query, hash } = (0, _parsepath.parsePath)(path);
return "" + pathname + suffix + query + hash;
}
} (addPathSuffix));
var addLocale = {};
var pathHasPrefix = {};
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "pathHasPrefix", {
enumerable: true,
get: function() {
return pathHasPrefix;
}
});
const _parsepath = parsePath;
function pathHasPrefix(path, prefix) {
if (typeof path !== 'string') {
return false;
}
const { pathname } = (0, _parsepath.parsePath)(path);
return pathname === prefix || pathname.startsWith(prefix + '/');
}
} (pathHasPrefix));
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "addLocale", {
enumerable: true,
get: function() {
return addLocale;
}
});
const _addpathprefix = addPathPrefix;
const _pathhasprefix = pathHasPrefix;
function addLocale(path, locale, defaultLocale, ignorePrefix) {
// If no locale was given or the locale is the default locale, we don't need
// to prefix the path.
if (!locale || locale === defaultLocale) return path;
const lower = path.toLowerCase();
// If the path is an API path or the path already has the locale prefix, we
// don't need to prefix the path.
if (!ignorePrefix) {
if ((0, _pathhasprefix.pathHasPrefix)(lower, '/api')) return path;
if ((0, _pathhasprefix.pathHasPrefix)(lower, "/" + locale.toLowerCase())) return path;
}
// Add the locale prefix to the path.
return (0, _addpathprefix.addPathPrefix)(path, "/" + locale);
}
} (addLocale));
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "formatNextPathnameInfo", {
enumerable: true,
get: function() {
return formatNextPathnameInfo;
}
});
const _removetrailingslash = removeTrailingSlash;
const _addpathprefix = addPathPrefix;
const _addpathsuffix = addPathSuffix;
const _addlocale = addLocale;
function formatNextPathnameInfo(info) {
let pathname = (0, _addlocale.addLocale)(info.pathname, info.locale, info.buildId ? undefined : info.defaultLocale, info.ignorePrefix);
if (info.buildId || !info.trailingSlash) {
pathname = (0, _removetrailingslash.removeTrailingSlash)(pathname);
}
if (info.buildId) {
pathname = (0, _addpathsuffix.addPathSuffix)((0, _addpathprefix.addPathPrefix)(pathname, "/_next/data/" + info.buildId), info.pathname === '/' ? 'index.json' : '.json');
}
pathname = (0, _addpathprefix.addPathPrefix)(pathname, info.basePath);
return !info.buildId && info.trailingSlash ? !pathname.endsWith('/') ? (0, _addpathsuffix.addPathSuffix)(pathname, '/') : pathname : (0, _removetrailingslash.removeTrailingSlash)(pathname);
}
} (formatNextPathnameInfo));
var getHostname = {};
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "getHostname", {
enumerable: true,
get: function() {
return getHostname;
}
});
function getHostname(parsed, headers) {
// Get the hostname from the headers if it exists, otherwise use the parsed
// hostname.
let hostname;
if ((headers == null ? void 0 : headers.host) && !Array.isArray(headers.host)) {
hostname = headers.host.toString().split(':', 1)[0];
} else if (parsed.hostname) {
hostname = parsed.hostname;
} else return;
return hostname.toLowerCase();
}
} (getHostname));
var getNextPathnameInfo = {};
var normalizeLocalePath = {};
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "normalizeLocalePath", {
enumerable: true,
get: function() {
return normalizeLocalePath;
}
});
/**
* A cache of lowercased locales for each list of locales. This is stored as a
* WeakMap so if the locales are garbage collected, the cache entry will be
* removed as well.
*/ const cache = new WeakMap();
function normalizeLocalePath(pathname, locales) {
// If locales is undefined, return the pathname as is.
if (!locales) return {
pathname
};
// Get the cached lowercased locales or create a new cache entry.
let lowercasedLocales = cache.get(locales);
if (!lowercasedLocales) {
lowercasedLocales = locales.map((locale)=>locale.toLowerCase());
cache.set(locales, lowercasedLocales);
}
let detectedLocale;
// The first segment will be empty, because it has a leading `/`. If
// there is no further segment, there is no locale (or it's the default).
const segments = pathname.split('/', 2);
// If there's no second segment (ie, the pathname is just `/`), there's no
// locale.
if (!segments[1]) return {
pathname
};
// The second segment will contain the locale part if any.
const segment = segments[1].toLowerCase();
// See if the segment matches one of the locales. If it doesn't, there is
// no locale (or it's the default).
const index = lowercasedLocales.indexOf(segment);
if (index < 0) return {
pathname
};
// Return the case-sensitive locale.
detectedLocale = locales[index];
// Remove the `/${locale}` part of the pathname.
pathname = pathname.slice(detectedLocale.length + 1) || '/';
return {
pathname,
detectedLocale
};
}
} (normalizeLocalePath));
var removePathPrefix = {};
(function (exports) {
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "removePathPrefix", {
enumerable: true,
get: function() {
return removePathPrefix;
}
});
const _pathhasprefix = pathHasPrefix;
function removePathPrefix(path, prefix) {
// If the path doesn't start with the prefix we can return it as is. This
// protects us from situations where the prefix is a substring of the path
// prefix such as:
//
// For prefix: /