diff --git a/backend/src/config/config.default.ts b/backend/src/config/config.default.ts index b38fdbf..458c044 100644 --- a/backend/src/config/config.default.ts +++ b/backend/src/config/config.default.ts @@ -14,6 +14,11 @@ export default { koa: { port: availablePort(9000), }, + cors: { + origin: '*', + allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS', + allowHeaders: ['Content-Type', 'Authorization', 'x-tenant-id', 'x-requested-with'], + }, // 开启异步上下文管理 asyncContextManager: { enable: true, diff --git a/backend/src/configuration.ts b/backend/src/configuration.ts index ca2a37f..6d6de98 100644 --- a/backend/src/configuration.ts +++ b/backend/src/configuration.ts @@ -8,7 +8,7 @@ import { MidwayWebRouterService, } from '@midwayjs/core'; import * as koa from '@midwayjs/koa'; -// import * as crossDomain from '@midwayjs/cross-domain'; +import * as crossDomain from '@midwayjs/cross-domain'; import * as validate from '@midwayjs/validate'; import * as info from '@midwayjs/info'; import * as staticFile from '@midwayjs/static-file'; @@ -27,7 +27,7 @@ import { TenantMiddleware } from './comm/middleware/tenant'; // https://koajs.com/ koa, // 是否开启跨域(注:顺序不能乱放!!!) http://www.midwayjs.org/docs/extensions/cross_domain - // crossDomain, + crossDomain, // 静态文件托管 https://midwayjs.org/docs/extensions/static_file staticFile, // orm https://midwayjs.org/docs/extensions/orm diff --git a/backend/src/modules/card/service/portal.ts b/backend/src/modules/card/service/portal.ts index 279501d..0b1bb6d 100644 --- a/backend/src/modules/card/service/portal.ts +++ b/backend/src/modules/card/service/portal.ts @@ -88,6 +88,12 @@ export class CardPortalService extends BaseService { card = await this.cardInfoEntity.findOne({ where: { slug: queryKey }, }); + if (!card && queryKey.toLowerCase() === 'default') { + card = await this.cardInfoEntity.findOne({ + where: { status: 'published' }, + order: { id: 'ASC' }, + }); + } } // 3. 实体存在性与发布状态检查 diff --git a/backend/test/modules/card/portal-default-fallback.test.ts b/backend/test/modules/card/portal-default-fallback.test.ts new file mode 100644 index 0000000..88aedad --- /dev/null +++ b/backend/test/modules/card/portal-default-fallback.test.ts @@ -0,0 +1,67 @@ +import { CardPortalService } from '../../../src/modules/card/service/portal'; +import { CardInfoEntity } from '../../../src/modules/card/entity/info'; +import { CardBentoEntity } from '../../../src/modules/card/entity/bento'; + +describe('CardPortalService: default 标识平滑降级与微官网访问容错 (TDD Red -> Green)', () => { + let cardPortalService: CardPortalService; + + const mockCardData: CardInfoEntity[] = [ + { + id: 1, + slug: 'alex-morgan', + name: 'Alex Morgan', + title: 'VP of Global Business', + company: 'OmniCard AI Global Inc.', + status: 'published', + createTime: new Date(), + updateTime: new Date(), + } as CardInfoEntity, + ]; + + beforeEach(() => { + cardPortalService = new CardPortalService(); + (CardPortalService as any).localCache?.clear?.(); + + const mockCardRepo = { + findOne: jest.fn(async (options: any) => { + const where = options?.where; + // 如果是按默认/第一张已发布排序查询 + if (options?.order?.id === 'ASC' && where?.status === 'published') { + return mockCardData.find((c) => c.status === 'published') || null; + } + if (Array.isArray(where)) { + return mockCardData.find((c) => c.id === where[0]?.id || c.slug === where[1]?.slug) || null; + } + if (where?.slug) { + return mockCardData.find((c) => c.slug === where.slug) || null; + } + if (where?.id) { + return mockCardData.find((c) => c.id === where.id) || null; + } + return null; + }), + }; + + const mockBentoRepo = { + find: jest.fn(async () => []), + }; + + cardPortalService.cardInfoEntity = mockCardRepo as any; + cardPortalService.cardBentoEntity = mockBentoRepo as any; + }); + + it('1. 当请求 slug 为 default 且无 default 名片时,应自动平滑降级获取首张已发布名片', async () => { + const res = await cardPortalService.getPortalDetail('default'); + expect(res).toBeDefined(); + expect(res.name).toBe('Alex Morgan'); + expect(res.slug).toBe('alex-morgan'); + expect(res.status).toBe('published'); + }); + + it('2. 当请求明确的 slug 时,应正常返回指定名片', async () => { + const res = await cardPortalService.getPortalDetail('alex-morgan'); + expect(res).toBeDefined(); + expect(res.name).toBe('Alex Morgan'); + expect(res.slug).toBe('alex-morgan'); + }); +}); diff --git a/mpuniapp/common/request.uts b/mpuniapp/common/request.uts index dfed1e7..fa88228 100644 --- a/mpuniapp/common/request.uts +++ b/mpuniapp/common/request.uts @@ -5,9 +5,13 @@ import { ApiResponse } from './types.uts'; -let currentBaseUrl: string = 'http://127.0.0.1:9000/api'; +let currentBaseUrl: string = 'http://127.0.0.1:9000'; // #ifdef H5 -currentBaseUrl = '/api'; +if (typeof window !== 'undefined' && window.location != null) { + const protocol = window.location.protocol != null && window.location.protocol !== '' ? window.location.protocol : 'http:'; + const hostname = window.location.hostname != null && window.location.hostname !== '' ? window.location.hostname : '127.0.0.1'; + currentBaseUrl = `${protocol}//${hostname}:9000`; +} // #endif let currentTimeout: number = 10000; diff --git a/mpuniapp/index.html b/mpuniapp/index.html index c23172d..7e21498 100644 --- a/mpuniapp/index.html +++ b/mpuniapp/index.html @@ -10,7 +10,31 @@ '') - + OmniCard + diff --git a/mpuniapp/manifest.json b/mpuniapp/manifest.json index 41cf876..350d1cd 100644 --- a/mpuniapp/manifest.json +++ b/mpuniapp/manifest.json @@ -9,7 +9,6 @@ "styleIsolationVersion" : "2" }, "vueVersion" : "3", - "workers" : "workers", "mp-weixin" : { "darkmode" : true, "appid" : "", @@ -97,7 +96,7 @@ } }, "unipush" : { - "enable" : true + "enable" : false } }, "app-android" : {