设备列表 视频流服务器

This commit is contained in:
yuhaiming
2026-09-17 17:09:49 +08:00
parent 1cfb071dfb
commit 7bdc5c846d
40 changed files with 1283 additions and 78 deletions

View File

@@ -1,6 +1,8 @@
package org.dromara.system.api;
import org.dromara.common.core.domain.PageResult;
import org.dromara.system.api.domain.AppUserDTO;
import org.dromara.system.api.domain.AppUserQueryDTO;
/**
* APP 用户(C 端)领域服务对外暴露的 API。
@@ -134,4 +136,48 @@ public interface AppUserApiService {
*/
boolean isPhoneBound(Long userId);
// ---------------- 后台管理端(APP 用户管理) ----------------
/**
* 分页查询 APP 用户列表(后台「APP 用户管理」用)。
* <p>
* <b>强制口径</b>:实现侧固定附加 {@code user_type = app_user} 条件,
* 调用方<b>无法</b>通过 {@link AppUserQueryDTO} 覆盖该条件,
* 因此本方法<b>恒不返回</b>后台账号({@code sys_user})。
* <p>
* <b>数据权限</b>:APP 用户注册时不写 {@code dept_id}(该列恒为 {@code NULL}),
* 不参与后台部门树,故实现侧<b>刻意不加</b>框架 {@code @DataPermission} 过滤——
* 否则按部门维度过滤会把全部 APP 用户过滤为空。
*
* @param query 查询条件(关键词 / 状态 / 注册时间区间 / 分页)
* @return APP 用户分页结果(不含密码)
*/
PageResult<AppUserDTO> selectAppUserPage(AppUserQueryDTO query);
/**
* 按主键查询 APP 用户详情(后台「APP 用户管理」用)。
* <p>
* 同样强制 {@code user_type = app_user}:传入后台账号主键时返回 {@code null},
* 避免管理端越界读到系统账号信息。
*
* @param userId 用户主键
* @return APP 用户信息(不含密码);不存在或非 app_user 时返回 {@code null}
*/
AppUserDTO selectAppUserById(Long userId);
/**
* 修改 APP 用户账号状态(停用 / 启用)。
* <p>
* 与 {@link #disableUser(Long)} 的区别:本方法同时支持<b>恢复启用</b>,
* 供后台管理端做双向状态切换;{@code disableUser} 保持「注销前置」单向语义不变。
* <p>
* <b>安全约束</b>:实现侧限定 {@code user_type = app_user},
* 防止通过本方法改动后台账号状态。
*
* @param userId 用户主键
* @param status 目标状态({@code 0} 正常 / {@code 1} 停用)
* @return true 修改成功(含目标状态与当前一致的情形)
*/
boolean updateStatus(Long userId, String status);
}

View File

@@ -61,8 +61,15 @@ public class AppUserDTO implements Serializable {
private String status;
/**
* 创建时间
* 创建时间(注册时间)
*/
private LocalDateTime createTime;
/**
* 更新时间
* <p>
* 供后台「APP 用户管理」展示「最近变更时间」(改密 / 换绑 / 停用等均会刷新该值)。
*/
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,69 @@
package org.dromara.system.api.domain;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* APP 用户管理查询条件(后台管理端使用)。
* <p>
* <b>为什么单独建一个 DTO 而不是复用 {@code SysUserBo} + {@code PageQuery}</b>:
* {@code ruoyi-api} 模块仅依赖 {@code ruoyi-common-core}(见 {@code ruoyi-api/pom.xml}),
* 而 {@code PageQuery} 位于 {@code ruoyi-common-mybatis},<b>在本模块不可见</b>。
* 因此分页参数直接内联为 {@code pageNum} / {@code pageSize},由 {@code ruoyi-system} 侧
* 组装成框架 {@code Page},从而在不放松模块依赖边界的前提下完成跨模块分页契约。
* <p>
* <b>日期区间用 {@link #params} 而非平铺字段</b>:与框架既有约定保持一致——
* 前端 {@code utils/ruoyi.ts#addDateRange}(经 {@code useDateRangeQuery} hook 调用)
* 把区间写入 {@code params.beginTime} / {@code params.endTime},
* 后端 {@code betweenParams(column, params, "beginTime", "endTime")} 消费,
* 故此处必须保留同名的 {@code params} 载体,前端才能直接复用现成 hook。
* <p>
* <b>不含 {@code userType}</b>:本查询只为 APP 用户({@code user_type = app_user})服务,
* 该条件由实现侧强制附加、不可由调用方覆盖——避免调用方漏传而把后台账号一并查出。
*
* @author Kou
* @date 2026-09-17
*/
@Data
@NoArgsConstructor
public class AppUserQueryDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 关键词:模糊匹配 user_name / nick_name / phone_number / email(四字段 OR)。
*/
private String keyword;
/**
* 账号状态(0 正常 1 停用);留空不参与过滤。
*/
private String status;
/**
* 扩展查询参数。
* <p>
* 约定键:{@code beginTime} / {@code endTime}——注册时间区间(闭区间)。
* 两者<b>均非空</b>时才生效(与框架 {@code betweenParams} 口径一致)。
* 注意:框架<b>不做</b>「日期补 23:59:59」的隐式处理,前端选「日期」而非「日期时间」时
* 需自行补全时分秒,否则会漏掉结束日当天数据。
*/
private Map<String, Object> params = new HashMap<>();
/**
* 页码(从 1 开始);为空时按 1 处理。
*/
private Integer pageNum;
/**
* 每页条数;为空时按 10 处理。
*/
private Integer pageSize;
}