-- ========================================================================= -- 存量升级:D21 开放平台接入管理(v1 库) -- -- 背景:D20 把外部应用(PMS/访客系统)的配置放在 application.yml 的 -- iot.openapi.apps[],改配置要重启,且无法在平台里查看用量。本脚本把 -- 应用配置落到 lock_open_app,由「开放管理 › 应用接入」维护。 -- -- 行为变化: -- 1) 鉴权、回调和接口响应中的应用信息一律读表(带 30 秒缓存,改完即时生效); -- 2) 服务首次启动时若表为空,会把 yml 的 apps[](或单 Key 模式的 api-key) -- 原样导入本表,外部系统不用改 Key;导入后以表为准,yml 中 apps 可删除; -- 3) 表不可用时(本脚本未执行)服务仍按 yml 运行,只打告警,不影响存量调用。 -- -- 幂等性:建表用 if not exists;菜单先按 perms 删除再插入; -- 本脚本可重复执行。 -- -- 执行前置:备份 sys_menu;lock_open_app 为新表,无存量数据。 -- ========================================================================= set names utf8mb4; -- ========================================================================= -- 1、外部应用接入配置表 -- app_code 是数据隔离键,写入 lock_stay.biz_system 与 lock_person_ref.app_code, -- 创建后不可修改(改编码会让历史入住单失去归属)。 -- api_key / callback_secret 明文存储(与 D10 口径一致),页面只展示掩码, -- 完整值仅在新增与重置时返回一次。 -- 不设 del_flag:app_code/api_key 唯一键需要覆盖全部行;删除仅允许在 -- 该应用没有任何入住单时执行(有数据只能停用)。 -- ========================================================================= create table if not exists lock_open_app ( app_id bigint(20) not null auto_increment comment '应用ID', app_code varchar(32) not null comment '应用编码(数据隔离键,创建后不可改)', app_name varchar(64) not null comment '应用名称', api_key varchar(128) not null comment '接口密钥(X-API-Key,明文存储)', callback_url varchar(255) default null comment '结果回调地址(为空表示不开通回调)', callback_secret varchar(128) default null comment '回调签名密钥(为空表示不签名)', status char(1) default '0' comment '状态(0正常 1停用)', create_by varchar(64) default '' comment '创建者', create_time datetime comment '创建时间', update_by varchar(64) default '' comment '更新者', update_time datetime comment '更新时间', remark varchar(500) default null comment '备注', primary key (app_id), unique key uk_lock_open_app_code (app_code), unique key uk_lock_open_app_key (api_key) ) engine=innodb comment = '外部应用接入配置'; -- ========================================================================= -- 2、菜单:开放管理(顶级目录)→ 应用接入 -- 2200 目录,2210 页面,2211–2216 按钮权限。 -- ========================================================================= delete from sys_menu where perms like 'lock:openapp:%'; delete from sys_menu where menu_id = 2200; insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values (2200, '开放管理', 0, 5, 'openapi', null, '', '', 1, 0, 'M', '0', '0', '', 'link', 'admin', CURRENT_TIMESTAMP, '外部应用接入管理目录'); insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values (2210, '应用接入', 2200, 1, 'openapp', 'iot/openapp/index', '', '', 1, 0, 'C', '0', '0', 'lock:openapp:list', 'international', 'admin', CURRENT_TIMESTAMP, '外部应用配置与入住统计'); insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values (2211, '应用查询', 2210, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:query', '#', 'admin', CURRENT_TIMESTAMP, ''), (2212, '应用新增', 2210, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:add', '#', 'admin', CURRENT_TIMESTAMP, ''), (2213, '应用修改', 2210, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:edit', '#', 'admin', CURRENT_TIMESTAMP, ''), (2214, '应用删除', 2210, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:remove', '#', 'admin', CURRENT_TIMESTAMP, '有入住数据的应用不可删除'), (2215, '重置密钥', 2210, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:resetkey','#', 'admin', CURRENT_TIMESTAMP, '生成新的 X-API-Key'), (2216, '启停应用', 2210, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:status', '#', 'admin', CURRENT_TIMESTAMP, ''); -- ========================================================================= -- 3、存量配置迁移 -- yml 中还配着 iot.openapi.apps[](或单 Key 模式 api-key)时,服务首次启动 -- 若发现本表为空,会自动把这些应用原样写入本表(保留原 Key 与密钥), -- 外部系统无需改 Key。导入完成后可在 yml 中删除 apps 段。 -- -- 若希望手工建档而不依赖自动导入,可参考下面的语句(示例,按实际值改): -- insert into lock_open_app (app_code, app_name, api_key, callback_url, callback_secret, status, create_by, create_time, remark) -- values ('PMS', '公寓 PMS', '<原Key>', 'https://pms.example.com/hook/lock', '<原密钥>', '0', 'admin', now(), '由 yml 迁入'); -- ========================================================================= -- ========================================================================= -- 4、执行后核对(只读) -- ========================================================================= -- 4.1 表结构 -- show create table lock_open_app; -- -- 4.2 应用清单与状态 -- select app_id, app_code, app_name, status, -- case when callback_url is null or callback_url = '' then '未开通回调' else '已开通回调' end as callback, -- create_time -- from lock_open_app order by app_id; -- -- 4.3 各应用入住统计(与页面口径一致:按 lock_stay.biz_system) -- select a.app_code, a.app_name, -- count(s.stay_id) as stay_total, -- sum(case when s.stay_status = '1' then 1 else 0 end) as stay_active, -- sum(case when date(s.checkin_time) = curdate() then 1 else 0 end) as stay_today, -- max(s.checkin_time) as last_checkin_time -- from lock_open_app a -- left join lock_stay s on s.biz_system = a.app_code -- group by a.app_id, a.app_code, a.app_name -- order by a.app_id; -- -- 4.4 菜单是否到位 -- select menu_id, menu_name, parent_id, menu_type, perms from sys_menu -- where menu_id between 2200 and 2216 order by menu_id; -- ========================================================================= -- 5、回滚(确认已切回 yml 配置后再执行) -- ========================================================================= -- 5.1 菜单 -- delete from sys_menu where perms like 'lock:openapp:%'; -- delete from sys_menu where menu_id = 2200; -- -- 5.2 表:确认 lock_stay.biz_system 的取值已同步回 yml 的 apps[].app-code 后再删 -- select distinct biz_system from lock_stay where biz_system is not null; -- drop table if exists lock_open_app;