Selaa lähdekoodia

Merge branch 'feature/1025-sysmessage' into develop-new

yuanliang 1 vuosi sitten
vanhempi
commit
6212de368a

+ 80 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SysMessageController.java

@@ -0,0 +1,80 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.search.SysMessageQueryInfo;
+import com.yonge.cooleshow.biz.dal.entity.SysMessage;
+import com.yonge.cooleshow.biz.dal.service.SysMessageService;
+import com.yonge.cooleshow.biz.dal.wrapper.SysMessageWrapper;
+import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.admin:}/sysMessage")
+@Api(tags = "系统消息表")
+public class SysMessageController {
+
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    /**
+     * 查询分页
+     */
+    @ApiOperation(value = "查询分页", notes = "传入SysMessageWrapper.SysMessageQuery")
+    @PreAuthorize("@pcs.hasPermissions('sysMessage/page', {'BACKEND'})")
+    @PostMapping("/page")
+    public R<PageInfo<SysMessageWrapper.SysMessage>> page(@RequestBody SysMessageWrapper.SysMessageQuery query) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            throw new BizException(HttpStatus.FORBIDDEN.value(), "请登录");
+        }
+
+        // 用户消息
+        SysMessageQueryInfo queryInfo = JSON.parseObject(query.jsonString(),
+                SysMessageQueryInfo.class);
+        com.yonge.toolset.base.page.PageInfo<SysMessage> pages = sysMessageService.queryPage(queryInfo);
+
+        // 数据类型转换
+        List<SysMessageWrapper.SysMessage> records = JSON.parseArray(JSON.toJSONString(pages.getRows()),
+                SysMessageWrapper.SysMessage.class);
+
+        Pattern pattern = Pattern.compile("验证码\\d+");
+        records.forEach(next -> {
+            String content = next.getContent();
+            if (StringUtils.isNotEmpty(content)) {
+                Matcher matcher = pattern.matcher(content);
+                if (matcher.find()) {
+                    next.setVerityCode(matcher.group().replace("验证码", ""));
+                }
+            }
+        });
+        PageInfo<SysMessageWrapper.SysMessage> response = QueryInfo.pageInfo(QueryInfo.getPage(query), records);
+        response.setTotal(pages.getTotal());
+        return R.from(response);
+    }
+
+}

+ 5 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -408,4 +408,9 @@ public interface SysConfigConstant {
      * 学生默认头像
      */
     String STUDENT_AVATAR = "student_avatar";
+
+    /**
+     * 验证码有效时间
+     */
+    String VERIFY_CODE_EXPIRE_TIME = "verify_code_expire_time";
 }

+ 80 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/SysMessageController.java

@@ -0,0 +1,80 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.search.SysMessageQueryInfo;
+import com.yonge.cooleshow.biz.dal.entity.SysMessage;
+import com.yonge.cooleshow.biz.dal.service.SysMessageService;
+import com.yonge.cooleshow.biz.dal.wrapper.SysMessageWrapper;
+import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/sysMessage")
+@Api(tags = "系统消息表")
+public class SysMessageController {
+
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    /**
+     * 查询分页
+     */
+    @ApiOperation(value = "查询分页", notes = "传入SysMessageWrapper.SysMessageQuery")
+    @PreAuthorize("@pcs.hasPermissions('sysMessage/page', {'BACKEND'})")
+    @PostMapping("/page")
+    public R<PageInfo<SysMessageWrapper.SysMessage>> page(@RequestBody SysMessageWrapper.SysMessageQuery query) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            throw new BizException(HttpStatus.FORBIDDEN.value(), "请登录");
+        }
+
+        // 用户消息
+        SysMessageQueryInfo queryInfo = JSON.parseObject(query.jsonString(),
+                SysMessageQueryInfo.class);
+        com.yonge.toolset.base.page.PageInfo<SysMessage> pages = sysMessageService.queryPage(queryInfo);
+
+        // 数据类型转换
+        List<SysMessageWrapper.SysMessage> records = JSON.parseArray(JSON.toJSONString(pages.getRows()),
+                SysMessageWrapper.SysMessage.class);
+
+        Pattern pattern = Pattern.compile("验证码\\d+");
+        records.forEach(next -> {
+            String content = next.getContent();
+            if (StringUtils.isNotEmpty(content)) {
+                Matcher matcher = pattern.matcher(content);
+                if (matcher.find()) {
+                    next.setVerityCode(matcher.group().replace("验证码", ""));
+                }
+            }
+        });
+        PageInfo<SysMessageWrapper.SysMessage> response = QueryInfo.pageInfo(QueryInfo.getPage(query), records);
+        response.setTotal(pages.getTotal());
+        return R.from(response);
+    }
+
+}

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/SysMessageQueryInfo.java

