From afb82751f1209e0973f3a3103024601a908cce6c Mon Sep 17 00:00:00 2001 From: COOL Date: Wed, 22 Jan 2025 18:07:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96CoolController=E6=96=B0?= =?UTF-8?q?=E5=A2=9EserviceApis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/config.default.ts | 2 +- src/modules/base/config.ts | 2 +- src/modules/base/db/tenant.ts | 4 ++- src/modules/base/middleware/authority.ts | 1 + src/modules/base/service/translate.ts | 5 +++- src/modules/demo/controller/admin/tenant.ts | 23 ++++++++++++++++ src/modules/demo/controller/open/tenant.ts | 10 +++++-- src/modules/demo/service/tenant.ts | 30 ++++++++++++++++++--- src/modules/user/controller/admin/info.ts | 4 +-- 9 files changed, 69 insertions(+), 12 deletions(-) create mode 100644 src/modules/demo/controller/admin/tenant.ts diff --git a/src/config/config.default.ts b/src/config/config.default.ts index a2e4ad4..fff81c3 100644 --- a/src/config/config.default.ts +++ b/src/config/config.default.ts @@ -68,7 +68,7 @@ export default { // 是否开启多租户 tenant: { // 是否开启多租户 - enable: false, + enable: true, // 需要过滤多租户的url, 支持通配符, 如/admin/**/* 表示admin模块下的所有接口都进行多租户过滤 urls: [], }, diff --git a/src/modules/base/config.ts b/src/modules/base/config.ts index 259caa4..3eba883 100644 --- a/src/modules/base/config.ts +++ b/src/modules/base/config.ts @@ -16,7 +16,7 @@ export default () => { globalMiddlewares: [ BaseTranslateMiddleware, BaseAuthorityMiddleware, - BaseLogMiddleware, + // BaseLogMiddleware, ], // 模块加载顺序,默认为0,值越大越优先加载 order: 10, diff --git a/src/modules/base/db/tenant.ts b/src/modules/base/db/tenant.ts index a8f3b09..d004f34 100644 --- a/src/modules/base/db/tenant.ts +++ b/src/modules/base/db/tenant.ts @@ -116,7 +116,9 @@ export class TenantSubscriber implements EntitySubscriberInterface { if (!this.tenant.enable) return; const tenantId = this.getTenantId(); if (tenantId) { - queryBuilder.where('tenantId = :tenantId', { tenantId }); + queryBuilder.where(`${queryBuilder.alias}.tenantId = :tenantId`, { + tenantId, + }); } } diff --git a/src/modules/base/middleware/authority.ts b/src/modules/base/middleware/authority.ts index 0ffd4db..6ed39ee 100644 --- a/src/modules/base/middleware/authority.ts +++ b/src/modules/base/middleware/authority.ts @@ -55,6 +55,7 @@ export class BaseAuthorityMiddleware if (_.startsWith(url, adminUrl)) { try { ctx.admin = jwt.verify(token, this.jwtConfig.jwt.secret); + ctx.admin.tenantId = 1; if (ctx.admin.isRefresh) { ctx.status = 401; throw new CoolCommException('登录失效~'); diff --git a/src/modules/base/service/translate.ts b/src/modules/base/service/translate.ts index b8cda57..9ef1341 100644 --- a/src/modules/base/service/translate.ts +++ b/src/modules/base/service/translate.ts @@ -78,6 +78,9 @@ export class BaseTranslateService { * 加载翻译文件到内存 */ async loadTranslations() { + if (!(this.config?.enable && this.app.getEnv() == 'local')) { + return; + } if (!this.basePath) { this.basePath = path.join(this.app.getBaseDir(), '..', 'src', 'locales'); } @@ -195,7 +198,7 @@ export class BaseTranslateService { * 检查翻译 */ async check() { - if (this.config?.enable) { + if (this.config?.enable && this.app.getEnv() == 'local') { this.basePath = path.join(this.app.getBaseDir(), '..', 'src', 'locales'); const menuLockExists = this.checkLockFile('menu'); diff --git a/src/modules/demo/controller/admin/tenant.ts b/src/modules/demo/controller/admin/tenant.ts new file mode 100644 index 0000000..31fdc9f --- /dev/null +++ b/src/modules/demo/controller/admin/tenant.ts @@ -0,0 +1,23 @@ +import { CoolController, BaseController } from '@cool-midway/core'; +import { DemoGoodsEntity } from '../../entity/goods'; +import { DemoTenantService } from '../../service/tenant'; + +/** + * 多租户 + */ +@CoolController({ + serviceApis: [ + 'use', + { + method: 'noUse', + summary: '不使用多租户', + }, + { + method: 'noTenant', + summary: '局部不使用多租户', + }, + ], + entity: DemoGoodsEntity, + service: DemoTenantService, +}) +export class AdminDemoTenantController extends BaseController {} diff --git a/src/modules/demo/controller/open/tenant.ts b/src/modules/demo/controller/open/tenant.ts index b9dc126..375b639 100644 --- a/src/modules/demo/controller/open/tenant.ts +++ b/src/modules/demo/controller/open/tenant.ts @@ -1,7 +1,13 @@ import { CoolController, BaseController } from '@cool-midway/core'; +import { DemoGoodsEntity } from '../../entity/goods'; +import { DemoTenantService } from '../../service/tenant'; /** * 多租户 */ -@CoolController({}) -export class DemoTenantController extends BaseController {} +@CoolController({ + api: [], + entity: DemoGoodsEntity, + service: DemoTenantService, +}) +export class OpenDemoTenantController extends BaseController {} diff --git a/src/modules/demo/service/tenant.ts b/src/modules/demo/service/tenant.ts index c1f165a..abb76b4 100644 --- a/src/modules/demo/service/tenant.ts +++ b/src/modules/demo/service/tenant.ts @@ -1,8 +1,10 @@ -import { Provide } from '@midwayjs/core'; +import { Inject, Provide } from '@midwayjs/core'; import { BaseService } from '@cool-midway/core'; import { InjectEntityModel } from '@midwayjs/typeorm'; import { Repository } from 'typeorm'; import { DemoGoodsEntity } from '../entity/goods'; +import { UserInfoEntity } from '../../user/entity/info'; +import { noTenant } from '../../base/db/tenant'; /** * 商品服务 @@ -12,18 +14,38 @@ export class DemoTenantService extends BaseService { @InjectEntityModel(DemoGoodsEntity) demoGoodsEntity: Repository; + @Inject() + ctx; + /** * 使用多租户 */ - async use() {} + async use() { + await this.demoGoodsEntity.createQueryBuilder().getMany(); + await this.demoGoodsEntity.find(); + } /** * 不使用多租户(局部不使用) */ - async noUse() {} + async noUse() { + // 过滤多租户 + await this.demoGoodsEntity.createQueryBuilder().getMany(); + // 被noTenant包裹,不会过滤多租户 + await noTenant(this.ctx, async () => { + return await this.demoGoodsEntity.createQueryBuilder().getMany(); + }); + // 过滤多租户 + await this.demoGoodsEntity.find(); + } /** * 无效多租户 */ - async invalid() {} + async invalid() { + // 自定义sql,不进行多租户过滤 + await this.nativeQuery('select * from demo_goods'); + // 自定义分页sql,进行多租户过滤 + await this.sqlRenderPage('select * from demo_goods'); + } } diff --git a/src/modules/user/controller/admin/info.ts b/src/modules/user/controller/admin/info.ts index 4bd8828..471c013 100644 --- a/src/modules/user/controller/admin/info.ts +++ b/src/modules/user/controller/admin/info.ts @@ -9,9 +9,9 @@ import { DemoGoodsEntity } from '../../../demo/entity/goods'; api: ['add', 'delete', 'update', 'info', 'list', 'page'], entity: UserInfoEntity, pageQueryOp: { - fieldEq: ['status', 'gender', 'loginType'], + fieldEq: ['a.status', 'a.gender', 'a.loginType'], fieldLike: ['b.title'], - keyWordLikeFields: ['nickName', 'phone'], + keyWordLikeFields: ['a.nickName', 'a.phone'], select: ['a.*', 'b.title as goodsName'], join: [ {