fix(portal): 修复微官网在浏览器打开时的跨域与网络解析报错,支持默认名片平滑降级

这个提交包含在:
wikiboss
2026-09-21 10:17:47 +08:00
父节点 636bc99b41
当前提交 d909b08f4b
共有 7 个文件被更改,包括 112 次插入 和 7 次删除

查看文件

@@ -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,

查看文件

@@ -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

查看文件

@@ -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. 实体存在性与发布状态检查

查看文件

@@ -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');
});
});