更新课评系统代码

This commit is contained in:
qiuyan
2026-06-02 23:01:58 +08:00
parent f8c4b6174f
commit cd05b8a5a7
45 changed files with 8260 additions and 345 deletions

View 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创造世界-周六1030CREATE-011 推磨机器人)
[3] AICODE03小Q周六1400AICODE03-011 AI文档写作
[4] SPIKE02-周日1030SPIKE-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*

View 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,'&quot;') + '">📋 ' + 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>

View 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"
}
}

View 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字弹性**
- 整合:掌握程度+环节表现+成长亮点
- emoji1-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*

View 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*