fix(withdraw): resolve remote 404 route, db reason column patch and avatar tmp path fallback

这个提交包含在:
xcbyy
2026-10-13 09:33:29 +08:00
父节点 1fb0cc4273
当前提交 35a5a6670c
共有 8 个文件被更改,包括 2648 次插入 和 64 次删除

查看文件

@@ -124,4 +124,113 @@ describe('ClientFeatures (TDD 测试套件: 用户端功能闭环)', () => {
expect(content).toContain('review-modal-mask');
});
});
describe('5. 我的收藏陪玩闭环验证', () => {
it('后端 repository 必须实现收藏陪玩管理方法 (getFavorites, addFavorite, removeFavorite, isFavorite)', () => {
const repoPath = path.join(serverSrcDir, 'db', 'repository.ts');
const content = fs.readFileSync(repoPath, 'utf-8');
expect(content).toContain('getFavorites');
expect(content).toContain('addFavorite');
expect(content).toContain('removeFavorite');
expect(content).toContain('isFavorite');
expect(content).toContain('favorites');
});
it('后端 index.ts 必须暴露收藏相关 API 路由', () => {
const indexPath = path.join(serverSrcDir, 'index.ts');
const content = fs.readFileSync(indexPath, 'utf-8');
expect(content).toContain("app.get('/api/favorites'");
expect(content).toContain("app.post('/api/favorites'");
expect(content).toContain("app.delete('/api/favorites/:expertId'");
expect(content).toContain("app.get('/api/favorites/check'");
});
it('陪玩详情页与个人中心必须实现收藏状态联动与列表渲染', () => {
const detailVuePath = path.join(uniPagesDir, 'expert', 'detail.vue');
const detailContent = fs.readFileSync(detailVuePath, 'utf-8');
expect(detailContent).toContain('toggleFavorite');
expect(detailContent).toContain('isFav');
const userVuePath = path.join(uniPagesDir, 'user', 'index.vue');
const userContent = fs.readFileSync(userVuePath, 'utf-8');
expect(userContent).toContain('openFavoritesModal');
expect(userContent).toContain('favoriteList');
expect(userContent).toContain('handleRemoveFavorite');
});
});
describe('6. 系统与隐私设置闭环验证', () => {
it('个人中心页面必须包含手机号脱敏计算、服务通知与清理缓存能力', () => {
const userVuePath = path.join(uniPagesDir, 'user', 'index.vue');
const content = fs.readFileSync(userVuePath, 'utf-8');
expect(content).toContain('openSettingsModal');
expect(content).toContain('privacyHidePhone');
expect(content).toContain('displayPhone');
expect(content).toContain('clearLocalCache');
expect(content).toContain('cacheSizeText');
expect(content).toContain('v2.6.0 正式版');
});
});
describe('7. 分销推广管理闭环验证', () => {
it('后端 repository 必须实现下级团队与返佣订单流水方法', () => {
const repoPath = path.join(serverSrcDir, 'db', 'repository.ts');
const content = fs.readFileSync(repoPath, 'utf-8');
expect(content).toContain('getDistributionTeam');
expect(content).toContain('getDistributionRecords');
expect(content).toContain('distribution_records');
});
it('后端 index.ts 必须暴露分销团队与返佣订单路由', () => {
const indexPath = path.join(serverSrcDir, 'index.ts');
const content = fs.readFileSync(indexPath, 'utf-8');
expect(content).toContain("app.get('/api/distribution/team'");
expect(content).toContain("app.get('/api/distribution/records'");
});
it('个人中心页面必须实现专属海报、团队列表、返佣订单与佣金提现看板', () => {
const userVuePath = path.join(uniPagesDir, 'user', 'index.vue');
const content = fs.readFileSync(userVuePath, 'utf-8');
expect(content).toContain('openDistributionModal');
expect(content).toContain('distActiveTab');
expect(content).toContain('distributionTeam');
expect(content).toContain('distributionRecords');
expect(content).toContain('submitDistWithdraw');
expect(content).toContain('suncode-box');
});
});
describe('8. 首页搜索、多维复合筛选与雷达即时速配闭环验证', () => {
it('首页页面 (index/index.vue) 必须包含搜索框、热搜推荐词与多维复合筛选工具栏', () => {
const indexVuePath = path.join(uniPagesDir, 'index', 'index.vue');
const content = fs.readFileSync(indexVuePath, 'utf-8');
expect(content).toContain('searchKeyword');
expect(content).toContain('hotSearchWords');
expect(content).toContain('filterOnlyOnline');
expect(content).toContain('filterGender');
expect(content).toContain('filterSort');
expect(content).toContain('filterPriceRange');
expect(content).toContain('priceOptions');
});
it('首页页面必须实现雷达即时派单速配与搜索无结果重置能力', () => {
const indexVuePath = path.join(uniPagesDir, 'index', 'index.vue');
const content = fs.readFileSync(indexVuePath, 'utf-8');
expect(content).toContain('startInstantMatch');
expect(content).toContain('matchedExpert');
expect(content).toContain('radar-scan-box');
expect(content).toContain('empty-search-box');
expect(content).toContain('resetAllFilters');
});
});
});