ruoyi-api/ruoyi-api-system/pom.xml
@@ -23,17 +23,6 @@ <artifactId>ruoyi-common-core</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java
@@ -53,14 +53,14 @@ if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) { String errMsg = String.format("密码输入错误%s次,帐户锁定%s分钟", maxRetryCount, lockTime); recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL,errMsg); recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL,errMsg,Constants.FROM_SYSTEM); throw new ServiceException(errMsg); } if (!matches(user, password)) { retryCount = retryCount + 1; recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, String.format("密码输入错误%s次", retryCount)); recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, String.format("密码输入错误%s次", retryCount),Constants.FROM_SYSTEM); redisService.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); throw new ServiceException("用户不存在/密码错误"); } ruoyi-common/ruoyi-common-core/pom.xml
@@ -113,6 +113,11 @@ <artifactId>swagger-annotations</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> ruoyi-common/ruoyi-common-redis/pom.xml
@@ -21,6 +21,7 @@ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>3.1.0</version> </dependency> <!-- RuoYi Common Core--> @@ -28,6 +29,17 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-core</artifactId> </dependency> <!-- redis分布式锁框架 --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.19.3</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> </dependencies> </project> ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/listener/KeyExpirationEventMessageListener.java
New file @@ -0,0 +1,46 @@ // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package com.ruoyi.common.redis.listener; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.core.RedisKeyExpiredEvent; import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.Topic; import org.springframework.lang.Nullable; public class KeyExpirationEventMessageListener extends KeyspaceEventMessageListener implements ApplicationEventPublisherAware { private static final Topic KEYEVENT_EXPIRED_TOPIC = new PatternTopic("__keyevent@*__:expired"); @Nullable private ApplicationEventPublisher publisher; public KeyExpirationEventMessageListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } @Override protected void doRegister(RedisMessageListenerContainer listenerContainer) { listenerContainer.addMessageListener(this, KEYEVENT_EXPIRED_TOPIC); } @Override protected void doHandleMessage(Message message) { this.publishEvent(new RedisKeyExpiredEvent(message.getBody())); } protected void publishEvent(RedisKeyExpiredEvent event) { if (this.publisher != null) { this.publisher.publishEvent(event); } } public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.publisher = applicationEventPublisher; } } ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/listener/KeyspaceEventMessageListener.java
New file @@ -0,0 +1,76 @@ // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package com.ruoyi.common.redis.listener; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.Topic; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import java.util.Properties; public abstract class KeyspaceEventMessageListener implements MessageListener, InitializingBean, DisposableBean { private static final Topic TOPIC_ALL_KEYEVENTS = new PatternTopic("__keyevent@*"); private final RedisMessageListenerContainer listenerContainer; private String keyspaceNotificationsConfigParameter = "EA"; public KeyspaceEventMessageListener(RedisMessageListenerContainer listenerContainer) { Assert.notNull(listenerContainer, "RedisMessageListenerContainer to run in must not be null!"); this.listenerContainer = listenerContainer; } @Override public void onMessage(Message message, @Nullable byte[] pattern) { if (message != null && !ObjectUtils.isEmpty(message.getChannel()) && !ObjectUtils.isEmpty(message.getBody())) { this.doHandleMessage(message); } } protected abstract void doHandleMessage(Message var1); public void init() { if (StringUtils.hasText(this.keyspaceNotificationsConfigParameter)) { RedisConnection connection = this.listenerContainer.getConnectionFactory().getConnection(); try { Properties config = connection.getConfig("notify-keyspace-events"); if (!StringUtils.hasText(config.getProperty("notify-keyspace-events"))) { connection.setConfig("notify-keyspace-events", this.keyspaceNotificationsConfigParameter); } } finally { connection.close(); } } // this.doRegister(this.listenerContainer); } protected void doRegister(RedisMessageListenerContainer container) { this.listenerContainer.addMessageListener(this, TOPIC_ALL_KEYEVENTS); } @Override public void destroy() throws Exception { this.listenerContainer.removeMessageListener(this); } public void setKeyspaceNotificationsConfigParameter(String keyspaceNotificationsConfigParameter) { this.keyspaceNotificationsConfigParameter = keyspaceNotificationsConfigParameter; } @Override public void afterPropertiesSet() throws Exception { this.init(); } } ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/listener/RedisListener.java
New file @@ -0,0 +1,65 @@ package com.ruoyi.common.redis.listener; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.stereotype.Component; import java.util.Date; @Slf4j @Component public class RedisListener extends KeyExpirationEventMessageListener { private RedisTemplate<String, Object> redisTemplate; public RedisListener(RedisMessageListenerContainer listenerContainer, RedisTemplate redisTemplate) { super(listenerContainer); this.redisTemplate=redisTemplate; } @Override public void onMessage(Message message, byte[] pattern) { // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key String expiredKey = message.toString(); log.info("RedisListener key={}", expiredKey); String time= DateUtils.dateTime(new Date()); try { if(StringUtils.isNotBlank(expiredKey)){ if(expiredKey.contains("-")){ String[] split = expiredKey.split("-"); String operation=split[0]; //删除失效的key redisTemplate.delete(expiredKey); } } }catch (Exception e){ e.printStackTrace(); } } public <T> T getAndSet(final String key, T value){ T oldValue=null; try { ValueOperations<String, Object> operations = redisTemplate.opsForValue(); oldValue =(T) operations.getAndSet(key, value); } catch (Exception e) { e.printStackTrace(); } return oldValue; } //延时任务表 } ruoyi-modules/ruoyi-goods/pom.xml
@@ -78,11 +78,6 @@ <artifactId>ruoyi-common-swagger</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> ruoyi-modules/ruoyi-member/pom.xml
@@ -78,11 +78,7 @@ <artifactId>ruoyi-common-swagger</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtMemberController.java
@@ -2,9 +2,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.member.domain.dto.MgtMemberPageDto; import com.ruoyi.member.domain.vo.MerMemberInfoVo; import com.ruoyi.member.domain.vo.MgtMemberPageVo; import com.ruoyi.member.service.member.MemberService; import com.ruoyi.system.api.domain.dto.MerBaseGetDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -34,7 +37,7 @@ @RequestMapping(value = "/pageMgtMember", method = RequestMethod.POST) @ApiOperation(value = "分页获取用户列表") @ApiOperation(value = "分页获取会员列表") public R<Page<MgtMemberPageVo>> pageMgtMember(@RequestBody MgtMemberPageDto mgtMemberPageDto) { Page<MgtMemberPageVo> page = new Page<>(); page.setSize(mgtMemberPageDto.getPageSize()); @@ -42,4 +45,12 @@ List<MgtMemberPageVo> mgtShopPageVoList = memberService.pageMgtMember(page,mgtMemberPageDto); return R.ok(page.setRecords(mgtShopPageVoList)); } @RequestMapping(value = "/editMemberRelationShop", method = RequestMethod.POST) @ApiOperation(value = "修改会员关联商户") public R<MerMemberInfoVo> getMerMemberInfo(@RequestBody MerBaseGetDto merBaseGetDto) { Long userId = SecurityUtils.getUserId(); MerMemberInfoVo merMemberInfo = memberService.getMerMemberInfo(Long.valueOf(merBaseGetDto.getId())); return R.ok(merMemberInfo); } } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MgtMemberPageDto.java
@@ -69,6 +69,12 @@ @ApiModelProperty(value = "活跃度id") private Long activenessId; @ApiModelProperty(value = "活跃度开始时间",hidden = true) private String actStartDate; @ApiModelProperty(value = "活跃度结束时间",hidden = true) private String actEndDate; @ApiModelProperty(value = "开始消费次数") private Integer startPayCount; ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/pojo/coupon/Coupon.java
@@ -117,6 +117,47 @@ @TableField("update_user_id") private Long updateUserId; /** * 优惠券来源1平台2商户 */ @TableField("coupon_from") private Integer coupon_from; /** * 商户id */ @TableField("shop_id") private Long shop_id; /** * 关联商品ids */ @TableField("rel_goods_ids") private String rel_goods_ids; /** * 审核状态1申请中2审核通过3审核拒绝 */ @TableField("audit_status") private Integer audit_status; /** * 审核理由 */ @TableField("audit_reason") private String audit_reason; /** * 关联类型 */ @TableField("relation_type") private Integer relationType; /** * 关联活动id */ @TableField("relation_activity_id") private String relationActivityId; @Override protected Serializable pkVal() { ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtMemberPageVo.java
@@ -66,7 +66,7 @@ @ApiModelProperty(value = "客户类型") private String goodsType; @ApiModelProperty(value = "客户类型") @ApiModelProperty(value = "关联商户名称") private String relationShopName; @ApiModelProperty(value = "积分") ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml
@@ -218,6 +218,60 @@ <if test="param.keyword != null and param.keyword != ''"> AND (tm.member_no LIKE CONCAT('%',#{param.keyword},'%') OR tm.mobile LIKE CONCAT('%',#{param.keyword},'%') OR tm.real_name LIKE CONCAT('%',#{param.keyword},'%') OR tm.nick_name LIKE CONCAT('%',#{param.keyword},'%') OR FIND_IN_SET(tm.member_nurse,#{param.keyword})) </if> <if test="param.belongDistrict != null and param.belongDistrict != ''"> AND tm.belong_district = #{param.belongDistrict} </if> <if test="param.createTime != null and param.createTime != ''"> AND tm.create_time = #{param.createTime} </if> <if test="param.lastPayTime != null and param.lastPayTime != ''"> AND tmt.last_pay_time = #{param.lastPayTime} </if> <if test="param.memberFlag != null and param.memberFlag != ''"> AND tmt.binding_flag = #{param.memberFlag} </if> <if test="param.goodsType != null and param.goodsType != ''"> AND FIND_IN_SET(tm.goods_type,#{param.goodsType}) </if> <if test="param.relationShopId != null and param.relationShopId != ''"> AND tm.relation_shop_id = #{param.relationShopId} </if> <if test="param.memberFrom != null and param.memberFrom != ''"> AND tm.customer_source = #{param.memberFrom} </if> <if test="param.referrer != null and param.referrer != ''"> AND tm.referrer = #{param.referrer} </if> <if test="param.gender != null"> AND tm.gender = #{param.gender} </if> <if test="param.startBirthday != null and param.startBirthday != ''"> AND tm.birthday >= #{param.startBirthday} </if> <if test="param.endBirthday != null and param.endBirthday != ''"> AND tm.birthday <= #{param.endBirthday} </if> <if test="param.startIntegral != null and param.startIntegral != ''"> AND tmt.total_integral >= #{param.startIntegral} </if> <if test="param.endIntegral != null and param.endIntegral != ''"> AND tmt.total_integral <= #{param.endIntegral} </if> <if test="param.actStartDate != null and param.actStartDate != ''"> AND tmt.last_pay_time >= #{param.actStartDate} </if> <if test="param.actEndDate != null and param.actEndDate != ''"> AND tmt.last_pay_time <= #{param.actEndDate} </if> <if test="param.startPayCount != null and param.startPayCount != ''"> AND tmt.total_pay_count >= #{param.startPayCount} </if> <if test="param.endPayCount != null and param.endPayCount != ''"> AND tmt.total_pay_count <= #{param.endPayCount} </if> <if test="param.memberTag != null and param.memberTag != ''"> AND FIND_IN_SET( tm.user_tags,#{param.memberTag}) </if> </select> </mapper> ruoyi-modules/ruoyi-order/pom.xml
@@ -78,11 +78,6 @@ <artifactId>ruoyi-common-swagger</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> ruoyi-modules/ruoyi-shop/pom.xml
@@ -78,11 +78,6 @@ <artifactId>ruoyi-common-swagger</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> ruoyi-modules/ruoyi-system/pom.xml
@@ -78,11 +78,6 @@ <artifactId>ruoyi-common-swagger</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> @@ -122,6 +117,8 @@ <version>5.8.2</version> <scope>test</scope> </dependency> </dependencies> <build> ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/DelayTask.java
New file @@ -0,0 +1,59 @@ package com.ruoyi.system.domain.pojo.config; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * * </p> * * @author jqs * @since 2023-05-29 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_delay_task") public class DelayTask extends Model<DelayTask> { private static final long serialVersionUID = 1L; /** * 延时任务id */ @TableId(value = "task_id", type = IdType.AUTO) private Integer taskId; /** * 删除标记 */ @TableField("del_flag") private Integer delFlag; /** * 键值 */ @TableField("redis_key") private String redisKey; /** * 执行时间 */ @TableField("end_time") private Date endTime; @Override protected Serializable pkVal() { return this.taskId; } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/DelayTaskMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.mapper.config; import com.ruoyi.system.domain.pojo.config.DelayTask; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * Mapper 接口 * </p> * * @author jqs * @since 2023-05-29 */ public interface DelayTaskMapper extends BaseMapper<DelayTask> { } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/DelayTaskService.java
New file @@ -0,0 +1,17 @@ package com.ruoyi.system.service.config; import com.ruoyi.system.domain.pojo.config.DelayTask; import com.baomidou.mybatisplus.extension.service.IService; ; /** * <p> * 服务类 * </p> * * @author jqs * @since 2023-05-29 */ public interface DelayTaskService extends IService<DelayTask> { } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/DelayTaskServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.system.service.impl.config; import com.ruoyi.system.domain.pojo.config.DelayTask; import com.ruoyi.system.mapper.config.DelayTaskMapper; import com.ruoyi.system.service.config.DelayTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 服务实现类 * </p> * * @author jqs * @since 2023-05-29 */ @Service public class DelayTaskServiceImpl extends ServiceImpl<DelayTaskMapper, DelayTask> implements DelayTaskService { } ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/DelayTaskMapper.xml
New file @@ -0,0 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.system.mapper.config.DelayTaskMapper"> </mapper>