pom.xml
@@ -36,7 +36,7 @@ <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version> <lombok.version>1.18.34</lombok.version> <bouncycastle.version>1.76</bouncycastle.version> <justauth.version>1.16.6</justauth.version> <justauth.version>1.16.7</justauth.version> <!-- 离线IPå°åå®ä½åº --> <ip2region.version>2.7.0</ip2region.version> ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -14,6 +14,7 @@ import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.dto.PostDTO; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.enums.LoginType; @@ -60,6 +61,7 @@ private final ISysSocialService sysSocialService; private final ISysRoleService roleService; private final ISysDeptService deptService; private final ISysPostService postService; private final SysUserMapper userMapper; @@ -148,21 +150,24 @@ */ public LoginUser buildLoginUser(SysUserVo user) { LoginUser loginUser = new LoginUser(); Long userId = user.getUserId(); loginUser.setTenantId(user.getTenantId()); loginUser.setUserId(user.getUserId()); loginUser.setUserId(userId); loginUser.setDeptId(user.getDeptId()); loginUser.setUsername(user.getUserName()); loginUser.setNickname(user.getNickName()); loginUser.setUserType(user.getUserType()); loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId())); loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId())); loginUser.setMenuPermission(permissionService.getMenuPermission(userId)); loginUser.setRolePermission(permissionService.getRolePermission(userId)); if (ObjectUtil.isNotNull(user.getDeptId())) { Opt<SysDeptVo> deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); } List<SysRoleVo> roles = roleService.selectRolesByUserId(user.getUserId()); List<SysRoleVo> roles = roleService.selectRolesByUserId(userId); List<SysPostVo> posts = postService.selectPostsByUserId(userId); loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); loginUser.setPosts(BeanUtil.copyToList(posts, PostDTO.class)); return loginUser; } ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java
@@ -5,9 +5,17 @@ import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.config.AuthConfig; import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.request.AuthRequest; import me.zhyd.oauth.request.AuthWechatMiniProgramRequest; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.model.XcxLoginBody; import org.dromara.common.core.domain.model.XcxLoginUser; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.satoken.utils.LoginHelper; @@ -39,12 +47,24 @@ // å¤ä¸ªå°ç¨åºè¯å«ä½¿ç¨ String appid = loginBody.getAppid(); // todo 以ä¸èªè¡å®ç° // æ ¡éª appid + appsrcret + xcxCode è°ç¨ç»å½åè¯æ ¡éªæ¥å£ è·å session_key ä¸ openid String openid = ""; AuthRequest authRequest = new AuthWechatMiniProgramRequest(AuthConfig.builder() .clientId(appid).clientSecret("èªè¡å¡«åå¯é¥ 坿 ¹æ®ä¸åappidå¡«å ¥ä¸åå¯é¥") .ignoreCheckRedirectUri(true).ignoreCheckState(true).build()); AuthCallback authCallback = new AuthCallback(); authCallback.setCode(xcxCode); AuthResponse<AuthUser> resp = authRequest.login(authCallback); String openid, unionId; if (resp.ok()) { AuthToken token = resp.getData().getToken(); openid = token.getOpenId(); // 微信å°ç¨åºåªæå ³èå°å¾®ä¿¡å¼æ¾å¹³å°ä¸ä¹åæè½è·åå° unionIdï¼å æ¤unionIdä¸ä¸å®è½è¿åã unionId = token.getUnionId(); } else { throw new ServiceException(resp.getMsg()); } // æ¡æ¶ç»å½ä¸éå¶ä»ä»ä¹è¡¨æ¥è¯¢ åªè¦æç»æå»ºåº LoginUser å³å¯ SysUserVo user = loadUserByOpenid(openid); // æ¤å¤å¯æ ¹æ®ç»å½ç¨æ·çæ°æ®ä¸å èªè¡å建 loginUser 屿§ä¸å¤ç¨ç»§æ¿æ©å±å°±è¡äº XcxLoginUser loginUser = new XcxLoginUser(); loginUser.setTenantId(user.getTenantId()); ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ package org.dromara.common.core.domain.dto; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serial; import java.io.Serializable; /** * é¨é¨ * * @author AprilWind */ @Data @NoArgsConstructor public class DeptDTO implements Serializable { @Serial private static final long serialVersionUID = 1L; /** * é¨é¨ID */ private Long deptId; /** * ç¶é¨é¨ID */ private Long parentId; /** * é¨é¨åç§° */ private String deptName; } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/PostDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,46 @@ package org.dromara.common.core.domain.dto; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serial; import java.io.Serializable; /** * å²ä½ * * @author AprilWind */ @Data @NoArgsConstructor public class PostDTO implements Serializable { @Serial private static final long serialVersionUID = 1L; /** * å²ä½ID */ private Long postId; /** * é¨é¨id */ private Long deptId; /** * å²ä½ç¼ç */ private String postCode; /** * å²ä½åç§° */ private String postName; /** * å²ä½ç±»å«ç¼ç */ private String postCategory; } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java
@@ -1,8 +1,9 @@ package org.dromara.common.core.domain.model; import org.dromara.common.core.domain.dto.RoleDTO; import lombok.Data; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.PostDTO; import org.dromara.common.core.domain.dto.RoleDTO; import java.io.Serial; import java.io.Serializable; @@ -112,6 +113,11 @@ private List<RoleDTO> roles; /** * å²ä½å¯¹è±¡ */ private List<PostDTO> posts; /** * æ°æ®æé å½åè§è²ID */ private Long roleId; ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/FormatsType.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,146 @@ package org.dromara.common.core.enums; import lombok.AllArgsConstructor; import lombok.Getter; import org.dromara.common.core.utils.StringUtils; /* * æ¥ææ ¼å¼ * "yyyy"ï¼4使°ç年份ï¼ä¾å¦ï¼2023年表示为"2023"ã * "yy"ï¼2使°ç年份ï¼ä¾å¦ï¼2023年表示为"23"ã * "MM"ï¼2使°çæä»½ï¼åå¼èå´ä¸º01å°12ï¼ä¾å¦ï¼7æè¡¨ç¤ºä¸º"07"ã * "M"ï¼ä¸å¸¦å导é¶çæä»½ï¼åå¼èå´ä¸º1å°12ï¼ä¾å¦ï¼7æè¡¨ç¤ºä¸º"7"ã * "dd"ï¼2使°çæ¥æï¼åå¼èå´ä¸º01å°31ï¼ä¾å¦ï¼22æ¥è¡¨ç¤ºä¸º"22"ã * "d"ï¼ä¸å¸¦å导é¶çæ¥æï¼åå¼èå´ä¸º1å°31ï¼ä¾å¦ï¼22æ¥è¡¨ç¤ºä¸º"22"ã * "EEEE"ï¼ææçå ¨åï¼ä¾å¦ï¼ææä¸è¡¨ç¤ºä¸º"Wednesday"ã * "E"ï¼ææç缩åï¼ä¾å¦ï¼ææä¸è¡¨ç¤ºä¸º"Wed"ã * "DDD" æ "D"ï¼ä¸å¹´ä¸ç第å 天ï¼åå¼èå´ä¸º001å°366ï¼ä¾å¦ï¼ç¬¬200天表示为"200"ã * æ¶é´æ ¼å¼ * "HH"ï¼24å°æ¶å¶çå°æ¶æ°ï¼åå¼èå´ä¸º00å°23ï¼ä¾å¦ï¼ä¸å5ç¹è¡¨ç¤ºä¸º"17"ã * "hh"ï¼12å°æ¶å¶çå°æ¶æ°ï¼åå¼èå´ä¸º01å°12ï¼ä¾å¦ï¼ä¸å5ç¹è¡¨ç¤ºä¸º"05"ã * "mm"ï¼åéæ°ï¼åå¼èå´ä¸º00å°59ï¼ä¾å¦ï¼30åé表示为"30"ã * "ss"ï¼ç§æ°ï¼åå¼èå´ä¸º00å°59ï¼ä¾å¦ï¼45ç§è¡¨ç¤ºä¸º"45"ã * "SSS"ï¼æ¯«ç§æ°ï¼åå¼èå´ä¸º000å°999ï¼ä¾å¦ï¼123毫ç§è¡¨ç¤ºä¸º"123"ã */ /** * æ¥ææ ¼å¼ä¸æ¶é´æ ¼å¼æä¸¾ */ @Getter @AllArgsConstructor public enum FormatsType { /** * ä¾å¦ï¼2023年表示为"23" */ YY("yy"), /** * ä¾å¦ï¼2023年表示为"2023" */ YYYY("yyyy"), /** * ä¾ä¾å¦ï¼2023å¹´7æå¯ä»¥è¡¨ç¤ºä¸º "2023-07" */ YYYY_MM("yyyy-MM"), /** * ä¾å¦ï¼æ¥æ "2023å¹´7æ22æ¥" å¯ä»¥è¡¨ç¤ºä¸º "2023-07-22" */ YYYY_MM_DD("yyyy-MM-dd"), /** * ä¾å¦ï¼å½åæ¶é´å¦ææ¯ "2023å¹´7æ22æ¥ä¸å3ç¹30å"ï¼åå¯ä»¥è¡¨ç¤ºä¸º "2023-07-22 15:30" */ YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm"), /** * ä¾å¦ï¼å½åæ¶é´å¦ææ¯ "2023å¹´7æ22æ¥ä¸å3ç¹30å45ç§"ï¼åå¯ä»¥è¡¨ç¤ºä¸º "2023-07-22 15:30:45" */ YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss"), /** * ä¾å¦ï¼ä¸å3ç¹30å45ç§ï¼è¡¨ç¤ºä¸º "15:30:45" */ HH_MM_SS("HH:mm:ss"), /** * ä¾ä¾å¦ï¼2023å¹´7æå¯ä»¥è¡¨ç¤ºä¸º "2023/07" */ YYYY_MM_SLASH("yyyy/MM"), /** * ä¾å¦ï¼æ¥æ "2023å¹´7æ22æ¥" å¯ä»¥è¡¨ç¤ºä¸º "2023/07/22" */ YYYY_MM_DD_SLASH("yyyy/MM/dd"), /** * ä¾å¦ï¼å½åæ¶é´å¦ææ¯ "2023å¹´7æ22æ¥ä¸å3ç¹30å45ç§"ï¼åå¯ä»¥è¡¨ç¤ºä¸º "2023/07/22 15:30:45" */ YYYY_MM_DD_HH_MM_SLASH("yyyy/MM/dd HH:mm"), /** * ä¾å¦ï¼å½åæ¶é´å¦ææ¯ "2023å¹´7æ22æ¥ä¸å3ç¹30å45ç§"ï¼åå¯ä»¥è¡¨ç¤ºä¸º "2023/07/22 15:30:45" */ YYYY_MM_DD_HH_MM_SS_SLASH("yyyy/MM/dd HH:mm:ss"), /** * ä¾ä¾å¦ï¼2023å¹´7æå¯ä»¥è¡¨ç¤ºä¸º "2023.07" */ YYYY_MM_DOT("yyyy.MM"), /** * ä¾å¦ï¼æ¥æ "2023å¹´7æ22æ¥" å¯ä»¥è¡¨ç¤ºä¸º "2023.07.22" */ YYYY_MM_DD_DOT("yyyy.MM.dd"), /** * ä¾å¦ï¼å½åæ¶é´å¦ææ¯ "2023å¹´7æ22æ¥ä¸å3ç¹30å"ï¼åå¯ä»¥è¡¨ç¤ºä¸º "2023.07.22 15:30" */ YYYY_MM_DD_HH_MM_DOT("yyyy.MM.dd HH:mm"), /** * ä¾å¦ï¼å½åæ¶é´å¦ææ¯ "2023å¹´7æ22æ¥ä¸å3ç¹30å45ç§"ï¼åå¯ä»¥è¡¨ç¤ºä¸º "2023.07.22 15:30:45" */ YYYY_MM_DD_HH_MM_SS_DOT("yyyy.MM.dd HH:mm:ss"), /** * ä¾å¦ï¼2023å¹´7æå¯ä»¥è¡¨ç¤ºä¸º "202307" */ YYYYMM("yyyyMM"), /** * ä¾å¦ï¼2023å¹´7æ22æ¥å¯ä»¥è¡¨ç¤ºä¸º "20230722" */ YYYYMMDD("yyyyMMdd"), /** * ä¾å¦ï¼2023å¹´7æ22æ¥ä¸å3ç¹å¯ä»¥è¡¨ç¤ºä¸º "2023072215" */ YYYYMMDDHH("yyyyMMddHH"), /** * ä¾å¦ï¼2023å¹´7æ22æ¥ä¸å3ç¹30åå¯ä»¥è¡¨ç¤ºä¸º "202307221530" */ YYYYMMDDHHMM("yyyyMMddHHmm"), /** * ä¾å¦ï¼2023å¹´7æ22æ¥ä¸å3ç¹30å45ç§å¯ä»¥è¡¨ç¤ºä¸º "20230722153045" */ YYYYMMDDHHMMSS("yyyyMMddHHmmss"); /** * æ¶é´æ ¼å¼ */ private final String timeFormat; public static FormatsType getFormatsType(String str) { for (FormatsType value : values()) { if (StringUtils.contains(str, value.getTimeFormat())) { return value; } } throw new RuntimeException("'FormatsType' not found By " + str); } } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java
@@ -1,5 +1,9 @@ package org.dromara.common.core.service; import org.dromara.common.core.domain.dto.DeptDTO; import java.util.List; /** * éç¨ é¨é¨æå¡ * @@ -15,4 +19,19 @@ */ String selectDeptNameByIds(String deptIds); /** * æ ¹æ®é¨é¨IDæ¥è¯¢é¨é¨è´è´£äºº * * @param deptId é¨é¨IDï¼ç¨äºæå®éè¦æ¥è¯¢çé¨é¨ * @return è¿å该é¨é¨çè´è´£äººID */ Long selectDeptLeaderById(Long deptId); /** * æ¥è¯¢é¨é¨ * * @return é¨é¨å表 */ List<DeptDTO> selectDeptsByList(); } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,10 @@ package org.dromara.common.core.service; /** * éç¨ å²ä½æå¡ * * @author AprilWind */ public interface PostService { } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,10 @@ package org.dromara.common.core.service; /** * éç¨ è§è²æå¡ * * @author AprilWind */ public interface RoleService { } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java
@@ -82,4 +82,13 @@ * @return ç¨æ· */ List<UserDTO> selectUsersByDeptIds(List<Long> deptIds); /** * éè¿å²ä½IDæ¥è¯¢ç¨æ· * * @param postIds å²ä½ids * @return ç¨æ· */ List<UserDTO> selectUsersByPostIds(List<Long> postIds); } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java
@@ -3,16 +3,15 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.commons.lang3.time.DateFormatUtils; import org.dromara.common.core.enums.FormatsType; import org.dromara.common.core.exception.ServiceException; import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.*; import java.util.Date; import java.util.concurrent.TimeUnit; /** * æ¶é´å·¥å ·ç±» @@ -21,86 +20,137 @@ */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static final String YYYY = "yyyy"; public static final String YYYY_MM = "yyyy-MM"; public static final String YYYY_MM_DD = "yyyy-MM-dd"; public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; private static final String[] PARSE_PATTERNS = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; /** * è·åå½åDate忥æ * è·åå½åæ¥æåæ¶é´ * * @return Date() å½åæ¥æ * @return å½åæ¥æåæ¶é´ç Date 对象表示 */ public static Date getNowDate() { return new Date(); } /** * è·åå½åæ¥æ, é»è®¤æ ¼å¼ä¸ºyyyy-MM-dd * è·åå½åæ¥æçåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸ºYYYY-MM-DD * * @return String * @return å½åæ¥æçå符串表示 */ public static String getDate() { return dateTimeNow(YYYY_MM_DD); return dateTimeNow(FormatsType.YYYY_MM_DD); } /** * è·åå½åæ¥æçåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸ºyyyyMMdd * * @return å½åæ¥æçå符串表示 */ public static String getCurrentDate() { return DateFormatUtils.format(new Date(), FormatsType.YYYYMMDD.getTimeFormat()); } /** * è·åå½åæ¥æçè·¯å¾æ ¼å¼åç¬¦ä¸²ï¼æ ¼å¼ä¸º"yyyy/MM/dd" * * @return å½åæ¥æçè·¯å¾æ ¼å¼å符串 */ public static String datePath() { Date now = new Date(); return DateFormatUtils.format(now, FormatsType.YYYY_MM_DD_SLASH.getTimeFormat()); } /** * è·åå½åæ¶é´çåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸ºYYYY-MM-DD HH:MM:SS * * @return å½åæ¶é´çå符串表示 */ public static String getTime() { return dateTimeNow(YYYY_MM_DD_HH_MM_SS); return dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS); } /** * è·åå½åæ¶é´çåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸º "HH:MM:SS" * * @return å½åæ¶é´çåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸º "HH:MM:SS" */ public static String getTimeWithHourMinuteSecond() { return dateTimeNow(FormatsType.HH_MM_SS); } /** * è·åå½åæ¥æåæ¶é´çåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸ºYYYYMMDDHHMMSS * * @return å½åæ¥æåæ¶é´çå符串表示 */ public static String dateTimeNow() { return dateTimeNow(YYYYMMDDHHMMSS); return dateTimeNow(FormatsType.YYYYMMDDHHMMSS); } public static String dateTimeNow(final String format) { /** * è·åå½åæ¥æåæ¶é´çæå®æ ¼å¼çå符串表示 * * @param format æ¥ææ¶é´æ ¼å¼ï¼ä¾å¦"YYYY-MM-DD HH:MM:SS" * @return å½åæ¥æåæ¶é´çå符串表示 */ public static String dateTimeNow(final FormatsType format) { return parseDateToStr(format, new Date()); } public static String dateTime(final Date date) { return parseDateToStr(YYYY_MM_DD, date); /** * 尿宿¥ææ ¼å¼å为 YYYY-MM-DD æ ¼å¼çå符串 * * @param date è¦æ ¼å¼åçæ¥æå¯¹è±¡ * @return æ ¼å¼ååçæ¥æå符串 */ public static String formatDate(final Date date) { return parseDateToStr(FormatsType.YYYY_MM_DD, date); } public static String parseDateToStr(final String format, final Date date) { return new SimpleDateFormat(format).format(date); /** * 尿宿¥ææ ¼å¼å为 YYYY-MM-DD HH:MM:SS æ ¼å¼çå符串 * * @param date è¦æ ¼å¼åçæ¥æå¯¹è±¡ * @return æ ¼å¼ååçæ¥ææ¶é´å符串 */ public static String formatDateTime(final Date date) { return parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, date); } public static Date dateTime(final String format, final String ts) { /** * 尿宿¥ææç §æå®æ ¼å¼è¿è¡æ ¼å¼å * * @param format è¦ä½¿ç¨çæ¥ææ¶é´æ ¼å¼ï¼ä¾å¦"YYYY-MM-DD HH:MM:SS" * @param date è¦æ ¼å¼åçæ¥æå¯¹è±¡ * @return æ ¼å¼ååçæ¥ææ¶é´å符串 */ public static String parseDateToStr(final FormatsType format, final Date date) { return new SimpleDateFormat(format.getTimeFormat()).format(date); } /** * 尿宿 ¼å¼çæ¥ææ¶é´å符串转æ¢ä¸º Date 对象 * * @param format è¦è§£æçæ¥ææ¶é´æ ¼å¼ï¼ä¾å¦"YYYY-MM-DD HH:MM:SS" * @param ts è¦è§£æçæ¥ææ¶é´å符串 * @return è§£æåç Date 对象 * @throws RuntimeException å¦æè§£æè¿ç¨ä¸åçå¼å¸¸ */ public static Date parseDateTime(final FormatsType format, final String ts) { try { return new SimpleDateFormat(format).parse(ts); return new SimpleDateFormat(format.getTimeFormat()).parse(ts); } catch (ParseException e) { throw new RuntimeException(e); } } /** * æ¥æè·¯å¾ å³å¹´/æ/æ¥ å¦2018/08/08 */ public static String datePath() { Date now = new Date(); return DateFormatUtils.format(now, "yyyy/MM/dd"); } /** * æ¥æè·¯å¾ å³å¹´/æ/æ¥ å¦20180808 */ public static String dateTime() { Date now = new Date(); return DateFormatUtils.format(now, "yyyyMMdd"); } /** * æ¥æåå符串转åä¸ºæ¥æ æ ¼å¼ * å°å¯¹è±¡è½¬æ¢ä¸ºæ¥æå¯¹è±¡ * * @param str è¦è½¬æ¢ç对象ï¼é常æ¯å符串 * @return 转æ¢åçæ¥æå¯¹è±¡ï¼å¦æè½¬æ¢å¤±è´¥æè¾å ¥ä¸ºnullï¼åè¿ånull */ public static Date parseDate(Object str) { if (str == null) { @@ -115,6 +165,8 @@ /** * è·åæå¡å¨å¯å¨æ¶é´ * * @return æå¡å¨å¯å¨æ¶é´ç Date 对象表示 */ public static Date getServerStartDate() { long time = ManagementFactory.getRuntimeMXBean().getStartTime(); @@ -122,35 +174,66 @@ } /** * 计ç®ç¸å·®å¤©æ° * 计ç®ä¸¤ä¸ªæ¥æä¹é´ç天æ°å·®ï¼ä»¥æ¯«ç§ä¸ºåä½ï¼ * * @param date1 第ä¸ä¸ªæ¥æ * @param date2 第äºä¸ªæ¥æ * @return ä¸¤ä¸ªæ¥æä¹é´ç天æ°å·®çç»å¯¹å¼ */ public static int differentDaysByMillisecond(Date date1, Date date2) { return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); } /** * 计ç®ä¸¤ä¸ªæ¶é´å·® * 计ç®ä¸¤ä¸ªæ¥æä¹é´çæ¶é´å·®ï¼å¹¶ä»¥å¤©ãå°æ¶ååéçæ ¼å¼è¿å * * @param endDate ç»ææ¥æ * @param nowDate å½åæ¥æ * @return 表示æ¶é´å·®çåç¬¦ä¸²ï¼æ ¼å¼ä¸º"天 å°æ¶ åé" */ public static String getDatePoor(Date endDate, Date nowDate) { long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; // long ns = 1000; // è·å¾ä¸¤ä¸ªæ¶é´çæ¯«ç§æ¶é´å·®å¼ long diff = endDate.getTime() - nowDate.getTime(); // 计ç®å·®å¤å°å¤© long day = diff / nd; // 计ç®å·®å¤å°å°æ¶ long hour = diff % nd / nh; // 计ç®å·®å¤å°åé long min = diff % nd % nh / nm; // 计ç®å·®å¤å°ç§//è¾åºç»æ // long sec = diff % nd % nh % nm / ns; return day + "天" + hour + "å°æ¶" + min + "åé"; long diffInMillis = endDate.getTime() - nowDate.getTime(); long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; return String.format("%d天 %då°æ¶ %dåé", day, hour, min); } /** * å¢å LocalDateTime ==> Date * 计ç®ä¸¤ä¸ªæ¶é´ç¹çå·®å¼ï¼å¤©ãå°æ¶ãåéãç§ï¼ï¼å½å¼ä¸º0æ¶ä¸æ¾ç¤ºè¯¥åä½ * * @param endDate ç»ææ¶é´ * @param nowDate å½åæ¶é´ * @return æ¶é´å·®åç¬¦ä¸²ï¼æ ¼å¼ä¸º "x天 xå°æ¶ xåé xç§"ï¼è¥ä¸º 0 å䏿¾ç¤º */ public static String getTimeDifference(Date endDate, Date nowDate) { long diffInMillis = endDate.getTime() - nowDate.getTime(); long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; long sec = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60; // æå»ºæ¶é´å·®åç¬¦ä¸²ï¼æ¡ä»¶æ¯å¼ä¸ä¸º0ææ¾ç¤º StringBuilder result = new StringBuilder(); if (day > 0) { result.append(String.format("%d天 ", day)); } if (hour > 0) { result.append(String.format("%då°æ¶ ", hour)); } if (min > 0) { result.append(String.format("%dåé ", min)); } if (sec > 0) { result.append(String.format("%dç§", sec)); } return result.length() > 0 ? result.toString().trim() : "0ç§"; } /** * å° LocalDateTime 对象转æ¢ä¸º Date 对象 * * @param temporalAccessor è¦è½¬æ¢ç LocalDateTime 对象 * @return 转æ¢åç Date 对象 */ public static Date toDate(LocalDateTime temporalAccessor) { ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); @@ -158,11 +241,46 @@ } /** * å¢å LocalDate ==> Date * å° LocalDate 对象转æ¢ä¸º Date 对象 * * @param temporalAccessor è¦è½¬æ¢ç LocalDate 对象 * @return 转æ¢åç Date 对象 */ public static Date toDate(LocalDate temporalAccessor) { LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } /** * æ ¡éªæ¥æèå´ * * @param startDate å¼å§æ¥æ * @param endDate ç»ææ¥æ * @param maxValue æå¤§æ¶é´è·¨åº¦çéå¶å¼ * @param unit æ¶é´è·¨åº¦çåä½ï¼å¯éæ© "DAYS"ã"HOURS" æ "MINUTES" */ public static void validateDateRange(Date startDate, Date endDate, int maxValue, TimeUnit unit) { // æ ¡éªç»ææ¥æä¸è½æ©äºå¼å§æ¥æ if (endDate.before(startDate)) { throw new ServiceException("ç»ææ¥æä¸è½æ©äºå¼å§æ¥æ"); } // è®¡ç®æ¶é´è·¨åº¦ long diffInMillis = endDate.getTime() - startDate.getTime(); // æ ¹æ®åä½è½¬æ¢æ¶é´è·¨åº¦ long diff = switch (unit) { case DAYS -> TimeUnit.MILLISECONDS.toDays(diffInMillis); case HOURS -> TimeUnit.MILLISECONDS.toHours(diffInMillis); case MINUTES -> TimeUnit.MILLISECONDS.toMinutes(diffInMillis); default -> throw new IllegalArgumentException("䏿¯æçæ¶é´åä½"); }; // æ ¡éªæ¶é´è·¨åº¦ä¸è¶ è¿æå¤§éå¶ if (diff > maxValue) { throw new ServiceException("æå¤§æ¶é´è·¨åº¦ä¸º " + maxValue + " " + unit.toString().toLowerCase()); } } } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/Threads.java
@@ -14,18 +14,6 @@ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public class Threads { /** * sleepçå¾ ,åä½ä¸ºæ¯«ç§ */ public static void sleep(long milliseconds) { try { Thread.sleep(milliseconds); } catch (InterruptedException e) { return; } } /** * åæ¢çº¿ç¨æ± * å 使ç¨shutdown, åæ¢æ¥æ¶æ°ä»»å¡å¹¶å°è¯å®æææå·²åå¨ä»»å¡. ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/properties/MailProperties.java
@@ -43,7 +43,13 @@ private String pass; /** * åéæ¹ï¼éµå¾ªRFC-822æ å * åéæ¹ï¼éµå¾ªRFC-822æ å<br> * å件人å¯ä»¥æ¯ä»¥ä¸å½¢å¼ï¼ * * <pre> * 1. user@xxx.xx * 2. name <user@xxx.xx> * </pre> */ private String from; ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java
@@ -119,4 +119,9 @@ return (pageNum - 1) * pageSize; } public PageQuery(Integer pageSize, Integer pageNum) { this.pageSize = pageSize; this.pageNum = pageNum; } } ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,165 @@ package org.dromara.common.redis.utils; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.redisson.api.RIdGenerator; import org.redisson.api.RedissonClient; import java.time.Duration; /** * åå·å¨å·¥å ·ç±» * * @author ç§è¾æªå¯ * @date 2024-12-10 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class SequenceUtils { /** * é»è®¤åå§å¼ */ public static final Long DEFAULT_INIT_VALUE = 1L; /** * é»è®¤æ¥é¿ */ public static final Long DEFAULT_STEP_VALUE = 1L; /** * é»è®¤è¿ææ¶é´-天 */ public static final Duration DEFAULT_EXPIRE_TIME_DAY = Duration.ofDays(1); /** * é»è®¤è¿ææ¶é´-åé */ public static final Duration DEFAULT_EXPIRE_TIME_MINUTE = Duration.ofMinutes(1); /** * è·åRedisson客æ·ç«¯å®ä¾ */ private static final RedissonClient REDISSON_CLIENT = SpringUtils.getBean(RedissonClient.class); /** * è·åIDçæå¨ * * @param key ä¸å¡key * @param expireTime è¿ææ¶é´ * @param initValue IDåå§å¼ * @param stepValue IDæ¥é¿ * @return IDçæå¨ */ private static RIdGenerator getIdGenerator(String key, Duration expireTime, Long initValue, Long stepValue) { if (initValue == null || initValue <= 0) { initValue = DEFAULT_INIT_VALUE; } if (stepValue == null || stepValue <= 0) { stepValue = DEFAULT_STEP_VALUE; } RIdGenerator idGenerator = REDISSON_CLIENT.getIdGenerator(key); // è®¾ç½®è¿ææ¶é´ idGenerator.expire(expireTime); // 设置åå§å¼åæ¥é¿ idGenerator.tryInit(initValue, stepValue); return idGenerator; } /** * è·åæå®ä¸å¡keyçå¯ä¸id * * @param key ä¸å¡key * @param expireTime è¿ææ¶é´ * @param initValue IDåå§å¼ * @param stepValue IDæ¥é¿ * @return å¯ä¸id */ public static long nextId(String key, Duration expireTime, Long initValue, Long stepValue) { return getIdGenerator(key, expireTime, initValue, stepValue).nextId(); } /** * è·åæå®ä¸å¡keyçå¯ä¸idå符串 * * @param key ä¸å¡key * @param expireTime è¿ææ¶é´ * @param initValue IDåå§å¼ * @param stepValue IDæ¥é¿ * @return å¯ä¸id */ public static String nextIdStr(String key, Duration expireTime, Long initValue, Long stepValue) { return String.valueOf(nextId(key, expireTime, initValue, stepValue)); } /** * è·åæå®ä¸å¡keyçå¯ä¸id (IDåå§å¼=1,IDæ¥é¿=1) * * @param key ä¸å¡key * @param expireTime è¿ææ¶é´ * @return å¯ä¸id */ public static long nextId(String key, Duration expireTime) { return getIdGenerator(key, expireTime, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId(); } /** * è·åæå®ä¸å¡keyçå¯ä¸idå符串 (IDåå§å¼=1,IDæ¥é¿=1) * * @param key ä¸å¡key * @param expireTime è¿ææ¶é´ * @return å¯ä¸id */ public static String nextIdStr(String key, Duration expireTime) { return String.valueOf(nextId(key, expireTime)); } /** * è·å yyyyMMdd å¼å¤´çå¯ä¸id * * @return å¯ä¸id */ public static String nextIdDate() { return nextIdDate(""); } /** * è·å prefix + yyyyMMdd å¼å¤´çå¯ä¸id * * @param prefix ä¸å¡åç¼ * @return å¯ä¸id */ public static String nextIdDate(String prefix) { // åç¼+æ¥æ æå»º prefixKey String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_FORMATTER)); // è·åä¸ä¸ä¸ªid long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_DAY, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId(); // è¿å宿´id return StringUtils.format("{}{}", prefixKey, nextId); } /** * è·å yyyyMMddHHmmss å¼å¤´çå¯ä¸id * * @return å¯ä¸id */ public static String nextIdDateTime() { return nextIdDateTime(""); } /** * è·å prefix + yyyyMMddHHmmss å¼å¤´çå¯ä¸id * * @param prefix ä¸å¡åç¼ * @return å¯ä¸id */ public static String nextIdDateTime(String prefix) { // åç¼+æ¥ææ¶é´ æå»º prefixKey String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_FORMATTER)); // è·åä¸ä¸ä¸ªid long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_MINUTE, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId(); // è¿å宿´id return StringUtils.format("{}{}", prefixKey, nextId); } } ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java
@@ -89,6 +89,13 @@ } /** * è·åç¨æ·id */ public static String getUserIdStr() { return Convert.toStr(getExtra(USER_KEY)); } /** * è·åç¨æ·è´¦æ· */ public static String getUsername() { ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java
@@ -30,7 +30,7 @@ } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { public AuthToken getAccessToken(AuthCallback authCallback) { String body = doPostAuthorizationCode(authCallback.getCode()); Dict object = JsonUtils.parseMap(body); // oauth/token éªè¯å¼å¸¸ @@ -51,7 +51,7 @@ } @Override protected AuthUser getUserInfo(AuthToken authToken) { public AuthUser getUserInfo(AuthToken authToken) { String body = doGetUserInfo(authToken); Dict object = JsonUtils.parseMap(body); // oauth/token éªè¯å¼å¸¸ ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java
@@ -44,7 +44,7 @@ } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { public AuthToken getAccessToken(AuthCallback authCallback) { String body = doPostAuthorizationCode(authCallback.getCode()); Dict object = JsonUtils.parseMap(body); checkResponse(object); @@ -58,7 +58,7 @@ } @Override protected AuthUser getUserInfo(AuthToken authToken) { public AuthUser getUserInfo(AuthToken authToken) { String body = doGetUserInfo(authToken); Dict object = JsonUtils.parseMap(body); checkResponse(object); ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java
@@ -1,5 +1,6 @@ package org.dromara.demo.controller; import cn.hutool.core.thread.ThreadUtil; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.domain.R; import org.dromara.common.redis.utils.RedisUtils; @@ -83,11 +84,7 @@ RedisUtils.setCacheObject(key, value); boolean flag = RedisUtils.expire(key, Duration.ofSeconds(10)); System.out.println("***********" + flag); try { Thread.sleep(11 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } ThreadUtil.sleep(11 * 1000); Object obj = RedisUtils.getCacheObject(key); return R.ok(value.equals(obj)); } ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java
@@ -1,5 +1,6 @@ package org.dromara.demo.controller; import cn.hutool.core.thread.ThreadUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import com.baomidou.lock.annotation.Lock4j; @@ -33,13 +34,9 @@ @Lock4j(keys = {"#key"}) @GetMapping("/testLock4j") public R<String> testLock4j(String key, String value) { System.out.println("start:" + key + ",time:" + LocalTime.now().toString()); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("end :" + key + ",time:" + LocalTime.now().toString()); System.out.println("start:" + key + ",time:" + LocalTime.now()); ThreadUtil.sleep(10000); System.out.println("end :" + key + ",time:" + LocalTime.now()); return R.ok("æä½æå", value); } @@ -54,11 +51,7 @@ } // è·åéæåï¼å¤çä¸å¡ try { try { Thread.sleep(8000); } catch (InterruptedException e) { // } ThreadUtil.sleep(8000); System.out.println("æ§è¡ç®åæ¹æ³1 , å½å线ç¨:" + Thread.currentThread().getName()); } finally { //éæ¾é ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java
@@ -97,7 +97,7 @@ @Log(title = "客æ·ç«¯ç®¡ç", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public R<Void> changeStatus(@RequestBody SysClientBo bo) { return toAjax(sysClientService.updateUserStatus(bo.getClientId(), bo.getStatus())); return toAjax(sysClientService.updateClientStatus(bo.getClientId(), bo.getStatus())); } /** ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
@@ -218,7 +218,7 @@ @GetMapping("/optionselect") public R<List<SysUserVo>> optionselect(@RequestParam(required = false) Long[] userIds, @RequestParam(required = false) Long deptId) { return R.ok(userService.selectUserByIds(userIds == null ? null : List.of(userIds), deptId)); return R.ok(userService.selectUserByIds(ArrayUtil.isEmpty(userIds) ? null : List.of(userIds), deptId)); } /** ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java
@@ -50,7 +50,7 @@ /** * ä¿®æ¹ç¶æ */ int updateUserStatus(String clientId, String status); int updateClientStatus(String clientId, String status); /** * æ ¡éªå¹¶æ¹éå é¤å®¢æ·ç«¯ç®¡çä¿¡æ¯ ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java
@@ -26,6 +26,14 @@ List<SysPostVo> selectPostList(SysPostBo post); /** * æ¥è¯¢ç¨æ·æå±å²ä½ç» * * @param userId ç¨æ·ID * @return å²ä½ID */ List<SysPostVo> selectPostsByUserId(Long userId); /** * æ¥è¯¢ææå²ä½ * * @return å²ä½å表 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java
@@ -123,7 +123,7 @@ */ @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") @Override public int updateUserStatus(String clientId, String status) { public int updateClientStatus(String clientId, String status) { return baseMapper.update(null, new LambdaUpdateWrapper<SysClient>() .set(SysClient::getStatus, status) ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java
@@ -38,7 +38,7 @@ * @param roleId è§è²Id * @return é¨é¨Idç» */ @Cacheable(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId") @Cacheable(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId", condition = "#roleId != null") @Override public String getRoleCustom(Long roleId) { if (ObjectUtil.isNull(roleId)) { @@ -60,7 +60,7 @@ * @param deptId é¨é¨Id * @return é¨é¨Idç» */ @Cacheable(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, key = "#deptId") @Cacheable(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, key = "#deptId", condition = "#deptId != null") @Override public String getDeptAndChild(Long deptId) { if (ObjectUtil.isNull(deptId)) { ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
@@ -1,5 +1,6 @@ package org.dromara.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.tree.Tree; @@ -10,6 +11,7 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.dto.DeptDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; import org.dromara.common.core.utils.*; @@ -110,7 +112,7 @@ .setName(dept.getDeptName()) .setWeight(dept.getOrderNum()) .putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus()))); Tree<Long> tree = trees.stream().filter(it -> it.getId().longValue() == d.getDeptId()).findFirst().get(); Tree<Long> tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId()); treeList.add(tree); } } @@ -175,6 +177,31 @@ } /** * æ ¹æ®é¨é¨IDæ¥è¯¢é¨é¨è´è´£äºº * * @param deptId é¨é¨IDï¼ç¨äºæå®éè¦æ¥è¯¢çé¨é¨ * @return è¿å该é¨é¨çè´è´£äººID */ @Override public Long selectDeptLeaderById(Long deptId) { SysDeptVo vo = SpringUtils.getAopProxy(this).selectDeptById(deptId); return vo.getLeader(); } /** * æ¥è¯¢é¨é¨ * * @return é¨é¨å表 */ @Override public List<DeptDTO> selectDeptsByList() { List<SysDeptVo> list = baseMapper.selectDeptList(new LambdaQueryWrapper<SysDept>() .select(SysDept::getDeptId, SysDept::getDeptName, SysDept::getParentId) .eq(SysDept::getStatus, SystemConstants.NORMAL)); return BeanUtil.copyToList(list, DeptDTO.class); } /** * æ ¹æ®IDæ¥è¯¢ææåé¨é¨æ°ï¼æ£å¸¸ç¶æï¼ * * @param deptId é¨é¨ID ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
@@ -118,8 +118,7 @@ .between(params.get("beginTime") != null && params.get("endTime") != null, SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")); if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { pageQuery.setOrderByColumn("info_id"); pageQuery.setIsAsc("desc"); lqw.orderByDesc(SysLogininfor::getInfoId); } Page<SysLogininforVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java
@@ -53,8 +53,7 @@ public TableDataInfo<SysOperLogVo> selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery) { LambdaQueryWrapper<SysOperLog> lqw = buildQueryWrapper(operLog); if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { pageQuery.setOrderByColumn("oper_id"); pageQuery.setIsAsc("desc"); lqw.orderByDesc(SysOperLog::getOperId); } Page<SysOperLogVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java
@@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.PostService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -34,7 +35,7 @@ */ @RequiredArgsConstructor @Service public class SysPostServiceImpl implements ISysPostService { public class SysPostServiceImpl implements ISysPostService, PostService { private final SysPostMapper baseMapper; private final SysDeptMapper deptMapper; @@ -58,6 +59,17 @@ } /** * æ¥è¯¢ç¨æ·æå±å²ä½ç» * * @param userId ç¨æ·ID * @return å²ä½ID */ @Override public List<SysPostVo> selectPostsByUserId(Long userId) { return baseMapper.selectPostsByUserId(userId); } /** * æ ¹æ®æ¥è¯¢æ¡ä»¶æå»ºæ¥è¯¢å è£ å¨ * * @param bo æ¥è¯¢æ¡ä»¶å¯¹è±¡ ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
@@ -17,6 +17,7 @@ import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.RoleService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -47,7 +48,7 @@ */ @RequiredArgsConstructor @Service public class SysRoleServiceImpl implements ISysRoleService { public class SysRoleServiceImpl implements ISysRoleService, RoleService { private final SysRoleMapper baseMapper; private final SysRoleMenuMapper roleMenuMapper; @@ -351,7 +352,7 @@ private int insertRoleMenu(SysRoleBo role) { int rows = 1; // æ°å¢ç¨æ·ä¸è§è²ç®¡ç List<SysRoleMenu> list = new ArrayList<SysRoleMenu>(); List<SysRoleMenu> list = new ArrayList<>(); for (Long menuId : role.getMenuIds()) { SysRoleMenu rm = new SysRoleMenu(); rm.setRoleId(role.getRoleId()); @@ -372,7 +373,7 @@ private int insertRoleDept(SysRoleBo role) { int rows = 1; // æ°å¢è§è²ä¸é¨é¨ï¼æ°æ®æéï¼ç®¡ç List<SysRoleDept> list = new ArrayList<SysRoleDept>(); List<SysRoleDept> list = new ArrayList<>(); for (Long deptId : role.getDeptIds()) { SysRoleDept rd = new SysRoleDept(); rd.setRoleId(role.getRoleId()); ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
@@ -696,4 +696,27 @@ .in(SysUser::getDeptId, deptIds)); return BeanUtil.copyToList(list, UserDTO.class); } /** * éè¿å²ä½IDæ¥è¯¢ç¨æ· * * @param postIds å²ä½ids * @return ç¨æ· */ @Override public List<UserDTO> selectUsersByPostIds(List<Long> postIds) { if (CollUtil.isEmpty(postIds)) { return List.of(); } // éè¿å²ä½IDè·åç¨æ·å²ä½ä¿¡æ¯ List<SysUserPost> userPosts = userPostMapper.selectList( new LambdaQueryWrapper<SysUserPost>().in(SysUserPost::getPostId, postIds)); // è·åç¨æ·IDå表 Set<Long> userIds = StreamUtils.toSet(userPosts, SysUserPost::getUserId); return selectListByIds(new ArrayList<>(userIds)); } }