签名与安全 - 设备验签由 HMAC 重构为 ECDSA P-256(SHA256withECDSA),抽出 DeviceSignatureVerifier,canonical 串为 METHOD|path|bodyHash|ts|nonce - 新增 CachedBodyRequestWrapper 支持请求体读取,multipart 不参与 bodyHash - Redis 一次性 nonce 防重放,验签前校验设备存在且 status != 0(封禁即吊销) - bind_phone 接口豁免过滤器,改由 Controller 用请求内公钥做 PoP 验签并自动注册 - 新增封禁/解封设备接口(sys:device:update),SQL 增加 sys_sn.public_key 家属端(client) - 壁纸:上传单个 / 轮换(最多 7 张)/ 调整顺序,静态资源映射 /static/wallpaper/** - 图片:发送到设备(contentType=24)、发送记录列表、收藏状态标记 - 闹钟:查询 / 新增 / 修改 / 删除,变更后推送设备同步(contentType=25) - 新增请求绑定设备(contentType=20)、绑定成功通知(21)、反向拨号(22) 设备端(mobile) - 新增 get_alarms / sync_alarms,按设备本地 id 整表覆盖重建 - 策略接口同步新增 20 项管控开关(安全模式、ADB、APN、飞行模式、定位等) 其他 - MQTT 首次连接失败不再阻塞启动,新增每分钟定时兜底重连 - 文件服务补充 md5/sha1/sha256 校验值,AppIcon 增加 iconSha1/iconSha256 - 新增 SQL:sn_device_key / sn_device_alarm / sn_device_picture / sn_device_wallpaper
50 lines
3.2 KiB
SQL
50 lines
3.2 KiB
SQL
-- =============================================================================
|
||
-- 应用图标库表(app_icon)
|
||
--
|
||
-- 设计目标:
|
||
-- 1. 全局图标库:同一应用包名(package_name)的所有设备共用图标,按包名维度维护
|
||
-- 2. 历史版本:同一包名可保存多个历史图标版本(status 区分当前生效/历史),
|
||
-- 支持从历史版本中选取并锁定,规避三方 App 活动期换图标带广告等风险
|
||
-- 3. 锁定机制:locked=1 的版本不可被设备端/管理端上传覆盖,需先解锁
|
||
-- 4. 内容指纹:icon_md5 用于内容去重(同一图标不同包名复用同一文件)
|
||
--
|
||
-- 约定:
|
||
-- - 同一 package_name 下 status=1(当前生效)的记录有且仅有一条
|
||
-- - 历史版本(status=0)仅用于展示与选取锁定,不物理删除
|
||
-- - 图标文件按 {md5}.{ext} 内容寻址存储,访问路径由后端拼接为 /static/app_icon/{md5}.{ext}
|
||
-- (该前缀与 WebMvcConfig 注册的静态资源映射一致;内容变更必然导致文件名变更,故可长缓存)
|
||
--
|
||
-- 部署规范:不直连库,由 DBA 执行;先 DROP 再 CREATE 确保结构与实体完全一致
|
||
-- (DROP 会清空历史图标数据,可由设备端重新上报补齐)。
|
||
-- =============================================================================
|
||
|
||
DROP TABLE IF EXISTS `app_icon`;
|
||
|
||
CREATE TABLE `app_icon`
|
||
(
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`package_name` VARCHAR(255) NOT NULL COMMENT '应用包名(全局唯一维度,同包名多版本共存)',
|
||
`app_name` VARCHAR(128) DEFAULT NULL COMMENT '应用名称(上报时的展示名,可为空;新版本上报时刷新)',
|
||
`icon_url` VARCHAR(500) NOT NULL COMMENT '图标访问地址(相对路径,如 /static/app_icon/{md5}.png)',
|
||
`icon_md5` VARCHAR(64) DEFAULT NULL COMMENT '图标文件MD5(内容指纹,用于去重与换图标检测)',
|
||
`icon_sha1` VARCHAR(64) DEFAULT NULL COMMENT '图标文件SHA1',
|
||
`icon_sha256` VARCHAR(64) DEFAULT NULL COMMENT '图标文件SHA256',
|
||
`version` INT NOT NULL DEFAULT 1 COMMENT '版本号(同包名内自增,从1开始)',
|
||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1当前生效 0历史版本)',
|
||
`locked` TINYINT NOT NULL DEFAULT 0 COMMENT '是否锁定(0未锁定 1已锁定,锁定后不可上传覆盖)',
|
||
`source` VARCHAR(20) NOT NULL DEFAULT 'device' COMMENT '图标来源(device设备端上报 admin管理端上传)',
|
||
`create_by` BIGINT DEFAULT NULL COMMENT '创建人ID',
|
||
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
|
||
`update_by` BIGINT DEFAULT NULL COMMENT '更新人ID',
|
||
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
|
||
`is_deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除(0未删 1已删)',
|
||
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_package_version` (`package_name`, `version`),
|
||
KEY `idx_package_status` (`package_name`, `status`),
|
||
KEY `idx_md5` (`icon_md5`),
|
||
KEY `idx_is_deleted` (`is_deleted`)
|
||
) ENGINE = InnoDB
|
||
DEFAULT CHARSET = utf8mb4
|
||
COMMENT = '应用图标库(含历史版本)';
|