更新课评系统代码
This commit is contained in:
227
.claude/skills/keping-simplified/SKILL.md
Normal file
227
.claude/skills/keping-simplified/SKILL.md
Normal file
@@ -0,0 +1,227 @@
|
||||
---
|
||||
name: keping-simplified
|
||||
description: 超级简化版课评生成器!只需输入 "/课评" 即可启动,表单直连提交,AI自动检测并生成。为穹狼乐高编程设计。
|
||||
version: 5.1.0
|
||||
author: 穹狼教学团队
|
||||
---
|
||||
|
||||
# keping-simplified — 超级简化版课评生成器
|
||||
|
||||
## 🚀 核心特点
|
||||
|
||||
**超级简单!一键启动!**
|
||||
- 只需输入 `/课评` 即可启动,无需记住一堆命令
|
||||
- 启动即显示当前周数+班级选择
|
||||
- 自动匹配课程主题(基于学期周数映射表)
|
||||
- 本地网页表单:学生状态快捷选择 + 速记输入 + 进度条
|
||||
- **直连提交**:表单直接 POST 到本地服务器,无需复制粘贴
|
||||
- AI 自动检测信号文件 → 生成课评 → 双轨保存
|
||||
- 完成后自动清理临时数据
|
||||
|
||||
---
|
||||
|
||||
## 📋 完整工作流程
|
||||
|
||||
### 第一步:启动(只需一个命令!)
|
||||
```
|
||||
用户输入:/课评
|
||||
```
|
||||
立即执行以下操作:
|
||||
1. ✅ 计算当前周数(基于3月2日开学)
|
||||
2. ✅ 显示当天对应周几的班级列表
|
||||
3. ✅ 自动匹配每个班级的当周课程主题
|
||||
|
||||
---
|
||||
|
||||
### 第二步:班级选择
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
🎯 选择班级 | 第X周 YYYY-MM-DD
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
可选班级:
|
||||
[1] 发现世界-周四19点(DISC-011 鳄鱼)
|
||||
[2] Wed创造世界-周六1030(CREATE-011 推磨机器人)
|
||||
[3] AICODE03小Q周六1400(AICODE03-011 AI文档写作)
|
||||
[4] SPIKE02-周日1030(SPIKE-011 摩天轮)
|
||||
[5] 手动输入班级名称
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
```
|
||||
用户选择班级后,系统自动:
|
||||
1. 启动本地表单服务器(`python src/form_server.py`)
|
||||
2. 读取该班级目录,加载学生名单和画像
|
||||
3. 匹配当周课程主题(从学期周数映射表)
|
||||
|
||||
---
|
||||
|
||||
### 第三步:打开网页表单 + 直连提交
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
🖥️ 表单服务器已启动!
|
||||
👉 http://localhost:8088/form?class=发现世界-周四19点&week=11&course=DISC-011&theme=鳄鱼&date=2026-05-16
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
```
|
||||
|
||||
**表单已自动填入:班级、周数、日期、课程主题、学生名单(含画像摘要)**
|
||||
|
||||
用户在浏览器中:
|
||||
1. 为每位学生选择状态(出勤/请假/补课/体验)
|
||||
2. 填写课堂表现(支持速记符号)
|
||||
3. 点击「🚀 提交并保存」
|
||||
4. 看到「✅ 提交成功」→ 可关闭页面
|
||||
|
||||
**数据自动 POST 到本地服务器 → 保存为 JSON → 写入信号文件**
|
||||
|
||||
**表单预览**:
|
||||
```
|
||||
┌──────────────────────────────────────────┐
|
||||
│ 📝 课评填写表单 - 发现世界-周四19点 │
|
||||
│ 第11周 · DISC-011 鳄鱼 · 2026-05-16 │
|
||||
├──────────────────────────────────────────┤
|
||||
│ 📊 填写进度:3/6 · █████░░ 50% │
|
||||
├──────────────────────────────────────────┤
|
||||
│ ┌─梁昕乔───────────────────────┐ │
|
||||
│ │ 📋 性格内向,需鼓励... │ │
|
||||
│ │ [出勤] [请假] [补课] [体验] │ │
|
||||
│ │ 表现:____________________ │ │
|
||||
│ │ (速记提示:gj=观望、zd=主动) │ │
|
||||
│ └──────────────────────────────┘ │
|
||||
│ ┌─钟昀昊───────────────────────┐ │
|
||||
│ │ [出勤] [请假] [补课] [体验] │ │
|
||||
│ │ 表现:____________________ │ │
|
||||
│ └──────────────────────────────┘ │
|
||||
│ ┌─+ 添加临时学生──────────────┐ │
|
||||
│ │ 姓名:____ 状态:[补课/体验] │ │
|
||||
│ └──────────────────────────────┘ │
|
||||
├──────────────────────────────────────────┤
|
||||
│ [🚀 提交并保存] │
|
||||
└──────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 第四步:AI 自动检测 → 生成并保存
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
🔔 检测到表单提交 | 发现世界-周四19点 | DISC-011 鳄鱼
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
[1/3] 生成梁昕乔课评... ✅ 已保存
|
||||
[2/3] 生成钟昀昊课评... ✅ 已保存
|
||||
[3/3] 生成林瀚丞课评... ✅ 已保存
|
||||
📝 其他学生请假,不生成课评
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
✅ 全部完成!已保存 3 人 | 请假 2 人
|
||||
🗑️ 已清理临时数据文件
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
```
|
||||
|
||||
点击「提交」后:
|
||||
1. ✅ 数据自动 POST 到本地服务器
|
||||
2. ✅ 服务器保存为 `.claude/.tmp/evaluation_input_{班级}.json`
|
||||
3. ✅ 写入信号文件 `EVALUATION_READY.txt`
|
||||
4. ✅ AI 检测到信号,读取 JSON 数据
|
||||
5. ✅ 批量生成所有学生课评(180-350字三段式)
|
||||
6. ✅ 自动保存到标准路径(双轨)
|
||||
7. ✅ 清理临时数据文件
|
||||
|
||||
---
|
||||
|
||||
## 📋 课评生成规则
|
||||
|
||||
### 学生状态处理
|
||||
- **出勤** → 正常生成课评,保存到 `feedback/`
|
||||
- **请假** → 仅生成请假记录 `(请假).md`
|
||||
- **补课** → 保存到 `补课/feedback/`
|
||||
- **体验** → 保存到 `补课/feedback/`
|
||||
|
||||
### 三段式结构(固定不变)
|
||||
```
|
||||
第1段(30-55字):课程知识点,末尾1个emoji
|
||||
第2段(100-220字,弹性):掌握+环节+亮点,1-3个emoji分散插入
|
||||
第3段(30-55字):课后建议,末尾1个emoji
|
||||
```
|
||||
|
||||
### 称呼规则
|
||||
- 优先用小名/昵称
|
||||
- 其次用去姓称名
|
||||
- 单字名叠字化
|
||||
|
||||
### Emoji规则
|
||||
- 第1段:🔍 💡 ⚙️(根据课程类型)
|
||||
- 第2段:💪 ✨ 📈 🎯(根据亮点)
|
||||
- 第3段:🏠 🔧(根据建议)
|
||||
|
||||
---
|
||||
|
||||
## 💾 自动保存规则
|
||||
|
||||
### 文件路径(课评规范V1.0标准)
|
||||
```
|
||||
.claude/memory/class/{班级}/
|
||||
├── summaries/YYYYMMDD_{课程编号}_{班级反馈}.md
|
||||
├── {学生}/
|
||||
│ └── feedback/YYYYMMDD_{课程编号}_{课次}.md
|
||||
└──补课/{学生}/
|
||||
└── feedback/YYYYMMDD_{课程编号}.md
|
||||
```
|
||||
|
||||
### 无需确认,自动保存!
|
||||
课评生成后立即保存,无需教师点击确认。
|
||||
|
||||
---
|
||||
|
||||
## 📊 速记符号对照表
|
||||
|
||||
| 速记 | 含义 |
|
||||
|------|------|
|
||||
| gj# | 观望#分钟 |
|
||||
| zd# | 主动搭#层 |
|
||||
| zt | 自己调整 |
|
||||
| wb | 完成 |
|
||||
| ↑ | 开心 |
|
||||
| → | 稳定 |
|
||||
| ++ | 比上周进步 |
|
||||
| -- | 需关注 |
|
||||
|
||||
---
|
||||
|
||||
## 📝 触发方式
|
||||
|
||||
**主触发词:**
|
||||
- `/课评` → 启动超级简化流程
|
||||
- `/keping-simple` → 别名
|
||||
|
||||
**不触发其他技能:**
|
||||
- 不要触发 `keping-advanced` 或 `keping-optimizer`
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 关键配置
|
||||
|
||||
### 学期周数计算基准
|
||||
- 开学日期:2026年3月2日
|
||||
- 周数公式:Floor((当天-3月2日)/7) +1
|
||||
|
||||
### 班级目录路径
|
||||
```
|
||||
.claude/memory/class/{班级名称}/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 质量检查清单
|
||||
- [ ] 字数:180-350(根据输入丰富度)
|
||||
- [ ] 三段式结构完整
|
||||
- [ ] Emoji位置正确(段末/分散插入)
|
||||
- [ ] 称呼正确(不用全名)
|
||||
- [ ] 无周数显示(正文)
|
||||
- [ ] 路径符合课评规范V1.0
|
||||
|
||||
---
|
||||
|
||||
*版本:v5.1.0(表单直连提交)*
|
||||
*维护者:穹狼教学团队*
|
||||
*最后更新:2026-05-20*
|
||||
232
.claude/skills/keping-simplified/assets/form_template.html
Normal file
232
.claude/skills/keping-simplified/assets/form_template.html
Normal file
@@ -0,0 +1,232 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>课评填写表单 - 穹狼乐高编程</title>
|
||||
<style>
|
||||
:root {
|
||||
--primary:#6366f1; --secondary:#8b5cf6; --accent:#f59e0b; --success:#10b981;
|
||||
--bg:#f8fafc; --card:#ffffff; --text:#1e293b;
|
||||
}
|
||||
body { font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif; background:var(--bg); color:var(--text); margin:0; padding:20px; }
|
||||
.container { max-width:900px; margin:0 auto; }
|
||||
.card { background:var(--card); border-radius:16px; padding:24px; box-shadow:0 4px 20px rgba(0,0,0,0.08); margin-bottom:16px; }
|
||||
.header { text-align:center; padding:16px 0; }
|
||||
.header h1 { font-size:24px; margin:0 0 8px 0; }
|
||||
.header .meta { color:#64748b; font-size:14px; }
|
||||
.progress { margin:16px 0; }
|
||||
.progress-bar { display:flex; gap:8px; align-items:center; }
|
||||
.progress-text { font-weight:600; min-width:80px; }
|
||||
.progress-track { flex:1; height:12px; background:#e2e8f0; border-radius:999px; overflow:hidden; }
|
||||
.progress-fill { height:100%; background:linear-gradient(90deg,var(--primary),var(--secondary)); border-radius:999px; transition:width 0.3s ease; }
|
||||
.student { display:flex; gap:12px; align-items:start; padding:16px; background:#fafafa; border-radius:12px; margin-bottom:12px; }
|
||||
.student-header { min-width:140px; }
|
||||
.student-name { font-weight:700; font-size:18px; margin-bottom:8px; }
|
||||
.student-profile { font-size:12px; color:#94a3b8; margin-bottom:6px; max-width:150px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||
.status-buttons { display:flex; gap:6px; flex-wrap:wrap; }
|
||||
.status-btn { padding:6px 12px; border-radius:999px; border:2px solid #e2e8f0; background:#fff; cursor:pointer; font-weight:600; font-size:13px; transition:all 0.2s; }
|
||||
.status-btn:hover { border-color:#cbd5e1; }
|
||||
.status-btn.active { background:#ecfdf5; border-color:#10b981; color:#059669; }
|
||||
.status-btn[data-status=请假].active { background:#fef2f2; border-color:#f87171; color:#dc2626; }
|
||||
.status-btn[data-status=补课].active { background:#fffbeb; border-color:#f59e0b; color:#d97706; }
|
||||
.status-btn[data-status=体验].active { background:#eff6ff; border-color:#3b82f6; color:#2563eb; }
|
||||
.input-group { flex:1; display:flex; flex-direction:column; gap:8px; }
|
||||
.input-group label { font-size:13px; font-weight:600; color:#475569; }
|
||||
.input-group textarea { width:100%; padding:12px; border:2px solid #e2e8f0; border-radius:10px; min-height:80px; resize:vertical; font-size:14px; transition:border-color 0.2s; }
|
||||
.input-group textarea:focus { outline:none; border-color:var(--primary); }
|
||||
.symbols { font-size:12px; color:#94a3b8; display:flex; gap:12px; flex-wrap:wrap; }
|
||||
.add-student { border:2px dashed #cbd5e1; padding:16px; border-radius:12px; text-align:center; cursor:pointer; color:#64748b; transition:all 0.2s; }
|
||||
.add-student:hover { border-color:var(--primary); color:var(--primary); background:#eef2ff; }
|
||||
.actions { display:flex; gap:12px; justify-content:center; padding-top:16px; flex-wrap:wrap; }
|
||||
.btn { padding:14px 32px; border-radius:10px; font-weight:700; font-size:16px; cursor:pointer; border:none; transition:transform 0.1s,opacity 0.2s; }
|
||||
.btn-primary { background:linear-gradient(135deg,var(--primary),var(--secondary)); color:#fff; }
|
||||
.btn-success { background:linear-gradient(135deg,var(--success),#059669); color:#fff; }
|
||||
.btn:hover { transform:translateY(-2px); }
|
||||
.btn:active { transform:translateY(0); }
|
||||
.btn:disabled { opacity:0.5; cursor:not-allowed; transform:none; }
|
||||
.course-card { background:linear-gradient(135deg,#6366f115,#8b5cf615); border-left:4px solid var(--primary); }
|
||||
.course-title { font-size:18px; font-weight:700; margin:0 0 8px 0; }
|
||||
.course-details { color:#475569; line-height:1.6; }
|
||||
.toast { position:fixed; top:20px; left:50%; transform:translateX(-50%); padding:16px 32px; border-radius:12px; color:#fff; font-weight:600; z-index:1000; display:none; animation:fadeIn 0.3s; }
|
||||
.toast.success { background:var(--success); }
|
||||
.toast.error { background:#ef4444; }
|
||||
.toast.info { background:var(--primary); }
|
||||
@keyframes fadeIn { from{opacity:0;transform:translateX(-50%) translateY(-10px);} to{opacity:1;transform:translateX(-50%) translateY(0);} }
|
||||
.spinner { display:inline-block; width:16px; height:16px; border:2px solid #fff; border-top-color:transparent; border-radius:50%; animation:spin 0.6s linear infinite; margin-right:8px; vertical-align:middle; }
|
||||
@keyframes spin { to{transform:rotate(360deg);} }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="card header">
|
||||
<h1>📝 课评填写表单</h1>
|
||||
<div class="meta" id="classInfo">班级:发现世界-周四19点 | 第11周 | 2026-05-16</div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar">
|
||||
<div class="progress-text" id="progressText">0/5 完成</div>
|
||||
<div class="progress-track"><div class="progress-fill" id="progressFill" style="width:0%"></div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card course-card">
|
||||
<div class="course-title" id="courseTitle">📚 课程目标:DISC-011 蜥蜴</div>
|
||||
<div class="course-details" id="courseDetails">
|
||||
核心知识点:关节连接、可动结构、仿生设计<br>
|
||||
课时长度:60分钟
|
||||
</div>
|
||||
</div>
|
||||
<div id="studentsList"></div>
|
||||
<div class="add-student" id="addStudentBtn">+ 添加临时学生(补课/体验)</div>
|
||||
<div class="actions">
|
||||
<button class="btn btn-primary" id="submitBtn">🚀 提交并保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="toast" id="toast"></div>
|
||||
<script>
|
||||
const SERVER_URL = window.location.origin;
|
||||
|
||||
const templateStudents = [{name:"梁家铭", status:"出勤", performance:""},{name:"简思瑜", status:"出勤", performance:""},{name:"简思霖", status:"请假", performance:""},{name:"罗钧龄", status:"出勤", performance:""},{name:"黄晓瑜", status:"出勤", performance:""},{name:"黄馨宸", status:"请假", performance:""}];
|
||||
|
||||
let students = [...templateStudents];
|
||||
let currentClass = "发现世界-周四19点";
|
||||
let currentWeek = 11;
|
||||
let currentDate = "2026-05-16";
|
||||
let courseInfo = {code:"DISC-011", title:"蜥蜴", knowledge:["关节连接","可动结构","仿生设计"], duration:"60分钟"};
|
||||
|
||||
function showToast(msg, type) {
|
||||
const t = document.getElementById("toast");
|
||||
t.textContent = msg;
|
||||
t.className = "toast " + type;
|
||||
t.style.display = "block";
|
||||
setTimeout(function(){ t.style.display = "none"; }, 3000);
|
||||
}
|
||||
|
||||
function init() {
|
||||
renderStudents();
|
||||
updateProgress();
|
||||
}
|
||||
|
||||
function renderStudents() {
|
||||
var container = document.getElementById("studentsList");
|
||||
container.innerHTML = "";
|
||||
students.forEach(function(s, idx) {
|
||||
var el = document.createElement("div");
|
||||
el.className = "student";
|
||||
var profileHtml = s.profile ? '<div class="student-profile" title="' + s.profile.replace(/"/g,'"') + '">📋 ' + s.profile.substring(0,40) + '...</div>' : '';
|
||||
el.innerHTML =
|
||||
'<div class="student-header">' +
|
||||
'<div class="student-name">' + s.name + '</div>' +
|
||||
profileHtml +
|
||||
'<div class="status-buttons">' +
|
||||
'<button class="status-btn' + (s.status=='出勤'?' active':'') + '" data-status="出勤" data-idx="' + idx + '">出勤</button>' +
|
||||
'<button class="status-btn' + (s.status=='请假'?' active':'') + '" data-status="请假" data-idx="' + idx + '">请假</button>' +
|
||||
'<button class="status-btn' + (s.status=='补课'?' active':'') + '" data-status="补课" data-idx="' + idx + '">补课</button>' +
|
||||
'<button class="status-btn' + (s.status=='体验'?' active':'') + '" data-status="体验" data-idx="' + idx + '">体验</button>' +
|
||||
'</div></div>' +
|
||||
'<div class="input-group">' +
|
||||
'<label>课堂表现(支持速记:gj观望、zd主动)</label>' +
|
||||
'<textarea id="perf-' + idx + '" placeholder="例如:gj5观望5分钟→zd3主动搭3层→zt自己调整,开心↑">' + (s.performance||'') + '</textarea>' +
|
||||
'<div class="symbols">' +
|
||||
'<span>💡 gj#=观望#分钟</span><span>💡 zd#=主动搭#层</span><span>💡 zt=自己调整</span>' +
|
||||
'<span>💡 ↑=开心</span><span>💡 →=稳定</span><span>💡 ++=进步</span>' +
|
||||
'</div></div>';
|
||||
container.appendChild(el);
|
||||
});
|
||||
|
||||
document.querySelectorAll(".status-btn").forEach(function(b) {
|
||||
b.addEventListener("click", function(e) {
|
||||
var idx = parseInt(b.dataset.idx);
|
||||
students[idx].status = b.dataset.status;
|
||||
renderStudents();
|
||||
updateProgress();
|
||||
});
|
||||
});
|
||||
|
||||
document.querySelectorAll(".input-group textarea").forEach(function(t) {
|
||||
t.addEventListener("input", function(e) {
|
||||
var idx = parseInt(t.id.replace("perf-",""));
|
||||
students[idx].performance = t.value;
|
||||
updateProgress();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateProgress() {
|
||||
var done = students.filter(function(x) {
|
||||
return x.status !== '出勤' || (x.performance && x.performance.trim());
|
||||
}).length;
|
||||
var total = students.length;
|
||||
var pct = Math.round((done/total)*100);
|
||||
document.getElementById("progressText").textContent = done + '/' + total + ' 完成';
|
||||
document.getElementById("progressFill").style.width = pct + '%';
|
||||
}
|
||||
|
||||
function addStudent() {
|
||||
students.push({name:"新学生", status:"体验", performance:"", profile:""});
|
||||
renderStudents();
|
||||
updateProgress();
|
||||
}
|
||||
|
||||
function submitForm() {
|
||||
var btn = document.getElementById("submitBtn");
|
||||
var origText = btn.textContent;
|
||||
|
||||
// 检查出勤学生是否都填了表现
|
||||
var unfilled = students.filter(function(s) {
|
||||
return s.status === '出勤' && (!s.performance || !s.performance.trim());
|
||||
});
|
||||
if (unfilled.length > 0) {
|
||||
var names = unfilled.map(function(s){ return s.name; }).join('、');
|
||||
showToast('⚠️ 出勤学生 ' + names + ' 还未填写表现', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
// 按钮loading状态
|
||||
btn.disabled = true;
|
||||
btn.innerHTML = '<span class="spinner"></span>提交中...';
|
||||
|
||||
var payload = {
|
||||
class: currentClass,
|
||||
week: currentWeek,
|
||||
date: currentDate,
|
||||
course: courseInfo,
|
||||
students: students.map(function(s) {
|
||||
return {
|
||||
name: s.name,
|
||||
status: s.status,
|
||||
performance: s.performance || ''
|
||||
};
|
||||
})
|
||||
};
|
||||
|
||||
fetch(SERVER_URL + '/api/submit', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify(payload)
|
||||
})
|
||||
.then(function(r) { return r.json(); })
|
||||
.then(function(data) {
|
||||
if (data.success) {
|
||||
showToast('✅ 提交成功!' + data.message, 'success');
|
||||
btn.innerHTML = '✅ 已保存 — 可关闭此页面';
|
||||
btn.className = 'btn btn-success';
|
||||
} else {
|
||||
showToast('❌ 提交失败:' + data.message, 'error');
|
||||
btn.disabled = false;
|
||||
btn.textContent = origText;
|
||||
}
|
||||
})
|
||||
.catch(function(err) {
|
||||
showToast('❌ 网络错误:无法连接服务器,请确认服务器已启动', 'error');
|
||||
btn.disabled = false;
|
||||
btn.textContent = origText;
|
||||
});
|
||||
}
|
||||
|
||||
document.getElementById("addStudentBtn").addEventListener("click", addStudent);
|
||||
document.getElementById("submitBtn").addEventListener("click", submitForm);
|
||||
init();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
34
.claude/skills/keping-simplified/config.json
Normal file
34
.claude/skills/keping-simplified/config.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "keping-simplified",
|
||||
"skill_name": "keping-simplified",
|
||||
"version": "5.0.0",
|
||||
"description": "超级简化版课评生成器!只需输入 \"/课评\" 即可启动,一键生成,自动保存。支持周数选择、班级选择、学生状态选择、速记输入、进度条显示。为穹狼乐高编程设计。",
|
||||
"triggers": [
|
||||
"/课评",
|
||||
"/keping-simple",
|
||||
"/简单课评",
|
||||
"生成课评",
|
||||
"写课评"
|
||||
],
|
||||
"semester_config": {
|
||||
"baseline_date": "2026-03-02",
|
||||
"week_calculation": "Floor((current_date - 2026-03-02) / 7) + 1",
|
||||
"total_weeks": 20,
|
||||
"current_week": 11,
|
||||
"current_date": "2026-05-17"
|
||||
},
|
||||
"class_types": {
|
||||
"DISC": { "prefix": "DISC", "age_group": "preschool", "style": "warm" },
|
||||
"CREATE": { "prefix": "CREATE", "age_group": "preschool", "style": "warm" },
|
||||
"INVENT": { "prefix": "INVENT", "age_group": "preschool", "style": "warm" },
|
||||
"TUBE": { "prefix": "TUBE", "age_group": "preschool", "style": "warm" },
|
||||
"SPIKE": { "prefix": "SPIKE", "age_group": "elementary", "style": "concise" },
|
||||
"AICODE03": { "prefix": "AICODE03", "age_group": "elementary", "style": "technical" },
|
||||
"CSP": { "prefix": "CSP", "age_group": "elementary", "style": "technical" }
|
||||
},
|
||||
"paths": {
|
||||
"class_root": ".claude/memory/class",
|
||||
"lesson_root": ".claude/memory/lesson",
|
||||
"template": ".claude/skills/keping-simplified/assets/form_template.html"
|
||||
}
|
||||
}
|
||||
285
.claude/skills/keping-simplified/references/generation_rules.md
Normal file
285
.claude/skills/keping-simplified/references/generation_rules.md
Normal file
@@ -0,0 +1,285 @@
|
||||
# keping-simplified — 生成规则详解
|
||||
|
||||
## 1️⃣ 启动流程规则
|
||||
|
||||
### 第一步:响应 /课评 命令
|
||||
|
||||
当用户输入 `/课评`,立即启动简化流程。**跳过任何其他判断**。
|
||||
|
||||
```python
|
||||
用户输入:/课评
|
||||
→ 执行:启动简化流程
|
||||
→ 目标:一周数+日期选择界面
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2️⃣ 周数与日期计算规则
|
||||
|
||||
### 基准设置
|
||||
- **学期开学日**:2026-03-02(第1周周一)
|
||||
- **当前日期**:自动获取今天的日期
|
||||
- **周数计算公式**:
|
||||
```
|
||||
周数 = Floor((当前日期 - 2026-03-02) / 7) + 1
|
||||
```
|
||||
|
||||
### 日期选择界面示例
|
||||
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
📅 第11周 | 选择日期
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
当前日期:2026-05-16
|
||||
|
||||
请选择周几:
|
||||
[1] 周一
|
||||
[2] 周二
|
||||
[3] 周三
|
||||
[4] 周四
|
||||
[5] 周五
|
||||
[6] 周六
|
||||
[7] 周日
|
||||
|
||||
[其他日期] 手动输入 YYYY-MM-DD
|
||||
```
|
||||
|
||||
### 用户选择后
|
||||
- 根据周几推算具体日期(基于当前周)
|
||||
- 进入班级选择
|
||||
|
||||
---
|
||||
|
||||
## 3️⃣ 班级选择规则
|
||||
|
||||
### 读取班级列表
|
||||
1. 扫描 `.claude/memory/class/` 目录
|
||||
2. 列出所有班级文件夹名称
|
||||
3. 按字母/时间排序显示
|
||||
|
||||
### 界面示例
|
||||
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
🎯 选择班级 | 第11周 · 2026-05-16
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
可选班级:
|
||||
[1] 发现世界-周四19点
|
||||
[2] Wedo创造世界-周六1030
|
||||
[3] AICODE03小Q周六1400
|
||||
[4] SPIKE02-周日1030
|
||||
[5] 手动输入班级名称
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4️⃣ 课程目标加载规则
|
||||
|
||||
### 策略 A:找到课程教案(优先)
|
||||
|
||||
按顺序查找:
|
||||
1. 班级目录下是否有历史课程记录
|
||||
2. memory/lesson/ 目录下查找第X周课程
|
||||
3. 基于班级类型匹配课程编号
|
||||
|
||||
**匹配成功后显示:**
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
📚 课程目标确认
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
课程代码:DISC-011
|
||||
课程主题:蜥蜴
|
||||
核心知识点:关节连接、可动结构、仿生设计
|
||||
课时长度:60分钟
|
||||
|
||||
[1] 确认使用这个
|
||||
[2] 修改课程目标
|
||||
```
|
||||
|
||||
### 策略 B:没找到课程教案(降级)
|
||||
|
||||
```
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
⚠️ 未找到课程教案,请手动输入
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
请填写本周课程目标:
|
||||
课程主题:
|
||||
核心知识点:
|
||||
[1] 跳过,用通用模板
|
||||
[2] 保存为常用课程
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5️⃣ HTML 表单启动规则
|
||||
|
||||
### 创建并打开表单
|
||||
|
||||
1. 复制模板 `assets/form_template.html`
|
||||
2. 替换占位符:
|
||||
- `CLASS_NAME` → 班级名
|
||||
- `WEEK_NUM` → 周数
|
||||
- `DATE_STR` → 日期
|
||||
- `COURSE_CODE` → 课程代码
|
||||
- `COURSE_TITLE` → 课程主题
|
||||
- `STUDENTS_LIST` → 学生JSON
|
||||
3. 保存为临时文件(例如 `temp_form_YYYYMMDD_HHMMSS.html`)
|
||||
4. 自动在浏览器打开
|
||||
|
||||
### 学生列表加载
|
||||
|
||||
从班级目录读取:
|
||||
- `.claude/memory/class/{班级}/` 下的子文件夹
|
||||
- 每个子文件夹是一个学生
|
||||
- 读取 `profile.md` 获取小名/昵称(如果有)
|
||||
|
||||
```json
|
||||
{
|
||||
"students": [
|
||||
{ "name": "梁家铭", "nickname": null },
|
||||
{ "name": "简思瑜", "nickname": "小鱼" },
|
||||
...
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6️⃣ 速记符号解析规则
|
||||
|
||||
### 速记对照表
|
||||
|
||||
| 速记 | 解析为中文描述 |
|
||||
|------|--------------|
|
||||
| `gj#` | 观望#分钟 |
|
||||
| `zd#` | 主动搭#层 |
|
||||
| `zt` | 自己调整 |
|
||||
| `wb` | 完成 |
|
||||
| `zx#` | 专注#分钟 |
|
||||
| `sb#` | 失败#次后调整 |
|
||||
| `ts#` | 探索#分钟 |
|
||||
| `cz#` | 创造#种方案 |
|
||||
| `wt#` | 提问#次 |
|
||||
| `hz` | 合作 |
|
||||
| `fx` | 分享 |
|
||||
| `tq` | 求助 |
|
||||
| `mr` | 融入 |
|
||||
| `ms` | 模仿 |
|
||||
| `jy` | 建议给同伴 |
|
||||
| `bd` | 被带动 |
|
||||
| `zl` | 孤立/独自 |
|
||||
| `cq` | 冲突/争执 |
|
||||
| `↑` or `kx` | 开心 |
|
||||
| `→` or `wd` | 稳定 |
|
||||
| `↓` or `fd` | 烦躁/低落 |
|
||||
| `~` or `bd` | 情绪波动 |
|
||||
| `↑↑` or `kc` | 非常开心/兴奋 |
|
||||
| `→→` or `wa` | 非常稳定/沉浸 |
|
||||
| `gd` | 孤独/独自玩 |
|
||||
| `jl` | 焦虑/紧张 |
|
||||
| `++` | 比上周进步 |
|
||||
| `--` | 需关注 |
|
||||
|
||||
### 解析示例
|
||||
|
||||
```
|
||||
输入:gj5→zd3→zt ↑++
|
||||
解析:观望5分钟后主动搭3层,自己调整,开心,比上周进步
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7️⃣ 课评生成规则
|
||||
|
||||
### 三段式结构(固定不变)
|
||||
|
||||
**第1段(课程知识点,30-55字):**
|
||||
- 包含:主题、1-2个核心知识点
|
||||
- 末尾1个emoji:🔍 💡 ⚙️(根据类型)
|
||||
|
||||
**第2段(课堂细节,100-220字,弹性):**
|
||||
- 整合:掌握程度+环节表现+成长亮点
|
||||
- emoji:1-3个,自然分散插入
|
||||
|
||||
**第3段(课后建议,30-55字):**
|
||||
- 具体可操作的家庭活动
|
||||
- 末尾1个emoji:🏠 🔧
|
||||
|
||||
### 字数弹性规则
|
||||
|
||||
| 输入丰富度 | 目标字数范围 |
|
||||
|----------|-----------|
|
||||
| 很简洁(只有1-2个速记)| 180-220 |
|
||||
| 中等(3-5个速记)| 220-280 |
|
||||
| 详细(5个以上+情绪+对比)| 280-350 |
|
||||
|
||||
### 称呼规则
|
||||
|
||||
1. 优先用小名/昵称(从 `profile.md` 读取)
|
||||
2. 其次用去姓称名(双字名 → 去掉姓)
|
||||
3. 单字名 → 叠字化
|
||||
|
||||
### Emoji 分配
|
||||
|
||||
| 位置 | 表情库 |
|
||||
|------|-------|
|
||||
| 第1段末尾 | 🔍 💡 ⚙️ |
|
||||
| 第2段亮点处 | 💪 ✨ 📈 🎯 🤝 😊 |
|
||||
| 第3段末尾 | 🏠 🔧 |
|
||||
|
||||
---
|
||||
|
||||
## 8️⃣ 保存规则
|
||||
|
||||
### 文件路径标准
|
||||
|
||||
```
|
||||
.claude/memory/class/{班级名称}/
|
||||
├── summaries/
|
||||
│ └── YYYYMMDD_{课程代码}_{班级反馈}.md
|
||||
├── {学生姓名}/
|
||||
│ └── feedback/
|
||||
│ └── YYYYMMDD_{课程代码}_{课次}.md
|
||||
└──补课/{学生姓名}/
|
||||
└── feedback/
|
||||
└── YYYYMMDD_{课程代码}.md
|
||||
```
|
||||
|
||||
### 学生类型-保存路径映射
|
||||
|
||||
| 学生状态 | 保存位置 |
|
||||
|---------|--------|
|
||||
| 出勤 | {班级}/{学生}/feedback/ |
|
||||
| 请假 | {班级}/{学生}/feedback/(带 `(请假)` 标记)|
|
||||
| 补课 | {班级}/补课/{学生}/feedback/ |
|
||||
| 体验 | {班级}/补课/{学生}/feedback/ |
|
||||
|
||||
### 自动保存时机
|
||||
|
||||
课评生成完成后立即保存,无需教师确认。
|
||||
|
||||
---
|
||||
|
||||
## 9️⃣ 请假/补课/体验处理
|
||||
|
||||
### 请假
|
||||
- 生成:请假记录文件
|
||||
- 路径:`feedback/YYYYMMDD_{课程编号}(请假).md`
|
||||
- 内容:简洁说明请假
|
||||
|
||||
### 补课
|
||||
- 路径:`补课/{学生}/feedback/YYYYMMDD_{课程编号}.md`
|
||||
- 课评正文:不提及"补课"二字
|
||||
- 文件名:可标记来源
|
||||
|
||||
### 体验
|
||||
- 路径:`补课/{学生}/feedback/YYYYMMDD_{课程编号}.md`
|
||||
- 课评:正常写(不提"体验")
|
||||
|
||||
---
|
||||
|
||||
*最后更新:2026-05-16*
|
||||
67
.claude/skills/keping-simplified/快速参考卡.md
Normal file
67
.claude/skills/keping-simplified/快速参考卡.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# 🚀 keping-simplified — 快速参考卡
|
||||
|
||||
## 💡 如何启动(只需一个命令!)
|
||||
```
|
||||
输入:/周六(或 /课评)
|
||||
```
|
||||
|
||||
## 📋 完整流程(v5.0 直连提交版)
|
||||
```
|
||||
1️⃣ /周六
|
||||
↓
|
||||
2️⃣ 选择班级(已显示当周课程主题)
|
||||
↓
|
||||
3️⃣ 打开浏览器表单 → 填写学生表现 → 点击「提交并保存」
|
||||
↓ (数据 POST 到本地服务器,无需复制粘贴!)
|
||||
4️⃣ AI 自动检测信号文件 → 生成课评 → 双轨保存
|
||||
↓
|
||||
5️⃣ 完成!🗑️ 自动清理临时文件
|
||||
```
|
||||
|
||||
## ⌨️ 速记符号(最常用的)
|
||||
| 速记 | 含义 |
|
||||
|------|------|
|
||||
| gj# | 观望#分钟 |
|
||||
| zd# | 主动搭#层 |
|
||||
| zt | 自己调整 |
|
||||
| ↑ | 开心 |
|
||||
| → | 稳定 |
|
||||
| ++ | 比上周进步 |
|
||||
|
||||
## 📂 保存路径(自动)
|
||||
```
|
||||
.claude/memory/class/{班级}/
|
||||
├── summaries/
|
||||
│ └── YYYYMMDD_{课程}_班级反馈.md
|
||||
├── {学生}/
|
||||
│ └── feedback/
|
||||
│ └── YYYYMMDD_{课程}.md
|
||||
└──补课/{学生}/
|
||||
└── feedback/
|
||||
└── YYYYMMDD_{课程}.md
|
||||
```
|
||||
|
||||
## ⚙️ 四段式结构(输出固定)
|
||||
| 段落 | 内容 | 字数 | Emoji |
|
||||
|------|------|------|------|
|
||||
| 1️⃣ | 课程知识点 | 30-55 | 1个末尾 |
|
||||
| 2️⃣ | 掌握程度与操作细节 | 80-150 | 1-2个分散插入 |
|
||||
| 3️⃣ | 课堂亮点与成长 | 60-120 | 1-2个分散插入 |
|
||||
| 4️⃣ | 课后建议 | 30-55 | 1个末尾 |
|
||||
|
||||
**总字数**:标准版 220-300字,详细版 300-400字
|
||||
**总Emoji数**:3-5个
|
||||
|
||||
## 🎨 Emoji 使用规范
|
||||
|
||||
**总数量**:每篇课评使用 **3-5个** Emoji
|
||||
|
||||
| 位置 | 数量 | 用途 | 推荐表情 |
|
||||
|------|:----:|------|----------|
|
||||
| 第1段(知识点) | 1个 | 段尾点缀 | 🔍 💡 ⚙️ 🎯 |
|
||||
| 第2段(掌握与操作) | 1-2个 | 分散插入 | 💪 ✨ 📈 🤝 |
|
||||
| 第3段(亮点与成长) | 1-2个 | 分散插入 | 😊 🌟 💫 🎉 |
|
||||
| 第4段(建议) | 1个 | 段尾点缀 | 🏠 🔧 📚 |
|
||||
|
||||
---
|
||||
*版本:v5.0 | 最后更新:2026-05-22*
|
||||
Reference in New Issue
Block a user