首页/ mobileweb/ 家校沟通H5移动端功能演示/ 代码预览

💻 代码预览 · 家校沟通H5移动端功能演示

mw_edu · 上传者 驰旭教育
← 返回详情
index.html · 约 35114 字符
1<!DOCTYPE html>
2<html lang="zh-CN">
3<head>
4<meta charset="UTF-8">
5<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
6<title>家校沟通</title>
7<script src="../_vendor/jquery.min.js"></script>
8<style>
9  * { margin:0; padding:0; box-sizing:border-box; -webkit-tap-highlight-color:transparent; }
10  :root{
11    --blue:#2563eb; --blue2:#1d4ed8; --cyan:#06b6d4; --amber:#f59e0b;
12    --red:#ef4444; --green:#22c55e; --bg:#f4f6fb; --card:#ffffff;
13    --text:#1f2937; --mute:#8a93a6; --line:#eef1f6;
14  }
15  body{ font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
16    background:#dfe4ee; color:var(--text); }
17  .app{ max-width:430px; margin:0 auto; min-height:100vh; background:var(--bg);
18    position:relative; padding-bottom:66px; box-shadow:0 0 28px rgba(0,0,0,.08); }
19  .topbar{ background:linear-gradient(120deg,var(--blue),var(--cyan)); color:#fff;
20    padding:16px 18px 14px; display:flex; align-items:center; gap:12px; }
21  .topbar .back{ font-size:20px; cursor:pointer; display:none; }
22  .topbar .tt{ font-size:19px; font-weight:800; letter-spacing:.5px; }
23  .topbar .role{ margin-left:auto; font-size:12px; background:rgba(255,255,255,.2);
24    padding:5px 11px; border-radius:999px; font-weight:600; }
25  .views{ padding:14px; }
26  .view{ display:none; }
27  .view.active{ display:block; animation:fade .22s ease; }
28  @keyframes fade{ from{opacity:0;transform:translateY(6px)} to{opacity:1;transform:none} }
29  .card{ background:var(--card); border-radius:16px; padding:15px; margin-bottom:13px;
30    box-shadow:0 4px 16px rgba(31,41,55,.05); }
31  .card h3{ font-size:15px; margin-bottom:12px; display:flex; align-items:center; gap:7px; }
32  .card h3 .ic{ font-size:17px; }
33  .card h3 .more{ margin-left:auto; font-size:12px; color:var(--blue); font-weight:600; }
34  .hint{ font-size:12px; color:var(--mute); margin:-6px 0 12px; }
35  /* 概览 */
36  .ov{ display:grid; grid-template-columns:repeat(2,1fr); gap:11px; }
37  .ovc{ background:linear-gradient(135deg,#eef3ff,#f4f9ff); border-radius:14px; padding:13px; }
38  .ovc .n{ font-size:12px; color:#5b6b8c; }
39  .ovc .v{ font-size:23px; font-weight:800; color:var(--blue2); margin-top:4px; }
40  .ovc .v small{ font-size:12px; color:var(--mute); font-weight:600; }
41  /* 九宫格 */
42  .grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:11px; }
43  .gi{ background:var(--card); border-radius:14px; padding:14px 6px; text-align:center;
44    box-shadow:0 4px 14px rgba(31,41,55,.05); cursor:pointer; transition:.12s; }
45  .gi:active{ transform:scale(.97); }
46  .gi .e{ font-size:26px; }
47  .gi .t{ font-size:12.5px; font-weight:700; margin-top:7px; color:#3a4661; }
48  .gi .b{ display:inline-block; margin-top:4px; font-size:10.5px; color:#fff; background:var(--red);
49    border-radius:999px; padding:1px 7px; font-weight:700; }
50  /* 列表行 */
51  .row{ display:flex; align-items:center; gap:12px; padding:12px 4px; border-bottom:1px solid var(--line);
52    cursor:pointer; }
53  .row:last-child{ border-bottom:none; }
54  .row:active{ background:#fafbff; }
55  .ava{ width:42px; height:42px; border-radius:12px; background:#eef2ff; display:flex; align-items:center;
56    justify-content:center; font-size:22px; flex:0 0 auto; }
57  .ri{ flex:1; min-width:0; }
58  .ri .a{ font-size:14.5px; font-weight:700; }
59  .ri .b{ font-size:12px; color:var(--mute); margin-top:3px; overflow:hidden;
60    text-overflow:ellipsis; white-space:nowrap; }
61  .rt{ text-align:right; flex:0 0 auto; font-size:12px; color:var(--mute); }
62  .tag{ font-size:11px; font-weight:700; padding:3px 9px; border-radius:999px; }
63  .tag.red{ background:#ffe1e1; color:#d62727; }
64  .tag.amber{ background:#fff0d6; color:#b9740a; }
65  .tag.green{ background:#ddfbe6; color:#15803d; }
66  .tag.blue{ background:#e3edff; color:#1d4ed8; }
67  .tag.gray{ background:#eef1f6; color:#8a93a6; }
68  .bar{ height:6px; border-radius:6px; background:#eef1f6; margin-top:7px; overflow:hidden; }
69  .bar > i{ display:block; height:100%; border-radius:6px; background:linear-gradient(90deg,var(--blue),var(--cyan)); }
70  .btn{ width:100%; margin-top:13px; padding:13px; border:none; border-radius:13px;
71    background:linear-gradient(120deg,var(--blue),var(--cyan)); color:#fff; font-size:15.5px;
72    font-weight:800; cursor:pointer; letter-spacing:1px; }
73  .btn:active{ transform:scale(.99); }
74  .btn.line{ background:#fff; color:var(--blue); border:1.5px solid var(--blue); }
75  .empty{ text-align:center; color:var(--mute); padding:44px 20px; font-size:13.5px; }
76  .empty .e{ font-size:38px; margin-bottom:10px; }
77  /* 统计小条 */
78  .stat{ display:flex; gap:10px; margin-bottom:12px; }
79  .stat .s{ flex:1; text-align:center; background:#f7f9fc; border-radius:12px; padding:10px 4px; }
80  .stat .s .v{ font-size:19px; font-weight:800; color:var(--blue2); }
81  .stat .s .l{ font-size:11.5px; color:var(--mute); margin-top:3px; }
82  /* 雷达 */
83  .radar{ text-align:center; }
84  .radar svg{ max-width:230px; }
85  /* 进退步 */
86  .up{ color:var(--green); font-weight:800; }
87  .down{ color:var(--red); font-weight:800; }
88  /* tabbar */
89  .tabbar{ position:fixed; bottom:0; left:50%; transform:translateX(-50%); width:100%; max-width:430px;
90    height:62px; background:#fff; border-top:1px solid var(--line); display:flex; }
91  .tabbar button{ flex:1; border:none; background:none; font-size:11.5px; color:var(--mute);
92    display:flex; flex-direction:column; align-items:center; justify-content:center; gap:3px; cursor:pointer; }
93  .tabbar button .ti{ font-size:20px; }
94  .tabbar button.on{ color:var(--blue); font-weight:700; }
95  /* 子导航 */
96  .sub{ display:flex; gap:8px; margin-bottom:13px; overflow-x:auto; }
97  .sub::-webkit-scrollbar{ display:none; }
98  .sub button{ flex:0 0 auto; border:1.5px solid var(--line); background:#fff; border-radius:999px;
99    padding:7px 15px; font-size:13px; font-weight:600; color:#5b6b8c; cursor:pointer; }
100  .sub button.on{ background:var(--blue); border-color:var(--blue); color:#fff; }
101  /* 结算/报告 */
102  .rep{ background:#f7f9fc; border-radius:12px; padding:13px; font-size:13px; color:#4b5563; line-height:1.7; }
103  .rep b{ color:var(--blue2); }
104  /* 留言气泡 */
105  .msg{ display:flex; gap:10px; margin-bottom:13px; }
106  .msg .b{ background:#eef2ff; border-radius:0 13px 13px 13px; padding:10px 13px; font-size:13.5px;
107    line-height:1.55; max-width:78%; }
108  .msg.me{ flex-direction:row-reverse; }
109  .msg.me .b{ background:linear-gradient(120deg,var(--blue),var(--cyan)); color:#fff;
110    border-radius:13px 0 13px 13px; }
111  .msg .who{ font-size:11px; color:var(--mute); margin-bottom:4px; }
112  .msg.me .who{ text-align:right; }
113  .timeline{ position:relative; padding-left:18px; }
114  .timeline:before{ content:""; position:absolute; left:5px; top:4px; bottom:4px; width:2px; background:var(--line); }
115  .tl{ position:relative; padding:0 0 16px 6px; }
116  .tl:before{ content:""; position:absolute; left:-16px; top:4px; width:10px; height:10px; border-radius:50%;
117    background:var(--blue); box-shadow:0 0 0 3px #e3edff; }
118  .tl .d{ font-size:11px; color:var(--mute); }
119  .tl .t{ font-size:14px; font-weight:700; margin:3px 0; }
120  .tl .c{ font-size:12.5px; color:#5b6678; line-height:1.55; }
121  .toast{ position:fixed; left:50%; top:42%; transform:translate(-50%,-50%) scale(.9); z-index:50;
122    background:rgba(17,24,39,.9); color:#fff; padding:13px 22px; border-radius:12px; font-size:14px;
123    font-weight:700; opacity:0; pointer-events:none; transition:.2s; }
124  .toast.show{ opacity:1; transform:translate(-50%,-50%) scale(1); }
125</style>
126</head>
127<body>
128<div class="app">
129  <header class="topbar">
130    <span class="back" id="backBtn">‹</span>
131    <span class="tt" id="topTitle">家校沟通</span>
132    <span class="role" id="roleBtn">👨‍🏫 老师端</span>
133  </header>
134
135  <main class="views">
136    <!-- 工作台 -->
137    <section class="view active" id="view-home">
138      <div class="ov">
139        <div class="ovc"><div class="n">未读通知</div><div class="v">3 <small>条</small></div></div>
140        <div class="ovc"><div class="n">待批改作业</div><div class="v">12 <small>份</small></div></div>
141        <div class="ovc"><div class="n">今日打卡</div><div class="v">38<small>/45</small></div></div>
142        <div class="ovc"><div class="n">待确认签字</div><div class="v">5 <small>份</small></div></div>
143      </div>
144      <div class="card">
145        <h3><span class="ic">🧩</span>全部功能</h3>
146        <div class="grid">
147          <div class="gi" data-go="notice"><div class="e">📢</div><div class="t">通知公告</div><span class="b">3未读</span></div>
148          <div class="gi" data-go="homework"><div class="e">📚</div><div class="t">作业管理</div></div>
149          <div class="gi" data-go="checkin"><div class="e">✅</div><div class="t">打卡任务</div></div>
150          <div class="gi" data-go="score"><div class="e">📊</div><div class="t">成绩管理</div></div>
151          <div class="gi" data-go="eval"><div class="e">🌟</div><div class="t">表现评价</div></div>
152          <div class="gi" data-go="fee"><div class="e">💰</div><div class="t">班费缴费</div></div>
153          <div class="gi" data-go="leave"><div class="e">🏖️</div><div class="t">请假审批</div></div>
154          <div class="gi" data-go="talk"><div class="e">💬</div><div class="t">班级讨论</div></div>
155          <div class="gi" data-go="growth"><div class="e">🌱</div><div class="t">成长档案</div></div>
156        </div>
157      </div>
158      <div class="card">
159        <h3><span class="ic">📌</span>今日待办 <span class="more" data-go="notice">去处理</span></h3>
160        <div class="row" data-go="notice"><div class="ava">📢</div><div class="ri"><div class="a">周五家长会通知</div><div class="b">需手写签字确认 · 5 人未签</div></div><span class="tag amber">待确认</span></div>
161        <div class="row" data-go="homework"><div class="ava">📚</div><div class="ri"><div class="a">数学单元测验批改</div><div class="b">12 份待批改</div></div><span class="tag blue">进行中</span></div>
162        <div class="row" data-go="checkin"><div class="ava">✅</div><div class="ri"><div class="a">每日阅读打卡</div><div class="b">38/45 已打卡</div></div><span class="tag green">进行中</span></div>
163      </div>
164    </section>
165
166    <!-- 通知公告 -->
167    <section class="view" id="view-notice">
168      <div class="card">
169        <h3><span class="ic">📢</span>通知公告 <span class="more" id="noticeNew">+ 发通知</span></h3>
170        <div class="stat">
171          <div class="s"><div class="v">45</div><div class="l">应达家长</div></div>
172          <div class="s"><div class="v" id="readN">42</div><div class="l">已读</div></div>
173          <div class="s"><div class="v" id="unreadN">3</div><div class="l">未读</div></div>
174        </div>
175        <div id="noticeList"></div>
176        <button class="btn line" id="remindBtn">🔔 一键提醒未读家长(短信+电话)</button>
177      </div>
178    </section>
179
180    <!-- 作业管理 -->
181    <section class="view" id="view-homework">
182      <div class="sub" id="hwSub">
183        <button class="on" data-p="hwList">作业</button>
184        <button data-p="hwCorrect">批改</button>
185        <button data-p="hwWall">优秀墙</button>
186      </div>
187      <div class="panel" id="hwList">
188        <div class="card">
189          <h3><span class="ic">📚</span>作业列表 <span class="more" id="hwNew">+ 布置作业</span></h3>
190          <div id="hwListBox"></div>
191        </div>
192      </div>
193      <div class="panel" id="hwCorrect" style="display:none">
194        <div class="card">
195          <h3><span class="ic">✍️</span>在线批改</h3>
196          <div class="row"><div class="ava">👦</div><div class="ri"><div class="a">李明 · 数学单元测验</div><div class="b">已提交 · 拍照上传</div></div><span class="tag blue">待批改</span></div>
197          <div class="row"><div class="ava">👧</div><div class="ri"><div class="a">王芳 · 数学单元测验</div><div class="b">已提交 · 拍照上传</div></div><span class="tag blue">待批改</span></div>
198          <div class="stat">
199            <div class="s"><div class="v">33</div><div class="l">已交</div></div>
200            <div class="s"><div class="v">12</div><div class="l">待批改</div></div>
201            <div class="s"><div class="v">12</div><div class="l">未交</div></div>
202          </div>
203          <textarea style="width:100%;border:1.5px solid var(--line);border-radius:12px;padding:11px;font-size:13.5px;resize:none;height:70px;font-family:inherit" placeholder="写下评语,可一键打回重做…"></textarea>
204          <button class="btn" id="correctBtn">✓ 批改并评优</button>
205        </div>
206      </div>
207      <div class="panel" id="hwWall" style="display:none">
208        <div class="card">
209          <h3><span class="ic">🏅</span>优秀作业墙</h3>
210          <div class="row"><div class="ava">👧</div><div class="ri"><div class="a">王芳 · 英语朗读打卡</div><div class="b">发音标准,获老师评优 ⭐</div></div><span class="tag green">优秀</span></div>
211          <div class="row"><div class="ava">🧒</div><div class="ri"><div class="a">张浩 · 数学解题</div><div class="b">步骤清晰,方法新颖</div></div><span class="tag green">优秀</span></div>
212          <div class="row"><div class="ava">👦</div><div class="ri"><div class="a">陈乐 · 语文作文</div><div class="b">立意深刻,字迹工整</div></div><span class="tag green">优秀</span></div>
213        </div>
214      </div>
215    </section>
216
217    <!-- 打卡任务 -->
218    <section class="view" id="view-checkin">
219      <div class="card">
220        <h3><span class="ic">✅</span>打卡任务 <span class="more" id="ckNew">+ 发布打卡</span></h3>
221        <div class="sub" id="ckSub">
222          <button class="on" data-p="ckDaily">日常</button>
223          <button data-p="ckWisdom">智慧</button>
224          <button data-p="ckRank">排行榜</button>
225        </div>
226        <div class="panel" id="ckDaily">
227          <div class="row" data-dop="1"><div class="ava">📖</div><div class="ri"><div class="a">每日阅读 30 分钟</div><div class="b">38/45 已打卡 · 连续 12 天</div></div><span class="tag green">进行中</span></div>
228          <div class="row" data-dop="2"><div class="ava">🏃</div><div class="ri"><div class="a">跳绳 200 个</div><div class="b">41/45 已打卡</div></div><span class="tag green">进行中</span></div>
229          <div class="row" data-dop="3"><div class="ava">🦷</div><div class="ri"><div class="a">早晚刷牙打卡</div><div class="b">43/45 已打卡</div></div><span class="tag green">进行中</span></div>
230          <div class="stat">
231            <div class="s"><div class="v">38</div><div class="l">今日打卡</div></div>
232            <div class="s"><div class="v">7</div><div class="l">连续满勤</div></div>
233            <div class="s"><div class="v">3</div><div class="l">未打卡</div></div>
234          </div>
235          <button class="btn" id="ckBtn">📸 我已完成今日打卡</button>
236        </div>
237        <div class="panel" id="ckWisdom" style="display:none">
238          <div class="row"><div class="ava">🗣️</div><div class="ri"><div class="a">英语跟读打卡</div><div class="b">系统自动识别发音,智能评分</div></div><span class="tag blue">AI</span></div>
239          <div class="row"><div class="ava">✍️</div><div class="ri"><div class="a">听写打卡</div><div class="b">自动批改,错题汇总</div></div><span class="tag blue">AI</span></div>
240          <div class="row"><div class="ava">📐</div><div class="ri"><div class="a">口算打卡</div><div class="b">1-6 年级数学,自动计时</div></div><span class="tag blue">AI</span></div>
241        </div>
242        <div class="panel" id="ckRank" style="display:none">
243          <h3 style="font-size:14px;margin-bottom:10px">🏆 打卡排行榜(本周)</h3>
244          <div id="ckRankBox"></div>
245        </div>
246      </div>
247    </section>
248
249    <!-- 成绩管理 -->
250    <section class="view" id="view-score">
251      <div class="card">
252        <h3><span class="ic">📊</span>私密成绩查询</h3>
253        <p class="hint">家长仅可见自己孩子成绩 · 排名/分数段由老师设置</p>
254        <div class="sub" id="scSub">
255          <button class="on" data-p="scRadar">能力雷达</button>
256          <button data-p="scTrend">进退步</button>
257          <button data-p="scSeg">分数段</button>
258        </div>
259        <div class="panel" id="scRadar">
260          <div class="radar" id="radarBox"></div>
261          <div class="rep" id="radarRep"></div>
262        </div>
263        <div class="panel" id="scTrend" style="display:none">
264          <div class="row"><div class="ava">📈</div><div class="ri"><div class="a">语文</div><div class="b">班级第 5 → 第 2 名</div></div><span class="up">↑3</span></div>
265          <div class="row"><div class="ava">📉</div><div class="ri"><div class="a">数学</div><div class="b">班级第 3 → 第 8 名</div></div><span class="down">↓5</span></div>
266          <div class="row"><div class="ava">➡️</div><div class="ri"><div class="a">英语</div><div class="b">班级第 4 → 第 4 名</div></div><span class="tag gray">持平</span></div>
267          <div class="rep">综合排名:<b>第 4 名</b>(上期第 5 名),总分 <b>428</b> 分,较上次 <span class="up">↑12 分</span>。语文进步明显,数学需加强几何模块。</div>
268        </div>
269        <div class="panel" id="scSeg" style="display:none">
270          <h3 style="font-size:14px;margin-bottom:10px">班级分数段分布(数学)</h3>
271          <div id="scSegBox"></div>
272        </div>
273      </div>
274    </section>
275
276    <!-- 表现评价 -->
277    <section class="view" id="view-eval">
278      <div class="card">
279        <h3><span class="ic">🌟</span>班级积分榜 <span class="more" id="evalAdd">+ 加减分</span></h3>
280        <div id="evalBox"></div>
281      </div>
282      <div class="card">
283        <h3><span class="ic">👑</span>本周光荣榜</h3>
284        <div class="row"><div class="ava">🥇</div><div class="ri"><div class="a">王芳</div><div class="b">课堂积极 · 助人为乐 · 作业优秀</div></div><span class="tag amber">积分 286</span></div>
285        <div class="row"><div class="ava">🥈</div><div class="ri"><div class="a">张浩</div><div class="b">卫生值日 · 进步明显</div></div><span class="tag amber">积分 271</span></div>
286        <div class="row"><div class="ava">🥉</div><div class="ri"><div class="a">陈乐</div><div class="b">朗读打卡满勤 · 纪律好</div></div><span class="tag amber">积分 263</span></div>
287      </div>
288      <div class="card">
289        <h3><span class="ic">🤖</span>智能综合评语</h3>
290        <div class="rep">王芳同学本学期综合表现<b>优秀</b>:课堂互动积极(加分 42)、作业连续 8 周评优、阅读打卡全勤。建议保持优势,在<b>数学应用题</b>上投入更多练习。系统已生成学期综合评价报告并同步家长。</div>
291      </div>
292    </section>
293
294    <!-- 班费缴费 -->
295    <section class="view" id="view-fee">
296      <div class="card">
297        <h3><span class="ic">💰</span>班费 / 缴费管理</h3>
298        <div class="stat">
299          <div class="s"><div class="v">¥1,280</div><div class="l">已收</div></div>
300          <div class="s"><div class="v">¥320</div><div class="l">待收</div></div>
301          <div class="s"><div class="v">0%</div><div class="l">手续费</div></div>
302        </div>
303        <div id="feeBox"></div>
304        <button class="btn line" id="feeNew">+ 发起收款(春游活动费)</button>
305      </div>
306    </section>
307
308    <!-- 请假审批 -->
309    <section class="view" id="view-leave">
310      <div class="card">
311        <h3><span class="ic">🏖️</span>请假审批</h3>
312        <div id="leaveBox"></div>
313        <button class="btn" id="leaveNew">+ 提交请假申请</button>
314      </div>
315    </section>
316
317    <!-- 班级讨论 -->
318    <section class="view" id="view-talk">
319      <div class="sub" id="tkSub">
320        <button class="on" data-p="tkTopic">主题讨论</button>
321        <button data-p="tkChat">班级群</button>
322      </div>
323      <div class="panel" id="tkTopic">
324        <div class="card">
325          <h3><span class="ic">💡</span>主题讨论 <span class="more" id="tkNew">+ 发起</span></h3>
326          <div class="row" data-topic="1"><div class="ava">📝</div><div class="ri"><div class="a">秋游地点投票</div><div class="b">32 位家长参与 · 结果仅老师可见</div></div><span class="tag blue">投票中</span></div>
327          <div class="row" data-topic="2"><div class="ava">🍱</div><div class="ri"><div class="a">校服订购尺寸统计</div><div class="b">45 份已回收 · 可导出 Excel</div></div><span class="tag green">已完成</span></div>
328          <div class="row" data-topic="3"><div class="ava">📚</div><div class="ri"><div class="a">周末托管意向调查</div><div class="b">28 位家长填写</div></div><span class="tag blue">进行中</span></div>
329        </div>
330      </div>
331      <div class="panel" id="tkChat" style="display:none">
332        <div class="card">
333          <h3><span class="ic">👥</span>班级群(三(2)班)</h3>
334          <div class="msg"><div class="ava" style="width:34px;height:34px;font-size:17px">👩‍🏫</div><div><div class="who">王老师</div><div class="b">各位家长,明天早上 8 点准时到校,记得带跳绳 🤗</div></div></div>
335          <div class="msg me"><div class="ava" style="width:34px;height:34px;font-size:17px">🧑</div><div><div class="who">我</div><div class="b">收到,谢谢老师!</div></div></div>
336          <div class="msg"><div class="ava" style="width:34px;height:34px;font-size:17px">👩</div><div><div class="who">李妈妈</div><div class="b">已确认家长会签字,辛苦老师~</div></div></div>
337        </div>
338      </div>
339    </section>
340
341    <!-- 成长档案 -->
342    <section class="view" id="view-growth">
343      <div class="card">
344        <h3><span class="ic">🌱</span>成长档案 · 王芳</h3>
345        <div class="timeline" id="growthBox"></div>
346      </div>
347      <div class="card">
348        <h3><span class="ic">📋</span>综合素质评价</h3>
349        <div class="rep">品德发展 <b>优</b> · 学业水平 <b>优</b> · 身心健康 <b>良</b> · 艺术素养 <b>优</b> · 社会实践 <b>良</b>。累计获得电子奖状 <b>9</b> 张,阅读打卡 <b>186</b> 天。</div>
350      </div>
351    </section>
352
353    <!-- 我的 -->
354    <section class="view" id="view-me">
355      <div class="card" style="text-align:center;padding:22px 15px">
356        <div class="ava" style="width:64px;height:64px;font-size:34px;margin:0 auto 10px">👨‍🏫</div>
357        <div style="font-size:18px;font-weight:800">王老师</div>
358        <div style="font-size:13px;color:var(--mute);margin-top:4px">三(2)班班主任 · 语文老师</div>
359      </div>
360      <div class="card">
361        <h3><span class="ic">⚙️</span>常用</h3>
362        <div class="row" data-go="fee"><div class="ava">💰</div><div class="ri"><div class="a">班费 / 缴费</div><div class="b">查看收支与收款统计</div></div><span class="ti" style="color:var(--mute)">›</span></div>
363        <div class="row" data-go="leave"><div class="ava">🏖️</div><div class="ri"><div class="a">请假审批</div><div class="b">学生请假申请处理</div></div><span class="ti" style="color:var(--mute)">›</span></div>
364        <div class="row" data-go="growth"><div class="ava">🌱</div><div class="ri"><div class="a">成长档案</div><div class="b">学生综合素质记录</div></div><span class="ti" style="color:var(--mute)">›</span></div>
365        <div class="row" id="roleSwitch"><div class="ava">🔄</div><div class="ri"><div class="a">切换为家长端</div><div class="b">查看家长视角功能</div></div><span class="ti" style="color:var(--mute)">›</span></div>
366      </div>
367    </section>
368  </main>
369
370  <nav class="tabbar">
371    <button data-go="home" class="on"><span class="ti">🏠</span>工作台</button>
372    <button data-go="homework"><span class="ti">📚</span>作业</button>
373    <button data-go="talk"><span class="ti">💬</span>沟通</button>
374    <button data-go="me"><span class="ti">👤</span>我的</button>
375  </nav>
376</div>
377<div class="toast" id="toast"></div>
378
379<script>
380var TITLES = {
381  home:"家校沟通", notice:"通知公告", homework:"作业管理", checkin:"打卡任务",
382  score:"成绩管理", eval:"表现评价", fee:"班费缴费", leave:"请假审批",
383  talk:"班级讨论", growth:"成长档案", me:"我的"
384};
385var NOTICES = [
386  {t:"周五家长会通知",c:"本周五 19:00 线上家长会,请各位家长准时参加并手写签字确认。",read:false,sign:true,signed:false,time:"09:20"},
387  {t:"秋游活动安排",c:"下周三前往植物园,需穿校服、带水杯,费用 50 元。",read:false,sign:false,time:"08:40"},
388  {t:"数学单元测验成绩",c:"已发布私密成绩,家长仅可见自己孩子成绩。",read:false,sign:false,time:"昨天"},
389  {t:"夏季校服补订",c:"如需补订校服,请于本周内填写尺寸统计。",read:true,sign:false,time:"周一"}
390];
391var HW = [
392  {s:"数学",t:"第三单元测验(拍照上传)",done:33,total:45},
393  {s:"语文",t:"背诵课文《春》+ 录音",done:41,total:45},
394  {s:"英语",t:"跟读 Unit3 单词",done:38,total:45},
395  {s:"科学",t:"观察植物生长日记",done:29,total:45}
396];
397var CKRANK = [
398  {n:"王芳",d:21,ava:"👧"},{n:"张浩",d:20,ava:"🧒"},{n:"陈乐",d:20,ava:"👦"},
399  {n:"李明",d:18,ava:"👦"},{n:"刘洋",d:17,ava:"🧑"}
400];
401var SCORE_AXES = ["语文","数学","英语","科学","体育","艺术"];
402var SCORE_VALS = [92,78,88,85,90,83];
403var SCORE_MAX = 100;
404var SEG = [
405  {l:"90-100 分",n:8,c:"#22c55e"},{l:"80-89 分",n:19,c:"#06b6d4"},
406  {l:"70-79 分",n:12,c:"#2563eb"},{l:"60-69 分",n:5,c:"#f59e0b"},{l:"<60 分",n:1,c:"#ef4444"}
407];
408var EVAL = [
409  {n:"王芳",p:286,ava:"👧"},{n:"张浩",p:271,ava:"🧒"},{n:"陈乐",p:263,ava:"👦"},
410  {n:"李明",p:248,ava:"👦"},{n:"周婷",p:240,ava:"👧"}
411];
412var FEE = [
413  {item:"春游活动费",amt:"¥50",who:"45 人待交 · 已收 38 人",tag:"amber",st:"收款中"},
414  {item:"班费结余",amt:"¥1,280",who:"账目公开透明",tag:"green",st:"已公示"},
415  {item:"教材代办费",amt:"¥120",who:"45 人已全部缴纳",tag:"green",st:"已结清"}
416];
417var LEAVE = [
418  {n:"李明",r:"感冒发烧,需请假 1 天就医",st:"待审批",tag:"amber"},
419  {n:"周婷",r:"参加区舞蹈比赛,请假半天",st:"已通过",tag:"green"},
420  {n:"陈乐",r:"家庭出行,请假 2 天",st:"已通过",tag:"green"}
421];
422var GROWTH = [
423  {d:"2026-06-20",t:"数学单元测验满分",c:"获得老师评优,班级第 2 名 🏅"},
424  {d:"2026-06-10",t:"阅读打卡 180 天",c:"连续满勤,获电子奖状"},
425  {d:"2026-05-28",t:"校园书法比赛一等奖",c:"艺术素养评价记为优"},
426  {d:"2026-05-15",t:"助人为乐表扬",c:"主动帮助同学,课堂加分 +5"}
427];
428
429var curView = "home";
430function toast(m){ var t=$("#toast"); t.text(m).addClass("show"); setTimeout(function(){t.removeClass("show");},1400); }
431function show(v){
432  curView = v;
433  $(".view").removeClass("active"); $("#view-"+v).addClass("active");
434  $("#topTitle").text(TITLES[v]||"家校沟通");
435  $("#backBtn").css("display", v==="home"?"none":"block");
436  $(".tabbar button").removeClass("on");
437  var map={homework:"homework",talk:"talk",me:"me"};
438  var tb = map[v]||(v==="notice"||v==="checkin"||v==="score"||v==="eval"||v==="fee"||v==="leave"||v==="growth"?"home":"home");
439  if(map[v]) $('.tabbar button[data-go="'+map[v]+'"]').addClass("on");
440}
441function renderNotice(){
442  var h = NOTICES.map(function(n,i){
443    var badge = n.sign ? (n.signed?'<span class="tag green">已签字</span>':'<span class="tag amber">待签字</span>') : (n.read?'<span class="tag gray">已读</span>':'<span class="tag red">未读</span>');
444    return '<div class="row"><div class="ava">📢</div><div class="ri"><div class="a">'+n.t+'</div><div class="b">'+n.c+'</div></div>'+badge+'</div>';
445  }).join("");
446  $("#noticeList").html(h);
447  var unread = NOTICES.filter(function(n){return !n.read;}).length;
448  $("#unreadN").text(unread); $("#readN").text(45-unread);
449}
450function renderHW(){
451  var h = HW.map(function(w){
452    var pct = Math.round(w.done/w.total*100);
453    return '<div class="row"><div class="ava">📘</div><div class="ri"><div class="a">'+w.s+' · '+w.t+'</div>'+
454      '<div class="b">已提交 '+w.done+'/'+w.total+'</div><div class="bar"><i style="width:'+pct+'%"></i></div></div>'+
455      '<span class="tag '+(pct>=90?'green':pct>=70?'blue':'amber')+'">'+pct+'%</span></div>';
456  }).join("");
457  $("#hwListBox").html(h);
458}
459function radarPoints(vals,max,r,cx,cy){
460  var n=vals.length, pts=[];
461  for(var i=0;i<n;i++){
462    var ang=-Math.PI/2 + i*2*Math.PI/n;
463    var rr=r*vals[i]/max;
464    pts.push((cx+rr*Math.cos(ang)).toFixed(1)+","+(cy+rr*Math.sin(ang)).toFixed(1));
465  }
466  return pts.join(" ");
467}
468function renderRadar(){
469  var cx=115,cy=115,r=85,n=SCORE_AXES.length;
470  var grid="";
471  [0.25,0.5,0.75,1].forEach(function(f){
472    var p=[]; for(var i=0;i<n;i++){var a=-Math.PI/2+i*2*Math.PI/n; p.push((cx+r*f*Math.cos(a)).toFixed(1)+","+(cy+r*f*Math.sin(a)).toFixed(1));}
473    grid+='<polygon points="'+p.join(" ")+'" fill="none" stroke="#eef1f6" stroke-width="1"/>';
474  });
475  var axes="",labels="";
476  for(var i=0;i<n;i++){
477    var a=-Math.PI/2+i*2*Math.PI/n;
478    axes+='<line x1="'+cx+'" y1="'+cy+'" x2="'+(cx+r*Math.cos(a)).toFixed(1)+'" y2="'+(cy+r*Math.sin(a)).toFixed(1)+'" stroke="#eef1f6" stroke-width="1"/>';
479    labels+='<text x="'+(cx+(r+16)*Math.cos(a)).toFixed(1)+'" y="'+(cy+(r+16)*Math.sin(a)+4).toFixed(1)+'" font-size="11" fill="#5b6b8c" text-anchor="middle">'+SCORE_AXES[i]+'</text>';
480  }
481  var poly=radarPoints(SCORE_VALS,SCORE_MAX,r,cx,cy);
482  var dots=SCORE_VALS.map(function(v,i){var a=-Math.PI/2+i*2*Math.PI/n;var rr=r*v/SCORE_MAX;return '<circle cx="'+(cx+rr*Math.cos(a)).toFixed(1)+'" cy="'+(cy+rr*Math.sin(a)).toFixed(1)+'" r="3" fill="#2563eb"/>';}).join("");
483  $("#radarBox").html('<svg viewBox="0 0 230 240" width="230" height="240">'+grid+axes+
484    '<polygon points="'+poly+'" fill="rgba(37,99,235,.18)" stroke="#2563eb" stroke-width="2"/>'+dots+labels+'</svg>');
485  $("#radarRep").html("王芳综合能力均衡,<b>语文 92</b>、<b>体育 90</b> 突出;<b>数学 78</b> 为薄弱项,建议针对性练习。");
486}
487function renderSeg(){
488  var max=SEG[0].n, h=SEG.map(function(s){
489    return '<div class="row" style="border:none;padding:8px 0"><div class="ri"><div class="a">'+s.l+'</div>'+
490      '<div class="bar"><i style="width:'+(s.n/max*100)+'%;background:'+s.c+'"></i></div></div>'+
491      '<span class="rt">'+s.n+' 人</span></div>';
492  }).join("");
493  $("#scSegBox").html(h);
494}
495function renderEval(){
496  var h=EVAL.map(function(e,i){
497    var medal=i===0?"🥇":i===1?"🥈":i===2?"🥉":(i+1);
498    return '<div class="row"><div class="ava">'+e.ava+'</div><div class="ri"><div class="a">'+medal+' '+e.n+'</div>'+
499      '<div class="b">课堂积分</div></div><span class="tag amber">'+e.p+' 分</span></div>';
500  }).join("");
501  $("#evalBox").html(h);
502}
503function renderFee(){
504  var h=FEE.map(function(f){
505    return '<div class="row"><div class="ava">💰</div><div class="ri"><div class="a">'+f.item+'</div><div class="b">'+f.who+'</div></div>'+
506      '<div style="text-align:right"><div style="font-weight:800;color:#1d4ed8">'+f.amt+'</div><span class="tag '+f.tag+'">'+f.st+'</span></div></div>';
507  }).join("");
508  $("#feeBox").html(h);
509}
510function renderLeave(){
511  var h=LEAVE.map(function(l){
512    return '<div class="row"><div class="ava">🧑</div><div class="ri"><div class="a">'+l.n+'</div><div class="b">'+l.r+'</div></div><span class="tag '+l.tag+'">'+l.st+'</span></div>';
513  }).join("");
514  $("#leaveBox").html(h);
515}
516function renderGrowth(){
517  var h=GROWTH.map(function(g){
518    return '<div class="tl"><div class="d">'+g.d+'</div><div class="t">'+g.t+'</div><div class="c">'+g.c+'</div></div>';
519  }).join("");
520  $("#growthBox").html(h);
521}
522function renderRank(){
523  var h=CKRANK.map(function(c,i){
524    return '<div class="row"><div class="ava">'+c.ava+'</div><div class="ri"><div class="a">'+(i+1)+'. '+c.n+'</div><div class="b">连续打卡 '+c.d+' 天</div></div>'+
525      (i===0?'<span class="tag amber">🏆</span>':'<span class="tag blue">'+c.d+'天</span>')+'</div>';
526  }).join("");
527  $("#ckRankBox").html(h);
528}
529
530$(function(){
531  renderNotice(); renderHW(); renderRadar(); renderSeg(); renderEval(); renderFee(); renderLeave(); renderGrowth(); renderRank();
532  // 宫格 / 行 / tabbar 跳转
533  $(document).on("click",".gi[data-go],.row[data-go],.more[data-go],.tabbar button[data-go]",function(e){
534    e.stopPropagation(); show($(this).data("go"));
535  });
536  $("#backBtn").on("click",function(){ show("home"); });
537  // 子导航
538  $("#hwSub button").on("click",function(){ $("#hwSub button").removeClass("on"); $(this).addClass("on");
539    $("#hwList,#hwCorrect,#hwWall").hide(); $("#"+$(this).data("p")).show(); });
540  $("#ckSub button").on("click",function(){ $("#ckSub button").removeClass("on"); $(this).addClass("on");
541    $("#ckDaily,#ckWisdom,#ckRank").hide(); $("#"+$(this).data("p")).show(); });
542  $("#scSub button").on("click",function(){ $("#scSub button").removeClass("on"); $(this).addClass("on");
543    $("#scRadar,#scTrend,#scSeg").hide(); $("#"+$(this).data("p")).show(); });
544  $("#tkSub button").on("click",function(){ $("#tkSub button").removeClass("on"); $(this).addClass("on");
545    $("#tkTopic,#tkChat").hide(); $("#"+$(this).data("p")).show(); });
546  // 交互
547  $("#remindBtn").on("click",function(){ NOTICES.forEach(function(n){n.read=true;}); renderNotice(); toast("已提醒 3 位未读家长 ✓"); });
548  $("#ckBtn").on("click",function(){ toast("打卡成功,连续 13 天 🎉"); });
549  $("#correctBtn").on("click",function(){ toast("批改完成,已评优 ✓"); });
550  $("#roleBtn,#roleSwitch").on("click",function(){ var t=$("#roleBtn").text(); $("#roleBtn").text(t.indexOf("老师")>=0?"🧑 家长端":"👨‍🏫 老师端"); toast("已切换角色"); });
551  $("#noticeNew,#hwNew,#ckNew,#feeNew,#leaveNew,#tkNew,#evalAdd").on("click",function(){ toast("演示:进入编辑表单"); });
552  // 主题讨论点击
553  $("#tkTopic .row").on("click",function(){ toast("演示:查看讨论详情"); });
554});
555</script>
556</body>
557</html>