Browse Source

在线用户功能修改

echo587 2 years ago
parent
commit
1570612798
19 changed files with 1340 additions and 331 deletions
  1. 12 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysDeptController.java
  2. 376 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysOnlineUserController.java
  3. 36 65
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysUserController.java
  4. 294 138
      leiSP-admin/src/main/resources/templates/monitor/online/online.html
  5. 149 0
      leiSP-admin/src/main/resources/templates/monitor/online/online_bak.html
  6. 20 0
      leiSP-common/src/main/java/com/sooka/common/core/domain/Ztree.java
  7. 9 8
      leiSP-framework/src/main/java/com/sooka/framework/config/ShiroConfig.java
  8. 214 0
      leiSP-system/src/main/java/com/sooka/system/domain/OnlineUser.java
  9. 10 0
      leiSP-system/src/main/java/com/sooka/system/domain/SysDept.java
  10. 5 0
      leiSP-system/src/main/java/com/sooka/system/mapper/SysDeptMapper.java
  11. 4 0
      leiSP-system/src/main/java/com/sooka/system/mapper/SysUserMapper.java
  12. 2 0
      leiSP-system/src/main/java/com/sooka/system/mapper/SysUserOnlineMapper.java
  13. 2 0
      leiSP-system/src/main/java/com/sooka/system/service/ISysDeptService.java
  14. 2 0
      leiSP-system/src/main/java/com/sooka/system/service/ISysUserService.java
  15. 23 0
      leiSP-system/src/main/java/com/sooka/system/service/impl/SysDeptServiceImpl.java
  16. 6 0
      leiSP-system/src/main/java/com/sooka/system/service/impl/SysUserServiceImpl.java
  17. 149 120
      leiSP-system/src/main/resources/mapper/system/SysDeptMapper.xml
  18. 20 0
      leiSP-system/src/main/resources/mapper/system/SysUserMapper.xml
  19. 7 0
      leiSP-system/src/main/resources/mapper/system/SysUserOnlineMapper.xml

+ 12 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysDeptController.java

@@ -178,6 +178,18 @@ public class SysDeptController extends BaseController
     }
 
     /**
+     * 在线用户-----加载部门列表树
+     */
+    @GetMapping("/onlineTreeData")
+    @ResponseBody
+    public List<Ztree> onlineTreeData() {
+        List<Ztree> ztrees = deptService.onlineTreeData();
+        return ztrees;
+    }
+
+
+
+    /**
      * 加载部门列表树(排除下级)
      */
     @GetMapping("/treeData/{excludeId}")

+ 376 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysOnlineUserController.java