@@ -2,7 +2,11 @@ package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
+import java.util.Date;
+
+@Data
 public class SysMessageQueryInfo extends QueryInfo {
 
 	/** 状态,0,待发送;1,发送中;2,发送完成 */
@@ -30,6 +34,15 @@ public class SysMessageQueryInfo extends QueryInfo {
 	@ApiModelProperty("0:未读,1:已读")
 	private Integer readStatus;
 
+	@ApiModelProperty("消息类型EMessageType,多个用逗号隔开,验证码登录:SMS_VERIFY_CODE_LOGIN,密码修改:SMS_VERIFY_CODE_UPDATE_PSW")
+	private String messageType;
+
+	@ApiModelProperty("发送开始时间")
+	private Date startTime;
+
+	@ApiModelProperty("发送结束时间")
+	private Date endTime;
+
 	public String getClientId() {
 		return clientId;
 	}

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMessage.java

@@ -80,6 +80,9 @@ public class SysMessage extends BaseEntity {
 	@ApiModelProperty(value = "图标",required = false)
 	private String img;
 
+	@ApiModelProperty("消息类型")
+	private String messageType;
+
 	public SysMessage() {
 	}
 

+ 11 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -11,8 +12,10 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageSendMode;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SendStatusEnum;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageConfigService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.Mapper;
 import com.yonge.cooleshow.common.redis.service.RedisCache;
 import com.yonge.toolset.base.exception.BizException;
@@ -48,6 +51,8 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
 	private RedisCache<String, Object> redisCache;
+	@Autowired
+	private SysConfigService sysConfigService;
 	// 验证码有效期
 	public static final int CODE_EXPIRE = 60 * 10;
 	// 发送验证码的间隔时间
@@ -310,7 +315,12 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		Map<Long, String> receivers = new HashMap<>(1);
 		receivers.put(userId, receiver);
 		batchSendMessage(messageSender, messageType, receivers, null, 1, "","",platform, code);
-		redisCache.put(key, code + "", CODE_EXPIRE);
+		String configValue = sysConfigService.findConfigValue(SysConfigConstant.VERIFY_CODE_EXPIRE_TIME);
+		if(StringUtils.isNotEmpty(configValue) && NumberUtil.isNumber(configValue)){
+			redisCache.put(key, code + "", Integer.parseInt(configValue) * 60);
+		}else {
+			redisCache.put(key, code + "", CODE_EXPIRE);
+		}
 		redisCache.put(key1, code + "", CODE_INTERVAL_TIME);
 		return true;
 	}

+ 146 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/SysMessageWrapper.java

@@ -0,0 +1,146 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SendStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * 消息表
+ * 2023-10-25 16:05:36
+ */
+@ApiModel(value = "SysMessageWrapper对象", description = "消息表查询对象")
+public class SysMessageWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" SysMessageQuery-消息表")
+    public static class SysMessageQuery implements QueryInfo {
+        @ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty(value = "发送人编号")
+        private Long userId;
+
+        @ApiModelProperty("客户端STUDENT,TEACHER,BACKEND,SCHOOL")
+        private ClientEnum clientId;
+
+        @ApiModelProperty(value = "状态,0,待发送;1,发送中;2,发送完成 ")
+        private Integer status;
+
+        @ApiModelProperty(value = "接收人编号")
+        private String receiver;
+
+        @ApiModelProperty(value = "消息类型;1,表示短信;2,表示邮件; 3,app推送消息",required = false)
+        private Integer type;
+
+        @ApiModelProperty("消息组 ")
+        private String group;
+
+        @ApiModelProperty("0:未读,1:已读")
+        private Boolean readStatus;
+
+        @ApiModelProperty("消息类型EMessageType,多个用逗号隔开,验证码登录:SMS_VERIFY_CODE_LOGIN,密码修改:SMS_VERIFY_CODE_UPDATE_PSW")
+        private String messageType;
+
+        @ApiModelProperty("发送开始时间")
+        private Date startTime;
+
+        @ApiModelProperty("发送结束时间")
+        private Date endTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+    }
+
+    @Data
+    @ApiModel(" SysMessage-消息表")
+    public static class SysMessage {
+
+        @ApiModelProperty("主键")
+        private Long id;
+
+        @ApiModelProperty("用户编号")
+        private Long userId;
+
+        @ApiModelProperty("消息配置id")
+        private Long messageConfigId;
+
+        @ApiModelProperty("消息类型;1,表示短信;2,表示邮件; 3,app推送消息")
+        private String type;
+
+        @ApiModelProperty("标题")
+        private String title;
+
+        @ApiModelProperty("消息内容")
+        private String content;
+
+        @ApiModelProperty("状态,-1,发送失败;0,待发送;1,发送中;2,发送完成")
+        private SendStatusEnum status;
+
+        @ApiModelProperty("接收人(多个人用逗号分隔)")
+        private String receiver;
+
+        @ApiModelProperty("发送时间")
+        private Date sendTime;
+
+        @ApiModelProperty("错误信息")
+        private String errorMsg;
+
+        @ApiModelProperty("创建时间")
+        private Date createOn;
+
+        @ApiModelProperty("修改时间")
+        private Date modifyOn;
+
+        @ApiModelProperty("备注")
+        private String memo;
+
+        @ApiModelProperty("是否已读")
+        private Boolean readStatus;
+
+        @ApiModelProperty("消息组")
+        private String group;
+
+        @ApiModelProperty("客户端STUDENT,TEACHER,SYSTEM")
+        private String clientId;
+
+        @ApiModelProperty("跳转信息")
+        private String url;
+
+        @ApiModelProperty("TEACHER_AUTH:达人认证,MUSICIAN_AUTH:音乐人认证,PRACTICE:陪练课,LIVE:直播课,VIDEO:视频课,MUSIC_SHEET:乐谱," +
+                "COURSE:课程,INCOME:收入,HOMEWORK:作业,EVALUATE:评价,GROUP_CHAT:群聊,VIP:会员,NOTICE:公告")
+        private String subType;
+
+
+        @ApiModelProperty("验证码")
+        private String verityCode;
+
+        @ApiModelProperty("消息类型")
+        private String messageType;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static SysMessage from(String json) {
+            return JSON.parseObject(json, SysMessage.class);
+        }
+    }
+
+}

