81 lines
5.2 KiB
SQL
81 lines
5.2 KiB
SQL
-- =============================================
|
||
-- 用户系统设置(用户维度)+ 设备侧全局开关入库
|
||
-- 维度判据:读的时候拿不拿得到 userId
|
||
-- · 拿得到(HTTP 请求,有 SecurityContext)→ sys_user_setting,per-user
|
||
-- · 拿不到(设备上电 @Async 线程)→ sys_config,全局
|
||
-- 配套代码:SysUserSetting* / PowerOnTriggerTaskExecutor:93
|
||
-- 版本: 1.0 2026-10-05
|
||
-- =============================================
|
||
|
||
-- ------------------------------------------------------------
|
||
-- 一、用户维度设置表
|
||
-- 一行一用户;所有设置列 NOT NULL + DEFAULT,不设「未配置过」这种 NULL 态
|
||
-- 业务默认值由 Java 常量兜底(UserSettingConstants),不依赖 DB 兜底
|
||
--
|
||
-- pinned_tags:任务栏「固定标签到任务栏」的 JSON 数组,按固定顺序存 route path。
|
||
-- * 原实现存浏览器 localStorage(key: pinned-tags),换浏览器/换电脑就丢,
|
||
-- 现改为落库,同一账号在任何设备登录都能恢复固定区。
|
||
-- * 只存用户右键固定的 pinned 集合;路由自身声明的 affix(首页,router/index.js:80)
|
||
-- 由 constantRoutes 天然重建,不入此列。
|
||
-- * DEFAULT ('[]') 是 MySQL 8.0.13+ 的表达式默认值。TEXT 列不能带字面量 DEFAULT,
|
||
-- 不给默认值时 STRICT_TRANS_TABLES 下会直接报错,故必须显式写空数组。
|
||
-- 低版本数据库请改为 VARCHAR(2000) NOT NULL DEFAULT '[]'。
|
||
--
|
||
-- 已建过表的库用下面的 ALTER 补列(可重复执行前请先确认列不存在):
|
||
-- ALTER TABLE `sys_user_setting`
|
||
-- ADD COLUMN `pinned_tags` text NOT NULL DEFAULT ('[]')
|
||
-- COMMENT '任务栏固定标签JSON数组,按序存 path;空数组表示未固定'
|
||
-- AFTER `login_redirect`;
|
||
-- ------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `sys_user_setting` (
|
||
`setting_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '设置主键',
|
||
`user_id` bigint(20) NOT NULL COMMENT '用户ID(sys_user.user_id)',
|
||
`login_redirect` varchar(128) NOT NULL DEFAULT '/bigscreen' COMMENT '登录后跳转路由path',
|
||
`pinned_tags` text NOT NULL DEFAULT ('[]') COMMENT '任务栏固定标签JSON数组,按序存 path;空数组表示未固定',
|
||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
|
||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
|
||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||
PRIMARY KEY (`setting_id`) USING BTREE,
|
||
UNIQUE KEY `uk_sys_user_setting_user` (`user_id`) USING BTREE COMMENT '每用户仅一行'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
|
||
ROW_FORMAT=DYNAMIC COMMENT='用户系统设置表';
|
||
|
||
-- ------------------------------------------------------------
|
||
-- 二、设备侧全局开关 → 复用已有 sys_config 表
|
||
-- 原实现:PowerOnTriggerTaskExecutor 直读运维手动写入的裸 Redis key
|
||
-- "get_imei_iccid"(经 BackendController /set 写入)
|
||
-- 新实现:改读 sys_config,运维改用已有的 PUT /system/config
|
||
-- config_type='Y' = 系统内置,deleteConfigByIds 会拒删
|
||
-- ------------------------------------------------------------
|
||
INSERT INTO `sys_config`
|
||
(`config_name`, `config_key`, `config_value`, `config_type`, `create_by`, `create_time`, `remark`)
|
||
SELECT '是否下发读取设备IMEI/ICCID指令', 'iot.power_on.read_imei_iccid', 'true', 'Y', 'system', NOW(),
|
||
'设备上电后是否下发 AT+IMEI/AT+ICCID/AT+LBS 指令读取;读该值的线程无登录上下文,故为全局配置'
|
||
WHERE NOT EXISTS (
|
||
SELECT 1 FROM `sys_config` WHERE `config_key` = 'iot.power_on.read_imei_iccid'
|
||
);
|
||
|
||
-- ------------------------------------------------------------
|
||
-- 三、菜单:系统管理 → 个人设置
|
||
-- 不设 system:setting:list 权限点的原因:
|
||
-- 接口读写的是「当前登录用户自己的」设置,无需菜单级授权;
|
||
-- 若填了权限点,非管理员账号将看不到也用不了自己的设置页。
|
||
-- menu_type='C' 菜单,component 指向新建的 views/system/setting/index.vue
|
||
-- ------------------------------------------------------------
|
||
INSERT INTO `sys_menu`
|
||
(`menu_name`, `parent_id`, `order_num`, `path`, `component`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`)
|
||
SELECT '系统设置', 1, 13, 'setting', 'system/setting/index', 1, 0, 'C', '0', '0', '', 'setting', 'system', NOW()
|
||
WHERE NOT EXISTS (
|
||
SELECT 1 FROM `sys_menu` WHERE `parent_id` = 1 AND `path` = 'setting'
|
||
);
|
||
|
||
-- ------------------------------------------------------------
|
||
-- 四、清理历史遗留的裸 Redis key
|
||
-- 原开关 key 无前缀、不在任何 key 生成器中,与 RedisKeyBuilder 规范不符。
|
||
-- 确认线上设备已完成一轮上电、开关已由 sys_config 接管后再执行:
|
||
-- redis-cli DEL get_imei_iccid
|
||
-- 切勿在切换完成前执行,否则 IMEI/ICCID 指令会立即停止下发。
|
||
-- ------------------------------------------------------------
|