✨ Introducing new features. 新增消息管理

This commit is contained in:
lbw committed 2023-11-09 16:16:31 +08:00
1 parent 4de8ccef2f
commit 3ea702c420
13 files changed
+776 -3

No files matched your search

+51 -2
View File
@@ -115,6 +115,7 @@ INSERT INTO `sys_dict` VALUES (24, 'leave_status', '请假状态', 'admin', ' ',
INSERT INTO `sys_dict` VALUES (25, 'schedule_type', '日程类型', 'admin', ' ', '2023-03-06 14:49:18', NULL, NULL, '0', '0', 1);
INSERT INTO `sys_dict` VALUES (26, 'schedule_status', '日程状态', 'admin', ' ', '2023-03-06 14:52:57', NULL, NULL, '0', '0', 1);
INSERT INTO `sys_dict` VALUES (27, 'ds_type', '代码生成器支持的数据库类型', 'admin', ' ', '2023-03-12 09:57:59', NULL, NULL, '1', '0', 1);
INSERT INTO `sys_dict` VALUES (28, 'message_type', '消息类型', 'admin', ' ', '2023-10-27 10:29:48', NULL, NULL, '1', '0', 1);
COMMIT;
-- ----------------------------
@@ -237,6 +238,8 @@ INSERT INTO `sys_dict_item` VALUES (89, 27, 'mssql', 'mssql', 'ds_type', 'mssql'
INSERT INTO `sys_dict_item` VALUES (90, 27, 'db2', 'db2', 'ds_type', 'db2', 4, 'admin', ' ', '2023-03-12 09:58:53', NULL, NULL, '0', 1);
INSERT INTO `sys_dict_item` VALUES (91, 27, 'dm', '达梦', 'ds_type', '达梦', 5, 'admin', ' ', '2023-03-12 09:59:07', NULL, NULL, '0', 1);
INSERT INTO `sys_dict_item` VALUES (92, 27, 'highgo', '瀚高', 'ds_type', '瀚高数据库', 5, 'admin', ' ', '2023-03-12 09:59:07', NULL, NULL, '0', 1);
INSERT INTO `sys_dict_item` VALUES (93, 28, '0', '公告', 'message_type', '主页公告显示', 0, 'admin', ' ', '2023-10-27 10:30:14', NULL, NULL, '0', 1);
INSERT INTO `sys_dict_item` VALUES (94, 28, '1', '站内信', 'message_type', '右上角显示', 1, 'admin', ' ', '2023-10-27 10:30:47', NULL, NULL, '0', 1);
COMMIT;
-- ----------------------------
@@ -1041,7 +1044,7 @@ CREATE TABLE `sys_schedule` (
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题',
`type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '日程类型',
`state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '状态',
`content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '内容',
`content` text COLLATE utf8mb4_general_ci COMMENT '内容',
`time` time DEFAULT NULL COMMENT '时间',
`date` date DEFAULT NULL COMMENT '日期',
`create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人',
@@ -1159,7 +1162,7 @@ CREATE TABLE `sys_user` (
-- Records of sys_user
-- ----------------------------
BEGIN;
INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$c/Ae0pRjJtMZg3BnvVpO.eIK6WYWVbKTzqgdy3afR7w.vd.xi3Mgy', '', '17034642999', '/admin/sys-file/local/46811160fd824c7998303a73fb368076.png', '管理员666777', '管理员', 'sw@mail.pigxl.vip', 4, ' ', 'admin', '2018-04-20 07:15:18', '2023-04-06 16:04:23', '0', '0', NULL, 'oBxPy5E-v82xWGsfzZVzkD3wEX64', NULL, 'log4j', NULL, 1);
INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$c/Ae0pRjJtMZg3BnvVpO.eIK6WYWVbKTzqgdy3afR7w.vd.xi3Mgy', '', '13054729089', '/admin/sys-file/local/2a14ae08150e483c93e12ac8934173e2.png', '管理员666777', '管理员', 'sw@mail.pigxl.vip', 4, ' ', 'admin', '2018-04-20 07:15:18', '2023-04-03 14:00:06', '0', '0', NULL, 'oBxPy5E-v82xWGsfzZVzkD3wEX64', NULL, 'log4j', NULL, NULL,NULL,1);
COMMIT;
-- ----------------------------
@@ -1196,4 +1199,50 @@ BEGIN;
INSERT INTO `sys_user_role` VALUES (1, 1);
COMMIT;
-- ----------------------------
-- Table structure for sys_message
-- ----------------------------
DROP TABLE IF EXISTS `sys_message`;
CREATE TABLE `sys_message` (
`id` bigint NOT NULL COMMENT '主键',
`category` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分类',
`title` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题',
`content` text COLLATE utf8mb4_general_ci COMMENT '内容',
`send_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否推送',
`all_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '全部接受',
`sort` int unsigned NOT NULL DEFAULT '0' COMMENT '排序 (越大越在前)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
`update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除时间',
`tenant_id` bigint DEFAULT NULL COMMENT '租户',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='站内信息';
-- ----------------------------
-- Records of sys_message
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for sys_message_relation
-- ----------------------------
DROP TABLE IF EXISTS `sys_message_relation`;
CREATE TABLE `sys_message_relation` (
`id` bigint NOT NULL COMMENT '主键',
`msg_id` bigint DEFAULT NULL COMMENT '消息ID',
`user_id` bigint DEFAULT NULL COMMENT '接收人ID',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '内容',
`read_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '已读(0否,1是)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建人',
`update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除时间',
`tenant_id` bigint DEFAULT NULL COMMENT '租户',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统消息推送记录';
SET FOREIGN_KEY_CHECKS = 1;
+1 -1
View File
@@ -38,7 +38,7 @@ INSERT INTO `config_info` VALUES (3, 'pigx-codegen-dev.yml', 'DEFAULT_GROUP', '#
INSERT INTO `config_info` VALUES (4, 'pigx-daemon-elastic-job-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true', '09996f46e0b80d7b2aa320ef4cb31c82', '2022-12-16 10:44:25', '2023-04-07 14:14:50', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` VALUES (5, 'pigx-gateway-dev.yml', 'DEFAULT_GROUP', 'gateway:\n encode-key: \'pigxpigxpigxpigx\'\n\n# 验证码相关配置参考: http://t.cn/A647jEdu\naj:\n captcha:\n cache-type: redis\n water-mark: pig4cloud\n\n# 固定路由转发配置 无修改\nspring:\n cloud:\n gateway:\n routes:\n - id: openapi\n uri: lb://pigx-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?<path>.*), /$\\{path}/$\\{path}/v3/api-docs\n\n# gateway 刷新端点\nmanagement:\n endpoint:\n gateway:\n enabled: true\n', 'd138f5bafa91ab76dca8c4c1a01c1de2', '2022-12-16 10:44:25', '2023-07-28 16:49:29', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` VALUES (6, 'pigx-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n # 安全配置\n security:\n user:\n name: ENC(rZHA4LW5hHmhLAAzJoFNag==) # pigx\n password: ENC(bjeyh+Aeii3kHXkoo00ZUw==) # pigx\n autoconfigure:\n exclude: com.pig4cloud.pigx.common.core.config.JacksonConfiguration\n boot:\n admin:\n ui:\n title: \'pigx 服务状态监控\'\n brand: \'pigx 服务状态监控\'\n external-views:\n - label: \"SQL监控\"\n url: /druid/sql.html\n order: 2000\n iframe: true\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS #显示详细信息\n\n\n# druid 监控的服务\nmonitor:\n applications:\n - pigx-upms-biz\n', '2bb39e4dee3f90d4186d1e42aa666d2a', '2022-12-16 10:44:25', '2023-04-07 14:12:09', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` VALUES (7, 'pigx-upms-biz-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /druid/**\n\n# 数据源\nspring:\n autoconfigure:\n exclude: org.springframework.cloud.gateway.config.GatewayAutoConfiguration,org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n stat-view-servlet:\n enabled: true\n allow: \"\"\n url-pattern: /druid/*\n #login-username: admin\n #login-password: admin\n filter:\n stat:\n enabled: true\n log-slow-sql: true\n slow-sql-millis: 10000\n merge-sql: false\n wall:\n config:\n multi-statement-allow: true\n\n# 本地文件系统\nfile:\n local:\n enable: true\n basePath: /Users/lengleng/Downloads/files\n\n# Logger Config\nlogging:\n level:\n com.pig4cloud.pigx.admin.mapper: debug\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - sys_user\n - sys_role\n - sys_menu\n - sys_dept\n - sys_log\n - sys_social_details\n - sys_dict\n - sys_dict_item\n - sys_public_param\n - sys_log\n - sys_file\n - sys_file_group\n - sys_oauth_client_details\n - sys_post', 'a37e3dc8cf649be64bd35cc5e5e355a9', '2022-12-16 10:44:25', '2023-07-28 13:47:59', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` VALUES (7, 'pigx-upms-biz-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /druid/**\n\n# 数据源\nspring:\n autoconfigure:\n exclude: org.springframework.cloud.gateway.config.GatewayAutoConfiguration,org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n stat-view-servlet:\n enabled: true\n allow: \"\"\n url-pattern: /druid/*\n #login-username: admin\n #login-password: admin\n filter:\n stat:\n enabled: true\n log-slow-sql: true\n slow-sql-millis: 10000\n merge-sql: false\n wall:\n config:\n multi-statement-allow: true\n\n# 本地文件系统\nfile:\n local:\n enable: true\n basePath: /Users/lengleng/Downloads/files\n\n# Logger Config\nlogging:\n level:\n com.pig4cloud.pigx.admin.mapper: debug\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - sys_user\n - sys_role\n - sys_menu\n - sys_dept\n - sys_log\n - sys_social_details\n - sys_dict\n - sys_dict_item\n - sys_public_param\n - sys_log\n - sys_file\n - sys_file_group\n - sys_oauth_client_details\n - sys_post\n - sys_message\n - sys_message_relation', '90d96cb006f342d06da031cff829615c', '2022-12-16 10:44:25', '2023-10-28 21:59:30', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` VALUES (8, 'pigx-daemon-quartz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n quartz:\n #相关属性配置\n properties:\n org:\n quartz:\n scheduler:\n instanceName: clusteredScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n clusterCheckinInterval: 10000\n useProperties: false\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 50\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n #数据库方式\n job-store-type: jdbc\n #初始化表结构\n #jdbc:\n #initialize-schema: never\n\n', '5f7a45c377318ce767433a1e210e8584', '2022-12-16 10:44:25', '2023-04-07 14:13:08', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` VALUES (9, 'pigx-pay-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_pay}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/\n# 租户表维护\npigx:\n pay:\n test: lengleng\n aliPayConfig:\n expire-time: 30\n return-url: http://pig4cloud.com\n notify-url: http://payx.yunjihuitong.com/pay/notify/ali/callbak\n wxPayConfig:\n notify-url: https://admin.pig4cloud.com/pay/notify/wx/callbak\n mergePayConfig:\n return-url: http://pig4cloud.com\n notify-url: http://wechat.pigx.top/pay/notify/merge/callbak\n xsequence: #发号器相关配置\n db:\n retry-times: 3\n table-name: pay_sequence\n tenant:\n column: tenant_id\n tables:\n - pay_channel\n - pay_trade_order\n - pay_goods_order\n - pay_notify_record\n - pay_refund_order', 'c70a66d3c300eab1afef0ed4ad9d42d5', '2022-12-16 10:44:25', '2023-04-07 14:12:40', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` VALUES (11, 'pigx-mp-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_mp}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - wx_mp_menu\n - wx_account\n - wx_account_tag\n - wx_account_fans\n - wx_msg\n - wx_auto_reply', 'ea4e59c98b8aeb4dd78ec989e7f197a4', '2022-12-16 10:44:25', '2023-01-29 13:12:59', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', '');
@@ -0,0 +1,108 @@
package com.pig4cloud.pigx.admin.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 站内信息
*
* @author pig
* @date 2023-10-25 13:37:25
*/
@Data
@TableName("sys_message")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "站内信息")
public class SysMessageEntity extends Model<SysMessageEntity> {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private Long id;
/**
* 分类
*/
@Schema(description = "分类 0-公告 1-站内信")
private String category;
/**
* 标题
*/
@Schema(description = "标题")
private String title;
/**
* 内容
*/
@Schema(description = "内容")
private String content;
/**
* 是否推送
*/
@Schema(description = "是否推送")
private String sendFlag;
/**
* 通知全体
*/
@Schema(description = "通知全体")
private String allFlag;
/**
* 排序 (越大越在前)
*/
@Schema(description = "排序 (越大越在前)")
private Integer sort;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 更新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新人")
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新时间")
private LocalDateTime updateTime;
/**
* 删除时间
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除时间")
private String delFlag;
/**
* 租户
*/
@Schema(description = "租户")
private Long tenantId;
}
@@ -0,0 +1,96 @@
package com.pig4cloud.pigx.admin.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 系统消息推送记录
*
* @author pig
* @date 2023-10-25 18:07:23
*/
@Data
@TableName("sys_message_relation")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "系统消息推送记录")
public class SysMessageRelationEntity extends Model<SysMessageRelationEntity> {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private Long id;
/**
* 消息ID
*/
@Schema(description = "消息ID")
private Long msgId;
/**
* 接收人ID
*/
@Schema(description = "接收人ID")
private Long userId;
/**
* 内容
*/
@Schema(description = "内容")
private String content;
/**
* 已读(0否,1是)
*/
@Schema(description = "已读(0否,1是)")
private String readFlag;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 更新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新人")
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新时间")
private LocalDateTime updateTime;
/**
* 删除时间
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除时间")
private String delFlag;
/**
* 租户
*/
@Schema(description = "租户")
private Long tenantId;
}
@@ -0,0 +1,30 @@
package com.pig4cloud.pigx.admin.api.vo;
import com.pig4cloud.pigx.admin.api.entity.SysMessageRelationEntity;
import lombok.Data;
/**
* 消息阅读vo
*
* @author lengleng
* @date 2023/10/26
*/
@Data
public class SysMessageReadVO extends SysMessageRelationEntity {
/**
* 文章标题
*/
private String title;
/**
* 用户名
*/
private String username;
/**
* 姓名
*/
private String name;
}
@@ -0,0 +1,28 @@
package com.pig4cloud.pigx.admin.api.vo;
import com.pig4cloud.pigx.admin.api.entity.SysMessageEntity;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 消息发送实体
*
* @author lengleng
* @date 2023/10/25
*/
@Data
public class SysMessageVO extends SysMessageEntity {
/**
* 是否已读
*/
private String readFlag;
/**
* 发送用户列表
*/
private List<OrgTreeVO> userList = new ArrayList<>();
}
@@ -0,0 +1,169 @@
package com.pig4cloud.pigx.admin.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.admin.api.entity.SysMessageEntity;
import com.pig4cloud.pigx.admin.api.vo.SysMessageVO;
import com.pig4cloud.pigx.admin.service.SysMessageService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;
import com.pig4cloud.pigx.common.log.annotation.SysLog;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 站内信息
*
* @author pig
* @date 2023-10-25 13:37:25
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/sysMessage")
@Tag(description = "sysMessage", name = "站内信息管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class SysMessageController {
private final SysMessageService sysMessageService;
/**
* 分页查询
* @param page 分页对象
* @param sysMessage 站内信息
* @return
*/
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
@PreAuthorize("@pms.hasPermission('sys_message_view')")
public R getSysMessagePage(@ParameterObject Page page, @ParameterObject SysMessageEntity sysMessage) {
LambdaQueryWrapper<SysMessageEntity> wrapper = Wrappers.lambdaQuery();
wrapper.like(StrUtil.isNotBlank(sysMessage.getTitle()), SysMessageEntity::getTitle, sysMessage.getTitle());
return R.ok(sysMessageService.page(page, wrapper));
}
/**
* 通过id查询站内信息
* @param id id
* @return R
*/
@Operation(summary = "通过id查询", description = "通过id查询")
@GetMapping("/{id}")
@PreAuthorize("@pms.hasPermission('sys_message_view')")
public R getById(@PathVariable("id") Long id) {
return R.ok(sysMessageService.getMessage(id));
}
/**
* 新增站内信息
* @param sysMessage 站内信息
* @return R
*/
@Operation(summary = "新增站内信息", description = "新增站内信息")
@SysLog("新增站内信息")
@PostMapping
@PreAuthorize("@pms.hasPermission('sys_message_add')")
public R save(@RequestBody SysMessageVO sysMessage) {
return R.ok(sysMessageService.saveOrUpdateMessage(sysMessage));
}
/**
* 修改站内信息
* @param sysMessage 站内信息
* @return R
*/
@Operation(summary = "修改站内信息", description = "修改站内信息")
@SysLog("修改站内信息")
@PutMapping
@PreAuthorize("@pms.hasPermission('sys_message_edit')")
public R updateById(@RequestBody SysMessageVO sysMessage) {
return R.ok(sysMessageService.saveOrUpdateMessage(sysMessage));
}
/**
* 通过id删除站内信息
* @param ids id列表
* @return R
*/
@Operation(summary = "通过id删除站内信息", description = "通过id删除站内信息")
@SysLog("通过id删除站内信息")
@DeleteMapping
@PreAuthorize("@pms.hasPermission('sys_message_del')")
public R removeById(@RequestBody Long[] ids) {
return R.ok(sysMessageService.removeBatchByIds(CollUtil.toList(ids)));
}
/**
* 导出excel 表格
* @param sysMessage 查询条件
* @param ids 导出指定ID
* @return excel 文件流
*/
@ResponseExcel
@GetMapping("/export")
@PreAuthorize("@pms.hasPermission('sys_message_export')")
public List<SysMessageEntity> export(SysMessageEntity sysMessage, Long[] ids) {
return sysMessageService
.list(Wrappers.lambdaQuery(sysMessage).in(ArrayUtil.isNotEmpty(ids), SysMessageEntity::getId, ids));
}
/**
* 发送站内信息
* @param id 站内信息
* @return R
*/
@Operation(summary = "发送站内信息", description = "发送站内信息")
@SysLog("发送站内信息")
@PostMapping("/send")
@PreAuthorize("@pms.hasPermission('sys_message_add')")
public R send(Long id) {
return R.ok(sysMessageService.sendMessage(id));
}
/**
* 读取站内信息
* @param id 站内信息
* @return R
*/
@Operation(summary = "读取站内信息", description = "读取站内信息")
@SysLog("发送站内信息")
@PostMapping("/read")
public R read(Long id) {
return R.ok(sysMessageService.readMessage(id));
}
/**
* 查询用户公告
* @param page 分页条件
* @param sysMessage 查询条件
* @return list
*/
@Operation(summary = "查询用户信", description = "查询用户信")
@GetMapping("/user/page")
public R getUserMessageList(@ParameterObject Page page, SysMessageVO sysMessage) {
return R.ok(sysMessageService.pageUserMessage(page, sysMessage));
}
/**
* 查询信息阅读列表
* @return list
*/
@Operation(summary = "查询用户阅读情况", description = "查询用户阅读情况")
@GetMapping("/user/read/page")
public R getUserMessageList(@ParameterObject Page page, @ParameterObject Long messageId,
@ParameterObject @RequestParam(required = false) String name) {
return R.ok(sysMessageService.pageUserRead(page, messageId, name));
}
}
@@ -0,0 +1,10 @@
package com.pig4cloud.pigx.admin.mapper;
import com.pig4cloud.pigx.admin.api.entity.SysMessageEntity;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysMessageMapper extends PigxBaseMapper<SysMessageEntity> {
}
@@ -0,0 +1,10 @@
package com.pig4cloud.pigx.admin.mapper;
import com.pig4cloud.pigx.admin.api.entity.SysMessageRelationEntity;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysMessageRelationMapper extends PigxBaseMapper<SysMessageRelationEntity> {
}
@@ -0,0 +1,54 @@
package com.pig4cloud.pigx.admin.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pig4cloud.pigx.admin.api.entity.SysMessageEntity;
import com.pig4cloud.pigx.admin.api.vo.SysMessageVO;
public interface SysMessageService extends IService<SysMessageEntity> {
/**
* 发送信息
* @param id 消息ID
* @return true/false
*/
Boolean sendMessage(Long id);
/**
* 保存
* @param sysMessage 消息
* @return true/false
*/
Boolean saveOrUpdateMessage(SysMessageVO sysMessage);
/**
* 获取用户的信息列表
* @return list
*/
IPage<SysMessageVO> pageUserMessage(Page page, SysMessageVO sysMessage);
/**
* 读取信息
* @param id id
* @return true/false
*/
Boolean readMessage(Long id);
/**
* 获取信息
* @param id id
* @return messageVO
*/
SysMessageVO getMessage(Long id);
/**
* 查询用户阅读情况
* @param page 分页
* @param messageId 消息ID
* @param name 姓名
* @return page
*/
Page pageUserRead(Page page, Long messageId, String name);
}
@@ -0,0 +1,194 @@
package com.pig4cloud.pigx.admin.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.pig4cloud.pigx.admin.api.entity.SysMessageEntity;
import com.pig4cloud.pigx.admin.api.entity.SysMessageRelationEntity;
import com.pig4cloud.pigx.admin.api.entity.SysUser;
import com.pig4cloud.pigx.admin.api.vo.OrgTreeVO;
import com.pig4cloud.pigx.admin.api.vo.SysMessageReadVO;
import com.pig4cloud.pigx.admin.api.vo.SysMessageVO;
import com.pig4cloud.pigx.admin.mapper.SysMessageMapper;
import com.pig4cloud.pigx.admin.mapper.SysMessageRelationMapper;
import com.pig4cloud.pigx.admin.mapper.SysUserMapper;
import com.pig4cloud.pigx.admin.service.SysMessageService;
import com.pig4cloud.pigx.common.core.constant.enums.YesNoEnum;
import com.pig4cloud.pigx.common.security.util.SecurityUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 站内信息
*
* @author pig
* @date 2023-10-25 13:37:25
*/
@Service
@RequiredArgsConstructor
public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMessageEntity>
implements SysMessageService {
private final SysMessageRelationMapper relationMapper;
private final SysUserMapper userMapper;
/**
* 发送信息
* @param id id
* @return true/false
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean sendMessage(Long id) {
// 更新信息状态
SysMessageEntity sysMessage = new SysMessageEntity();
sysMessage.setSendFlag(YesNoEnum.YES.getCode());
baseMapper.update(sysMessage, Wrappers.<SysMessageEntity>lambdaQuery().eq(SysMessageEntity::getId, id));
return Boolean.TRUE;
}
/**
* 保存消息及其关联关系
* @param sysMessage 消息对象
* @return 是否保存成功
*/
@Transactional(rollbackFor = Exception.class)
public Boolean saveOrUpdateMessage(SysMessageVO sysMessage) {
SysMessageEntity messageEntity = new SysMessageEntity();
BeanUtils.copyProperties(sysMessage, messageEntity);
if (Objects.isNull(sysMessage.getId())) {
baseMapper.insert(messageEntity);
}
else {
baseMapper.updateById(sysMessage);
}
// 删除原有用户
relationMapper.delete(Wrappers.<SysMessageRelationEntity>lambdaQuery()
.eq(SysMessageRelationEntity::getMsgId, messageEntity.getId()));
List<OrgTreeVO> userList = sysMessage.getUserList();
if (CollUtil.isNotEmpty(userList)) {
userList.forEach(user -> {
SysMessageRelationEntity relationEntity = new SysMessageRelationEntity();
relationEntity.setMsgId(messageEntity.getId());
relationEntity.setUserId(user.getId());
relationMapper.insert(relationEntity);
});
}
else {
userMapper.selectList(Wrappers.emptyWrapper()).stream().map(SysUser::getUserId).forEach(userId -> {
SysMessageRelationEntity relationEntity = new SysMessageRelationEntity();
relationEntity.setMsgId(messageEntity.getId());
relationEntity.setUserId(userId);
relationMapper.insert(relationEntity);
});
}
return Boolean.TRUE;
}
/**
* 获取用户的信息列表
* @return list
*/
@Override
public IPage<SysMessageVO> pageUserMessage(Page page, SysMessageVO sysMessage) {
MPJLambdaWrapper<SysMessageEntity> wrapper = new MPJLambdaWrapper<SysMessageEntity>()
.selectAll(SysMessageEntity.class)
.select(SysMessageRelationEntity::getReadFlag)
.leftJoin(SysMessageRelationEntity.class, SysMessageRelationEntity::getMsgId, SysMessageEntity::getId)
.eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId())
.eq(SysMessageEntity::getSendFlag, YesNoEnum.YES.getCode())
.eq(StrUtil.isNotBlank(sysMessage.getCategory()), SysMessageEntity::getCategory, sysMessage.getCategory())
.eq(StrUtil.isNotBlank(sysMessage.getReadFlag()), SysMessageRelationEntity::getReadFlag,
sysMessage.getReadFlag())
.orderByDesc(SysMessageEntity::getSort)
.orderByDesc(SysMessageEntity::getCreateTime);
return baseMapper.selectJoinPage(page, SysMessageVO.class, wrapper);
}
/**
* 读取信息
* @param id id
* @return true/false
*/
@Override
public Boolean readMessage(Long id) {
SysMessageRelationEntity relationEntity = new SysMessageRelationEntity();
relationEntity.setReadFlag(YesNoEnum.YES.getCode());
relationMapper.update(relationEntity,
Wrappers.<SysMessageRelationEntity>lambdaQuery()
.eq(SysMessageRelationEntity::getMsgId, id)
.eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId()));
return Boolean.TRUE;
}
/**
* 获取信息
* @param id id
* @return messageVO
*/
@Override
public SysMessageVO getMessage(Long id) {
SysMessageEntity messageEntity = baseMapper.selectById(id);
SysMessageVO SysMessageVO = new SysMessageVO();
BeanUtils.copyProperties(messageEntity, SysMessageVO);
// 全体通知
if (messageEntity.getAllFlag().equals(YesNoEnum.YES.getCode())) {
return SysMessageVO;
}
List<Long> userIdList = relationMapper
.selectList(Wrappers.<SysMessageRelationEntity>lambdaQuery().eq(SysMessageRelationEntity::getMsgId, id))
.stream()
.map(SysMessageRelationEntity::getUserId)
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(userIdList)) {
List<OrgTreeVO> orgNodeUserVoList = userMapper.selectBatchIds(userIdList).stream().map(user -> {
OrgTreeVO nodeUserVo = new OrgTreeVO();
nodeUserVo.setId(user.getUserId());
nodeUserVo.setAvatar(user.getAvatar());
nodeUserVo.setName(user.getName());
return nodeUserVo;
}).collect(Collectors.toList());
SysMessageVO.setUserList(orgNodeUserVoList);
}
return SysMessageVO;
}
/**
* 查询用户阅读情况
* @param page 分页
* @param messageId 消息ID
* @param name 姓名
* @return page
*/
@Override
public Page pageUserRead(Page page, Long messageId, String name) {
MPJLambdaWrapper<SysMessageRelationEntity> wrapper = new MPJLambdaWrapper<SysMessageRelationEntity>()
.selectAll(SysMessageRelationEntity.class)
.select(SysUser::getUsername, SysUser::getName, SysUser::getUserId)
.select(SysMessageEntity::getTitle)
.leftJoin(SysUser.class, SysUser::getUserId, SysMessageRelationEntity::getUserId)
.leftJoin(SysMessageEntity.class, SysMessageEntity::getId, SysMessageRelationEntity::getMsgId)
.eq(SysMessageRelationEntity::getMsgId, messageId)
.like(StrUtil.isNotBlank(name), SysUser::getName, name);
return relationMapper.selectJoinPage(page, SysMessageReadVO.class, wrapper);
}
}
@@ -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.pig4cloud.pigx.admin.mapper.SysMessageMapper">
</mapper>
@@ -0,0 +1,19 @@
<?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.pig4cloud.pigx.admin.mapper.SysMessageRelationMapper">
<resultMap id="sysMessageRelationMap" type="com.pig4cloud.pigx.admin.api.entity.SysMessageRelationEntity">
<id property="id" column="id"/>
<result property="msgId" column="msg_id"/>
<result property="userId" column="user_id"/>
<result property="content" column="content"/>
<result property="readFlag" column="read_flag"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
</mapper>