@ticatec/common-express-server 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/common-express-server.iml +9 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.idea/workspace.xml +74 -0
- package/lib/BaseServer.d.ts +76 -0
- package/lib/BaseServer.js +128 -0
- package/lib/BaseServer.js.map +1 -0
- package/lib/CommonRouterHelper.d.ts +40 -0
- package/lib/CommonRouterHelper.js +104 -0
- package/lib/CommonRouterHelper.js.map +1 -0
- package/lib/CommonRoutes.d.ts +10 -0
- package/lib/CommonRoutes.js +23 -0
- package/lib/CommonRoutes.js.map +1 -0
- package/lib/LoggedUser.d.ts +37 -0
- package/lib/LoggedUser.js +3 -0
- package/lib/LoggedUser.js.map +1 -0
- package/lib/common/AdminBaseController.d.ts +26 -0
- package/lib/common/AdminBaseController.js +38 -0
- package/lib/common/AdminBaseController.js.map +1 -0
- package/lib/common/AdminSearchController.d.ts +8 -0
- package/lib/common/AdminSearchController.js +21 -0
- package/lib/common/AdminSearchController.js.map +1 -0
- package/lib/common/BaseController.d.ts +12 -0
- package/lib/common/BaseController.js +20 -0
- package/lib/common/BaseController.js.map +1 -0
- package/lib/common/CommonController.d.ts +70 -0
- package/lib/common/CommonController.js +104 -0
- package/lib/common/CommonController.js.map +1 -0
- package/lib/common/TenantBaseController.d.ts +25 -0
- package/lib/common/TenantBaseController.js +40 -0
- package/lib/common/TenantBaseController.js.map +1 -0
- package/lib/common/TenantSearchController.d.ts +8 -0
- package/lib/common/TenantSearchController.js +22 -0
- package/lib/common/TenantSearchController.js.map +1 -0
- package/package.json +42 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<module type="JAVA_MODULE" version="4">
|
|
3
|
+
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
|
4
|
+
<exclude-output />
|
|
5
|
+
<content url="file://$MODULE_DIR$" />
|
|
6
|
+
<orderEntry type="inheritedJdk" />
|
|
7
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
|
8
|
+
</component>
|
|
9
|
+
</module>
|
package/.idea/misc.xml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
|
4
|
+
<output url="file://$PROJECT_DIR$/out" />
|
|
5
|
+
</component>
|
|
6
|
+
</project>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ProjectModuleManager">
|
|
4
|
+
<modules>
|
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/.idea/common-express-server.iml" filepath="$PROJECT_DIR$/.idea/common-express-server.iml" />
|
|
6
|
+
</modules>
|
|
7
|
+
</component>
|
|
8
|
+
</project>
|
package/.idea/vcs.xml
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ChangeListManager">
|
|
4
|
+
<list default="true" id="9b016121-d0d5-4be3-bbd2-0c1749841a7a" name="Changes" comment="" />
|
|
5
|
+
<option name="SHOW_DIALOG" value="false" />
|
|
6
|
+
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
7
|
+
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
|
8
|
+
<option name="LAST_RESOLUTION" value="IGNORE" />
|
|
9
|
+
</component>
|
|
10
|
+
<component name="Git.Settings">
|
|
11
|
+
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
|
12
|
+
</component>
|
|
13
|
+
<component name="GitLabMergeRequestFiltersHistory"><![CDATA[{
|
|
14
|
+
"lastFilter": {
|
|
15
|
+
"state": "OPENED",
|
|
16
|
+
"assignee": {
|
|
17
|
+
"type": "org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestsMemberFilterValue.MergeRequestsAssigneeFilterValue",
|
|
18
|
+
"username": "huili_feng",
|
|
19
|
+
"fullname": "冯辉利"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}]]></component>
|
|
23
|
+
<component name="GitLabMergeRequestsSettings"><![CDATA[{
|
|
24
|
+
"selectedUrlAndAccountId": {
|
|
25
|
+
"first": "http://git.dev.ticatec.cn/open-source/node-library/common-express-server.git",
|
|
26
|
+
"second": "1c6eb983-bbca-437e-924e-79009ce1a5d2"
|
|
27
|
+
}
|
|
28
|
+
}]]></component>
|
|
29
|
+
<component name="KubernetesApiPersistence"><![CDATA[{}]]></component>
|
|
30
|
+
<component name="KubernetesApiProvider"><![CDATA[{
|
|
31
|
+
"isMigrated": true
|
|
32
|
+
}]]></component>
|
|
33
|
+
<component name="ProjectColorInfo"><![CDATA[{
|
|
34
|
+
"associatedIndex": 7
|
|
35
|
+
}]]></component>
|
|
36
|
+
<component name="ProjectId" id="2wpQaB9hwmokK0HhL4K4dlupk1s" />
|
|
37
|
+
<component name="ProjectViewState">
|
|
38
|
+
<option name="hideEmptyMiddlePackages" value="true" />
|
|
39
|
+
<option name="showLibraryContents" value="true" />
|
|
40
|
+
</component>
|
|
41
|
+
<component name="PropertiesComponent"><![CDATA[{
|
|
42
|
+
"keyToString": {
|
|
43
|
+
"RunOnceActivity.ShowReadmeOnStart": "true",
|
|
44
|
+
"dart.analysis.tool.window.visible": "false",
|
|
45
|
+
"git-widget-placeholder": "main",
|
|
46
|
+
"nodejs_package_manager_path": "npm",
|
|
47
|
+
"settings.editor.selected.configurable": "ssh.settings",
|
|
48
|
+
"show.migrate.to.gradle.popup": "false",
|
|
49
|
+
"vue.rearranger.settings.migration": "true"
|
|
50
|
+
}
|
|
51
|
+
}]]></component>
|
|
52
|
+
<component name="SharedIndexes">
|
|
53
|
+
<attachedChunks>
|
|
54
|
+
<set>
|
|
55
|
+
<option value="bundled-jdk-9823dce3aa75-fbdcb00ec9e3-intellij.indexing.shared.core-IU-251.23774.435" />
|
|
56
|
+
<option value="bundled-js-predefined-d6986cc7102b-f27c65a3e318-JavaScript-IU-251.23774.435" />
|
|
57
|
+
</set>
|
|
58
|
+
</attachedChunks>
|
|
59
|
+
</component>
|
|
60
|
+
<component name="TaskManager">
|
|
61
|
+
<task active="true" id="Default" summary="Default task">
|
|
62
|
+
<changelist id="9b016121-d0d5-4be3-bbd2-0c1749841a7a" name="Changes" comment="" />
|
|
63
|
+
<created>1746736096648</created>
|
|
64
|
+
<option name="number" value="Default" />
|
|
65
|
+
<option name="presentableId" value="Default" />
|
|
66
|
+
<updated>1746736096648</updated>
|
|
67
|
+
<workItem from="1746736097766" duration="1000" />
|
|
68
|
+
</task>
|
|
69
|
+
<servers />
|
|
70
|
+
</component>
|
|
71
|
+
<component name="TypeScriptGeneratedFilesManager">
|
|
72
|
+
<option name="version" value="3" />
|
|
73
|
+
</component>
|
|
74
|
+
</project>
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Express } from 'express';
|
|
3
|
+
import CommonRouterHelper from "./CommonRouterHelper";
|
|
4
|
+
import http from "http";
|
|
5
|
+
import { Logger } from "log4js";
|
|
6
|
+
export declare type moduleLoader = () => Promise<any>;
|
|
7
|
+
export default abstract class BaseServer {
|
|
8
|
+
protected logger: Logger;
|
|
9
|
+
protected helper: CommonRouterHelper;
|
|
10
|
+
protected contextRoot: string;
|
|
11
|
+
protected constructor();
|
|
12
|
+
protected abstract getHelper(): CommonRouterHelper;
|
|
13
|
+
/**
|
|
14
|
+
* 读取配置文件
|
|
15
|
+
* @protected
|
|
16
|
+
*/
|
|
17
|
+
protected abstract loadConfigFile(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* 写入监听端口到check.dat文件中
|
|
20
|
+
* @param port
|
|
21
|
+
* @param fileName
|
|
22
|
+
* @protected
|
|
23
|
+
*/
|
|
24
|
+
protected writeCheckFile(port: number, fileName?: string): void;
|
|
25
|
+
protected abstract getLogger(): Logger;
|
|
26
|
+
startup(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* web服务器创建后的拦截函数
|
|
29
|
+
* @param server
|
|
30
|
+
* @protected
|
|
31
|
+
*/
|
|
32
|
+
protected postServerCreated(server: http.Server): Promise<void>;
|
|
33
|
+
protected abstract getWebConf(): any;
|
|
34
|
+
/**
|
|
35
|
+
* 启动前的拦截函数
|
|
36
|
+
* @protected
|
|
37
|
+
*/
|
|
38
|
+
protected beforeStart(): Promise<void>;
|
|
39
|
+
protected getHealthCheckPath(): string;
|
|
40
|
+
/**
|
|
41
|
+
*
|
|
42
|
+
* @param app
|
|
43
|
+
* @protected
|
|
44
|
+
*/
|
|
45
|
+
protected addHealthCheck(app: Express): void;
|
|
46
|
+
protected startWebServer(webConf: any): Promise<unknown>;
|
|
47
|
+
/**
|
|
48
|
+
* 绑定静态站点
|
|
49
|
+
* @protected
|
|
50
|
+
*/
|
|
51
|
+
protected bindStaticSite(app: Express): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* 初始化express
|
|
54
|
+
* @param app
|
|
55
|
+
* @protected
|
|
56
|
+
*/
|
|
57
|
+
protected setupExpress(app: Express): void;
|
|
58
|
+
/**
|
|
59
|
+
* 绑定一个路由
|
|
60
|
+
* @param app
|
|
61
|
+
* @param path
|
|
62
|
+
* @param loader
|
|
63
|
+
* @protected
|
|
64
|
+
*/
|
|
65
|
+
protected bindRoutes(app: Express, path: string, loader: moduleLoader): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* 设定路由
|
|
68
|
+
* @protected
|
|
69
|
+
*/
|
|
70
|
+
protected abstract setupRoutes(app: Express): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* 启动服务器
|
|
73
|
+
* @param server
|
|
74
|
+
*/
|
|
75
|
+
static startup(server: BaseServer): void;
|
|
76
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_1 = __importDefault(require("express"));
|
|
7
|
+
const express_exception_1 = require("@ticatec/express-exception");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
class BaseServer {
|
|
10
|
+
constructor() {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 写入监听端口到check.dat文件中
|
|
14
|
+
* @param port
|
|
15
|
+
* @param fileName
|
|
16
|
+
* @protected
|
|
17
|
+
*/
|
|
18
|
+
writeCheckFile(port, fileName = './check.dat') {
|
|
19
|
+
try {
|
|
20
|
+
this.logger.debug('端口', port);
|
|
21
|
+
fs_1.default.writeFileSync(fileName, `${port}`);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
this.logger.error('写入端口发送错误', err);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async startup() {
|
|
28
|
+
this.helper = this.getHelper();
|
|
29
|
+
await this.loadConfigFile();
|
|
30
|
+
this.logger = this.getLogger();
|
|
31
|
+
try {
|
|
32
|
+
await this.beforeStart();
|
|
33
|
+
let webConf = this.getWebConf();
|
|
34
|
+
this.writeCheckFile(webConf.port);
|
|
35
|
+
this.contextRoot = webConf.contextRoot;
|
|
36
|
+
await this.startWebServer(webConf);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
this.logger.error('启动失败,原因:', err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* web服务器创建后的拦截函数
|
|
44
|
+
* @param server
|
|
45
|
+
* @protected
|
|
46
|
+
*/
|
|
47
|
+
async postServerCreated(server) {
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 启动前的拦截函数
|
|
51
|
+
* @protected
|
|
52
|
+
*/
|
|
53
|
+
async beforeStart() {
|
|
54
|
+
}
|
|
55
|
+
getHealthCheckPath() {
|
|
56
|
+
return '/health-check';
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
* @param app
|
|
61
|
+
* @protected
|
|
62
|
+
*/
|
|
63
|
+
addHealthCheck(app) {
|
|
64
|
+
let path = this.getHealthCheckPath();
|
|
65
|
+
this.logger.debug('加载系统健康检测', path);
|
|
66
|
+
if (path) {
|
|
67
|
+
app.get(path, (req, res) => { res.send(''); });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async startWebServer(webConf) {
|
|
71
|
+
let app = (0, express_1.default)();
|
|
72
|
+
app.disable("x-powered-by");
|
|
73
|
+
app.use(this.helper.setNoCache);
|
|
74
|
+
this.addHealthCheck(app);
|
|
75
|
+
this.setupExpress(app);
|
|
76
|
+
await this.bindStaticSite(app);
|
|
77
|
+
await this.setupRoutes(app);
|
|
78
|
+
app.use(this.helper.actionNotFound());
|
|
79
|
+
app.use((err, req, res, next) => {
|
|
80
|
+
this.logger.debug("系统异常", err);
|
|
81
|
+
(0, express_exception_1.handleError)(err, req, res);
|
|
82
|
+
});
|
|
83
|
+
return new Promise(resolve => {
|
|
84
|
+
let server = app.listen(webConf.port, webConf.ip, () => {
|
|
85
|
+
this.logger.info(`Web服务启动成功,监听IP:${webConf.ip},端口:${webConf.port}`);
|
|
86
|
+
this.postServerCreated(server);
|
|
87
|
+
resolve(server);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 绑定静态站点
|
|
93
|
+
* @protected
|
|
94
|
+
*/
|
|
95
|
+
async bindStaticSite(app) {
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 初始化express
|
|
99
|
+
* @param app
|
|
100
|
+
* @protected
|
|
101
|
+
*/
|
|
102
|
+
setupExpress(app) {
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 绑定一个路由
|
|
106
|
+
* @param app
|
|
107
|
+
* @param path
|
|
108
|
+
* @param loader
|
|
109
|
+
* @protected
|
|
110
|
+
*/
|
|
111
|
+
async bindRoutes(app, path, loader) {
|
|
112
|
+
let clazz = (await loader()).default;
|
|
113
|
+
let router = new clazz(this.helper);
|
|
114
|
+
router.bindRouter(app, `${this.contextRoot}${path}`);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 启动服务器
|
|
118
|
+
* @param server
|
|
119
|
+
*/
|
|
120
|
+
static startup(server) {
|
|
121
|
+
server.startup().then(() => {
|
|
122
|
+
}).catch(ex => {
|
|
123
|
+
console.error('服务器启动异常', ex);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.default = BaseServer;
|
|
128
|
+
//# sourceMappingURL=BaseServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseServer.js","sourceRoot":"src/","sources":["BaseServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Request, Response } from "express";
|
|
2
|
+
export declare type RestfulFunction = (req: any) => any;
|
|
3
|
+
export declare type ControlFunction = (req: any, res: any) => any;
|
|
4
|
+
export default class CommonRouterHelper {
|
|
5
|
+
protected readonly logger: any;
|
|
6
|
+
/**
|
|
7
|
+
* 设置Http Response的header为JSON格式
|
|
8
|
+
* @param req
|
|
9
|
+
* @param res
|
|
10
|
+
* @param next
|
|
11
|
+
*/
|
|
12
|
+
setJsonHeader(req: Request, res: Response, next: any): void;
|
|
13
|
+
/**
|
|
14
|
+
* 设置response不使用cache
|
|
15
|
+
* @param req
|
|
16
|
+
* @param res
|
|
17
|
+
* @param next
|
|
18
|
+
* @returns {Promise<void>}
|
|
19
|
+
*/
|
|
20
|
+
setNoCache(req: Request, res: Response, next: any): void;
|
|
21
|
+
/**
|
|
22
|
+
* 调用一个restful的操作,将结果封装成json格式返回请求端
|
|
23
|
+
* @param func
|
|
24
|
+
*/
|
|
25
|
+
invokeRestfulAction(func: RestfulFunction): any;
|
|
26
|
+
/**
|
|
27
|
+
* 调用异步函数并处理返回的错误
|
|
28
|
+
* @param func
|
|
29
|
+
*/
|
|
30
|
+
invokeController(func: ControlFunction): (req: Request, res: Response) => Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* 处理无效的请求路径
|
|
36
|
+
*/
|
|
37
|
+
actionNotFound(): (req: Request, res: Response, next: any) => void;
|
|
38
|
+
protected retrieveUser(req: Request): void;
|
|
39
|
+
checkLoggedUser(): (req: Request, res: Response, next: any) => void;
|
|
40
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_exception_1 = require("@ticatec/express-exception");
|
|
7
|
+
const singleton_log4js_1 = __importDefault(require("@ticatec/singleton-log4js"));
|
|
8
|
+
class CommonRouterHelper {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.logger = singleton_log4js_1.default.getLogger("CommonRouterHelper");
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 设置Http Response的header为JSON格式
|
|
14
|
+
* @param req
|
|
15
|
+
* @param res
|
|
16
|
+
* @param next
|
|
17
|
+
*/
|
|
18
|
+
setJsonHeader(req, res, next) {
|
|
19
|
+
res.header('Content-Type', 'application/json');
|
|
20
|
+
next();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 设置response不使用cache
|
|
24
|
+
* @param req
|
|
25
|
+
* @param res
|
|
26
|
+
* @param next
|
|
27
|
+
* @returns {Promise<void>}
|
|
28
|
+
*/
|
|
29
|
+
setNoCache(req, res, next) {
|
|
30
|
+
res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
|
|
31
|
+
res.header('Expires', '-1');
|
|
32
|
+
res.header('Pragma', 'no-cache');
|
|
33
|
+
next();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 调用一个restful的操作,将结果封装成json格式返回请求端
|
|
37
|
+
* @param func
|
|
38
|
+
*/
|
|
39
|
+
invokeRestfulAction(func) {
|
|
40
|
+
return async (req, res) => {
|
|
41
|
+
try {
|
|
42
|
+
let result = await func(req);
|
|
43
|
+
if (result != null) {
|
|
44
|
+
res.json(result);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
res.status(204).send();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (ex) {
|
|
51
|
+
(0, express_exception_1.handleError)(ex, req, res);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 调用异步函数并处理返回的错误
|
|
57
|
+
* @param func
|
|
58
|
+
*/
|
|
59
|
+
invokeController(func) {
|
|
60
|
+
return async (req, res) => {
|
|
61
|
+
try {
|
|
62
|
+
await func(req, res);
|
|
63
|
+
}
|
|
64
|
+
catch (ex) {
|
|
65
|
+
(0, express_exception_1.handleError)(ex, req, res);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
*
|
|
71
|
+
*/
|
|
72
|
+
/**
|
|
73
|
+
* 处理无效的请求路径
|
|
74
|
+
*/
|
|
75
|
+
actionNotFound() {
|
|
76
|
+
return (req, res, next) => {
|
|
77
|
+
(0, express_exception_1.handleError)(new express_exception_1.ActionNotFoundError(), req, res);
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
retrieveUser(req) {
|
|
81
|
+
let userStr = req.headers['user'];
|
|
82
|
+
if (userStr != null) {
|
|
83
|
+
try {
|
|
84
|
+
req['user'] = JSON.parse(decodeURIComponent(userStr));
|
|
85
|
+
}
|
|
86
|
+
catch (ex) {
|
|
87
|
+
this.logger.debug('无效的user头', userStr);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
checkLoggedUser() {
|
|
92
|
+
return (req, res, next) => {
|
|
93
|
+
this.retrieveUser(req);
|
|
94
|
+
if (req['user'] == null) {
|
|
95
|
+
(0, express_exception_1.handleError)(new express_exception_1.UnauthenticatedError(), req, res);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
next();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.default = CommonRouterHelper;
|
|
104
|
+
//# sourceMappingURL=CommonRouterHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommonRouterHelper.js","sourceRoot":"src/","sources":["CommonRouterHelper.ts"],"names":[],"mappings":";;;;;AACA,kEAAkG;AAClG,iFAA+C;AAM/C,MAAqB,kBAAkB;IAAvC;QAEuB,WAAM,GAAG,0BAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAkGvE,CAAC;IAhGG;;;;;OAKG;IACH,aAAa,CAAC,GAAY,EAAE,GAAa,EAAE,IAAQ;QAC/C,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC;IACX,CAAC;IAGD;;;;;;OAMG;IACH,UAAU,CAAC,GAAY,EAAE,GAAa,EAAE,IAAQ;QAC5C,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC;QAC5E,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC;IACX,CAAC;IAED;;;OAGG;IACH,mBAAmB,CAAC,IAAqB;QACrC,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;YACxD,IAAI;gBACA,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,MAAM,IAAI,IAAI,EAAE;oBAChB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBACpB;qBAAM;oBACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC1B;aACJ;YAAC,OAAO,EAAE,EAAE;gBACT,IAAA,+BAAW,EAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aAC7B;QACL,CAAC,CAAA;IACL,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,IAAqB;QAClC,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;YACxD,IAAI;gBACA,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;aACxB;YAAC,OAAO,EAAE,EAAE;gBACT,IAAA,+BAAW,EAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aAC7B;QACL,CAAC,CAAA;IACL,CAAC;IAED;;OAEG;IAEH;;OAEG;IACH,cAAc;QACV,OAAO,CAAC,GAAW,EAAE,GAAY,EAAE,IAAQ,EAAE,EAAE;YAC3C,IAAA,+BAAW,EAAC,IAAI,uCAAmB,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC,CAAA;IACL,CAAC;IAGS,YAAY,CAAC,GAAY;QAC/B,IAAI,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC,MAAM,CAAW,CAAC;QACpD,IAAI,OAAO,IAAI,IAAI,EAAE;YACjB,IAAI;gBACA,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;aACzD;YAAC,OAAO,EAAE,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;aAC1C;SACJ;IACL,CAAC;IAGD,eAAe;QACX,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAQ,EAAE,EAAE;YAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;gBACrB,IAAA,+BAAW,EAAC,IAAI,wCAAoB,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aACrD;iBAAM;gBACH,IAAI,EAAE,CAAC;aACV;QACL,CAAC,CAAA;IACL,CAAC;CAEJ;AApGD,qCAoGC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Express } from "express";
|
|
2
|
+
import CommonRouterHelper from "./CommonRouterHelper";
|
|
3
|
+
import { Logger } from "log4js";
|
|
4
|
+
export default abstract class CommonRoutes {
|
|
5
|
+
readonly router: any;
|
|
6
|
+
protected helper: CommonRouterHelper;
|
|
7
|
+
protected logger: Logger;
|
|
8
|
+
protected constructor(helper: CommonRouterHelper, checkUser?: boolean);
|
|
9
|
+
bindRouter(app: Express, path: string): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_1 = require("express");
|
|
7
|
+
const singleton_log4js_1 = __importDefault(require("@ticatec/singleton-log4js"));
|
|
8
|
+
class CommonRoutes {
|
|
9
|
+
constructor(helper, checkUser = true) {
|
|
10
|
+
this.router = (0, express_1.Router)();
|
|
11
|
+
this.helper = helper;
|
|
12
|
+
this.logger = singleton_log4js_1.default.getLogger(this.constructor.name);
|
|
13
|
+
if (checkUser) {
|
|
14
|
+
this.logger.debug('检查用户是否登录');
|
|
15
|
+
this.router.all('/', helper.checkLoggedUser());
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
bindRouter(app, path) {
|
|
19
|
+
app.use(path, this.router);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.default = CommonRoutes;
|
|
23
|
+
//# sourceMappingURL=CommonRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommonRoutes.js","sourceRoot":"src/","sources":["CommonRoutes.ts"],"names":[],"mappings":";;;;;AAAA,qCAAwC;AAGxC,iFAA+C;AAE/C,MAA8B,YAAY;IAKtC,YAAsB,MAA0B,EAAE,YAAqB,IAAI;QACvE,IAAI,CAAC,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,0BAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,SAAS,EAAE;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;SAClD;IACL,CAAC;IAED,UAAU,CAAC,GAAY,EAAE,IAAY;QACjC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;CACJ;AAlBD,+BAkBC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface CommonUser {
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
*/
|
|
5
|
+
id: string;
|
|
6
|
+
/**
|
|
7
|
+
* 编码
|
|
8
|
+
*/
|
|
9
|
+
code: string;
|
|
10
|
+
/**
|
|
11
|
+
* 姓名
|
|
12
|
+
*/
|
|
13
|
+
name: string;
|
|
14
|
+
/**
|
|
15
|
+
* 部门
|
|
16
|
+
*/
|
|
17
|
+
dept: {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 租户
|
|
23
|
+
*/
|
|
24
|
+
tenant: {
|
|
25
|
+
code: string;
|
|
26
|
+
name: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 当前登陆的用户
|
|
31
|
+
*/
|
|
32
|
+
export default interface LoggedUser extends CommonUser {
|
|
33
|
+
/**
|
|
34
|
+
* 扮演用户
|
|
35
|
+
*/
|
|
36
|
+
actAs?: CommonUser;
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoggedUser.js","sourceRoot":"src/","sources":["LoggedUser.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ValidationRules } from "@ticatec/bean-validator";
|
|
2
|
+
import CommonController from "./CommonController";
|
|
3
|
+
/**
|
|
4
|
+
* 和租户无关的平台管理接口的基础类
|
|
5
|
+
*/
|
|
6
|
+
export default abstract class AdminBaseController<T> extends CommonController<T> {
|
|
7
|
+
/**
|
|
8
|
+
* 构造方法
|
|
9
|
+
* @param service
|
|
10
|
+
* @param rules 实体检验规则
|
|
11
|
+
* @protected
|
|
12
|
+
*/
|
|
13
|
+
protected constructor(service: T, rules: ValidationRules);
|
|
14
|
+
/**
|
|
15
|
+
* 新增的参数
|
|
16
|
+
* @param req
|
|
17
|
+
* @protected
|
|
18
|
+
*/
|
|
19
|
+
protected getCreateNewArguments(req: any): Array<any>;
|
|
20
|
+
/**
|
|
21
|
+
* 更新方法的参数
|
|
22
|
+
* @param req
|
|
23
|
+
* @protected
|
|
24
|
+
*/
|
|
25
|
+
protected getUpdateArguments(req: any): any[];
|
|
26
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const CommonController_1 = __importDefault(require("./CommonController"));
|
|
7
|
+
/**
|
|
8
|
+
* 和租户无关的平台管理接口的基础类
|
|
9
|
+
*/
|
|
10
|
+
class AdminBaseController extends CommonController_1.default {
|
|
11
|
+
/**
|
|
12
|
+
* 构造方法
|
|
13
|
+
* @param service
|
|
14
|
+
* @param rules 实体检验规则
|
|
15
|
+
* @protected
|
|
16
|
+
*/
|
|
17
|
+
constructor(service, rules) {
|
|
18
|
+
super(service, rules);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 新增的参数
|
|
22
|
+
* @param req
|
|
23
|
+
* @protected
|
|
24
|
+
*/
|
|
25
|
+
getCreateNewArguments(req) {
|
|
26
|
+
return [req.body];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 更新方法的参数
|
|
30
|
+
* @param req
|
|
31
|
+
* @protected
|
|
32
|
+
*/
|
|
33
|
+
getUpdateArguments(req) {
|
|
34
|
+
return [req.body];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.default = AdminBaseController;
|
|
38
|
+
//# sourceMappingURL=AdminBaseController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminBaseController.js","sourceRoot":"src/","sources":["common/AdminBaseController.ts"],"names":[],"mappings":";;;;;AACA,0EAAkD;AAElD;;GAEG;AACH,MAA8B,mBAAuB,SAAQ,0BAAmB;IAE5E;;;;;OAKG;IACH,YAAsB,OAAU,EAAE,KAAsB;QACpD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACO,qBAAqB,CAAC,GAAQ;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAED;;;;OAIG;IACO,kBAAkB,CAAC,GAAQ;QACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;CACJ;AA7BD,sCA6BC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Request } from "express";
|
|
2
|
+
import AdminBaseController from "./AdminBaseController";
|
|
3
|
+
/**
|
|
4
|
+
* 和租户无关的代查询的平台管理接口的基础类
|
|
5
|
+
*/
|
|
6
|
+
export default abstract class AdminSearchController<T> extends AdminBaseController<T> {
|
|
7
|
+
search(): (req: Request) => Promise<any>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const AdminBaseController_1 = __importDefault(require("./AdminBaseController"));
|
|
7
|
+
const BaseController_1 = __importDefault(require("./BaseController"));
|
|
8
|
+
/**
|
|
9
|
+
* 和租户无关的代查询的平台管理接口的基础类
|
|
10
|
+
*/
|
|
11
|
+
class AdminSearchController extends AdminBaseController_1.default {
|
|
12
|
+
search() {
|
|
13
|
+
return (req) => {
|
|
14
|
+
let query = req.query;
|
|
15
|
+
BaseController_1.default.debugEnabled && this.logger.debug(`path: ${req.path}, query by criteria:`, query);
|
|
16
|
+
return this.invokeServiceInterface('search', [query]);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.default = AdminSearchController;
|
|
21
|
+
//# sourceMappingURL=AdminSearchController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminSearchController.js","sourceRoot":"src/","sources":["common/AdminSearchController.ts"],"names":[],"mappings":";;;;;AACA,gFAAwD;AACxD,sEAA8C;AAE9C;;GAEG;AACH,MAA8B,qBAAyB,SAAQ,6BAAsB;IAEjF,MAAM;QACF,OAAO,CAAC,GAAW,EAAE,EAAE;YACnB,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YACtB,wBAAc,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,sBAAsB,EAAE,KAAK,CAAC,CAAC;YACjG,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAA;IACL,CAAC;CACJ;AATD,wCASC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Logger } from "log4js";
|
|
2
|
+
export default abstract class BaseController<T> {
|
|
3
|
+
static debugEnabled: boolean;
|
|
4
|
+
protected readonly service: T;
|
|
5
|
+
protected readonly logger: Logger;
|
|
6
|
+
/**
|
|
7
|
+
* 构造方法
|
|
8
|
+
* @param service
|
|
9
|
+
* @protected
|
|
10
|
+
*/
|
|
11
|
+
protected constructor(service: T);
|
|
12
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const singleton_log4js_1 = __importDefault(require("@ticatec/singleton-log4js"));
|
|
7
|
+
class BaseController {
|
|
8
|
+
/**
|
|
9
|
+
* 构造方法
|
|
10
|
+
* @param service
|
|
11
|
+
* @protected
|
|
12
|
+
*/
|
|
13
|
+
constructor(service) {
|
|
14
|
+
this.logger = singleton_log4js_1.default.getLogger(this.constructor.name);
|
|
15
|
+
this.service = service;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.default = BaseController;
|
|
19
|
+
BaseController.debugEnabled = false;
|
|
20
|
+
//# sourceMappingURL=BaseController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseController.js","sourceRoot":"src/","sources":["common/BaseController.ts"],"names":[],"mappings":";;;;;AAAA,iFAA+C;AAG/C,MAA8B,cAAc;IAMxC;;;;OAIG;IACH,YAAsB,OAAU;QAC5B,IAAI,CAAC,MAAM,GAAG,0BAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;;AAdL,iCAeC;AAbU,2BAAY,GAAY,KAAK,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import BaseController from "./BaseController";
|
|
2
|
+
import { ValidationRules } from "@ticatec/bean-validator";
|
|
3
|
+
import { RestfulFunction } from "../CommonRouterHelper";
|
|
4
|
+
/**
|
|
5
|
+
* 实现了增/删/改的控制类
|
|
6
|
+
*/
|
|
7
|
+
export default abstract class CommonController<T> extends BaseController<T> {
|
|
8
|
+
/**
|
|
9
|
+
* 实体检验规则
|
|
10
|
+
* @protected
|
|
11
|
+
*/
|
|
12
|
+
protected readonly rules: ValidationRules;
|
|
13
|
+
protected constructor(service: T, rules?: ValidationRules);
|
|
14
|
+
/**
|
|
15
|
+
* 验证实体
|
|
16
|
+
* @param data
|
|
17
|
+
* @protected
|
|
18
|
+
*/
|
|
19
|
+
protected validateEntity(data: any): void;
|
|
20
|
+
/**
|
|
21
|
+
* 新增实体接口
|
|
22
|
+
*/
|
|
23
|
+
createNew(): RestfulFunction;
|
|
24
|
+
/**
|
|
25
|
+
* 更新实体接口
|
|
26
|
+
*/
|
|
27
|
+
update(): RestfulFunction;
|
|
28
|
+
/**
|
|
29
|
+
* 删除实体接口
|
|
30
|
+
*/
|
|
31
|
+
del(): RestfulFunction;
|
|
32
|
+
protected checkInterface(name: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* 根据名称调用服务接口
|
|
35
|
+
* @param name
|
|
36
|
+
* @param args
|
|
37
|
+
* @protected
|
|
38
|
+
*/
|
|
39
|
+
protected invokeServiceInterface(name: string, args?: Array<any>): Promise<any>;
|
|
40
|
+
/**
|
|
41
|
+
* 新建实体
|
|
42
|
+
* @param req
|
|
43
|
+
* @protected
|
|
44
|
+
*/
|
|
45
|
+
protected _createNew(req: any): Promise<any>;
|
|
46
|
+
/**
|
|
47
|
+
* 更新实体
|
|
48
|
+
* @param req
|
|
49
|
+
* @protected
|
|
50
|
+
*/
|
|
51
|
+
protected _update(req: any): Promise<any>;
|
|
52
|
+
/**
|
|
53
|
+
* 删除实体
|
|
54
|
+
* @param req
|
|
55
|
+
* @protected
|
|
56
|
+
*/
|
|
57
|
+
protected _del(req: any): Promise<any>;
|
|
58
|
+
/**
|
|
59
|
+
* 新增实体的参数
|
|
60
|
+
* @param req
|
|
61
|
+
* @protected
|
|
62
|
+
*/
|
|
63
|
+
protected abstract getCreateNewArguments(req: any): Array<any>;
|
|
64
|
+
/**
|
|
65
|
+
* 更新实体的参数
|
|
66
|
+
* @param req
|
|
67
|
+
* @protected
|
|
68
|
+
*/
|
|
69
|
+
protected abstract getUpdateArguments(req: any): Array<any>;
|
|
70
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_exception_1 = require("@ticatec/express-exception");
|
|
7
|
+
const BaseController_1 = __importDefault(require("./BaseController"));
|
|
8
|
+
const bean_validator_1 = __importDefault(require("@ticatec/bean-validator"));
|
|
9
|
+
/**
|
|
10
|
+
* 实现了增/删/改的控制类
|
|
11
|
+
*/
|
|
12
|
+
class CommonController extends BaseController_1.default {
|
|
13
|
+
constructor(service, rules = null) {
|
|
14
|
+
super(service);
|
|
15
|
+
this.rules = rules;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 验证实体
|
|
19
|
+
* @param data
|
|
20
|
+
* @protected
|
|
21
|
+
*/
|
|
22
|
+
validateEntity(data) {
|
|
23
|
+
let result = bean_validator_1.default.validate(data, this.rules);
|
|
24
|
+
if (!result.valid) {
|
|
25
|
+
BaseController_1.default.debugEnabled && this.logger.debug(`invalid data: ${result.errorMessage}`);
|
|
26
|
+
throw new express_exception_1.IllegalParameterError(result.errorMessage);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 新增实体接口
|
|
31
|
+
*/
|
|
32
|
+
createNew() {
|
|
33
|
+
return async (req) => {
|
|
34
|
+
return this._createNew(req);
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 更新实体接口
|
|
39
|
+
*/
|
|
40
|
+
update() {
|
|
41
|
+
return async (req) => {
|
|
42
|
+
return this._update(req);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 删除实体接口
|
|
47
|
+
*/
|
|
48
|
+
del() {
|
|
49
|
+
return async (req) => {
|
|
50
|
+
return this._del(req);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
checkInterface(name) {
|
|
54
|
+
if (this.service[name] == null) {
|
|
55
|
+
this.logger.warn(`当前服务没有新增接口:${name}`);
|
|
56
|
+
throw new express_exception_1.ActionNotFoundError(`当前服务没有新增接口:${name}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 根据名称调用服务接口
|
|
61
|
+
* @param name
|
|
62
|
+
* @param args
|
|
63
|
+
* @protected
|
|
64
|
+
*/
|
|
65
|
+
async invokeServiceInterface(name, args = []) {
|
|
66
|
+
return await this.service[name](...args);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 新建实体
|
|
70
|
+
* @param req
|
|
71
|
+
* @protected
|
|
72
|
+
*/
|
|
73
|
+
_createNew(req) {
|
|
74
|
+
let data = req.body;
|
|
75
|
+
BaseController_1.default.debugEnabled && this.logger.debug(`${req.method} ${req.originalUrl} 申请创建一个实体`, data);
|
|
76
|
+
this.checkInterface('createNew');
|
|
77
|
+
this.validateEntity(data);
|
|
78
|
+
return this.invokeServiceInterface('createNew', this.getCreateNewArguments(req));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 更新实体
|
|
82
|
+
* @param req
|
|
83
|
+
* @protected
|
|
84
|
+
*/
|
|
85
|
+
_update(req) {
|
|
86
|
+
let data = req.body;
|
|
87
|
+
BaseController_1.default.debugEnabled && this.logger.debug(`${req.method} ${req.originalUrl} 申请更新一个实体,`, data);
|
|
88
|
+
this.checkInterface('update');
|
|
89
|
+
this.validateEntity(data);
|
|
90
|
+
return this.invokeServiceInterface('update', this.getUpdateArguments(req));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 删除实体
|
|
94
|
+
* @param req
|
|
95
|
+
* @protected
|
|
96
|
+
*/
|
|
97
|
+
_del(req) {
|
|
98
|
+
//请在子类实现删除接口,否则会抛出系统异常
|
|
99
|
+
this.logger.warn('当前服务没有删除接口');
|
|
100
|
+
throw new express_exception_1.ActionNotFoundError('当前服务没有删除接口');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.default = CommonController;
|
|
104
|
+
//# sourceMappingURL=CommonController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommonController.js","sourceRoot":"src/","sources":["common/CommonController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import CommonController from "./CommonController";
|
|
2
|
+
import { ValidationRules } from "@ticatec/bean-validator";
|
|
3
|
+
/**
|
|
4
|
+
* 租户的基础接口
|
|
5
|
+
*/
|
|
6
|
+
export default abstract class TenantBaseController<T> extends CommonController<T> {
|
|
7
|
+
protected constructor(service: any, rules: ValidationRules);
|
|
8
|
+
/**
|
|
9
|
+
* 获取当前登录用户,如果有扮演,获取扮演用户
|
|
10
|
+
* @param req
|
|
11
|
+
*/
|
|
12
|
+
protected getLoggedUser: (req: any) => any;
|
|
13
|
+
/**
|
|
14
|
+
* 获取新增接口的参数,第一个参数为登录用户,第二个参数为请求数据
|
|
15
|
+
* @param req
|
|
16
|
+
* @protected
|
|
17
|
+
*/
|
|
18
|
+
protected getCreateNewArguments(req: any): Array<any>;
|
|
19
|
+
/**
|
|
20
|
+
* 获取更新接口的参数,第一个参数为登录用户,第二个参数为请求数据
|
|
21
|
+
* @param req
|
|
22
|
+
* @protected
|
|
23
|
+
*/
|
|
24
|
+
protected getUpdateArguments(req: any): any[];
|
|
25
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const CommonController_1 = __importDefault(require("./CommonController"));
|
|
7
|
+
/**
|
|
8
|
+
* 租户的基础接口
|
|
9
|
+
*/
|
|
10
|
+
class TenantBaseController extends CommonController_1.default {
|
|
11
|
+
constructor(service, rules) {
|
|
12
|
+
super(service, rules);
|
|
13
|
+
/**
|
|
14
|
+
* 获取当前登录用户,如果有扮演,获取扮演用户
|
|
15
|
+
* @param req
|
|
16
|
+
*/
|
|
17
|
+
this.getLoggedUser = (req) => {
|
|
18
|
+
let user = req.user;
|
|
19
|
+
return user.actAs || user;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 获取新增接口的参数,第一个参数为登录用户,第二个参数为请求数据
|
|
24
|
+
* @param req
|
|
25
|
+
* @protected
|
|
26
|
+
*/
|
|
27
|
+
getCreateNewArguments(req) {
|
|
28
|
+
return [this.getLoggedUser(req), req.body];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 获取更新接口的参数,第一个参数为登录用户,第二个参数为请求数据
|
|
32
|
+
* @param req
|
|
33
|
+
* @protected
|
|
34
|
+
*/
|
|
35
|
+
getUpdateArguments(req) {
|
|
36
|
+
return [this.getLoggedUser(req), req.body];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.default = TenantBaseController;
|
|
40
|
+
//# sourceMappingURL=TenantBaseController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TenantBaseController.js","sourceRoot":"src/","sources":["common/TenantBaseController.ts"],"names":[],"mappings":";;;;;AACA,0EAAkD;AAGlD;;GAEG;AACH,MAA8B,oBAAwB,SAAQ,0BAAmB;IAE7E,YAAsB,OAAY,EAAE,KAAsB;QACtD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAG1B;;;WAGG;QACO,kBAAa,GAAG,CAAC,GAAG,EAAE,EAAE;YAC9B,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QAC9B,CAAC,CAAA;IATD,CAAC;IAWD;;;;OAIG;IACO,qBAAqB,CAAC,GAAQ;QACpC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IAED;;;;OAIG;IACO,kBAAkB,CAAC,GAAQ;QACjC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;CAEJ;AAjCD,uCAiCC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const TenantBaseController_1 = __importDefault(require("./TenantBaseController"));
|
|
7
|
+
const BaseController_1 = __importDefault(require("./BaseController"));
|
|
8
|
+
/**
|
|
9
|
+
* 供租户使用带查询的接口
|
|
10
|
+
*/
|
|
11
|
+
class TenantSearchController extends TenantBaseController_1.default {
|
|
12
|
+
search() {
|
|
13
|
+
return async (req) => {
|
|
14
|
+
let query = req.query;
|
|
15
|
+
BaseController_1.default.debugEnabled && this.logger.debug(`path: ${req.path}, query by criteria:`, query);
|
|
16
|
+
this.checkInterface('search');
|
|
17
|
+
return await this.invokeServiceInterface('search', [this.getLoggedUser(req), query]);
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.default = TenantSearchController;
|
|
22
|
+
//# sourceMappingURL=TenantSearchController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TenantSearchController.js","sourceRoot":"src/","sources":["common/TenantSearchController.ts"],"names":[],"mappings":";;;;;AACA,kFAA0D;AAC1D,sEAA8C;AAE9C;;GAEG;AACH,MAA8B,sBAA0B,SAAQ,8BAAuB;IAEnF,MAAM;QACF,OAAO,KAAK,EAAE,GAAW,EAAe,EAAE;YACtC,IAAI,KAAK,GAAO,GAAG,CAAC,KAAK,CAAC;YAC1B,wBAAc,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,sBAAsB,EAAE,KAAK,CAAC,CAAC;YACjG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACzF,CAAC,CAAA;IACL,CAAC;CAEJ;AAXD,yCAWC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ticatec/common-express-server",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A set of common classes for node express apps.",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"types": "lib/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
9
|
+
"build": "rm -rf ./lib && tsc",
|
|
10
|
+
"publish-public": "npm publish --access public"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"ticatec",
|
|
14
|
+
"common",
|
|
15
|
+
"database",
|
|
16
|
+
"utils"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/ticatec/common-express-server.git"
|
|
21
|
+
},
|
|
22
|
+
"author": "Henry Feng",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/ticatec/common-express-server/issues"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://github.com/ticatec/common-express-server",
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@ticatec/singleton-log4js": "^0.0.5",
|
|
30
|
+
"@types/express": "^5.0.1",
|
|
31
|
+
"@types/node": "^22.8.6",
|
|
32
|
+
"log4js": "^6.7.0"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@ticatec/bean-validator": "^0.0.1",
|
|
36
|
+
"@ticatec/express-exception": "^1.1.1",
|
|
37
|
+
"express": "^5.1.0"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"express": "^5.1.0"
|
|
41
|
+
}
|
|
42
|
+
}
|
package/tsconfig.json
ADDED