feat: 优化岗位等级系统和UI样式

主要更新:
1. 修复岗位等级数据:
   - 重新分类49个岗位到正确等级(普通岗29个、技术骨干岗12个、储备干部岗8个)
   - 更新项目库中所有项目的适用岗位,按照新的岗位等级映射关系重新配置
   - 岗位卡片按等级排序:普通岗 → 技术骨干岗 → 储备干部岗

2. 优化任务列表(当日事项)样式:
   - 复用参考项目的任务列表样式,添加虚线时间轴设计
   - 添加导师头像显示和个性化定位
   - 在头像左侧添加状态圆点,根据任务完成状态显示不同颜色
   - 修复时间显示格式,统一显示开始时间
   - 设置1V1规划课时长为2小时

3. 优化日历组件:
   - 区分当前月份和其他月份日期的颜色显示
   - 修复月份切换时高亮显示错误的问题

4. 优化课程列表样式:
   - 移除教师专长的hover效果
   - 统一课程名称字体粗细,优化选中状态样式

5. 优化项目库适用岗位显示:
   - 修复第三张岗位卡片显示不全的问题
   - 超过3个岗位时自动换行显示

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
KQL
2025-09-10 19:16:24 +08:00
parent 0c520b0b1e
commit 15db293d5b
12 changed files with 1201 additions and 389 deletions

View File

@@ -271,12 +271,19 @@
}
.selected {
background-color: #f2f8ff;
border: 1px solid #4080ff !important;
box-shadow: 0 2px 8px rgba(64, 128, 255, 0.15);
background: linear-gradient(135deg, #e8f4ff 0%, #d4ecff 100%);
outline: 2px solid #165dff;
box-shadow: 0 4px 12px rgba(22, 93, 255, 0.25);
transform: none;
transition: all 0.3s ease;
p {
color: #1d2129;
color: #165dff;
font-weight: 600; /* 与默认保持一致 */
}
.time-line-item-info {
color: #4080ff;
font-weight: 500;
}
}

View File

@@ -300,6 +300,9 @@
border-radius: 4px;
flex-shrink: 0;
white-space: nowrap;
cursor: default;
pointer-events: none;
user-select: none;
}
}
}

View File