@@ -0,0 +1,376 @@
+package com.sooka.web.controller.system;
+
+import com.business.slfh.tools.PinYinUtil;
+import com.github.pagehelper.PageHelper;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.constant.UserConstants;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.PageDomain;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.core.page.TableSupport;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.enums.OnlineStatus;
+import com.sooka.common.utils.StringUtils;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.common.utils.sql.SqlUtil;
+import com.sooka.framework.shiro.service.SysPasswordService;
+import com.sooka.framework.shiro.session.OnlineSession;
+import com.sooka.framework.shiro.session.OnlineSessionDAO;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.framework.util.UserPasswordR;
+import com.sooka.system.domain.OnlineUser;
+import com.sooka.system.domain.SysRole;
+import com.sooka.system.domain.SysUser;
+import com.sooka.system.domain.SysUserOnline;
+import com.sooka.system.mapper.SysUserMapper;
+import com.sooka.system.mapper.SysUserOnlineMapper;
+import com.sooka.system.service.ISysPostService;
+import com.sooka.system.service.ISysRoleService;
+import com.sooka.system.service.ISysUserOnlineService;
+import com.sooka.system.service.ISysUserService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * 用户信息
+ *
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/onlineUser")
+public class SysOnlineUserController extends BaseController {
+    private String prefix = "system/user";
+
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private ISysRoleService roleService;
+
+    @Autowired
+    private ISysPostService postService;
+
+    @Autowired
+    private SysPasswordService passwordService;
+
+    @Autowired
+    private SysUserOnlineMapper userOnlineDao;
+
+    @Autowired
+    private ISysUserOnlineService userOnlineService;
+
+    @RequiresPermissions("system:user:view")
+    @GetMapping()
+    public String user() {
+        return prefix + "/user";
+    }
+
+    @RequiresPermissions("system:user:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SysUser user) {
+        if (StringUtils.isNull(user.getDeptId())){
+            startPage();
+            List<SysUserOnline> list = userOnlineService.selectUserOnlineList(new SysUserOnline());
+            return getDataTable(list);
+        }else{
+            //查询对应部门的所有用户
+            List<SysUser> userList = userService.selectList(user);
+            //查询对应部门的在线用户
+            List<SysUserOnline> onlineUserList = userOnlineDao.selectUserOnlineListByDept(user.getDeptId());
+            List<OnlineUser> list = new ArrayList<OnlineUser>();
+            for(int i = 0; i < userList.size();i++){
+                OnlineUser onlineUser = new OnlineUser();
+                copySysUser(onlineUser, userList.get(i));
+                if (onlineUserList.size() > 0){
+                    for (int j = 0;j < onlineUserList.size();j++){
+                        if(userList.get(i).getLoginName().equals(onlineUserList.get(j).getLoginName())){
+                            copySysUserOnline(onlineUser, onlineUserList.get(j));
+                        }
+                        list.add(onlineUser);
+                    }
+                }else {
+                    list.add(onlineUser);
+                }
+            }
+            PageDomain pageDomain = TableSupport.buildPageRequest();
+            Integer pageNum = pageDomain.getPageNum();
+            Integer pageSize = pageDomain.getPageSize();
+            if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
+                String orderBy = SqlUtil.escapeOrderBySql("dept_id");
+                PageHelper.startPage(pageNum, pageSize, orderBy);
+            }
+            return getDataTable(list);
+        }
+    }
+
+    public void copySysUser(OnlineUser onlineUser, SysUser sysUser){
+        onlineUser.setUserId(sysUser.getUserId());
+        onlineUser.setDeptId(sysUser.getDeptId());
+        onlineUser.setLoginName(sysUser.getLoginName());
+        onlineUser.setUserName(sysUser.getUserName());
+        onlineUser.setEmail(sysUser.getEmail());
+        onlineUser.setPhonenumber(sysUser.getPhonenumber());
+        onlineUser.setSex(sysUser.getSex());
+        onlineUser.setLoginIp(sysUser.getLoginIp());
+        onlineUser.setLoginDate(sysUser.getLoginDate());
+        onlineUser.setStatus(OnlineStatus.off_line);
+    }
+
+    public void copySysUserOnline(OnlineUser onlineUser, SysUserOnline sysUserOnline){
+        onlineUser.setSessionId(sysUserOnline.getSessionId());
+        onlineUser.setDeptName(sysUserOnline.getDeptName());
+        onlineUser.setIpaddr(sysUserOnline.getIpaddr());
+        onlineUser.setLoginLocation(sysUserOnline.getLoginLocation());
+        onlineUser.setBrowser(sysUserOnline.getBrowser());
+        onlineUser.setOs(sysUserOnline.getOs());
+        onlineUser.setLastAccessTime(sysUserOnline.getLastAccessTime());
+        onlineUser.setStatus(sysUserOnline.getStatus());
+    }
+
+    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
+    @RequiresPermissions("system:user:export")
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SysUser user) {
+        List<SysUser> list = userService.selectUserList(user);
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        return util.exportExcel(list, "用户数据");
+    }
+
+    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
+    @RequiresPermissions("system:user:import")
+    @PostMapping("/importData")
+    @ResponseBody
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        List<SysUser> userList = util.importExcel(file.getInputStream());
+        String operName = ShiroUtils.getSysUser().getLoginName();
+        String message = userService.importUser(userList, updateSupport, operName);
+        return AjaxResult.success(message);
+    }
+
+    @RequiresPermissions("system:user:view")
+    @GetMapping("/importTemplate")
+    @ResponseBody
+    public AjaxResult importTemplate() {
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        return util.importTemplateExcel("用户数据");
+    }
+
+    /**
+     * 新增用户
+     */
+    @GetMapping("/add")
+    public String add(ModelMap mmap) {
+        mmap.put("roles", roleService.selectRoleAll().stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        mmap.put("posts", postService.selectPostAll());
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存用户
+     */
+    @RequiresPermissions("system:user:add")
+    @Log(title = "用户管理", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(@Validated SysUser user) {
+        if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user.getLoginName()))) {
+            return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在");
+        } else if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
+            return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在");
+        }
+        boolean isMatch = Pattern.matches(UserPasswordR.RegPass, user.getPassword());
+        if (!isMatch) {
+            return error(UserPasswordR.RegPassTrs);
+        }
+
+        //
+// else if (UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
+//        {
+//            return error("新增用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
+//        }
+        user.setSalt(ShiroUtils.randomSalt());
+        user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
+        user.setCreateBy(ShiroUtils.getLoginName());
+        user.setPinyinShort(PinYinUtil.getFirstSpell(user.getUserName()));
+        user.setPinyinFirst(PinYinUtil.getFirstSpell(user.getUserName()).substring(0, 1));
+        user.setPinyinFull(PinYinUtil.getFullSpell(user.getUserName()));
+
+        return toAjax(userService.insertUser(user));
+    }
+
+    /**
+     * 修改用户
+     */
+    @GetMapping("/edit/{userId}")
+    public String edit(@PathVariable("userId") Long userId, ModelMap mmap) {
+        List<SysRole> roles = roleService.selectRolesByUserId(userId);
+        mmap.put("user", userService.selectUserById(userId));
+        mmap.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        mmap.put("posts", postService.selectPostsByUserId(userId));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存用户
+     */
+    @RequiresPermissions("system:user:edit")
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@Validated SysUser user) {
+        userService.checkUserAllowed(user);
+        if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
+            return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在");
+        }
+//        else if (UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
+//        {
+//            return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
+//        }
+        user.setPinyinShort(PinYinUtil.getFirstSpell(user.getUserName()));
+        user.setPinyinFirst(PinYinUtil.getFirstSpell(user.getUserName()).substring(0, 1));
+        user.setPinyinFull(PinYinUtil.getFullSpell(user.getUserName()));
+        user.setUpdateBy(ShiroUtils.getLoginName());
+        return toAjax(userService.updateUser(user));
+    }
+
+    @RequiresPermissions("system:user:resetPwd")
+    @Log(title = "重置密码", businessType = BusinessType.UPDATE)
+    @GetMapping("/resetPwd/{userId}")
+    public String resetPwd(@PathVariable("userId") Long userId, ModelMap mmap) {
+        mmap.put("user", userService.selectUserById(userId));
+        return prefix + "/resetPwd";
+    }
+
+    @RequiresPermissions("system:user:resetPwd")
+    @Log(title = "重置密码", businessType = BusinessType.UPDATE)
+    @PostMapping("/resetPwd")
+    @ResponseBody
+    public AjaxResult resetPwdSave(SysUser user) {
+        userService.checkUserAllowed(user);
+        user.setSalt(ShiroUtils.randomSalt());
+        boolean isMatch = Pattern.matches(UserPasswordR.RegPass, user.getPassword());
+        user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
+        String msg = "", username = user.getLoginName(), password = user.getPassword();
+        if (!isMatch) {
+            return error(UserPasswordR.RegPassTrs);
+        }
+        if (userService.resetUserPwd(user) > 0) {
+            if (ShiroUtils.getUserId().longValue() == user.getUserId().longValue()) {
+                ShiroUtils.setSysUser(userService.selectUserById(user.getUserId()));
+            }
+            return success();
+        }
+        return error();
+    }
+
+    /**
+     * 进入授权角色页
+     */
+    @GetMapping("/authRole/{userId}")
+    public String authRole(@PathVariable("userId") Long userId, ModelMap mmap) {
+        SysUser user = userService.selectUserById(userId);
+        // 获取用户所属的角色列表
+        List<SysRole> roles = roleService.selectRolesByUserId(userId);
+        mmap.put("user", user);
+        mmap.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        return prefix + "/authRole";
+    }
+
+    /**
+     * 用户授权角色
+     */
+    @RequiresPermissions("system:user:add")
+    @Log(title = "用户管理", businessType = BusinessType.GRANT)
+    @PostMapping("/authRole/insertAuthRole")
+    @ResponseBody
+    public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
+        userService.insertUserAuth(userId, roleIds);
+        return success();
+    }
+
+    @RequiresPermissions("system:user:remove")
+    @Log(title = "用户管理", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        try {
+            return toAjax(userService.deleteUserByIds(ids));
+        } catch (Exception e) {
+            return error(e.getMessage());
+        }
+    }
+
+    /**
+     * 校验用户名
+     */
+    @PostMapping("/checkLoginNameUnique")
+    @ResponseBody
+    public String checkLoginNameUnique(SysUser user) {
+        return userService.checkLoginNameUnique(user.getLoginName());
+    }
+
+    /**
+     * 校验手机号码
+     */
+    @PostMapping("/checkPhoneUnique")
+    @ResponseBody
+    public String checkPhoneUnique(SysUser user) {
+        return userService.checkPhoneUnique(user);
+    }
+
+    /**
+     * 校验email邮箱
+     */
+    @PostMapping("/checkEmailUnique")
+    @ResponseBody
+    public String checkEmailUnique(SysUser user) {
+        return UserConstants.USER_EMAIL_UNIQUE;//不验证邮箱唯一
+        //return userService.checkEmailUnique(user);
+    }
+
+    /**
+     * 用户状态修改
+     */
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @RequiresPermissions("system:user:edit")
+    @PostMapping("/changeStatus")
+    @ResponseBody
+    public AjaxResult changeStatus(SysUser user) {
+        userService.checkUserAllowed(user);
+        return toAjax(userService.changeStatus(user));
+    }
+
+    @Resource
+    SysUserMapper sysUserMapper;
+
+    @RequestMapping("resetPwdBatch")
+    @ResponseBody
+    public AjaxResult resetPwdBatch() {
+        List<SysUser> list = userService.selectUserList(new SysUser());
+        for (SysUser s : list) {
+            s.setSalt(ShiroUtils.randomSalt());
+            s.setPassword(passwordService.encryptPassword(s.getLoginName(), "AbCd%" + s.getPhonenumber(), s.getSalt()));
+            s.setUserId(s.getUserId());
+            sysUserMapper.updateUser(s);
+            System.out.println("====" + s.getUserName());
+        }
+        return success();
+    }
+
+
+}

+ 36 - 65
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysUserController.java

@@ -48,8 +48,7 @@ import javax.annotation.Resource;
  */
 @Controller
 @RequestMapping("/system/user")
