-- ============================================================================= -- 应用图标库表(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(内容指纹,用于去重与换图标检测)', `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 = '应用图标库(含历史版本)';