Files
ClassFeedback/temp_course.html
chengzi ad183beb83 feat: 第13周课评完成(32人)+ 课评检查 + 文件名修正
- 完成第13周所有班级课评(AICODE03/CSP03/Kitten04共32人)
- 修正Kitten04周五1900班文件名:Kitten-13 → Kitten04-13
- 更新周汇总:2026年第13周课评汇总.md
- 更新学生画像:多个班级学生profile.md
- 添加班级总结:9个班级的班级反馈
2026-05-31 20:47:23 +08:00

4598 lines
234 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html data-page="course_detail" data-layout="basic" class="layout--basic page--course_detail theme--light nojs" lang="zh" data-app="Hydro">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="chrome=1"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
<link rel="canonical" href="oj.qonnwolf.com/course/6975984d71e15346c9e8fdc2"> <meta name="theme-color" content="#56758f">
<title>课程详情 - 穹狼科创</title>
<style>
body {
--font-family: "Open Sans", "Open Sans", "Seravek", "Segoe UI", "Verdana", "PingFang SC", "Hiragino Sans GB", "Lantinghei SC", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans";
--code-font-family: "Source Code Pro", "monaco", "Source Code Pro", "Consolas", "Lucida Console", "monospace";
--font-ligatures: none !important;
}
.section{border-radius:10px}
#panel { display: flex; flex-direction: column; }
</style>
<link rel="stylesheet" media="all" href="/theme-4.58.0-beta.17.css">
<script>
var _htmlNode = document.documentElement;
_htmlNode.className = _htmlNode.className.replace(' nojs', ' hasjs');
var UiContext = '{"cdn_prefix":"/","url_prefix":"/","ws_prefix":"/","hydroacFeatures":[],"blspHost":"wss://ws.hydrooj.com","constantVersion":"eb180064","domainId":"system","domain":{"_id":"system","lower":"system","owner":1,"name":"\u7A79\u72FC\u79D1\u521B","bulletin":"# \u2B50\u6B22\u8FCE\u4F7F\u7528\u7A79\u72FC\u79D1\u521B\u5728\u7EBF\u5B66\u4E60\u8BC4\u6D4B\u7CFB\u7EDF\u2B50\\r\\n\\r\\n## \uD83C\uDF89\uFE0F \u8BAD\u7EC3\u9898\u5355\\r\\n\\r\\n## <a>GESP\uFF1A</a><a href=\\"/training/6870bbec7e50189ceb63a998\\" target=\\"_blank\\">\u4E00\u7EA7</a> | <a href=\\"/training/6870c2367e50189ceb63b4a5\\" target=\\"_blank\\">\u4E8C\u7EA7</a> | <a href=\\"/training/6870c8497e50189ceb63bd05\\" target=\\"_blank\\">\u4E09\u7EA7</a> | <a href=\\"/training/6870c9187e50189ceb63be4c\\" target=\\"_blank\\">\u56DB\u7EA7</a> | <a href=\\"/training/6870c9677e50189ceb63bea0\\" target=\\"_blank\\">\u4E94\u7EA7</a> | <a href=\\"/training/6870ca337e50189ceb63bf59\\" target=\\"_blank\\">\u516D\u7EA7</a> | <a href=\\"/training/6870caa37e50189ceb63bfa8\\" target=\\"_blank\\">\u4E03\u7EA7</a> | <a href=\\"/training/6870ccc37e50189ceb63c061\\" target=\\"_blank\\">\u516B\u7EA7</a>\\r\\n## <a>CSP-JS\uFF1A</a><a href=\\"/d/CSP_J1/\\" target=\\"_blank\\">\u521D\u8D5B</a> | <a href=\\"/training/686f293b7e50189ceb6312a4\\" target=\\"_blank\\">\u590D\u8D5B</a> \\r\\n\\r\\n---\\r\\n## \uD83C\uDF89\uFE0F \u62D3\u5C55\u8BAD\u7EC3\\r\\n\\r\\n### A\uFF1A<a href=\\"/training/686f1e417e50189ceb630e98\\" target=\\"_blank\\">\u987A\u5E8F\u7ED3\u6784</a> | <a href=\\"/training/686f1e937e50189ceb630ee6\\" target=\\"_blank\\">\u5206\u652F\u7ED3\u6784</a> | <a href=\\"/training/686f1f297e50189ceb630f24\\" target=\\"_blank\\">\u5FAA\u73AF\u7ED3\u6784</a> | <a href=\\"/training/686f1f587e50189ceb630f62\\" target=\\"_blank\\">\u7A77\u4E3E\u7B97\u6CD5</a> \\r\\n\\r\\n### B\uFF1A<a href=\\"/training/686f20057e50189ceb630fb6\\" target=\\"_blank\\">\u4E00\u7EF4\u6570\u7EC4</a> | <a href=\\"/training/686f20a77e50189ceb630fe8\\" target=\\"_blank\\">\u5B57\u7B26\u4E32</a> | <a href=\\"/training/686f20f07e50189ceb630ff2\\" target=\\"_blank\\">\u4E8C\u7EF4\u6570\u7EC4</a> | <a href=\\"/training/686f21347e50189ceb630ffb\\" target=\\"_blank\\">\u51FD\u6570</a> | <a href=\\"/training/686f21597e50189ceb631020\\" target=\\"_blank\\">\u7ED3\u6784\u4F53</a> | <a href=\\"/training/68fb217e65d6c0e8cf403f39\\" target=\\"_blank\\">\u6570\u636E\u6392\u5E8F</a>\\r\\n\\r\\n\\r\\n\\r\\n### C\uFF1A<a href=\\"/training/686f23487e50189ceb631156\\" target=\\"_blank\\">\u9012\u63A8\u4E0E\u9012\u5F52</a> | <a href=\\"/training/686f23687e50189ceb6311a0\\" target=\\"_blank\\">\u8D2A\u5FC3</a> | <a href=\\"/training/686f23927e50189ceb6311a7\\" target=\\"_blank\\">\u8FDB\u5236\u8F6C\u6362</a> | <a href=\\"/training/686f23b87e50189ceb6311c6\\" target=\\"_blank\\">\u9AD8\u7CBE\u5EA6</a> | <a href=\\"/training/686f25767e50189ceb63121e\\" target=\\"_blank\\">\u4E8C\u5206</a> | <a href=\\"/training/6915a5c367ceffb06f6af7fa\\" target=\\"_blank\\">\u5206\u6CBB\u7B97\u6CD5</a>\\r\\n\\r\\n### D\uFF1A<a href=\\"/training/686f24377e50189ceb6311f3\\" target=\\"_blank\\">\u6DF1\u5EA6\u4F18\u5148\u641C\u7D22</a> | <a href=\\"/training/686f25527e50189ceb631219\\" target=\\"_blank\\">\u5E7F\u5EA6\u4F18\u5148\u641C\u7D22</a> | <a href=\\"/training/68883b387e50189ceb68b539\\" target=\\"_blank\\">\u524D\u7F00\u548C\u5DEE\u5206</a> | <a href=\\"/training/686f26177e50189ceb631228\\" target=\\"_blank\\">\u52A8\u6001\u89C4\u5212</a> | <a href=\\"/training/686f26787e50189ceb63122e\\" target=\\"_blank\\">\u80CC\u5305</a> | <a href=\\"/training/68fb20fd65d6c0e8cf403f0c\\" target=\\"_blank\\">\u5176\u4ED6\u7B97\u6CD5</a>\\r\\n\\r\\n### E\uFF1A<a href=\\"/training/686f26b67e50189ceb631234\\" target=\\"_blank\\">\u56FE\u8BBA</a> | <a href=\\"/training/686f26e17e50189ceb63123c\\" target=\\"_blank\\">\u5E76\u67E5\u96C6</a> | <a href=\\"/training/686f27317e50189ceb631247\\" target=\\"_blank\\">\u533A\u95F4\u95EE\u9898</a> | <a href=\\"/training/686f27867e50189ceb631251\\" target=\\"_blank\\">\u6811\u53CA\u6811\u7684\u5E94\u7528</a> | <a href=\\"/training/686f27c17e50189ceb631257\\" target=\\"_blank\\">\u6570\u8BBA</a> | <a href=\\"/training/68fb219d65d6c0e8cf403f3a\\" target=\\"_blank\\">\u6570\u636E\u7ED3\u6784</a> \\r\\n---\\r\\n\\r\\n## \uD83C\uDF89\uFE0F <a href=\\"/d/Level_Test/\\" >\u6559\u5E08\u5B66\u751F\u80FD\u529B\u6D4B\u8BD5</a> \\r\\n\\r\\n---","roles":{"guest":"10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069377","default":"10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624474765150541316737","teacher":"10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831654949253049046476116983","su_teacher":"10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831654958476421083332343799","notstu":"10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069377","Other_Teacher":"10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831654838102077190290064261","AI":"10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831654810902468493655930865"},"avatar":"url:/file/2/qonnwolf-logo2.png","langs":"","share":"*","enableDownloadFirst":"on"},"SWConfig":{"preload":"","hosts":["http://oj.qonnwolf.com","https://oj.qonnwolf.com","oj.qonnwolf.com/","/"],"assets":[],"domains":[]}}';
var UserContext = '{"_id":339,"mail":"chengzi2508@bjcodemao.com","uname":"\u6A59\u5B50\u8001\u5E08","hashType":"hydro","priv":33555460,"regat":"2025-08-18T01:14:43.815Z","loginat":"2026-05-30T08:19:40.590Z","perm":"BigInt::10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831654958476421083332343799","role":"su_teacher","scope":"BigInt::-1","tfa":false,"authn":false,"group":["\u6559\u5E08\u56E2\u961F","339"],"domains":[],"viewLang":"zh","timeZone":"Asia/Shanghai","codeLang":"cc.cc14o2","codeTemplate":"","avatar":"url:/file/339/.avatar.jpg","qq":"","gender":"0","bio":"\u9752\uFF0C\u53D6\u4E4B\u4E8E\u84DD\u800C\u9752\u4E8E\u84DD\u3002\u51B0\uFF0C\u6C34\u4E3A\u4E4B\u800C\u5BD2\u4E8E\u6C34\u3002\\r\\n","school":"\u7F16\u7A0B\u732B\u5927\u5B66","studentId":"111","backgroundImage":"/components/profile/backgrounds/10.jpg","unreadMsg":0,"badge":"","pinnedDomains":[],"rounded":false,"skipAnimate":false,"showTimeAgo":true,"fontFamily":"Open Sans","codeFontFamily":"Source Code Pro","theme":"light","preferredEditorType":"sv","showInvisibleChar":false,"formatCode":true,"coin_now":6930,"coin_all":6940,"displayName":"","rpInfo":{"problem":259.0661269379282,"contest":1},"nAccept":705,"nSubmit":717,"rp":260.0661269379282,"rank":9,"level":8,"join":true,"avatarUrl":"/file/339/.avatar.jpg"}';
</script>
</head>
<body>
<script type="text/javascript" src="/resource/eb180064/entry.js"></script>
<script type="text/javascript" src="/resource/4.58.0-beta.17/lang-zh.js"></script>
<script type="text/javascript" src="/hydro-4.58.0-beta.17.js"></script>
<nav class="nav slideout-menu" id="menu">
<div class="row"><div class="columns clearfix">
<ol class="nav__list nav__list--main clearfix">
<li class="nav__list-item">
<a href="/"><img class="nav__logo" src="/qonnwolf.png"></a>
</li> <li class="nav__list-item">
<a href="/" class="nav__item">
首页
</a>
</li>
<li class="nav__list-item">
<a href="/course" class="nav__item nav--active">
课程
</a>
</li>
<li class="nav__list-item">
<a href="/p" class="nav__item">
题库
</a>
</li>
<li class="nav__list-item">
<a href="/training" class="nav__item">
训练
</a>
</li>
<li class="nav__list-item">
<a href="/contest" class="nav__item">
比赛
</a>
</li>
<li class="nav__list-item">
<a href="/homework" class="nav__item">
作业
</a>
</li>
<li class="nav__list-item">
<a href="/domain/dashboard" class="nav__item">
管理域
</a>
</li>
</ol>
<ol class="nav__list nav__list--secondary clearfix">
<li class="nav__list-item" data-dropdown-pos="bottom right" data-dropdown-custom-class="nav__dropdown" data-dropdown-target="#menu-nav-user" data-dropdown-disabledconstrainToWindow data-dropdown-trigger-desktop-only>
<a href="/user/339" class="nav__item">橙子老师 <span class="icon icon-expand_more nojs--hide"></span></a>
<ol class="dropdown-target menu" id="menu-nav-user">
<li class="menu__item">
<a href="/user/339" class="menu__link">
<span class="icon icon-account--circle"></span> 我的资料
</a>
</li>
<li class="menu__item">
<a href="/home/messages" class="menu__link">
<span class="icon icon-comment--multiple"></span> 站内消息
</a>
</li>
<li class="menu__seperator"></li>
<li class="menu__item">
<a href="/home/settings/domain" class="menu__link">
<span class="icon icon-web"></span> @ 穹狼科创
</a>
</li>
<li class="menu__seperator"></li>
<li class="menu__item">
<a href="/home/settings/account" class="menu__link">
<span class="icon icon-wrench"></span> 账户设置
</a>
</li>
<li class="menu__item">
<a href="/home/settings/preference" class="menu__link">
<span class="icon icon-sliders"></span> 偏好设置
</a>
</li>
<li class="menu__item">
<a href="/home/security" class="menu__link">
<span class="icon icon-security"></span> 安全设置
</a>
</li>
<li class="menu__seperator"></li>
<li class="menu__item">
<a href="/home/domain" class="menu__link">
<span class="icon icon-web"></span> 我的域
</a>
</li>
<li class="menu__seperator"></li>
<li class="menu__item">
<a href="/logout" class="menu__link" name="nav_logout">
<span class="icon icon-logout"></span> 登出
</a>
</li>
</ol>
</li>
</ol>
</div></div>
</nav>
<nav class="nav--shadow"></nav>
<div class="slideout-panel" id="panel">
<div class="slideout-overlay"></div>
<div class="header--mobile">
<div class="row"><div class="columns clearfix">
<div class="float-left">
<a class="header--mobile__domain" href="/" target="_self">
<img src="/qonnwolf.png">
</a>
</div>
<div class="float-right">
<button type="button" class="header__hamburger">
<div class="hamburger hamburger--spin">
<span class="hamburger-box">
<span class="hamburger-inner"></span>
</span>
</div>
</button>
</div>
</div></div>
</div>
<div class="main">
<style>
/* 课程详情页样式 - B0.4 参考计蒜客设计 */
/* 课时卡片容器 */
.period-card {
background: #fff;
border-radius: 5px;
box-shadow: 0 0 8px 0 rgba(139, 154, 174, 0.15);
margin-bottom: 24px;
overflow: hidden;
}
.period-inner {
border: none;
position: relative;
}
/* 课时头部 */
.period-header {
width: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
padding: 24px 24px 16px 48px;
cursor: pointer;
position: relative;
user-select: none;
}
.period-header:hover {
background: #fafbfc;
}
/* 展开箭头 */
.period-toggle {
position: absolute;
top: 28px;
left: 16px;
color: #999;
transition: transform 0.3s cubic-bezier(0.46, 1, 0.23, 1.52);
font-size: 0.8rem;
}
.period-card.expanded .period-toggle {
transform: rotate(90deg);
}
/* 元数据区域 */
.period-metadata {
width: 100%;
}
.period-title {
font-size: 20px;
line-height: 28px;
font-weight: 500;
color: #555;
margin: 0 0 4px 0;
}
.period-description {
line-height: 1.5;
margin: 4px 0 16px 0;
color: #777;
font-size: 14px;
}
/* 进度条 */
.period-progress {
margin-top: 8px;
position: relative;
height: 8px;
}
.progress-bar-outer {
background: #f2f4f7;
border-radius: 100px;
height: 8px;
position: relative;
overflow: visible;
box-shadow: inset 0 1px 1px 0 rgba(139, 154, 174, 0.3);
}
.progress-bar-inner {
position: absolute;
left: 0;
top: 0;
height: 100%;
border-radius: 100px;
background: linear-gradient(90deg, #41b146, #67d757);
transition: width 0.6s ease;
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
min-width: max-content;
}
.progress-bar-text {
height: 14px;
line-height: 14px;
padding: 0 6px;
background: #41b146;
margin: 0;
border-radius: 5px;
text-align: center;
font-size: 12px;
color: #fff;
font-weight: 500;
white-space: nowrap;
position: relative;
}
/* 编辑和回放按钮 */
.period-actions {
position: absolute;
right: 24px;
top: 24px;
display: flex;
gap: 8px;
z-index: 1;
}
.period-actions .btn-replay {
height: 32px;
padding: 0 12px;
border-radius: 5px;
background: #41b146;
color: #fff;
display: flex;
align-items: center;
gap: 4px;
font-size: 13px;
font-weight: 500;
text-decoration: none;
}
.period-actions .btn-replay:hover {
background: #4ebe53;
}
.period-actions .btn-edit {
height: 32px;
padding: 0 12px;
border-radius: 5px;
background: #f5f5f5;
color: #666;
display: flex;
align-items: center;
font-size: 13px;
text-decoration: none;
}
.period-actions .btn-edit:hover {
background: #e8e8e8;
}
/* 课时内容区域 */
.period-body {
display: none;
padding: 0 24px 24px 24px;
}
.period-card.expanded .period-body {
display: block;
}
.period-divider {
height: 1px;
background: #cfcfcf;
margin: 0 0 16px 24px;
}
/* 章节列表 */
.chapter-list {
list-style: none;
padding: 0;
margin: 0 0 0 24px;
}
.chapter-item {
padding: 0 0 0 24px;
margin-top: 24px;
}
.chapter-item:first-child {
margin-top: 0;
}
.chapter-header .chapter-title {
color: #41b146;
font-size: 16px;
font-weight: 600;
line-height: 24px;
margin-bottom: 8px;
}
/* 课时内容列表 */
.lesson-list {
list-style: none;
padding: 0;
margin: 0;
}
.lesson-item {
box-sizing: border-box;
border-radius: 5px;
background: #f2f4f7;
margin-top: 10px;
padding: 12px 16px;
display: flex;
align-items: center;
justify-content: space-between;
cursor: pointer;
transition: background 0.15s;
}
.lesson-item:first-child {
margin-top: 0;
}
.lesson-item:hover {
background: #e8ecf2;
}
.lesson-item a {
flex: 1;
display: flex;
align-items: center;
gap: 10px;
text-decoration: none;
color: #333;
}
.lesson-item .lesson-type {
font-size: 0.75rem;
color: #888;
background: #e0e4e8;
padding: 2px 8px;
border-radius: 4px;
font-family: system-ui;
}
.lesson-item .lesson-name {
font-size: 14px;
color: #333;
}
/* 完成状态图标 - 圆形徽章样式 */
.lesson-status {
width: 22px;
height: 22px;
min-width: 22px;
min-height: 22px;
max-width: 22px;
max-height: 22px;
border-radius: 50%;
flex: none;
flex-shrink: 0;
flex-grow: 0;
margin-left: 12px;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: bold;
text-decoration: none;
transition: transform 0.15s, box-shadow 0.15s;
box-sizing: border-box;
}
.lesson-status:hover {
transform: scale(1.1);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
}
/* 完全正确 - 绿色 */
.lesson-status.status-ac {
background: #52c41a;
color: #fff;
}
/* 错误 - 红色 */
.lesson-status.status-wa {
background: #f5222d;
color: #fff;
}
/* 部分正确 - 黄色/橙色 */
.lesson-status.status-pa {
background: #faad14;
color: #fff;
}
/* 未做 - 灰色空心圆 */
.lesson-status.status-pending {
background: transparent;
border: 2px solid #d1d8e4;
color: #d1d8e4;
font-size: 10px;
}
/* 未关联提示 */
.hw-empty {
color: #999;
font-size: 13px;
padding: 12px 16px;
background: #f9f9f9;
border-radius: 5px;
}
.hw-empty a {
color: #1890ff;
text-decoration: none;
}
/* 锁定状态(未加入课程) */
.period-card.locked .period-header {
cursor: default;
}
.period-card.locked .period-header:hover {
background: transparent;
}
.period-card.locked .period-toggle {
color: #ccc;
cursor: not-allowed;
}
.period-card.locked .period-body {
display: none !important;
}
/* 深色主题锁定状态 */
html.theme--dark .period-card.locked .period-header:hover,
.dark .period-card.locked .period-header:hover {
background: transparent !important;
}
html.theme--dark .period-card.locked .period-toggle,
.dark .period-card.locked .period-toggle {
color: #555 !important;
}
.hw-empty a:hover {
text-decoration: underline;
}
/* 提示信息 */
.notice-box {
padding: 16px 20px;
background: #e6f7ff;
border: 1px solid #91d5ff;
border-radius: 5px;
margin-bottom: 24px;
color: #0050b3;
font-size: 14px;
}
/* 空状态 */
.empty-state {
text-align: center;
padding: 60px 20px;
color: #999;
font-size: 16px;
}
/* 作业分组标题 */
.hw-group {
margin-bottom: 24px;
}
.hw-group:last-child {
margin-bottom: 0;
}
.hw-group__title {
font-size: 14px;
font-weight: 600;
color: #555;
margin: 0 0 10px 0;
display: flex;
align-items: center;
gap: 6px;
}
.hw-group__title.muted {
color: #bbb;
}
/* ========== 用户筛选面板样式(复用训练模块) ========== */
.training__users {
max-height: calc(100vh - 100px);
overflow-y: auto;
}
.training__user-list {
max-height: 400px;
overflow-y: auto;
}
.training__user-item {
display: flex !important;
align-items: center !important;
gap: 8px;
}
.training__user-avatar {
width: 24px;
height: 24px;
border-radius: 50%;
flex-shrink: 0;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
background: #e0e0e0;
}
.training__user-avatar-img {
width: 100%;
height: 100%;
object-fit: cover;
}
.training__user-avatar-placeholder {
font-size: 11px;
font-weight: 600;
color: #666;
}
.training__user-name {
flex: 1;
font-size: 13px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.training__users .menu__item--active .menu__link {
background: #e6f4ea;
border-left: 3px solid #41b146;
color: #1e7e34;
font-weight: 600;
}
/* ======== 成绩面板浮层样式 ======== */
.gv-modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 9999;
display: none;
align-items: center;
justify-content: center;
}
.gv-modal-content {
background: #fff;
width: 90%;
max-width: 1000px;
max-height: 90vh;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
display: flex;
flex-direction: column;
overflow: hidden;
}
.gv-modal-header {
padding: 16px 20px;
border-bottom: 1px solid #eee;
display: flex;
justify-content: space-between;
align-items: center;
background: #fafafa;
}
.gv-modal-body {
padding: 20px;
overflow-y: auto;
flex: 1;
}
/* 暗色主题重设计 */
html.theme--dark,
.theme--dark,
.dark {
--course-dark-bg: #121212;
--course-dark-surface: #1e1e1e;
--course-dark-surface-strong: #2d2d2d;
--course-dark-line: #333333;
--course-dark-line-strong: #444444;
--course-dark-text: #e0e0e0;
--course-dark-muted: #aaaaaa;
--course-accent: #52c41a;
}
html.theme--dark .period-card,
.theme--dark .period-card,
.dark .period-card {
background: var(--course-dark-surface) !important;
border: 1px solid var(--course-dark-line);
border-radius: 8px;
box-shadow: none !important;
}
html.theme--dark .period-card.expanded,
.theme--dark .period-card.expanded,
.dark .period-card.expanded {
border-color: var(--course-dark-line-strong);
}
html.theme--dark .period-header,
.theme--dark .period-header,
.dark .period-header {
background: transparent !important;
border-bottom: 1px solid transparent;
}
html.theme--dark .period-header:hover,
.theme--dark .period-header:hover,
.dark .period-header:hover {
background: var(--course-dark-surface-strong) !important;
}
html.theme--dark .period-card.expanded .period-header,
.theme--dark .period-card.expanded .period-header,
.dark .period-card.expanded .period-header {
border-bottom-color: var(--course-dark-line);
}
html.theme--dark .period-toggle,
.theme--dark .period-toggle,
.dark .period-toggle {
top: 25px;
left: 15px;
width: 22px;
height: 22px;
border-radius: 4px;
background: var(--course-dark-surface-strong);
border: 1px solid var(--course-dark-line);
color: var(--course-dark-muted);
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 10px;
}
html.theme--dark .period-card.locked .period-toggle,
.theme--dark .period-card.locked .period-toggle,
.dark .period-card.locked .period-toggle {
background: transparent;
border-color: var(--course-dark-line);
color: var(--course-dark-line-strong) !important;
}
html.theme--dark .period-title,
.theme--dark .period-title,
.dark .period-title {
color: var(--course-dark-text) !important;
letter-spacing: normal;
}
html.theme--dark .period-description,
.theme--dark .period-description,
.dark .period-description {
color: var(--course-dark-muted) !important;
}
html.theme--dark .progress-bar-outer,
.theme--dark .progress-bar-outer,
.dark .progress-bar-outer {
background: var(--course-dark-line) !important;
box-shadow: none;
}
html.theme--dark .progress-bar-inner,
.theme--dark .progress-bar-inner,
.dark .progress-bar-inner {
background: var(--course-accent);
box-shadow: none;
}
html.theme--dark .progress-bar-text,
.theme--dark .progress-bar-text,
.dark .progress-bar-text {
background: var(--course-accent);
box-shadow: none;
}
html.theme--dark .period-body,
html.theme--dark .chapter-list,
html.theme--dark .chapter-item,
html.theme--dark .hw-group,
.theme--dark .period-body,
.theme--dark .chapter-list,
.theme--dark .chapter-item,
.theme--dark .hw-group,
.dark .period-body,
.dark .chapter-list,
.dark .chapter-item,
.dark .hw-group {
background: transparent !important;
}
html.theme--dark .period-divider,
.theme--dark .period-divider,
.dark .period-divider {
background: var(--course-dark-line) !important;
}
html.theme--dark .hw-group__title,
.theme--dark .hw-group__title,
.dark .hw-group__title {
color: var(--course-dark-text) !important;
}
html.theme--dark .lesson-item,
.theme--dark .lesson-item,
.dark .lesson-item {
background: var(--course-dark-surface-strong) !important;
border: 1px solid var(--course-dark-line);
box-shadow: none;
transition: transform 0.16s ease, border-color 0.16s ease, background 0.16s ease;
}
html.theme--dark .lesson-item:hover,
.theme--dark .lesson-item:hover,
.dark .lesson-item:hover {
background: #333 !important;
border-color: var(--course-dark-line-strong);
transform: translateY(-1px);
}
html.theme--dark .lesson-item a,
html.theme--dark .lesson-item .lesson-name,
html.theme--dark .lesson-name,
.theme--dark .lesson-item a,
.theme--dark .lesson-item .lesson-name,
.theme--dark .lesson-name,
.dark .lesson-item a,
.dark .lesson-item .lesson-name,
.dark .lesson-name {
color: var(--course-dark-text) !important;
}
html.theme--dark .lesson-item .lesson-type,
.theme--dark .lesson-item .lesson-type,
.dark .lesson-item .lesson-type {
background: var(--course-dark-line) !important;
border: 1px solid var(--course-dark-line-strong);
color: var(--course-dark-text) !important;
}
html.theme--dark .lesson-item [style*="color: #999"],
.theme--dark .lesson-item [style*="color: #999"],
.dark .lesson-item [style*="color: #999"] {
color: var(--course-dark-muted) !important;
}
html.theme--dark .lesson-status.status-pending,
.theme--dark .lesson-status.status-pending,
.dark .lesson-status.status-pending {
border-color: var(--course-dark-line-strong) !important;
color: var(--course-dark-muted) !important;
}
html.theme--dark .lesson-status:hover,
.theme--dark .lesson-status:hover,
.dark .lesson-status:hover {
box-shadow: none;
}
html.theme--dark .notice-box,
.theme--dark .notice-box,
.dark .notice-box {
background: rgba(24, 144, 255, 0.1) !important;
border-color: rgba(24, 144, 255, 0.3) !important;
color: #69c0ff !important;
box-shadow: none;
}
html.theme--dark .hw-empty,
.theme--dark .hw-empty,
.dark .hw-empty,
html.theme--dark .empty-state,
.theme--dark .empty-state,
.dark .empty-state {
color: var(--course-dark-muted) !important;
}
html.theme--dark .period-actions .btn-edit,
.theme--dark .period-actions .btn-edit,
.dark .period-actions .btn-edit {
background: var(--course-dark-surface-strong);
border: 1px solid var(--course-dark-line);
color: var(--course-dark-text);
}
html.theme--dark .period-actions .btn-edit:hover,
.theme--dark .period-actions .btn-edit:hover,
.dark .period-actions .btn-edit:hover {
background: #444;
color: #fff;
}
html.theme--dark .training__users,
.theme--dark .training__users,
.dark .training__users {
border: 1px solid var(--course-dark-line);
background: var(--course-dark-surface);
}
html.theme--dark .training__users .section__header,
.theme--dark .training__users .section__header,
.dark .training__users .section__header {
border-color: var(--course-dark-line) !important;
background: var(--course-dark-surface-strong);
}
html.theme--dark #groupFilter,
html.theme--dark #userSearch,
.theme--dark #groupFilter,
.theme--dark #userSearch,
.dark #groupFilter,
.dark #userSearch {
background: var(--course-dark-surface) !important;
border-color: var(--course-dark-line) !important;
color: var(--course-dark-text) !important;
}
html.theme--dark .training__users .menu__item--active .menu__link,
.theme--dark .training__users .menu__item--active .menu__link,
.dark .training__users .menu__item--active .menu__link {
background: rgba(82, 196, 26, 0.1) !important;
border-left-color: var(--course-accent) !important;
color: var(--course-accent) !important;
}
html.theme--dark .training__user-avatar,
.theme--dark .training__user-avatar,
.dark .training__user-avatar {
background: var(--course-dark-line) !important;
box-shadow: none;
}
html.theme--dark .gv-modal-overlay,
.theme--dark .gv-modal-overlay,
.dark .gv-modal-overlay {
background: rgba(0, 0, 0, 0.7);
backdrop-filter: none;
}
html.theme--dark .gv-modal-content,
.theme--dark .gv-modal-content,
.dark .gv-modal-content {
background: var(--course-dark-surface);
border: 1px solid var(--course-dark-line);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
}
html.theme--dark .gv-modal-header,
.theme--dark .gv-modal-header,
.dark .gv-modal-header {
background: var(--course-dark-surface-strong);
border-color: var(--course-dark-line);
}
html.theme--dark #gv-global-title,
.theme--dark #gv-global-title,
.dark #gv-global-title,
html.theme--dark #gv-loading,
.theme--dark #gv-loading,
.dark #gv-loading {
color: var(--course-dark-text) !important;
}
html.theme--dark #gv-empty,
.theme--dark #gv-empty,
.dark #gv-empty {
color: var(--course-dark-muted) !important;
}
html.theme--dark #gv-group-filter,
.theme--dark #gv-group-filter,
.dark #gv-group-filter {
background: var(--course-dark-surface) !important;
border-color: var(--course-dark-line) !important;
color: var(--course-dark-text) !important;
}
html.theme--dark .gv-modal-header label,
.theme--dark .gv-modal-header label,
.dark .gv-modal-header label {
color: var(--course-dark-text) !important;
}
html.theme--dark #gv-table,
.theme--dark #gv-table,
.dark #gv-table {
background: var(--course-dark-surface);
border: 1px solid var(--course-dark-line);
}
html.theme--dark #gv-table th,
.theme--dark #gv-table th,
.dark #gv-table th {
background: var(--course-dark-surface-strong) !important;
border-color: var(--course-dark-line) !important;
color: var(--course-dark-text) !important;
}
html.theme--dark #gv-table tbody tr,
.theme--dark #gv-table tbody tr,
.dark #gv-table tbody tr {
border-bottom-color: var(--course-dark-line) !important;
}
html.theme--dark #gv-table tbody tr:hover,
.theme--dark #gv-table tbody tr:hover,
.dark #gv-table tbody tr:hover {
background: var(--course-dark-surface-strong) !important;
}
html.theme--dark #gv-table tbody td:last-child,
.theme--dark #gv-table tbody td:last-child,
.dark #gv-table tbody td:last-child {
color: var(--course-dark-text) !important;
}
@media (max-width: 640px) {
html.theme--dark .period-header,
.theme--dark .period-header,
.dark .period-header {
padding-right: 18px;
}
html.theme--dark .period-actions,
.theme--dark .period-actions,
.dark .period-actions {
position: static;
margin-top: 12px;
}
}
</style>
<!-- 成绩面板独立容器 -->
<div class="gv-modal-overlay" id="gv-global-overlay">
<div class="gv-modal-content">
<div class="gv-modal-header" style="flex-wrap: nowrap;">
<h3
style="margin: 0; font-size: 1.2rem; color: #333; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 40%;"
id="gv-global-title">📊 章节成绩单</h3>
<div style="display: flex; align-items: center; gap: 10px; flex-shrink: 0;">
<select id="gv-group-filter"
style="font-size: 0.85rem; padding: 4px 6px; border-radius: 4px; border: 1px solid #ccc; background: #fff; cursor: pointer; max-width: 140px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden;">
<option value="">全部小组</option>
<option value="克力周六1630CSP06">克力周六1630CSP06</option>
<option value="教师团队">教师团队</option>
<option value="杰森周日1045CSP06">杰森周日1045CSP06</option>
<option value="邓子周日0830CSP05">邓子周日0830CSP05</option>
<option value="邓子周日1400CSP05">邓子周日1400CSP05</option>
</select>
<label
style="font-size: 0.85rem; display: flex; align-items: center; gap: 4px; cursor: pointer; margin: 0; color: #666; white-space: nowrap;">
<input type="checkbox" id="gv-hide-teachers" checked> 过滤老师
</label>
<button class="rounded primary button"
style="font-size: 0.85rem; padding: 4px 12px !important; margin: 0; white-space: nowrap; height: auto !important; line-height: 1.5 !important; min-width: 0 !important;"
onclick="window.CourseGradeViewer.exportCSV()">导出 CSV</button>
<button class="rounded button"
style="font-size: 0.85rem; padding: 4px 12px !important; margin: 0; white-space: nowrap; height: auto !important; line-height: 1.5 !important; min-width: 0 !important;"
onclick="window.CourseGradeViewer.close()">关闭</button>
</div>
</div>
<div class="gv-modal-body">
<div id="gv-loading" style="text-align: center; color: #666; padding: 40px;">
⏳ 正在拉取各作业成绩数据以进行合并计算,请稍候...
</div>
<div id="gv-empty" style="text-align: center; color: #999; padding: 40px; display: none;">
暂无成绩数据
</div>
<div style="overflow-x: auto;">
<table class="data-table" id="gv-table" style="display: none; min-width: 100%; border-collapse: collapse;">
<thead>
<tr id="gv-thead-tr">
<th>序号</th>
<th>姓名</th>
<!-- 动态插入作业表头 -->
<th>总分</th>
</tr>
</thead>
<tbody id="gv-tbody">
</tbody>
</table>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
var courseId = '6975984d71e15346c9e8fdc2';
var storageKey = 'course_expanded_' + courseId;
function getExpanded() {
try {
return JSON.parse(localStorage.getItem(storageKey)) || {};
} catch (e) { return {}; }
}
function saveExpanded(data) {
try {
localStorage.setItem(storageKey, JSON.stringify(data));
} catch (e) { }
}
// 初始化展开状态 (每次 PJAX 更新后也需要调用)
function initExpanded() {
var expanded = getExpanded();
document.querySelectorAll('.period-card').forEach(function (card) {
var id = card.dataset.id;
if (expanded[id]) {
card.classList.add('expanded');
}
});
}
// 首次初始化
initExpanded();
// 自动滚动到选中的用户(不使用 scrollIntoView 可以防止外层页面跳转)
var scrollKey = 'course_user_scroll_' + courseId;
function restoreScroll() {
var userList = document.getElementById('userList');
if (!userList) return;
var savedScroll = sessionStorage.getItem(scrollKey);
if (savedScroll !== null) {
userList.scrollTop = parseInt(savedScroll, 10);
} else {
var activeItem = userList.querySelector('.menu__item--active');
if (activeItem) {
// 手动计算局部滚动位置将选中项居中,避免外层窗口跳动
var parentRect = userList.getBoundingClientRect();
var childRect = activeItem.getBoundingClientRect();
userList.scrollTop += childRect.top - parentRect.top - (parentRect.height / 2) + (childRect.height / 2);
}
}
}
// 初始化调用一次滚动还原
restoreScroll();
// 在点击时立刻保存当前的滚动条位置,防止局部刷新后丢失
document.addEventListener('click', function (e) {
if (e.target.closest('#userList .menu__link')) {
var userList = document.getElementById('userList');
if (userList) {
sessionStorage.setItem(scrollKey, userList.scrollTop);
}
}
});
// 监听 HydroOJ 原生 PJAX 成功事件(页面局部刷新后恢复展开状态和列表位置)
if (window.$) {
$(document).on('pjax:success pjax:end', function () {
initExpanded();
restoreScroll();
});
} else {
document.addEventListener('pjax:success', function () {
initExpanded();
restoreScroll();
});
}
// 使用事件代理绑定展开/收缩点击事件 (这样即使 DOM 被 PJAX 替换,事件依然有效)
document.addEventListener('click', function (e) {
var header = e.target.closest('.period-header');
if (!header) return;
if (e.target.tagName === 'A' || e.target.closest('a')) return;
var card = header.closest('.period-card');
if (!card || card.classList.contains('locked')) return;
var id = card.dataset.id;
var exp = getExpanded();
card.classList.toggle('expanded');
exp[id] = card.classList.contains('expanded');
saveExpanded(exp);
});
// ========== 用户组筛选和搜索功能 (纯前端 DOM 过滤) ==========
var groupFilter = document.getElementById('groupFilter');
var userSearch = document.getElementById('userSearch');
// ========== 保存 / 恢复筛选状态 ==========
var savedSearchKey = 'course_user_search_' + courseId;
var savedGroupKey = 'course_group_filter_' + courseId;
if (userSearch && sessionStorage.getItem(savedSearchKey) !== null) {
userSearch.value = sessionStorage.getItem(savedSearchKey);
}
if (groupFilter && sessionStorage.getItem(savedGroupKey) !== null) {
groupFilter.value = sessionStorage.getItem(savedGroupKey);
}
function filterUsers() {
var userList = document.getElementById('userList');
if (!userList) return;
var selectedGroup = groupFilter ? groupFilter.value : '';
var searchText = userSearch ? userSearch.value.toLowerCase().trim() : '';
var items = userList.querySelectorAll('.menu__item');
items.forEach(function (item) {
var groups = item.dataset.groups ? item.dataset.groups.split(',') : [];
var uname = item.dataset.uname || '';
var displayname = item.dataset.displayname || '';
var uid = item.dataset.uid || '';
var groupMatch = !selectedGroup || groups.indexOf(selectedGroup) !== -1;
var searchMatch = !searchText ||
uname.indexOf(searchText) !== -1 ||
displayname.indexOf(searchText) !== -1 ||
uid.indexOf(searchText) !== -1;
if (groupMatch && searchMatch) {
item.style.display = '';
} else {
item.style.display = 'none';
}
});
}
if (groupFilter) {
groupFilter.addEventListener('change', function () {
sessionStorage.setItem(savedGroupKey, this.value);
filterUsers();
});
}
if (userSearch) {
userSearch.addEventListener('input', function () {
sessionStorage.setItem(savedSearchKey, this.value);
filterUsers();
});
}
// ========== 初始化时进行一次过滤以确保恢复了状态 ==========
filterUsers();
// 监听左侧边栏高亮状态更新
document.addEventListener('click', function (e) {
var link = e.target.closest('#userList .menu__link');
if (!link) return;
var userList = document.getElementById('userList');
if (userList) {
userList.querySelectorAll('.menu__item').forEach(function (item) {
item.classList.remove('menu__item--active');
});
link.closest('.menu__item').classList.add('menu__item--active');
}
});
});
// 注入全局可用的成绩查询逻辑
window.CourseGradeViewer = {
overlay: null,
currentHomeworks: [],
rawRows: [],
loaded: false,
sectionName: '',
// 注入用户UID到所在小组的映射
userGroups: {
"5": ["教师团队", "5", ],
"6": ["教师团队", "6", ],
"7": ["教师团队", "7", ],
"8": ["教师团队", "8", ],
"18": ["教师团队", "18", ],
"20": ["克力周六1630CSP06", "20", ],
"23": ["23", ],
"29": ["杰森周日1045CSP06", "29", ],
"30": ["克力周六1630CSP06", "30", ],
"35": ["克力周六1630CSP06", "35", ],
"44": ["克力周六1630CSP06", "44", ],
"47": ["克力周六1630CSP06", "47", ],
"65": ["克力周六1630CSP06", "65", ],
"97": ["邓子周日0830CSP05", "97", ],
"99": ["邓子周日1400CSP05", "99", ],
"114": ["邓子周日0830CSP05", "114", ],
"117": ["邓子周日0830CSP05", "117", ],
"143": ["克力周六1630CSP06", "143", ],
"147": ["邓子周日1400CSP05", "147", ],
"148": ["148", ],
"161": ["克力周六1630CSP06", "161", ],
"210": ["邓子周日0830CSP05", "210", ],
"269": ["邓子周日1400CSP05", "269", ],
"306": ["教师团队", "306", ],
"419": ["克力周六1630CSP06", "419", ],
"508": ["教师团队", "508", ],
},
// 注入已报名用户信息确保没有成绩的学生也显示0分
enrolledUsers: {
"5": "邓子老师",
"6": "克力老师",
"7": "六六老师",
"8": "茄子老师",
"18": "菠萝老师",
"20": "徐纯熙",
"23": "李宝桢",
"29": "李伯贤",
"30": "梁睿朗",
"35": "陆闻汐",
"44": "柯欣贝",
"47": "刘毅潇",
"65": "刘浩宇",
"97": "忧郁刘鹏",
"99": "袁中和",
"114": "旷家昊",
"117": "崔诺徽",
"143": "黄振轩",
"147": "朱铠骏",
"148": "夏江南",
"161": "林汪霖",
"210": "张祺琪",
"269": "黄柏淼",
"306": "坦克老师",
"419": "邢致远",
"508": "杰森老师",
},
// 全局映射图存入全局变量以便调取
sectionHWMap: {
"69aa506a27e54d3ad7ed7aae": [
{ id: "69aa7d6d27e54d3ad7ed9098", name: "📝 课堂练习" },
{ id: "69aa7dad27e54d3ad7ed9190", name: "📋 课后作业" },
{ id: "69aa807f27e54d3ad7ed93fc", name: "🚀 拓展练习" },
],
"69aa507a27e54d3ad7ed7aaf": [
{ id: "69ad011b27e54d3ad7ef50c9", name: "📝 课堂练习" },
{ id: "69ad011d27e54d3ad7ef50dc", name: "📋 课后作业" },
{ id: "69ad011f27e54d3ad7ef50ef", name: "🚀 拓展练习" },
],
"69aa508227e54d3ad7ed7ab0": [
{ id: "69ad011b27e54d3ad7ef50ca", name: "📝 课堂练习" },
{ id: "69ad011d27e54d3ad7ef50dd", name: "📋 课后作业" },
{ id: "69ad012027e54d3ad7ef50f0", name: "🚀 拓展练习" },
],
"69bcf81f8f8791c6f4b1fd4b": [
{ id: "69ad011e27e54d3ad7ef50de", name: "📝 课堂练习" },
{ id: "68eb17067fc8d7332da234fd", name: "📋 课后作业" },
],
"69aa508a27e54d3ad7ed7ab1": [
{ id: "69ad011b27e54d3ad7ef50cb", name: "📝 课堂练习" },
{ id: "69ad012027e54d3ad7ef50f1", name: "📋 课后作业" },
],
"69aa509227e54d3ad7ed7ab2": [
{ id: "69ad011c27e54d3ad7ef50cc", name: "📝 课堂练习" },
{ id: "69ad011e27e54d3ad7ef50df", name: "📋 课后作业" },
{ id: "69ad012027e54d3ad7ef50f2", name: "🚀 拓展练习" },
],
"69aa509a27e54d3ad7ed7ab3": [
{ id: "69ad011c27e54d3ad7ef50cd", name: "📝 课堂练习" },
{ id: "69ad011e27e54d3ad7ef50e0", name: "📋 课后作业" },
{ id: "69ad012027e54d3ad7ef50f3", name: "🚀 拓展练习" },
],
"69aa50a427e54d3ad7ed7ab4": [
{ id: "69ad011c27e54d3ad7ef50ce", name: "📝 课堂练习" },
{ id: "69ad011e27e54d3ad7ef50e1", name: "📋 课后作业" },
{ id: "69ad012027e54d3ad7ef50f4", name: "🚀 拓展练习" },
],
"69aa50b727e54d3ad7ed7ab6": [
{ id: "69ad011c27e54d3ad7ef50cf", name: "📝 课堂练习" },
{ id: "69ad011e27e54d3ad7ef50e2", name: "📋 课后作业" },
{ id: "69ad012027e54d3ad7ef50f5", name: "🚀 拓展练习" },
],
"69aa50c127e54d3ad7ed7ab7": [
{ id: "69ad011c27e54d3ad7ef50d0", name: "📝 课堂练习" },
],
"69aa50da27e54d3ad7ed7ab8": [
{ id: "6a068f3b1b95441efeea76de", name: "📝 课堂练习" },
{ id: "6a06a2ef1b95441efeea77b3", name: "📋 课后作业" },
],
"69aa50e227e54d3ad7ed7ab9": [
{ id: "69ad011c27e54d3ad7ef50d2", name: "📝 课堂练习" },
{ id: "69ad011e27e54d3ad7ef50e5", name: "📋 课后作业" },
],
"69aa50eb27e54d3ad7ed7aba": [
{ id: "69ad011c27e54d3ad7ef50d3", name: "📝 课堂练习" },
],
"69aa510427e54d3ad7ed7abb": [
{ id: "69ad011c27e54d3ad7ef50d4", name: "📝 课堂练习" },
{ id: "69ad011f27e54d3ad7ef50e7", name: "📋 课后作业" },
{ id: "69ad012127e54d3ad7ef50fa", name: "🚀 拓展练习" },
],
"69aa511727e54d3ad7ed7abc": [
],
"69aa512027e54d3ad7ed7abd": [
],
"69f423390ba22cb8a6853e3b": [
],
"69aa512927e54d3ad7ed7abe": [
],
"69aa513227e54d3ad7ed7abf": [
],
"69aa513e27e54d3ad7ed7ac0": [
],
"69b51cc0947e4b9371843ec5": [
{ id: "69b51cee947e4b9371843f27", name: "📝 课堂练习" },
],
},
openGlobalPanel(sectionId, title) {
if (!this.overlay) {
this.overlay = document.getElementById('gv-global-overlay');
// 点击遮罩层关闭
this.overlay.addEventListener('click', (e) => {
if (e.target === this.overlay) this.close();
});
document.getElementById('gv-hide-teachers').addEventListener('change', () => {
this.renderTable();
});
document.getElementById('gv-group-filter').addEventListener('change', () => {
this.renderTable();
});
}
this.currentHomeworks = this.sectionHWMap[sectionId] || [];
this.sectionName = title;
document.getElementById('gv-global-title').innerHTML = `📊 【${title}】汇总成绩单`;
this.overlay.style.display = 'flex';
this.loadData();
},
close() {
if (this.overlay) {
this.overlay.style.display = 'none';
}
},
async loadData() {
const loading = document.getElementById('gv-loading');
const table = document.getElementById('gv-table');
const empty = document.getElementById('gv-empty');
const theadTr = document.getElementById('gv-thead-tr');
loading.style.display = 'block';
table.style.display = 'none';
empty.style.display = 'none';
this.rawRows = [];
this.loaded = false;
try {
if (this.currentHomeworks.length === 0) {
throw new Error('当前章节没有关联任何作业,无法合并成绩。');
}
let domainPrefix = '';
const match = window.location.pathname.match(/^(\/d\/[^\/]+)/);
if (match) domainPrefix = match[1];
let thHtml = '<th style="text-align:center;">序号</th><th style="text-align:center;">姓名</th>';
this.currentHomeworks.forEach(hw => {
thHtml += `<th style="text-align:center;"><a href="${domainPrefix}/homework/${hw.id}/scoreboard" target="_blank" style="color: #4285f4; text-decoration: none;" title="点击查看此作业成绩表">${hw.name}</a></th>`;
});
thHtml += '<th style="text-align:center;">总分</th>';
theadTr.innerHTML = thHtml;
const promises = this.currentHomeworks.map(hw =>
fetch(`${domainPrefix}/homework/${hw.id}/scoreboard`, {
headers: { 'Accept': 'application/json' }
}).then(async res => {
if (!res.ok) {
const fallback = await fetch(`${domainPrefix}/contest/${hw.id}/scoreboard`, {
headers: { 'Accept': 'application/json' }
});
if (!fallback.ok) return { rows: [] };
return fallback.json();
}
return res.json();
}).catch(e => ({ rows: [] }))
);
const results = await Promise.all(promises);
const userMap = {};
// 预先填充所有已加入课程的学生
Object.keys(this.enrolledUsers).forEach(uid => {
userMap[uid] = {
uid: String(uid),
name: this.enrolledUsers[uid],
scores: new Array(this.currentHomeworks.length).fill(0)
};
});
results.forEach((sbData, hwIndex) => {
const rows = sbData.rows || [];
const validRows = rows.filter(r => r && r.some(c => c && c.type === 'user' && c.raw));
validRows.forEach(r => {
const userCell = r.find(c => c.type === 'user');
const scoreCell = r.find(c => c.type === 'string' || c.type === 'total_score' || typeof c.value === 'number');
if (!userCell || !userCell.raw) return;
const uid = String(userCell.raw);
let nameAttr = userCell.value || uid;
if (typeof nameAttr === 'string') {
const tmp = document.createElement('div');
tmp.innerHTML = nameAttr;
nameAttr = tmp.textContent || tmp.innerText || uid;
}
if (nameAttr.includes('@')) nameAttr = nameAttr.split('@')[1];
if (!userMap[uid]) {
userMap[uid] = {
uid: uid,
name: nameAttr,
scores: new Array(this.currentHomeworks.length).fill(0)
};
}
let scoreVal = scoreCell ? scoreCell.value : 0;
if (typeof scoreVal !== 'number') scoreVal = parseInt(scoreVal) || 0;
userMap[uid].scores[hwIndex] = scoreVal;
});
});
this.rawRows = Object.values(userMap);
this.loaded = true;
this.renderTable();
} catch (e) {
loading.style.display = 'none';
empty.textContent = e.message || '获取成绩数据失败';
empty.style.display = 'block';
}
},
renderTable() {
const loading = document.getElementById('gv-loading');
const table = document.getElementById('gv-table');
const empty = document.getElementById('gv-empty');
const tbody = document.getElementById('gv-tbody');
const hideTeachers = document.getElementById('gv-hide-teachers').checked;
const selectedGroup = document.getElementById('gv-group-filter').value;
loading.style.display = 'none';
let displayRows = this.rawRows;
if (hideTeachers) {
displayRows = displayRows.filter(r => !r.name.includes('老师'));
}
if (selectedGroup) {
displayRows = displayRows.filter(r => {
const groups = this.userGroups[r.uid] || [];
return groups.includes(selectedGroup);
});
}
displayRows.sort((a, b) => {
const sumA = a.scores.reduce((sum, s) => sum + s, 0);
const sumB = b.scores.reduce((sum, s) => sum + s, 0);
return sumB - sumA;
});
if (displayRows.length === 0) {
table.style.display = 'none';
empty.textContent = '没有找到符合条件的成绩记录';
empty.style.display = 'block';
return;
}
empty.style.display = 'none';
table.style.display = 'table';
let html = '';
displayRows.forEach((row, idx) => {
let total = 0;
let scoresHtml = '';
row.scores.forEach(s => {
total += s;
let color = '#333';
if (s >= 100) color = '#25ad40';
else if (s === 0) color = '#999';
else if (s > 0) color = '#f39c12';
scoresHtml += `<td style="color: ${color}; font-weight: ${s > 0 ? 'bold' : 'normal'}; text-align: center;">${s}</td>`;
});
html += `<tr style="border-bottom: 1px solid #f0f0f0;">
<td style="text-align: center; padding: 10px;">${idx + 1}</td>
<td style="text-align: center; padding: 10px;">${row.name}</td>
${scoresHtml}
<td style="font-weight: bold; color: #1a1a2e; text-align: center; padding: 10px; font-size: 1.1em;">${total}</td>
</tr>`;
});
tbody.innerHTML = html;
},
exportCSV() {
if (!this.loaded || this.rawRows.length === 0) return alert('没有数据可导出');
const hideTeachers = document.getElementById('gv-hide-teachers').checked;
const selectedGroup = document.getElementById('gv-group-filter').value;
let exportRows = this.rawRows;
if (hideTeachers) {
exportRows = exportRows.filter(r => !r.name.includes('老师'));
}
if (selectedGroup) {
exportRows = exportRows.filter(r => {
const groups = this.userGroups[r.uid] || [];
return groups.includes(selectedGroup);
});
}
exportRows.sort((a, b) => {
const sumA = a.scores.reduce((sum, s) => sum + s, 0);
const sumB = b.scores.reduce((sum, s) => sum + s, 0);
return sumB - sumA;
});
let header = ['序号', '姓名'];
this.currentHomeworks.forEach(hw => header.push(hw.name));
header.push('总分');
let csvContent = "\uFEFF" + header.join(',') + '\n';
exportRows.forEach((row, idx) => {
const total = row.scores.reduce((sum, s) => sum + s, 0);
const rowData = [
idx + 1,
`"${row.name.replace(/"/g, '""')}"`,
...row.scores,
total
];
csvContent += rowData.join(',') + '\n';
});
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
const link = document.createElement("a");
const url = URL.createObjectURL(blob);
link.setAttribute("href", url);
link.setAttribute("download", `合并成绩单_${this.sectionName}.csv`);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
};
</script>
<div class="row" data-sticky-parent> <!-- 管理员可见的用户筛选面板 - 复用训练模块结构 -->
<div class="small-12 medium-2 columns" data-sticky="large">
<div class="section side training__users">
<!-- 用户组下拉选择 -->
<div class="section__header" style="padding: 10px 15px;">
<select class="select" id="groupFilter" style="width: 100%;">
<option value="">全部</option>
<option value="克力周六1630CSP06">克力周六1630CSP06</option>
<option value="教师团队">教师团队</option>
<option value="杰森周日1045CSP06">杰森周日1045CSP06</option>
<option value="邓子周日0830CSP05">邓子周日0830CSP05</option>
<option value="邓子周日1400CSP05">邓子周日1400CSP05</option>
</select>
</div>
<!-- 选择用户 -->
<div class="section__header" style="padding: 10px 15px; border-top: 1px solid #eee;">
<input type="text" class="textbox search__input" id="userSearch" placeholder="选择用户" style="width: 100%;">
</div>
<!-- 用户列表 -->
<div class="section__body" style="padding: 0;">
<ul class="menu training__user-list" id="userList">
<li class="menu__item enroll_user_menu_item "
data-groups="教师团队,5"
data-uid="5" data-uname="邓子老师"
data-displayname="邓子老师">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=5">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/5/.avatar.jpg" width="24" height="24">
</span>
<span class="training__user-name">
邓子老师
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="教师团队,6"
data-uid="6" data-uname="克力老师"
data-displayname="克力老师">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=6">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/6/.avatar.jpg" width="24" height="24">
</span>
<span class="training__user-name">
克力老师
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="教师团队,7"
data-uid="7" data-uname="六六老师"
data-displayname="六六老师">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=7">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="//cravatar.cn/avatar/ba21a5bb5a53736dcd3224f55973f66a?d=mm&amp;s=64" width="24" height="24">
</span>
<span class="training__user-name">
六六老师
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="教师团队,8"
data-uid="8" data-uname="茄子老师"
data-displayname="茄子老师">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=8">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/8/.avatar.jpg" width="24" height="24">
</span>
<span class="training__user-name">
茄子老师
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="教师团队,18"
data-uid="18" data-uname="菠萝老师"
data-displayname="菠萝老师">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=18">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="//q1.qlogo.cn/g?b=qq&amp;nk=735311015&amp;s=160" width="24" height="24">
</span>
<span class="training__user-name">
菠萝老师
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="克力周六1630CSP06,20"
data-uid="20" data-uname="徐纯熙"
data-displayname="徐纯熙">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=20">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/20/.avatar.jpeg" width="24" height="24">
</span>
<span class="training__user-name">
徐纯熙
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="23"
data-uid="23" data-uname="李宝桢"
data-displayname="李宝桢">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=23">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/23/.avatar.jpg" width="24" height="24">
</span>
<span class="training__user-name">
李宝桢
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="杰森周日1045CSP06,29"
data-uid="29" data-uname="李伯贤"
data-displayname="李伯贤">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=29">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/29/.avatar.png" width="24" height="24">
</span>
<span class="training__user-name">
李伯贤
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="克力周六1630CSP06,30"
data-uid="30" data-uname="梁睿朗"
data-displayname="梁睿朗">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=30">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="//q1.qlogo.cn/g?b=qq&amp;nk=3982753647&amp;s=160" width="24" height="24">
</span>
<span class="training__user-name">
梁睿朗
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="克力周六1630CSP06,35"
data-uid="35" data-uname="陆闻汐"
data-displayname="陆闻汐">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=35">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/35/.avatar.jpg" width="24" height="24">
</span>
<span class="training__user-name">
陆闻汐
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="克力周六1630CSP06,44"
data-uid="44" data-uname="柯欣贝"
data-displayname="柯欣贝">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=44">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/44/.avatar.jpg" width="24" height="24">
</span>
<span class="training__user-name">
柯欣贝
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="克力周六1630CSP06,47"
data-uid="47" data-uname="刘毅潇"
data-displayname="刘毅潇">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=47">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/47/.avatar.png" width="24" height="24">
</span>
<span class="training__user-name">
刘毅潇
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="克力周六1630CSP06,65"
data-uid="65" data-uname="刘浩宇"
data-displayname="刘浩宇">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=65">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/65/.avatar.jpg" width="24" height="24">
</span>
<span class="training__user-name">
刘浩宇
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="邓子周日0830CSP05,97"
data-uid="97" data-uname="刘鹏"
data-displayname="忧郁刘鹏">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=97">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/97/.avatar.jpg" width="24" height="24">
</span>
<span class="training__user-name">
忧郁刘鹏 (刘鹏)
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="邓子周日1400CSP05,99"
data-uid="99" data-uname="袁中和"
data-displayname="袁中和">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=99">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/99/.avatar.png" width="24" height="24">
</span>
<span class="training__user-name">
袁中和
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="邓子周日0830CSP05,114"
data-uid="114" data-uname="旷家昊"
data-displayname="旷家昊">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=114">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/114/.avatar.png" width="24" height="24">
</span>
<span class="training__user-name">
旷家昊
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="邓子周日0830CSP05,117"
data-uid="117" data-uname="崔诺徽"
data-displayname="崔诺徽">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=117">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/117/.avatar.jpg" width="24" height="24">
</span>
<span class="training__user-name">
崔诺徽
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="克力周六1630CSP06,143"
data-uid="143" data-uname="黄振轩"
data-displayname="黄振轩">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=143">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/143/.avatar.png" width="24" height="24">
</span>
<span class="training__user-name">
黄振轩
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="邓子周日1400CSP05,147"
data-uid="147" data-uname="朱铠骏"
data-displayname="朱铠骏">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=147">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/147/.avatar.jpeg" width="24" height="24">
</span>
<span class="training__user-name">
朱铠骏
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="148"
data-uid="148" data-uname="夏江南"
data-displayname="夏江南">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=148">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="//cravatar.cn/avatar/3b8bf7c2a92e879629fb2d49279729cb?d=mm&amp;s=64" width="24" height="24">
</span>
<span class="training__user-name">
夏江南
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="克力周六1630CSP06,161"
data-uid="161" data-uname="林汪霖"
data-displayname="林汪霖">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=161">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="//cravatar.cn/avatar/4a4b345763b55eb045c6b60b58e52230?d=mm&amp;s=64" width="24" height="24">
</span>
<span class="training__user-name">
林汪霖
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="邓子周日0830CSP05,210"
data-uid="210" data-uname="张祺琪"
data-displayname="张祺琪">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=210">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="/file/210/.avatar.png" width="24" height="24">
</span>
<span class="training__user-name">
张祺琪
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="邓子周日1400CSP05,269"
data-uid="269" data-uname="黄柏淼"
data-displayname="黄柏淼">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=269">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="//cravatar.cn/avatar/3a3df1a864ea5ed037d5173896bcbabe?d=mm&amp;s=64" width="24" height="24">
</span>
<span class="training__user-name">
黄柏淼
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="教师团队,306"
data-uid="306" data-uname="坦克老师"
data-displayname="坦克老师">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=306">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="//cravatar.cn/avatar/055747f1fad5aeda179a92c345c270c1?d=mm&amp;s=64" width="24" height="24">
</span>
<span class="training__user-name">
坦克老师
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="克力周六1630CSP06,419"
data-uid="419" data-uname="邢致远"
data-displayname="邢致远">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=419">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="//cravatar.cn/avatar/c102203f1c4e169b3a07e9a8a9afaba0?d=mm&amp;s=64" width="24" height="24">
</span>
<span class="training__user-name">
邢致远
</span>
</a>
</li>
<li class="menu__item enroll_user_menu_item "
data-groups="教师团队,508"
data-uid="508" data-uname="杰森老师"
data-displayname="杰森老师">
<a class="menu__link training__user-item" data-pjax="true" href="./6975984d71e15346c9e8fdc2?uid=508">
<span class="training__user-avatar">
<img class="small user-profile-avatar v-center" loading="lazy"
src="//cravatar.cn/avatar/9edc7c6e91fe98033e6e95395579eb87?d=mm&amp;s=64" width="24" height="24">
</span>
<span class="training__user-name">
杰森老师
</span>
</a>
</li>
</ul>
</div>
</div>
</div>
<div id="courseContent"
class="medium-7 columns">
<div data-fragment-id="course_detail">
<div class="section">
<div class="section__header">
<h1 class="section__title"><a href="/course/6975984d71e15346c9e8fdc2">课程: 2026 春季班 CSP05</a></h1>
</div>
<div class="section__body typo richmedia">
<p>2026 春季班 CSP05</p>
<p>学生版教案:<a href="https://www.wolai.com/vePMRnZWtvrn7HAgnnfK1J">https://www.wolai.com/vePMRnZWtvrn7HAgnnfK1J</a></p>
<p>高精度:
<a href="https://www.wolai.com/4BxJ7Fksn5q5FSiLotwrxs">https://www.wolai.com/4BxJ7Fksn5q5FSiLotwrxs</a></p>
</div>
</div>
<div class="section">
<div class="section__header">
<h1 class="section__title">章节</h1>
</div>
<div class="section__body" style="padding-top: 0;">
<div class="notice-box">
💡 请先加入课程后查看详细题目列表
</div>
<ul class="periods">
<li>
<div class="period-card locked" data-id="69aa506a27e54d3ad7ed7aae">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa506a27e54d3ad7ed7aae', 'CSP05-01 知识回顾');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa506a27e54d3ad7ed7aae/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-01 知识回顾</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202512C3T3</span>
<span class="lesson-name">密码强度</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202512C3T4</span>
<span class="lesson-name">小杨的智慧购物</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202512C4T3</span>
<span class="lesson-name">建造</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202512C4T4</span>
<span class="lesson-name">优先购买</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202509C4T3</span>
<span class="lesson-name">排兵布阵</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202509C3T3</span>
<span class="lesson-name">数组清零</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202506C3T3</span>
<span class="lesson-name">奇偶校验</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202509C4T4</span>
<span class="lesson-name">最长连续段</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
🚀 拓展练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202506C3T4</span>
<span class="lesson-name">分糖果</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202503C3T3</span>
<span class="lesson-name">2025</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202503C3T4</span>
<span class="lesson-name">词频统计</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202506C4T3</span>
<span class="lesson-name">画布裁剪</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202506C4T4</span>
<span class="lesson-name">排序</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202503C4T3</span>
<span class="lesson-name">荒地开垦</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202503C4T4</span>
<span class="lesson-name">二阶矩阵</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa507a27e54d3ad7ed7aaf">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa507a27e54d3ad7ed7aaf', 'CSP05-02 递归改造循环');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa507a27e54d3ad7ed7aaf/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-02 递归改造循环</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1696</span>
<span class="lesson-name">请输出 1~n 之间所有的整数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1002</span>
<span class="lesson-name">编程求解1+2+3+...+n</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1058</span>
<span class="lesson-name">求出100至999范围内的所有水仙花数。</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1083</span>
<span class="lesson-name">回文数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1082</span>
<span class="lesson-name">猴子吃桃子</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1697</span>
<span class="lesson-name">请输出 n~1 之间所有的整数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1244</span>
<span class="lesson-name">请问一个正整数能够整除几次2</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1265</span>
<span class="lesson-name">爱因斯坦的数学题</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
🚀 拓展练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1053</span>
<span class="lesson-name">求100+97+……+4+1的值。</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1241</span>
<span class="lesson-name">角谷猜想</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1261</span>
<span class="lesson-name">韩信点兵</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1078</span>
<span class="lesson-name">求恰好使s=1+1/2+1/3+…+1/n的值大于X时n的值。</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1108</span>
<span class="lesson-name">正整数N转换成一个二进制数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1395</span>
<span class="lesson-name">小丽找数?</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa508227e54d3ad7ed7ab0">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa508227e54d3ad7ed7ab0', 'CSP05-03 递归基础');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa508227e54d3ad7ed7ab0/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-03 递归基础</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1238</span>
<span class="lesson-name">统计每个月兔子的总数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C302A2</span>
<span class="lesson-name">递归求反 </span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">K1165</span>
<span class="lesson-name">Hermite多项式</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1088</span>
<span class="lesson-name">求两个数M和N的最大公约数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1514</span>
<span class="lesson-name">数根</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C305B2</span>
<span class="lesson-name">求阶乘</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1087</span>
<span class="lesson-name">两个数M和N的最小公倍数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C305B3</span>
<span class="lesson-name">阿克曼Ackmann函数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
🚀 拓展练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">K1164</span>
<span class="lesson-name">digit函数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C303A2</span>
<span class="lesson-name">母牛养殖 </span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C303A5</span>
<span class="lesson-name">爬楼梯</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C303A4</span>
<span class="lesson-name">爬楼梯</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1562</span>
<span class="lesson-name">加数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1208</span>
<span class="lesson-name">螺旋方阵</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">K1209</span>
<span class="lesson-name">分数求和</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69bcf81f8f8791c6f4b1fd4b">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69bcf81f8f8791c6f4b1fd4b', 'CSP05-04 递归与进制转换');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69bcf81f8f8791c6f4b1fd4b/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-04 递归与进制转换</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1108</span>
<span class="lesson-name">正整数N转换成一个二进制数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1289</span>
<span class="lesson-name">正整数n转换为16进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1290</span>
<span class="lesson-name">二进制转换十进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1288</span>
<span class="lesson-name">正整数n转换为8进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1291</span>
<span class="lesson-name">八进制转十进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1293</span>
<span class="lesson-name">二进制转换八进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1294</span>
<span class="lesson-name">二进制转十六进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1359</span>
<span class="lesson-name">八进制转换二进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1306</span>
<span class="lesson-name">十六进制转二进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1547</span>
<span class="lesson-name">小X转进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1415</span>
<span class="lesson-name">10进制转D进制</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1295</span>
<span class="lesson-name">十六进制转换</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa508a27e54d3ad7ed7ab1">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa508a27e54d3ad7ed7ab1', 'CSP05-05 递归应用');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa508a27e54d3ad7ed7ab1/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-05 递归应用</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1222</span>
<span class="lesson-name">汉诺塔(1)T</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1223</span>
<span class="lesson-name">汉诺塔的移动次数T</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2417</span>
<span class="lesson-name">汉诺塔(2)T</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2419</span>
<span class="lesson-name">汉诺塔(3)T</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2420</span>
<span class="lesson-name">汉诺塔(4)F</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">K1209</span>
<span class="lesson-name">分数求和</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">K1210</span>
<span class="lesson-name">因子分解</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">K1211</span>
<span class="lesson-name">判断元素是否存在</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">K1316</span>
<span class="lesson-name">数的计数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">K1200</span>
<span class="lesson-name">分解因数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">K1198</span>
<span class="lesson-name">逆波兰表达式</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa509227e54d3ad7ed7ab2">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa509227e54d3ad7ed7ab2', 'CSP05-06 初等数论1');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa509227e54d3ad7ed7ab2/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-06 初等数论1</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0504A1</span>
<span class="lesson-name">最大公约数与最小公倍数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0504A2</span>
<span class="lesson-name">判断素数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0504A3</span>
<span class="lesson-name">质因数分解</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0504A4</span>
<span class="lesson-name">区间互质对数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0504A5</span>
<span class="lesson-name">最简分数化简</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">A002</span>
<span class="lesson-name">求因数和、因数个数2</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1080</span>
<span class="lesson-name">质因子</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202309C5T3</span>
<span class="lesson-name">因数分解F</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
🚀 拓展练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1664</span>
<span class="lesson-name">质因数分解</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2140</span>
<span class="lesson-name">质因子3</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2138</span>
<span class="lesson-name">乘积的约数个数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2139</span>
<span class="lesson-name">乘积的约数和</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2578</span>
<span class="lesson-name">约数求和</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202312C5T3</span>
<span class="lesson-name">小杨的幸运数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa509a27e54d3ad7ed7ab3">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa509a27e54d3ad7ed7ab3', 'CSP05-07 初等数论2');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa509a27e54d3ad7ed7ab3/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-07 初等数论2</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505A1</span>
<span class="lesson-name">筛出指定范围质数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505A2</span>
<span class="lesson-name">质数计数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505A3</span>
<span class="lesson-name">第k个质数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505A4</span>
<span class="lesson-name">孪生质数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505A5</span>
<span class="lesson-name">利用最小质因数快速分解</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505B1</span>
<span class="lesson-name">哥德巴赫猜想验证</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505B2</span>
<span class="lesson-name">质数筛统计偶数与奇数质数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505B3</span>
<span class="lesson-name">相邻质数间隔</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
🚀 拓展练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505C1</span>
<span class="lesson-name">欧拉函数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505C2</span>
<span class="lesson-name">莫比乌斯函数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505C3</span>
<span class="lesson-name">整数分块</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505C4</span>
<span class="lesson-name">区间筛</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505C5</span>
<span class="lesson-name">最大质因数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505C6</span>
<span class="lesson-name">质数密度分析</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0505C7</span>
<span class="lesson-name">梅森质数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2071</span>
<span class="lesson-name">素数个数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2136</span>
<span class="lesson-name">筛素数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1838</span>
<span class="lesson-name">分解质因数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1942</span>
<span class="lesson-name">回文质数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2007</span>
<span class="lesson-name">半质数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa50a427e54d3ad7ed7ab4">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa50a427e54d3ad7ed7ab4', 'CSP05-08 初等数论3');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa50a427e54d3ad7ed7ab4/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-08 初等数论3</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C5T3</span>
<span class="lesson-name">有限不循环小数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202309C5T3</span>
<span class="lesson-name">因数分解F</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202406C5T4</span>
<span class="lesson-name">小杨的幸运数字</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202412C5T3</span>
<span class="lesson-name">奇妙数字</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202312C5T3</span>
<span class="lesson-name">小杨的幸运数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202403C5T4</span>
<span class="lesson-name">B-smooth数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202506C5T4</span>
<span class="lesson-name">最大公因数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506B1</span>
<span class="lesson-name">丑数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506B2</span>
<span class="lesson-name">整除个数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506B3</span>
<span class="lesson-name">约数比较</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506A1</span>
<span class="lesson-name">求因数个数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506A2</span>
<span class="lesson-name">求因数之和</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506A3</span>
<span class="lesson-name">完全数判断</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506A4</span>
<span class="lesson-name">因数个数最多的数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506A5</span>
<span class="lesson-name">最长连续整除子序列</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
🚀 拓展练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506C1</span>
<span class="lesson-name">亲和数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506C2</span>
<span class="lesson-name">高度合成数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506C3</span>
<span class="lesson-name">整除分块</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506C4</span>
<span class="lesson-name">数论分组</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506C5</span>
<span class="lesson-name">因子链</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506C6</span>
<span class="lesson-name">欧拉函数求和</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">CSP0506C7</span>
<span class="lesson-name">拓展欧几里得求逆元</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa50b727e54d3ad7ed7ab6">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa50b727e54d3ad7ed7ab6', 'CSP05-09 二分查找');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa50b727e54d3ad7ed7ab6/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-09 二分查找</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1236</span>
<span class="lesson-name">二分查找</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1894</span>
<span class="lesson-name">二分查找左侧边界</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1895</span>
<span class="lesson-name">二分查找右侧边界</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1898</span>
<span class="lesson-name">同时出现的数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1899</span>
<span class="lesson-name">最满意的方案</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C5T4</span>
<span class="lesson-name">找数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1896</span>
<span class="lesson-name">二分查找满足条件的数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2078</span>
<span class="lesson-name">起止位置</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
🚀 拓展练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1542</span>
<span class="lesson-name">小X算排名</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1902</span>
<span class="lesson-name">最少的修改次数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa50c127e54d3ad7ed7ab7">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa50c127e54d3ad7ed7ab7', 'CSP05-10 二分答案');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa50c127e54d3ad7ed7ab7/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-10 二分答案</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1908</span>
<span class="lesson-name">伐木工</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1909</span>
<span class="lesson-name">跳石头</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202512C5T3</span>
<span class="lesson-name">数字移动</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa50da27e54d3ad7ed7ab8">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa50da27e54d3ad7ed7ab8', 'CSP05-11 二分综合');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa50da27e54d3ad7ed7ab8/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-11 二分综合</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">KH202512T8</span>
<span class="lesson-name">两数之和</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1561</span>
<span class="lesson-name">买木头</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1912</span>
<span class="lesson-name">最小的空旷指数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2217</span>
<span class="lesson-name">找数字的位置</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2662</span>
<span class="lesson-name">指定数出现的次数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2240</span>
<span class="lesson-name">和为给定数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa50e227e54d3ad7ed7ab9">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa50e227e54d3ad7ed7ab9', 'CSP05-12 高精度加减');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa50e227e54d3ad7ed7ab9/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-12 高精度加减</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C906A1</span>
<span class="lesson-name">高精度算法一 - 黑店一</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C906A2</span>
<span class="lesson-name">高精度算法一 - 黑店二</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C906A3</span>
<span class="lesson-name">高精度算法一 - 不是黑店一</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C906A4</span>
<span class="lesson-name">高精度算法一 - 不是黑店二</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C906B1</span>
<span class="lesson-name">高精度算法一-大数加法</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C906B2</span>
<span class="lesson-name">高精度算法一 - A+B+C</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C906B3</span>
<span class="lesson-name">高精度算法一 - 大数减法</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa50eb27e54d3ad7ed7aba">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa50eb27e54d3ad7ed7aba', 'CSP05-13 高精度乘除');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa50eb27e54d3ad7ed7aba/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-13 高精度乘除</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C907A1</span>
<span class="lesson-name">超级黑店一</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C907A2</span>
<span class="lesson-name">超级黑店二</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C907B1</span>
<span class="lesson-name">9的余数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C907B2</span>
<span class="lesson-name">计算2的N次方</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C907B3</span>
<span class="lesson-name">求10000以内n的阶乘</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">C907B4</span>
<span class="lesson-name">[NOIP1998]阶乘之和</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa510427e54d3ad7ed7abb">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa510427e54d3ad7ed7abb', 'CSP05-14 贪心算法');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa510427e54d3ad7ed7abb/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-14 贪心算法</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 0%;">
<span class="progress-bar-text">0%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2735</span>
<span class="lesson-name">贪心算法一 - 小天买辣条</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2736</span>
<span class="lesson-name">贪心算法一 - 书架</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2737</span>
<span class="lesson-name">贪心算法一 - 最小距离字符串</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2738</span>
<span class="lesson-name">贪心算法一 - 组队</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2739</span>
<span class="lesson-name">贪心算法一 - 采购奖品</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
📋 课后作业
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2740</span>
<span class="lesson-name">贪心算法一 - 压缩歌曲</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2741</span>
<span class="lesson-name">贪心算法一 - 奶酪工厂</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P2742</span>
<span class="lesson-name">贪心算法一 - 图书管理员</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
<div class="hw-group">
<h4 class="hw-group__title">
🚀 拓展练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">P1001</span>
<span class="lesson-name">熟悉一下Online Judge的环境</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa511727e54d3ad7ed7abc">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa511727e54d3ad7ed7abc', 'CSP05-15 分治算法基础');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa511727e54d3ad7ed7abc/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-15 分治算法基础</h2>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa512027e54d3ad7ed7abd">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa512027e54d3ad7ed7abd', 'CSP05-16 分治算法应用');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa512027e54d3ad7ed7abd/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-16 分治算法应用</h2>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69f423390ba22cb8a6853e3b">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69f423390ba22cb8a6853e3b', 'CSP05-17 链表');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69f423390ba22cb8a6853e3b/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-17 链表</h2>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa512927e54d3ad7ed7abe">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa512927e54d3ad7ed7abe', 'CSP05-18 五级真题训练1');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa512927e54d3ad7ed7abe/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-18 五级真题训练1</h2>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa513227e54d3ad7ed7abf">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa513227e54d3ad7ed7abf', 'CSP05-19 五级真题训练2');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa513227e54d3ad7ed7abf/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-19 五级真题训练2</h2>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69aa513e27e54d3ad7ed7ac0">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69aa513e27e54d3ad7ed7ac0', 'CSP05-20 阶段测试');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69aa513e27e54d3ad7ed7ac0/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-20 阶段测试</h2>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
</li>
</ol>
</div>
</div>
</li>
<li>
<div class="period-card locked" data-id="69b51cc0947e4b9371843ec5">
<div class="period-header">
<span class="period-toggle"></span>
<div class="period-actions">
<a href="javascript:;" class="btn-edit"
onclick="event.stopPropagation(); window.CourseGradeViewer.openGlobalPanel('69b51cc0947e4b9371843ec5', 'CSP05-02 克力班级单独检测');"
style="margin-right: 8px;">📊 成绩</a>
<a href="/course/6975984d71e15346c9e8fdc2/s/69b51cc0947e4b9371843ec5/edit" class="btn-edit"
onclick="event.stopPropagation();">编辑</a>
</div>
<div class="period-metadata">
<h2 class="period-title">CSP05-02 克力班级单独检测</h2>
<div class="period-progress">
<div class="progress-bar-outer">
<div class="progress-bar-inner" style="width: 50%;">
<span class="progress-bar-text">50%</span>
</div>
</div>
</div>
</div>
</div>
<div class="period-body">
<div class="period-divider"></div>
<ol class="chapter-list">
<li class="chapter-item">
<div class="hw-group">
<h4 class="hw-group__title">
📝 课堂练习
</h4>
<ol class="lesson-list">
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C1T3</span>
<span class="lesson-name">交朋友</span>
</span>
<a href="/record/69bb94bc8f8791c6f4b1c30c" target="_blank"
onclick="event.stopPropagation();" class="lesson-status status-ac"
title="完全正确 (Accepted)"></a>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C1T4</span>
<span class="lesson-name">数字替换</span>
</span>
<a href="/record/69bb94d88f8791c6f4b1c329" target="_blank"
onclick="event.stopPropagation();" class="lesson-status status-ac"
title="完全正确 (Accepted)"></a>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C2T3</span>
<span class="lesson-name">数数</span>
</span>
<a href="/record/69bb963a8f8791c6f4b1c395" target="_blank"
onclick="event.stopPropagation();" class="lesson-status status-ac"
title="完全正确 (Accepted)"></a>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C2T4</span>
<span class="lesson-name">画画</span>
</span>
<a href="/record/69bb96ee8f8791c6f4b1c3f8" target="_blank"
onclick="event.stopPropagation();" class="lesson-status status-ac"
title="完全正确 (Accepted)"></a>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C3T3</span>
<span class="lesson-name">二进制回文串</span>
</span>
<a href="/record/69bb985c8f8791c6f4b1c47e" target="_blank"
onclick="event.stopPropagation();" class="lesson-status status-ac"
title="完全正确 (Accepted)"></a>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C3T4</span>
<span class="lesson-name">凯撒密码</span>
</span>
<a href="/record/69bbbb258f8791c6f4b1cf6c" target="_blank"
onclick="event.stopPropagation();" class="lesson-status status-ac"
title="完全正确 (Accepted)"></a>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C4T3</span>
<span class="lesson-name">山之谷</span>
</span>
<a href="/record/69bbbdfe8f8791c6f4b1cfb4" target="_blank"
onclick="event.stopPropagation();" class="lesson-status status-ac"
title="完全正确 (Accepted)"></a>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C4T4</span>
<span class="lesson-name">礼盒排序</span>
</span>
<a href="/record/69bbc4aa8f8791c6f4b1d01c" target="_blank"
onclick="event.stopPropagation();" class="lesson-status status-ac"
title="完全正确 (Accepted)"></a>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C5T3</span>
<span class="lesson-name">有限不循环小数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C5T4</span>
<span class="lesson-name">找数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C6T3</span>
<span class="lesson-name">选数</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C6T4</span>
<span class="lesson-name">完全二叉树</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C7T3</span>
<span class="lesson-name">拆分</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C7T4</span>
<span class="lesson-name">物流网络</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C8T3</span>
<span class="lesson-name">消息查找</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
<li class="lesson-item">
<span style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="lesson-type">GESP202603C8T4</span>
<span class="lesson-name">子图最短路</span>
</span>
<span class="lesson-status status-pending"></span>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</li>
</ul>
</div>
</div>
</div> </div>
<div class="medium-3 columns" data-sticky="large">
<div class="section side">
<ol class="menu">
<li class="menu__item">
<form action="" method="POST">
<input type="hidden" name="operation" value="enroll">
<button class="menu__link" type="submit">
<span class="icon icon-add"></span> 参加课程
</button>
</form>
</li>
<li class="menu__item"><a class="menu__link" href="/course/6975984d71e15346c9e8fdc2/edit">
<span class="icon icon-edit"></span> 编辑
</a></li>
<li class="menu__item"><a class="menu__link" href="/course/6975984d71e15346c9e8fdc2/s/create">
<span class="icon icon-add"></span> 添加章
</a></li>
<li class="menu__seperator"></li>
</ol>
<div class="section__body typo">
<dl class="large horizontal">
<dt>状态</dt>
<dd>未参加</dd>
<dt>参加人数</dt>
<dd>26</dd>
<dt>创建人</dt>
<dd><span class="user-profile-link">
<img class="small user-profile-avatar v-center" loading="lazy" src="/file/6/.avatar.jpg" width="20" height="20">
<a class="user-profile-name uname--lv0" href="/user/6">
克力老师
</a>
</span>
</dd>
</dl>
</div>
</div>
</div>
</div>
</div>
<div class="footer">
<div class="row">
<div class="columns">
<div class="footer__extra-link clearfix">
<div class="footer__extra-left">
<ol class="clearfix">
<li class="footer__extra-link-item"><a href="/record">评测队列</a></li>
<li class="footer__extra-link-item"><a href="/status">服务状态</a></li>
<li class="footer__extra-link-item">
<a href="/legacy?legacy=true">兼容模式</a>
</li>
<li class="footer__extra-link-item nojs--hide" data-dropdown-target="#menu-footer-theme">
<span><span class="icon icon-global"></span> 主题 <span
class="icon icon-expand_less"></span></span>
<ol class="dropdown-target menu" id="menu-footer-theme">
<li class="menu__item"><a class="menu__link" href="/set_theme/light">亮色</a></li>
<li class="menu__item"><a class="menu__link" href="/set_theme/dark">暗色</a></li>
</ol>
</li>
</ol>
</div>
<div class="footer__extra-right">
<ol class="clearfix"><li class="footer__extra-link-item"></li><li class="footer__extra-link-item"></li><li class="footer__extra-link-item">Worker 0, 175ms</li>
<!-- Prepare 2ms -->
<!-- Method 160ms -->
<li class="footer__extra-link-item">Powered by <a href="https://hydro.js.org">Hydro v5.0.0-beta.16</a> </li>
</ol>
</div>
</div>
</div>
</div>
</div></div>
<script>
var UiContextNew = '{"cid":"6975984d71e15346c9e8fdc2"}';
var UserContextNew = '{}';
</script>
</body>
</html>