feat: 实现日历课程点击跳转到直播间功能

- 添加日历课程详情弹窗的点击跳转功能
- 公共课直播间和课程直播间支持URL参数自动选中课程
- 优化岗位详情页面样式,复用简洁卡片样式
- 为岗位详情标题添加图标
- 调整不同类型课程的跳转逻辑

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
KQL
2025-09-11 14:14:45 +08:00
parent 60bd9bb142
commit 561d5c286d
107 changed files with 101383 additions and 478 deletions

100
check_positions.js Normal file
View File

@@ -0,0 +1,100 @@
#!/usr/bin/env node
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 读取文件
const filePath = path.join(__dirname, 'src/mocks/resumeInterviewMock.js');
const content = fs.readFileSync(filePath, 'utf-8');
// 需要检查的岗位列表
const positionsToCheck = [
'民宿管家',
'民宿客房管家',
'民宿运营专员',
'露营地运营专员',
'新媒体运营专员',
'文创产品设计师',
'文创产品策划师',
'文创产品设计师助理',
'品牌策划运营专员',
'品牌公关',
'品牌推广专员',
'ip运营',
'IP运营总监助理',
'品牌公关管培生'
];
console.log('检查岗位数据完整性...');
console.log('=' * 50);
// 提取industries数据
const industriesMatch = content.match(/const industries = \[([\s\S]*?)\];/);
if (!industriesMatch) {
console.log('未找到industries数据');
process.exit(1);
}
// 提取resumeTemplates数据
const templatesMatch = content.match(/const resumeTemplates = \{([\s\S]*?)\n\};/);
if (!templatesMatch) {
console.log('未找到resumeTemplates数据');
process.exit(1);
}
// 分析每个岗位
const results = [];
for (const position of positionsToCheck) {
// 在industries中查找
const industryRegex = new RegExp(`title: "${position}"`, 'g');
const industryMatches = [...content.matchAll(industryRegex)];
// 在resumeTemplates中查找
const templateRegex = new RegExp(`position: "${position}"[\\s\\S]*?studentInfo:`, 'g');
const templateMatches = [...content.matchAll(templateRegex)];
// 检查是否有studentInfo
let hasStudentInfo = false;
for (const match of templateMatches) {
const afterMatch = content.substring(match.index, match.index + 1000);
if (afterMatch.includes('studentInfo: {')) {
// 检查studentInfo是否包含必要字段
const studentInfoEnd = afterMatch.indexOf('},') + match.index;
const studentInfoContent = content.substring(match.index, studentInfoEnd);
hasStudentInfo =
studentInfoContent.includes('project_experience:') &&
studentInfoContent.includes('core_skills:') &&
studentInfoContent.includes('personal_summary:');
}
}
results.push({
position,
inIndustries: industryMatches.length > 0,
inTemplates: templateMatches.length > 0,
hasStudentInfo
});
}
// 输出结果
console.log('\n检查结果\n');
console.log('岗位名称 | 在industries中 | 在templates中 | 有studentInfo');
console.log('-'.repeat(60));
let missingCount = 0;
for (const result of results) {
const status = result.hasStudentInfo ? '✅' : '❌';
console.log(`${result.position.padEnd(20)} | ${result.inIndustries ? '是' : '否'} | ${result.inTemplates ? '是' : '否'} | ${status}`);
if (!result.hasStudentInfo) {
missingCount++;
}
}
console.log('\n' + '='.repeat(50));
console.log(`总计:${results.length}个岗位,${missingCount}个缺少studentInfo数据`);