diff --git a/pom.xml b/pom.xml index 58da40ee..546643a4 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ 4.0.1 - 2.6.4 + 2.6.6 UTF-8 UTF-8 1.8 @@ -31,12 +31,12 @@ 1.29.0 3.5.1 3.9.1 - 5.7.21 + 5.7.22 4.9.2 - 2.6.2 - 3.16.8 + 2.6.5 + 3.17.0 2.2.1 - 3.5.0 + 3.5.1 1.3.6 2.3.0 6.7.2 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index fad8b5bf..facf6ce9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -7,6 +7,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginBody; +import com.ruoyi.common.core.domain.model.SmsLoginBody; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.system.domain.vo.RouterVo; import com.ruoyi.system.service.ISysMenuService; @@ -22,6 +23,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import javax.validation.constraints.NotBlank; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -60,6 +62,38 @@ public class SysLoginController { return R.ok(ajax); } + /** + * 短信登录(示例) + * + * @param smsLoginBody 登录信息 + * @return 结果 + */ + @ApiOperation("短信登录(示例)") + @PostMapping("/smsLogin") + public R> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) { + Map ajax = new HashMap<>(); + // 生成令牌 + String token = loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode()); + ajax.put(Constants.TOKEN, token); + return R.ok(ajax); + } + + /** + * 小程序登录(示例) + * + * @param xcxCode 小程序code + * @return 结果 + */ + @ApiOperation("小程序登录(示例)") + @PostMapping("/xcxLogin") + public R> xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) { + Map ajax = new HashMap<>(); + // 生成令牌 + String token = loginService.xcxLogin(xcxCode); + ajax.put(Constants.TOKEN, token); + return R.ok(ajax); + } + @ApiOperation("登出方法") @PostMapping("/logout") public R logout() { diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index d487979f..6bc5414a 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -47,6 +47,8 @@ spring: p6spy: true # 设置默认的数据源或者数据源组,默认值即为 master primary: master + # 严格模式 匹配不到数据源则报错 + strict: true datasource: # 主库数据源 master: diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 51392215..0b9b9878 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -54,6 +54,8 @@ spring: p6spy: false # 设置默认的数据源或者数据源组,默认值即为 master primary: master + # 严格模式 匹配不到数据源则报错 + strict: true datasource: # 主库数据源 master: diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 4bb57484..7b5deb89 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -127,6 +127,8 @@ security: # 排除路径 excludes: - /login + - /smsLogin + - /xcxLogin - /logout - /register - /captchaImage @@ -136,6 +138,7 @@ security: - /**/*.css - /**/*.js # swagger 文档配置 + - /favicon.ico - /doc.html - /swagger-resources/** - /webjars/** diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index 522d1bc8..ac1d8c23 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -18,6 +18,7 @@ user.password.not.blank=用户密码不能为空 user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 user.password.not.valid=* 5-50个字符 user.email.not.valid=邮箱格式错误 +user.phonenumber.not.blank=用户手机号不能为空 user.mobile.phone.number.not.valid=手机号格式错误 user.login.success=登录成功 user.register.success=注册成功 @@ -38,3 +39,7 @@ no.export.permission=您没有导出数据的权限,请联系管理员添加 no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] repeat.submit.message=不允许重复提交,请稍候再试 rate.limiter.message=访问过于频繁,请稍候再试 +sms.code.not.blank=短信验证码不能为空 +sms.code.retry.limit.count=短信验证码输入错误{0}次 +sms.code.retry.limit.exceed=短信验证码错误次数过多,帐户锁定{0}分钟 +xcx.code.not.blank=小程序code不能为空 diff --git a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties index 5dbdac59..9076f79f 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties @@ -18,6 +18,7 @@ user.password.not.blank=Password cannot be empty user.password.length.valid=Password length must be between {min} and {max} characters user.password.not.valid=* 5-50 characters user.email.not.valid=Mailbox format error +user.phonenumber.not.blank=Phone number cannot be blank user.mobile.phone.number.not.valid=Phone number format error user.login.success=Login successful user.register.success=Register successful @@ -38,3 +39,7 @@ no.export.permission=You do not have permission to export data,please contact no.view.permission=You do not have permission to view data,please contact your administrator to add permissions [{0}] repeat.submit.message=Repeat submit is not allowed, please try again later rate.limiter.message=Visit too frequently, please try again later +sms.code.not.blank=Sms code cannot be blank +sms.code.retry.limit.count=Sms code input error {0} times +sms.code.retry.limit.exceed=Too many sms code errors, account locked for {0} minutes +xcx.code.not.blank=Mini program code cannot be blank diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties index 522d1bc8..ac1d8c23 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -18,6 +18,7 @@ user.password.not.blank=用户密码不能为空 user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 user.password.not.valid=* 5-50个字符 user.email.not.valid=邮箱格式错误 +user.phonenumber.not.blank=用户手机号不能为空 user.mobile.phone.number.not.valid=手机号格式错误 user.login.success=登录成功 user.register.success=注册成功 @@ -38,3 +39,7 @@ no.export.permission=您没有导出数据的权限,请联系管理员添加 no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] repeat.submit.message=不允许重复提交,请稍候再试 rate.limiter.message=访问过于频繁,请稍候再试 +sms.code.not.blank=短信验证码不能为空 +sms.code.retry.limit.count=短信验证码输入错误{0}次 +sms.code.retry.limit.exceed=短信验证码错误次数过多,帐户锁定{0}分钟 +xcx.code.not.blank=小程序code不能为空 diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml index e8d62753..4d6b910d 100644 --- a/ruoyi-admin/src/main/resources/logback.xml +++ b/ruoyi-admin/src/main/resources/logback.xml @@ -77,6 +77,26 @@ + + + + 0 + + 512 + + + + + + + + 0 + + 512 + + + + @@ -88,8 +108,8 @@ - - + + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java index 8d916609..80481573 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java @@ -78,13 +78,13 @@ public class SysRole extends BaseEntity { * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */ @ApiModelProperty(value = "菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)") - private Integer menuCheckStrictly; + private Boolean menuCheckStrictly; /** * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */ @ApiModelProperty(value = "部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )") - private Integer deptCheckStrictly; + private Boolean deptCheckStrictly; /** * 角色状态(0正常 1停用) @@ -136,5 +136,4 @@ public class SysRole extends BaseEntity { public boolean isAdmin() { return UserConstants.ADMIN_ID.equals(this.roleId); } - } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java new file mode 100644 index 00000000..f3ef445c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java @@ -0,0 +1,33 @@ +package com.ruoyi.common.core.domain.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 短信登录对象 + * + * @author Lion Li + */ + +@Data +@ApiModel("短信登录对象") +public class SmsLoginBody { + + /** + * 用户名 + */ + @NotBlank(message = "{user.phonenumber.not.blank}") + @ApiModelProperty(value = "用户手机号") + private String phonenumber; + + /** + * 用户密码 + */ + @NotBlank(message = "{sms.code.not.blank}") + @ApiModelProperty(value = "短信验证码") + private String smsCode; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/XcxLoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/XcxLoginUser.java new file mode 100644 index 00000000..83313a0f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/XcxLoginUser.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.core.domain.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 小程序登录用户身份权限 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +public class XcxLoginUser extends LoginUser { + + private static final long serialVersionUID = 1L; + + /** + * openid + */ + private String openid; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java index e6ac849d..118a2128 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java @@ -21,7 +21,12 @@ public enum DeviceType { /** * app端 */ - APP("app"); + APP("app"), + + /** + * 小程序端 + */ + XCX("xcx"); private final String device; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java index 34afa5b8..19603562 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java @@ -21,12 +21,13 @@ import java.sql.SQLException; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DataBaseHelper { + private static final DynamicRoutingDataSource DS = SpringUtils.getBean(DynamicRoutingDataSource.class); + /** * 获取当前数据库类型 */ public static DataBaseType getDataBaseType() { - DynamicRoutingDataSource ds = (DynamicRoutingDataSource) SpringUtils.getBean(DataSource.class); - DataSource dataSource = ds.determineDataSource(); + DataSource dataSource = DS.determineDataSource(); try (Connection conn = dataSource.getConnection()) { DatabaseMetaData metaData = conn.getMetaData(); String databaseProductName = metaData.getDatabaseProductName(); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java index e3cb9c56..c64f1f8a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -22,17 +22,17 @@ import java.util.Date; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DateUtils extends org.apache.commons.lang3.time.DateUtils { - public static String YYYY = "yyyy"; + public static final String YYYY = "yyyy"; - public static String YYYY_MM = "yyyy-MM"; + public static final String YYYY_MM = "yyyy-MM"; - public static String YYYY_MM_DD = "yyyy-MM-dd"; + public static final String YYYY_MM_DD = "yyyy-MM-dd"; - public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; - public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; - private static String[] parsePatterns = { + 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"}; @@ -55,27 +55,27 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return dateTimeNow(YYYY_MM_DD); } - public static final String getTime() { + public static String getTime() { return dateTimeNow(YYYY_MM_DD_HH_MM_SS); } - public static final String dateTimeNow() { + public static String dateTimeNow() { return dateTimeNow(YYYYMMDDHHMMSS); } - public static final String dateTimeNow(final String format) { + public static String dateTimeNow(final String format) { return parseDateToStr(format, new Date()); } - public static final String dateTime(final Date date) { + public static String dateTime(final Date date) { return parseDateToStr(YYYY_MM_DD, date); } - public static final String parseDateToStr(final String format, final Date date) { + public static String parseDateToStr(final String format, final Date date) { return new SimpleDateFormat(format).format(date); } - public static final Date dateTime(final String format, final String ts) { + public static Date dateTime(final String format, final String ts) { try { return new SimpleDateFormat(format).parse(ts); } catch (ParseException e) { @@ -86,7 +86,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { /** * 日期路径 即年/月/日 如2018/08/08 */ - public static final String datePath() { + public static String datePath() { Date now = new Date(); return DateFormatUtils.format(now, "yyyy/MM/dd"); } @@ -94,7 +94,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { /** * 日期路径 即年/月/日 如20180808 */ - public static final String dateTime() { + public static String dateTime() { Date now = new Date(); return DateFormatUtils.format(now, "yyyyMMdd"); } @@ -107,7 +107,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return null; } try { - return parseDate(str.toString(), parsePatterns); + return parseDate(str.toString(), PARSE_PATTERNS); } catch (ParseException e) { return null; } @@ -124,8 +124,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { /** * 计算相差天数 */ - public static int differentDaysByMillisecond(Date date1, Date date2) - { + public static int differentDaysByMillisecond(Date date1, Date date2) { return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java index 3d4bc9e8..b284216f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java @@ -18,10 +18,10 @@ import java.awt.*; @Configuration public class CaptchaConfig { - private final int width = 160; - private final int height = 60; - private final Color background = Color.PINK; - private final Font font = new Font("Arial", Font.BOLD, 48); + private static final int WIDTH = 160; + private static final int HEIGHT = 60; + private static final Color BACKGROUND = Color.PINK; + private static final Font FONT = new Font("Arial", Font.BOLD, 48); /** * 圆圈干扰验证码 @@ -29,9 +29,9 @@ public class CaptchaConfig { @Lazy @Bean public CircleCaptcha circleCaptcha() { - CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(width, height); - captcha.setBackground(background); - captcha.setFont(font); + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); return captcha; } @@ -41,9 +41,9 @@ public class CaptchaConfig { @Lazy @Bean public LineCaptcha lineCaptcha() { - LineCaptcha captcha = CaptchaUtil.createLineCaptcha(width, height); - captcha.setBackground(background); - captcha.setFont(font); + LineCaptcha captcha = CaptchaUtil.createLineCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); return captcha; } @@ -53,9 +53,9 @@ public class CaptchaConfig { @Lazy @Bean public ShearCaptcha shearCaptcha() { - ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(width, height); - captcha.setBackground(background); - captcha.setFont(font); + ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); return captcha; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java index 54f373be..671400f6 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java @@ -5,7 +5,7 @@ import cn.dev33.satoken.interceptor.SaRouteInterceptor; import cn.dev33.satoken.jwt.StpLogicJwtForStyle; import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.stp.StpLogic; -import cn.hutool.core.util.ObjectUtil; +import cn.dev33.satoken.stp.StpUtil; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.framework.config.properties.SecurityProperties; import lombok.RequiredArgsConstructor; @@ -43,15 +43,17 @@ public class SaTokenConfig implements WebMvcConfigurer { .match("/**") // 排除下不需要拦截的 .notMatch(securityProperties.getExcludes()) + // 对未排除的路径进行检查 .check(() -> { - Long userId = LoginHelper.getUserId(); - if (ObjectUtil.isNotNull(userId)) { - // 有效率影响 用于临时测试 - // if (log.isDebugEnabled()) { - // log.debug("剩余有效时间: {}", StpUtil.getTokenTimeout()); - // log.debug("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); - // } - } + // 检查是否登录 是否有token + StpUtil.checkLogin(); + + // 有效率影响 用于临时测试 + // if (log.isDebugEnabled()) { + // log.debug("剩余有效时间: {}", StpUtil.getTokenTimeout()); + // log.debug("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); + // } + }); }) { @SuppressWarnings("all") diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java index c4252b44..75277c25 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java @@ -53,7 +53,7 @@ public class UserActionListener implements SaTokenListener { dto.setUserName(user.getUsername()); dto.setDeptName(user.getDeptName()); RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, dto, tokenConfig.getTimeout(), TimeUnit.SECONDS); - log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); + log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); } else if (userType == UserType.APP_USER) { // app端 自行根据业务编写 } @@ -65,7 +65,7 @@ public class UserActionListener implements SaTokenListener { @Override public void doLogout(String loginType, Object loginId, String tokenValue) { RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); - log.info("user doLogout, useId:{}, token:{}", loginId, tokenValue); + log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); } /** @@ -74,7 +74,7 @@ public class UserActionListener implements SaTokenListener { @Override public void doKickout(String loginType, Object loginId, String tokenValue) { RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); - log.info("user doLogoutByLoginId, useId:{}, token:{}", loginId, tokenValue); + log.info("user doLogoutByLoginId, userId:{}, token:{}", loginId, tokenValue); } /** @@ -83,7 +83,7 @@ public class UserActionListener implements SaTokenListener { @Override public void doReplaced(String loginType, Object loginId, String tokenValue) { RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); - log.info("user doReplaced, useId:{}, token:{}", loginId, tokenValue); + log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); } /** diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaPermissionImpl.java similarity index 79% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java rename to ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaPermissionImpl.java index 8e97d057..057d1833 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaPermissionImpl.java @@ -9,9 +9,17 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; +/** + * sa-token 权限管理实现类 + * + * @author Lion Li + */ @Component -public class SaInterfaceImpl implements StpInterface { +public class SaPermissionImpl implements StpInterface { + /** + * 获取菜单权限列表 + */ @Override public List getPermissionList(Object loginId, String loginType) { LoginUser loginUser = LoginHelper.getLoginUser(); @@ -19,11 +27,14 @@ public class SaInterfaceImpl implements StpInterface { if (userType == UserType.SYS_USER) { return new ArrayList<>(loginUser.getMenuPermission()); } else if (userType == UserType.APP_USER) { - // app端权限返回 自行根据业务编写 + // 其他端 自行根据业务编写 } return new ArrayList<>(); } + /** + * 获取角色权限列表 + */ @Override public List getRoleList(Object loginId, String loginType) { LoginUser loginUser = LoginHelper.getLoginUser(); @@ -31,7 +42,7 @@ public class SaInterfaceImpl implements StpInterface { if (userType == UserType.SYS_USER) { return new ArrayList<>(loginUser.getRolePermission()); } else if (userType == UserType.APP_USER) { - // app端权限返回 自行根据业务编写 + // 其他端 自行根据业务编写 } return new ArrayList<>(); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index 90b265e2..326c96a7 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -9,7 +9,9 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.exception.DemoModeException; import com.ruoyi.common.exception.ServiceException; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.MyBatisSystemException; import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.dao.DuplicateKeyException; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -71,6 +73,31 @@ public class GlobalExceptionHandler { return R.fail(e.getMessage()); } + /** + * 主键或UNIQUE索引,数据重复异常 + */ + @ExceptionHandler(DuplicateKeyException.class) + public R handleDuplicateKeyException(DuplicateKeyException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',数据库中已存在记录'{}'", requestURI, e.getMessage()); + return R.fail("数据库中已存在该记录,请联系管理员确认"); + } + + /** + * Mybatis系统异常 通用处理 + */ + @ExceptionHandler(MyBatisSystemException.class) + public R handleCannotFindDataSourceException(MyBatisSystemException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + String message = e.getMessage(); + if (message.contains("CannotFindDataSourceException")) { + log.error("请求地址'{}', 未找到数据源", requestURI); + return R.fail("未找到数据源,请联系管理员确认"); + } + log.error("请求地址'{}', Mybatis系统异常", requestURI, e); + return R.fail(message); + } + /** * 业务异常 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index 29bfe0de..f70a11eb 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -16,15 +16,13 @@ import java.util.List; @InterceptorIgnore(dataPermission = "true") public interface GenTableMapper extends BaseMapperPlus { - Page selectPageDbTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); - /** * 查询据库列表 * * @param genTable 查询条件 * @return 数据库表集合 */ - List selectDbTableList(GenTable genTable); + Page selectPageDbTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); /** * 查询据库列表 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index e988894b..9dccab2d 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -91,17 +91,6 @@ public class GenTableServiceImpl implements IGenTableService { return TableDataInfo.build(page); } - /** - * 查询业务列表 - * - * @param genTable 业务信息 - * @return 业务集合 - */ - @Override - public List selectGenTableList(GenTable genTable) { - return baseMapper.selectList(this.buildGenTableQueryWrapper(genTable)); - } - private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { Map params = genTable.getParams(); QueryWrapper wrapper = Wrappers.query(); @@ -119,17 +108,6 @@ public class GenTableServiceImpl implements IGenTableService { return TableDataInfo.build(page); } - /** - * 查询据库列表 - * - * @param genTable 业务信息 - * @return 数据库表集合 - */ - @Override - public List selectDbTableList(GenTable genTable) { - return baseMapper.selectDbTableList(genTable); - } - /** * 查询据库列表 * diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java index 092020a5..c432d067 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -23,19 +23,13 @@ public interface IGenTableService { */ List selectGenTableColumnListByTableId(Long tableId); - - TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); - - - TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery); - /** * 查询业务列表 * * @param genTable 业务信息 * @return 业务集合 */ - List selectGenTableList(GenTable genTable); + TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); /** * 查询据库列表 @@ -43,7 +37,7 @@ public interface IGenTableService { * @param genTable 业务信息 * @return 数据库表集合 */ - List selectDbTableList(GenTable genTable); + TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery); /** * 查询据库列表 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java index 1a1d04ac..b6c2248e 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java @@ -5,6 +5,8 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.generator.config.GenConfig; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.RegExUtils; import java.util.Arrays; @@ -14,6 +16,7 @@ import java.util.Arrays; * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class GenUtils { /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java index a81bd51d..67769a8d 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java @@ -1,6 +1,8 @@ package com.ruoyi.generator.util; import com.ruoyi.common.constant.Constants; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.apache.velocity.app.Velocity; import java.util.Properties; @@ -10,6 +12,7 @@ import java.util.Properties; * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class VelocityInitializer { /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 74649704..d8eeb6dd 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -11,6 +11,8 @@ import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.apache.velocity.VelocityContext; import java.util.*; @@ -20,6 +22,7 @@ import java.util.*; * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class VelocityUtils { /** diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml index 7b1e9c5f..fc44d8cb 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -95,6 +95,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE table_name = (#{tableName}) + SELECT + cast(A.NAME as nvarchar) as column_name, + cast(B.NAME as nvarchar) + (case when B.NAME = 'numeric' then '(' + cast(A.prec as nvarchar) + ',' + cast(A.scale as nvarchar) + ')' else '' end) as column_type, + cast(G.[VALUE] as nvarchar) as column_comment, + (SELECT 1 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE Z WHERE TABLE_NAME = D.NAME and A.NAME = Z.column_name ) as is_pk, + colorder as sort + FROM SYSCOLUMNS A + LEFT JOIN SYSTYPES B ON A.XTYPE = B.XUSERTYPE + INNER JOIN SYSOBJECTS D ON A.ID = D.ID AND D.XTYPE='U' AND D.NAME != 'DTPROPERTIES' + LEFT JOIN SYS.EXTENDED_PROPERTIES G ON A.ID = G.MAJOR_ID AND A.COLID = G.MINOR_ID + LEFT JOIN SYS.EXTENDED_PROPERTIES F ON D.ID = F.MAJOR_ID AND F.MINOR_ID = 0 + WHERE D.NAME = #{tableName} + ORDER BY A.COLORDER diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml index b66b25d8..2f17694b 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -109,64 +109,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by create_time desc - - - - @@ -213,13 +171,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + SELECT cast(D.NAME as nvarchar) as table_name, + cast(F.VALUE as nvarchar) as table_comment, + crdate as create_time, + refdate as update_time + FROM SYSOBJECTS D + INNER JOIN SYS.EXTENDED_PROPERTIES F ON D.ID = F.MAJOR_ID + AND F.MINOR_ID = 0 AND D.XTYPE = 'U' AND D.NAME != 'DTPROPERTIES' + AND D.NAME NOT LIKE 'xxl_job_%' AND D.NAME NOT LIKE 'gen_%' + AND D.NAME in + + #{name} + diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/IOssStrategy.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/IOssStrategy.java index c6661e7c..981c23e9 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/IOssStrategy.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/IOssStrategy.java @@ -12,11 +12,14 @@ import java.io.InputStream; */ public interface IOssStrategy { + /** + * 创建存储桶 + */ void createBucket(); /** * 获取服务商类型 - * @return + * @return 对象存储服务商枚举 */ OssEnumd getServiceType(); @@ -25,6 +28,7 @@ public interface IOssStrategy { * * @param data 文件字节数组 * @param path 文件路径,包含文件名 + * @param contentType 文件类型 * @return 返回http地址 */ UploadResult upload(byte[] data, String path, String contentType); @@ -41,6 +45,7 @@ public interface IOssStrategy { * * @param data 文件字节数组 * @param suffix 后缀 + * @param contentType 文件类型 * @return 返回http地址 */ UploadResult uploadSuffix(byte[] data, String suffix, String contentType); @@ -50,6 +55,7 @@ public interface IOssStrategy { * * @param inputStream 字节流 * @param path 文件路径,包含文件名 + * @param contentType 文件类型 * @return 返回http地址 */ UploadResult upload(InputStream inputStream, String path, String contentType); @@ -59,6 +65,7 @@ public interface IOssStrategy { * * @param inputStream 字节流 * @param suffix 后缀 + * @param contentType 文件类型 * @return 返回http地址 */ UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractOssStrategy.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractOssStrategy.java index e4928cdb..ae17c19d 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractOssStrategy.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractOssStrategy.java @@ -60,5 +60,10 @@ public abstract class AbstractOssStrategy implements IOssStrategy { @Override public abstract UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); + /** + * 获取域名访问链接 + * + * @return 域名访问链接 + */ public abstract String getEndpointLink(); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index 46e48fe6..9b585e1d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -68,6 +68,14 @@ public interface SysUserMapper extends BaseMapperPlus { - Long selectUserIdByRoleId(Long roleId); + List selectUserIdsByRoleId(Long roleId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index 741ae4bc..9ecd86e6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -48,6 +48,14 @@ public interface ISysUserService { */ SysUser selectUserByUserName(String userName); + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + SysUser selectUserByPhonenumber(String phonenumber); + /** * 通过用户ID查询用户 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java index d264e6ce..4630d1f9 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java @@ -8,6 +8,7 @@ import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.dto.RoleDTO; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.domain.model.XcxLoginUser; import com.ruoyi.common.core.service.LogininforService; import com.ruoyi.common.enums.DeviceType; import com.ruoyi.common.enums.UserStatus; @@ -87,6 +88,8 @@ public class SysLoginService { // 登录成功 清空错误次数 RedisUtils.deleteObject(Constants.LOGIN_ERROR + username); + + // 此处可根据登录用户的数据不同 自行创建 loginUser LoginUser loginUser = buildLoginUser(user); // 生成token LoginHelper.loginByDevice(loginUser, DeviceType.PC); @@ -96,10 +99,84 @@ public class SysLoginService { return StpUtil.getTokenValue(); } + public String smsLogin(String phonenumber, String smsCode) { + // 通过手机号查找用户 + SysUser user = loadUserByPhonenumber(phonenumber); + + HttpServletRequest request = ServletUtils.getRequest(); + // 获取用户登录错误次数(可自定义限制策略 例如: key + username + ip) + Integer errorNumber = RedisUtils.getCacheObject(Constants.LOGIN_ERROR + user.getUserName()); + // 锁定时间内登录 则踢出 + if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) { + asyncService.recordLogininfor(user.getUserName(), Constants.LOGIN_FAIL, MessageUtils.message("sms.code.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); + throw new UserException("sms.code.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); + } + + if (!validateSmsCode(phonenumber, smsCode)) { + // 是否第一次 + errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1; + // 达到规定错误次数 则锁定登录 + if (errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) { + RedisUtils.setCacheObject(Constants.LOGIN_ERROR + user.getUserName(), errorNumber, Constants.LOGIN_ERROR_LIMIT_TIME, TimeUnit.MINUTES); + asyncService.recordLogininfor(user.getUserName(), Constants.LOGIN_FAIL, MessageUtils.message("sms.code.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); + throw new UserException("sms.code.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); + } else { + // 未达到规定错误次数 则递增 + RedisUtils.setCacheObject(Constants.LOGIN_ERROR + user.getUserName(), errorNumber); + asyncService.recordLogininfor(user.getUserName(), Constants.LOGIN_FAIL, MessageUtils.message("sms.code.retry.limit.count", errorNumber), request); + throw new UserException("sms.code.retry.limit.count", errorNumber); + } + } + + // 登录成功 清空错误次数 + RedisUtils.deleteObject(Constants.LOGIN_ERROR + user.getUserName()); + + // 此处可根据登录用户的数据不同 自行创建 loginUser + LoginUser loginUser = buildLoginUser(user); + // 生成token + LoginHelper.loginByDevice(loginUser, DeviceType.APP); + + asyncService.recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), request); + recordLoginInfo(user.getUserId(), user.getUserName()); + return StpUtil.getTokenValue(); + } + + + public String xcxLogin(String xcxCode) { + HttpServletRequest request = ServletUtils.getRequest(); + // xcxCode 为 小程序调用 wx.login 授权后获取 + // todo 以下自行实现 + // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid + String openid = ""; + SysUser user = loadUserByOpenid(openid); + + // 此处可根据登录用户的数据不同 自行创建 loginUser + XcxLoginUser loginUser = new XcxLoginUser(); + loginUser.setUserId(user.getUserId()); + loginUser.setUsername(user.getUserName()); + loginUser.setUserType(user.getUserType()); + loginUser.setOpenid(openid); + // 生成token + LoginHelper.loginByDevice(loginUser, DeviceType.XCX); + + asyncService.recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), request); + recordLoginInfo(user.getUserId(), user.getUserName()); + return StpUtil.getTokenValue(); + } + + public void logout(String loginName) { asyncService.recordLogininfor(loginName, Constants.LOGOUT, MessageUtils.message("user.logout.success"), ServletUtils.getRequest()); } + /** + * 校验短信验证码 + */ + private boolean validateSmsCode(String phonenumber, String smsCode) { + // todo 此处使用手机号查询redis验证码与参数验证码是否一致 用户自行实现 + return true; + } + /** * 校验验证码 * @@ -136,6 +213,38 @@ public class SysLoginService { return user; } + private SysUser loadUserByPhonenumber(String phonenumber) { + SysUser user = userService.selectUserByPhonenumber(phonenumber); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", phonenumber); + throw new UserException("user.not.exists", phonenumber); + } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { + log.info("登录用户:{} 已被删除.", phonenumber); + throw new UserException("user.password.delete", phonenumber); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", phonenumber); + throw new UserException("user.blocked", phonenumber); + } + return user; + } + + private SysUser loadUserByOpenid(String openid) { + // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户 + // todo 自行实现 userService.selectUserByOpenid(openid); + SysUser user = new SysUser(); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", openid); + // todo 用户不存在 业务逻辑自行实现 + } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { + log.info("登录用户:{} 已被删除.", openid); + // todo 用户已被删除 业务逻辑自行实现 + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", openid); + // todo 用户已被停用 业务逻辑自行实现 + } + return user; + } + /** * 构建登录用户 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 0b6fc706..32e06d3d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -85,7 +85,7 @@ public class SysDeptServiceImpl implements ISysDeptService { @Override public List selectDeptListByRoleId(Long roleId) { SysRole role = roleMapper.selectById(roleId); - return baseMapper.selectDeptListByRoleId(roleId, role.getDeptCheckStrictly() == 1); + return baseMapper.selectDeptListByRoleId(roleId, role.getDeptCheckStrictly()); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index 87723134..2f9d0020 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -123,7 +123,7 @@ public class SysMenuServiceImpl implements ISysMenuService { @Override public List selectMenuListByRoleId(Long roleId) { SysRole role = roleMapper.selectById(roleId); - return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly() == 1); + return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly()); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 09c5ba2c..2ef63881 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -115,7 +115,7 @@ public class SysUserServiceImpl implements ISysUserService { */ @Override public TableDataInfo selectUnallocatedList(SysUser user, PageQuery pageQuery) { - Long userId = userRoleMapper.selectUserIdByRoleId(user.getRoleId()); + List userId = userRoleMapper.selectUserIdsByRoleId(user.getRoleId()); QueryWrapper wrapper = Wrappers.query(); wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) .and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id")) @@ -137,6 +137,17 @@ public class SysUserServiceImpl implements ISysUserService { return baseMapper.selectUserByUserName(userName); } + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + @Override + public SysUser selectUserByPhonenumber(String phonenumber) { + return baseMapper.selectUserByPhonenumber(phonenumber); + } + /** * 通过用户ID查询用户 * diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 31177887..d4fd23fc 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -121,6 +121,11 @@ where u.del_flag = '0' and u.user_name = #{userName} + + +