@@ -92,11 +92,9 @@ export default ({ className = "", isLock = false, selectedCourse, teacherData, u
) : (
<>
<div className="courses-video-player-header">
<span onClick={() => handleClickBtn(1)}>&lt; 上一集</span>
<span className="courses-video-player-header-title">
{courseName}
</span>
<span onClick={() => handleClickBtn(2)}>下一集 &gt;</span>
</div>
<div className="courses-video-player-video">
{selectedCourse ? (
@@ -236,43 +234,11 @@ export default ({ className = "", isLock = false, selectedCourse, teacherData, u
</div>
<div className="courses-video-player-teacher-tags">
<p className="title icon2">教师专长</p>
<Tooltip
content={
<div style={{
display: 'flex',
flexWrap: 'wrap',
gap: '8px',
maxWidth: '320px',
padding: '8px'
}}>
{(currentTeacher?.specialties || []).map((specialty, index) => (
<span key={index} style={{
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
color: '#fff',
padding: '4px 12px',
borderRadius: '12px',
fontSize: '12px',
fontWeight: '500',
boxShadow: '0 2px 4px rgba(0,0,0,0.1)'
}}>
{specialty}
</span>
))}
</div>
}
position="top"
color="#fff"
style={{
'--arco-color-bg-tooltip': 'linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%)',
'--arco-color-text-tooltip': '#1d2129'
}}
>
<ul className="teacher-tags">
{(currentTeacher?.specialties || []).map((specialty, index) => (
<li key={index}>{specialty}</li>
))}
</ul>
</Tooltip>
<ul className="teacher-tags">
{(currentTeacher?.specialties || []).map((specialty, index) => (
<li key={index}>{specialty}</li>
))}
</ul>
</div>
</div>
</>

View File

@@ -5,31 +5,51 @@
"high": {
"name": "储备干部岗",
"list": [
{
"record_id": "recuzDi0lXYCA0",
"position_name": "民宿管家",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2im65lI.jpeg"
},
{
"record_id": "recuzDi0lXza7O",
"position_name": "民宿客房管家",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imoVv6.jpeg"
},
{
"record_id": "recuzVoIzaXUqc",
"position_name": "民宿运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imlAwW.jpeg"
},
{
"record_id": "recuzDi0lXJQ5u",
"position_name": "酒店餐饮主管",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imTKuC.jpeg"
},
{
"record_id": "recuzVoIzaMhKk",
"position_name": "酒店运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imUf1N.jpeg"
"record_id": "recuzVoIza7JA5",
"position_name": "餐厅运营经理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imDPFP.jpeg"
},
{
"record_id": "recuFZJhP8hm76",
"position_name": "宠物店店长",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imzXzv.jpeg"
},
{
"record_id": "recuFZJhP80n5d",
"position_name": "二次元周边店店长",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imWiVD.jpeg"
},
{
"record_id": "recuTPacKm3d50",
"position_name": "IP运营总监助理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuTL5CPsNiYe.jpeg"
},
{
"record_id": "recuTPacKmTFN8",
"position_name": "文创产品设计师助理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuTL5CPsiABJ.jpeg"
},
{
"record_id": "recuTPacKm0jSg",
"position_name": "文旅运营总监助理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuTL5CPswT5x.jpeg"
},
{
"record_id": "recuTPacKmzBcS",
"position_name": "文旅项目投资拓展管培生",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuTL5CPs5hKs.jpeg"
}
]
},
"middle": {
"name": "技术骨干岗",
"list": [
{
"record_id": "recuzVoIzakyIc",
"position_name": "客房经理",
@@ -40,11 +60,6 @@
"position_name": "酒店大堂副理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPGOiZ85boC.jpeg"
},
{
"record_id": "recuzVoIza7JA5",
"position_name": "餐厅运营经理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imDPFP.jpeg"
},
{
"record_id": "recuzDi0lXi4bv",
"position_name": "品牌公关",
@@ -59,62 +74,17 @@
"record_id": "recuzDi0lXn5dv",
"position_name": "演出执行经理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuQIuHUH07Ia.jpeg"
}
]
},
"middle": {
"name": "技术骨干岗",
"list": [
{
"record_id": "recuFZJhP8rNao",
"position_name": "赛事经纪",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPGOiZ8uICB.jpeg"
},
{
"record_id": "recuzDi0lXtaB3",
"position_name": "景区运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPGOiZ80asf.jpeg"
},
{
"record_id": "recuIZG3KIM5C5",
"position_name": "活动策划师",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imXS9c.jpeg"
},
{
"record_id": "recuIZG7I3fy6w",
"position_name": "活动执行",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imyYok.jpeg"
},
{
"record_id": "recuzDi0lXAT6U",
"position_name": "场馆运营人员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imt2TC.jpeg"
},
{
"record_id": "recuRgmhftZcHa",
"position_name": "露营地运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imRFOD.jpeg"
},
{
"record_id": "recuFZJhP8hm76",
"position_name": "宠物店店长",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imzXzv.jpeg"
},
{
"record_id": "recuzJ1ZVuwnPv",
"position_name": "宠物营养师",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imdfAp.jpeg"
},
{
"record_id": "recuIZKwO9ixGh",
"position_name": "SEO专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2iml2IU.jpeg"
},
{
"record_id": "recuzDi0lX7glV",
"position_name": "SEM专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imnfVv.jpeg"
},
{
"record_id": "recuzDi0lXyBDV",
"position_name": "文创产品设计师",
@@ -130,16 +100,81 @@
"position_name": "会展策划师",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imOdyu.jpeg"
},
{
"record_id": "recuzVoIzaxqAd",
"position_name": "会展营销",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imYg13.jpeg"
},
{
"record_id": "recuFZJhP8yJi4",
"position_name": "漫展策划师",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2im9Ecg.jpeg"
},
{
"record_id": "recuzDi0lXzexM",
"position_name": "旅游规划师",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2im0xT7.jpeg"
}
]
},
"ordinary": {
"name": "普通岗",
"list": [
{
"record_id": "recuzDi0lXYCA0",
"position_name": "民宿管家",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2im65lI.jpeg"
},
{
"record_id": "recuzDi0lXza7O",
"position_name": "民宿客房管家",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imoVv6.jpeg"
},
{
"record_id": "recuzVoIzaXUqc",
"position_name": "民宿运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imlAwW.jpeg"
},
{
"record_id": "recuzVoIzaMhKk",
"position_name": "酒店运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imUf1N.jpeg"
},
{
"record_id": "recuFZJhP8rNao",
"position_name": "赛事经纪",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPGOiZ8uICB.jpeg"
},
{
"record_id": "recuzDi0lXtaB3",
"position_name": "景区运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPGOiZ80asf.jpeg"
},
{
"record_id": "recuIZG7I3fy6w",
"position_name": "活动执行",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imyYok.jpeg"
},
{
"record_id": "recuzDi0lXAT6U",
"position_name": "场馆运营人员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imt2TC.jpeg"
},
{
"record_id": "recuRgmhftZcHa",
"position_name": "露营地运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imRFOD.jpeg"
},
{
"record_id": "recuIZKwO9ixGh",
"position_name": "SEO专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2iml2IU.jpeg"
},
{
"record_id": "recuzDi0lX7glV",
"position_name": "SEM专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imnfVv.jpeg"
},
{
"record_id": "recuzVoIzaxqAd",
"position_name": "会展营销",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imYg13.jpeg"
},
{
"record_id": "recuRgmO7ra6GB",
"position_name": "品牌策划运营专员",
@@ -175,31 +210,11 @@
"position_name": "新媒体运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imbZSu.jpeg"
},
{
"record_id": "recuFZJhP80n5d",
"position_name": "二次元周边店店长",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imWiVD.jpeg"
},
{
"record_id": "recuzDi0lXzexM",
"position_name": "旅游规划师",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2im0xT7.jpeg"
},
{
"record_id": "recuzDi0lXXv4U",
"position_name": "旅游计调专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imqBs9.jpeg"
},
{
"record_id": "recuTPacKm3d50",
"position_name": "IP运营总监助理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuTL5CPsNiYe.jpeg"
}
]
},
"ordinary": {
"name": "普通岗",
"list": [
{
"record_id": "recuFZJhP8plco",
"position_name": "二次元周边选品专员",
@@ -240,25 +255,10 @@
"position_name": "网络运营专员",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFY2imy8Dg.jpeg"
},
{
"record_id": "recuTPacKmTFN8",
"position_name": "文创产品设计师助理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuTL5CPsiABJ.jpeg"
},
{
"record_id": "recuTPacKmIYRA",
"position_name": "品牌公关管培生",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuTL5CPsaZas.jpeg"
},
{
"record_id": "recuTPacKm0jSg",
"position_name": "文旅运营总监助理",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuTL5CPswT5x.jpeg"
},
{
"record_id": "recuTPacKmzBcS",
"position_name": "文旅项目投资拓展管培生",
"img": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuTL5CPs5hKs.jpeg"
}
]
}

View File

@@ -6,6 +6,19 @@ import calendarCoursesData from './calendarCourses.json';
import aiCoursesData from '../../网页未导入数据/文旅产业/ai课程表.json';
import marketingCoursesData from './marketingCourses.json';
// 导师头像映射(全局使用)
const teacherAvatars = {
"刘杰": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJBE4VCCx.jpg",
"郭建辉": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJBMNLZL5.png",
"赵志强": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJC2oLPpC.png",
"孙应战": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJCc6qecx.jpg",
"魏立慧": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpSO4gUtJz.png",
"李毅峰": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuVPz0WRmxCK.jpeg",
"周伏波": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuVU7Gi9YxSN.jpg",
"范雪娇": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuVU7JsHHDNZ.jpeg",
"李奇": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuW8gePZvRn6.jpg"
};
// 转换函数将JSON数据转换为页面所需格式
// 转换面试状态数据
const transformInterviewStatus = (statusData, jobsData) => {
@@ -156,7 +169,8 @@ const transformMarketingCourses = (marketingCourses) => {
type: 'marketing-course',
teacher: '孙应战', // 营销课的默认讲师
status: course["课程状态"] || "已完成",
location: course["上课地点"] || "线上"
location: course["上课地点"] || "线上",
isCompleted: true // 标记为已完成
};
}).filter(event => event !== null);
};
@@ -200,7 +214,8 @@ const transformAICourses = (aiData) => {
teacher: '李奇', // AI课程的默认讲师
location: course["上课地点"] || "线上",
status: course["课程状态"] || "",
unit: "终生学习系统课"
unit: "终生学习系统课",
isCompleted: true // 标记为已完成
};
});
};
@@ -233,9 +248,10 @@ const transformCalendarCourses = (coursesData) => {
startTime = "14:00";
endTime = "16:00";
} else {
// 处理时间格式,确保有效
if (timeStr && timeStr.includes('-')) {
const timeParts = timeStr.split('-').map(t => t ? t.trim() : '');
// 处理时间格式,确保有效(支持 ~ 和 - 分隔符)
if (timeStr && (timeStr.includes('~') || timeStr.includes('-'))) {
const separator = timeStr.includes('~') ? '~' : '-';
const timeParts = timeStr.split(separator).map(t => t ? t.trim() : '');
if (timeParts[0]) startTime = timeParts[0];
if (timeParts[1]) endTime = timeParts[1];
} else if (timeStr) {
@@ -297,7 +313,8 @@ const transformCalendarCourses = (coursesData) => {
status: course["❌课程状态"] || status,
weekday: course["星期"],
location: course["上课地点"] || "线上",
originalDate: course["日期"]
originalDate: course["日期"],
isCompleted: true // 标记为已完成
};
});
};
@@ -425,14 +442,7 @@ const generatePublicCourseLiveList = (calendarEvents) => {
};
// 导师头像映射
const teacherAvatars = {
"孙应战": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJCc6qecx.jpg",
"李毅峰": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuVPz0WRmxCK.jpeg",
"周伏波": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuVU7Gi9YxSN.jpg",
"范雪娇": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuVU7JsHHDNZ.jpeg",
"李奇": "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuW8gePZvRn6.jpg"
};
// teacherAvatars已在文件顶部定义
// 遍历日历事件找出公开课和AI课程
calendarEvents.forEach(event => {
// 处理type为'public-course'的课程或AI课程
@@ -587,18 +597,50 @@ const updateTeacherCourses = (teacherData, calendarEvents) => {
// 生成任务列表:从日历事件生成任务
const generateTasksFromCalendarEvents = (calendarEvents) => {
return calendarEvents.map((event, index) => ({
id: index + 1,
title: `完成${event.title}课程学习`,
courseName: event.title,
date: event.startTime.split(' ')[0],
deadline: event.endTime,
priority: event.type === 'interview' ? 'high' : event.type === 'planning' ? 'medium' : 'low',
status: event.status === 'completed' ? 'COMPLETED' : event.status === 'ongoing' ? 'IN_PROGRESS' : 'TODO',
teacher: event.teacher,
unit: event.unit,
type: 'course'
}));
return calendarEvents.map((event, index) => {
// 根据课程类型判断课程类别
let courseCategory = '复合能力课';
if (event.type === 'ai-course') {
courseCategory = '终生学习系统课';
} else if (event.type === 'marketing-course') {
courseCategory = '营销能力课';
} else if (event.type === 'vertical-skill') {
courseCategory = '垂直提升课';
} else if (event.type === 'public-course') {
courseCategory = '公共课';
} else if (event.type === 'compound-skill' || event.type === 'class') {
courseCategory = '复合能力课';
} else if (event.type === 'one-on-one') {
courseCategory = '1V1规划课';
} else if (event.type === 'interview') {
courseCategory = '模拟面试';
}
// 根据课程类别设置时长
let duration = '1小时';
if (courseCategory === '1V1规划课') {
duration = '2小时';
}
return {
id: index + 1,
title: `完成${event.title}课程学习`,
courseName: event.title,
courseCategory: courseCategory,
date: event.startTime.split(' ')[0],
startTime: event.startTime ? event.startTime.split(' ')[1] || '20:00' : '20:00',
deadline: event.endTime,
priority: event.type === 'interview' ? 'high' : event.type === 'planning' ? 'medium' : 'low',
status: event.isCompleted ? 'COMPLETED' : event.status === 'completed' ? 'COMPLETED' : event.status === 'ongoing' ? 'IN_PROGRESS' : 'TODO',
isCompleted: event.isCompleted || false,
teacher: event.teacher,
teacherName: event.teacher,
teacherAvatar: teacherAvatars[event.teacher] || 'https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuW8gePZvRn6.jpg',
unit: event.unit,
type: 'course',
duration: duration
};
});
};
// 模拟数据
@@ -676,7 +718,7 @@ export const mockData = {
"刘杰": {
name: "刘杰",
introduction: "15年民宿产业化研发与标准设计经验专注民宿产品创新、职业化培训体系搭建及乡村文旅业态升级主导多项国家级行业标准制定与落地实践。木亚文旅创始人兼董事长全面负责民宿产业研发、标准制定及全国业务拓展同时也是莫干山民宿行业协会执行会长兼秘书长以及浙江大学城市学院旅游管理专业校外导师。曾作为核心起草人主持《乡村民宿服务质量规范》《民宿管家职业技能等级评定规范》等国标编制推动民宿行业标准化发展申报并推动'民宿管家'入选国家新职业目录,建立首个国家级职业技能评定体系。",
specialties: ["民宿产业化专家","一听就懂", "思路很清晰", "课堂不枯燥", "学习氛围爆棚"],
specialties: ["民宿产业化专家","一听就懂", "思路很清晰", "课堂不枯燥"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJBE4VCCx.jpg",
type: "复合课导师",
verticalDirection: "项目经营管理",
@@ -694,7 +736,7 @@ export const mockData = {
"赵志强": {
name: "赵志强",
introduction: "深耕乡村旅游与民宿产业12年从一线管家服务到国家级标准制定全程参与中国民宿职业化与产业化进程。曾作为首席讲师为苏浙沪皖四地文旅部门提供'乡村振兴十大模式'培训,设计桑蚕文化园、谢家路村等沉浸式研学路线,促成区域人才协作机制,获江苏省人社厅列为省级高级研修示范项目。曾担任标准起草专家组核心成员,牵头《德清县地方民宿管理办法》试点,联合政府申报'民宿管理师'新职业,制定长三角区域民宿评级体系,推动了紫蓬山民宿学校(安徽)、吴江农文旅融合示范区落地,形成可复制的'民宿+'乡村振兴模式。",
specialties: ["乡村振兴实践者", "政企协作桥梁","讲解有节奏", "讲解通俗", "幽默又有料", "善于启发"],
specialties: ["乡村振兴实践者", "政企协作桥梁","讲解有节奏"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpJC2oLPpC.png",
type: "复合课导师",
verticalDirection: "文化服务",
@@ -719,7 +761,7 @@ export const mockData = {
"周伏波": {
name: "周伏波",
introduction: "具备二十年以上光电子技术领域深耕经验长期致力于光电子芯片材料、光通信器件、半导体照明、激光器件及光电显示技术的研发与产业化工作是推动中国光电子产业链升级的重要技术推动者与行业实践者。其主导完成的多项核心材料与芯片工艺突破成功应用于光模块、光引擎、LED器件、激光显示模组等多个高精度、高性能领域累计获得授权专利60余项多项技术成果实现量产落地。",
specialties: ["光电显示技术探索者", "60+专利技术成果持有者", "国家级重大专项牵头人", "一听就懂", "思路很清晰", "讲解易懂"],
specialties: ["光电显示技术探索者", "60+专利技术成果", "国家级重大专项牵头人"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuVU7Gi9YxSN.jpg",
type: "公共课导师",
courses: []
@@ -727,7 +769,7 @@ export const mockData = {
"范雪娇": {
name: "范雪娇",
introduction: "拥有十八年的工业自动化与机电设备行业从业经验长期专注于自动化装备研发、配件系统优化、机电一体化集成与工程项目落地具备从核心部件开发到整线系统集成的全链条实践能力。职业生涯中累计参与和主导项目超过百项涵盖非标自动化装置、精密机电配件、控制系统架构设计与生产线智能改造等多个方向广泛服务于汽车制造、3C电子、包装、医疗设备、家电装配等高标准行业。",
specialties: ["工业自动化资深专家", "自动化装备研发实践者", "智能装备融合发展典型代表","讲解有节奏", "学习零压力", "善于总结", "超会举例"],
specialties: ["工业自动化资深专家", "智能装备融合发展典型代表"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuVU7JsHHDNZ.jpeg",
type: "公共课导师",
courses: []
@@ -735,7 +777,7 @@ export const mockData = {
"李奇": {
name: "李奇",
introduction: "毕业于南洋理工学院拥有硕士学位具备扎实的人工智能理论基础与产业实践经验。近年来专注于大模型工程化与AI应用课程体系建设主持完成《AIGC实战从模型调用到产品落地》《AI在视觉设计与内容生成中的应用》等多个应用型教学项目。曾主导开发'AI技能地图导航系统'实现课程内容与岗位技能的精准对齐在2024年全国高校AI课程创新大赛中荣获一等奖。擅长将复杂的算法模型转化为通俗易懂的教学内容致力于打造'人人可用AI'的实训课程体系是众多高校与职业培训机构特聘的AI技术与课程体系顾问。",
specialties: ["人工智能技术顾问", "大模型工程化研究者", "AI应用课程体系建设者", "教学内容转化能力强", "技巧随手教", "幽默又有料", "讲解有节奏"],
specialties: ["人工智能技术顾问", "大模型工程化研究者", "AI应用课程体系建设者"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuW8gePZvRn6.jpg",
type: "AI课导师",
courses: []
@@ -743,7 +785,7 @@ export const mockData = {
"魏立慧": {
name: "魏立慧",
introduction: "企业资深一线HR主讲专注于为求职者提供一对一的个性化指导。通过真实招聘视角深入剖析个人优势与短板、传授面试技巧、规划职业定位与发展路径帮助学生快速提升求职竞争力。求职策略以实用落地为核心注重互动交流与角色定位让学员在轻松氛围中获得直击痛点的求职策略。",
specialties: ["点评直击要害", "擅长挖掘优势", "职业规划达人", "深谙用人逻辑", "一线HR资深讲师"],
specialties: ["点评直击要害", "擅长挖掘优势", "职业规划达人", "一线HR资深讲师"],
avatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuUpSO4gUtJz.png",
type: "企业资深HR",
courses: []
@@ -4266,7 +4308,73 @@ mockData.dashboardStatistics = {
tasks: {
todayTasks: [],
weekTasks: [],
allTasks: []
allTasks: [
{
id: 1,
title: "完成展会主题与品牌定位课程学习",
date: "2025-09-10",
time: "09:00",
type: "course",
courseName: "展会主题与品牌定位",
status: "PENDING",
teacherName: "张明",
teacherAvatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/avatar/douyin/07a0a14c8c8d5476b2c8d54de12e6a06.jpg",
duration: "2小时",
teacher: "张明"
},
{
id: 2,
title: "提交项目策划方案",
date: "2025-09-10",
time: "14:00",
type: "PROJECT",
courseName: "商业活动策划",
status: "IN_PROGRESS",
teacherName: "李华",
teacherAvatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/avatar/douyin/13823046201f0ef17517fb46da12bc35.jpg",
duration: "截止今天17:00",
teacher: "李华"
},
{
id: 3,
title: "参加小组讨论会",
date: "2025-09-10",
time: "16:00",
type: "OTHER",
courseName: "文旅产业研究",
status: "PENDING",
teacherName: "王教授",
teacherAvatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/avatar/douyin/13c5709a3993fdf353d147209f8145cb.jpg",
duration: "1小时30分钟",
teacher: "王教授"
},
{
id: 4,
title: "完成设计作业",
date: "2025-09-11",
time: "10:00",
type: "HOMEWORK",
courseName: "创意设计基础",
status: "PENDING",
teacherName: "陈老师",
teacherAvatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/avatar/douyin/152361c6c68a193660cdbdf9074c2cf3.jpg",
duration: "明天截止",
teacher: "陈老师"
},
{
id: 5,
title: "准备展会策划演讲",
date: "2025-09-12",
time: "14:00",
type: "PROJECT",
courseName: "展会策划实务",
status: "PENDING",
teacherName: "赵老师",
teacherAvatar: "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/avatar/douyin/199b35fbd6ed5e3ea6d6d064cf895a13.jpg",
duration: "后天下午",
teacher: "赵老师"
}
]
},
// 排名数据
@@ -5042,6 +5150,11 @@ mockData.dashboardStatistics.courses = {
course.current ? 'IN_PROGRESS' :
courseDate > today ? 'PENDING' : 'COMPLETED';
// 获取教师头像从teacherAvatars映射或课程数据中
const teacherAvatar = teacherAvatars[course.teacherName] ||
course.teacherAvatar ||
'https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_teacher-avatar/recuW8gePZvRn6.jpg';
allTasks.push({
id: taskId++,
title: `完成${course.courseName}课程学习`,
@@ -5051,7 +5164,8 @@ mockData.dashboardStatistics.courses = {
courseName: course.courseName,
status: status,
teacherName: course.teacherName,
teacherAvatar: 'https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp',
teacher: course.teacherName,
teacherAvatar: teacherAvatar,
duration: '1小时',
unit: unit.unitName
});

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -53,6 +53,13 @@
align-items: center;
justify-content: center;
cursor: pointer;
&.other-month {
.date-number {
color: #c9cdd4;
opacity: 0.5;
}
}
&.is-today {
.date-number {
background-color: rgb(0, 119, 255) !important;

View File

@@ -1,73 +1,91 @@
import dayjs from "dayjs";
import { Calendar } from "@arco-design/web-react";
import "./index.css";
const CalendarTaskModule = ({ tasks = [], selectedDate, onDateChange }) => {
// 格式化今天的日期
const today = new Date();
const formattedToday = `${today.getFullYear()}-${String(
today.getMonth() + 1
).padStart(2, "0")}-${String(today.getDate()).padStart(2, "0")}`;
// 获取有任务的日期集合
const datesWithTasks = new Set(tasks?.map((task) => task.date) || []);
// 日历单元格渲染函数
const dateRender = (current) => {
const dateStr = current.format("YYYY-MM-DD");
const hasTasks = datesWithTasks.has(dateStr); // 存在任务
const isCurrentDay = dateStr === dayjs(selectedDate).format("YYYY-MM-DD");
const isToday = dateStr === formattedToday;
return (
<div
className={`calendar-date-cell ${hasTasks ? "has-tasks" : ""} ${
isCurrentDay ? "is-current-day" : ""
} ${isToday ? "is-today" : ""}`}
>
<div className="date-number">{current.date()}</div>
{hasTasks && <div className="task-dot"></div>}
</div>
);
};
const handleDateChange = (date, dateString) => {
if (onDateChange) {
// Arco Calendar passes a dayjs object
if (date && date.format) {
// Convert dayjs to Date object
const dateStr = date.format("YYYY-MM-DD");
const dateObj = new Date(dateStr + "T00:00:00");
if (!isNaN(dateObj.getTime())) {
onDateChange(dateObj);
}
} else if (dateString) {
// Fallback to dateString if available
const dateObj = new Date(dateString + "T00:00:00");
if (!isNaN(dateObj.getTime())) {
onDateChange(dateObj);
}
}
}
};
return (
<div className="module-calendar-task-wrapper">
<Calendar
panelWidth="300"
panel
defaultValue={formattedToday}
value={
selectedDate
? selectedDate.toISOString().split("T")[0]
: formattedToday
}
style={{ fontSize: "18px" }}
onChange={handleDateChange}
dateRender={dateRender}
/>
</div>
);
};
export default CalendarTaskModule;
import React from "react";
import dayjs from "dayjs";
import { Calendar } from "@arco-design/web-react";
import "./index.css";
const CalendarTaskModule = ({ tasks = [], selectedDate, onDateChange }) => {
// 格式化今天的日期
const today = new Date();
const formattedToday = `${today.getFullYear()}-${String(
today.getMonth() + 1
).padStart(2, "0")}-${String(today.getDate()).padStart(2, "0")}`;
// 用于跟踪当前日历显示的月份
const [displayMonth, setDisplayMonth] = React.useState(() => {
return selectedDate || today;
});
// 获取有任务的日期集合
const datesWithTasks = new Set(tasks?.map((task) => task.date) || []);
// 日历单元格渲染函数
const dateRender = (current) => {
const dateStr = current.format("YYYY-MM-DD");
const hasTasks = datesWithTasks.has(dateStr); // 存在任务
const isCurrentDay = dateStr === dayjs(selectedDate).format("YYYY-MM-DD");
const isToday = dateStr === formattedToday;
// 判断是否为当前显示月份 - 使用displayMonth而不是selectedDate
const currentMonth = dayjs(displayMonth).month();
const currentYear = dayjs(displayMonth).year();
const isCurrentMonth = current.month() === currentMonth && current.year() === currentYear;
return (
<div
className={`calendar-date-cell ${hasTasks ? "has-tasks" : ""} ${
isCurrentDay ? "is-current-day" : ""
} ${isToday ? "is-today" : ""} ${!isCurrentMonth ? "other-month" : ""}`}
>
<div className="date-number">{current.date()}</div>
{hasTasks && <div className="task-dot"></div>}
</div>
);
};
const handleDateChange = (date, dateString) => {
if (onDateChange) {
// Arco Calendar passes a dayjs object
if (date && date.format) {
// Convert dayjs to Date object
const dateStr = date.format("YYYY-MM-DD");
const dateObj = new Date(dateStr + "T00:00:00");
if (!isNaN(dateObj.getTime())) {
onDateChange(dateObj);
}
} else if (dateString) {
// Fallback to dateString if available
const dateObj = new Date(dateString + "T00:00:00");
if (!isNaN(dateObj.getTime())) {
onDateChange(dateObj);
}
}
}
};
return (
<div className="module-calendar-task-wrapper">
<Calendar
panelWidth="300"
panel
defaultValue={formattedToday}
value={
selectedDate
? selectedDate.toISOString().split("T")[0]
: formattedToday
}
style={{ fontSize: "18px" }}
onChange={handleDateChange}
onPanelChange={(date) => {
// 当切换月份时更新displayMonth
if (date && date.format) {
const dateStr = date.format("YYYY-MM-DD");
setDisplayMonth(new Date(dateStr + "T00:00:00"));
}
}}
dateRender={dateRender}
/>
</div>
);
};
export default CalendarTaskModule;

View File

@@ -48,7 +48,7 @@
}
.task-type {
font-weight: bold;
font-weight: normal;
color: #1d2129;
}
@@ -99,18 +99,140 @@
display: flex;
align-items: center;
justify-content: flex-start;
/* 左侧状态圆点 */
&::before {
content: "";
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
width: 8px;
height: 8px;
border-radius: 50%;
background-color: #bfbfbf; /* 默认灰色 */
border: 2px solid #ffffff; /* 白色描边 */
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 阴影效果 */
box-sizing: content-box;
}
/* 已完成状态的圆点颜色 */
&.status-completed::before {
background-color: #52c41a; /* 绿色 */
}
/* 课程类型对应的颜色 */
&.course-type-复合能力课::before {
background-color: #ff7875; /* 红色 */
}
&.course-type-AI进阶课::before {
background-color: #ffc53d; /* 黄色 */
}
&.course-type-公共课::before {
background-color: #73d13d; /* 绿色 */
}
&.course-type-求职策略课::before {
background-color: #40a9ff; /* 蓝色 */
}
.module-tasks-item-info-avatar {
width: 32px;
height: 32px;
border-radius: 50%;
position: absolute;
top: 0;
left: 0;
&.arco-avatar {
width: 32px !important;
height: 32px !important;
border-radius: 50% !important;
position: absolute;
top: 0;
left: 32px;
background-color: #165dff !important;
color: #fff;
font-size: 14px;
display: flex !important;
align-items: center !important;
justify-content: center !important;
overflow: hidden;
.arco-avatar-image {
width: 100% !important;
height: 100% !important;
img {
width: 100% !important;
height: 100% !important;
object-fit: cover;
}
}
.arco-avatar-text {
font-size: 12px;
color: #fff;
}
}
/* 针对不同导师的头像调整 */
&.teacher-李奇 {
.arco-avatar-image img {
object-fit: cover;
object-position: 50% 0%;
transform: scale(1.4) translateX(-4px);
}
}
&.teacher-郭建辉 {
.arco-avatar-image img {
object-fit: cover;
object-position: center 0%;
}
}
&.teacher-赵志强 {
.arco-avatar-image img {
object-fit: cover;
object-position: center 0%;
}
}
&.teacher-李毅峰 {
.arco-avatar-image img {
object-fit: cover;
object-position: center 35%;
}
}
&.teacher-周伏波 {
.arco-avatar-image img {
object-fit: cover;
object-position: center 0%;
}
}
&.teacher-范雪娇 {
.arco-avatar-image img {
object-fit: cover;
object-position: center 0%;
}
}
&.teacher-孙应战 {
.arco-avatar-image img {
object-fit: contain;
transform: scale(2.5) translateX(1px);
object-position: center 40%;
}
}
&.teacher-魏立慧 {
.arco-avatar-image img {
object-fit: cover;
object-position: center 0%;
}
}
}
.module-tasks-item-info-teacher-name {
position: absolute;
left: 40px;
left: 72px;
font-size: 14px;
font-weight: 400;
color: #616065;
@@ -125,17 +247,20 @@
}
.module-tasks-item-content {
width: 100%;
width: calc(100% - 16px);
height: 64px;
margin-top: 5px;
margin-left: 16px;
box-sizing: border-box;
padding-left: 16px;
position: relative;
border-left: 1px dashed #bfbfbf;
display: flex;
justify-content: flex-end;
align-items: center;
&:not(.module-tasks-item-content-last) {
border-left: 2px dashed #d9d9d9 !important;
}
&::before {
content: "";
@@ -182,21 +307,19 @@
.module-tasks-item-content-info-duration {
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%);
right: 0px;
bottom: 0px;
font-size: 10px;
font-weight: 400;
color: #bfbfbf;
&::after {
&::before {
content: "";
position: absolute;
top: 50%;
left: -15px;
transform: translateY(-50%);
display: inline-block;
width: 12px;
height: 12px;
margin-right: 4px;
vertical-align: middle;
background-image: url("@/assets/images/TaskList/frame.png");
background-size: 100% 100%;
}

View File

@@ -37,10 +37,17 @@ const TaskList = ({ tasks = [], loading }) => {
</div>
) : (
<ul className="module-tasks-list">
{tasks.map((item, index) => (
{tasks.map((item, index) => {
if (item?.teacher === '刘杰') {
console.log('刘杰导师的课程数据:', item);
}
return (
<li key={item.id} className="module-tasks-item">
<div className="module-tasks-item-info">
<Avatar className="module-tasks-item-info-avatar" size="small">
<div className={`module-tasks-item-info ${item?.isCompleted ? 'status-completed' : ''} ${item?.courseCategory ? `course-type-${item.courseCategory}` : ''}`}>
<Avatar
className={`module-tasks-item-info-avatar teacher-${item?.teacherName || ''}`}
size="small"
>
{item?.teacherAvatar ? (
<img alt="avatar" src={item.teacherAvatar} />
) : (
@@ -48,7 +55,10 @@ const TaskList = ({ tasks = [], loading }) => {
)}
</Avatar>
<span className="module-tasks-item-info-teacher-name">
{item?.teacher || item?.teacherName || "未知教师"}
{item?.teacher || item?.teacherName || "未知"}导师
</span>
<span className="module-tasks-item-info-time">
{item?.startTime || "上午9:00"}
</span>
</div>
<div
@@ -61,11 +71,11 @@ const TaskList = ({ tasks = [], loading }) => {
<div className="module-tasks-item-content-info">
<p>
<span className="task-type">
{getTaskTypeText(item.type)}
{item?.courseCategory || '复合能力课'}
</span>
{item?.title}
</p>
<div>
<div style={{ fontWeight: 'bold' }}>
{item?.courseName}
<span className="module-tasks-item-content-info-duration">
{item?.duration}
</span>
@@ -78,7 +88,7 @@ const TaskList = ({ tasks = [], loading }) => {
</div>
</div>
</li>
))}
)})}
</ul>
)}
</div>

View File

@@ -100,20 +100,32 @@
font-weight: 400;
}
.project-cases-modal-horizontal-list {
/* 单元分类区域样式 */
.unit-category-section {
margin-bottom: 20px;
.unit-category-subtitle {
font-size: 14px;
color: #86909c;
margin-bottom: 12px;
font-weight: 400;
}
}
.project-cases-modal-horizontal-list {
width: 100%;
margin-top: 10px;
overflow-x: auto;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
align-items: center;
align-items: flex-start;
gap: 15px;
.high-count-list-item {
width: 220px;
.high-count-list-item {
width: 210px;
height: 82px;
background-color: #f7f8fa;
margin-right: 20px;
border-radius: 8px;
padding: 16px;
box-sizing: border-box;
@@ -185,7 +197,7 @@
> i {
width: 36px;
height: 36px;
background-image: url("@/assets/images/ProjectLibraryPage/class_icon.png");
background-image: url("https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/teach_sys_icon/recuWifMbjj7jH.png");
background-size: 100% 100%;
}