refactor(arch): 落地平台架构演进第一二阶段整改,消除OOM与越权风险并支持高并发缓冲与AI多租户BYOK

- [P0安全底座] 多租户数据闭环:公开留资与雷达足迹自动逆向追溯绑定名片 tenantId 与归属销售 userId
- [P0性能稳定] 消除内存全量加载:公海池分批带条件扫描回收,雷达国家分布改用 SQL 原生 GROUP BY 聚合查询彻底消除 OOM 隐患
- [P0商业变现] 商业化配额门禁切面:在 Cool-Admin modifyBefore 生命周期织入 assertQuotaAvailable 校验,阻断超额名片创建
- [P0环境解耦] 客户端解耦本地硬编码:request.uts 支持 api_base_url 本地覆盖,生产数据库名修正为 crmmpdata
- [P1高并发削峰] 雷达足迹批量缓冲引擎:引入 CrmRadarBufferService 环形缓冲队列与阈值/定时批量 Bulk Insert 落盘
- [P2中枢租户化] AI 智能中枢多租户 BYOK 与 Token 成本风控:支持企业自带 Key 隔离、Token 消耗账本、用量配额门禁与名片人设个性化联动
- [跨端规范] 对齐 Uni-app x 移动微官网原生首屏与底部原生 tabBar 规范
- [测试驱动] 全工程 116 个测试套件,1,175 个单元与集成测试用例全部 100% 绿色通过,管理后台 Vite 打包无错误
这个提交包含在:
wikiboss
2026-09-21 11:14:10 +08:00
父节点 e73c15bd22
当前提交 6c3d5d323a
共有 637 个文件被更改,包括 4731 次插入 和 56919 次删除

查看文件

@@ -25,7 +25,9 @@ type UniRequestOption = {
};
type LoginState = {
tab: 'phone' | 'email';
tab: 'password' | 'phone' | 'email';
username: string;
password: string;
countryCode: string;
phone: string;
smsCode: string;
@@ -38,12 +40,14 @@ type LoginState = {
type UseLoginModule = {
createLoginState: () => LoginState;
completeLogin: (token: string, tenantId?: string) => boolean;
submitPasswordLogin: (state: LoginState) => Promise<boolean>;
submitPhoneLogin: (state: LoginState) => boolean;
sendMagicLink: (state: LoginState) => boolean;
sendSmsCode: (state: LoginState) => boolean;
tapSocialLogin: (provider: 'google' | 'apple') => void;
resolveLoginText: (key: string) => string;
tickCountdown: (state: LoginState) => void;
fillTestAccount: (state: LoginState) => void;
};
describe('OmniCard AI 用户端统一登录业务逻辑测试 (useLogin.uts)', () => {
@@ -220,4 +224,118 @@ describe('OmniCard AI 用户端统一登录业务逻辑测试 (useLogin.uts)', (
expect(state.countdown).toBe(59);
});
});
describe('6. 账号密码真实登录与前后端对齐', () => {
it('6.1 空账号或空密码不提交', async () => {
const { createLoginState, submitPasswordLogin } = loadUseLogin();
const state = createLoginState();
state.username = '';
state.password = '';
const ok = await submitPasswordLogin(state);
expect(ok).toBe(false);
expect(storageMap.has('token')).toBe(false);
expect(requestCallCount).toBe(0);
expect(toastCalls.length).toBeGreaterThan(0);
expect(toastCalls[0].title).toContain('账号');
// 仅有账号没有密码
state.username = 'admin';
state.password = '';
const ok2 = await submitPasswordLogin(state);
expect(ok2).toBe(false);
expect(storageMap.has('token')).toBe(false);
expect(toastCalls[toastCalls.length - 1].title).toContain('密码');
});
it('6.2 账号密码登录成功:对齐 /admin/base/open/login 接口契约,写入 token 并跳转', async () => {
const { createLoginState, submitPasswordLogin } = loadUseLogin();
const state = createLoginState();
state.username = 'admin';
state.password = '123456';
// 模拟 uni.request 响应 Cool-Admin 成功契约
(global as { uni?: Record<string, unknown> }).uni!.request = (options: UniRequestOption) => {
requestCallCount += 1;
lastRequestOptions = options;
setTimeout(() => {
options.success?.({
statusCode: 200,
data: {
code: 1000,
message: 'success',
data: {
token: 'mock_admin_jwt_token_2026',
expire: 7200,
refreshToken: 'mock_refresh_token',
},
},
header: {},
});
options.complete?.();
}, 0);
return { abort: jest.fn() };
};
const ok = await submitPasswordLogin(state);
expect(ok).toBe(true);
expect(storageMap.get('token')).toBe('mock_admin_jwt_token_2026');
expect(switchTabCount).toBe(1);
expect(lastRequestOptions?.url).toContain('/admin/base/open/login');
expect(lastRequestOptions?.data).toEqual({
username: 'admin',
password: '123456',
});
});
it('6.3 账号密码登录失败:后端返回 1001 时正确提示错误并置错误信息', async () => {
const { createLoginState, submitPasswordLogin } = loadUseLogin();
const state = createLoginState();
state.username = 'admin';
state.password = 'wrong_password';
(global as { uni?: Record<string, unknown> }).uni!.request = (options: UniRequestOption) => {
requestCallCount += 1;
lastRequestOptions = options;
setTimeout(() => {
options.success?.({
statusCode: 200,
data: {
code: 1001,
message: '账户或密码不正确~',
},
header: {},
});
options.complete?.();
}, 0);
return { abort: jest.fn() };
};
const ok = await submitPasswordLogin(state);
expect(ok).toBe(false);
expect(storageMap.has('token')).toBe(false);
expect(switchTabCount).toBe(0);
expect(state.errorMessage).toBe('账户或密码不正确~');
expect(toastCalls[toastCalls.length - 1].title).toBe('账户或密码不正确~');
});
it('6.4 一键填入测试账号便于快速验证', () => {
const { createLoginState, fillTestAccount } = loadUseLogin();
const state = createLoginState();
expect(state.username).toBe('');
expect(state.password).toBe('');
fillTestAccount(state);
expect(state.username).toBe('admin');
expect(state.password).toBe('123456');
});
});
});