|
|
db31462774
|
refactor(video): JT1078 模块未迁移时的软依赖降级收敛
- JT1078 相关两个 stub 接口 Ijt1078Service / Ijt1078PlayService
目前没有 @Service 实现(等待从 WVP 后续迁移),直接 @Autowired
会导致 video server 启动失败。
- GbChannelPlayServiceImpl:原本只声明了 jt1078PlayService 字段,
从未在任何方法体里引用,属于死代码,直接删掉 import + field。
- MediaServiceImpl:保留引用(checkStreamFromJt 有真实调用),
改成 @Autowired(required=false) 做软依赖;在 "1078" app 分支
入口加 null guard,接口缺失时直接返回 false 拒绝请求;
补注释说明两处处理不对称的原因,并留 TODO 指向 JT1078
迁移完成后的收尾动作(去掉 required=false / 引入
JtModuleProperties.enabled 开关统一管理)。
|
2026-04-23 15:16:50 +08:00 |
|
|
|
10ea5e5eee
|
chore(video): ZLM 凭证挪出默认配置 + 连接池 keep-alive + 日志/队列开关
- application.yaml 里的 media.id/ip/http-port/secret/auto-config 改用
${ZLM_*:占位} 形式,secret 默认值 please-override-in-env,防止
真实凭证写进默认 profile 被全环境继承;开发机实际值搬到
application-local.yaml,继续支持 env var 覆盖。已泄露到 git 历史
的 secret 需运维侧单独旋转。
- application-local.yaml druid 池:min-evictable-idle 从 10min 降到
5min + 打开 keep-alive,配合 eviction 扫描主动 ping,解决远程
MySQL 经 NAT/云防火墙 60~80s 静默断开导致
Communications link failure / last packet received X ms ago。
- application.yaml 补两个 video 模块运维开关:
· viewsh.access-log.exclude-paths 屏蔽 /index/hook/on_server_keepalive
心跳刷屏,出错仍会 WARN;
· video.sip-queue.enabled 管控上一笔 commit 引入的三个
SIP 消息 QueueScheduler,默认开启,关闭后队列会在内存堆积
需要运维兜底(注释已提醒慎用)。
|
2026-04-23 15:14:00 +08:00 |
|
|
|
42d53bb02d
|
fix(video): 收紧 Redis Jackson default typing 白名单,修补反序列化攻击面
- 本模块通过 ZLM hook / GB28181 信令把大量外部输入写入 Redis,
必须保证 default typing 的白名单足够紧。
- 新增 buildRedisObjectMapper:
· 注册 JavaTimeModule 支持 LocalDateTime / LocalDate 等 Java 8
时间类型,避免含 createTime 的对象序列化报错;
· PropertyAccessor 从 ALL/ANY 收窄到 FIELD/ANY,配合 Lombok getter
够用,同时降低经 setter 触发 gadget chain 的面;
· BasicPolymorphicTypeValidator 的 allowIfSubType 原先是 Object.class
(等价 LaissezFaireSubTypeValidator,Jackson 官方警告有 CVE 级
反序列化风险,如 jackson-databind #2367 / #2996),改成按包名
白名单:com.viewsh.* / com.alibaba.fastjson2.JSONObject|JSONArray
/ java.util|time|lang|math / 数组,严格收敛到业务真实存取范围。
- 两个 RedisTemplate Bean 都改用自构建的 ObjectMapper。
- 后续若遇到"新 DTO 反序列化不了",优先放进 com.viewsh 包下,
不要回退到 allowIfSubType(Object.class)。
|
2026-04-23 15:09:04 +08:00 |
|
|
|
a58ab1928e
|
refactor(video): SIP 高频消息队列消费拆独立 Scheduler + 修 Catalog 事务自调用
背景:
- 原先 Alarm / Keepalive / Catalog 三个业务 Handler 自带 @Scheduled,
@Scheduled 会让 Spring 对业务类生成 CGLIB 代理,
与 @EventListener / @Async 等场景叠加时容易出现"找不到方法"/
重复包装等怪异行为。
- CatalogResponseMessageHandler.executeTaskQueue 上标 @Transactional
会导致空队列 50ms 触发一次空事务,浪费连接池;与此同时
this.saveData(...) 是自调用,saveData 上的 @Transactional
又根本不生效,事务语义双重翻车。
本次改动:
- 新增 CatalogResponseMessageQueueScheduler 无接口 @Component,
@Scheduled(fixedDelay=50) 驱动业务 Handler 的 executeTaskQueue。
- Alarm / Keepalive 两个 QueueScheduler 补 @ConditionalOnProperty
(video.sip-queue.enabled, matchIfMissing=true),三个调度器统一
开关;注释对齐,标明关闭后消息会在内存堆积、需运维兜底。
- CatalogResponseMessageHandler:
· 去掉 executeTaskQueue 上的 @Scheduled + @Transactional,
入口处 taskQueue.isEmpty() 直接 return,不再开空事务;
· @Autowired @Lazy 注入自身代理 self,把 this.saveData(...)
改成 self.saveData(...),让 saveData 上的 @Transactional
真正生效(MyBatis 落库 + 区域/分组批写回到同一事务)。
|
2026-04-23 15:07:44 +08:00 |
|
|
|
38681c39c1
|
refactor(video): ISIPProcessorObserver 接口补齐注册方法,processor 改依赖接口
- 原先 addRequestProcessor / addResponseProcessor 只在实现类
SIPProcessorObserver 上,13 个处理器在 afterPropertiesSet 里
@Autowired 实现类才能自注册,耦合到具体实现。
- 把两个 register 方法提到 ISIPProcessorObserver 接口上,
13 个 processor 的注入类型改为 ISIPProcessorObserver,
处理器侧不再感知具体实现,方便后续测试 mock / 多实现。
- 本次只改注入类型与接口签名,消息分发行为不变。
|
2026-04-23 15:05:00 +08:00 |
|
|
|
6b50254a96
|
feat(video): 适配多租户上下文透传 + 定时任务 TTL 装饰 + 生命周期收口
问题背景:
- WVP 原生代码的 SIP / @Scheduled / Hook EventListener 都跑在没有
TenantContextHolder / ProjectContextHolder 的线程上,接入多租户
框架后会漏 tenant_id / project_id 过滤或抛 NPE。
- 框架默认 @EnableAsync 走 JDK 动态代理,但 WVP 代码大量"按具体类
注入 / 按具体类查方法",JDK 代理下会 cast/查方法失败。
本次改动:
- VideoServerApplication 排除框架 ViewshAsyncAutoConfiguration,
由 ThreadPoolTaskConfig 本地 @EnableAsync(proxyTargetClass=true)
+ TtlRunnable 装饰器接管(从框架抄一份 BeanPostProcessor)。
- DynamicTask 的 scheduleAtFixedRate / schedule 入口都用 TtlRunnable
包一层,把调用线程的 TTL 快照透传到调度线程;新增 @PreDestroy
在容器关停时取消 future、shutdown scheduler、记录耗时,
避免关停阶段调度线程继续借 DataSource 触发噪音日志。
- 新增 VideoContextUtils.executeIgnoreTenantAndProject,
统一封装 TenantUtils.executeIgnore(ProjectUtils.executeIgnore(…))
的嵌套模板,覆盖启动初始化 / 定时任务 / Hook 事件 / Redis 消息
四种场景共 8 个调用点。
- MobilePositionServiceImpl 拆出 @Transactional persistPositions,
通过 @Lazy self 代理调用,避免外层方法 this 自调用让事务失效;
外层只做 Redis 拉队列 + 空队列短路,不再开空事务。
- StreamProxyServiceImpl / StreamPushServiceImpl 的 @EventListener
在业务体内包裹 executeIgnoreTenantAndProject,保证 ZLM Hook
到来时仍能跨租户落库。
|
2026-04-23 15:03:26 +08:00 |
|
|
|
0526322fa8
|
refactor(video): Controller 下沉到 controller/admin 包对齐框架 /admin-api 前缀
- 原先散落在 gb28181/controller/、streamProxy/controller/、aiot/controller/、
vmanager/**/、streamPush/controller/ 下的 Controller 统一移到各自
controller/admin/ 子包,对齐框架 WebProperties 的自动前缀规则
(根 CLAUDE.md「Controller 路径规范」:admin 包自动拼 /admin-api)。
- SecurityConfiguration 的 permitAll 路径同步补 /admin-api 前缀,
覆盖 /video/device/query/snap/** 与 /video/sse/** / /video/emit,
避免路径匹配不上导致匿名请求被拦截。
- 本次仅变更 package 声明与安全路径,controller 内部逻辑保持不变。
|
2026-04-23 15:00:57 +08:00 |
|
|
|
b3d76ad00c
|
fix(video): 修复 CommonGBChannel 子类 @TableId 冲突与主键列映射
问题:
1. CommonGBChannel.gbId 的 @TableId 按驼峰转 snake_case 映射到 gb_id 列,
但实际所有相关表的主键列都是 id
2. StreamProxy/StreamPush 子类自己声明 @TableId(id),与父类 gbId 的
@TableId 同时扫描到 MyBatis-Plus 会报 "@TableId can't more than one"
3. DeviceChannel/PlatformChannel 没自己的 @TableId,运行时会用父类 gbId
作为主键查 gb_id 列 → Unknown column 运行时错误
修复:
- CommonGBChannel.gbId 的 @TableId 加 value="id" 显式映射到 id 列
保证 CommonGBChannelMapper 操作 video_common_gb_channel 时主键正确
- 4 个子类(StreamProxy/StreamPush/DeviceChannel/PlatformChannel)均
shadow 父类 gbId 字段:
@TableField(exist = false)
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Long gbId;
让 MyBatis-Plus 反射扫描时只看到子类 gbId(标记 exist=false 跳过),
父类 @TableId 不参与扫描;Lombok 禁用子类 getter/setter,所有业务
代码的 setGbId/getGbId 继续走父类访问器,字段存储在父类
- DeviceChannel 和 PlatformChannel 给自己的 id 字段加 @TableId(IdType.AUTO)
显式声明各子表主键
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 14:40:13 +08:00 |
|
|
|
d876d0387a
|
refactor(video): @Scheduled 转 xxl-job,对齐 ops 模块定时任务约定
WVP 原生单体采用 @Scheduled 做周期任务,位于 ServiceImpl 上的任务
Spring 用 JDK 代理无法匹配到接口方法,导致启动失败。按 ops 模块
约定(QueueSyncJob 模板),把 6 个 ServiceImpl 的周期任务转为
独立 @XxlJob Job 类;2 个 IMessageHandler 的高频轮询拆为独立
无接口 @Component。
新建 6 个 Job 类(framework/job/):
- InviteStreamCleanupJob (10s) 清理 Redis 错误 Invite 数据
- DeviceSubscribeLostCheckJob (10s) 设备订阅丢失检查
- DeviceStatusLostCheckJob (30s) 设备状态丢失检查
- PlatformStatusLostCheckJob (20s) 平台注册状态检查
- PlatformAutoRegisterJob (2s) 级联平台自动注册监听
- AiEdgeDeviceOfflineCheckJob (90s) AI 边缘设备离线标记
接口变更(让 Job 类通过 JDK 代理正常调用):
- IInviteStreamService 新增 cleanInvalidInviteCache()
- IDeviceService 新增 lostCheckForSubscribe() / lostCheckForStatus()
- IPlatformService 新增 statusLostCheck() / cascadePlatformAutoRegister()
- PlatformServiceImpl.execute() 重命名为 cascadePlatformAutoRegister()
ServiceImpl 调整:
- InviteStream/Device/Platform/AiEdgeDevice ServiceImpl 删除
@Scheduled 注解,方法体保留
- 清理 @Scheduled / TimeUnit 无用 import
新建 2 个高频 Scheduler @Component(保持 100-200ms 毫秒级轮询):
- AlarmNotifyMessageQueueScheduler (200ms)
- KeepaliveNotifyMessageQueueScheduler (100ms)
这两个消息处理器是 SIP 协议栈内部机制,不适合走 xxl-job 中心调度,
拆到独立无接口 Component 后 Spring 自动走 CGLIB,代理正常。
原 MessageHandler 删除 @Scheduled 注解,executeTaskQueue() 保留
为 public 供新 Scheduler 调用。
配置:本地 xxl.job.enabled=false 已配置(与 ops 对齐)
编译通过(mvn compile BUILD SUCCESS)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 14:29:51 +08:00 |
|
|
|
4f0c8f7162
|
fix(video): Mapper 移除多数据库方言分支(仅保留 MySQL)
WVP 原支持 MySQL / H2 / KingBase / PostgreSQL,使用 databaseId 属性
区分 SQL 方言,但本项目 MyBatis 未配置 databaseIdProvider,运行时
databaseId 为 null 导致 "Could not find a statement annotation that
correspond a current database" 启动失败。
改动:
- CommonGBChannelMapper.queryListInCircle / queryListInPolygon:
仅保留 queryListInCircleForMysql / queryListInPolygonForMysql
对应的 @SelectProvider,删除 h2/kingbase/postgresql 变体
- GroupMapper.updateParentId / updateParentIdWithBusinessGroup /
fixParentId:仅保留 MySQL JOIN 语法,删除 3 种方言 UPDATE
- RegionMapper.updateParentId:同上
项目固定使用 MySQL,这些方言变体在本仓库永远不会命中,删除后启动
不再需要依赖 databaseIdProvider 配置。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 14:00:29 +08:00 |
|
|
|
3a3f7b78d4
|
refactor(video): 预置 AI 算法改为 SQL 种子数据,移除 @PostConstruct 初始化
原 AiAlgorithmServiceImpl.initPresetAlgorithms() 在 @PostConstruct
里插入 4 条预置算法,带来两个问题:
1. 启动时无登录上下文,MP 自动填充 creator 失效 → 启动失败
2. 算法清单硬编码在 Java 代码,迭代要重编译发布
改为 video.sql 种子数据管理:
- video.sql 的预置算法 INSERT 扩展为 4 条(leave_post / intrusion /
illegal_parking / vehicle_congestion),参数 schema 与边缘端对齐
- 使用 ON DUPLICATE KEY UPDATE 保证幂等:新库初始化 + 存量库升级
都走同一条语句,param_schema / description 会被自动校正
- 保留用户侧可修改的字段(is_active / global_params)不被覆盖
代码层:
- 删除 initPresetAlgorithms() 方法与 PRESET_ALGORITHMS 静态 Map
- 删除 SYSTEM_USER 常量
- 删除 @PostConstruct / HashMap 相关 import
- 保留 syncFromEdge() 作为边缘端主动同步的运行时入口
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 13:54:39 +08:00 |
|
|
|
1ac72b23c5
|
fix(video): AI 算法预置数据 @PostConstruct 插入时显式设置 creator/updater
启动时 initPresetAlgorithms() 在 @PostConstruct 执行,此时无登录上下文:
- DefaultDBFieldHandler.insertFill 在 getLoginUserId()==null 时不填充
creator/updater
- SQL video_ai_algorithm.creator NOT NULL 约束触发
"Column 'creator' cannot be null" 启动失败
手动设置 creator/updater = "1"(系统用户)作为系统级初始化的占位,
同时 update 分支也显式设置 updater 避免同类问题。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 13:48:52 +08:00 |
|
|
|
42cb3d9d57
|
chore(video): 数据源改用统一 aiot-platform 库,与 ops/iot 对齐
原 video 模块 application-local.yaml 默认 MYSQL_DATABASE 是 aiot-video
(设计初衷是 WVP 独立库)。运维按单库部署,26 张 video_* 业务表
已执行到 aiot-platform 库,因此默认值改为 aiot-platform,
避免启动时 "Unknown database 'aiot-video'" 报错。
同步 master / slave 两个数据源默认值。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 11:33:49 +08:00 |
|
|
|
8ae7b1a823
|
docs(video): 遗留项防御性加固 — GB2022 扩展字段 exist=false + Mapper 继承警告
基于遗留项调研结论(三项均无当前运行时风险,真正价值是防御未来
误用 BaseMapperX 高层方法),执行最小化防御性修复:
PlatformChannel 的 20 个 GB2022 扩展字段加 @TableField(exist=false):
- customSecurityLevelCode / customPhotoelectricImagingTyp /
customCapturePositionType / customStreamNumberList /
customSsvcRatioSupportList / customMobileDeviceType /
customHorizontalFieldAngle / customVerticalFieldAngle /
customMaxViewDistance / customGrassrootsCode / customPoType /
customPoCommonName / customMac / customFunctionType /
customEncodeType / customInstallTime / customManagementUnit /
customContactInfo / customRecordSaveDays / customIndustrialClassification
这些是 WVP 预占位字段,SQL 尚未建列,加 exist=false 消除
BaseMapperX 反射写入时 "Unknown column" 的潜在风险,
待业务方决定是否推进 GB2022 自定义属性持久化再补 SQL 列。
StreamProxyMapper / StreamPushMapper 加接口级 Javadoc 警告:
- StreamProxy/StreamPush 继承 CommonGBChannel 带入 40+ 个 gb_* 字段,
但 video_stream_proxy / video_stream_push 表不含这些列
(gb 通道信息由 GbChannelService 写入 video_common_gb_channel)
- 警告开发者严禁使用 BaseMapperX 的 insert/updateById/selectByMap
自动映射方法,写入必须走显式 SQL 方法(add/update/addAll)
- 读取 selectById/selectList 可用(SELECT 时 gb_* 字段返回 null 不报错)
未改动(零当前风险 + 改动成本高):
- SIP 协议时间字段(register_time 等 varchar):Mapper 全显式 SQL
用 #{} 绑定 String,与 varchar 列自洽;DateUtil.getNow() 返回
"yyyy-MM-dd HH:mm:ss" 格式字符串,时间比较查询的字符串排序
与 datetime 排序结果一致;改造涉及 72+ 处调用链
- StreamProxy/StreamPush 继承架构:改组合式重构代价大,
通过 Javadoc 警告防御未来误用即可
编译通过(mvn compile BUILD SUCCESS)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-21 13:43:23 +08:00 |
|
|
|
0ca1adf2a4
|
refactor(video): P2 应用层时间字段 varchar → datetime / String → LocalDateTime
SQL 类型优化(应用层生成的业务时间改为标准 datetime):
- video_ai_edge_device: last_heartbeat / updated_at
- video_ai_config_log: updated_at
- video_ai_config_snapshot: created_at
- video_ai_algorithm: sync_time
- video_ai_alert: received_at
- video_media_server: last_keepalive_time
DO 字段 String → LocalDateTime 对齐:AiEdgeDevice / AiConfigLog /
AiConfigSnapshot / AiAlgorithm / AiAlert / MediaServer
调用点适配:
- Service 层 new Date() 字符串格式化赋值统一改为 LocalDateTime.now()
- AiAlertController.edgeReport / MqttService.handleAlert 新增
parseEventTime / parseTimestamp 私有方法,外部字符串防御性解析
保留 varchar(本批次暂不动,SIP 协议原生字符串,改动涉及 72+ 处
Mapper 与 SIP 处理器,单独迭代):
- video_device.register_time / keepalive_time
- video_device_channel.end_time / gps_time
- video_device_mobile_position.time
- video_stream_push.push_time
编译通过(mvn compile BUILD SUCCESS)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-21 12:32:23 +08:00 |
|
|
|
64dcdd8d4c
|
refactor(video): P1 类型规范化 — varchar 数值转 int / Integer 布尔转 Boolean
SQL 类型修正(数值语义列不再用 varchar):
- video_platform: device_port / expires / keep_timeout varchar(50) → int
- video_platform_channel: custom_cert_num / custom_end_time varchar(50) → int
DO 布尔语义字段 Integer → Boolean(SQL 早已是 tinyint(1),DO 对齐语义):
- AiAlgorithm.isActive
- AiRoi.enabled
- AiRoiAlgoBind.enabled
同步修复 ~20 处调用点的布尔判断,setEnabled(1) → setEnabled(true),
getEnabled() == 1 → Boolean.TRUE.equals(getEnabled())
MediaServer.hookAliveInterval Float → Integer(SQL 是 int,Float 精度丢失)
同步修复 MediaConfig、ABL/ZLM 两个 StatusManager 的 10F → 10 字面量
编译通过(mvn compile BUILD SUCCESS)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-21 12:13:56 +08:00 |
|
|
|
1698c71d84
|
fix(video): P0 修复 @TableName 映射错误、字段命名、补缺列与 exist=false
@TableName 修正:
- CommonGBChannel: "video_device_channel" → "video_common_gb_channel"
- DeviceChannel: 显式加 @TableName("video_device_channel")
- PlatformChannel: 补充 @TableName("video_platform_channel")
避免因继承 CommonGBChannel 而写入错误表
字段命名规范化(修复驼峰转 snake_case 错位):
- CommonGBChannel.recordPLan → recordPlanId(对应 record_plan_id)
- MediaServer.httpSSlPort / flvSSLPort / wsFlvSSLPort
→ httpSslPort / flvSslPort / wsFlvSslPort
(原命名 L 大写/双大写导致转 snake 变 http_s_sl_port)
- 同步更新 Mapper SQL 中的 #{xxx} 引用和 ZLM/ABL 节点服务调用点
@TableField(exist=false) 标注(JOIN 显示字段/业务计算值/内存对象):
- DeviceChannel: parentDeviceId、parentName、ptzTypeText
- DeviceAlarm: deviceName、alarmPriorityDescription、alarmMethodDescription、
alarmTypeDescription
- AiAlert: cameraName、roiName
- Device: sipTransactionInfo
- MobilePosition: channelDeviceId
- StreamPush: uniqueKey
补齐 SQL 缺失列(需持久化的业务状态字段):
- video_device: channel_count
- video_platform: channel_count / catalog_subscribe / alarm_subscribe
/ mobile_position_subscribe
- video_media_server: status / last_keepalive_time
- video_cloud_record: reserve
- video_device_mobile_position.channel_id: varchar(50) → bigint
(DO 字段是 Long,作为外键引用 video_device_channel.id)
补齐 DO 缺失字段:
- AiAlgorithm: 新增 globalParams(对应 SQL global_params)
- StreamPush: 新增 status(对应 SQL status)
编译通过(mvn compile BUILD SUCCESS)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-21 12:07:47 +08:00 |
|
|
|
43becf998c
|
refactor(video): projectId 两级隔离适配 + SQL 融合到 video.sql
SQL 融合:
- sql/mysql/video.sql 作为最终主脚本(26 张表),整合用户改造版表前缀 video_
与 cherry-pick 版的框架字段(tenant_id/creator/updater/deleted/datetime)
- 新增 video_ai_camera_snapshot(AI 抓拍)、video_common_gb_channel(国标通道抽象)
- 删除旧的 aiot-video.sql(被 video.sql 替代)
- 17 张业务表 + 6 张 AI 业务表加 project_id 列(项目级隔离)
- 2 张字典表(video_ai_algorithm/video_ai_algo_template)仅租户级
- video_media_server 全局共享,无多租户字段
代码改造:
- 21 个 DO 的 @TableName 从 wvp_* 改为 video_*
- 16 个业务 DO 改继承 ProjectBaseDO(StreamProxy/StreamPush 通过
CommonGBChannel 自动获得),字典 DO 保留 TenantBaseDO,
MediaServer 保留 BaseDO
- 28 个 Mapper/Provider 的 SQL 表名全部更新为 video_*
- application.yaml 新增 tenant.ignore-project-tables 配置,
列出 video_media_server/video_ai_algorithm/video_ai_algo_template
不参与项目隔离
- 编译通过(mvn compile BUILD SUCCESS)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-21 11:10:27 +08:00 |
|
|
|
fe5bbbe8c6
|
refactor(video): 清理 Security/User stub,替换为框架 SecurityFrameworkUtils
- 删除 SecurityUtils/LoginUser/JwtUtils 3 个空壳 stub
- 删除 UserMapper/RoleMapper/UserApiKeyMapper 3 个废弃 Mapper 及 DTO
- 删除 IUserService/IRoleService/IUserApiKeyService 及实现类
- MediaController 改用 SecurityFrameworkUtils.getLoginUserId()
- 21 个 Controller 的 JwtUtils.HEADER 替换为 "Authorization" 字面量
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-21 10:15:20 +08:00 |
|
|
|
3c752aeb89
|
refactor(video): PageHelper → PageResult 分页迁移,删除 shim 兼容类
- 54 个文件从 PageHelper.startPage() + PageInfo 迁移到 MyBatis Plus Page + PageResult
- 复杂 @Select 查询加 IPage 参数实现自动分页
- 删除 PageHelper/PageInfo/StringUtil 3 个 shim 文件
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-21 10:15:20 +08:00 |
|
|
|
f48c1846fb
|
refactor(video): Media/Stream 域 ORM 改造 + 全域硬删除转逻辑删除
- MediaServer 继承 BaseDO(共享表无 tenant_id)
- StreamProxy/StreamPush/CloudRecord/RecordPlan DO 改造
- 5 个 Mapper 继承 BaseMapperX
- 32 处 @Delete 硬删除转为逻辑删除(default 方法或 @Update SET deleted=1)
- Service/Controller/RPC 适配 int→Long 类型变化
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-21 10:15:19 +08:00 |
|
|
|
0b0c264dca
|
refactor(video): GB28181 域 ORM 改造 — DO 继承 TenantBaseDO + Mapper 继承 BaseMapperX
- Device/Platform/Channel/Group/Region/Alarm/MobilePosition 等 DO 改造
- 9 个 Mapper 继承 BaseMapperX,简单 CRUD 改为 default 方法
- 复杂多表 JOIN/动态 SQL 保留 @Select 注解
- Service/Controller 适配 int→Long 类型变化
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-21 10:15:17 +08:00 |
|
|
|
0c061ad74c
|
refactor(video): AI 域 ORM 改造 — DO 继承 TenantBaseDO + Mapper 继承 BaseMapperX
- 8 个 AI DO 加 @TableName、继承 TenantBaseDO、主键改 Long
- 9 个 AI Mapper 继承 BaseMapperX,简单 CRUD 改为 default 方法
- Service/Controller 适配类型变化(Integer→Long、删除手动 setCreateTime)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-21 10:15:15 +08:00 |
|
|
|
a604471e6f
|
feat(video): Phase 5-9 编译修复、Controller 路径、数据库 SQL
Phase 5: 全局编译修复 — Security 引用清理、JT1078 引用移除
PageInfo shim 兼容类(后续迁移到 PageResult)
web/custom 和 web/gb28181 补充迁移
Phase 6: SecurityConfiguration 更新放行 Hook/SSE 路径
Phase 7: 32 个 Controller 路径 /api/ → /video/
Phase 8: aiot-video 数据库 SQL(25 张表,含多租户 tenant_id + 逻辑删除 deleted)
Phase 9: mvn compile BUILD SUCCESS
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-21 10:15:14 +08:00 |
|
|
|
d2c82d52c9
|
feat(video): Phase 0-4 WVP 代码搬迁、依赖、Redis 隔离、多租户配置
Phase 0: 前置检查完成(Java 21 语法无风险)
Phase 1: 574 个 Java 文件搬迁,包名替换 com.genersoft.iot.vmp → com.viewsh.module.video
Phase 2: pom.xml 添加 JAIN SIP/dom4j/okhttp/bouncycastle/fastjson2 等依赖
application.yaml 添加 SIP/Media/UserSettings 配置段
Phase 3: RedisTemplate Bean 隔离(videoRedisTemplate),30+ 文件加 @Qualifier
Phase 4: 多租户配置(ignore-tables: wvp_media_server)
待 Phase 5: ORM 改造 + 编译修复
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-21 10:15:07 +08:00 |
|
|
|
948d2c6a41
|
feat(video): 新建 viewsh-module-video 服务模块骨架
新增视频管理模块,用于后续迁移 WVP-Platform(GB28181 视频监控平台)。
- viewsh-module-video-api: 契约层(Feign RPC 接口、枚举、错误码)
- viewsh-module-video-server: 业务层(端口 48093)
- 网关路由: video-admin-api / video-app-api
- SecurityConfiguration: 放行 Swagger/Actuator/Druid/RPC
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-21 10:15:02 +08:00 |
|