+ 103 - 26
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMessageMapper.xml

@@ -6,31 +6,32 @@
 -->
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.SysMessageDao">
 
-    <resultMap type="com.yonge.cooleshow.biz.dal.entity.SysMessage" id="message">
-        <result column="id_" property="id"/>
-        <result column="title_" property="title"/>
-        <result column="content_" property="content"/>
-        <result column="type_" property="type" />
-        <result column="status_" property="status" />
-        <result column="receiver_" property="receiver"/>
-        <result column="send_time_" property="sendTime"/>
-        <result column="error_msg_" property="errorMsg"/>
-        <result column="create_on_" property="createOn"/>
-        <result column="modify_on_" property="modifyOn"/>
-        <result column="user_id_" property="userId"/>
-        <result column="message_config_id_" property="messageConfigId"/>
-        <result column="sub_type_" property="subType"/>
-        <result column="memo_" property="memo"/>
-        <result column="read_status_" property="readStatus"/>
-        <result column="group_" property="group"/>
-        <result column="client_id_" property="clientId"/>
-        <result column="img" property="img"/>
-    </resultMap>
-    
     <resultMap type="com.yonge.cooleshow.biz.dal.dto.SysMessageDto" id="messageDto" extends="message">
         <result column="username_" property="user.username"/>
     </resultMap>
