From 29a0abce7031a028803b7d2bc3edaaa4aecc8abd Mon Sep 17 00:00:00 2001 From: yy <2@2.com> Date: Mon, 3 Jun 2024 09:05:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...sourceOwnerBaseAuthenticationProvider.java | 6 +- .../admin/controller/SysUserController.java | 32 +- .../service/impl/SysUserServiceImpl.java | 34 +- .../rax/vital/handler/mysql/ChatHandler.java | 45 +- .../vital/handler/mysql/MedicineHandler.java | 44 +- .../service/impl/ChatServiceImpl.java | 34 +- .../main/resources/mapper/SysUserMapper.xml | 390 +++++++++--------- 7 files changed, 327 insertions(+), 258 deletions(-) diff --git a/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index 0bf8021..9343dcb 100644 --- a/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -224,7 +224,7 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); String previousAccessToken = redisTemplate.opsForValue().get(LOGGED_IN + username + "::a::"); @@ -321,6 +321,6 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider rolesByUserId = roleService.findRolesByUserId(raxUser.getId()); + boolean isAdmin = false; + for (SysRole role: rolesByUserId) { + if (ADMIN_ROLE_CODE.equals(role.getRoleCode())) { + isAdmin = true; + break; + } + } + if (!isAdmin) { + return R.ok(new Page<>()); + } + } return R.ok(userService.getUsersWithRolePage(page, userDTO)); } @@ -196,6 +225,7 @@ public class SysUserController { * @return 用户集合 */ @PostMapping("/list") + @PreAuthorize("@pms.hasPermission('sys_user_list')") public R getUserPage(Page page, String name) { return R.ok(userService.getUsersPage(page, name)); } diff --git a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysUserServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysUserServiceImpl.java index 2e9a830..ab9450e 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysUserServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysUserServiceImpl.java @@ -74,7 +74,9 @@ public class SysUserServiceImpl extends ServiceImpl impl private final RedisTemplate redisTemplate; - private final static String PASSWD_PATTERN = "^(?=.*\\d)(?=.*[a-zA-Z])(?=.*[^\\da-zA-Z\\s]).{9,15}$"; + private final static String PASSWD_PATTERN = "^[a-zA-Z0-9]{8,16}$"; + + private final static String ACCOUNT_PATTERN = "^[a-zA-Z0-9]{2,16}$"; private final SysUserMapper userMapper; @@ -94,7 +96,10 @@ public class SysUserServiceImpl extends ServiceImpl impl sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); sysUser.setCreateBy(userDto.getUsername()); sysUser.setPassword(ENCODER.encode(userDto.getPassword())); - sysUser.setHospitalId(Long.valueOf(sysHospitalService.getCurrentHospital())); + String hosptital = sysHospitalService.getCurrentHospital(); + if (StringUtils.hasText(hosptital) && !"null".equals(hosptital)) { + sysUser.setHospitalId(Long.valueOf(hosptital)); + } baseMapper.insert(sysUser); // 保存用户岗位信息 Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { @@ -412,6 +417,18 @@ public class SysUserServiceImpl extends ServiceImpl impl } else { return R.failed("验证码已失效"); } + + boolean matches = Pattern.matches(PASSWD_PATTERN, userDto.getPassword()); + if (!matches) { + return R.failed("密码至少8~16位字母或数字(区分大小写)"); + } + + boolean accountMatches = Pattern.matches(ACCOUNT_PATTERN, userDto.getUsername()); + if (!accountMatches) { + return R.failed("用户名至少2~16位字母或数字(区分大小写)"); + } + + // 判断用户名是否存在 SysUser sysUser = this.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); if (sysUser != null) { @@ -459,6 +476,13 @@ public class SysUserServiceImpl extends ServiceImpl impl if (StrUtil.isEmpty(userDto.getNewpassword1())) { return R.failed("新密码不能为空"); } + + boolean matches = Pattern.matches(PASSWD_PATTERN, userDto.getNewpassword1()); + if (!matches) { + return R.failed("密码至少8~16位字母或数字(区分大小写)"); + } + + String password = ENCODER.encode(userDto.getNewpassword1()); this.update(Wrappers.lambdaUpdate() @@ -494,9 +518,11 @@ public class SysUserServiceImpl extends ServiceImpl impl boolean matches = Pattern.matches(PASSWD_PATTERN, userDto.getPassword()); if (!matches) { - return R.failed("密码至少包含字母、数字、特殊字符,不少于9位,最多15位"); + return R.failed("密码至少8~16位字母或数字(区分大小写)"); } - + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); + // 立即删除 + cache.evictIfPresent(userDto.getUsername()); String password = ENCODER.encode(userDto.getPassword()); this.update(Wrappers.lambdaUpdate() .set(SysUser::getPassword, password) diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/ChatHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/ChatHandler.java index 2623c81..d3f3072 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/ChatHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/ChatHandler.java @@ -14,6 +14,9 @@ import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; public class ChatHandler implements WebSocketHandler { @Resource @@ -22,7 +25,7 @@ public class ChatHandler implements WebSocketHandler { @Resource private ChatService chatService; - private Map timerTaskMap = new ConcurrentHashMap(); + private Map timerTaskMap = new ConcurrentHashMap(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { @@ -73,34 +76,30 @@ public class ChatHandler implements WebSocketHandler { private void startHeartbeat(WebSocketSession session) { if (!timerTaskMap.containsKey(session.getId())) { - TimerTask timerTask = new TimerTask() { - @Override - public void run() { - try { - if (session.isOpen()) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("msgType", "heartbeat"); - session.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); - } else { - stopHeartbeat(session); - chatService.stopTask(session.getId()); - session.close(); - } - } catch (Exception e) { - e.printStackTrace(); + ScheduledExecutorService heartbeatExecutor = Executors.newScheduledThreadPool(1); + heartbeatExecutor.scheduleAtFixedRate(() -> { + try { + if (session.isOpen()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("msgType", "heartbeat"); + session.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); + } else { stopHeartbeat(session); + chatService.stopTask(session.getId()); + session.close(); } + } catch (Exception e) { + e.printStackTrace(); + stopHeartbeat(session); } - }; - // 定时任务,设置1秒 - Timer timer = new Timer(); - timer.schedule(timerTask, 0, 1000); - timerTaskMap.put(session.getId(), timerTask); + }, 0, 10, TimeUnit.SECONDS); + timerTaskMap.put(session.getId(), heartbeatExecutor); } } private void stopHeartbeat(WebSocketSession session) { - TimerTask timerTask = timerTaskMap.get(session.getId()); - timerTask.cancel(); + ScheduledExecutorService heartbeatExecutor = timerTaskMap.get(session.getId()); + heartbeatExecutor.shutdownNow(); } + } diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MedicineHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MedicineHandler.java index e6426eb..fc05935 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MedicineHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MedicineHandler.java @@ -24,7 +24,9 @@ public class MedicineHandler implements WebSocketHandler { @Resource private OAuth2AuthorizationService authorizationService; - private Map timerTaskMap = new ConcurrentHashMap(); +// private Map timerTaskMap = new ConcurrentHashMap(); + + private Map timerTaskMap = new ConcurrentHashMap(); @Override public void afterConnectionEstablished(WebSocketSession session) { @@ -71,34 +73,30 @@ public class MedicineHandler implements WebSocketHandler { private void startHeartbeat(WebSocketSession session) { if (!timerTaskMap.containsKey(session.getId())) { - TimerTask timerTask = new TimerTask() { - @Override - public void run() { - try { - if (session.isOpen()) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("msgType", "heartbeat"); - session.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); - } else { - session.close(); - stopHeartbeat(session); - vitalSignTimerWS.stopTimerTask(session.getId()); - } - } catch (Exception e) { - e.printStackTrace(); + ScheduledExecutorService heartbeatExecutor = Executors.newScheduledThreadPool(1); + heartbeatExecutor.scheduleAtFixedRate(() -> { + try { + if (session.isOpen()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("msgType", "heartbeat"); + session.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); + } else { + session.close(); stopHeartbeat(session); + vitalSignTimerWS.stopTimerTask(session.getId()); } + } catch (Exception e) { + e.printStackTrace(); + stopHeartbeat(session); } - }; - // 定时任务,设置1秒 - Timer timer = new Timer(); - timer.schedule(timerTask, 0, 1000); - timerTaskMap.put(session.getId(), timerTask); + }, 0, 10, TimeUnit.SECONDS); + timerTaskMap.put(session.getId(), heartbeatExecutor); } } private void stopHeartbeat(WebSocketSession session) { - TimerTask timerTask = timerTaskMap.get(session.getId()); - timerTask.cancel(); + ScheduledExecutorService heartbeatExecutor = timerTaskMap.get(session.getId()); + heartbeatExecutor.shutdownNow(); } + } diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java index 58add7e..7a7f207 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java @@ -22,10 +22,7 @@ import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import java.io.IOException; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.sql.Statement; +import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -178,6 +175,27 @@ public class ChatServiceImpl implements ChatService { sessionMap.put(session.getId(), session); } } + + String sql = "select content, create_time \"creatTime\", create_user \"createUser\", create_name \"createName\" from t_chat where deleted = 0 and revoked = 0 order by create_time asc "; + Connection connection = dataSource.getConnection(); + try { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(sql); + while (resultSet.next()) { + Map map = new HashMap(); + map.put("content", resultSet.getString("content")); + map.put("creatTime", resultSet.getString("creatTime")); + map.put("createUser", resultSet.getString("createUser")); + map.put("createName", resultSet.getString("createName")); + history.add(map); + } + JSONObject param = new JSONObject(); + param.put("history", history); + param.put("msgType", "msg"); + session.sendMessage(new TextMessage(param.toJSONString().getBytes())); + } catch (Exception e) { + e.printStackTrace(); + } } else { JSONObject jsonObject = new JSONObject(); jsonObject.put("status", 1); @@ -193,10 +211,10 @@ public class ChatServiceImpl implements ChatService { } } - SysUser sysUser = SysUserService.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - if (StringUtils.hasText(msg)) { JSONObject param = new JSONObject(); + SysUser sysUser = SysUserService.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); + Connection connection = dataSource.getConnection(); try { Statement statement = connection.createStatement(); @@ -238,8 +256,8 @@ public class ChatServiceImpl implements ChatService { e.printStackTrace(); } - Map sessionMap = databaseSessionMap.get(databaseName); - for (Map.Entry entry : sessionMap.entrySet()) { + Map sessionMap1 = databaseSessionMap.get(databaseName); + for (Map.Entry entry : sessionMap1.entrySet()) { WebSocketSession value = entry.getValue(); try { value.sendMessage(new TextMessage(param.toJSONString().getBytes())); diff --git a/upms/upms-biz/src/main/resources/mapper/SysUserMapper.xml b/upms/upms-biz/src/main/resources/mapper/SysUserMapper.xml index 2360a3a..43216ce 100644 --- a/upms/upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/upms/upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -1,148 +1,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - u.user_id, - u.username, - u.password, - u.salt, - u.phone, - u.avatar, - u.wx_openid, - u.qq_openid, - u.dept_id, - u.del_flag, - u.lock_flag, - u.create_by, - u.create_time ucreate_time, - u.update_time uupdate_time, - r.role_id, - r.role_name, - r.role_code, - r.role_desc, - r.create_time rcreate_time, - r.update_time rupdate_time - - - - u.user_id, - u.username, - u.password, - u.salt, - u.phone, - u.avatar, - u.wx_openid, - u.qq_openid, - u.del_flag, - u.lock_flag, - u.nickname, - u.name, - u.email, - u.create_by, - u.create_time ucreate_time, - u.update_time uupdate_time, - d.name dept_name, - d.dept_id - - - - - - - - - + SELECT + + FROM sys_user u + LEFT JOIN sys_user_role urole ON urole.user_id = u.user_id + LEFT JOIN sys_role r ON r.role_id = urole.role_id and r.del_flag = '0' + WHERE u.username = #{username} + and u.del_flag = '0' + + + + + + + - + SELECT u.user_id, + u.username, + u.password, + u.salt, + u.phone, + u.avatar, + u.wx_openid, + u.qq_openid, + u.dept_id, + u.create_by, + u.create_time ucreate_time, + u.update_time uupdate_time, + u.del_flag, + u.lock_flag, + u.nickname, + u.name, + u.email, + d.name dept_name + FROM sys_user u + LEFT JOIN sys_dept d ON d.dept_id = u.dept_id + + u.del_flag = '0' + + + AND u.username LIKE #{usernameLike} + + + AND u.dept_id = #{query.deptId} + + - - ORDER BY u.create_time DESC - - + + ORDER BY u.create_time DESC + + - update sys_user set del_flag = 1 + update sys_user + set del_flag = 1 where + select count(*) + from sys_user + where del_flag = 0 and user_id != '1' + -