明树Git Lab

Commit 48325772 authored by sky_3509's avatar sky_3509

MysqlSearchProcessor.ts

parents
node_modules
dist
.vscode
\ No newline at end of file
{
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
],
"rules": {
"no-unused-vars": "off",
"prefer-const": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-empty-interface": "off",
"@typescript-eslint/no-empty-function": "off",
"no-console": 2 // 如果有console,会抛出错误
}
}
dist
DS_Store
.DS_Store
tsconfig.tsbuildinfo
node_modules/*
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/node/tags/
# Pick zero or more services to be used on all builds.
# Only needed when using a docker container to run your tests in.
# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-a-service
# This folder is cached between builds
# http://docs.gitlab.com/ce/ci/yaml/README.html#cache
# 自动化测试,创建一个node docker 容器
test_automation:
image: harbor.bridata.com/library/node:12.01
stage: deploy
cache:
paths:
- node_modules/
script:
- npm install --registry https://registry.npmmirror.com
- npm run citest
when: always
environment:
name: dev
only:
- dev
tags:
- bridata-auto-testing
\ No newline at end of file
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug Typescript",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/dist/bin.js",
"runtimeArgs": ["-r", "ts-node/register", "-r", "tsconfig-paths/register"],
"console": "integratedTerminal",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}
]
}
\ No newline at end of file
# 新TS项目创建步骤
1. 创建项目
2. 拷贝TS_BASIS下全部文件到文件夹,并正确运行。
3. 修改mw.ts, gvar.ts, routes下相关文件。
4. controllers, managers, models, services 注意使用base文件夹下的类继承,不要重复定义方法。
5. 如要修改核心内容,到TS_BASIS项目修改,然后运行node bcopy同步代码。
6. 使用import export模式。
7. controller和manager的参数动用一个params的对象,统一格式。
# 代码替换规则
1. 本地manager都从keyItem, compItem, appItem, IdItem四类继承。
1.1 class ResourceManager extends CompItemManager<ResourceDef>
1.2 可参考resource,file项目
2. cloudEnv获取参数修改位置,从remoteEnv获取
2.1 获取core redis的链接getRemoteRedisClient("core");
2.2 获取配置getRemoteConfigByKey("core");
3. 不再使用modBuildService之类的service文件创建manager,创建manager的函数直接放到manager文件定义中。
4. 固定schema的动态表单创建,custom(flowInst, stepInst),log三个项目用到。
4.1 可参考log项目, CustomLogManager文件
4.2 let customLogManager = await getCustomLogManagerInst(dbinfo);
5. 路由上的请求直接转发(无复杂逻辑),可使用remoteController。
6. 动态请求外部的数据,可继承KeyItemRemote, CompItemRemote, AppItemRemote三个Manager,或者直接继承。
6.1 let resourceRemoteManager = new CompItemRemoteManager<ResourceDef>({user: user, remoteKey: "resource", modelName: "Resource"});
6.2 let resource = await resourceRemoteManager.mGetByCompKey(compKey, field._resourceKey);
6.3 请求任意接口可使用customCall方法.
# redis哨兵模式
const ioredis = new Redis({
sentinels: [
{ host: '47.93.215.95', port: 26379 },
{ host: '39.106.26.127', port: 26379 },
{ host: '47.94.239.108', port: 26379 },
],
name: "mymaster",
password: "Bridata2017",
});
ioredis.set("foo", "bar");
db.core_innerapp.updateOne({compKey: "shenhezhuan", _key: "renliziyuan"}, {$push: { "managers": "0858cb3eb33b7bf93bab1cdbe781d32e" } } )
# 数据库连接
内网
tscore 配置数据库
mongo -u 'bridata' -p 'bridata2023' 172.17.60.101:27017 --authenticationDatabase "admin"
tscustom 默认的custom数据库
mongo -u 'bridata' -p 'bridata2023' 172.17.60.95:27520 --authenticationDatabase "admin"
明树数据库应用数据库
mongo -u 'bridata' -p 'bridata2023' 172.17.60.95:27017 --authenticationDatabase "admin"
江西,国家信息中心数据库
mongo -u 'bridata' -p 'bridata2023' 172.17.166.85:27017 --authenticationDatabase "admin"
V3数据库
mongo -u 'bridata' -p 'bridata2023' 172.17.60.96:27017 --authenticationDatabase "admin"
外网
tscore 配置数据库
mongo -u 'bridata' -p 'bridata2023' 39.105.56.246:27017 --authenticationDatabase "admin"
tscustom 默认的custom数据库
mongo -u 'bridata' -p 'bridata2023' 101.201.77.220:27520 --authenticationDatabase "admin"
明树数据库应用数据库
mongo -u 'bridata' -p 'bridata2023' 101.201.77.220:27017 --authenticationDatabase "admin"
江西,国家信息中心数据库
mongo -u 'bridata' -p 'bridata2023' 47.94.97.216:27017 --authenticationDatabase "admin"
V3数据库
mongo -u 'bridata' -p 'bridata2023' 39.97.211.251:27017 --authenticationDatabase "admin"
db.cust_appmessage.remove({});
db.cust_commonphrases.remove({});
db.cust_flowinst.remove({});
db.cust_flownotify.remove({});
db.cust_flowtask.remove({});
db.cust_label.remove({});
db.cust_stepinst.remove({});
let fs = require('fs')
let projects = [
"../ts_file",
"../ts_resource",
"../ts_proxy",
"../ts_comp",
"../ts_core",
"../ts_ticker",
"../ts_share",
"../ts_log",
"../ts_job",
"../ts_sender",
"../ts_mod",
"../ts_admin",
"../ts_calculator",
"../ts_dstore",
"../ts_custom",
"../ts_cgpt",
]
let deleteFiles = [
// "src/api/managers/base/remote/ModDataRemoteManager.ts"
]
let files = [
".vscode/launch.json",
".eslintignore",
".eslintrc",
"src/app.ts",
"src/bin.ts",
"src/api/controllers/base/ManagerController.ts",
"src/api/controllers/base/CompItemController.ts",
"src/api/controllers/base/AppItemController.ts",
"src/api/controllers/base/KeyItemController.ts",
"src/api/controllers/base/RemoteController.ts",
"src/api/def/base/adminTypes.ts",
"src/api/def/base/basisTypes.ts",
"src/api/def/base/commonTypes.ts",
"src/api/def/base/compTypes.ts",
"src/api/def/base/coreTypes.ts",
"src/api/def/base/customTypes.ts",
"src/api/def/base/defUtil.ts",
"src/api/def/base/dstoreTypes.ts",
"src/api/def/base/fileTypes.ts",
"src/api/def/base/jobTypes.ts",
"src/api/def/base/logTypes.ts",
"src/api/def/base/modTypes.ts",
"src/api/def/base/proxyTypes.ts",
"src/api/def/base/resourceTypes.ts",
"src/api/def/base/senderTypes.ts",
"src/api/def/base/shareTypes.ts",
"src/api/def/base/tickerTypes.ts",
"src/api/def/base/cgptTypes.ts",
"src/api/def/base/enums.ts",
"src/api/lib/mongo/index.ts",
"src/api/lib/mongo/plugins.ts",
"src/api/lib/cloudEnv.ts",
"src/api/lib/events.ts",
"src/api/lib/jwtlib.ts",
"src/api/lib/redis.ts",
"src/api/lib/remoteEnv.ts",
"src/api/lib/tools.ts",
"src/api/lib/cms.ts",
"src/api/util/api_util.ts",
"src/api/managers/base/BaseManager.ts",
"src/api/managers/base/CommonManager.ts",
"src/api/managers/base/IdItemManager.ts",
"src/api/managers/base/OrderManager.ts",
"src/api/managers/base/KeyItemManager.ts",
"src/api/managers/base/AppItemManager.ts",
"src/api/managers/base/CompItemManager.ts",
"src/api/managers/base/remote/RemoteCaller.ts",
"src/api/managers/base/remote/BaseRemoteManager.ts",
"src/api/managers/base/remote/CompItemRemoteManager.ts",
"src/api/managers/base/remote/AppItemRemoteManager.ts",
"src/api/managers/base/remote/IdItemRemoteManager.ts",
"src/api/managers/base/remote/KeyItemRemoteManager.ts",
"src/api/managers/base/remote/DynamicModRemoteManager.ts",
"src/api/models/base/CommonModel.ts",
"src/api/services/base/controllerService.ts",
"src/api/services/base/basePopService.ts",
"src/api/services/base/connectionService.ts",
"src/tests/setup.ts"
]
for( let project of projects ) {
// fs.mkdirSync(project + "/src/api/managers/base/remote")
for( let filepath of deleteFiles ){
let destFile = project + "/" + filepath;
if(fs.existsSync(destFile)){
fs.unlinkSync(destFile);
}
}
for( let filepath of files ){
let srcFile = "./" + filepath;
let destFile = project + "/" + filepath;
fs.copyFileSync(srcFile, destFile);
}
}
{
"dbConfig":
{
"user": "bridata",
"password": "Mingshu20170706",
"host": "172.17.60.96",
"port": 27000,
"dbName": "ts_basis_test"
},
"redisConfig":
{
"host": "172.17.60.96",
"port": 6380,
"password": "Mingshu20170706",
"db": 11
},
"remoteRedisConfig": {
"host": "172.17.60.96",
"port": 6380,
"password": "Mingshu20170706",
"db": 11
},
"server":
{
"PORT": 5201
},
"log4jsConfig": {
"categories": {
"default": {
"level": "error"
}
}
}
}
\ No newline at end of file
{
"server":
{
"PORT": 6306
},
"dbConfig":
{
"poolSize": 10
},
"pagination":
{
"pagesize": 10
},
"DEBUG_PARAM":
{
"meta":
{
"debug": 2734096276,
"api_key": "bridata",
"api_secret": "Bridata@2017"
}
},
"cacheSecs": 0,
"serviceKey": "hBasis",
"log4jsConfig": {
"appenders": {
"console": {
"type": "console"
},
"file": {
"type": "file",
"filename": "out.log"
}
},
"categories": {
"default": {
"appenders": [
"console"
],
"level": "info"
}
},
"replaceConsole": false
}
}
{
"dbConfig":
{
"host": "127.0.0.1",
"port": 27017,
"dbName": "ts_basis"
},
"redisConfig":
{
"host": "127.0.0.1",
"port": 6379
},
"remoteRedisConfig": {
"host": "127.0.0.1",
"port": 6379,
"db": 15
},
"server":
{
"PORT": 7901
}
}
\ No newline at end of file
{
"dbConfig":
{
"host": "127.0.0.1",
"port": 27017,
"dbName": "ts_basis_test"
},
"redisConfig":
{
"host": "127.0.0.1",
"port": 6379,
"db": 11
},
"remoteRedisConfig": {
"host": "127.0.0.1",
"port": 6379,
"db": 11
},
"server":
{
"PORT": 5201
},
"log4jsConfig": {
"categories": {
"default": {
"level": "error"
}
}
}
}
\ No newline at end of file
{
"model": "BaseExample",
"list": [
{
"_id": "5d5224e4f6268da7337cbd01",
"name": "明树数据",
"description": "北京明树数据科技有限公司",
"amount": "3000",
"itemType": "Mod"
},
{
"_id": "5d5224e4f6268da7337cbd02",
"name": "明树数据-南京分公司",
"description": "北京明树数据科技有限公司-南京分公司",
"amount": "1000",
"itemType": "Dashboard"
},
{
"_id": "5d5224e4f6268da7337cbd03",
"name": "明树数据-武汉分公司",
"description": "北京明树数据科技有限公司-武汉分公司",
"amount": "1200",
"itemType": "Dashboard"
}
]
}
{
"model": "Resource",
"remoteKey": "resource",
"modelType": "compItem",
"list": [
{
"name": "运作方式",
"_key": "optype",
"compKey": "test",
"resData": [
{
"_key": "bot",
"name": "BOT",
"color": "color-1",
"children": [],
"description": ""
},
{
"_key": "tot",
"name": "TOT",
"color": "color-2",
"children": [],
"description": ""
},
{
"_key": "boo",
"name": "BOO",
"color": "color-3",
"children": [],
"description": ""
}
]
}
]
}
This diff is collapsed.
{
"name": "ts_basis",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "NODE_ENV=development node dist/bin.js",
"staging": "NODE_ENV=staging node ./dist/bin.js",
"cloud": "NODE_ENV=cloud node ./dist/bin.js",
"dev": "nodemon -e ts --watch src .env --exec \"tsc --incremental && node dist/bin.js\"",
"test": "NODE_ENV=test node ./node_modules/mocha/bin/mocha --require ts-node/register src/tests/setup.ts src/tests/**/*.test.ts",
"citest": "NODE_ENV=citest node ./node_modules/mocha/bin/mocha --require ts-node/register src/tests/setup.ts src/tests/**/*.test.ts",
"lint": "eslint . --ext .ts",
"build": "tsc -p ."
},
"repository": {
"type": "git",
"url": "http://gitlab.bridata.com:8090/root/ts_basis.git"
},
"author": "",
"license": "ISC",
"dependencies": {
"ali-oss": "^6.15.2",
"async-redis": "^1.1.7",
"axios": "^0.21.1",
"bson-objectid": "^1.3.1",
"bull": "^4.10.2",
"config": "^3.1.0",
"cookie-parser": "^1.4.6",
"debug": "~2.6.9",
"esprima": "^4.0.1",
"express": "^4.18.1",
"html-docx-js": "^0.3.1",
"http-errors": "~1.6.2",
"ioredis": "^5.3.1",
"irr-npv": "^1.0.1",
"jsonwebtoken": "^8.5.1",
"lodash": "^4.17.21",
"log4js": "^6.7.1",
"mammoth": "^1.4.14",
"md5": "^2.2.1",
"mocha": "^9.2.2",
"moment": "^2.29.4",
"mongoose": "^5.9.2",
"mongoose-autopopulate": "^0.9.1",
"multer": "^1.4.4",
"mysql2": "^2.1.0",
"passport": "^0.4.1",
"sequelize": "^6.3.4",
"socket.io": "^4.5.4",
"svg-captcha": "^1.4.0",
"xlsx": "^0.16.9"
},
"devDependencies": {
"@types/ali-oss": "^6.16.6",
"@types/async-redis": "^1.1.3",
"@types/config": "^3.3.0",
"@types/cookie-parser": "^1.4.3",
"@types/express": "^4.17.13",
"@types/html-docx-js": "^0.3.1",
"@types/http-errors": "^2.0.1",
"@types/jsonwebtoken": "^8.5.9",
"@types/lodash": "^4.14.189",
"@types/md5": "^2.3.2",
"@types/mocha": "^10.0.1",
"@types/multer": "^1.4.7",
"@types/node": "^18.7.16",
"@types/passport": "^1.0.11",
"@typescript-eslint/eslint-plugin": "^5.44.0",
"@typescript-eslint/parser": "^5.44.0",
"eslint": "^8.28.0",
"nodemon": "^2.0.19",
"ts-node": "^10.9.1",
"tsconfig-paths": "^4.1.1",
"typescript": "^4.8.3"
}
}
pwd
for project in "ts_file" "ts_resource" "ts_proxy" "ts_comp" "ts_core" "ts_ticker" "ts_share" "ts_log" "ts_job" "ts_sender" "ts_mod" "ts_admin" "ts_calculator" "ts_dstore" "ts_custom" "ts_cgpt"
do
cd ../${project}
rm -rf node_modules
npm install --registry https://registry.npm.taobao.org
rm -rf dist
npm run build
echo "======================= ${project} finished."
done
cd ../ts_basis
pwd
for project in "ts_file" "ts_resource" "ts_proxy" "ts_comp" "ts_core" "ts_ticker" "ts_share" "ts_log" "ts_job" "ts_sender" "ts_mod" "ts_admin" "ts_calculator" "ts_dstore" "ts_custom" "ts_cgpt"
do
cd ../${project}
git checkout staging
git pull
git checkout cloud
git pull
git merge staging
git push
git checkout dev
git status
echo "======================= ${project} finished."
done
cd ../ts_basis
pwd
for project in "ts_file" "ts_resource" "ts_proxy" "ts_comp" "ts_core" "ts_ticker" "ts_share" "ts_log" "ts_job" "ts_sender" "ts_mod" "ts_admin" "ts_calculator" "ts_dstore" "ts_custom" "ts_cgpt"
do
cd ../${project}
git checkout dev
git pull
git checkout staging
git pull
git merge dev
git push
git checkout dev
git status
echo "======================= ${project} finished."
done
cd ../ts_basis
pwd
for project in "ts_file" "ts_resource" "ts_proxy" "ts_comp" "ts_core" "ts_ticker" "ts_share" "ts_log" "ts_job" "ts_sender" "ts_mod" "ts_admin" "ts_calculator" "ts_dstore" "ts_custom" "ts_cgpt"
do
cd ../${project}
git checkout dev
git pull
git checkout tmp
git pull
git merge dev
git push
git checkout dev
git status
echo "======================= ${project} finished."
done
cd ../ts_basis
pwd
for project in "ts_file" "ts_resource" "ts_proxy" "ts_comp" "ts_core" "ts_ticker" "ts_share" "ts_log" "ts_job" "ts_sender" "ts_mod" "ts_admin" "ts_calculator" "ts_dstore" "ts_custom" "ts_cgpt"
do
cd ../${project}
git checkout dev
git pull
done
cd ../ts_basis
git checkout dev
git pull
pwd
for project in "ts_file" "ts_resource" "ts_proxy" "ts_comp" "ts_core" "ts_ticker" "ts_share" "ts_log" "ts_job" "ts_sender" "ts_mod" "ts_admin" "ts_calculator" "ts_dstore" "ts_custom" "ts_cgpt"
do
cd ../${project}
git checkout dev
git pull
git add src
git add .gitignore
git add .vscode
git add ./tsconfig.json
git add ./.eslintignore
git add ./.eslintrc
git add package.json
git commit -m "feat: sync from basis"
git push
git status
echo "======================= ${project} finished."
done
cd ../ts_basis
for project in "ts_file" "ts_resource" "ts_proxy" "ts_comp" "ts_core" "ts_ticker" "ts_share" "ts_log" "ts_job" "ts_sender" "ts_mod" "ts_admin" "ts_calculator" "ts_dstore" "ts_custom" "ts_cgpt"
do
cd ../${project}
git checkout dev
rm -rf src
git checkout .
echo "======================= ${project} finished."
done
\ No newline at end of file
for project in "ts_file" "ts_resource" "ts_proxy" "ts_comp" "ts_core" "ts_ticker" "ts_share" "ts_log" "ts_job" "ts_sender" "ts_mod" "ts_admin" "ts_calculator" "ts_dstore" "ts_custom" "ts_cgpt"
do
cd ../${project}
git status
echo "======================= ${project} finished."
done
\ No newline at end of file
import ManagerControllerSchema from './base/ManagerController'
import { BaseExampleDef } from '../def/base/basisTypes';
import { BaseExampleManagerInst } from '../../api/managers/BaseExampleManager'
class BaseExampleControllerSchema extends ManagerControllerSchema<BaseExampleDef> {
constructor(params: any = {}) {
super(BaseExampleManagerInst, params);
}
}
export default BaseExampleControllerSchema;
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import ManagerControllerSchema from './ManagerController'
import { AppItemDef } from '../../def/base/commonTypes';
import controllerService from '../../services/base/controllerService';
import { Request, Response } from 'express'
import AppItemManager from '../../managers/base/AppItemManager';
class AppItemControllerSchema<T extends AppItemDef> extends ManagerControllerSchema<T> {
compKey: string;
appKey: string;
manager: AppItemManager<T>;
constructor(manager: AppItemManager<T>, params: any) {
super(manager, params);
this.compKey = params.compKey;
this.appKey = params.appKey;
this.manager = manager;
}
async index(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
throw new Error("index not supported, use appIndex!")
}
async all(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
throw new Error("all not supported, use appAll!")
}
async show(req: Request, res: Response): Promise<T | null> {
throw new Error("show not supported, use appShow!")
}
async create(req: Request, res: Response): Promise<T> {
throw new Error("create not supported, use appCreate!")
}
async update(req: Request, res: Response): Promise<T> {
throw new Error("update not supported, use appUpdate!")
}
async delete(req: Request, res: Response): Promise<T> {
throw new Error("delete not supported, use appDelete!")
}
async searchDelete(req: Request, res: Response): Promise<{ list: (T)[] }> {
throw new Error("searchDelete not supported, use appSearchDelete!")
}
/// ///////////////
// 应用相关接口
/// ///////////////
async appIndex(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
controllerService.injectSearch(req, "compKey", this.compKey);
controllerService.injectSearch(req, "appKey", this.appKey);
return await super.index(req, res);
}
async appAll(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
controllerService.injectSearch(req, "compKey", this.compKey);
controllerService.injectSearch(req, "appKey", this.appKey);
return await super.all(req, res);
}
async appSearchDelete(req: Request, res: Response): Promise<{ list: (T)[] }> {
controllerService.injectSearch(req, "compKey", this.compKey);
controllerService.injectSearch(req, "appKey", this.appKey);
return await super.searchDelete(req, res);
}
async appDelete(req: Request, res: Response): Promise<T | null> {
const params = {
compKey: this.compKey,
appKey: this.appKey,
_key: req.body._key,
menuType: this.manager.modelName,
};
return this.manager.mDelete(params);
}
async appShow(req: Request, res: Response): Promise<T | null> {
controllerService.injectParam(req, "compKey", this.compKey);
controllerService.injectParam(req, "appKey", this.appKey);
return await super.show(req, res)
}
async appCreate(req: Request, res: Response): Promise<T> {
delete req.body.search;
controllerService.injectParam(req, "compKey", this.compKey);
controllerService.injectParam(req, "appKey", this.appKey);
controllerService.verifyKey(req.body._key);
let eObj = await this.manager.mFindOne(this.manager.getUniqueSearch(req.body));
if (eObj) {
throw new Error("主键_key冲突");
}
return await super.create(req, res);
}
async appUpdate(req: Request, res: Response): Promise<T> {
if (req.body.appKey && req.body.appKey != this.appKey) {
throw new Error("App id wrong!");
}
controllerService.injectParam(req, "compKey", this.compKey);
controllerService.injectParam(req, "appKey", this.appKey);
return await super.update(req, res);
}
async getByKey(req: Request, res: Response): Promise<T | null> {
// let populate = req.body.populate || [];
let obj = await this.manager.mGetByAppKey(this.compKey, this.appKey, req.body._key);
if (!obj) {
throw new Error("Obj not found by key!");
}
return obj;
}
}
export default AppItemControllerSchema;
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import ManagerControllerSchema from './ManagerController'
import { CompItemDef } from '../../def/base/commonTypes';
import CompItemManager from '../../managers/base/CompItemManager';
import controllerService from '../../services/base/controllerService';
import { Request, Response } from 'express'
class CompItemControllerSchema<T extends CompItemDef> extends ManagerControllerSchema<T> {
compKey: string;
manager: CompItemManager<T>;
constructor(manager: CompItemManager<T>, params: any) {
super(manager, params);
this.compKey = params.compKey
this.manager = manager
}
async index(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
throw new Error("index not supported, use compIndex!")
}
async all(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
throw new Error("all not supported, use compAll!")
}
async show(req: Request, res: Response): Promise<T | null> {
throw new Error("show not supported, use compShow!")
}
async create(req: Request, res: Response): Promise<T> {
throw new Error("create not supported, use compCreate!")
}
async update(req: Request, res: Response): Promise<T> {
throw new Error("update not supported, use compUpdate!")
}
async delete(req: Request, res: Response): Promise<T> {
throw new Error("delete not supported, use compDelete!")
}
async searchDelete(req: Request, res: Response): Promise<{ list: (T)[] }> {
throw new Error("searchDelete not supported, use compSearchDelete!")
}
async compIndex(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
controllerService.injectSearch(req, "compKey", this.compKey);
return await super.index(req, res);
}
async compAll(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
controllerService.injectSearch(req, "compKey", this.compKey);
return await super.all(req, res);
}
async compShow(req: Request, res: Response): Promise<T | null> {
controllerService.injectParam(req, "compKey", this.compKey);
return await super.show(req, res);
}
async compSearchDelete(req: Request, res: Response): Promise<{ list: (T)[] }> {
controllerService.injectSearch(req, "compKey", this.compKey);
return await super.searchDelete(req, res);
}
async compCreate(req: Request, res: Response): Promise<T> {
controllerService.injectParam(req, "compKey", this.compKey);
controllerService.verifyKey(req.body._key);
let eObj = await this.manager.mFindOne(this.manager.getUniqueSearch(req.body));
if (eObj) {
throw new Error("主键_key冲突");
}
return await super.create(req, res);
}
async compUpdate(req: Request, res: Response): Promise<T> {
controllerService.injectParam(req, "compKey", this.compKey);
return await super.update(req, res);
}
async compDelete(req: Request, res: Response): Promise<T | null> {
let search = {
_key: req.body._key,
compKey: this.compKey
};
let ret = await this.getManager().mDelete(search);
return ret;
}
}
export default CompItemControllerSchema;
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import ManagerControllerSchema from './ManagerController'
import { KeyItemDef } from '../../def/base/commonTypes';
import KeyItemManager from '../../managers/base/KeyItemManager';
import controllerService from '../../services/base/controllerService';
import { Request, Response } from 'express'
class KeyItemControllerSchema<T extends KeyItemDef> extends ManagerControllerSchema<T> {
manager: KeyItemManager<T>;
constructor(manager: KeyItemManager<T>, params: any) {
super(manager, params);
this.manager = manager
}
async create(req: Request, res: Response): Promise<T> {
controllerService.verifyKey(req.body._key);
let eObj = await this.manager.mFindOne(this.manager.getUniqueSearch(req.body));
if (eObj) {
throw new Error("主键_key冲突");
}
return await super.create(req, res);
}
}
export default KeyItemControllerSchema;
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { Request, Response } from 'express'
import { BaseDef } from '../../def/base/commonTypes';
import { AbstractManager } from '../../managers/base/CommonManager';
class ManagerControllerSchema<T extends BaseDef>{
manager: AbstractManager<T>;
allPageSize: number;
constructor(manager: AbstractManager<T>, params: any = {}) {
this.manager = manager;
this.allPageSize = params.allPageSize || 5000
}
getManager() {
return this.manager;
}
async all(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
let limit = req.body.limit != null ? req.body.limit : this.allPageSize;
if( req.body.skip != null ) {
req.body.pagination = {
page: -1,
pagesize: limit,
start: req.body.skip
};
}
else {
req.body.pagination = {
page: 1,
pagesize: limit
};
}
let result = await this.getManager().mIndex(req.body);
return result
}
async create(req: Request, res: Response): Promise<T> {
let obj = await this.getManager().mCreate(req.body);
return obj;
}
async delete(req: Request, res: Response): Promise<T | null> {
let obj = await this.getManager().mDelete(req.body);
return obj;
}
async searchDelete(req: Request, res: Response): Promise<{ list: (T)[] }> {
let result: T[] = [];
if (req.body.__deleteAll__) {
result = await this.getManager().mDeleteMany({}, [], true);
}
else if (req.body.search) {
result = await this.getManager().mDeleteMany(req.body.search, req.body.fields, req.body.returnEmpty);
}
return {
list: result
}
}
async searchUpdate(req: Request, res: Response): Promise<{ list: (T)[] }> {
let result: T[] = [];
if (req.body.search) {
result = await this.getManager().mUpdateMany(req.body.search, req.body.updateParams, req.body.fields, req.body.returnEmpty);
}
return {
list: result
}
}
async softDelete(req: Request, res: Response): Promise<T> {
let obj = await this.getManager().mSoftDelete(req.body);
return obj;
}
async softSearchDelete(req: Request, res: Response): Promise<{ list: (T)[] }> {
let result: T[] = [];
if (req.body.__deleteAll__) {
result = await this.getManager().mSoftDeleteMany({}, [], true);
}
else if (req.body.search) {
result = await this.getManager().mSoftDeleteMany(req.body.search, req.body.fields, req.body.returnEmpty);
}
return {
list: result
};
}
async update(req: Request, res: Response): Promise<T> {
let obj = await this.getManager().mUpdate(req.body);
return obj;
}
async index(req: Request, res: Response): Promise<{ total: number; list: (T)[] }> {
let result = await this.getManager().mIndex(req.body);
return result;
}
async show(req: Request, res: Response): Promise<T | null> {
let objParam: any = req.body;
if (req.method == "GET") {
objParam = {
_id: req.params["_id"]
}
}
let obj = await this.getManager().mGet(objParam);
return obj;
}
async count(req: Request, res: Response): Promise<{ total: number }> {
let total = await this.getManager().mCount(req.body.search, req.body.countLimit);
return {
total
};
}
async types(req: Request, res: Response): Promise<any> {
let result = await this.getManager().mTypes();
return result;
}
async insertMany(req: Request, res: Response): Promise<{ list: T[] }> {
let resultList = await this.getManager().mInsertMany(req.body.list);
return {
list: resultList
}
}
async findOne(req: Request, res: Response): Promise<T | null> {
let result = this.getManager().mFindOne(req.body.search)
return result
}
async aggregate(req: Request, res: Response): Promise<{ list: any[] }> {
let list = await this.getManager().mAggregate(req.body.list, req.body.option);
return {
list
}
}
}
export default ManagerControllerSchema;
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import RemoteCaller from '../../managers/base/remote/RemoteCaller'
import { RemoteParam } from '../../managers/base/CommonManager';
class RemoteControllerSchema {
user: any;
remoteCaller: RemoteCaller;
constructor(params: RemoteParam) {
this.remoteCaller = new RemoteCaller(params);
}
// path为相对路径
async getRemoteData(path: string, params: any, headers = {}) {
let data = await this.remoteCaller.requestRemoteData(path, params, headers)
return data
}
}
export default RemoteControllerSchema;
\ No newline at end of file
import { BaseDef, CascaderDef, KeyItemDef } from "./commonTypes";
import mongoose from "mongoose";
export interface CategoryDef extends CascaderDef, BaseDef {
_key: string;
order: number;
is_show: string;
description: string;
children: Array<CategoryDef>;
}
export interface ArticleDef extends BaseDef {
_key: string;
order: number;
icon: string;
name: string;
description: string;
isHot: string;
isHide: string;
category: mongoose.Types.ObjectId | CascaderDef;
attachments: string;
content: string;
category__t_n: string;
}
export interface FeedBackDef extends KeyItemDef {
compKey: string;
content: string;
appKey: string;
userKey: string;
whatCanUp: string;
followData: string;
score: string;
willShare: string;
feedType: "comp" | "custom";
}
export interface ReleaseDef extends BaseDef {
ios_version: string; // "Ios版本号";
android_version: string; // "Android版本号"
force_update: boolean; // "是否强制更新"
ios_online: boolean; // "Ios是否上线"
android_online: boolean; //
xiaomi_online: boolean; //
huawei_online: boolean; //
ios_online_date: Date; //
android_online_date: Date; // "线上更新时间"
xiaomi_online_date: Date; //
huawei_online_date: Date; //
// ios_ipa: string; // Ios包
// android_apk: string; // Android包
androidUrl: string;
}
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef } from "./commonTypes";
export interface BaseExampleDef extends BaseDef {
name: string;
description: string;
amount: number;
itemType: "Mod" | "Dashboard" | "Report" | "InnerApp" | "Tabulation" | "EmbedPage" | "InnerChart" | "InnerTable" | "AppRole" | "Trigger" | "FlowDef";
}
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { OrderDef } from "./commonTypes";
export interface ConversationDef extends OrderDef {
compKey: string,
appKey: string,
userKey: string,
messageIds: string[],
messages?: MessageDef[],
question?: string,
answer?: string,
title?: string,
}
export interface MessageDef extends OrderDef {
conversationId: string,
question?: string,
answer?: string,
}
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import mongoose from "mongoose"
import { UserDef } from "./compTypes"
export interface BaseDef {
_id: mongoose.Types.ObjectId | string | number;
visible: boolean;
createdAt: Date;
updatedAt: Date;
__old__?: any; // 老对象
}
export interface OrderDef extends BaseDef {
order: number;
}
export interface KeyItemDef extends OrderDef {
_key: string;
}
export interface NameDef extends OrderDef {
name: string;
description: string;
createType: "self" | "download";
}
export interface CompItemDef extends NameDef {
compKey: string;
_key: string;
itemGroupKey: string;
}
export interface AppItemDef extends NameDef {
compKey: string;
appKey: string;
_key: string;
itemGroupKey: string;
}
export interface CompItemGroupDef extends CompItemDef {
menuType: "Resource" | "Entity" | "Archive";
outerCompKey: string;
}
export type MenuType = "Mod" | "Dashboard" | "FlowDef" | "Report" | "Resource" | "Tabulation" | "EmbedPage" | "Trigger" | "DataFactory" | "TabulationCreate";
export type AnchorType = "Top" | "Bottom" | "Left" | "Right" | "TopLeft" | "TopRight" | "BottomLeft" | "BottomRight";
export interface AppItemGroupDef extends AppItemDef {
menuType: MenuType
}
export interface CascaderDef {
name: string; // 名字
code: string; // 编码
level: number; // 层级
full_name: string; // 全名
is_leaf: boolean; // 是否是最低层
}
export interface DbInfo {
dbName: string;
host?: string;
port?: number | string;
user?: string;
password?: string;
readPreference?: any;
coreCluster?: {
host: string;
port: string;
}[];
cache?: {
[key: string]: any
};
coreClusterRSName?: string;
dbId: string;
}
export interface CustomRemoteConfigDef {
localSetting?: string,
frontHost: string,
frontAppHost?: string,
host: string,
db: DbInfo
}
type CustomRequest = AppendToObject<Request, 'user', UserDef>;
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef, CompItemDef, KeyItemDef } from './commonTypes'
import mongoose from "mongoose"
import { CascaderDef } from './commonTypes';
import { AttachmentBaseDef } from './fileTypes';
export interface UserDef extends KeyItemDef {
mobile: string;
realname: string;
username: string;
email: string;
job: string;
birthday: Date;
password: string;
salt: string;
avatarurl: string;
gender: "male" | "female";
user_type: "BR1" | "ADV" | "CUS" | "TMP" | "SHA";
system_type: "inner" | "outer";
companyOut: {
[propName: string]: any;
};
sic_uid: string;
user_status: "invalid" | "valid";
usbKey: string;
mobileEnc: string;
companies: {
compKey: string;
isDefault: boolean;
isValid: boolean;
compRole: "ADM" | "HIG" | "USR";
}[];
departments: {
compKey: string;
deptKey: string;
isDefault: boolean;
deptGrade: string;
}[];
compKey: string;
user_card:string;
oldId: string;
industry: string[];
}
interface DDWXConfig {
// 常规配置
corpid: string, // 公司组织 id
appkey: string, // 钉钉 appkey;企业微信 AgentId
appsecret: string, // appsecret
// 消息回调配置
callback_token: string, // 回调加密 aes_key
encoding_ase_key: string, // 签名 token
// 系统标记
isDocking: boolean, // 是否开启同步
isCheckUrl: boolean, // 消息回调是否已开启
}
export interface CompanyDef extends KeyItemDef {
company_type: "free" | "standard" | "professional" | "ultimate";
maxUsers: number;
name: string;
description: string;
defaultApp: mongoose.Types.ObjectId;
logoUrl: string;
fixPhone: string;
fax: string;
email: string;
address: string;
zipCode: string;
licenseNumber: string;
loginName: string;
loginBg: string;
allowAddDepartment: boolean;
ddInfo: DDWXConfig;
wxInfo: DDWXConfig;
app_secretes: {
foreignCompKey: string //
userKey: string
app_secrete: string
apps: string[]
}[]
}
export interface DepartmentDef extends CompItemDef, CascaderDef {
creditCode: string;
oldCode: string;
region: string[];
ord: number;
deptClass: string;
// 是否在用户端通讯录显示
contactShow: boolean;
oid: string;
}
export interface DepartmentGradeDef extends CompItemDef {
}
interface ArchiveMenu {
name: string;
icon: string;
children: ArchiveMenu[];
}
export interface ArchiveDef extends CompItemDef {
articleMenus: ArchiveMenu[];
}
export interface ArticleDef extends CompItemDef {
name: string;
icon: string;
isHot: "0" | "1";
isHid: "0" | "1";
attachments: AttachmentBaseDef[];
content: string;
}
export interface LoginLogDef extends CompItemDef {
userKey: string;
loginType: number;
browser: string;
os: string;
engine: string;
mobile: string;
loginStatus: string;
failReason: string;
ip: string;
}
export interface InviteMessageDef extends CompItemDef {
is_valid: "0" | "1";
operate_time: Date;
invite_status: "waiting" | "completed" | "rejected";
userKey: string;
inviteUserKey: string;
mobile: string;
}
type platform = 'dd' | 'wx';
export interface OuterUserDef extends BaseDef {
platform: platform,
user_id: string,
user_name: string,
mobile: string,
email: string,
avatar: string,
dept_ids: string[],
compKey: string,
user: {
_key: string,
name: string,
mobile: string,
mobileMatch: boolean
} | null
}
export interface OuterDepartmentDef extends BaseDef {
platform: platform,
dept_id: string,
dept_name: string,
parent_id: string,
order: string,
compKey: string,
department: {
_key: string,
name: string,
} | null
}
export interface CompanyMessageDef extends CompItemDef {
title: string,
content: string,
showStatus: string
}
export interface WxappmessageDef extends BaseDef {
userKeys: string[],
docCreator: string,
realUserKeys: any,
invaliduser?: string[],
unlicenseduser?: string[],
compKey: string,
appKey: string,
touser?: string,
toparty?: string,
msgtype: "text" | "textcard" | "markdown",
agentid: number,
text?: { context: string },
textcard?: {
title: string,
description: string,
url: string,
btntxt: string
},
markdown?: {
content: string
},
safe?: number,
enable_id_trans?: number,
enable_duplicate_check?: number,
duplicate_check_interval?: number
}
export interface SystemNotifyDef extends KeyItemDef {
msgType: "update" | "upload" | "function";
sendWay: string[];
sendTime: Date;
sendStatus: "0" | "1";
editor: string;
title: string;
abstract: string;
content: string;
}
export interface CompanyNotifyDef extends KeyItemDef {
compKey: string,
notifyKey: string;
viewUser: string;
}
\ No newline at end of file
This diff is collapsed.
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef } from "./commonTypes";
import { StepDef, RelationDef } from "./coreTypes";
import { FieldBaseDef } from "./coreTypes";
import { AttachmentBaseDef } from "./fileTypes";
import { AnchorType } from "./commonTypes";
import mongoose from "mongoose"
export type StepOperateType = "waiting" | "completed" | "rejected" | "reverted" | "other_completed" | "other_rejected" | "changed" | "add_task" | "pause" | "stoped";
export interface AppMessageDef extends BaseDef {
// 根据key判断task类型
taskKey: string;
// 保存变化较少的基础信息 start
dataName: string;
stepName: string;
// 保存变化较少的基础信息 end
userKey: string;
appKey: string;
view_status: "0" | "1";
is_valid: "0" | "1";
messageType: "FlowTask" | "FlowNotify" | "TabNotify";
}
export interface CommonPhrasesDef extends BaseDef {
userKey: string;
title: string;
opinion: string;
status: "0" | "1";
_type: "verify" | "reject";
}
export interface FlowInstDef extends BaseDef {
flow_stage: "started" | "completed" | "stoped" | "pause";
finishTime: Date;
stageSave: boolean;
flow_style: "default" | "form";
flow_operation: "create" | "update";
flowDefKey: string;
chart_name: string;
appKey: string;
// 所属人
owner: string;
// 所属人
creator: string;
modKey: string;
form: FieldBaseDef[];
dataId: mongoose.Types.ObjectId;
// 数据对象
dataObj: {
[propName: string]: any;
},
oldDataObj: {
[propName: string]: any;
},
taskData: {
[propName: string]: any;
},
dataName: string;
// 流程可见用户
usersAll: string[];
percentage: number;
// 所属步骤, 表示这个流程是一个子流程
ownerStep: mongoose.Types.ObjectId;
// 流程当前步骤
stepsNow: {
step: mongoose.Types.ObjectId;
users: string[];
usersAll: string[];
}[],
changeLog: [{
user: string;
action: "create" | "update";
updatedAt: Date;
changed: {
fieldKey: string;
oldDesc: string;
newDesc: string;
}[]
}],
pauseDate: Date[];
resetDate: Date[];
}
export interface FlowNotifyDef extends BaseDef, TaskNotifyDef {
}
export interface FlowTaskDef extends BaseDef, TaskNotifyDef {
// 转签或加签的流程审批,parent指向转签或加签的那个人
parentTask: mongoose.Types.ObjectId;
flowInstStage: string;
actionUpdateFlag: boolean;
}
export interface LabelDef extends BaseDef {
_key: string;
name: string;
compKey: string;
entityKey: string;
deptKey: string;
deptKeys: any[];
creator: string;
labelType: "user" | "entity";
labelStatus: "enable" | "disable";
}
export interface ReportInstDef extends BaseDef {
name: string;
reportKey: string;
formData: {
[propName: string]: any;
},
attachment: AttachmentBaseDef
}
export interface RelationInstDef {
_key: string;
relation_status: "0" | "1";
relation_type: "push" | "revert";
active_count: number;
priority: number;
target: mongoose.Types.ObjectId;
startAnchor: AnchorType;
endAnchor: AnchorType;
relation_def: RelationDef,
}
export interface StepInstDef extends BaseDef {
step_def: StepDef,
stepOrder: number;
step_status: "waiting" | "started" | "completed" | "rejected" | "reverted" | "pause" | "stoped";
appKey: string;
flow_inst: mongoose.Types.ObjectId;
modKey: string;
dataId: mongoose.Types.ObjectId;
stepData: {
[propName: string]: any;
},
active_count: number;
// 只用来做计算
beforeRelations: {
source: mongoose.Types.ObjectId;
relation_type: "push" | "revert";
}[];
relations: RelationInstDef[],
start_date: Date;
end_date: Date;
actionUpdateFlag: boolean
}
export interface TabNotifyDef extends BaseDef {
userKey: string;
appKey: string;
_key: string;
stepName: string;
modKey: string;
tabulationKey: string;
dataId: string;
operate_time: Date;
view_status: "0" | "1";
// 有些步骤可能已失效
is_valid: "0" | "1";
}
export interface TriggerLogDef extends BaseDef {
// 工作表及数据信息
appKey: string;
triggerKey: string;
triggerTime: Date;
// 用户操作
status: "fail" | "success";
log: string;
data: {
[propName: string]: any;
}
}
export interface TaskNotifyDef {
_key: string;
modKey: string;
dataId: mongoose.Types.ObjectId;
// 保存变化较少的基础信息 start
dataName: string;
flowOwner: string;
// 保存变化较少的基础信息 end
step_def: StepDef,
stepDefKey: string;
userKey: string;
prevUserKey: string;
appKey: string;
flow_inst: mongoose.Types.ObjectId;
step_active: number;
step_inst: mongoose.Types.ObjectId;
operate_time: Date;
view_status: "0" | "1";
// 有些步骤可能已失效
is_valid: "0" | "1";
step_operate: StepOperateType;
taskData: {
[propName: string]: any;
},
step_opinion: string;
}
type Merge<T> = {
[P in keyof T]: T[P]
}
/**
* 实现一种向接口添加新字段的类型
*/
type AppendToObject<T, U extends string, V> = Merge<
{ [P in keyof T]: T[P] } & { [P in U]: V }
>
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef, KeyItemDef, NameDef } from "./commonTypes";
import { AdvSearchDef, PermissionDef } from "./coreTypes";
import { EntityFieldDef } from "./modTypes";
import { ResData } from "./resourceTypes";
// --> TimeRiver.js
export interface DbEntityDef extends KeyItemDef, NameDef {
// 大部分都是outer数据,其他预留给其他公司下载应用用。
entityType: "normal" | "inner" | "dataFactory";
sourceType: "self" | "outer";
outerSourceKey: "custom" | "ppp";
ownerCompany: string;
dbAppKey: string;
ownerEntity: string;
form: EntityFieldDef[];
groups: GroupItemDef[];
}
export interface DbPackageDef extends KeyItemDef, NameDef {
// 控制哪些公司有权限
companies: {
_key: string;
}[];
// 拥有者公司
ownerCompany: string;
dbAppKey: string;
defaultExpireDays: number;
entityRules: {
dbEntityKey: string;
fieldRules: PermissionDef[];
advSearch: AdvSearchDef;
}[];
}
export interface DbResourceDef extends KeyItemDef, NameDef {
ownerCompany: string;
resType: "dropdown" | "tree";
dbAppKey: string;
resData: ResData[];
maxLevel: number;
sourceType: "self" | "outer"
}
export interface DbAppDef extends KeyItemDef, NameDef {
ownerCompany: string;
name: string;
description: string;
dbPackageKey: string;
appType: "normal" | "data";
appScene: "invest" | "project" | "oa" | "accounting" | "sales" | "manufacturing" | "purchase" | "store" | ""
dataScene: "industry" | "public" | "finance" | "research" | "society" | ""
version: string;
appItems: any;
active: "0" | "1";
is_exists: boolean;
introduction: string;
owner: string;
validity: number;
dbEntitys: string[];
dbResources: string[];
downloadNum: number;
visibleCompKeys: string[];
maxQuery: number;
integral: number;
extendDuration: number;
durationIntegral: number;
appImages: any[];
updateFrequency: string;
dataVolume: string;
}
export interface DbPurchaseDef extends BaseDef {
ownerCompany: string;
purchaseCompany: string;
purchaseDate: Date;
expireDate: Date;
dbPackageKey: string;
dbAppKey: string;
appType: "normal" | "data";
purchaseUser: string;
delayStartDate: Date;
amount: number;
delayUser: string;
is_active: boolean;
remarks: string;
maxQuery: number;
handleType: string;
}
export interface GroupItemDef {
_key: string;
name: string;
children: GroupItemDef[];
}
export interface DbAppItemDef extends KeyItemDef, NameDef {
dbAppKey: string;
coreKey: string;
schemaType: "Mod" | "DashBoard" | "InnerChart" | "InnerTable" | "Tabulation" | "FlowDef" | "AppRole" | "EmbedPage";
config: any;
}
export interface DbAppRecordDef extends KeyItemDef {
dbAppKey: string;
owner: string;
version: string;
}
export interface DbRequestDef extends BaseDef {
contact: string;
detail: string;
compKey: string;
compName: string;
industry: "government" | "construction" | "retail" | "manufacture" | "internet" | "rent" | "architecture" | "education" | "realestate" | "traffic" | "farmer" | "catering" | "culture" | "public" | "mining" | "energy" | "medical" | "other" | ""
}
export interface QueryRecordDef extends BaseDef {
compKey: string;
useCompKey: string;
dbAppKey: string;
entityKey: string;
serviceTime: Date;
count: number;
queryType: "index" | "all" | "groupData"
}
export interface IntegralDef extends KeyItemDef {
compKey: string;
sourceCompKey: string;
dealIntegral: number;
residueIntegral: number;
changeType: "init" | "share" | "deal" | "delay";
dbAppKey: string;
is_active: boolean;
}
export interface VisitRecordDef extends BaseDef {
visitCompany: string;
dbAppKey: string;
visitTime: Date;
visitUser: string;
content: string;
}
This diff is collapsed.
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef } from './commonTypes'
export interface AttachmentBaseDef extends BaseDef {
name: string;
mimetype: string;
path: string;
size: number;
url: string;
downloadUrl: string;
bucket: string;
}
export interface AttachmentDef extends AttachmentBaseDef {
imgWidth: number;
imgHeight: number;
groupKey: string;
archiveKey: string;
fileType: string;
userKey: string;
storageStatus: string;
}
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef } from "./commonTypes";
export interface ExcelData{
rows: any[];
fileName: string;
"!merges"?: any[];
}
export interface ImportExcelJobDef extends BaseDef {
_id: string,
compKey: string,
appKey?: string,
modKey?: string,
entityKey: string,
screenKey?: string,
total: number,
suc: number,
fai: number,
status: "check" | "import" | "over" | "check-fai" | "fai",
faiMsg?: string
}
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef } from "./commonTypes";
import mongoose from "mongoose"
export interface CustomLogDef extends BaseDef {
// 工作表及数据信息
appKey: string;
modKey: string;
oid: mongoose.Types.ObjectId;
// 用户信息
user: string;
// 用户操作
action: "create" | "update" | "delete";
data: string;
changed: {
fieldKey: string;
oldDesc: string;
newDesc: string;
}[];
deleted: boolean;
dataName: string;
}
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef, CompItemDef } from './commonTypes'
import { ResData } from './resourceTypes';
import { OrderDef } from './commonTypes';
export interface GroupItem {
_key: string;
name: string;
children: GroupItem[];
}
export interface EntityFieldDef {
_key: string;
_type: string;
_name: string;
_dbRequired: boolean;
_unique: boolean;
_description?: string;
_filterField?: string;
_chartInvisible?: boolean;
_entityKey?: string;
_resourceKey?: string;
_dbGroup?: string;
_dateType?: "date" | "year" | "month" | "datetime" | "time";
_textType?: "default" | "url";
_data?: ResData[];
_subForm?: EntityFieldDef[];
}
export interface EntityDef extends CompItemDef {
entityType: "normal" | "inner" | "dataFactory";
sourceType: "self" | "outer";
ownerAppKeys: string[];
enCoding: string;
form: EntityFieldDef[];
indexes: {
name: string,
fields: {
fieldKey: string;
indexType: "asc" | "desc" | "text" | "2dsphere" | "hashed"
}[]
}[],
groups: GroupItem[];
itemGroupKey: string;
version: number;
addIdFlag?: boolean
}
interface FieldChangeDef {
_key: string;
_name: string;
_required: boolean; // 是否必填
_type: string; // 字段类型
_index: boolean; // 是否索引
}
export interface EntityVersionDef extends BaseDef {
order: number;
compKey: string;
entityKey: string;
user: string;
newFields: FieldChangeDef[];
deletedFields: FieldChangeDef[];
}
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef } from "./commonTypes";
import mongoose from "mongoose"
export interface TaskCountDef {
taskCount: {
allCount: number;
task: number;
notify: number;
tabNotify: number;
}
}
export interface CountMsgDef {
count: TaskCountDef,
userKey: string,
messageType: string
}
export interface ShareLogDef extends BaseDef {
compKey: string,
appKey: string,
modKey: string,
screenKey: string,
dashboardKey: string,
chartKey: string,
dataId: mongoose.Types.ObjectId,
name: string,
shareLink: string,
status: "0" | "1",
detailType: "show" | "edit" | "create",
sharer: string,
pageType: string,
expireAt: Date,
fromShareUser: boolean,
formDataStr: string,
iconId: mongoose.Types.ObjectId,
}
export interface SocketOption {
onData: (...args: any) => any,
onError: (...args: any) => any,
onEnd: (...args: any) => any,
event: string,
}
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { CompItemDef } from './commonTypes'
export interface ResData {
_key: string;
name: string;
description: string;
color: string;
level: number;
children: ResData[];
}
export interface ResourceDef extends CompItemDef {
resType: "dropdown" | "tree";
resData: ResData[];
maxLevel: number;
sourceType: "self" | "outer";
ownerAppKeys: string[];
}
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef } from "./commonTypes";
// --> Region.js
// 使用share的定义
// --> SendLog.js
export interface SendLogDef extends BaseDef {
_key: string;
groupKey: string;
msgType: "mail" | "sms";
sendResult: string;
receiver: string;
content: string;
user: string;
}
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef, CascaderDef } from "./commonTypes";
// --> Calendar.js
export interface CalendarDef extends BaseDef {
year: number;
month: number;
date: number;
yearweek: number; // 第几周
yearday: number; // 第几天
week: number; // 星期几
workday: "1" | "2";
}
// --> Region.js
export interface RegionDef extends BaseDef, CascaderDef {
oid: number;
longitude: number;
latitude: number;
}
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { KeyItemDef } from "./commonTypes";
// --> TimeRiver.js
export interface TimeRiverDef extends KeyItemDef {
userKey: string;
nextTrigger: Date | null;
lastTrigger: Date | null;
// companyId__appId
groupKey: string;
remoteHost: string;
remotePath: string;
remoteParams: {
[propName: string]: any;
},
cycleType: "once" | "cycle";
cycleLength: number;
cycleUnit: "sec" | "hour" | "day" | "month" | "year";
status: "wait" | "done";
}
\ No newline at end of file
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import config from 'config';
import log4js from 'log4js';
const logger = log4js.getLogger('cloudEnv');
let finalDbConfig: any = null;
let finalRedisConfig: any = null;
let RemoteRedisConfig: any = null;
let RemoteJobRedisConfig: any = null;
function getFinalDBConfig() {
if (finalDbConfig) {
return finalDbConfig;
}
finalDbConfig = config.get("dbConfig");
finalDbConfig = JSON.parse(JSON.stringify(finalDbConfig));
// finalDbConfig = {
// ...config.get("dbConfig")
// }
return finalDbConfig;
}
function getFinalRedisConfig() {
if (finalRedisConfig) {
return finalRedisConfig;
}
finalRedisConfig = config.get("redisConfig");
return finalRedisConfig;
}
function getRemoteRedisConfig() {
if (RemoteRedisConfig) {
return RemoteRedisConfig;
}
RemoteRedisConfig = config.get("remoteRedisConfig");
return RemoteRedisConfig;
}
function getRemoteJobRedisConfig() {
if (RemoteJobRedisConfig) {
return RemoteJobRedisConfig;
}
RemoteJobRedisConfig = config.get("remoteJobRedisConfig");
return RemoteJobRedisConfig;
}
export default {
getFinalDBConfig,
getFinalRedisConfig,
getRemoteRedisConfig,
getRemoteJobRedisConfig
};
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import gvar from '../../gvar';
import fs from 'fs'
import path from 'path'
let controllers: { [key: string]: any } = {};
function retrieveControllers(dir: string) {
fs.readdirSync(dir).forEach(file => {
if (fs.statSync(path.join(dir, file)).isDirectory()) {
retrieveControllers(path.join(dir, file));
} else {
let fileSplit: string[] = file.split(".");
if (fileSplit.length > 1) {
let fileName = fileSplit[0];
let extend = fileSplit[fileSplit.length - 1];
if (extend !== "map") {
import(path.join(dir, file)).then((x) => {
controllers[fileName] = x["default"];
});
}
}
}
});
}
retrieveControllers(path.join(gvar.appDir, "api/controllers"));
function getController(modName: string, params: any = {}): any {
return new controllers[modName + "Controller"](params);
}
let managers: { [key: string]: any } = {};
function retrieveManagers(dir: string) {
fs.readdirSync(dir).forEach(file => {
if (fs.statSync(path.join(dir, file)).isDirectory()) {
retrieveManagers(path.join(dir, file));
} else {
let fileSplit: string[] = file.split(".");
let fileName = fileSplit[0];
let extend = fileSplit[fileSplit.length - 1];
if (extend !== "map") {
import(path.join(dir, file)).then((x) => {
if (x[fileName + "Inst"] != null) {
managers[fileName] = x[fileName + "Inst"];
}
else if (x["get" + fileName + "Inst"] != null) {
managers["get" + fileName] = x["get" + fileName + "Inst"];
}
});
}
}
});
}
retrieveManagers(path.join(gvar.appDir, "api/managers"));
function getManager(ManagerName: string): any {
return managers[ManagerName + "Manager"];
}
export default {
getController,
getManager
}
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import EventEmitter from "events";
class MyEventEmitter extends EventEmitter { }
const eventBus = new MyEventEmitter();
export default eventBus;
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import jwt from 'jsonwebtoken';
const Token = {
encrypt: function (data: any, time: any) { // data加密数据,time过期时间
return jwt.sign(data, "bridata-apaas", { expiresIn: time });
},
decrypt: function (token: any) {
try {
let data = jwt.verify(token, "bridata-apaas");
return {
isValid: true,
data: data
};
} catch (e) {
return {
isValid: false,
data: e
};
}
}
};
export default Token;
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import mongoose from 'mongoose'
import cloudEnv from '../cloudEnv';
import tools from '../tools'
import log4js from 'log4js';
const logger = log4js.getLogger('mongo');
const dbConfig = cloudEnv.getFinalDBConfig();
let { connectStr, connectOption } = tools.getConnectionData(dbConfig)
let dbCore = mongoose.createConnection(
connectStr,
connectOption
);
dbCore.on("error", logger.error.bind(console, "connection error:"));
dbCore.once("open", function () {
// we're connected!
logger.info("======== mongo:", cloudEnv.getFinalDBConfig());
});
export default {
dbCore
};
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import _ from 'lodash'
import tools from '../tools'
import moment from 'moment'
let schemaDefaultOption: any = {
versionKey: false,
timestamps: true,
minimize: false,
toJSON: {
virtuals: true,
getters: true,
transform: function (doc: any, ret: any) {
delete ret["password"];
delete ret["salt"];
delete ret["__v"];
let sma = doc.schema;
// 处理创建时间和修改时间
// ret["createdAt"] = moment(ret["createdAt"]).format("YYYY-MM-DD HH:mm:ss");
// ret["updatedAt"] = moment(ret["updatedAt"]).format("YYYY-MM-DD HH:mm:ss");
// 下拉类型加上__t_n
_.forOwn(sma.obj, function (value, field) {
// 处理日期字段, createdAt, updatedAt
if (value.type == Date && !value.customized) {
if (typeof value.timeFormat == "string") {
ret[field] = ret[field] ? moment(ret[field]).format(value.timeFormat) : ret[field];
} else if (typeof value.timeFormat == "function") {
ret[field] = value.timeFormat(ret[field]);
} else {
ret[field] = ret[field] ? moment(ret[field]).format("YYYY-MM-DD HH:mm:ss") : ret[field];
}
}
// 二级字段的下拉
if (_.isObject(value) && !_.isArray(value)) {
_.forOwn(value, function (v: any, f: any) {
// 处理下拉类型
if (v && _.isArray(v.types) && ret[field] !== undefined && ret[field][f] !== undefined) {
// 下拉类型
ret[field][`${f}__t_n`] = tools.getEnumFriendlyName(v.types, ret[field][f]);
}
});
}
// 控件组合的下拉
if (_.isArray(value.type) && _.isArray(doc[field])) {
_.forOwn(value.type[0], function (v, f) {
// 处理下拉类型
if (v && _.isArray(v.types) && ret[field] !== undefined) {
// 下拉类型
for (let compoObj of ret[field]) {
compoObj[`${f}__t_n`] = tools.getEnumFriendlyName(v.types, compoObj[f]);
}
}
});
}
// 处理下拉类型
if (_.isArray(value.types) && ret[field] !== undefined) {
// 下拉类型
ret[field + "__t_n"] = tools.getEnumFriendlyName(value.types, ret[field]);
}
if (value.ref && ret[field] !== undefined) {
ret[field + "__t_n"] = ret[field] && ret[field].full_name || ret[field] && ret[field].name || "";
}
});
}
},
toObject: {
virtuals: true,
getters: true
},
id: false
};
let modelDefaultMethods: any = {
};
export {
schemaDefaultOption,
modelDefaultMethods
}
import jwtlib from './jwtlib';
import api_util from '../util/api_util';
import remoteEnv from './remoteEnv';
import axios from 'axios';
// 中间件
let mw: { [key: string]: any } = {
// 获取用户的登录信息
userInfo: async function (req: any, res: any, next: any) {
let authtokenStr = req.headers.authtoken || req.body.authtoken;
// 判断authtoken有效
if (authtokenStr) {
if (authtokenStr.slice(0, 4) == "jwt:") {
let authtoken = authtokenStr.slice(4, authtokenStr.length)
let r = jwtlib.decrypt(authtoken)
if (r.isValid) {
let user: any = r.data;
user.JWTLogin = true;
req.login(user, function (err: Error) {
if (err) {
throw (err);
}
});
}
}
else {
// 直接从compredis中读,此方法不会刷新登录时间
// let authtoken = authtokenStr;
// let compRedis = await remoteEnv.getRemoteRedisClient("comp");
// let obj = await compRedis.get(`${tools.getServiceCachePrefix("comp")}_${tools.getCompLoginCacheKey(authtoken)}`);
// if (obj) {
// let user = JSON.parse(obj);
// req.login(user, function (err: Error) {
// if (err) {
// throw (err);
// }
// });
// }
// 往comp发接口
let authtoken = authtokenStr;
let compRemoteConfig = await remoteEnv.getRemoteConfigByKey("comp");
let headers = {
authtoken
}
let result = await axios.post(compRemoteConfig.host + compRemoteConfig.checkLoginPath, {}, { headers });
if (result.data.res == 0) {
let user = result.data.data;
user.JWTLogin = false;
req.login(user, function (err: Error) {
if (err) {
throw (err);
}
// next();
});
}
}
}
next();
},
// 权限控制中间件,登录用户
loginRequired: async function (req: any, res: any, next: any) {
if (!req.user) {
return res.json({ ...api_util.NotLoginResponse, msg: "没有登录!" });
}
next();
},
jwtLoginRequired: async function (req: any, res: any, next: any) {
if (!req.user) {
return res.json({ ...api_util.NotLoginResponse, msg: "没有登录!" });
}
if (!req.user.JWTLogin) {
return res.json({ ...api_util.NoAuthResponse, msg: "没有权限" });
}
next();
}
};
export default mw;
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import cloudEnv from './cloudEnv';
import log4js from 'log4js';
import Redis, {Cluster} from 'ioredis';
const logger = log4js.getLogger('redis');
function createRedis(redisConfig: any): Redis | Cluster {
let redis: Redis | Cluster;
if(redisConfig.isCluster) {
redis = new Redis.Cluster(redisConfig.clusterConfig);
}
else {
redis = new Redis(redisConfig);
}
return redis
}
let finalRedisConfig = cloudEnv.getFinalRedisConfig();
let remoteRedisConfig = cloudEnv.getRemoteRedisConfig();
const redis = createRedis(finalRedisConfig);
redis.on("error", function (err) {
logger.error("Redis error " + err);
});
redis.on("connect", function () {
logger.info("======== redis:", cloudEnv.getFinalRedisConfig());
});
let remoteRedis = createRedis(remoteRedisConfig);
remoteRedis.on("error", function (err) {
logger.error("Remote error " + err);
});
remoteRedis.on("connect", function () {
logger.info("======== remote:", cloudEnv.getRemoteRedisConfig());
});
let subRedis = createRedis(remoteRedisConfig);
subRedis.on("error", function (err) {
logger.error("Sub error " + err);
});
export {
redis,
remoteRedis,
subRedis
};
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { remoteRedis, subRedis } from './redis'
import asyncRedis from 'async-redis';
import log4js from "log4js";
import { DbInfo } from '../def/base/commonTypes';
const logger = log4js.getLogger("remoteEnv");
let remoteConfig: any = null;
async function initRemoteConfig() {
if (remoteConfig != null) {
return remoteConfig;
}
let configStr = await remoteRedis.get("proxy:remoteHostConfig");
if (configStr) {
remoteConfig = JSON.parse(configStr);
return remoteConfig
} else {
throw new Error("需要先启动proxy");
}
}
async function getRemoteConfigByKey(remoteKey: string) {
await initRemoteConfig();
remoteKey = remoteKey.toLowerCase()
return remoteConfig[remoteKey + "RemoteConfig"];
}
async function getRedisConfigByKey(remoteKey: string) {
await initRemoteConfig();
remoteKey = remoteKey.toLowerCase()
return remoteConfig[remoteKey + "RedisConfig"];
}
let remoteRedisMap: {[key: string]: any } = {}
async function getRemoteRedisClient(remoteKey: string): Promise<any> {
if (remoteRedisMap[remoteKey]) {
return remoteRedisMap[remoteKey];
}
let remoteRedisConfig = await getRedisConfigByKey(remoteKey)
remoteRedisMap[remoteKey] = asyncRedis.createClient(remoteRedisConfig);
return remoteRedisMap[remoteKey];
}
async function getDbInfo(compKey: string): Promise<DbInfo> {
let customRemoteConfig = await getRemoteConfigByKey("custom");
let dbinfo: any;
// localSetting改成只控制数据库
if (customRemoteConfig.localSetting){
dbinfo = {
...customRemoteConfig.db,
dbName: compKey,
dbId: compKey
};
// 用于从配置文件中设置不同的数据库
if( customRemoteConfig.dbMap && customRemoteConfig.dbMap[compKey] ){
dbinfo = {
...customRemoteConfig.dbMap[compKey],
dbName: compKey,
dbId: compKey
};
}
}
else {
throw new Error("DbInfo is null!");
}
return dbinfo
}
subRedis.on("message", function (channel, message) {
if (channel == "updateRemoteHostConfig") {
try {
remoteConfig = JSON.parse(message);
} catch (err) {
logger.error(err);
}
}
});
subRedis.subscribe("updateRemoteHostConfig");
export default {
getRemoteConfigByKey,
getRedisConfigByKey,
getRemoteRedisClient,
getDbInfo
};
\ No newline at end of file
This diff is collapsed.
import BaseExample from '../models/BaseExample';
import { BaseExampleDef } from '../def/base/basisTypes';
import IdItemManager from './base/IdItemManager';
class BaseExampleManager extends IdItemManager<BaseExampleDef> {
}
let BaseExampleManagerInst: BaseExampleManager = new BaseExampleManager(BaseExample)
export {
BaseExampleManager,
BaseExampleManagerInst
};
\ No newline at end of file
import { BaseDef } from "../def/base/commonTypes";
import { AbstractManager, IndexParam, UniqueSearchParam } from "./base/CommonManager";
import mysql from "mysql2/promise";
class ModDataManager implements AbstractManager<any> {
constructor(public conn: mysql.Connection, public table: string, public params: any) {
}
mCreate(params: any): Promise<any> {
let sqlstr = this.conn.format("insert into ?? set ?", [this.table, params]);
let result = this.conn.query(sqlstr);
return result;
}
mIndex(params: IndexParam): Promise<{ total: number; list: any[]; }> {
throw new Error("Method not implemented.");
}
mUpdate(params: any): Promise<any> {
throw new Error("Method not implemented.");
}
mDelete(objP: UniqueSearchParam): Promise<any> {
throw new Error("Method not implemented.");
}
mGet(objP: UniqueSearchParam): Promise<any> {
throw new Error("Method not implemented.");
}
mCount(search: any, limit?: number | undefined): Promise<number> {
throw new Error("Method not implemented.");
}
mSave(params: any): Promise<any> {
throw new Error("Method not implemented.");
}
mInsertMany(objs: any[]): Promise<any[]> {
throw new Error("Method not implemented.");
}
mNativeFind(search: any, fields?: string[] | undefined, opts?: { [key: string]: any; } | undefined): Promise<any[]> {
throw new Error("Method not implemented.");
}
mFindOne(search: any): Promise<any> {
throw new Error("Method not implemented.");
}
mUpdateMany(search: any, updateParams: any, fields?: string[] | undefined, returnEmpty?: boolean | undefined): Promise<any[]> {
throw new Error("Method not implemented.");
}
mDeleteMany(search: any, fields?: string[] | undefined, returnEmpty?: boolean | undefined): Promise<any[]> {
throw new Error("Method not implemented.");
}
mSoftDelete(objP: UniqueSearchParam): Promise<any> {
throw new Error("Method not implemented.");
}
mSoftDeleteMany(search: any, fields?: string[] | undefined, returnEmpty?: boolean | undefined): Promise<any[]> {
throw new Error("Method not implemented.");
}
mTypes(): Promise<any> {
throw new Error("Method not implemented.");
}
mAggregate(list: any[], option?: any): Promise<any[]> {
throw new Error("Method not implemented.");
}
}
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import OrderManager from "./OrderManager";
import { AppItemDef } from '../../def/base/commonTypes';
import tools from '../../lib/tools';
import config from 'config';
import { UniqueSearchParam } from './CommonManager';
class AppItemManager<T extends AppItemDef> extends OrderManager<T> {
addInitParam(initParam: any) {
let newKey = tools.generateKey(this.modelName);
initParam._key = initParam._key ? initParam._key : newKey;
super.addInitParam(initParam);
}
async mGetByAppKey(compKey: string, appKey: string, key: string): Promise<T | null> {
return await this.mGet(
{
compKey: compKey,
appKey: appKey,
_key: key
}
)
}
getUniqueSearch(objP: UniqueSearchParam) {
return {
compKey: objP.compKey,
appKey: objP.appKey,
_key: objP._key
}
}
getCacheKey(obj: UniqueSearchParam): string {
return config.get("serviceKey") + "_" + tools.getAppItemCacheKey(this.modelName, obj.compKey, obj.appKey, obj._key);
}
}
export default AppItemManager;
This diff is collapsed.
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef, DbInfo } from '../../def/base/commonTypes'
import mongoose from 'mongoose';
export interface HintItem {
fieldKey: string;
hintOrder: number;
}
export interface Pagination {
page: number;
pagesize: number;
start?: number;
}
export interface IndexParam {
fields?: Array<string>;
pagination?: Pagination
search?: any;
sort?: string | string[];
indexHints?: HintItem[]; // 明树云格式
countLimit?: number;
hint?: { [key: string]: number }; // mongo支持格式
metaInfo?: {
isCustomSearch: boolean;
isExport: boolean;
dbAppKey: string;
maxExportNum?: string;
filename?: string;
}
}
export interface UniqueSearchParam {
_id?: mongoose.Types.ObjectId | string | number;
_key?: string;
compKey?: string;
appKey?: string;
}
export type RemoteKey = 'comp' | 'core' | 'mod' | 'resource' | 'file' | 'share' | 'sender' | 'admin' | 'help' | 'ticker' | 'custom' | 'job' | 'log' | 'proxy' | 'dstore' | 'calculator' | 'ppp' | 'cgpt';
export interface RemoteParam {
user: any;
modelName: string;
remoteKey: RemoteKey;
}
export interface CompRemoteParam extends RemoteParam {
compKey: string;
}
export interface AppRemoteParam extends RemoteParam {
compKey: string;
appKey: string;
}
export interface DynamicRemoteParam extends RemoteParam {
compKey: string;
entityKey: string;
}
export abstract class AbstractManager<T extends BaseDef> {
abstract mCreate(params: any): Promise<T>;
abstract mIndex(params: IndexParam): Promise<{ total: number; list: (T)[] }>;
abstract mUpdate(params: any): Promise<T>;
abstract mDelete(objP: UniqueSearchParam): Promise<T | null>;
abstract mGet(objP: UniqueSearchParam): Promise<T | null>;
abstract mCount(search: any, limit?: number): Promise<number>;
abstract mSave(params: any): Promise<T>;
abstract mInsertMany(objs: any[]): Promise<T[]>;
abstract mNativeFind(search: any, fields?: string[], opts?: { [key: string]: any }): Promise<T[]>;
abstract mFindOne(search: any): Promise<T | null>;
abstract mUpdateMany(search: any, updateParams: any, fields?: string[], returnEmpty?: boolean): Promise<T[]>;
abstract mDeleteMany(search: any, fields?: string[], returnEmpty?: boolean): Promise<T[]>;
abstract mSoftDelete(objP: UniqueSearchParam): Promise<T>;
abstract mSoftDeleteMany(search: any, fields?: string[], returnEmpty?: boolean): Promise<T[]>;
abstract mTypes(): Promise<any>;
abstract mAggregate(list: any[], option?: any): Promise<any[]>;
}
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import OrderManager from "./OrderManager";
import { CompItemDef } from '../../def/base/commonTypes';
import tools from '../../lib/tools';
import config from 'config';
import { UniqueSearchParam } from './CommonManager';
class CompItemManager<T extends CompItemDef> extends OrderManager<T> {
addInitParam(initParam: any) {
let newKey = tools.generateKey(this.modelName);
initParam._key = initParam._key ? initParam._key : newKey;
super.addInitParam(initParam);
}
async mGetByCompKey(compKey: string, key: string): Promise<T | null> {
return await this.mGet(
{
compKey: compKey,
_key: key
}
)
}
getUniqueSearch(objP: UniqueSearchParam) {
return {
compKey: objP.compKey,
_key: objP._key
}
}
getCacheKey(obj: UniqueSearchParam): string {
return config.get("serviceKey") + "_" + tools.getCompItemCacheKey(this.modelName, obj.compKey, obj._key);
}
}
export default CompItemManager;
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import { BaseDef } from '../../def/base/commonTypes';
import tools from '../../lib/tools';
import mongoose from 'mongoose';
import { UniqueSearchParam } from './CommonManager';
import BaseManager from "./BaseManager";
import config from 'config';
class IdItemManager<T extends BaseDef> extends BaseManager<T> {
constructor(mod: mongoose.Model<T>, params: any = {}) {
super(mod, params)
this.cacheSecs = params.cacheSecs != undefined ? params.cacheSecs : 0
}
getUniqueSearch(objP: UniqueSearchParam): any {
return {
_id: objP._id
}
}
getCacheKey(obj: UniqueSearchParam): string {
return config.get("serviceKey") + "_" + tools.getIdItemCacheKey(this.modelName, obj);
}
////////////////////////////////////////////////////////
// for populate
////////////////////////////////////////////////////////
async mFindByIdsWithNull(idList: mongoose.Types.ObjectId[], fields: Array<string> = []): Promise<(T | null)[]> {
let popIdxs = [];
let popObjIds: any[] = [];
let idStringIdxMap: any = {};
let dbSearchFields = fields || [];
// 增加一个全部为空的数组
let objList: (T | null)[] = idList.map(x => null);
for (let idx = 0; idx < idList.length; idx++) {
let objId = idList[idx];
if (!objId) {
continue;
}
popIdxs.push(idx);
popObjIds.push(objId);
idStringIdxMap[tools.getIdString(objId)] = idx;
}
if (popIdxs.length > 0) {
let dbObjs = await this.mod.find({ _id: { "$in": popObjIds } }, dbSearchFields);
for (let dbObj of dbObjs) {
let obj = this.serialize(dbObj);
let popIdx = idStringIdxMap[tools.getIdString(obj)];
objList[popIdx] = obj;
}
}
return objList;
}
async mFindMapByIds(idList: mongoose.Types.ObjectId[], fields: Array<string> = []): Promise<{ [key: string]: T }> {
let objListWithNull = await this.mFindByIdsWithNull(idList, fields);
let returnMap: any = {};
for (let obj of objListWithNull) {
if (obj) {
returnMap[tools.getIdString(obj)] = obj;
}
}
return returnMap;
}
}
export default IdItemManager;
This diff is collapsed.
////////////////////////////////////////////////////////
//
// 重要 !!!!!!!!!!!!!!!!!!!!
//
// 核心模块代码, 请到ts_basis项目中修改提交
//
////////////////////////////////////////////////////////
import BaseManager from './BaseManager';
import { OrderDef } from '../../def/base/commonTypes';
import mongoose from 'mongoose';
abstract class OrderManager<T extends OrderDef> extends BaseManager<T> {
constructor(mod: mongoose.Model<T>, params: any = {}) {
super(mod, params)
this.defaultSort = params.defaultSort || ["order"]
}
addInitParam(initParam: any) {
initParam.order = initParam.order ? initParam.order : Math.round(new Date().valueOf()) * 1000;
super.addInitParam(initParam);
}
}
export default OrderManager;
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment