From 5e308a87dff2af366209c182859d2274f426c07c Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Tue, 9 May 2023 20:49:45 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E6=96=B0=E5=A2=9E=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nladmin-system/doc/wms.xls | Bin 292864 -> 295936 bytes .../java/org/nl/common/enums/NoticeEnum.java | 22 ++ .../controller/logging/SysLogController.java | 9 + .../notice/SysNoticeController.java | 107 +++++++ .../controller/user/UserController.java | 17 +- .../logging/impl/SysLogServiceImpl.java | 2 + .../service/notice/ISysNoticeService.java | 83 ++++++ .../system/service/notice/dao/SysNotice.java | 51 ++++ .../notice/dao/mapper/SysNoticeMapper.java | 12 + .../notice/dao/mapper/SysNoticeMapper.xml | 5 + .../service/notice/dto/SysNoticeDto.java | 37 +++ .../service/notice/dto/SysNoticeQuery.java | 12 + .../notice/impl/SysNoticeServiceImpl.java | 180 ++++++++++++ nladmin-ui/package.json | 1 + nladmin-ui/src/layout/components/Navbar.vue | 40 ++- nladmin-ui/src/main.js | 3 + .../src/views/system/notice/NoticeIcon.vue | 128 +++++++++ .../views/system/notice/NoticeIconReader.vue | 122 ++++++++ .../src/views/system/notice/VueBaseCode.js | 15 + nladmin-ui/src/views/system/notice/index.vue | 270 ++++++++++++++++++ .../src/views/system/notice/sysNotice.js | 94 ++++++ nladmin-ui/src/views/system/user/center.vue | 14 +- .../views/system/user/center/updatePass.vue | 2 +- 23 files changed, 1209 insertions(+), 17 deletions(-) create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/common/enums/NoticeEnum.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/notice/SysNoticeController.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/ISysNoticeService.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/SysNotice.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/mapper/SysNoticeMapper.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/mapper/SysNoticeMapper.xml create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dto/SysNoticeDto.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dto/SysNoticeQuery.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java create mode 100644 nladmin-ui/src/views/system/notice/NoticeIcon.vue create mode 100644 nladmin-ui/src/views/system/notice/NoticeIconReader.vue create mode 100644 nladmin-ui/src/views/system/notice/VueBaseCode.js create mode 100644 nladmin-ui/src/views/system/notice/index.vue create mode 100644 nladmin-ui/src/views/system/notice/sysNotice.js diff --git a/nladmin-system/doc/wms.xls b/nladmin-system/doc/wms.xls index d78eb36519cc7ff256ddeecd5aec0635acd79764..0b05f22b4b7adec1e40d704815b52d9cf27c8f72 100644 GIT binary patch delta 47877 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 delta 46398 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 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/common/enums/NoticeEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/common/enums/NoticeEnum.java new file mode 100644 index 0000000..4e6be7b --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/common/enums/NoticeEnum.java @@ -0,0 +1,22 @@ +package org.nl.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/5/9 + */ +@Getter +@AllArgsConstructor +public enum NoticeEnum { + HAVE_READ_OFF("1","未读"), + HAVE_READ_ON("2", "已读"), + DEAL_STATUS_NO("1", "未处理"), + DEAL_STATUS_YES("2", "已处理"), + DEAL_STATUS_NO_NEED("3", "无需处理"); + + private final String value; + private final String desc; +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/logging/SysLogController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/logging/SysLogController.java index 8880b79..5323312 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/logging/SysLogController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/logging/SysLogController.java @@ -6,6 +6,7 @@ import io.swagger.annotations.ApiOperation; import org.nl.common.base.TableDataInfo; import org.nl.common.domain.query.PageQuery; import org.nl.common.logging.annotation.Log; +import org.nl.common.utils.SecurityUtils; import org.nl.system.service.logging.ISysLogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -36,6 +37,14 @@ public class SysLogController { return new ResponseEntity<>(TableDataInfo.build(logService.queryAll(criteria,pageable)), HttpStatus.OK); } + @GetMapping(value = "/user") + // @ApiOperation("用户日志查询") + public ResponseEntity queryUserLog(@RequestParam Map criteria, PageQuery pageable){ + criteria.put("log_type","INFO"); + criteria.put("username", SecurityUtils.getCurrentUsername()); + return new ResponseEntity<>(TableDataInfo.build(logService.queryAll(criteria,pageable)), HttpStatus.OK); + } + @GetMapping(value = "/error") @ApiOperation("错误日志查询") // @SaCheckPermission("@el.check()") diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/notice/SysNoticeController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/notice/SysNoticeController.java new file mode 100644 index 0000000..5d63042 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/notice/SysNoticeController.java @@ -0,0 +1,107 @@ +package org.nl.system.controller.notice; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.logging.annotation.Log; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.system.service.notice.dao.SysNotice; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; +/** +* @author lyd +* @date 2023-05-09 +**/ +@Slf4j +@RestController +@Api(tags = "消息通知管理") +@RequestMapping("/api/notice") +public class SysNoticeController { + + @Autowired + private ISysNoticeService noticeService; + + @GetMapping + @Log("查询消息通知") + @ApiOperation("查询消息通知") + //@SaCheckPermission("@el.check('sysNotice:list')") + public ResponseEntity query(@RequestParam Map whereJson, PageQuery page){ + return new ResponseEntity<>(TableDataInfo.build(noticeService.queryAll(whereJson,page)),HttpStatus.OK); + } + + @PostMapping + @Log("新增消息通知") + @ApiOperation("新增消息通知") + //@SaCheckPermission("@el.check('sysNotice:add')") + public ResponseEntity create(@Validated @RequestBody SysNotice entity){ + noticeService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改消息通知") + @ApiOperation("修改消息通知") + //@SaCheckPermission("@el.check('sysNotice:edit')") + public ResponseEntity update(@Validated @RequestBody SysNotice entity){ + noticeService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除消息通知") + @ApiOperation("删除消息通知") + //@SaCheckPermission("@el.check('sysNotice:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + noticeService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("获取未读的接收消息条数") + @GetMapping("/countByReceiveNotRead") + public ResponseEntity countByReceiveNotRead(){ + return new ResponseEntity<>(noticeService.countByReceiveNotRead(), HttpStatus.OK); + } + + @Log("接收消息分页") + @GetMapping("/pageByReceive") + public ResponseEntity pageByReceive(){ + return new ResponseEntity<>(noticeService.pageByReceive(), HttpStatus.OK); + } + + @Log("标为已读") + @PostMapping("/read") + public ResponseEntity read(@RequestBody String id){ + noticeService.read(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("消息详情") + @PostMapping("/findById") + public ResponseEntity findById(@RequestBody String id){ + return new ResponseEntity<>(noticeService.getById(id), HttpStatus.OK); + } + + @Log("修改已处理") + @PostMapping("/deal") + public ResponseEntity deal(@RequestBody String id){ + noticeService.deal(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("批量已读") + @PostMapping("/changeRead") + @ApiOperation("批量已读") + public ResponseEntity changeRead(@RequestBody JSONObject jsonObject) { + noticeService.changeRead(jsonObject); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java index b942497..c9204a5 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java @@ -17,6 +17,8 @@ package org.nl.system.controller.user; import cn.dev33.satoken.secure.SaSecureUtil; import cn.dev33.satoken.stp.StpUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import io.swagger.annotations.Api; @@ -99,22 +101,23 @@ public class UserController { return new ResponseEntity<>(HttpStatus.OK); } - /* @ApiOperation("修改密码") + @ApiOperation("修改密码") @PostMapping(value = "/updatePass") - public ResponseEntity updatePass(@RequestBody UserPassVo passVo) throws Exception { + public ResponseEntity updatePass(@RequestBody JSONObject passVo) throws Exception { // 解密,得到字符密码 - String oldPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,passVo.getOldPass()); - String newPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,passVo.getNewPass()); - User user = userService.findByName(SecurityUtils.getCurrentUsername()); + String oldPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,passVo.getString("oldPass")); + String newPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,passVo.getString("newPass")); + SysUser user = userService.getOne(new LambdaQueryWrapper().eq(SysUser::getUsername, SecurityUtils.getCurrentUsername())); if (!SaSecureUtil.md5BySalt(user.getPassword(), "salt").equals(SaSecureUtil.md5BySalt(oldPass, "salt"))) { throw new BadRequestException("修改失败,旧密码错误"); } if (!SaSecureUtil.md5BySalt(user.getPassword(), "salt").equals(SaSecureUtil.md5BySalt(newPass, "salt"))) { throw new BadRequestException("新密码不能与旧密码相同"); } - userService.updatePass(user.getUsername(),SaSecureUtil.md5BySalt(newPass, "salt")); + user.setPassword(SaSecureUtil.md5BySalt(newPass, "salt")); + userService.updateById(user); return new ResponseEntity<>(HttpStatus.OK); - }*/ + } @ApiOperation("修改头像") @PostMapping(value = "/updateAvatar") diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java index 7d50887..9042e2f 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java @@ -36,10 +36,12 @@ public class SysLogServiceImpl extends ServiceImpl impleme public IPage queryAll(Map whereJson, PageQuery pageable) { String blurry = ObjectUtil.isNotEmpty(whereJson.get("blurry"))?whereJson.get("blurry").toString():null; String log_type = ObjectUtil.isNotEmpty(whereJson.get("log_type"))?whereJson.get("log_type").toString():null; + String username = ObjectUtil.isNotEmpty(whereJson.get("username"))?whereJson.get("username").toString():null; String begin_time = ObjectUtil.isNotEmpty(whereJson.get("begin_time"))?whereJson.get("begin_time").toString():null; String end_time = ObjectUtil.isNotEmpty(whereJson.get("end_time"))?whereJson.get("end_time").toString():null; LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); lam.eq(ObjectUtil.isNotEmpty(log_type), SysLog::getLog_type, log_type) + .eq(ObjectUtil.isNotEmpty(username), SysLog::getUsername, username) .like(ObjectUtil.isNotEmpty(blurry), SysLog::getDescription, blurry) .le(ObjectUtil.isNotEmpty(end_time), SysLog::getCreate_time, end_time) .ge(ObjectUtil.isNotEmpty(begin_time), SysLog::getCreate_time, begin_time) diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/ISysNoticeService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/ISysNoticeService.java new file mode 100644 index 0000000..2856250 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/ISysNoticeService.java @@ -0,0 +1,83 @@ +package org.nl.system.service.notice; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.common.domain.query.PageQuery; +import org.nl.system.service.notice.dao.SysNotice; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** +* @description 服务接口 +* @author lyd +* @date 2023-05-09 +**/ +public interface ISysNoticeService extends IService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(Map whereJson, PageQuery pageable); + + /** + * 创建 + * @param entity / + */ + void create(SysNotice entity); + + /** + * 编辑 + * @param entity / + */ + void update(SysNotice entity); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Set ids); + + /** + * 获取未读的接收消息条数 + */ + Integer countByReceiveNotRead(); + + /** + * 获取不同类型的前三条信息 + * @return + */ + LinkedList> pageByReceive(); + + /** + * 标记已读 + * @param id + */ + void read(String id); + + /** + * 处理信息 + * @param id + */ + void deal(String id); + + /** + * 批量已读 + * @param jsonObject + */ + void changeRead(JSONObject jsonObject); + + /** + * 写入信息 + * @param msg + * @param title + * @param type + */ + void createNotice(String msg, String title, String type); +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/SysNotice.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/SysNotice.java new file mode 100644 index 0000000..9b10d3a --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/SysNotice.java @@ -0,0 +1,51 @@ +package org.nl.system.service.notice.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** +* @description / +* @author lyd +* @date 2023-05-09 +**/ +@Data +@Builder +@EqualsAndHashCode(callSuper = false) +@TableName("sys_notice") +public class SysNotice implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "notice_id", type = IdType.NONE) + @ApiModelProperty(value = "信息标识") + private String notice_id; + + @ApiModelProperty(value = "信息标题") + private String notice_title; + + @ApiModelProperty(value = "信息内容") + private String notice_content; + + @ApiModelProperty(value = "信息类型") + private String notice_type; + + @ApiModelProperty(value = "读取状态") + private String have_read; + + @ApiModelProperty(value = "读取时间") + private String read_time; + + @ApiModelProperty(value = "处理状态") + private String deal_status; + + @ApiModelProperty(value = "创建时间") + private String create_time; + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/mapper/SysNoticeMapper.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..384f7cf --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/mapper/SysNoticeMapper.java @@ -0,0 +1,12 @@ +package org.nl.system.service.notice.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.system.service.notice.dao.SysNotice; + +/** +* @author lyd +* @date 2023-05-09 +**/ +public interface SysNoticeMapper extends BaseMapper { + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/mapper/SysNoticeMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/mapper/SysNoticeMapper.xml new file mode 100644 index 0000000..15b4868 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dao/mapper/SysNoticeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dto/SysNoticeDto.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dto/SysNoticeDto.java new file mode 100644 index 0000000..cf427e1 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dto/SysNoticeDto.java @@ -0,0 +1,37 @@ +package org.nl.system.service.notice.dto; + +import lombok.Data; +import java.io.Serializable; + +/** +* @description / +* @author lyd +* @date 2023-05-09 +**/ +@Data +public class SysNoticeDto implements Serializable { + + /** 信息标识 */ + private String notice_id; + + /** 信息标题 */ + private String notice_title; + + /** 信息内容 */ + private String notice_content; + + /** 信息类型 */ + private String notice_type; + + /** 读取状态 */ + private String have_read; + + /** 读取时间 */ + private String read_time; + + /** 处理状态 */ + private String deal_status; + + /** 创建时间 */ + private String create_time; +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dto/SysNoticeQuery.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dto/SysNoticeQuery.java new file mode 100644 index 0000000..16a59bf --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/dto/SysNoticeQuery.java @@ -0,0 +1,12 @@ +package org.nl.system.service.notice.dto; + +import org.nl.common.domain.query.BaseQuery; +import org.nl.system.service.notice.dao.SysNotice; + +/** +* @author lyd +* @date 2023-05-09 +**/ +public class SysNoticeQuery extends BaseQuery { + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..17de744 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java @@ -0,0 +1,180 @@ +package org.nl.system.service.notice.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.enums.NoticeEnum; +import org.nl.common.exception.BadRequestException; +import org.nl.common.mnt.websocket.MsgType; +import org.nl.common.mnt.websocket.SocketMsg; +import org.nl.common.mnt.websocket.WebSocketServer; +import org.nl.common.utils.SecurityUtils; +import org.nl.system.service.dict.dao.Dict; +import org.nl.system.service.dict.dao.mapper.SysDictMapper; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.system.service.notice.dao.mapper.SysNoticeMapper; +import org.nl.system.service.notice.dao.SysNotice; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; + +/** +* @description 服务实现 +* @author lyd +* @date 2023-05-09 +**/ +@Slf4j +@Service +public class SysNoticeServiceImpl extends ServiceImpl implements ISysNoticeService { + + @Autowired + private SysNoticeMapper sysNoticeMapper; + + @Autowired + private SysDictMapper dictMapper; + + @Autowired + private WebSocketServer webSocketServer; + + @Override + public IPage queryAll(Map whereJson, PageQuery page){ + String notice_title = ObjectUtil.isNotEmpty(whereJson.get("notice_title"))?whereJson.get("notice_title").toString():null; + String notice_type = ObjectUtil.isNotEmpty(whereJson.get("notice_type"))?whereJson.get("notice_type").toString():null; + String have_read = ObjectUtil.isNotEmpty(whereJson.get("have_read"))?whereJson.get("have_read").toString():null; + String deal_status = ObjectUtil.isNotEmpty(whereJson.get("deal_status"))?whereJson.get("deal_status").toString():null; + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.like(ObjectUtil.isNotEmpty(notice_title), SysNotice::getNotice_title, notice_title) + .eq(ObjectUtil.isNotEmpty(notice_type), SysNotice::getNotice_type, notice_type) + .eq(ObjectUtil.isNotEmpty(have_read), SysNotice::getHave_read, have_read) + .eq(ObjectUtil.isNotEmpty(deal_status), SysNotice::getDeal_status, deal_status) + .orderByAsc(SysNotice::getHave_read) + .orderByDesc(SysNotice::getCreate_time); + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + sysNoticeMapper.selectPage(pages, lam); + return pages; + } + + @Override + public void create(SysNotice entity) { + String now = DateUtil.now(); + + entity.setNotice_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + entity.setCreate_time(now); + sysNoticeMapper.insert(entity); + } + + @Override + public void update(SysNotice entity) { + SysNotice dto = sysNoticeMapper.selectById(entity.getNotice_id()); + if (dto == null) throw new BadRequestException("被删除或无权限,操作失败!"); + sysNoticeMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + // 真删除 + sysNoticeMapper.deleteBatchIds(ids); + } + + @Override + public Integer countByReceiveNotRead() { + List sysNotices = sysNoticeMapper.selectList(new LambdaQueryWrapper().eq(SysNotice::getHave_read, NoticeEnum.HAVE_READ_OFF.getValue())); + return ObjectUtil.isNotEmpty(sysNotices)?sysNotices.size():0; + } + + @Override + public LinkedList> pageByReceive() { + LinkedList> result = new LinkedList<>(); + List dictList = dictMapper.selectList(new LambdaQueryWrapper() + .eq(Dict::getCode, "notice_type") + .orderByAsc(Dict::getDict_sort)); + dictList.forEach(dict -> { + List sysNotices = sysNoticeMapper.selectList(new LambdaQueryWrapper() + .eq(SysNotice::getNotice_type, dict.getValue()) + .eq(SysNotice::getHave_read, NoticeEnum.HAVE_READ_OFF.getValue()) + .orderByDesc(SysNotice::getCreate_time) + .last("LIMIT 0,3")); + result.add(sysNotices); + }); + return result; + } + + @Override + public void read(String id) { + SysNotice notice = this.getById(id); + if (ObjectUtil.isEmpty(notice)) { + throw new BadRequestException("该信息不存在!"); + } + notice.setHave_read(NoticeEnum.HAVE_READ_ON.getValue()); + notice.setRead_time(DateUtil.now()); + sysNoticeMapper.updateById(notice); + } + + @Override + public void deal(String id) { + SysNotice notice = this.getById(id); + if (ObjectUtil.isEmpty(notice)) { + throw new BadRequestException("该信息不存在!"); + } + // 设置处理 + notice.setDeal_status(NoticeEnum.DEAL_STATUS_YES.getValue()); + // 判断是否读取 + if (notice.getHave_read().equals(NoticeEnum.HAVE_READ_OFF.getValue())) { + // 标记已读并设置读取时间 + notice.setHave_read(NoticeEnum.HAVE_READ_ON.getValue()); + notice.setRead_time(DateUtil.now()); + } + sysNoticeMapper.updateById(notice); + } + + @Override + public void changeRead(JSONObject jsonObject) { + JSONArray data = jsonObject.getJSONArray("data"); + String haveRead = jsonObject.getString("have_read"); + List sysNotices = JSON.parseArray(data.toJSONString(), SysNotice.class); + sysNotices.forEach(sysNotice -> sysNotice.setHave_read(haveRead)); + this.updateBatchById(sysNotices); + } + + @Override + public void createNotice(String msg, String title, String type) { + // 获取标题相同的信息 + List sysNotices = sysNoticeMapper.selectList(new LambdaQueryWrapper().eq(SysNotice::getNotice_title, title)); + if (ObjectUtil.isNotEmpty(sysNotices)) return; + SysNotice noticeDto = SysNotice.builder() + .notice_id(IdUtil.getSnowflake(1,1).nextIdStr()) + .notice_type(type) + .notice_title(title) + .notice_content(msg) + .deal_status(NoticeEnum.DEAL_STATUS_NO.getValue()) + .have_read(NoticeEnum.HAVE_READ_OFF.getValue()) + .create_time(DateUtil.now()) + .build(); + // 插入 + sysNoticeMapper.insert(noticeDto); + JSONObject res = new JSONObject(); + res.put("data", "notice_message_update"); + SocketMsg messageInfo = new SocketMsg(res, MsgType.INFO); + try { + webSocketServer.sendInfo(messageInfo, "messageInfo"); + } catch (IOException e) { + throw new BadRequestException("消息发送失败"); + } + } + +} diff --git a/nladmin-ui/package.json b/nladmin-ui/package.json index 57b7c44..0fe34f1 100644 --- a/nladmin-ui/package.json +++ b/nladmin-ui/package.json @@ -66,6 +66,7 @@ "sortablejs": "1.8.4", "throttle-debounce": "^5.0.0", "vue": "2.6.10", + "vue-bus": "^1.2.1", "vue-color": "^2.8.1", "vue-count-to": "1.0.13", "vue-cropper": "0.4.9", diff --git a/nladmin-ui/src/layout/components/Navbar.vue b/nladmin-ui/src/layout/components/Navbar.vue index 738443b..fc4c9e4 100644 --- a/nladmin-ui/src/layout/components/Navbar.vue +++ b/nladmin-ui/src/layout/components/Navbar.vue @@ -15,6 +15,8 @@ + + {{ user.person_name }} - @@ -61,9 +61,13 @@ import Screenfull from '@/components/Screenfull' import SizeSelect from '@/components/SizeSelect' import Search from '@/components/HeaderSearch' import Avatar from '@/assets/images/avatar.png' +import NoticeIcon from '@/views/system/notice/NoticeIcon.vue' +import NoticeIconReader from '@/views/system/notice/NoticeIconReader.vue' export default { components: { + NoticeIconReader, + NoticeIcon, Breadcrumb, Hamburger, Screenfull, @@ -102,6 +106,9 @@ export default { } } }, + created() { + this.initWebSocket() + }, methods: { toggleSideBar() { this.$store.dispatch('app/toggleSideBar') @@ -119,6 +126,35 @@ export default { this.$store.dispatch('LogOut').then(() => { location.reload() }) + }, + initWebSocket() { + // const wsUri = (process.env.VUE_APP_WS_API === '/' ? '/' : (process.env.VUE_APP_WS_API + '/')) + 'messageInfo' + const wsUri = window.g.prod.VUE_APP_BASE_API.replace('http', 'ws') + '/webSocket/' + 'messageInfo' + this.websock = new WebSocket(wsUri) + this.websock.onerror = this.webSocketOnError + this.websock.onmessage = this.webSocketOnMessage + }, + webSocketOnError(e) { + this.$notify({ + title: 'WebSocket连接发生错误', + type: 'error', + duration: 0 + }) + }, + webSocketOnMessage(e) { + const data = JSON.parse(e.data) + if (data.msgType === 'INFO') { + console.log('data', data) + this.$bus.emit(data.msg.data, data.msg.msgType) + } else if (data.msgType === 'ERROR') { + this.$notify({ + title: '', + message: data.msg, + dangerouslyUseHTMLString: true, + type: 'error', + duration: 0 + }) + } } } } diff --git a/nladmin-ui/src/main.js b/nladmin-ui/src/main.js index a4b8c91..8a80f47 100644 --- a/nladmin-ui/src/main.js +++ b/nladmin-ui/src/main.js @@ -46,6 +46,8 @@ import { addDateRange, handleTree, parseTime, resetForm, selectDictLabel, select import { getValueByCode } from '@/views/system/param/param' +import VueBus from 'vue-bus' + LogicFlow.use(Menu) Vue.component('tinymce', Tinymce) @@ -67,6 +69,7 @@ Vue.use(VueHighlightJS) Vue.use(mavonEditor) Vue.use(permission) Vue.use(dict) +Vue.use(VueBus) // 全局设置控件样式https://codeantenna.com/a/0IN5FMJk5h Element.Table.props.border = { type: Boolean, default: true } Element.TableColumn.props.align = { type: String, default: 'center' } diff --git a/nladmin-ui/src/views/system/notice/NoticeIcon.vue b/nladmin-ui/src/views/system/notice/NoticeIcon.vue new file mode 100644 index 0000000..3b5a18d --- /dev/null +++ b/nladmin-ui/src/views/system/notice/NoticeIcon.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/nladmin-ui/src/views/system/notice/NoticeIconReader.vue b/nladmin-ui/src/views/system/notice/NoticeIconReader.vue new file mode 100644 index 0000000..e8eba7d --- /dev/null +++ b/nladmin-ui/src/views/system/notice/NoticeIconReader.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/nladmin-ui/src/views/system/notice/VueBaseCode.js b/nladmin-ui/src/views/system/notice/VueBaseCode.js new file mode 100644 index 0000000..9190b14 --- /dev/null +++ b/nladmin-ui/src/views/system/notice/VueBaseCode.js @@ -0,0 +1,15 @@ +/* 消息服务 */ +/** + * 显示站内信消息 + */ +export const NOTICE_SHOW_MESSAGE = 'notice_show_message' +/** + * 通知消息发生消息更新 主要是 未读数量更新 + */ +export const NOTICE_MESSAGE_UPDATE = 'notice_message_update' + +/* 其他 */ +/** + * ws测试事件 + */ +export const EVENT_TEST_WEBSOCKET = 'event_test_websocket' diff --git a/nladmin-ui/src/views/system/notice/index.vue b/nladmin-ui/src/views/system/notice/index.vue new file mode 100644 index 0000000..7c51b10 --- /dev/null +++ b/nladmin-ui/src/views/system/notice/index.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/nladmin-ui/src/views/system/notice/sysNotice.js b/nladmin-ui/src/views/system/notice/sysNotice.js new file mode 100644 index 0000000..a83b688 --- /dev/null +++ b/nladmin-ui/src/views/system/notice/sysNotice.js @@ -0,0 +1,94 @@ +import request from '@/utils/request' + +/** + * 获取未读信息 + * @returns {AxiosPromise} + */ +export function pageByReceive() { + return request({ + url: '/api/notice/pageByReceive', + method: 'get' + }) +} + +/** + * 未读消息数量 + */ +export function countByReceiveNotRead() { + return request({ + url: '/api/notice/countByReceiveNotRead', + method: 'GET' + }) +} + +/** + * 标记为已读 + */ +export function read(id) { + return request({ + url: '/api/notice/read', + method: 'post', + data: id + }) +} + +/** + * 标记为已修改 + */ +export function deal(id) { + return request({ + url: '/api/notice/deal', + method: 'post', + data: id + }) +} + +/** + * 批量已读 + * @param data + * @returns {*} + */ +export function changeRead(data) { + return request({ + url: 'api/notice/changeRead', + method: 'post', + data: data + }) +} + +/** + * 查看消息 + */ +export function findById(id) { + return request({ + url: '/api/notice/findById', + method: 'post', + data: id + }) +} + +export function add(data) { + return request({ + url: 'api/notice', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/notice/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/notice', + method: 'put', + data + }) +} + +export default { add, edit, del, pageByReceive, countByReceiveNotRead, read, findById, deal, changeRead } diff --git a/nladmin-ui/src/views/system/user/center.vue b/nladmin-ui/src/views/system/user/center.vue index a3f734e..ec6e904 100644 --- a/nladmin-ui/src/views/system/user/center.vue +++ b/nladmin-ui/src/views/system/user/center.vue @@ -28,7 +28,7 @@ 安全设置 @@ -41,7 +41,7 @@ - + 用户姓名不作为登录使用 @@ -64,7 +64,7 @@ - + @@ -83,7 +83,7 @@
创建日期
@@ -116,7 +116,7 @@ import store from '@/store' import { isvalidPhone } from '@/utils/validate' import { parseTime } from '@/utils/index' import crud from '@/mixins/crud' -import { editUser } from '@/views/system/user' +import { editUser } from '@/views/system/user/user' import Avatar from '@/assets/images/avatar.png' export default { name: 'Center', @@ -143,7 +143,7 @@ export default { }, form: {}, rules: { - personName: [ + person_name: [ { required: true, message: '请输入用户姓名', trigger: 'blur' }, { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' } ], @@ -161,7 +161,7 @@ export default { ]) }, created() { - this.form = { id: this.user.id, personName: this.user.personName, gender: this.user.gender, phone: this.user.phone } + this.form = { id: this.user.id, person_name: this.user.person_name, gender: this.user.gender, phone: this.user.phone } store.dispatch('GetInfo').then(() => {}) }, methods: { diff --git a/nladmin-ui/src/views/system/user/center/updatePass.vue b/nladmin-ui/src/views/system/user/center/updatePass.vue index 79f04ce..9f76cc7 100644 --- a/nladmin-ui/src/views/system/user/center/updatePass.vue +++ b/nladmin-ui/src/views/system/user/center/updatePass.vue @@ -22,7 +22,7 @@