Skip to content

类型定义 ​

本页面汇总 ClassIntra 在前后端共享的核心结构与类型,是撰写 manifest.json、排查数据库表结构、确认 WebSocket 消息格式与环境变量配置时的参考依据。所有结构均来自 server/src/migrations/、shared/src/、client/src/。

目录 ​

数据库表结构 ​

ClassIntra 使用 better-sqlite3 嵌入式数据库,所有表通过 server/src/migrations/000_baseline.js 一次性创建(使用 IF NOT EXISTS,幂等)。下表列出主要业务表与字段。

users — 用户表 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
net_nameTEXT NOT NULL UNIQUE网名(唯一)
real_nameTEXT NOT NULL UNIQUE真实姓名(唯一)
user_idTEXT NOT NULL UNIQUE业务用户 ID(如学号 2024001)
genderTEXT DEFAULT ''性别
password_hashTEXT NOT NULLbcrypt 哈希密码
statusTEXT DEFAULT 'active'状态:active / disabled
is_adminINTEGER DEFAULT 0是否管理员(0/1)
info_jsonTEXT DEFAULT '{}'扩展信息 JSON(生日/微信/QQ/邮箱/电话/地址/签名)
created_atTEXT DEFAULT (datetime('now'))创建时间
last_loginTEXT DEFAULT NULL最后登录时间

pre_records — 预注册名单 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
real_nameTEXT NOT NULL UNIQUE真实姓名(唯一)
user_idTEXT NOT NULL UNIQUE业务用户 ID
genderTEXT DEFAULT ''性别

白名单注册

pre_records 是注册白名单:管理员录入学生姓名与 user_id 后,学生才能以此姓名注册。注册成功后,对应 pre_records 记录不会被删除(仅校验是否存在),便于审计。

broadcasts — 广播通知 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
contentTEXT NOT NULL广播内容
priorityTEXT DEFAULT 'normal'优先级:normal / high / urgent
created_atTEXT DEFAULT (datetime('now'))创建时间

announcements — 公告 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
titleTEXT NOT NULL标题
contentTEXT NOT NULL内容
typeTEXT DEFAULT 'notice'类型:notice / event / assignment
author_idTEXT NOT NULL作者 ID
author_nameTEXT DEFAULT ''作者姓名
pinnedINTEGER DEFAULT 0是否置顶(0/1)
created_atTEXT DEFAULT (datetime('now'))创建时间

chat_messages — 公共聊天 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
room_idTEXT DEFAULT 'public'房间 ID(默认 public)
sender_idTEXT NOT NULL发送者 ID
sender_nameTEXT NOT NULL发送者姓名
contentTEXT NOT NULL消息内容
typeTEXT DEFAULT 'text'类型:text / image / file / system
recalledINTEGER DEFAULT 0是否撤回(0/1)
created_atTEXT DEFAULT (datetime('now'))创建时间

private_messages — 私聊 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
sender_idTEXT NOT NULL发送者 ID
receiver_idTEXT NOT NULL接收者 ID
contentTEXT NOT NULL内容
typeTEXT DEFAULT 'text'类型
readINTEGER DEFAULT 0是否已读(0/1)
recalledINTEGER DEFAULT 0是否撤回
created_atTEXT DEFAULT (datetime('now'))创建时间

groups — 班级群组 ​

字段类型说明
idTEXT PRIMARY KEY群组 ID
nameTEXT NOT NULL群名
creator_idTEXT NOT NULL创建者 ID
members_jsonTEXT DEFAULT '[]'成员列表 JSON 数组
announcementTEXT DEFAULT ''群公告
announcement_atTEXT DEFAULT NULL公告更新时间
created_atTEXT DEFAULT (datetime('now'))创建时间

members_json 结构

群成员存储在 members_json 字段中,格式为 [{ user_id, role, joined_at }, ...],role 取值 owner / admin / member。这种 JSON 存储方式简化了小规模班级场景的查询,避免额外的 group_members 关联表。

group_messages — 群聊消息 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
group_idTEXT NOT NULL群组 ID
sender_idTEXT NOT NULL发送者 ID
sender_nameTEXT NOT NULL发送者姓名
contentTEXT NOT NULL内容
typeTEXT DEFAULT 'text'类型
recalledINTEGER DEFAULT 0是否撤回
created_atTEXT DEFAULT (datetime('now'))创建时间