-    
+
+	<resultMap type="com.yonge.cooleshow.biz.dal.entity.SysMessage" id="message">
+		<result column="id_" property="id"/>
+		<result column="title_" property="title"/>
+		<result column="content_" property="content"/>
+		<result column="type_" property="type" />
+		<result column="status_" property="status" />
+		<result column="receiver_" property="receiver"/>
+		<result column="send_time_" property="sendTime"/>
+		<result column="error_msg_" property="errorMsg"/>
+		<result column="create_on_" property="createOn"/>
+		<result column="modify_on_" property="modifyOn"/>
+		<result column="user_id_" property="userId"/>
+		<result column="message_config_id_" property="messageConfigId"/>
+		<result column="sub_type_" property="subType"/>
+		<result column="memo_" property="memo"/>
+		<result column="read_status_" property="readStatus"/>
+		<result column="group_" property="group"/>
+		<result column="client_id_" property="clientId"/>
+		<result column="img" property="img"/>
+		<result column="message_type_" property="messageType"/>
+	</resultMap>
+
     <resultMap type="com.yonge.cooleshow.biz.dal.dto.Mapper" id="Mapper">
     	<result column="key_" property="key"/>
         <result column="value_" property="value"/>
@@ -169,16 +170,92 @@
 
     <select id="queryCount" parameterType="map" resultType="int">
 		select count(m.id_) from sys_message m
-		<include refid="queryCondition" />
-		order by m.create_on_ desc
+		left join sys_message_config smc on m.message_config_id_ = smc.id_
+		<where>
+			m.send_time_ &lt;= now()
+			<if test="clientId != null and clientId != ''">
+				and (m.client_id_ = #{clientId} OR m.client_id_ IS NULL)
+			</if>
+			<if test="userId != null">
+				and m.user_id_ = #{userId}
+			</if>
+			<if test="receiver != null">
+				and m.receiver_ like '%' #{receiver} '%'
+			</if>
+			<if test="status != null">
+				and m.status_ = #{status,jdbcType=TINYINT}
+			</if>
+			<if test="readStatus != null">
+				and m.read_status_ = #{readStatus,jdbcType=TINYINT}
+			</if>
+			<if test="title != null">
+				and m.title_ like '%' #{title} '%'
+			</if>
+			<if test="type != null">
+				and m.type_ = #{type}
+			</if>
+			<if test="group != null">
+				and m.group_ = #{group}
+			</if>
+			<if test="readStatus != null">
+				and m.read_status_ = #{readStatus}
+			</if>
+			<if test="messageType != null and messageType.trim() != ''">
+				and find_in_set(smc.message_type_, #{messageType})
+			</if>
+			<if test="startTime != null">
+				and m.send_time_ >= #{startTime}
+			</if>
+			<if test="endTime != null">
+				and #{endTime} >= m.send_time_
+			</if>
+		</where>
 	</select>
 
 	<select id="queryPage" parameterType="map" resultMap="message">
 		select m.*,
-		smc.sub_type_,smc.icon_ img
+		smc.sub_type_, smc.message_type_
 		from sys_message m
 		left join sys_message_config smc on m.message_config_id_ = smc.id_
-		<include refid="queryCondition" />
+		<where>
+			m.send_time_ &lt;= now()
+			<if test="clientId != null and clientId != ''">
+				and (m.client_id_ = #{clientId} OR m.client_id_ IS NULL)
+			</if>
+			<if test="userId != null">
+				and m.user_id_ = #{userId}
+			</if>
+			<if test="receiver != null">
+				and m.receiver_ like '%' #{receiver} '%'
+			</if>
+			<if test="status != null">
+				and m.status_ = #{status,jdbcType=TINYINT}
+			</if>
+			<if test="readStatus != null">
+				and m.read_status_ = #{readStatus,jdbcType=TINYINT}
+			</if>
+			<if test="title != null">
+				and m.title_ like '%' #{title} '%'
+			</if>
+			<if test="type != null">
+				and m.type_ = #{type}
+			</if>
+			<if test="group != null">
+				and m.group_ = #{group}
+			</if>
+			<if test="readStatus != null">
+				and m.read_status_ = #{readStatus}
+			</if>
+			<if test="messageType != null and messageType.trim() != ''">
+				and find_in_set(smc.message_type_, #{messageType})
+			</if>
+			<if test="startTime != null">
+				and m.send_time_ >= #{startTime}
+			</if>
+			<if test="endTime != null">
+				and #{endTime} >= m.send_time_
+			</if>
+		</where>
 		order by m.create_on_ desc
 		<include refid="global.limit" />
 	</select>