chore(release): 1.3.3 发布并退役旧联动

This commit is contained in:
LoveChengke committed 2026-10-17 03:06:46 +08:00
1 parent b7cdc7c9ea
commit c0ebf88138
184 files changed
+5450 -11705

No files matched your search

+1 -24
View File
@@ -18,7 +18,7 @@
*
* 版本分段控件 → 一行状态 → 「装什么」分段控件 → 卡片(图标 / 名称 / 系统要求 / 主按钮 + 变体下拉)
*
* 默认停在**客户端**(进来最先要的多半是它),服务端与插件各是一个可切换的分组。
* 默认停在**客户端**(进来最先要的多半是它),服务端是另一个可切换的分组。
* 两个分段控件共用同一套指示器实现;建完卡片会派发一次 `ch:content`,
* 让 main.js 把按压反馈补挂上 —— 这些元素是拉到清单之后才出现的。
*/
@@ -172,29 +172,6 @@
},
],
},
{
key: 'plugin',
label: '插件',
note: {
text: '给教室那台已经装了 ClassIsland 的机器加装 —— 课表从这里上报,老师发的提醒弹到全屏。',
},
cards: [
{
mark: 'plugin',
name: 'ClassIsland 联动插件',
req: '装在教室已有的 ClassIsland 2.x 上 · 教室大屏',
desc: '上课时段的普通通知先收着,打下课铃补弹;紧急通知与叫人立刻全屏提醒,可以语音朗读。',
files: [
{
role: '下载 .cipx',
note: '在 ClassIsland 的插件页里选它安装',
match: /classislandplugin\.cipx$/i,
expect: () => 'ClassHelper.ClassIslandPlugin.cipx',
},
],
},
],
},
];
const versionHost = $('#ver-tabs');
+5 -9
View File
@@ -752,13 +752,13 @@
}
if (say.normalScreen) {
say.normalScreen.textContent = period.inClass
? '暂存起来,打下课铃补弹(插件订阅课程事件)。'
: '直接全屏弹出。';
? '暂存起来,下课后由客户端补弹。'
: '由客户端与灵动岛显示。';
}
if (say.urgentScreen) {
say.urgentScreen.textContent = period.inClass
? '立刻全屏弹出,可以语音朗读 —— 老师正在等学生。'
: '立刻全屏弹出,可以语音朗读。';
? '灵动岛立即展开 —— 老师正在等学生。'
: '灵动岛立即展开提醒。';
}
}
@@ -946,11 +946,7 @@
kind: 'screen',
cap: '成绩录入 —— 单条 / 批量 / 表格导入,重复判定按「同班同学生同考试同课程」',
},
{
file: 'web-integrations.jpg',
kind: 'screen',
cap: 'ClassIsland 联动 —— 设备在线状态、当前节次、回传与镜像开关',
},
{
file: 'web-classes.jpg',
kind: 'screen',
Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

+6 -8
View File
@@ -6,19 +6,19 @@
<title>下载 ClassHelper —— 挑版本、挑平台</title>
<meta
name="description"
content="从 GitHub Releases 直接下载 ClassHelper:教室机器要的班级端、服务器要的服务端(Windows 安装程序 / Linux 压缩包)、教室大屏要的 ClassIsland 联动插件。版本与文件清单取自本仓库的发布页,显示什么就能下什么。"
content="从 GitHub Releases 直接下载 ClassHelper:教室机器要的班级端、服务器要的服务端(Windows 安装程序 / Linux 压缩包)。版本与文件清单取自本仓库的发布页,显示什么就能下什么。"
/>
<meta name="theme-color" content="#16231e" />
<meta property="og:title" content="下载 ClassHelper" />
<meta
property="og:description"
content="班级端、服务端(Windows / Linux)、ClassIsland 联动插件 —— 选好版本,下面显示什么就能下什么。"
content="班级端、服务端(Windows / Linux) —— 选好版本,下面显示什么就能下什么。"
/>
<meta property="og:type" content="website" />
<!-- 页面上所有版本号与文件名都从这一行起步:脚本会去 GitHub Releases 取真实清单,
取不到时(离线、被限流)就按这份版本号 + 发布命名约定拼直链。
它和根 package.json 一起由 `pnpm version:bump` 维护 —— 别在这儿单独改。 -->
<meta name="ch-version" content="1.3.2" />
<meta name="ch-version" content="1.3.3" />
<link rel="icon" href="assets/icon.png" />
<link rel="apple-touch-icon" href="assets/icon.png" />
@@ -80,7 +80,7 @@
<span class="reveal-line reveal-grad">再挑要装的那一份</span>
</h1>
<p class="hero-sub intro-seq" style="--intro-delay: 150ms">班级端 · 服务端 · ClassIsland 插件</p>
<p class="hero-sub intro-seq" style="--intro-delay: 150ms">班级端 · 服务端</p>
<p class="lead intro-seq" style="--intro-delay: 200ms">
下面的版本与文件清单是当场从本仓库的 GitHub Releases 读出来的:文件名、体积都照抄发布页,
@@ -127,7 +127,6 @@
<ul class="hero-badges intro-seq" style="--intro-delay: 350ms">
<li>Windows 10/11 x64</li>
<li>Linux x64 · Docker</li>
<li>ClassIsland 2.x 插件</li>
<li>包内自带 Node 运行时</li>
</ul>
</div>
@@ -139,9 +138,9 @@
<div class="wrap">
<h2 class="h2">装什么,挑一下</h2>
<p class="lead narrow">
四个交付物互不依赖安装顺序,但
三个交付物互不依赖安装顺序,但
<strong>服务端要先有一台机器跑着</strong>
,另外三个才连得上 —— 不确定就先切到「服务端」看一眼。
,管理端与客户端才连得上 —— 不确定就先切到「服务端」看一眼。
</p>
<div class="dl-groups">
@@ -150,7 +149,6 @@
<span class="dl-seg-indicator" id="group-indicator" aria-hidden="true"></span>
<button class="dl-seg-item" type="button" role="tab" data-value="client">客户端</button>
<button class="dl-seg-item" type="button" role="tab" data-value="server">服务端</button>
<button class="dl-seg-item" type="button" role="tab" data-value="plugin">插件</button>
</div>
<p class="dl-pick-note" id="group-note" role="status"></p>
</div>
+21 -35
View File
@@ -44,7 +44,7 @@
<a class="brand" href="#top" data-press="0.96">
<img class="brand-mark" src="assets/icon.png" alt="" width="32" height="32" />
<span class="brand-name">ClassHelper</span>
<span class="brand-ver">1.3.2</span>
<span class="brand-ver">1.3.3</span>
</a>
<nav class="topnav" aria-label="页内导航">
<span class="nav-pill" aria-hidden="true"></span>
@@ -93,7 +93,7 @@
</div>
<ul class="hero-badges intro-seq" style="--intro-delay: 300ms">
<li>v1.3.2</li>
<li>v1.3.3</li>
<li>Windows 10/11</li>
<li>Linux · Docker</li>
<li>触摸屏可用</li>
@@ -176,8 +176,8 @@
<ul class="facts">
<li>装着 SQLite 就能跑,需要时一键换到 MySQL —— 数据也跟着搬过去。</li>
<li>课表由教室的 ClassIsland 上报,不用在小助手这边再排一遍。</li>
<li>教室把通知交给哪个端,由教室那台机器自己选:客户端、大屏,或者两边都弹。</li>
<li>课表由教师在管理端维护,教室客户端实时接收变更。</li>
<li>通知实时送达客户端与灵动岛,普通提醒会等待下课再显示。</li>
</ul>
</div>
</section>
@@ -189,9 +189,9 @@
<div class="wrap">
<h2 class="h2">装什么,挑一下</h2>
<p class="lead narrow">
四个交付物互不依赖安装顺序,但
三个交付物互不依赖安装顺序,但
<strong>服务端要先有一台机器跑着</strong>
,另外三个才连得上。 下面的版本与文件清单是当场从本仓库的 GitHub Releases
,管理端与客户端才连得上。 下面的版本与文件清单是当场从本仓库的 GitHub Releases
读出来的:显示什么,就真能下到什么。
</p>
@@ -210,7 +210,6 @@
<span class="dl-seg-indicator" id="group-indicator" aria-hidden="true"></span>
<button class="dl-seg-item" type="button" role="tab" data-value="client">客户端</button>
<button class="dl-seg-item" type="button" role="tab" data-value="server">服务端</button>
<button class="dl-seg-item" type="button" role="tab" data-value="plugin">插件</button>
</div>
<p class="dl-pick-note" id="group-note" role="status"></p>
</div>
@@ -262,7 +261,7 @@
</li>
<li>
<p class="pipe-step">两端弹出</p>
<p class="pipe-body">灵动岛展开成卡片,ClassIsland 同时全屏提醒,可以语音朗读。</p>
<p class="pipe-body">灵动岛展开成卡片,客户端同步显示通知。</p>
</li>
</ol>
</div>
@@ -312,13 +311,13 @@
</div>
<div class="outcome">
<p class="outcome-what">普通通知</p>
<p class="outcome-where">教室大屏 · ClassIsland</p>
<p class="outcome-where">教室大屏 · ClassHelper</p>
<p class="outcome-say" id="o-normal-screen">先收着,下课补弹</p>
</div>
<div class="outcome outcome-alert">
<p class="outcome-what">紧急通知 / 叫人</p>
<p class="outcome-where">教室大屏 · ClassIsland</p>
<p class="outcome-say" id="o-urgent-screen">立刻全屏弹出,不打断也拦不住</p>
<p class="outcome-where">教室大屏 · ClassHelper</p>
<p class="outcome-say" id="o-urgent-screen">灵动岛立即展开提醒</p>
</div>
<div class="outcome">
<p class="outcome-what">不管什么时候</p>
@@ -346,14 +345,14 @@
<section class="band band-paper" id="parts">
<div class="wrap">
<h2 class="h2">一份代码,四个交付物</h2>
<h2 class="h2">一份代码,三个交付物</h2>
<p class="lead narrow">
一个 pnpm monorepo。三端共用同一份类型与权限矩阵,所以不会出现「Web 端说有、客户端说没有」。
</p>
<div class="table-scroll">
<table class="sheet">
<caption class="sr-only">四个交付物、它们的形态与使用者</caption>
<caption class="sr-only">三个交付物、它们的形态与使用者</caption>
<thead>
<tr>
<th scope="col">交付物</th>
@@ -368,7 +367,7 @@
Express 5 + Prisma 7 + Socket.IO,接口前缀
<code>/api</code>
</td>
<td>其它三端</td>
<td>管理端与客户端</td>
</tr>
<tr>
<th scope="row">Web 管理端</th>
@@ -380,11 +379,6 @@
<td>Electron + Vue 3,带灵动岛与系统托盘,断网可用</td>
<td>教室机器、学生机</td>
</tr>
<tr>
<th scope="row">ClassIsland 联动插件</th>
<td>.NET 8 插件,装进教室已有的 ClassIsland 里</td>
<td>教室大屏</td>
</tr>
</tbody>
</table>
</div>
@@ -466,7 +460,8 @@
<p class="feature-tag">#成绩</p>
<h4 class="feature-title">单条、批量,或者整张表导进来,还带排名</h4>
<p class="feature-body">
重复判定按「同班 + 同学生 + 同考试 + 同课程」,导入报错精确到 Excel 行号。单科排名自动出;这次考试要不要把各科相加排总分榜,你说了算。
重复判定按「同班 + 同学生 + 同考试 + 同课程」,导入报错精确到 Excel
行号。单科排名自动出;这次考试要不要把各科相加排总分榜,你说了算。
</p>
</div>
<div class="feature-block">
@@ -480,21 +475,22 @@
<p class="feature-tag">#权限</p>
<h4 class="feature-title">谁能做什么,点着勾</h4>
<p class="feature-body">
建权限组、把账号分进去。没分组的按角色默认生效,分组之后只按组的并集算 —— 既能放权,也能收权。
建权限组、把账号分进去。没分组的按角色默认生效,分组之后只按组的并集算 ——
既能放权,也能收权。
</p>
</div>
<div class="feature-block">
<p class="feature-tag">#教室机器</p>
<h4 class="feature-title">一个班一张卡,两条链路一起管</h4>
<h4 class="feature-title">统一管理设备、远控与更新</h4>
<p class="feature-body">
大屏(ClassIsland)和灵动岛(客户端)的状态放在同一张卡上,勾几个班就能批量下发课表或更新;想下发或取回课表,点一下才发生 —— 教室和这边不会互相自动覆盖。
统一查看客户端在线状态、版本与远控结果,按设备或班级下发更新;可立即安装,或等待放学后安装。
</p>
</div>
<div class="feature-block">
<p class="feature-tag">#大模型助手</p>
<h4 class="feature-title">说一句话就发出去</h4>
<p class="feature-body">
它只把话解析成待确认的卡片,你点了才落库 —— 权限、上课时段、ClassIsland 推送还是原来那套。
它只把话解析成待确认的卡片,你点了才落库 —— 权限与上课时段保护仍复用既有流程。
</p>
</div>
<div class="feature-block">
@@ -693,16 +689,6 @@
<span class="ledger-what">对打包后 / 已安装的那份 EXE 复跑同一套冒烟</span>
<span class="ledger-num"><span data-ticker="105">105</span></span>
</div>
<div class="ledger-row">
<code class="ledger-cmd">pnpm verify:classisland</code>
<span class="ledger-what">设备令牌、课表上报、提醒下发与回执、镜像契约、幽灵行清理</span>
<span class="ledger-num"><span data-ticker="42">42</span></span>
</div>
<div class="ledger-row">
<code class="ledger-cmd">pnpm verify:classisland-plugin</code>
<span class="ledger-what">插件清单、注册完整性、C# DTO 与服务端校验逐字段对齐</span>
<span class="ledger-num"><span data-ticker="68">68</span></span>
</div>
</div>
<p class="ledger-foot">
@@ -746,7 +732,7 @@
ClassHelper
<span>Class Helper</span>
</p>
<p class="foot-ver">版本 1.3.2 · 源码公开 · 装在你自己的机器上</p>
<p class="foot-ver">版本 1.3.3 · 源码公开 · 装在你自己的机器上</p>
</div>
</div>
<nav class="foot-nav" aria-label="相关链接">
-1
View File
@@ -90,7 +90,6 @@ const DESKTOP_PAGES = [
{ name: 'web-homeworks', route: '/homeworks', title: '作业发布' },
{ name: 'web-notifications', route: '/notifications', title: '通知发布', pickClass: '高二(3)班' },
{ name: 'web-grades', route: '/grades', title: '成绩录入' },
{ name: 'web-integrations', route: '/integrations', title: 'ClassIsland 联动' },
{ name: 'web-database', route: '/database', title: '数据库管理' },
];