conversations — AI 对话 ​

字段类型说明
idTEXT PRIMARY KEY对话 ID
user_idTEXT NOT NULL用户 ID
titleTEXT DEFAULT '新对话'对话标题
messages_jsonTEXT DEFAULT '[]'消息列表 JSON 数组
created_atTEXT DEFAULT (datetime('now'))创建时间
updated_atTEXT DEFAULT (datetime('now'))更新时间

user_settings — 用户设置 ​

字段类型说明
user_idTEXT PRIMARY KEY用户 ID
themeTEXT DEFAULT 'light'主题(light / dark)
wallpaperTEXT DEFAULT 'default'壁纸 ID
notifications_jsonTEXT DEFAULT '{"superIsland":true,"chat":true,"sound":false}'通知设置
updated_atTEXT DEFAULT (datetime('now'))更新时间

admin_logs — 管理日志 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
admin_idTEXT NOT NULL操作者 ID
actionTEXT NOT NULL操作动作(如 disable_user、broadcast、appoint_officer)
targetTEXT DEFAULT ''目标对象 ID
detailTEXT DEFAULT ''详情
created_atTEXT DEFAULT (datetime('now'))创建时间

posts — 论坛帖子 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
author_idTEXT NOT NULL作者 ID
titleTEXT NOT NULL标题
contentTEXT NOT NULL内容(Markdown)
categoryTEXT DEFAULT 'general'分类
viewsINTEGER DEFAULT 0浏览数
likesINTEGER DEFAULT 0点赞数
created_atTEXT DEFAULT (datetime('now'))创建时间

comments — 评论 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
post_idTEXT NOT NULL帖子 ID
author_idTEXT NOT NULL作者 ID
contentTEXT NOT NULL评论内容
parent_idINTEGER DEFAULT NULL父评论 ID(楼中楼)
created_atTEXT DEFAULT (datetime('now'))创建时间

files — 文件 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
owner_idTEXT NOT NULL所有者 ID
filenameTEXT NOT NULL文件名
pathTEXT NOT NULL存储路径(相对 Resources/cloud/)
sizeINTEGER NOT NULL字节数
mime_typeTEXT DEFAULT ''MIME 类型
created_atTEXT DEFAULT (datetime('now'))创建时间

notes — 笔记 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
owner_idTEXT NOT NULL所有者 ID
titleTEXT NOT NULL标题
contentTEXT DEFAULT ''内容(Markdown)
visibilityTEXT DEFAULT 'private'可见性:private / shared / public
updated_atTEXT DEFAULT (datetime('now'))更新时间

app_control — 应用管控 ​

字段类型说明
app_nameTEXT PRIMARY KEY应用名(kebab-case)
enabledINTEGER DEFAULT 1是否启用(0/1)
updated_atTEXT DEFAULT (datetime('now'))更新时间

system_settings — 系统设置 ​

字段类型说明
keyTEXT PRIMARY KEY设置键(如 site_name、allow_register)
valueTEXT DEFAULT ''设置值
updated_atTEXT DEFAULT (datetime('now'))更新时间

integrations — 第三方集成 ​

字段类型说明
idINTEGER PRIMARY KEY AUTOINCREMENT自增主键
nameTEXT NOT NULL集成名称
tokenTEXT NOT NULL集成 Token(ci_ 前缀)
secretTEXT NOT NULL集成 secret(sec_ 前缀)
scopesTEXT DEFAULT '[]'权限范围 JSON 数组
originsTEXT DEFAULT '[]'Origin 白名单 JSON 数组
webhook_urlTEXT DEFAULT ''Webhook 接收地址
expires_atTEXT DEFAULT NULL过期时间
created_atTEXT DEFAULT (datetime('now'))创建时间

levels — 用户等级 ​

字段类型说明
user_idTEXT PRIMARY KEY用户 ID
expINTEGER DEFAULT 0经验值
levelINTEGER DEFAULT 0等级
last_loginTEXT DEFAULT NULL最后登录日期(用于计算连续签到)
streakINTEGER DEFAULT 0连续登录天数

等级图标

等级 0-6 对应 Resources/public/icons/level/Lv0.svg ~ Lv6.svg,前端根据 level 字段动态加载图标。

