5b6529bd37a7191b674a64c760dcb5f21ab534f1..452cf744b08f2148729427fec50b07a4cf0cad31
2026-03-23 sgj
在线用户菜单页排序修复
452cf7 对比 | 目录
2026-03-23 sgj
在线用户菜单页问题修复
9831a0 对比 | 目录
2026-03-23 sgj
视频监管页,添加库区监管人及联系方式显示
fff686 对比 | 目录
已修改4个文件
136 ■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Dept.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/monitor/SysUserOnlineController.java 99 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/group/video.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Dept.java
@@ -4,7 +4,11 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.*;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
/**
@@ -73,6 +77,15 @@
    @TableField("wd")
    private Double wd;
    @Column(name = "contact", columnDefinition = "varchar(40) COMMENT '监管联系人'")
    @TableField("contact")
    private String contact;
    @Column(name = "contact_tel", columnDefinition = "varchar(11) COMMENT '监管联系电话'")
    @TableField("contact_tel")
    private String contactTel;
    /**
     * --------鸟瞰图信息--------
     **/
fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml
@@ -97,6 +97,14 @@
        <Property name="dataType">Double</Property>
        <Property name="label">纬度</Property>
      </PropertyDef>
      <PropertyDef name="contact">
        <Property></Property>
        <Property name="label">监管联系人</Property>
      </PropertyDef>
      <PropertyDef name="contactTel">
        <Property></Property>
        <Property name="label">监管联系电话</Property>
      </PropertyDef>
      <PropertyDef name="remark">
        <Property></Property>
        <Property name="label">备注说明</Property>
@@ -418,6 +426,16 @@
            </Property>
            <Property name="text">帮助:点击坐标位置拾取</Property>
          </Link>
          <AutoFormElement>
            <Property name="name">contact</Property>
            <Property name="property">contact</Property>
            <Editor/>
          </AutoFormElement>
          <AutoFormElement>
            <Property name="name">contactTel</Property>
            <Property name="property">contactTel</Property>
            <Editor/>
          </AutoFormElement>
        </AutoForm>
      </Children>
      <Tools/>
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/monitor/SysUserOnlineController.java
@@ -5,12 +5,15 @@
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.SysUserOnline;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.cache.Cache;
@@ -21,7 +24,10 @@
import org.crazycake.shiro.RedisSessionDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.Serializable;
import java.util.*;
@@ -31,9 +37,11 @@
 *
 * @author ruoyi
 */
@Slf4j
@Controller
@RequestMapping("/monitor/online")
public class SysUserOnlineController extends BaseController {
    private String prefix = "monitor/online";
    @Autowired
@@ -55,8 +63,15 @@
        Collection<Session> sessions = redisSessionDAO.getActiveSessions();
        Iterator<Session> it = sessions.iterator();
        List<SysUserOnline> sessionList = new ArrayList<SysUserOnline>();
        long currentTime = System.currentTimeMillis();
        while (it.hasNext()) {
            SysUserOnline user = getSession(it.next());
            Session session = it.next();
            // 检查 Session 是否过期
            if (isSessionExpired(session, currentTime)) {
                continue;
            }
            SysUserOnline user = getSession(session);
            if (StringUtils.isNotNull(user)) {
                if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(loginName)) {
                    if (StringUtils.equals(ipaddr, user.getIpaddr())
@@ -76,28 +91,90 @@
                }
            }
        }
        // 对 sessionList 根据 lastAccessTime 进行 desc 排序
        sessionList.sort((a, b) -> {
            if (a.getLastAccessTime() == null) {
                return 1;
            }
            if (b.getLastAccessTime() == null) {
                return -1;
            }
            return b.getLastAccessTime().compareTo(a.getLastAccessTime());
        });
        // 对 sessionList 进行分页
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        int total = sessionList.size();
        int fromIndex = (pageNum - 1) * pageSize;
        int toIndex = Math.min(fromIndex + pageSize, total);
        if (fromIndex < total) {
            sessionList = sessionList.subList(fromIndex, toIndex);
        } else {
            sessionList = new ArrayList<>();
        }
        rspData.setRows(sessionList);
        rspData.setTotal(sessionList.size());
        rspData.setTotal(total);
        //返回分页后数据
        return rspData;
    }
    /**
     * 检查 Session 是否已过期
     */
    private boolean isSessionExpired(Session session, long currentTime) {
        if (session == null) {
            return true;
        }
        Long timeout = session.getTimeout();
        if (timeout == null || timeout <= 0) {
            timeout = 1800000L; // 默认 30 分钟
        }
        long lastAccessTime = session.getLastAccessTime().getTime();
        return (currentTime - lastAccessTime) > timeout;
    }
    @RequiresPermissions(value = {"monitor:online:batchForceLogout", "monitor:online:forceLogout"}, logical = Logical.OR)
    @Log(title = "在线用户", businessType = BusinessType.FORCE)
    @PostMapping("/batchForceLogout")
    @ResponseBody
    public AjaxResult batchForceLogout(@RequestBody List<SysUserOnline> sysUserOnlines) {
        for (SysUserOnline userOnline : sysUserOnlines) {
            String sessionId = userOnline.getSessionId();
            String loginName = userOnline.getLoginName();
            if (sessionId.equals(ShiroUtils.getSessionId())) {
                return error("当前登录用户无法强退");
    public AjaxResult batchForceLogout(String ids) {
        if (StringUtils.isBlank(ids)) {
            return error("参数不能为空");
        }
        String[] sessionIds = ids.split(",");
        for (String sessionId : sessionIds) {
            try {
                Session session = redisSessionDAO.readSession(sessionId);
                if (session != null) {
                    if (sessionId.equals(ShiroUtils.getSessionId())) {
                        return error("当前登录用户无法强退");
                    }
                    redisSessionDAO.delete(session);
                    Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
                    if (obj instanceof SimplePrincipalCollection) {
                        SimplePrincipalCollection spc = (SimplePrincipalCollection) obj;
                        Object principal = spc.getPrimaryPrincipal();
                        if (principal instanceof SysUser) {
                            SysUser sysUser = (SysUser) principal;
                            removeUserCache(sysUser.getLoginName(), sessionId);
                        }
                    }
                }
            } catch (Exception e) {
                log.error("强退用户失败,sessionId: {}", sessionId, e);
            }
            redisSessionDAO.delete(redisSessionDAO.readSession(sessionId));
            removeUserCache(loginName, sessionId);
        }
        return success();
    }
    private SysUserOnline getSession(Session session) {
        Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
        if (null == obj) {
fzzy-igdss-web/src/main/resources/static/group/video.js
@@ -52,8 +52,8 @@
    $("#deptName").css("font-size", "18px");
    $("#deptName").html(deptCur.kqmc);
    $("#deptAddress").html(deptCur.xzqhmc == null ? "---" : deptCur.xzqhmc);
    $("#yxcr").html(deptCur.yxcr == null ? "---" : deptCur.yxcr);
    $("#cfs").html(deptCur.cfs == null ? "---" : deptCur.cfs);
    $("#yxcr").html(deptCur.contact == null ? "---" : deptCur.contact);
    $("#cfs").html(deptCur.contactTel == null ? "---" : deptCur.contactTel);
    ajaxCamera();
}