chore(release): 版本号统一到 1.1.1(服务端 CSP 白屏修复)
对齐 1.1.0 的做法把版本号统一:5 份 package.json、deploy/package.runtime.json、 两份 .env.example 的 APP_VERSION、两个 docker-compose 的镜像标签、ClassIsland 插件的 manifest.yml 与 BridgeService.PluginVersion(verify:classisland-plugin 有 manifest↔代码 一致性断言,已跑 68/68)、README 首页版本、以及文档与脚本里的安装包名示例,共 28 处。 刻意不动:docs/linux-deploy.md 排障条目里"1.1.0 的服务端在 HTTP 直连访问时会下发 CSP upgrade-insecure-requests…"——那句说的是**出问题的那个版本**,改成 1.1.1 反而是错的。
This commit is contained in:
1 parent
48e0c89394
commit
79d73c5889
16 files changed
+26
-26
No files matched your search
@@ -1,7 +1,7 @@
|
|||||||
# 班级小助手(Class Helper)
|
# 班级小助手(Class Helper)
|
||||||
|
|
||||||
班级信息管理系统。一个 pnpm monorepo,一份代码产出四个交付物:**后端服务**、**Web 管理端**(教师 / 管理员)、
|
班级信息管理系统。一个 pnpm monorepo,一份代码产出四个交付物:**后端服务**、**Web 管理端**(教师 / 管理员)、
|
||||||
**桌面客户端**(学生端 / 教室机器)与 **ClassIsland 联动插件**(装在教室的 ClassIsland 上)。**当前版本 1.1.0**。
|
**桌面客户端**(学生端 / 教室机器)与 **ClassIsland 联动插件**(装在教室的 ClassIsland 上)。**当前版本 1.1.1**。
|
||||||
|
|
||||||
核心链路:
|
核心链路:
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@
|
|||||||
SERVER_PORT=4000
|
SERVER_PORT=4000
|
||||||
|
|
||||||
# 应用版本(镜像标签)
|
# 应用版本(镜像标签)
|
||||||
APP_VERSION=1.1.0
|
APP_VERSION=1.1.1
|
||||||
|
|
||||||
# MySQL 配置
|
# MySQL 配置
|
||||||
MYSQL_ROOT_PASSWORD=请改成强密码_root
|
MYSQL_ROOT_PASSWORD=请改成强密码_root
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
SERVER_PORT=4000
|
SERVER_PORT=4000
|
||||||
|
|
||||||
# 应用版本(镜像标签)
|
# 应用版本(镜像标签)
|
||||||
APP_VERSION=1.1.0
|
APP_VERSION=1.1.1
|
||||||
|
|
||||||
# JWT 签名密钥(必填,必须 ≥32 位;不能包含 secret / change-me 等示例词)
|
# JWT 签名密钥(必填,必须 ≥32 位;不能包含 secret / change-me 等示例词)
|
||||||
# 生成:node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"
|
# 生成:node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ services:
|
|||||||
context: ..
|
context: ..
|
||||||
dockerfile: deploy/Dockerfile
|
dockerfile: deploy/Dockerfile
|
||||||
target: runtime
|
target: runtime
|
||||||
image: classhelper-server:${APP_VERSION:-1.1.0}
|
image: classhelper-server:${APP_VERSION:-1.1.1}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ services:
|
|||||||
context: ..
|
context: ..
|
||||||
dockerfile: deploy/Dockerfile
|
dockerfile: deploy/Dockerfile
|
||||||
target: runtime
|
target: runtime
|
||||||
image: classhelper-server:${APP_VERSION:-1.1.0}
|
image: classhelper-server:${APP_VERSION:-1.1.1}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
|
|||||||
+2
-2
@@ -17,7 +17,7 @@
|
|||||||
# 脚本会自动从 GitHub Release 取**最新版**服务端安装包,并取发布页上同名的 .sha256 做校验,
|
# 脚本会自动从 GitHub Release 取**最新版**服务端安装包,并取发布页上同名的 .sha256 做校验,
|
||||||
# 所以整条链路只需要这一行。要加参数就接在最后:`sudo bash /tmp/classhelper-install.sh --check`
|
# 所以整条链路只需要这一行。要加参数就接在最后:`sudo bash /tmp/classhelper-install.sh --check`
|
||||||
# --check 只体检、不安装(不需要 root) --yes 全部默认、不交互
|
# --check 只体检、不安装(不需要 root) --yes 全部默认、不交互
|
||||||
# --version 1.1.0 装指定版本 --port 8080 自定义端口
|
# --version 1.1.1 装指定版本 --port 8080 自定义端口
|
||||||
# --admin-password-stdin 从 stdin 读初始管理员密码
|
# --admin-password-stdin 从 stdin 读初始管理员密码
|
||||||
#
|
#
|
||||||
# ⚠ 别写成 `bash -c "$(curl …)" --check`:`bash -c '代码' 第一个参数` 里那个参数会变成 **$0**、
|
# ⚠ 别写成 `bash -c "$(curl …)" --check`:`bash -c '代码' 第一个参数` 里那个参数会变成 **$0**、
|
||||||
@@ -529,7 +529,7 @@ resolve_package_url() {
|
|||||||
tag="$(github_latest_tag)" || true
|
tag="$(github_latest_tag)" || true
|
||||||
if [ -z "$tag" ]; then
|
if [ -z "$tag" ]; then
|
||||||
die "取不到 GitHub 最新版本(本机可能没有外网)。请用 --package 指定安装包,例如:
|
die "取不到 GitHub 最新版本(本机可能没有外网)。请用 --package 指定安装包,例如:
|
||||||
sudo bash install.sh --package /tmp/classhelper-server-linux-x64-1.1.0.tar.gz"
|
sudo bash install.sh --package /tmp/classhelper-server-linux-x64-1.1.1.tar.gz"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
ver="${tag#v}"
|
ver="${tag#v}"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "classhelper-server-runtime",
|
"name": "classhelper-server-runtime",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "班级小助手服务端运行时(安装包 / 容器内置)",
|
"description": "班级小助手服务端运行时(安装包 / 容器内置)",
|
||||||
|
|||||||
+10
-10
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
| 形态 | 适用场景 | 产物 | 本机验证情况 |
|
| 形态 | 适用场景 | 产物 | 本机验证情况 |
|
||||||
| --------------------- | -------------------------------------------- | -------------------------------------------------------- | -------------------------------------- |
|
| --------------------- | -------------------------------------------- | -------------------------------------------------------- | -------------------------------------- |
|
||||||
| **A. Windows 安装包** | 学校机房、教师办公电脑(单机即完整系统) | `release-server/班级小助手服务端-<版本>-x64-setup.exe` | ✅ 已完整实测(静默安装/启停/卸载/UI) |
|
| **A. Windows 安装包** | 学校机房、教师办公电脑(单机即完整系统) | `releases/server/<版本>/安装包/班级小助手服务端-<版本>-x64-setup.exe` | ✅ 已完整实测(静默安装/启停/卸载/UI) |
|
||||||
| **B. Docker + MySQL** | 云服务器、多终端共享一套数据(推荐长期方案) | `deploy/Dockerfile` + `deploy/docker-compose.yml` | ⚠️ 文件已提供,本机无 Docker 未实测 |
|
| **B. Docker + MySQL** | 云服务器、多终端共享一套数据(推荐长期方案) | `deploy/Dockerfile` + `deploy/docker-compose.yml` | ⚠️ 文件已提供,本机无 Docker 未实测 |
|
||||||
| **C. Linux 原生部署** | 已有 Linux 服务器(systemd,SQLite 或 MySQL) | [`deploy/install.sh`](../deploy/install.sh) + `classhelper` 运维命令 | ⚠️ 本机无 Linux,实机验收见 [linux-deploy.md](linux-deploy.md) §10 |
|
| **C. Linux 原生部署** | 已有 Linux 服务器(systemd,SQLite 或 MySQL) | [`deploy/install.sh`](../deploy/install.sh) + `classhelper` 运维命令 | ⚠️ 本机无 Linux,实机验收见 [linux-deploy.md](linux-deploy.md) §10 |
|
||||||
| **D. 手动部署** | 已有 Node 环境的服务器、需要自定义 | `pnpm dist:server` 的免安装目录 | ✅ 免安装目录已实测(163 项端到端) |
|
| **D. 手动部署** | 已有 Node 环境的服务器、需要自定义 | `pnpm dist:server` 的免安装目录 | ✅ 免安装目录已实测(163 项端到端) |
|
||||||
@@ -22,10 +22,10 @@ pnpm dist:server -- --reuse-deps # 迭代打包:复用已安装依赖,跳
|
|||||||
|
|
||||||
产物:
|
产物:
|
||||||
|
|
||||||
| 路径 | 说明 |
|
| 路径 | 说明 |
|
||||||
| ----------------------------------------------------- | ----------------------------------------------- |
|
| ----------------------------------------------------------------------- | ----------------------------------------------- |
|
||||||
| `release-server/classhelper-server/` | 免安装目录,可直接拷到任意 Windows x64 机器运行 |
|
| `releases/server/<版本>/免安装/` | 免安装目录,可直接拷到任意 Windows x64 机器运行 |
|
||||||
| `release-server/班级小助手服务端-1.1.0-x64-setup.exe` | 安装程序(约 34 MB,NSIS) |
|
| `releases/server/<版本>/安装包/班级小助手服务端-<版本>-x64-setup.exe` | 安装程序(约 62 MB,NSIS) |
|
||||||
|
|
||||||
打包内容:内置 **Node 运行时**(目标机无需安装 Node.js)、后端产物、Web 管理端产物、
|
打包内容:内置 **Node 运行时**(目标机无需安装 Node.js)、后端产物、Web 管理端产物、
|
||||||
生产依赖(真实目录,非软链)、迁移 SQL、`.env`(随机 JWT 密钥)、启停脚本。
|
生产依赖(真实目录,非软链)、迁移 SQL、`.env`(随机 JWT 密钥)、启停脚本。
|
||||||
@@ -35,7 +35,7 @@ pnpm dist:server -- --reuse-deps # 迭代打包:复用已安装依赖,跳
|
|||||||
双击安装程序即可,**无需管理员权限**(当前用户级安装):
|
双击安装程序即可,**无需管理员权限**(当前用户级安装):
|
||||||
|
|
||||||
- 安装目录:`%LOCALAPPDATA%\Programs\ClassHelperServer`
|
- 安装目录:`%LOCALAPPDATA%\Programs\ClassHelperServer`
|
||||||
- 静默安装:`"班级小助手服务端-1.1.0-x64-setup.exe" /S`
|
- 静默安装:`"班级小助手服务端-1.1.1-x64-setup.exe" /S`
|
||||||
- 开始菜单:启动服务 / 停止服务 / 重启服务 / 打开管理端 / 使用说明 / 卸载
|
- 开始菜单:启动服务 / 停止服务 / 重启服务 / 打开管理端 / 使用说明 / 卸载
|
||||||
- 桌面:`班级小助手服务端.lnk`(打开管理端)
|
- 桌面:`班级小助手服务端.lnk`(打开管理端)
|
||||||
- 自动加入当前用户开机自启(`HKCU\...\CurrentVersion\Run`)
|
- 自动加入当前用户开机自启(`HKCU\...\CurrentVersion\Run`)
|
||||||
@@ -163,7 +163,7 @@ Linux 包由 GitHub Actions 在 ubuntu runner 上构建(平台相关的依赖
|
|||||||
```bash
|
```bash
|
||||||
# 开发机:做出 Linux 包并连同脚本一起拷到服务器
|
# 开发机:做出 Linux 包并连同脚本一起拷到服务器
|
||||||
pnpm dist:server:linux
|
pnpm dist:server:linux
|
||||||
scp release-server/classhelper-server-linux-x64-*.tar.gz deploy/install.sh deploy/verify-linux.sh \
|
scp releases/server/*/linux-x64/classhelper-server-linux-x64-*.tar.gz deploy/install.sh deploy/verify-linux.sh \
|
||||||
root@<服务器>:/tmp/
|
root@<服务器>:/tmp/
|
||||||
|
|
||||||
# 服务器上
|
# 服务器上
|
||||||
@@ -176,7 +176,7 @@ sudo bash /tmp/install.sh # 交互式:选形态 → 选目录
|
|||||||
```bash
|
```bash
|
||||||
printf '%s\n' 'StrongPass!2026' | sudo bash /tmp/install.sh --yes \
|
printf '%s\n' 'StrongPass!2026' | sudo bash /tmp/install.sh --yes \
|
||||||
--dir /srv/classhelper --port 8080 --admin-password-stdin \
|
--dir /srv/classhelper --port 8080 --admin-password-stdin \
|
||||||
--package /tmp/classhelper-server-linux-x64-1.1.0.tar.gz
|
--package /tmp/classhelper-server-linux-x64-1.1.1.tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
安装器做的事:识别发行版与包管理器补依赖 → 建系统用户 `classhelper` → 下载包并校验 sha256 →
|
安装器做的事:识别发行版与包管理器补依赖 → 建系统用户 `classhelper` → 下载包并校验 sha256 →
|
||||||
@@ -221,7 +221,7 @@ printf '%s\n' 'StrongPass!2026' | sudo bash /tmp/install.sh --yes \
|
|||||||
没有 systemd 的容器里可以用安装器的"只铺文件"模式,再自己托管进程:
|
没有 systemd 的容器里可以用安装器的"只铺文件"模式,再自己托管进程:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo bash /tmp/install.sh --yes --force --package /tmp/classhelper-server-linux-x64-1.1.0.tar.gz
|
sudo bash /tmp/install.sh --yes --force --package /tmp/classhelper-server-linux-x64-1.1.1.tar.gz
|
||||||
sudo -u classhelper /opt/classhelper/runtime/node/bin/node /opt/classhelper/server/dist/index.js
|
sudo -u classhelper /opt/classhelper/runtime/node/bin/node /opt/classhelper/server/dist/index.js
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -279,7 +279,7 @@ pnpm install
|
|||||||
pnpm build:shared
|
pnpm build:shared
|
||||||
pnpm --filter @classhelper/server build
|
pnpm --filter @classhelper/server build
|
||||||
pnpm --filter @classhelper/web-admin build
|
pnpm --filter @classhelper/web-admin build
|
||||||
pnpm dist:server -- --reuse-deps # 得到 release-server/classhelper-server 免安装目录
|
pnpm dist:server -- --reuse-deps # 得到 releases/server/<版本>/免安装/ 免安装目录
|
||||||
```
|
```
|
||||||
|
|
||||||
把该目录拷贝到目标机,编辑 `.env`(端口、数据库、密钥、跨域),然后:
|
把该目录拷贝到目标机,编辑 `.env`(端口、数据库、密钥、跨域),然后:
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "class-helper",
|
"name": "class-helper",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "班级小助手 - 班级信息管理系统(Web 管理端 + 后端服务 + 桌面客户端)",
|
"description": "班级小助手 - 班级信息管理系统(Web 管理端 + 后端服务 + 桌面客户端)",
|
||||||
"packageManager": "pnpm@11.8.0",
|
"packageManager": "pnpm@11.8.0",
|
||||||
|
|||||||
@@ -14,6 +14,6 @@ description: |-
|
|||||||
4. 可选:把班级小助手上排好的课表镜像回 ClassIsland。
|
4. 可选:把班级小助手上排好的课表镜像回 ClassIsland。
|
||||||
entranceAssembly: 'ClassHelper.ClassIslandPlugin.dll'
|
entranceAssembly: 'ClassHelper.ClassIslandPlugin.dll'
|
||||||
url: https://github.com/LoveChengke/ClassHelper
|
url: https://github.com/LoveChengke/ClassHelper
|
||||||
version: 1.1.0.0
|
version: 1.1.1.0
|
||||||
apiVersion: 2.0.0.0
|
apiVersion: 2.0.0.0
|
||||||
author: 班级小助手
|
author: 班级小助手
|
||||||
@@ -495,7 +495,7 @@ public sealed class BridgeService : INotifyPropertyChanged, IDisposable
|
|||||||
/* ---------------------------------------------------------------- 内部实现 */
|
/* ---------------------------------------------------------------- 内部实现 */
|
||||||
|
|
||||||
/// <summary>插件版本(与 manifest.yml / csproj 保持一致)。</summary>
|
/// <summary>插件版本(与 manifest.yml / csproj 保持一致)。</summary>
|
||||||
private const string PluginVersion = "1.1.0.0";
|
private const string PluginVersion = "1.1.1.0";
|
||||||
|
|
||||||
/// <summary>ClassIsland 版本读不到时不该让上报失败(开发版可能为 null)。</summary>
|
/// <summary>ClassIsland 版本读不到时不该让上报失败(开发版可能为 null)。</summary>
|
||||||
private static string SafeAppVersion()
|
private static string SafeAppVersion()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@classhelper/desktop-client",
|
"name": "@classhelper/desktop-client",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "班级小助手 EXE 客户端(Electron + Vue 3 + Element Plus + Socket.IO + IndexedDB 离线缓存)",
|
"description": "班级小助手 EXE 客户端(Electron + Vue 3 + Element Plus + Socket.IO + IndexedDB 离线缓存)",
|
||||||
"author": "Class Helper",
|
"author": "Class Helper",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@classhelper/server",
|
"name": "@classhelper/server",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "班级小助手后端服务:REST API + Socket.IO 实时推送 + Prisma 数据访问",
|
"description": "班级小助手后端服务:REST API + Socket.IO 实时推送 + Prisma 数据访问",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ async function main() {
|
|||||||
|
|
||||||
// ---------------------------------------------------------------- 3. 上报(状态 + 课表 + 节次)
|
// ---------------------------------------------------------------- 3. 上报(状态 + 课表 + 节次)
|
||||||
const reportBody = {
|
const reportBody = {
|
||||||
pluginVersion: '1.1.0.0',
|
pluginVersion: '1.1.1.0',
|
||||||
classIslandVersion: '2.1.0.0',
|
classIslandVersion: '2.1.0.0',
|
||||||
state: {
|
state: {
|
||||||
inClass: true,
|
inClass: true,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@classhelper/shared",
|
"name": "@classhelper/shared",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "班级小助手 - 三端共享的类型、常量与工具函数",
|
"description": "班级小助手 - 三端共享的类型、常量与工具函数",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@classhelper/web-admin",
|
"name": "@classhelper/web-admin",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "班级小助手 Web 管理端(Vue 3 + Vite + Element Plus)",
|
"description": "班级小助手 Web 管理端(Vue 3 + Vite + Element Plus)",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
Reference in new issue
Block a user