Manifest Schema ​

源码:shared/src/manifest-schema.js(前端 ES Module)+ server/src/core/manifest-schema.js(后端 CommonJS 版)

应用清单描述应用的元数据、前后端入口、分类与权限。ClassIntra 的 manifest 使用扁平 schema,前后端共用同一份验证器。

字段定义 ​

字段类型必填默认值说明
namestring是—应用唯一标识(kebab-case)
labelstring是—显示名称
iconstring否—图标路径
colorstring否—主题色(hex)
categorystring否'desktop'分类:desktop / system / hidden
ordernumber否99排序权重(越小越靠前)
defaultEnabledboolean否true默认是否启用
canDisableboolean否true是否允许用户禁用
typestring否'app'类型:app / system / widget / plugin
versionstring否'0.0.0'语义化版本号(semver)
frontendobject否—前端配置(route / component)
backendobject否—后端配置(mountPath / entry)
extraBackendsarray否—额外后端路由(阶段 0 引入)
integrationobject否—插件联动配置(type=plugin 时使用)

frontend 字段 ​

子字段类型必填说明
routestring是前端路由路径(如 /chat)
componentstring是Vue 组件路径(如 Chat/Chat.vue,相对 apps/<name>/frontend/)

backend 字段 ​

子字段类型必填说明
mountPathstring是后端路由挂载路径(如 /api/chat)
entrystring是后端入口文件(如 routes.js,相对 apps/<name>/backend/)

integration 字段(type=plugin 时) ​

子字段类型必填说明
contractobject是联动契约(定义对外暴露的能力)
frontendBridgestring否前端桥接入口
clientEntrystring否客户端入口
channelsarray否WebSocket 频道声明

验证器 ​

validateManifest(m) 返回 { valid, errors, warnings, manifest }:

  • valid:boolean,是否通过校验(有 errors 即 false)
  • errors:阻断性错误数组(缺 name / label 等)
  • warnings:非阻断警告数组(缺 icon / color、版本不符合 semver 等)
  • manifest:归一化后的 manifest(补全默认值)

前后端共用

前端(shared/src/manifest-schema.js)以 ES Module 形式导出 validateManifest 与 FIELD_DEFS;后端(server/src/core/manifest-schema.js)维护 CommonJS 版本,行为一致,便于在 Express 路由与服务注册阶段统一校验。

示例 ​

json
{
  "name": "ai-chat",
  "label": "AI 对话",
  "icon": "AI-Chat.svg",
  "color": "#7B68EE",
  "category": "desktop",
  "order": 10,
  "defaultEnabled": true,
  "canDisable": true,
  "type": "app",
  "version": "1.2.0",
  "frontend": {
    "route": "/ai-chat",
    "component": "AIChat.vue"
  },
  "backend": {
    "mountPath": "/api/ai-chat",
    "entry": "routes.js"
  }
}

WebSocket 消息格式 ​

ClassIntra WebSocket 连接地址为 ws://host:port/ws?token=<jwt>,所有消息为 JSON 文本,统一结构为 { type, ...payload }。

客户端 → 服务端 ​

type字段说明
connect(无)连接后首条消息,完成认证
ping(无)心跳请求
chatroom_id、content、type发送聊天消息
private_messagereceiver_id、content、type发送私聊消息
group_messagegroup_id、content、type发送群聊消息
recallmessage_id、channel撤回消息
typingroom_id / group_id输入中提示

服务端 → 客户端 ​

type字段说明
connecteduser_id、server_time连接认证成功
pong(无)心跳响应
chatid、room_id、sender_id、sender_name、content、type、created_at聊天消息广播
private_messageid、sender_id、sender_name、content、type、created_at私聊消息推送
group_messageid、group_id、sender_id、sender_name、content、type、created_at群聊消息推送
recalledmessage_id、channel消息撤回通知
notificationtitle、body、type、source通知推送
broadcastcontent、priority广播通知
user_loginuser_id、last_login用户上线通知
errormessage错误消息

消息撤回

recall 消息会触发服务端向同频道所有客户端广播 recalled,客户端收到后更新对应消息的 UI 状态。撤回有时效限制(默认 2 分钟内)。

API 响应格式 ​

