数据字典
概述
本文档详细描述当前 GORM 自动迁移涉及的核心表结构、字段定义和索引信息。
以 internal/gormdb/models.go 及其仓储代码为最终事实来源;历史数据库可能还存在
已停用列,只有显式执行 -auto-migrate 才会按迁移策略清理这些遗留结构。
数据库类型:MySQL 5.7+ / MariaDB 10.3+
字符集:utf8mb4
排序规则:utf8mb4_unicode_ci
用户表 (users)
用户表存储所有注册用户的信息。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| name |
VARCHAR(255) |
NO |
- |
用户名(唯一) |
| email |
VARCHAR(255) |
NO |
- |
邮箱地址(唯一) |
| email_verified |
TINYINT(1) |
NO |
0 |
邮箱是否已验证 |
| callsign |
VARCHAR(32) |
YES |
NULL |
业余电台呼号(唯一) |
| gird |
VARCHAR(255) |
YES |
- |
网格定位(遗留字段) |
| phone |
VARCHAR(32) |
YES |
- |
手机号 |
| password |
VARCHAR(255) |
NO |
- |
密码(bcrypt哈希) |
| birthday |
VARCHAR(32) |
YES |
- |
生日 |
| sex |
TINYINT |
NO |
0 |
性别(0=未知, 1=男, 2=女) |
| avatar |
VARCHAR(512) |
YES |
- |
头像URL |
| address |
VARCHAR(512) |
YES |
- |
地址 |
| roles |
VARCHAR(32) |
NO |
'user' |
角色(user/admin) |
| introduction |
TEXT |
YES |
- |
个人简介 |
| alarm_msg |
TINYINT(1) |
NO |
0 |
是否接收告警消息 |
| status |
TINYINT |
NO |
1 |
账号状态 |
| approval_status |
TINYINT |
NO |
0 |
审核状态(0=待审核, 1=已通过, 2=已拒绝) |
| reviewer_id |
INT |
YES |
NULL |
审核人ID |
| review_note |
TEXT |
YES |
- |
审核备注 |
| review_time |
DATETIME |
YES |
NULL |
审核时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间(自动) |
| last_login_time |
DATETIME |
YES |
NULL |
最后登录时间 |
| login_err_times |
INT |
NO |
0 |
登录错误次数 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间(自动) |
| openid |
VARCHAR(255) |
YES |
- |
微信OpenID |
| nickname |
VARCHAR(255) |
YES |
- |
昵称 |
| pid |
VARCHAR(255) |
YES |
- |
PID标识 |
| last_login_ip |
VARCHAR(64) |
YES |
- |
最后登录IP |
| dmrid |
INT |
NO |
0 |
DMR ID |
| mdcid |
VARCHAR(255) |
NO |
'' |
MDC ID |
| device_password |
VARCHAR(255) |
YES |
- |
设备准入密码(AES可逆密文) |
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| uk_name |
唯一 |
name |
用户名唯一 |
| uk_email |
唯一 |
email |
邮箱唯一 |
| uk_callsign |
唯一 |
callsign |
呼号唯一 |
| idx_phone |
普通 |
phone |
手机号索引 |
| idx_openid |
普通 |
openid |
微信OpenID索引 |
外键关系
被以下表引用(级联删除):
- devices.owner_id
- group_members.user_id
- operator_certs.user_id
- logbooks.user_id
- user_radio_presets.user_id
- user_device_preferences.user_id
设备表 (devices)
设备表存储所有注册设备的信息。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| name |
VARCHAR(255) |
YES |
- |
设备名称 |
| dmrid |
BIGINT |
YES |
- |
DMR ID |
| ssid |
TINYINT UNSIGNED |
NO |
- |
设备子号 |
| owner_id |
INT |
NO |
- |
所有者用户ID |
| qth |
VARCHAR(255) |
YES |
- |
位置信息 |
| last_online_ip |
VARCHAR(64) |
YES |
- |
最近上线IP |
| dev_model |
INT |
NO |
0 |
设备型号 |
| group_id |
INT |
YES |
NULL |
所属群组ID |
| status |
TINYINT |
NO |
1 |
设备状态 |
| is_certed |
TINYINT(1) |
NO |
0 |
是否已认证 |
| priority |
INT |
NO |
100 |
优先级 |
| disable_send |
TINYINT(1) |
NO |
0 |
设备级禁发 |
| disable_recv |
TINYINT(1) |
NO |
0 |
设备级禁收 |
| is_online |
TINYINT(1) |
NO |
0 |
是否在线 |
| online_time |
DATETIME |
YES |
- |
上线时间 |
| note |
TEXT |
YES |
- |
备注 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| idx_owner_ssid |
唯一 |
owner_id, ssid |
用户下SSID唯一 |
| idx_dmrid |
普通 |
dmrid |
DMR ID索引 |
| idx_group_id |
普通 |
group_id |
群组ID索引 |
| idx_group_online |
普通 |
group_id, is_online |
群组在线设备索引 |
外键关系
- owner_id → users.id (CASCADE)
- group_id → public_groups.id (SET NULL)
设备型号枚举
| 值 |
说明 |
| 0 |
未知设备 |
| 1 |
ESP32 链路盒子(1W 射频版) |
| 2 |
ESP32 链路盒子(无射频版) |
| 100 |
微信小程序 |
| 101 |
Android 客户端 |
| 102 |
iOS 客户端 |
| 103 |
Windows 客户端 |
| 104 |
macOS 客户端 |
| 105 |
浏览器客户端 |
| 106 |
互联设备(历史) |
| 107 |
ESP32 链路台/手咪(历史) |
| 236 |
南山对讲软件桥接器 |
| 237 |
涛涛对讲软件桥接器 |
| 238 |
本视对讲(HT)软件桥接器 |
| 239 |
NRL2 系统软件桥接器 |
群组表 (public_groups)
群组表存储所有群组的信息。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| name |
VARCHAR(255) |
NO |
- |
群组名称 |
| type |
INT |
NO |
0 |
类型(0=普通, 1=公开, 2=私有) |
| call_sign |
VARCHAR(255) |
YES |
- |
旧库兼容列;应用已停用,执行 -auto-migrate 后删除 |
| password |
VARCHAR(255) |
YES |
- |
私有群组密码 |
| ower_id |
INT |
YES |
- |
所有者用户ID |
| master_server |
INT |
YES |
- |
主服务器ID |
| slave_server |
INT |
YES |
- |
从服务器ID |
| status |
INT |
NO |
1 |
状态(1=启用) |
| is_virtual |
TINYINT(1) |
NO |
0 |
是否为虚拟互联组 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
| note |
TEXT |
YES |
- |
备注 |
旧库可能保留 allow_callsign_ssid 列。应用已停用并忽略该设备准入白名单;
显式执行 -auto-migrate 时,空历史列会被删除。若仍存在非空配置,迁移会中止并要求先人工确认清理,避免静默丢失数据。
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| idx_ower_id |
普通 |
ower_id |
所有者索引 |
群组类型枚举
| 值 |
说明 |
| 0 |
普通群组 |
| 1 |
公开群组 |
| 2 |
私有群组 |
群组互联表 (group_links)
群组互联表存储虚拟互联组与目标群组的关联关系。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| link_group_id |
INT |
NO |
- |
互联组ID |
| target_group_id |
INT |
NO |
- |
目标群组ID |
| created_at |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| updated_at |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| uk_link_target |
唯一 |
link_group_id, target_group_id |
互联关系唯一 |
外键关系
- link_group_id → public_groups.id (CASCADE)
- target_group_id → public_groups.id (CASCADE)
群组成员表 (group_members)
群组成员表存储用户与群组的关联关系。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| group_id |
INT |
NO |
- |
群组ID |
| user_id |
INT |
NO |
- |
用户ID |
| is_verified |
TINYINT(1) |
NO |
0 |
是否已验证密码 |
| join_time |
DATETIME |
YES |
- |
加入时间 |
| last_verify |
DATETIME |
YES |
- |
最后验证时间 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| uk_group_user |
唯一 |
group_id, user_id |
群组用户唯一 |
外键关系
- group_id → public_groups.id (CASCADE)
- user_id → users.id (CASCADE)
通信记录表 (comm_records)
通信记录表存储语音和文本通信事实,同时作为频道消息历史的数据源。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
UINT |
NO |
AUTO_INCREMENT |
主键 |
| device_id |
UINT |
NO |
0 |
发送设备ID(0=幽灵设备) |
| device_ssid |
TINYINT UNSIGNED |
NO |
0 |
设备SSID |
| group_id |
UINT |
YES |
NULL |
群组ID |
| user_id |
UINT |
YES |
NULL |
用户ID |
| start_time |
DATETIME |
NO |
- |
通信开始时间 |
| end_time |
DATETIME |
YES |
- |
通信结束时间 |
| duration_ms |
INT |
NO |
0 |
通信时长(毫秒) |
| audio_path |
VARCHAR(255) |
YES |
- |
MinIO音频文件路径 |
| audio_size |
BIGINT |
NO |
0 |
音频文件大小(字节) |
| status |
INT |
NO |
0 |
状态(0=录制中, 1=待上传, 2=已完成, 3=上传失败) |
| message_type |
TINYINT UNSIGNED |
NO |
0 |
消息类型(0=语音, 1=文本) |
| text_content |
TEXT |
YES |
- |
文本消息内容 |
| sender_username |
VARCHAR(255) |
YES |
- |
发送时用户名快照 |
| sender_callsign |
VARCHAR(32) |
YES |
- |
发送时呼号快照 |
| sender_nickname |
VARCHAR(255) |
YES |
- |
发送时昵称快照 |
| sender_dev_model |
INT |
NO |
0 |
发送时设备型号快照 |
| is_auto_broadcast |
TINYINT(1) |
NO |
0 |
是否为系统自动播报;自动播报不生成通信录音副本 |
| created_at |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| idx_device_id |
普通 |
device_id |
设备ID索引 |
| idx_group_id |
普通 |
group_id |
群组ID索引 |
| idx_user_id |
普通 |
user_id |
用户ID索引 |
| idx_comm_records_is_auto_broadcast |
普通 |
is_auto_broadcast |
自动播报记录筛选索引 |
| idx_group_start |
普通 |
group_id, start_time |
群组时间索引 |
| idx_user_start |
普通 |
user_id, start_time |
用户时间索引 |
| idx_status |
普通 |
status |
状态索引 |
| idx_comm_records_group_status_start_id |
普通 |
group_id, status, start_time, id |
无类型过滤的频道消息游标索引 |
| idx_comm_records_group_status_type_start_id |
普通 |
group_id, status, message_type, start_time, id |
带类型过滤的频道消息游标索引 |
| idx_comm_records_status_start_id |
普通 |
status, start_time, id |
管理员全局发信记录分页索引 |
| idx_comm_records_user_status_start_id |
普通 |
user_id, status, start_time, id |
按发送用户筛选发信记录的分页索引 |
通信记录投递快照表 (comm_record_delivery_groups)
该表记录消息发送时实际投递到的群组。频道历史按该快照授权,不按当前虚拟互联拓扑回算。旧通信记录迁移时只补录仍存在的来源组;来源组已删除的孤儿通信记录继续保留,但不创建无效快照。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| record_id |
UINT |
NO |
- |
通信记录ID,删除记录时级联删除 |
| group_id |
UINT |
NO |
- |
发送时实际接收该消息的群组ID |
| start_time |
DATETIME(3) |
YES |
NULL |
消息发送时间的不可变查询快照;迁移会从通信记录补齐 |
| message_type |
TINYINT UNSIGNED |
YES |
NULL |
消息类型的不可变查询快照;迁移会从通信记录补齐 |
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
record_id, group_id |
防止同一记录重复写入相同投递群组 |
| idx_delivery_group_record |
普通 |
group_id, record_id |
按频道查找投递记录 |
| idx_delivery_group_cursor |
普通 |
group_id, start_time, record_id |
按频道和时间游标查询消息 |
| idx_delivery_group_type_cursor |
普通 |
group_id, message_type, start_time, record_id |
按频道、消息类型和时间游标查询消息 |
自动播报音频表 (broadcast_audios)
实体组的原始音频和预处理播放文件元数据。记录软删除;对象文件在删除事务提交后清理。
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
UINT |
NO |
AUTO_INCREMENT |
主键 |
| group_id |
INT |
NO |
- |
所属实体组,删除群组时级联清理 |
| name |
VARCHAR(255) |
NO |
- |
管理端显示名称 |
| original_object_key |
VARCHAR(512) |
NO |
- |
原始私有对象键 |
| playback_object_key |
VARCHAR(512) |
YES |
NULL |
已验证的协议播放对象键 |
| record_object_key |
VARCHAR(512) |
YES |
NULL |
完整播报日志共享的 Raw Opus 对象键 |
| original_mime_type |
VARCHAR(100) |
YES |
NULL |
原始文件 MIME |
| original_size / playback_size |
BIGINT |
NO |
0 |
原始/播放文件大小 |
| record_size |
BIGINT |
NO |
0 |
共享 Raw Opus 文件大小 |
| duration_ms / packet_count |
INT |
NO |
0 |
已处理音频时长和 60ms Opus 包数 |
| sha256 |
CHAR(64) |
NO |
- |
原始文件 SHA-256 |
| status |
VARCHAR(20) |
NO |
processing |
processing、ready、failed |
| error_message |
VARCHAR(500) |
YES |
NULL |
转码或校验失败原因 |
| created_by |
INT |
NO |
- |
创建者审计引用;用户删除时转交给存活群组所有者 |
| created_at / updated_at / deleted_at |
DATETIME |
- |
- |
生命周期时间 |
索引:group_id、status、deleted_at、(group_id, sha256)。
删除素材时,若 record_object_key 仍被通信记录引用则延迟删除;最后一个日志引用释放后再回收对象。
自动播报计划表 (broadcast_schedules)
计划允许同一个音频在不同时间重复使用,也允许每个计划引用不同音频。计划软删除,执行
历史保留对其和音频的外键快照。
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
UINT |
NO |
AUTO_INCREMENT |
主键 |
| group_id / audio_id |
INT / UINT |
NO |
- |
来源实体组与音频 |
| name |
VARCHAR(255) |
NO |
- |
计划名称 |
| schedule_type |
VARCHAR(16) |
NO |
- |
once、daily、weekly、interval |
| timezone |
VARCHAR(64) |
NO |
- |
IANA 时区 |
| scheduled_at |
DATETIME(3) |
YES |
NULL |
一次计划的 UTC 时刻 |
| local_time / weekday_mask |
CHAR(8) / TINYINT |
YES |
NULL |
日/周计划本地时刻和星期掩码 |
| interval_seconds |
INT UNSIGNED |
NO |
0 |
间隔计划的周期秒数,取整分钟且范围为 60 秒到 30 天 |
| interval_start_at |
DATETIME(3) |
YES |
NULL |
间隔计划的计时 0 点(UTC) |
| blackout_start_time / blackout_end_time |
CHAR(8) |
YES |
NULL |
按计划时区解释的可选禁播时段,支持跨午夜 |
| next_run_at |
DATETIME(3) |
YES |
NULL |
下一次未来执行时间 |
| enabled |
TINYINT(1) |
NO |
0 |
管理员启用状态 |
| suspended_reason / suspended_by_virtual_group_id / suspended_at |
- |
YES |
NULL |
活动虚拟组策略造成的运行态挂起信息 |
| created_by / updated_by |
INT |
NO |
- |
创建和最后编辑审计引用;用户删除时转交给存活群组所有者 |
| created_at / updated_at / deleted_at |
DATETIME |
- |
- |
生命周期时间 |
索引:audio_id、group_id、deleted_at、(enabled, next_run_at)。
虚拟组自动播报策略表 (virtual_group_broadcast_policies)
每个虚拟组一条持久化策略。虚拟组关闭时策略保留但不挂起成员计划。
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| virtual_group_id |
INT |
NO |
- |
主键,虚拟组删除时级联删除 |
| mode |
VARCHAR(32) |
NO |
suspend_all |
suspend_all 或 allow_single_source |
| allowed_source_group_id |
INT |
YES |
NULL |
唯一允许的成员实体组;其他来源删除时策略降为 suspend_all |
| updated_by |
INT |
NO |
- |
最后编辑审计引用;用户删除时转交给虚拟组所有者 |
| created_at / updated_at |
DATETIME |
NO |
- |
创建与更新时刻 |
自动播报执行表 (broadcast_runs)
每个计划的每次理论时刻最多一条执行记录,独立保存跳过、取消、成功和故障原因。
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
UINT |
NO |
AUTO_INCREMENT |
主键 |
| schedule_id / audio_id / source_group_id |
UINT / UINT / INT |
NO |
- |
计划、音频和来源组快照 |
| scheduled_for |
DATETIME(3) |
NO |
- |
本轮理论执行时刻;与 schedule_id 唯一 |
| domain_key / domain_group_ids |
VARCHAR(255) / JSON |
YES |
NULL |
话权域和发送时成员快照 |
| status |
VARCHAR(48) |
NO |
- |
执行、跳过、取消、失败或成功状态 |
| last_voice_at |
DATETIME(3) |
YES |
NULL |
静默门禁观察到的最近语音 |
| started_at / ended_at |
DATETIME(3) |
YES |
NULL |
实际播放起止 |
| played_duration_ms / sent_packets / dropped_packets |
INT |
NO |
0 |
进度和实时丢帧计数 |
| claimed_by / lease_until |
VARCHAR(128) / DATETIME(3) |
YES |
NULL |
分布式认领与租约信息 |
| error_code / error_message |
VARCHAR(64) / VARCHAR(500) |
YES |
NULL |
可审计的终止或跳过原因 |
| created_at / updated_at |
DATETIME |
NO |
- |
创建与更新时刻 |
索引:schedule_id、audio_id、source_group_id、lease_until、status,以及
唯一键 (schedule_id, scheduled_for)。
服务器表 (servers)
服务器表存储服务器管理信息。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| name |
VARCHAR(255) |
NO |
- |
服务器名称 |
| server_type |
INT |
NO |
0 |
服务器类型 |
| join_key |
VARCHAR(255) |
YES |
- |
加入密钥 |
| ip_addr |
VARCHAR(64) |
YES |
- |
IP地址 |
| udp_port |
INT |
YES |
- |
UDP端口 |
| ower_id |
INT |
YES |
- |
所有者用户ID |
| is_online |
TINYINT(1) |
NO |
0 |
是否在线 |
| status |
INT |
NO |
1 |
状态 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
| note |
TEXT |
YES |
- |
备注 |
| node_id |
VARCHAR(64) |
YES |
- |
边缘节点内部唯一标识 |
| display_name |
VARCHAR(255) |
NO |
- |
管理后台显示昵称 |
| public_access_id |
VARCHAR(64) |
YES |
- |
对设备公开的稳定入口标识 |
| public_access_enabled |
TINYINT(1) |
NO |
0 |
是否加入设备可发现入口列表 |
| public_udp_host |
VARCHAR(255) |
NO |
- |
设备接入 UDP 主机 |
| public_udp_port |
INT |
NO |
0 |
设备接入 UDP 端口 |
| public_region |
VARCHAR(100) |
NO |
- |
公开地域标签 |
| public_network |
VARCHAR(100) |
NO |
- |
公开网络标签 |
| public_priority |
INT |
NO |
100 |
客户端选择时的展示优先级 |
| node_token_hash |
CHAR(64) |
NO |
- |
当前长期凭据 SHA-256,不保存明文 |
| node_previous_token_hash |
CHAR(64) |
NO |
- |
轮换宽限期内的旧凭据 SHA-256 |
| node_previous_token_expires_at |
DATETIME |
YES |
- |
旧凭据宽限截止时间 |
| node_registration_token_hash |
CHAR(64) |
NO |
- |
一次性注册凭据 SHA-256 |
| node_registration_expires_at |
DATETIME |
YES |
- |
注册凭据过期时间 |
| node_registered_at |
DATETIME |
YES |
- |
首次注册完成时间 |
| node_credential_epoch |
INT UNSIGNED |
NO |
0 |
凭据变更世代 |
| node_instance_id |
VARCHAR(128) |
NO |
- |
当前边缘进程实例标识 |
| node_remote_addr |
VARCHAR(255) |
NO |
- |
最近控制连接地址 |
| node_control_session_id |
BIGINT UNSIGNED |
NO |
0 |
当前控制会话标识 |
| node_projection_version |
BIGINT UNSIGNED |
NO |
0 |
中心已发布的节点投影版本 |
| node_acked_projection_version |
BIGINT UNSIGNED |
NO |
0 |
边缘已确认的投影版本 |
| node_last_seen_at |
DATETIME |
YES |
- |
最近心跳时间 |
| node_connection_count |
INT |
NO |
0 |
最近上报的设备连接数 |
| node_device_in_packets |
BIGINT UNSIGNED |
NO |
0 |
设备侧入站累计包数 |
| node_device_in_bytes |
BIGINT UNSIGNED |
NO |
0 |
设备侧入站累计字节数 |
| node_device_out_packets |
BIGINT UNSIGNED |
NO |
0 |
设备侧出站累计包数 |
| node_device_out_bytes |
BIGINT UNSIGNED |
NO |
0 |
设备侧出站累计字节数 |
| node_interconnect_in_packets |
BIGINT UNSIGNED |
NO |
0 |
互联侧入站累计包数 |
| node_interconnect_in_bytes |
BIGINT UNSIGNED |
NO |
0 |
互联侧入站累计字节数 |
| node_interconnect_out_packets |
BIGINT UNSIGNED |
NO |
0 |
互联侧出站累计包数 |
| node_interconnect_out_bytes |
BIGINT UNSIGNED |
NO |
0 |
互联侧出站累计字节数 |
| node_metrics_sampled_at |
DATETIME |
YES |
- |
最近指标采样时间 |
中继台表 (relay)
中继台表存储中继台信息。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| name |
VARCHAR(255) |
NO |
- |
中继台名称 |
| up_freq |
VARCHAR(32) |
YES |
- |
上行频率 |
| down_freq |
VARCHAR(32) |
YES |
- |
下行频率 |
| send_ctss |
VARCHAR(32) |
YES |
- |
发射亚音 |
| recive_ctss |
VARCHAR(32) |
YES |
- |
接收亚音 |
| ower_callsign |
VARCHAR(32) |
YES |
- |
所有者呼号 |
| location |
VARCHAR(255) |
YES |
- |
位置 |
| latitude |
DOUBLE |
YES |
- |
纬度 |
| longitude |
DOUBLE |
YES |
- |
经度 |
| status |
INT |
NO |
1 |
状态 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
| note |
TEXT |
YES |
- |
备注 |
操作日志表 (operator_log)
操作日志表记录系统操作日志。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| timestamp |
DATETIME |
NO |
CURRENT_TIMESTAMP |
时间戳 |
| content |
TEXT |
NO |
- |
日志内容 |
| event_type |
VARCHAR(64) |
NO |
- |
事件类型 |
| operator |
VARCHAR(255) |
YES |
- |
操作者 |
| operator_id |
INT |
YES |
- |
操作者ID |
| ip_address |
VARCHAR(64) |
YES |
- |
操作或节点认证请求的来源 IP |
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| idx_event_type |
普通 |
event_type |
事件类型索引 |
| idx_operator_id |
普通 |
operator_id |
操作者索引 |
操作证表 (operator_certs)
操作证表存储用户提交的操作证信息。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| user_id |
INT |
NO |
- |
用户ID |
| callsign |
VARCHAR(32) |
NO |
- |
申请呼号 |
| file_name |
VARCHAR(255) |
YES |
- |
文件名 |
| minio_path |
VARCHAR(512) |
YES |
- |
MinIO路径 |
| status |
INT |
NO |
0 |
状态(0=待审, 1=通过, 2=拒绝) |
| reviewer_id |
INT |
YES |
NULL |
审核人ID |
| review_note |
TEXT |
YES |
- |
审核备注 |
| review_time |
DATETIME |
YES |
NULL |
审核时间 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
外键关系
- user_id → users.id (CASCADE)
- reviewer_id → users.id (SET NULL)
站点配置表 (site_configs)
站点配置表存储系统配置项。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| config_key |
VARCHAR(255) |
NO |
- |
配置键(唯一) |
| config_value |
TEXT |
YES |
- |
配置值 |
| category |
VARCHAR(64) |
NO |
- |
分类(icp/system/aprs/smtp) |
| description |
VARCHAR(512) |
YES |
- |
描述 |
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| uk_config_key |
唯一 |
config_key |
配置键唯一 |
| idx_category |
普通 |
category |
分类索引 |
配置分类
| 分类 |
说明 |
示例键 |
| icp |
ICP备案 |
icp_number |
| system |
系统信息 |
site_name, site_logo, site_favicon |
| aprs |
APRS配置 |
aprs_enabled, aprs_server, aprs_port |
| smtp |
邮件配置 |
smtp_host, smtp_port, smtp_password |
| registration |
注册配置 |
require_email_verification |
| comm |
通信设置 |
comm_record_enabled, comm_record_days |
资源文件表 (assets)
资源文件表存储资源中心的文件和文件夹。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| parent_id |
INT |
YES |
NULL |
父文件夹ID |
| name |
VARCHAR(255) |
NO |
- |
名称 |
| type |
VARCHAR(32) |
NO |
- |
类型(folder/file) |
| path |
VARCHAR(512) |
YES |
- |
MinIO路径 |
| size |
BIGINT |
NO |
0 |
文件大小 |
| mime_type |
VARCHAR(128) |
YES |
- |
MIME类型 |
| remark |
TEXT |
YES |
- |
备注 |
| sort_order |
INT |
NO |
0 |
排序顺序 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
外键关系
- parent_id → assets.id (CASCADE)
设备配置表 (device_configs)
设备配置表存储设备的TLV配置数据。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| device_id |
INT |
NO |
- |
设备ID |
| config_key |
VARCHAR(64) |
NO |
- |
配置键 |
| config_value |
VARCHAR(255) |
NO |
- |
配置值 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
外键关系
- device_id → devices.id (CASCADE)
配置键说明
| 键 |
说明 |
示例值 |
| rx_freq |
接收频率(Hz) |
439500000 |
| tx_freq |
发射频率(Hz) |
431500000 |
| rx_ctcss |
接收亚音(Hz) |
88.5 |
| tx_ctcss |
发射亚音(Hz) |
88.5 |
| sql_level |
静噪等级(0-8) |
5 |
| power_level |
功率等级 |
3 |
| tx_bandwidth |
发射带宽 |
2 |
| rx_tone_mode |
接收亚音类型 |
CTCSS |
| rx_tone_value |
接收亚音值 |
88.5 |
| tx_tone_mode |
发射亚音类型 |
CTCSS |
| tx_tone_value |
发射亚音值 |
88.5 |
| rf_guard_enabled |
射频保护开关 |
1 |
| rf_guard_single_tx_limit_s |
单次发射上限(秒) |
30 |
| rf_guard_window_s |
统计窗口(秒) |
300 |
| rf_guard_max_tx_in_window_s |
窗口内累计发射上限(秒) |
60 |
通联日志表 (logbooks)
通联日志表存储业余无线电QSO记录。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| user_id |
INT |
NO |
- |
用户ID |
| my_callsign |
VARCHAR(32) |
NO |
- |
我方呼号 |
| time_utc |
DATETIME |
NO |
- |
UTC时间 |
| tx_frequency |
VARCHAR(32) |
YES |
- |
发射频率 |
| rx_frequency |
VARCHAR(32) |
YES |
- |
接收频率 |
| cq_zone |
INT |
YES |
- |
CQ分区 |
| itu_zone |
INT |
YES |
- |
ITU分区 |
| mode |
VARCHAR(32) |
YES |
- |
通信模式 |
| callsign |
VARCHAR(32) |
NO |
- |
对方呼号 |
| their_rst |
VARCHAR(16) |
YES |
- |
对方信号报告 |
| my_rst |
VARCHAR(16) |
YES |
- |
我方信号报告 |
| their_power |
VARCHAR(16) |
YES |
- |
对方功率 |
| my_power |
VARCHAR(16) |
YES |
- |
我方功率 |
| their_qth |
VARCHAR(255) |
YES |
- |
对方QTH |
| my_qth |
VARCHAR(255) |
YES |
- |
我方QTH |
| their_radio |
VARCHAR(128) |
YES |
- |
对方电台 |
| my_radio |
VARCHAR(128) |
YES |
- |
我方电台 |
| their_antenna |
VARCHAR(128) |
YES |
- |
对方天线 |
| my_antenna |
VARCHAR(128) |
YES |
- |
我方天线 |
| notes |
TEXT |
YES |
- |
备注 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
外键关系
- user_id → users.id (CASCADE)
电台预设表 (user_radio_presets)
电台预设表存储用户常用的电台配置。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| user_id |
INT |
NO |
- |
用户ID |
| name |
VARCHAR(128) |
NO |
- |
预设名称 |
| radio |
VARCHAR(128) |
YES |
- |
电台型号 |
| antenna |
VARCHAR(128) |
YES |
- |
天线型号 |
| power |
VARCHAR(32) |
YES |
- |
功率 |
| qth |
VARCHAR(255) |
YES |
- |
QTH |
| sort_order |
INT |
NO |
0 |
排序顺序 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
外键关系
- user_id → users.id (CASCADE)
设备偏好表 (user_device_preferences)
设备偏好表存储用户的设备偏好设置。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| user_id |
INT |
NO |
- |
用户ID |
| dev_model |
INT |
NO |
- |
偏好类型:0=新普通设备默认群组,101-105=客户端平台 |
| last_group_id |
INT |
YES |
- |
上次使用的群组ID |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
外键关系
- user_id → users.id (CASCADE)
幽灵客户端偏好表 (ghost_client_preferences)
按用户、平台和安装实例保存幽灵客户端最后一次单发/多收路由。该表只保存偏好,
不表示实例当前在线;在线状态和临时 session_id 只存在于运行时注册表。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
BIGINT UNSIGNED |
NO |
AUTO_INCREMENT |
主键 |
| user_id |
INT |
NO |
- |
所属用户 ID |
| dev_model |
TINYINT UNSIGNED |
NO |
- |
幽灵客户端平台型号(101-105) |
| client_instance_id |
CHAR(36) |
NO |
- |
安装范围持久化的随机 UUID |
| tx_group_id |
INT |
YES |
NULL |
最后一次发送频道;群组删除时置空 |
| created_at |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| updated_at |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
索引与关系
| 索引名 |
类型 |
字段 |
说明 |
| uk_ghost_client_instance |
唯一 |
user_id, dev_model, client_instance_id |
每个安装实例一条偏好 |
| idx_ghost_client_preferences_user_id |
普通 |
user_id |
用户偏好查询 |
| idx_ghost_client_preferences_tx_group_id |
普通 |
tx_group_id |
发送频道引用 |
- user_id → users.id (CASCADE)
- tx_group_id → public_groups.id (SET NULL)
幽灵客户端订阅表 (ghost_client_subscriptions)
把每个安装实例的接收频道拆成独立行,避免使用逗号分隔字段,并允许群组权限
撤销时精确删除订阅。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
BIGINT UNSIGNED |
NO |
AUTO_INCREMENT |
主键 |
| preference_id |
BIGINT UNSIGNED |
NO |
- |
幽灵客户端偏好 ID |
| group_id |
INT |
NO |
- |
接收频道 ID |
| created_at |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
索引与关系
| 索引名 |
类型 |
字段 |
说明 |
| uk_ghost_client_subscription |
唯一 |
preference_id, group_id |
同一安装实例不重复订阅频道 |
| idx_ghost_client_subscriptions_preference_id |
普通 |
preference_id |
偏好订阅查询 |
| idx_ghost_client_subscriptions_group_id |
普通 |
group_id |
按频道撤销/清理 |
- preference_id → ghost_client_preferences.id (CASCADE)
- group_id → public_groups.id (CASCADE)
固件发布表 (firmware_releases)
固件发布表存储设备固件版本信息。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| dev_model |
INT |
NO |
- |
设备型号 |
| version |
VARCHAR(32) |
NO |
- |
版本号(semver) |
| changelog |
TEXT |
YES |
- |
更新日志 |
| file_name |
VARCHAR(255) |
NO |
- |
文件名 |
| minio_path |
VARCHAR(512) |
NO |
- |
MinIO路径 |
| file_size |
BIGINT |
NO |
0 |
文件大小 |
| file_hash |
VARCHAR(128) |
NO |
- |
SHA-256哈希 |
| is_latest |
TINYINT(1) |
NO |
0 |
是否最新版本 |
| created_by |
INT |
YES |
- |
上传者ID |
| created_at |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
客户端资源表 (client_resources)
客户端资源表保存安装包、模型、字库和词典等资源的稳定身份。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| resource_key |
VARCHAR(191) |
NO |
- |
客户端使用的稳定资源键(唯一) |
| name |
VARCHAR(255) |
NO |
- |
后台显示名称 |
| category |
VARCHAR(64) |
YES |
- |
application/model/font/dictionary/data 等分类 |
| description |
MEDIUMTEXT |
YES |
- |
资源说明 |
| required |
TINYINT(1) |
NO |
0 |
客户端缺失时是否视为必需资源 |
| enabled |
TINYINT(1) |
NO |
- |
是否允许进入 manifest 和下载流程 |
| created_by |
INT |
YES |
- |
创建管理员 ID |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
索引
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| uk_client_resource_key |
唯一 |
resource_key |
稳定资源键唯一 |
| idx_client_resource_enabled |
普通 |
enabled |
manifest 启用状态筛选 |
客户端资源版本表 (client_resource_releases)
客户端资源版本表保存不可变版本身份、生命周期和客户端/服务端兼容契约。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| resource_id |
INT |
NO |
- |
所属客户端资源 ID |
| version |
VARCHAR(64) |
NO |
- |
不带 v 前缀的 SemVer 2.0.0 |
| channel |
VARCHAR(32) |
NO |
stable |
stable/beta 发布频道 |
| title |
VARCHAR(255) |
YES |
- |
版本标题 |
| changelog |
MEDIUMTEXT |
YES |
- |
更新日志 |
| status |
VARCHAR(32) |
NO |
draft |
draft/published/withdrawn |
| force_update |
TINYINT(1) |
NO |
0 |
是否要求客户端强制更新 |
| min_client_version |
VARCHAR(64) |
YES |
- |
最低客户端 SemVer |
| min_server_version |
VARCHAR(64) |
YES |
- |
最低服务端 SemVer |
| required_protocol_version |
SMALLINT UNSIGNED |
NO |
0 |
所需幽灵 Session 协议版本,0 表示未声明 |
| required_capabilities |
JSON |
YES |
NULL |
排序去重后的所需服务端能力数组;未声明时必须为 NULL |
| published_at |
DATETIME |
YES |
NULL |
发布时间 |
| created_by |
INT |
YES |
- |
创建管理员 ID |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
更新时间 |
索引与关系
| 索引名 |
类型 |
字段 |
说明 |
| PRIMARY |
主键 |
id |
主键索引 |
| uk_client_resource_release |
唯一 |
resource_id, channel, version |
同一资源和频道版本唯一 |
| idx_client_resource_release_lookup |
普通 |
resource_id, channel, version, status |
管理和 manifest 候选查询 |
- resource_id → client_resources.id (RESTRICT)
客户端资源文件表 (client_resource_artifacts)
客户端资源文件表保存已完成校验的不可变对象或受控应用商店地址。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| release_id |
INT |
NO |
- |
所属资源版本 ID |
| format |
VARCHAR(64) |
NO |
- |
apk/onnx/font 等文件格式 |
| runtime |
VARCHAR(64) |
NO |
default |
运行时选择维度 |
| variant |
VARCHAR(64) |
NO |
default |
变体选择维度 |
| build_number |
VARCHAR(64) |
YES |
- |
可选客户端构建号 |
| file_name |
VARCHAR(255) |
NO |
- |
下载展示文件名 |
| storage_key |
VARCHAR(512) |
YES |
- |
私有对象存储不可变 key |
| external_url |
VARCHAR(1024) |
YES |
- |
受控应用商店 HTTPS 地址 |
| file_size |
BIGINT |
NO |
0 |
文件字节数 |
| sha256 |
CHAR(64) |
YES |
- |
内容 SHA-256 |
| content_signature |
TEXT |
YES |
- |
可选长期内容签名 |
| signature_algorithm |
VARCHAR(64) |
YES |
- |
内容签名算法 |
| metadata |
JSON |
YES |
- |
资源类型自定义元数据 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
- release_id → client_resource_releases.id (CASCADE)
客户端资源目标表 (client_resource_artifact_targets)
目标表显式绑定 artifact 的平台和架构,不使用 universal 通配。
字段定义
| 字段名 |
类型 |
可空 |
默认值 |
说明 |
| id |
INT |
NO |
AUTO_INCREMENT |
主键 |
| artifact_id |
INT |
NO |
- |
所属 artifact ID |
| platform |
VARCHAR(32) |
NO |
- |
android/windows/macos/ios/linux 等平台 |
| arch |
VARCHAR(32) |
NO |
- |
arm64/x86_64/armv7 等架构 |
| min_os_version |
VARCHAR(64) |
YES |
- |
最低系统 SemVer |
| min_android_api |
INT |
YES |
0 |
Android 最低 API 级别,0 表示未声明 |
| create_time |
DATETIME |
NO |
CURRENT_TIMESTAMP |
创建时间 |
| 索引名 |
类型 |
字段 |
说明 |
| uk_client_resource_artifact_target |
唯一 |
artifact_id, platform, arch |
同一文件目标唯一 |
| idx_client_resource_target_lookup |
普通 |
artifact_id, platform, arch |
manifest 目标筛选 |
- artifact_id → client_resource_artifacts.id (CASCADE)
ER 关系图