-public class SysUserController extends BaseController
-{
+public class SysUserController extends BaseController {
     private String prefix = "system/user";
 
     @Autowired
@@ -66,21 +65,18 @@ public class SysUserController extends BaseController
 
     @RequiresPermissions("system:user:view")
     @GetMapping()
-    public String user()
-    {
+    public String user() {
         return prefix + "/user";
     }
 
     @RequiresPermissions("system:user:list")
     @PostMapping("/list")
     @ResponseBody
-    public TableDataInfo list(SysUser user)
-    {
+    public TableDataInfo list(SysUser user) {
         PageDomain pageDomain = TableSupport.buildPageRequest();
         Integer pageNum = pageDomain.getPageNum();
         Integer pageSize = pageDomain.getPageSize();
-        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
-        {
+        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
             String orderBy = SqlUtil.escapeOrderBySql("postSort");
             PageHelper.startPage(pageNum, pageSize, orderBy);
         }
@@ -93,8 +89,7 @@ public class SysUserController extends BaseController
     @RequiresPermissions("system:user:export")
     @PostMapping("/export")
     @ResponseBody
-    public AjaxResult export(SysUser user)
-    {
+    public AjaxResult export(SysUser user) {
         List<SysUser> list = userService.selectUserList(user);
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         return util.exportExcel(list, "用户数据");
@@ -104,8 +99,7 @@ public class SysUserController extends BaseController
     @RequiresPermissions("system:user:import")
     @PostMapping("/importData")
     @ResponseBody
-    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
-    {
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         List<SysUser> userList = util.importExcel(file.getInputStream());
         String operName = ShiroUtils.getSysUser().getLoginName();
@@ -116,8 +110,7 @@ public class SysUserController extends BaseController
     @RequiresPermissions("system:user:view")
     @GetMapping("/importTemplate")
     @ResponseBody
-    public AjaxResult importTemplate()
-    {
+    public AjaxResult importTemplate() {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         return util.importTemplateExcel("用户数据");
     }
@@ -126,8 +119,7 @@ public class SysUserController extends BaseController
      * 新增用户
      */
     @GetMapping("/add")
-    public String add(ModelMap mmap)
-    {
+    public String add(ModelMap mmap) {
         mmap.put("roles", roleService.selectRoleAll().stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
         mmap.put("posts", postService.selectPostAll());
         return prefix + "/add";
@@ -140,18 +132,14 @@ public class SysUserController extends BaseController
     @Log(title = "用户管理", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @ResponseBody
-    public AjaxResult addSave(@Validated SysUser user)
-    {
-        if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user.getLoginName())))
-        {
+    public AjaxResult addSave(@Validated SysUser user) {
+        if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user.getLoginName()))) {
             return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在");
-        }
-        else if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
-        {
+        } else if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
             return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在");
         }
         boolean isMatch = Pattern.matches(UserPasswordR.RegPass, user.getPassword());
-        if(!isMatch){
+        if (!isMatch) {
             return error(UserPasswordR.RegPassTrs);
         }
 
@@ -164,7 +152,7 @@ public class SysUserController extends BaseController
         user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
         user.setCreateBy(ShiroUtils.getLoginName());
         user.setPinyinShort(PinYinUtil.getFirstSpell(user.getUserName()));
-        user.setPinyinFirst(PinYinUtil.getFirstSpell(user.getUserName()).substring(0,1));
+        user.setPinyinFirst(PinYinUtil.getFirstSpell(user.getUserName()).substring(0, 1));
         user.setPinyinFull(PinYinUtil.getFullSpell(user.getUserName()));
 
         return toAjax(userService.insertUser(user));
@@ -174,8 +162,7 @@ public class SysUserController extends BaseController
      * 修改用户
      */
     @GetMapping("/edit/{userId}")
-    public String edit(@PathVariable("userId") Long userId, ModelMap mmap)
-    {
+    public String edit(@PathVariable("userId") Long userId, ModelMap mmap) {
         List<SysRole> roles = roleService.selectRolesByUserId(userId);
         mmap.put("user", userService.selectUserById(userId));
         mmap.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
@@ -190,11 +177,9 @@ public class SysUserController extends BaseController
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
     @ResponseBody
-    public AjaxResult editSave(@Validated SysUser user)
-    {
+    public AjaxResult editSave(@Validated SysUser user) {
         userService.checkUserAllowed(user);
-        if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
-        {
+        if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
             return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在");
         }
 //        else if (UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
@@ -202,7 +187,7 @@ public class SysUserController extends BaseController
 //            return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
 //        }
         user.setPinyinShort(PinYinUtil.getFirstSpell(user.getUserName()));
-        user.setPinyinFirst(PinYinUtil.getFirstSpell(user.getUserName()).substring(0,1));
+        user.setPinyinFirst(PinYinUtil.getFirstSpell(user.getUserName()).substring(0, 1));
         user.setPinyinFull(PinYinUtil.getFullSpell(user.getUserName()));
         user.setUpdateBy(ShiroUtils.getLoginName());
         return toAjax(userService.updateUser(user));
@@ -211,29 +196,26 @@ public class SysUserController extends BaseController
     @RequiresPermissions("system:user:resetPwd")
     @Log(title = "重置密码", businessType = BusinessType.UPDATE)
     @GetMapping("/resetPwd/{userId}")
-    public String resetPwd(@PathVariable("userId") Long userId, ModelMap mmap)
-    {
+    public String resetPwd(@PathVariable("userId") Long userId, ModelMap mmap) {
         mmap.put("user", userService.selectUserById(userId));
         return prefix + "/resetPwd";
     }
+
     @RequiresPermissions("system:user:resetPwd")
     @Log(title = "重置密码", businessType = BusinessType.UPDATE)
     @PostMapping("/resetPwd")
     @ResponseBody
-    public AjaxResult resetPwdSave(SysUser user)
-    {
+    public AjaxResult resetPwdSave(SysUser user) {
         userService.checkUserAllowed(user);
         user.setSalt(ShiroUtils.randomSalt());
         boolean isMatch = Pattern.matches(UserPasswordR.RegPass, user.getPassword());
         user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
         String msg = "", username = user.getLoginName(), password = user.getPassword();
-        if(!isMatch){
+        if (!isMatch) {
             return error(UserPasswordR.RegPassTrs);
         }
-        if (userService.resetUserPwd(user) > 0)
-        {
-            if (ShiroUtils.getUserId().longValue() == user.getUserId().longValue())
-            {
+        if (userService.resetUserPwd(user) > 0) {
+            if (ShiroUtils.getUserId().longValue() == user.getUserId().longValue()) {
                 ShiroUtils.setSysUser(userService.selectUserById(user.getUserId()));
             }
             return success();
@@ -245,8 +227,7 @@ public class SysUserController extends BaseController
      * 进入授权角色页
      */
     @GetMapping("/authRole/{userId}")
-    public String authRole(@PathVariable("userId") Long userId, ModelMap mmap)
-    {
+    public String authRole(@PathVariable("userId") Long userId, ModelMap mmap) {
         SysUser user = userService.selectUserById(userId);
         // 获取用户所属的角色列表
         List<SysRole> roles = roleService.selectRolesByUserId(userId);
@@ -262,8 +243,7 @@ public class SysUserController extends BaseController
     @Log(title = "用户管理", businessType = BusinessType.GRANT)
     @PostMapping("/authRole/insertAuthRole")
     @ResponseBody
-    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
-    {
+    public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
         userService.insertUserAuth(userId, roleIds);
         return success();
     }
@@ -272,14 +252,10 @@ public class SysUserController extends BaseController
     @Log(title = "用户管理", businessType = BusinessType.DELETE)
     @PostMapping("/remove")
     @ResponseBody
-    public AjaxResult remove(String ids)
-    {
-        try
-        {
+    public AjaxResult remove(String ids) {
+        try {
             return toAjax(userService.deleteUserByIds(ids));
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             return error(e.getMessage());
         }
     }
@@ -289,8 +265,7 @@ public class SysUserController extends BaseController
      */
     @PostMapping("/checkLoginNameUnique")
     @ResponseBody
-    public String checkLoginNameUnique(SysUser user)
-    {
+    public String checkLoginNameUnique(SysUser user) {
         return userService.checkLoginNameUnique(user.getLoginName());
     }
 
@@ -299,8 +274,7 @@ public class SysUserController extends BaseController
      */
     @PostMapping("/checkPhoneUnique")
     @ResponseBody
-    public String checkPhoneUnique(SysUser user)
-    {
+    public String checkPhoneUnique(SysUser user) {
         return userService.checkPhoneUnique(user);
     }
 
@@ -309,8 +283,7 @@ public class SysUserController extends BaseController
      */
     @PostMapping("/checkEmailUnique")
     @ResponseBody
-    public String checkEmailUnique(SysUser user)
-    {
+    public String checkEmailUnique(SysUser user) {
         return UserConstants.USER_EMAIL_UNIQUE;//不验证邮箱唯一
         //return userService.checkEmailUnique(user);
     }
@@ -322,8 +295,7 @@ public class SysUserController extends BaseController
     @RequiresPermissions("system:user:edit")
     @PostMapping("/changeStatus")
     @ResponseBody
-    public AjaxResult changeStatus(SysUser user)
-    {
+    public AjaxResult changeStatus(SysUser user) {
         userService.checkUserAllowed(user);
         return toAjax(userService.changeStatus(user));
     }
@@ -333,18 +305,17 @@ public class SysUserController extends BaseController
 
     @RequestMapping("resetPwdBatch")
     @ResponseBody
-    public AjaxResult resetPwdBatch(){
+    public AjaxResult resetPwdBatch() {
         List<SysUser> list = userService.selectUserList(new SysUser());
-        for(SysUser s : list){
+        for (SysUser s : list) {
             s.setSalt(ShiroUtils.randomSalt());
-            s.setPassword(passwordService.encryptPassword(s.getLoginName(), "AbCd%"+s.getPhonenumber(), s.getSalt()));
+            s.setPassword(passwordService.encryptPassword(s.getLoginName(), "AbCd%" + s.getPhonenumber(), s.getSalt()));
             s.setUserId(s.getUserId());
             sysUserMapper.updateUser(s);
-            System.out.println("===="+s.getUserName());
+            System.out.println("====" + s.getUserName());
         }
         return success();
     }
 
 
-
 }

+ 294 - 138
leiSP-admin/src/main/resources/templates/monitor/online/online.html

@@ -1,149 +1,305 @@
 <!DOCTYPE html>
 <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
 <head>
-	<th:block th:include="include :: header('在线用户列表')" />
+    <th:block th:include="include :: header('用户列表')"/>
+    <th:block th:include="include :: layout-latest-css"/>
+    <th:block th:include="include :: ztree-css"/>
 </head>
 <body class="gray-bg">
+<div class="ui-layout-west">
+    <div class="box box-main">
+        <div class="box-header">
+            <div class="box-title">
+                <i class="fa icon-grid"></i> 组织机构
+            </div>
+            <div class="box-tools pull-right">
+                <a type="button" class="btn btn-box-tool" href="#" onclick="dept()" title="管理部门"><i
+                        class="fa fa-edit"></i></a>
+                <button type="button" class="btn btn-box-tool" id="btnExpand" title="展开" style="display:none;"><i
+                        class="fa fa-chevron-up"></i></button>
+                <button type="button" class="btn btn-box-tool" id="btnCollapse" title="折叠"><i
+                        class="fa fa-chevron-down"></i></button>
+                <button type="button" class="btn btn-box-tool" id="btnRefresh" title="刷新部门"><i
+                        class="fa fa-refresh"></i></button>
+            </div>
+        </div>
+        <div class="ui-layout-content">
+            <div id="tree" class="ztree"></div>
+        </div>
+    </div>
+</div>
+
+<div class="ui-layout-center">
     <div class="container-div">
-		<div class="row">
-			<div class="col-sm-12 search-collapse">
-				<form id="online-form">
-					<div class="select-list">
-						<ul>
-							<li>
-								登录地址:<input type="text" name="ipaddr"/>
-							</li>
-							<li>
-								登录名称:<input type="text" name="loginName"/>
-							</li>
-							<li>
-								<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
-								<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
-							</li>
-						</ul>
-					</div>
-				</form>
-			</div>
-			
-	        <div class="btn-group-sm" id="toolbar" role="group">
-	            <a class="btn btn-danger multiple disabled" onclick="javascript:batchForceLogout()" shiro:hasPermission="monitor:online:batchForceLogout">
-	                <i class="fa fa-sign-out"></i> 强退
-	            </a>
-	        </div>
-	        
-	        <div class="col-sm-12 select-table table-striped">
-			    <table id="bootstrap-table"></table>
-			</div>
-		</div>
-	</div>
-	<th:block th:include="include :: footer" />
-	<th:block th:include="include :: bootstrap-table-export-js" />
-	<script th:inline="javascript">
-		var forceFlag = [[${@permission.hasPermi('monitor:online:forceLogout')}]];
-		var prefix = ctx + "monitor/online";
-
-		$(function() {
-		    var options = {
-		    	uniqueId: "sessionId",
-		        url: prefix + "/list",
-		        exportUrl: prefix + "/export",
-		        sortName: "lastAccessTime",
-		        sortOrder: "desc",
-		        showExport: true,
-		        escape: true,
-		        columns: [{
-		            checkbox: true
-		        },
-		        {
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="user-form">
+                    <input type="hidden" id="deptId" name="deptId">
+                    <input type="hidden" id="parentId" name="parentId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                登录名称:<input type="text" name="loginName"/>
+                            </li>
+                            <li>
+                                手机号码:<input type="text" name="phonenumber"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i
+                                        class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i
+                                        class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+</div>
+
+<th:block th:include="include :: footer"/>
+<th:block th:include="include :: layout-latest-js"/>
+<th:block th:include="include :: ztree-js"/>
+<script th:inline="javascript">
+    var editFlag = [[${@permission.hasPermi('system:user:edit')}]];
+    var removeFlag = [[${@permission.hasPermi('system:user:remove')}]];
+    var resetPwdFlag = [[${@permission.hasPermi('system:user:resetPwd')}]];
+    var prefix = ctx + "system/onlineUser";
+
+    $(function () {
+        var panehHidden = false;
+        if ($(this).width() < 769) {
+            panehHidden = true;
+        }
+        $('body').layout({initClosed: panehHidden, west__size: 185});
+        queryUserList();
+        queryDeptTree();
+    });
+
+    function queryUserList() {
+        var options = {
+            url: prefix + "/list",
+            createUrl: prefix + "/add",
+            sortName: "lastAccessTime",
+            sortOrder: "desc",
+            modalName: "用户",
+            columns: [
+                {
                     title: "序号",
                     formatter: function (value, row, index) {
-                 	    return $.table.serialNumber(index);
+                        return $.table.serialNumber(index);
+                    }
+                },{
+                    field: 'status',
+                    title: '会话状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        if (value == 'on_line') {
+                            return '<span class="badge badge-primary">在线</span>';
+                        } else {
+                            return '<span class="badge badge-danger">离线</span>';
+                        }
                     }
+                },{
+                    field: 'loginName',
+                    title: '登录名称'
+                },
+                {
+                    field: 'userName',
+                    title: '用户名称'
+                },
+                {
+                    field: 'phonenumber',
+                    title: '手机'
                 },
-		        {
-		            field: 'sessionId',
-		            title: '会话编号'
-		        },
-		        {
-		            field: 'loginName',
-		            title: '登录名称',
-		            sortable: true
-		        },
-		        {
-		            field: 'deptName',
-		            title: '部门名称'
-		        },
-		        {
-		            field: 'ipaddr',
-		            title: '主机'
-		        },
-		        {
-		            field: 'loginLocation',
-		            title: '登录地点'
-		        },
-		        {
-		            field: 'browser',
-		            title: '浏览器'
-		        },
-		        {
-		            field: 'os',
-		            title: '操作系统'
-		        },
-		        {
-		            field: 'status',
-		            title: '会话状态',
-		            align: 'center',
-		            formatter: function(value, row, index) {
-		                if (value == 'on_line') {
-		                    return '<span class="badge badge-primary">在线</span>';
-		                } else if (value == 'off_line') {
-		                    return '<span class="badge badge-danger">离线</span>';
-		                }
-		            }
-		        },
-		        {
-		            field: 'startTimestamp',
-		            title: '登录时间',
-		            sortable: true
-		        },
-		        {
-		            field: 'lastAccessTime',
-		            title: '最后访问时间',
-		            sortable: true
-		        },
-		        {
-		            title: '操作',
-		            align: 'center',
-		            formatter: function(value, row, index) {
-		                var msg = '<a class="btn btn-danger btn-xs ' + forceFlag + '" href="javascript:void(0)" onclick="forceLogout(\'' + row.sessionId + '\')"><i class="fa fa-sign-out"></i>强退</a> ';
-		                return msg;
-		            }
-		        }]
-		    };
-		    $.table.init(options);
-		});
-
-		// 单条强退
-		function forceLogout(sessionId) {
-		    $.modal.confirm("确定要强制选中用户下线吗?", function() {
-		    	var data = { "ids": sessionId };
-		        $.operate.post(prefix + "/batchForceLogout", data);
-		    })
-		}
-
-		// 批量强退
-		function batchForceLogout() {
-		    var rows = $.table.selectColumns("sessionId");
-		    if (rows.length == 0) {
-		        $.modal.alertWarning("请选择要强退的用户");
-		        return;
-		    }
-		    $.modal.confirm("确认要强退选中的" + rows.length + "条数据吗?", function() {
-		        var url = prefix + "/batchForceLogout";
-		        var data = { "ids": rows.join() };
-		        $.operate.post(url, data);
-		    });
-		}
-	</script>
+                {
+                    field: 'loginIp',
+                    title: '最后登录IP'
+                },
+                {
+                    field: 'loginDate',
+                    title: '最后登录时间'
+                },
+                {
+                    field: 'loginDate',
+                    title: '最后登录时间'
+                },
+                {
+                    field: 'ipaddr',
+                    title: '登录IP'
+                }
+                ,
+                {
+                    field: 'loginLocation',
+                    title: '登录地点'
+                },
+                {
+                    field: 'browser',
+                    title: '浏览器'
+                },
+                {
+                    field: 'os',
+                    title: '操作系统'
+                },
+                {
+                    field: 'lastAccessTime',
+                    title: '最后访问时间',
+                    sortable: true
+                }
+                ]
+        };
+        $.table.init(options);
+    }
+
+    function queryDeptTree() {
+        var url = ctx + "system/dept/onlineTreeData";
+        var options = {
+            url: url,
+            expandLevel: 2,
+            onClick: zOnClick
+        };
+        $.tree.init(options);
+
+        function zOnClick(event, treeId, treeNode) {
+            $("#deptId").val(treeNode.id);
+            $("#parentId").val(treeNode.pId);
+            $.table.search();
+        }
+    }
+
+    $('#btnExpand').click(function () {
+        $._tree.expandAll(true);
+        $(this).hide();
+        $('#btnCollapse').show();
+    });
+
+    $('#btnCollapse').click(function () {
+        $._tree.expandAll(false);
+        $(this).hide();
+        $('#btnExpand').show();
+    });
+
+    $('#btnRefresh').click(function () {
+        queryDeptTree();
+    });
+
+    /* 用户管理-部门 */
+    function dept() {
+        var url = ctx + "system/dept";
+        $.modal.openTab("部门管理", url);
+    }
+
+    /* 用户管理-重置密码 */
+    function resetPwd(userId) {
+        var url = prefix + '/resetPwd/' + userId;
+        $.modal.open("重置密码", url, '800', '300');
+    }
+
+    /* 用户管理-分配角色 */
+    function authRole(userId) {
+        var url = prefix + '/authRole/' + userId;
+        $.modal.openTab("用户分配角色", url);
+    }
+
+    /* 用户状态显示 */
+    function statusTools(row) {
+        if (row.status == 1) {
+            return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="enable(\'' + row.userId + '\')"></i> ';
+        } else {
+            return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="disable(\'' + row.userId + '\')"></i> ';
+        }
+    }
+
+    function statusToolsIsSendMsg(row) {
+        if (row.issendmsg == 0) {
+            return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="enableSendMsg(\'' + row.userId + '\')"></i> ';
+        } else {
+            return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="diableSendMsg(\'' + row.userId + '\')"></i> ';
+        }
+    }
+    function statusToolsIsJGMsg(row) {
+        if (row.isjgmsg == 0) {
+            return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="enableJGMsg(\'' + row.userId + '\')"></i> ';
+        } else {
+            return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="diableJGMsg(\'' + row.userId + '\')"></i> ';
+        }
+    }
+    function statusToolsIsCamera(row) {
+        if (row.iscamera == 0) {
+            return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="enableCamera(\'' + row.userId + '\')"></i> ';
+        } else {
+            return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="diableCamera(\'' + row.userId + '\')"></i> ';
+        }
+    }
+
+    /* 用户管理-停用 */
+    function disable(userId) {
+        $.modal.confirm("确认要停用用户吗?", function () {
+            $.operate.post(prefix + "/changeStatus", {"userId": userId, "status": 1});
+        })
+    }
+
+    /* 用户管理启用 */
+    function enable(userId) {
+        $.modal.confirm("确认要启用用户吗?", function () {
+            $.operate.post(prefix + "/changeStatus", {"userId": userId, "status": 0});
+        })
+    }
+    function diableSendMsg(userId) {
+        $.modal.confirm("确认要停用发送短信吗?", function () {
+            $.operate.post(prefix + "/changeStatus", {"userId": userId, "issendmsg": 0});
+        })
+    }
+    function enableSendMsg(userId) {
+        $.modal.confirm("确认要启用发送短信吗?", function () {
+            $.operate.post(prefix + "/changeStatus", {"userId": userId, "issendmsg": 1});
+        })
+    }
+
+    function diableJGMsg(userId) {
+        $.modal.confirm("确认要停用消息推送吗?", function () {
+            $.operate.post(prefix + "/changeStatus", {"userId": userId, "isjgmsg": 0});
+        })
+    }
+    function enableJGMsg(userId) {
+        $.modal.confirm("确认要启用消息推送吗?", function () {
+            $.operate.post(prefix + "/changeStatus", {"userId": userId, "isjgmsg": 1});
+        })
+    }
+    function diableCamera(userId) {
+        $.modal.confirm("确认要停用手机端摄像头吗?", function () {
+            $.operate.post(prefix + "/changeStatus", {"userId": userId, "iscamera": 0});
+        })
+    }
+    function enableCamera(userId) {
+        $.modal.confirm("确认要启用手机端摄像头吗?", function () {
+            $.operate.post(prefix + "/changeStatus", {"userId": userId, "iscamera": 1});
+        })
+    }
+
+
+
+</script>
 </body>
-</html>
+<!-- 导入区域 -->
+<script id="importTpl" type="text/template">
+    <form enctype="multipart/form-data" class="mt20 mb10">
+        <div class="col-xs-offset-1">
+            <input type="file" id="file" name="file"/>
+            <div class="mt10 pt5">
+                <input type="checkbox" id="updateSupport" name="updateSupport" title="如果登录账户已经存在,更新这条数据。"> 是否更新已经存在的用户数据
+                &nbsp; <a onclick="$.table.importTemplate()" class="btn btn-default btn-xs"><i
+                    class="fa fa-file-excel-o"></i> 下载模板</a>
+            </div>
+            <font color="red" class="pull-left mt10">
+                提示:仅允许导入“xls”或“xlsx”格式文件!
+            </font>
+        </div>
+    </form>
+</script>
+</html>

+ 149 - 0
leiSP-admin/src/main/resources/templates/monitor/online/online_bak.html

@@ -0,0 +1,149 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('在线用户列表')" />
+</head>
+<body class="gray-bg">
+    <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 search-collapse">
+				<form id="online-form">
+					<div class="select-list">
+						<ul>
+							<li>
+								登录地址:<input type="text" name="ipaddr"/>
+							</li>
+							<li>
+								登录名称:<input type="text" name="loginName"/>
+							</li>
+							<li>
+								<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+								<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+			
+	        <div class="btn-group-sm" id="toolbar" role="group">
+	            <a class="btn btn-danger multiple disabled" onclick="javascript:batchForceLogout()" shiro:hasPermission="monitor:online:batchForceLogout">
+	                <i class="fa fa-sign-out"></i> 强退
+	            </a>
+	        </div>
+	        
+	        <div class="col-sm-12 select-table table-striped">
+			    <table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+	<th:block th:include="include :: footer" />
+	<th:block th:include="include :: bootstrap-table-export-js" />
+	<script th:inline="javascript">
+		var forceFlag = [[${@permission.hasPermi('monitor:online:forceLogout')}]];
+		var prefix = ctx + "monitor/online";
+
+		$(function() {
+		    var options = {
+		    	uniqueId: "sessionId",
+		        url: prefix + "/list",
+		        exportUrl: prefix + "/export",
+		        sortName: "lastAccessTime",
+		        sortOrder: "desc",
+		        showExport: true,
+		        escape: true,
+		        columns: [{
+		            checkbox: true
+		        },
+		        {
+                    title: "序号",
+                    formatter: function (value, row, index) {
+                 	    return $.table.serialNumber(index);
+                    }
+                },
+		        {
+		            field: 'sessionId',
+		            title: '会话编号'
+		        },
+		        {
+		            field: 'loginName',
+		            title: '登录名称',
+		            sortable: true
+		        },
+		        {
+		            field: 'deptName',
+		            title: '部门名称'
+		        },
+		        {
+		            field: 'ipaddr',
+		            title: '主机'
+		        },
+		        {
+		            field: 'loginLocation',
+		            title: '登录地点'
+		        },
+		        {
+		            field: 'browser',
+		            title: '浏览器'
+		        },
+		        {
+		            field: 'os',
+		            title: '操作系统'
+		        },
+		        {
+		            field: 'status',
+		            title: '会话状态',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		                if (value == 'on_line') {
+		                    return '<span class="badge badge-primary">在线</span>';
+		                } else if (value == 'off_line') {
+		                    return '<span class="badge badge-danger">离线</span>';
+		                }
+		            }
+		        },
+		        {
+		            field: 'startTimestamp',
+		            title: '登录时间',
+		            sortable: true
+		        },
+		        {
+		            field: 'lastAccessTime',
+		            title: '最后访问时间',
+		            sortable: true
+		        },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		                var msg = '<a class="btn btn-danger btn-xs ' + forceFlag + '" href="javascript:void(0)" onclick="forceLogout(\'' + row.sessionId + '\')"><i class="fa fa-sign-out"></i>强退</a> ';
+		                return msg;
+		            }
+		        }]
+		    };
+		    $.table.init(options);
+		});
+
+		// 单条强退
+		function forceLogout(sessionId) {
+		    $.modal.confirm("确定要强制选中用户下线吗?", function() {
+		    	var data = { "ids": sessionId };
+		        $.operate.post(prefix + "/batchForceLogout", data);
+		    })
+		}
+
+		// 批量强退
+		function batchForceLogout() {
+		    var rows = $.table.selectColumns("sessionId");
+		    if (rows.length == 0) {
+		        $.modal.alertWarning("请选择要强退的用户");
+		        return;
+		    }
+		    $.modal.confirm("确认要强退选中的" + rows.length + "条数据吗?", function() {
+		        var url = prefix + "/batchForceLogout";
+		        var data = { "ids": rows.join() };
+		        $.operate.post(url, data);
+		    });
+		}
+	</script>
+</body>
+</html>

+ 20 - 0
leiSP-common/src/main/java/com/sooka/common/core/domain/Ztree.java

@@ -32,6 +32,10 @@ public class Ztree implements Serializable
     /** 是否能勾选 */
     private boolean nocheck = false;
 
+    private Long total;//部门总用户数
+
+    private Long onlineTotal;//在线用户数
+
     public Long getId()
     {
         return id;
@@ -101,4 +105,20 @@ public class Ztree implements Serializable
     {
         this.nocheck = nocheck;
     }
+
+    public Long getTotal() {
+        return total;
+    }
+
+    public void setTotal(Long total) {
+        this.total = total;
+    }
+
+    public Long getOnlineTotal() {
+        return onlineTotal;
+    }
+
+    public void setOnlineTotal(Long onlineTotal) {
+        this.onlineTotal = onlineTotal;
+    }
 }

+ 9 - 8
leiSP-framework/src/main/java/com/sooka/framework/config/ShiroConfig.java

@@ -235,7 +235,7 @@ public class ShiroConfig
         // 设置realm.
         securityManager.setRealm(userRealm);
         // 记住我
-        securityManager.setRememberMeManager(rememberMeManager());
+//        securityManager.setRememberMeManager(rememberMeManager());
         // 注入缓存管理器;
         securityManager.setCacheManager(getEhCacheManager());
         // session管理器
@@ -368,13 +368,14 @@ public class ShiroConfig
     /**
      * 记住我
      */
-    public CookieRememberMeManager rememberMeManager()
-    {
-        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
-        cookieRememberMeManager.setCookie(rememberMeCookie());
-        cookieRememberMeManager.setCipherKey(Base64.decode(cipherKey));
-        return cookieRememberMeManager;
-    }
+//    public CookieRememberMeManager rememberMeManager()
+//    {
+//        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
+//        cookieRememberMeManager.setCookie(rememberMeCookie());
+//        cookieRememberMeManager.setCipherKey(Base64.decode(cipherKey));
+//
+//        return cookieRememberMeManager;
+//    }
 
     /**
      * 同一个用户多设备登录限制

+ 214 - 0
leiSP-system/src/main/java/com/sooka/system/domain/OnlineUser.java

@@ -0,0 +1,214 @@
+package com.sooka.system.domain;
+
+import com.sooka.common.annotation.Excel;
+import com.sooka.common.annotation.Excel.ColumnType;
+import com.sooka.common.annotation.Excel.Type;
+import com.sooka.common.annotation.Excels;
+import com.sooka.common.core.domain.BaseEntity;
+import com.sooka.common.enums.OnlineStatus;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户对象 sys_user
+ *
+ * @author lei_wang
+ */
+@Getter
+@Setter
+public class OnlineUser extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    private Long userId;
+
+    private Long deptId;
+
+    private Long parentId;
+
+    private String loginName;
+
+    private String userName;
+
+    private String email;
+
+    private String phonenumber;
+
+    private String sex;
+
+    private String loginIp;
+
+    private Date loginDate;
+
+    private String sessionId;
+
+    private String deptName;
+
+    private String ipaddr;
+
+    private String loginLocation;
+
+    private String browser;
+
+    private String os;
+
+    private Date lastAccessTime;
+
+    /** 在线状态 */
+    private OnlineStatus status = OnlineStatus.on_line;
+
+    public OnlineUser() {
+
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getPhonenumber() {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber) {
+        this.phonenumber = phonenumber;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public String getLoginIp() {
+        return loginIp;
+    }
+
+    public void setLoginIp(String loginIp) {
+        this.loginIp = loginIp;
+    }
+
+    public Date getLoginDate() {
+        return loginDate;
+    }
+
+    public void setLoginDate(Date loginDate) {
+        this.loginDate = loginDate;
+    }
+
+    public String getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(String sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public String getIpaddr() {
+        return ipaddr;
+    }
+
+    public void setIpaddr(String ipaddr) {
+        this.ipaddr = ipaddr;
+    }
+
+    public String getLoginLocation() {
+        return loginLocation;
+    }
+
+    public void setLoginLocation(String loginLocation) {
+        this.loginLocation = loginLocation;
+    }
+
+    public String getBrowser() {
+        return browser;
+    }
+
+    public void setBrowser(String browser) {
+        this.browser = browser;
+    }
+
+    public String getOs() {
+        return os;
+    }
+
+    public void setOs(String os) {
+        this.os = os;
+    }
+
+    public Date getLastAccessTime() {
+        return lastAccessTime;
+    }
+
+    public void setLastAccessTime(Date lastAccessTime) {
+        this.lastAccessTime = lastAccessTime;
+    }
+
+    public OnlineStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(OnlineStatus status) {
+        this.status = status;
+    }
+}

+ 10 - 0
leiSP-system/src/main/java/com/sooka/system/domain/SysDept.java

@@ -57,6 +57,16 @@ public class SysDept extends BaseEntity
 
     private Integer childcount;
 
+    private Integer userCount;
+
+    public Integer getUserCount() {
+        return userCount;
+    }
+
+    public void setUserCount(Integer userCount) {
+        this.userCount = userCount;
+    }
+
     public Integer getChildcount() {
         return childcount;
     }

+ 5 - 0
leiSP-system/src/main/java/com/sooka/system/mapper/SysDeptMapper.java

@@ -36,6 +36,8 @@ public interface SysDeptMapper
      */
     public List<SysDept> selectDeptList(SysDept dept);
 
+    public List<SysDept> onlineTreeData();
+
     /**
      * 删除部门管理信息
      * 
@@ -115,4 +117,7 @@ public interface SysDeptMapper
      * @return 子部门数
      */
     public int selectNormalChildrenDeptById(Long deptId);
+
+    public int onlineUserCount(String deptName);
+
 }

+ 4 - 0
leiSP-system/src/main/java/com/sooka/system/mapper/SysUserMapper.java

@@ -22,6 +22,8 @@ public interface SysUserMapper
 
     public List<SysUser> selectUserList(SysUser sysUser);
 
+    public List<SysUser> selectList(SysUser sysUser);
+
     /**
      * 根据用户ID查询用户列表
      *
@@ -149,4 +151,6 @@ public interface SysUserMapper
      * @return 结果
      */
     public SysUser checkEmailUnique(String email);
+
+
 }

+ 2 - 0
leiSP-system/src/main/java/com/sooka/system/mapper/SysUserOnlineMapper.java

@@ -42,6 +42,8 @@ public interface SysUserOnlineMapper
      */
     public List<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline);
 
+    public List<SysUserOnline> selectUserOnlineListByDept(Long deptId);
+
     /**
      * 查询过期会话集合
      * 

+ 2 - 0
leiSP-system/src/main/java/com/sooka/system/service/ISysDeptService.java

@@ -28,6 +28,8 @@ public interface ISysDeptService
      */
     public List<Ztree> selectDeptTree(SysDept dept);
 
+    public List<Ztree> onlineTreeData();
+
     /**
      * 查询部门管理树(排除下级)
      * 

+ 2 - 0
leiSP-system/src/main/java/com/sooka/system/service/ISysUserService.java

@@ -19,6 +19,8 @@ public interface ISysUserService
      */
     public List<SysUser> selectUserList(SysUser user);
 
+    public List<SysUser> selectList(SysUser user);
+
     /**
      * 根据条件分页查询已分配用户角色列表
      * 

+ 23 - 0
leiSP-system/src/main/java/com/sooka/system/service/impl/SysDeptServiceImpl.java

@@ -61,6 +61,29 @@ public class SysDeptServiceImpl implements ISysDeptService
         return ztrees;
     }
 
+    @Override
+    public List<Ztree> onlineTreeData() {
+        List<SysDept> deptList = deptMapper.onlineTreeData();
+        List<Ztree> ztrees = initOnlineZtree(deptList);
+        return ztrees;
+    }
+
+    public List<Ztree> initOnlineZtree(List<SysDept> deptList) {
+        List<Ztree> ztrees = new ArrayList<Ztree>();
+        for (SysDept dept : deptList) {
+            if (UserConstants.DEPT_NORMAL.equals(dept.getStatus())) {
+                int onlineUserCount = deptMapper.onlineUserCount(dept.getDeptName());
+                Ztree ztree = new Ztree();
+                ztree.setId(dept.getDeptId());
+                ztree.setpId(dept.getParentId());
+                ztree.setName(dept.getDeptName() + "(" + onlineUserCount + "/" + dept.getUserCount() + ")");
+                ztree.setTitle(dept.getDeptName());
+                ztrees.add(ztree);
+            }
+        }
+        return ztrees;
+    }
+
     /**
      * 查询部门管理树(排除下级)
      *

+ 6 - 0
leiSP-system/src/main/java/com/sooka/system/service/impl/SysUserServiceImpl.java

@@ -74,6 +74,7 @@ public class SysUserServiceImpl implements ISysUserService
         return ls;
     }
 
+
     /**
      * 根据条件分页查询已分配用户角色列表
      *
@@ -524,4 +525,9 @@ public class SysUserServiceImpl implements ISysUserService
     {
         return userMapper.updateUser(user);
     }
+
+    @Override
+    public List<SysUser> selectList(SysUser user) {
+        return this.userMapper.selectList(user);
+    }
 }

+ 149 - 120
leiSP-system/src/main/resources/mapper/system/SysDeptMapper.xml

@@ -1,30 +1,30 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sooka.system.mapper.SysDeptMapper">
 
-	<resultMap type="SysDept" id="SysDeptResult">
-		<id     property="deptId"     column="dept_id"     />
-		<result property="parentId"   column="parent_id"   />
-		<result property="ancestors"  column="ancestors"   />
-		<result property="deptName"   column="dept_name"   />
-		<result property="forestdeptType"   column="forestdept_type"   />
-		<result property="orderNum"   column="order_num"   />
-		<result property="leader"     column="leader"      />
-		<result property="phone"      column="phone"       />
-		<result property="email"      column="email"       />
-		<result property="status"     column="status"      />
-		<result property="delFlag"    column="del_flag"    />
-		<result property="parentName" column="parent_name" />
-		<result property="createBy"   column="create_by"   />
-		<result property="createTime" column="create_time" />
-		<result property="updateBy"   column="update_by"   />
-		<result property="updateTime" column="update_time" />
-		<result property="childcount" column="childcount" />
-	</resultMap>
-
-	<sql id="selectDeptVo">
+    <resultMap type="SysDept" id="SysDeptResult">
+        <id property="deptId" column="dept_id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="ancestors" column="ancestors"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="forestdeptType" column="forestdept_type"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="leader" column="leader"/>
+        <result property="phone" column="phone"/>
+        <result property="email" column="email"/>
+        <result property="status" column="status"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="parentName" column="parent_name"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="childcount" column="childcount"/>
+    </resultMap>
+
+    <sql id="selectDeptVo">
         select d.forestdept_type, d.dept_id, d.parent_id, d.ancestors, d.dept_name,
         d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by,
         d.create_time,
@@ -33,7 +33,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         from sys_dept d
     </sql>
 
-	<select id="selectRoleDeptTree" parameterType="Long" resultType="String">
+    <select id="selectRoleDeptTree" parameterType="Long" resultType="String">
 		select concat(d.dept_id, d.dept_name) as dept_name
 		from sys_dept d
 			left join sys_role_dept rd on d.dept_id = rd.dept_id
@@ -41,127 +41,156 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		order by d.parent_id, d.order_num
 	</select>
 
-	<select id="selectDeptList" parameterType="SysDept" resultMap="SysDeptResult">
+    <select id="selectDeptList" parameterType="SysDept" resultMap="SysDeptResult">
         <include refid="selectDeptVo"/>
         where d.del_flag = '0'
         <if test="parentId != null">
-			AND parent_id = #{parentId}
-		</if>
-		<if test="deptName != null and deptName != ''">
-			AND dept_name like concat('%', #{deptName}, '%')
-		</if>
-		<if test="status != null and status != ''">
-			AND status = #{status}
-		</if>
-		<!-- 数据范围过滤 -->
-		${params.dataScope}
-		order by d.parent_id, d.order_num
+            AND parent_id = #{parentId}
+        </if>
+        <if test="deptName != null and deptName != ''">
+            AND dept_name like concat('%', #{deptName}, '%')
+        </if>
+        <if test="status != null and status != ''">
+            AND status = #{status}
+        </if>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+        order by d.parent_id, d.order_num
     </select>
 
-	<select id="checkDeptExistUser" parameterType="Long" resultType="int">
+    <select id="checkDeptExistUser" parameterType="Long" resultType="int">
 		select count(1) from sys_user where dept_id = #{deptId} and del_flag = '0'
 	</select>
 
-	<select id="selectDeptCount" parameterType="SysDept" resultType="int">
-		select count(1) from sys_dept
-		where del_flag = '0'
-		<if test="deptId != null and deptId != 0"> and dept_id = #{deptId} </if>
-		<if test="parentId != null and parentId != 0"> and parent_id = #{parentId} </if>
-	</select>
+    <select id="selectDeptCount" parameterType="SysDept" resultType="int">
+        select count(1) from sys_dept
+        where del_flag = '0'
+        <if test="deptId != null and deptId != 0">and dept_id = #{deptId}</if>
+        <if test="parentId != null and parentId != 0">and parent_id = #{parentId}</if>
+    </select>
 
-	<select id="checkDeptNameUnique" resultMap="SysDeptResult">
-	    <include refid="selectDeptVo"/>
-		where dept_name=#{deptName} and parent_id = #{parentId}
-	</select>
+    <select id="checkDeptNameUnique" resultMap="SysDeptResult">
+        <include refid="selectDeptVo"/>
+        where dept_name=#{deptName} and parent_id = #{parentId}
+    </select>
 
-	<select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
+    <select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
 		select d.forestdept_type, d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status,
 			(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
 		from sys_dept d
 		where d.dept_id = #{deptId}
 	</select>
 
-	<select id="selectChildrenDeptById" parameterType="Long" resultMap="SysDeptResult">
+    <select id="selectChildrenDeptById" parameterType="Long" resultMap="SysDeptResult">
 		select * from sys_dept where find_in_set(#{deptId}, ancestors)
 	</select>
 
-	<select id="selectNormalChildrenDeptById" parameterType="Long" resultType="int">
+    <select id="selectNormalChildrenDeptById" parameterType="Long" resultType="int">
 		select count(*) from sys_dept where status = 0 and del_flag = '0' and find_in_set(#{deptId}, ancestors)
 	</select>
 
-	<insert id="insertDept" parameterType="SysDept">
- 		insert into sys_dept(
- 			<if test="deptId != null and deptId != 0">dept_id,</if>
- 			<if test="parentId != null and parentId != 0">parent_id,</if>
- 			<if test="deptName != null and deptName != ''">dept_name,</if>
- 			<if test="forestdeptType != null and forestdeptType != ''">forestdept_type,</if>
- 			<if test="ancestors != null and ancestors != ''">ancestors,</if>
- 			<if test="orderNum != null and orderNum != ''">order_num,</if>
- 			<if test="leader != null and leader != ''">leader,</if>
- 			<if test="phone != null and phone != ''">phone,</if>
- 			<if test="email != null and email != ''">email,</if>
- 			<if test="status != null">status,</if>
- 			<if test="createBy != null and createBy != ''">create_by,</if>
- 			create_time
- 		)values(
- 			<if test="deptId != null and deptId != 0">#{deptId},</if>
- 			<if test="parentId != null and parentId != 0">#{parentId},</if>
- 			<if test="deptName != null and deptName != ''">#{deptName},</if>
- 			<if test="forestdeptType != null and forestdeptType != ''">#{forestdeptType},</if>
- 			<if test="ancestors != null and ancestors != ''">#{ancestors},</if>
- 			<if test="orderNum != null and orderNum != ''">#{orderNum},</if>
- 			<if test="leader != null and leader != ''">#{leader},</if>
- 			<if test="phone != null and phone != ''">#{phone},</if>
- 			<if test="email != null and email != ''">#{email},</if>
- 			<if test="status != null">#{status},</if>
- 			<if test="createBy != null and createBy != ''">#{createBy},</if>
- 			sysdate()
- 		)
-	</insert>
-
-	<update id="updateDept" parameterType="SysDept">
- 		update sys_dept
- 		<set>
- 			<if test="parentId != null and parentId != 0">parent_id = #{parentId},</if>
- 			<if test="deptName != null and deptName != ''">dept_name = #{deptName},</if>
- 			<if test="forestdeptType != null and forestdeptType != ''">forestdept_type = #{forestdeptType},</if>
- 			<if test="ancestors != null and ancestors != ''">ancestors = #{ancestors},</if>
- 			<if test="orderNum != null and orderNum != ''">order_num = #{orderNum},</if>
- 			<if test="leader != null">leader = #{leader},</if>
- 			<if test="phone != null">phone = #{phone},</if>
- 			<if test="email != null">email = #{email},</if>
- 			<if test="status != null and status != ''">status = #{status},</if>
- 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
- 			update_time = sysdate()
- 		</set>
- 		where dept_id = #{deptId}
-	</update>
-
-	<update id="updateDeptChildren" parameterType="java.util.List">
-	    update sys_dept set ancestors =
-	    <foreach collection="depts" item="item" index="index"
-	        separator=" " open="case dept_id" close="end">
-	        when #{item.deptId} then #{item.ancestors}
-	    </foreach>
-	    where dept_id in
-	    <foreach collection="depts" item="item" index="index"
-	        separator="," open="(" close=")">
-	        #{item.deptId}
-	    </foreach>
-	 </update>
-
-	<delete id="deleteDeptById" parameterType="Long">
+    <insert id="insertDept" parameterType="SysDept">
+        insert into sys_dept(
+        <if test="deptId != null and deptId != 0">dept_id,</if>
+        <if test="parentId != null and parentId != 0">parent_id,</if>
+        <if test="deptName != null and deptName != ''">dept_name,</if>
+        <if test="forestdeptType != null and forestdeptType != ''">forestdept_type,</if>
+        <if test="ancestors != null and ancestors != ''">ancestors,</if>
+        <if test="orderNum != null and orderNum != ''">order_num,</if>
+        <if test="leader != null and leader != ''">leader,</if>
+        <if test="phone != null and phone != ''">phone,</if>
+        <if test="email != null and email != ''">email,</if>
+        <if test="status != null">status,</if>
+        <if test="createBy != null and createBy != ''">create_by,</if>
+        create_time
+        )values(
+        <if test="deptId != null and deptId != 0">#{deptId},</if>
+        <if test="parentId != null and parentId != 0">#{parentId},</if>
+        <if test="deptName != null and deptName != ''">#{deptName},</if>
+        <if test="forestdeptType != null and forestdeptType != ''">#{forestdeptType},</if>
+        <if test="ancestors != null and ancestors != ''">#{ancestors},</if>
+        <if test="orderNum != null and orderNum != ''">#{orderNum},</if>
+        <if test="leader != null and leader != ''">#{leader},</if>
+        <if test="phone != null and phone != ''">#{phone},</if>
+        <if test="email != null and email != ''">#{email},</if>
+        <if test="status != null">#{status},</if>
+        <if test="createBy != null and createBy != ''">#{createBy},</if>
+        sysdate()
+        )
+    </insert>
+
+    <update id="updateDept" parameterType="SysDept">
+        update sys_dept
+        <set>
+            <if test="parentId != null and parentId != 0">parent_id = #{parentId},</if>
+            <if test="deptName != null and deptName != ''">dept_name = #{deptName},</if>
+            <if test="forestdeptType != null and forestdeptType != ''">forestdept_type = #{forestdeptType},</if>
+            <if test="ancestors != null and ancestors != ''">ancestors = #{ancestors},</if>
+            <if test="orderNum != null and orderNum != ''">order_num = #{orderNum},</if>
+            <if test="leader != null">leader = #{leader},</if>
+            <if test="phone != null">phone = #{phone},</if>
+            <if test="email != null">email = #{email},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            update_time = sysdate()
+        </set>
+        where dept_id = #{deptId}
+    </update>
+
+    <update id="updateDeptChildren" parameterType="java.util.List">
+        update sys_dept set ancestors =
+        <foreach collection="depts" item="item" index="index"
+                 separator=" " open="case dept_id" close="end">
+            when #{item.deptId} then #{item.ancestors}
+        </foreach>
+        where dept_id in
+        <foreach collection="depts" item="item" index="index"
+                 separator="," open="(" close=")">
+            #{item.deptId}
+        </foreach>
+    </update>
+
+    <delete id="deleteDeptById" parameterType="Long">
 		update sys_dept set del_flag = '2' where dept_id = #{deptId}
 	</delete>
 
-	<update id="updateDeptStatus" parameterType="SysDept">
- 	    update sys_dept
- 	    <set>
- 	        <if test="status != null and status != ''">status = #{status},</if>
- 	        <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
- 	        update_time = sysdate()
+    <update id="updateDeptStatus" parameterType="SysDept">
+        update sys_dept
+        <set>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            update_time = sysdate()
         </set>
- 	    where dept_id in (${ancestors})
-	</update>
+        where dept_id in (${ancestors})
+    </update>
+
+
+    <select id="onlineUserCount" parameterType="String" resultType="int">
+		select count(sessionId) from sys_user_online where dept_name = #{deptName}
+	</select>
+
+    <select id="onlineTreeData" resultMap="SysDeptResult">
+		SELECT
+            d.dept_id,
+            d.parent_id,
+            d.ancestors,
+            d.dept_name,
+            d.order_num,
+            d.STATUS,
+            d.del_flag,
+            COUNT( u.user_id ) AS userCount
+        FROM
+            sys_user u,
+            sys_dept d
+        WHERE
+            u.dept_id = d.dept_id
+            AND d.del_flag = '0'
+            AND u.del_flag = '0'
+        GROUP BY
+            u.dept_id
+        ORDER BY
+            d.parent_id,
+            d.order_num
+	</select>
 
 </mapper>

+ 20 - 0
leiSP-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -319,4 +319,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  		)
 	</insert>
 
+	<select id="selectList" parameterType="SysUser" resultMap="SysUserResult">
+		select u.pinyin_short,u.pinyin_first,u.pinyin_full,u.user_id, u.dept_id,u.org_dept_id,
+		u.login_name, u.user_name, u.user_type, u.email, u.avatar,
+		u.phonenumber, u.password, u.sex, u.salt, u.status, u.del_flag,
+		u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader,u.issendmsg,u.isjgmsg,u.iscamera
+		from sys_user u
+		left join sys_dept d on u.dept_id = d.dept_id
+		where u.del_flag = '0'
+		<if test="loginName != null and loginName != ''">
+			AND u.login_name like concat('%', #{loginName}, '%')
+		</if>
+		<if test="phonenumber != null and phonenumber != ''">
+			AND u.phonenumber like concat('%', #{phonenumber}, '%')
+		</if>
+		<if test="deptId != null and deptId != 0">
+			AND u.dept_id = #{deptId}
+		</if>
+		order by u.dept_id
+	</select>
+
 </mapper>

+ 7 - 0
leiSP-system/src/main/resources/mapper/system/SysUserOnlineMapper.xml

@@ -54,4 +54,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		WHERE o.last_access_time <![CDATA[ <= ]]> #{lastAccessTime} ORDER BY o.last_access_time ASC
 	</select>
 
+	<select id="selectUserOnlineListByDept" parameterType="Long" resultMap="SysUserOnlineResult">
+		SELECT o.sessionId, o.login_name, o.dept_name, o.ipaddr, o.login_location, o.browser, o.os, o.status, o.start_timestamp, o.last_access_time, o.expire_time
+		FROM sys_user_online o
+		LEFT JOIN sys_dept d ON d.dept_name = o.dept_name
+		WHERE d.dept_id = #{deptId}
+	</select>
+
 </mapper>