所有 HTTP 响应均为 JSON,统一结构:

typescript
interface ApiResponse<T = any> {
  code: number;        // 业务状态码,200 表示成功
  message: string;     // 可读状态描述
  data: T | null;      // 业务数据,失败时为 null
}

部分端点会附加额外字段(如 ban_expires_at、ban_reason),前端按需读取。

code 与 HTTP 状态码

code 是业务状态码,通常与 HTTP 状态码一致(如 200/400/401/403/404/409/500),但部分端点即使业务失败也会返回 HTTP 200 + code: 400,前端需读取 response.data.code 而非 response.status 判断业务成功。

环境变量 ​

源码:server/.env.example

ClassIntra 服务端通过 dotenv 读取环境变量,主要变量如下:

变量类型必填默认值说明
PORTnumber否3000后端监听端口
JWT_SECRETstring是—JWT 签名密钥(未设置拒绝启动)
DB_PATHstring否data/classintra.dbSQLite 数据库文件路径
PUBLIC_DIRstring否public静态资源目录
CORS_ORIGINstring否*CORS 白名单(逗号分隔)
CDN_WHITELISTstring否—CDN 代理域名白名单(逗号分隔)
HTTPSboolean否false是否启用 HTTPS
NODE_ENVstring否development运行环境(production / development)
ADMIN_USER_IDSstring否[]管理员用户 ID 列表(JSON 数组字符串)
RELAY_SECRETstring否—中继服务器间认证密钥
RELAY_SERVERSstring否[]中继服务器地址列表(JSON 数组字符串)
WEATHER_API_KEYstring否—和风天气 API Key
AI_API_KEYstring否—AI 对话服务 API Key(OpenAI 兼容)
AI_API_BASEstring否—AI 服务 Base URL
AI_MODELstring否deepseek-chatAI 默认模型

JWT_SECRET 必填

JWT_SECRET 是唯一必填项,未设置时服务端启动会抛出错误并退出。生产环境请使用至少 32 字符的高强度随机字符串,建议通过 openssl rand -hex 32 生成。

多机中继配置

多班级中继需要配置 RELAY_SECRET(所有节点共享同一密钥)与 RELAY_SERVERS(其他节点的 WebSocket 地址,JSON 数组字符串)。通常配合 Tailscale 组网使用。

错误码常量 ​

源码:shared/src/constants.js + shared/src/errors.js

ClassIntra 使用 ClassIntraError 统一封装内部错误,通过 error.code 标识错误类型。

前端核心错误码 ​

错误码触发场景处理建议
SERVICE_NOT_REGISTEREDServiceRegistry.resolve 时 name 未注册检查 name 拼写与注册时机
SERVICE_ALREADY_REGISTEREDregister 时 name 已存在改用唯一 name 或先 shutdown
THEME_NOT_FOUNDsetTheme 时 id 未注册检查主题是否通过 theme-loader 加载
HOTKEY_INVALID_COMBOregister 时 combo 格式错误使用 ctrl+k 等标准格式
HOTKEY_DUPLICATE_IDregister 时 id 已存在改用唯一 id 或先 unregister
STORAGE_QUOTA_EXCEEDEDPersistenceStore.set 时 localStorage 空间不足清理无用 key 或改用 IndexedDB
WS_CONNECTION_FAILEDWebSocket 连接失败检查 URL、Token、网络
WS_AUTH_FAILEDWebSocket 认证失败检查 Token 有效性
NETWORK_OFFLINE断网保护触发等待网络恢复

HTTP 业务状态码 ​

服务端 API 的业务状态码(code 字段):

code含义典型场景
200成功正常请求
400Bad Request参数无效、字段缺失、密码强度不足
401Unauthorized未携带 Token、Token 无效、密码错误
403Forbidden账号被禁用、无管理员权限、域名不在白名单
404Not Found用户/资源不存在
409Conflict网名已占用、姓名已注册
429Too Many Requests限流触发
500Internal Server Error服务端未捕获异常
503Service Unavailable中继服务器不可用

ClassIntraError 结构

所有前端内部错误均继承自 ClassIntraError,可通过 error.code 获取错误码、error.message 获取可读描述、error.cause 获取原始错误。捕获时优先按 code 分支处理。

相关文档 ​