diff --git a/doc/db/boot_backend.sql b/doc/db/boot_backend.sql index d97966c143bb1be8202187477ed37d4e8c76b05b..b1d1964b28a6023a558539aa29ead58c69e1a8c9 100644 --- a/doc/db/boot_backend.sql +++ b/doc/db/boot_backend.sql @@ -1,38 +1,20 @@ /* Navicat MySQL Data Transfer -Source Server : localhost -Source Server Version : 50717 +Source Server : zhangw +Source Server Version : 50624 Source Host : localhost:3306 Source Database : boot_backend Target Server Type : MYSQL -Target Server Version : 50717 +Target Server Version : 50624 File Encoding : 65001 -Date: 2017-09-27 17:40:56 +Date: 2017-10-02 19:26:05 */ SET FOREIGN_KEY_CHECKS=0; --- ---------------------------- --- Table structure for articles --- ---------------------------- -DROP TABLE IF EXISTS `articles`; -CREATE TABLE `articles` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `title` varchar(128) NOT NULL, - `content` text NOT NULL, - `status` tinyint(1) NOT NULL DEFAULT '1', - `createTime` datetime NOT NULL, - `updateTime` datetime NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of articles --- ---------------------------- - -- ---------------------------- -- Table structure for file_info -- ---------------------------- @@ -299,7 +281,7 @@ CREATE TABLE `sys_permission` ( `permission` varchar(50) DEFAULT NULL, `sort` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4; +) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Records of sys_permission @@ -324,10 +306,10 @@ INSERT INTO `sys_permission` VALUES ('18', '16', '删除', '', '', '2', 'sys:fil INSERT INTO `sys_permission` VALUES ('19', '0', '数据源监控', 'fa-eye', 'druid/index.html', '1', '', '9'); INSERT INTO `sys_permission` VALUES ('20', '0', '接口swagger', 'fa-file-pdf-o', 'swagger-ui.html', '1', '', '10'); INSERT INTO `sys_permission` VALUES ('21', '0', '代码生成', 'fa-wrench', 'pages/generate/edit.html', '1', 'generate:edit', '11'); -INSERT INTO `sys_permission` VALUES ('22', '0', '公告管理', 'fa-book', 'pages/article/articleList.html', '1', '', '12'); -INSERT INTO `sys_permission` VALUES ('23', '22', '查询', '', '', '2', 'articles:query', '100'); -INSERT INTO `sys_permission` VALUES ('24', '22', '添加', '', '', '2', 'articles:add', '100'); -INSERT INTO `sys_permission` VALUES ('25', '22', '删除', '', '', '2', 'articles:del', '100'); +INSERT INTO `sys_permission` VALUES ('22', '0', '公告管理', 'fa-book', 'pages/notice/noticeList.html', '1', '', '12'); +INSERT INTO `sys_permission` VALUES ('23', '22', '查询', '', '', '2', 'notice:query', '100'); +INSERT INTO `sys_permission` VALUES ('24', '22', '添加', '', '', '2', 'notice:add', '100'); +INSERT INTO `sys_permission` VALUES ('25', '22', '删除', '', '', '2', 'notice:del', '100'); INSERT INTO `sys_permission` VALUES ('26', '0', '日志查询', 'fa-reorder', 'pages/log/logList.html', '1', 'sys:log:query', '13'); INSERT INTO `sys_permission` VALUES ('27', '0', '邮件管理', 'fa-envelope', 'pages/mail/mailList.html', '1', '', '14'); INSERT INTO `sys_permission` VALUES ('28', '27', '发送邮件', '', '', '2', 'mail:send', '100'); @@ -474,24 +456,6 @@ CREATE TABLE `sys_user` ( INSERT INTO `sys_user` VALUES ('1', 'admin', '1015ed3b5f1345911198c995f9ad097e', '87e03afa1f0122531f729c9a7453f475', '管理员', null, '', '', '', '1998-07-01', '0', '1', '2017-04-10 15:21:38', '2017-07-06 09:20:19'); INSERT INTO `sys_user` VALUES ('2', 'user', '72c2e62dba72e5f178542313803f33d1', '143292269df8c63e2da1a9ba2aeff43c', '用户', null, '', '', '', null, '1', '1', '2017-08-01 21:47:18', '2017-08-01 21:47:18'); --- ---------------------------- --- Table structure for t_mail --- ---------------------------- -DROP TABLE IF EXISTS `t_mail`; -CREATE TABLE `t_mail` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `userId` int(11) NOT NULL COMMENT '发送人', - `subject` varchar(255) NOT NULL COMMENT '标题', - `content` longtext NOT NULL COMMENT '正文', - `createTime` datetime NOT NULL, - `updateTime` datetime NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of t_mail --- ---------------------------- - -- ---------------------------- -- Table structure for t_job -- ---------------------------- @@ -511,6 +475,28 @@ CREATE TABLE `t_job` ( UNIQUE KEY `jobName` (`jobName`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; +-- ---------------------------- +-- Records of t_job +-- ---------------------------- + +-- ---------------------------- +-- Table structure for t_mail +-- ---------------------------- +DROP TABLE IF EXISTS `t_mail`; +CREATE TABLE `t_mail` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `userId` int(11) NOT NULL COMMENT '发送人', + `subject` varchar(255) NOT NULL COMMENT '标题', + `content` longtext NOT NULL COMMENT '正文', + `createTime` datetime NOT NULL, + `updateTime` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of t_mail +-- ---------------------------- + -- ---------------------------- -- Table structure for t_mail_to -- ---------------------------- @@ -526,3 +512,36 @@ CREATE TABLE `t_mail_to` ( -- ---------------------------- -- Records of t_mail_to -- ---------------------------- + +-- ---------------------------- +-- Table structure for t_notice +-- ---------------------------- +DROP TABLE IF EXISTS `t_notice`; +CREATE TABLE `t_notice` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(128) NOT NULL, + `content` text NOT NULL, + `status` tinyint(1) NOT NULL DEFAULT '1', + `createTime` datetime NOT NULL, + `updateTime` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of t_notice +-- ---------------------------- + +-- ---------------------------- +-- Table structure for t_notice_read +-- ---------------------------- +DROP TABLE IF EXISTS `t_notice_read`; +CREATE TABLE `t_notice_read` ( + `noticeId` int(11) NOT NULL, + `userId` int(11) NOT NULL, + `createTime` datetime NOT NULL, + PRIMARY KEY (`noticeId`,`userId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of t_notice_read +-- ---------------------------- diff --git a/src/main/java/com/zw/admin/server/controller/ArticlesController.java b/src/main/java/com/zw/admin/server/controller/NoticeController.java similarity index 31% rename from src/main/java/com/zw/admin/server/controller/ArticlesController.java rename to src/main/java/com/zw/admin/server/controller/NoticeController.java index 2b9128fcf92f53926d287c162dfc4c5ecac6d015..12e511d0fcf4e18bfd95bd3ad97c1c50a6bf1ae9 100644 --- a/src/main/java/com/zw/admin/server/controller/ArticlesController.java +++ b/src/main/java/com/zw/admin/server/controller/NoticeController.java @@ -14,74 +14,128 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.zw.admin.server.annotation.LogAnnotation; -import com.zw.admin.server.dao.ArticlesDao; -import com.zw.admin.server.model.Articles; -import com.zw.admin.server.page.table.PageTableRequest; +import com.zw.admin.server.dao.NoticeDao; +import com.zw.admin.server.dto.NoticeReadVO; +import com.zw.admin.server.dto.NoticeVO; +import com.zw.admin.server.model.Notice; +import com.zw.admin.server.model.Notice.Status; +import com.zw.admin.server.model.User; import com.zw.admin.server.page.table.PageTableHandler; -import com.zw.admin.server.page.table.PageTableResponse; import com.zw.admin.server.page.table.PageTableHandler.CountHandler; import com.zw.admin.server.page.table.PageTableHandler.ListHandler; +import com.zw.admin.server.page.table.PageTableRequest; +import com.zw.admin.server.page.table.PageTableResponse; +import com.zw.admin.server.utils.UserUtil; import io.swagger.annotations.ApiOperation; @RestController -@RequestMapping("/articles") -public class ArticlesController { +@RequestMapping("/notices") +public class NoticeController { @Autowired - private ArticlesDao articlesDao; + private NoticeDao noticeDao; @LogAnnotation @PostMapping - @ApiOperation(value = "保存文章") - @RequiresPermissions("articles:add") - public Articles saveArticles(@RequestBody Articles articles) { - articlesDao.save(articles); + @ApiOperation(value = "保存公告") + @RequiresPermissions("notice:add") + public Notice saveNotice(@RequestBody Notice notice) { + noticeDao.save(notice); - return articles; + return notice; } @GetMapping("/{id}") - @ApiOperation(value = "根据id获取文章") - @RequiresPermissions("articles:query") - public Articles get(@PathVariable Long id) { - return articlesDao.getById(id); + @ApiOperation(value = "根据id获取公告") + @RequiresPermissions("notice:query") + public Notice get(@PathVariable Long id) { + return noticeDao.getById(id); + } + + @GetMapping(params = "id") + public NoticeVO readNotice(Long id) { + NoticeVO vo = new NoticeVO(); + + Notice notice = noticeDao.getById(id); + if (notice == null || notice.getStatus() == Status.DRAFT) { + return vo; + } + vo.setNotice(notice); + + noticeDao.saveReadRecord(notice.getId(), UserUtil.getCurrentUser().getId()); + + List users = noticeDao.listReadUsers(id); + vo.setUsers(users); + + return vo; } @LogAnnotation @PutMapping - @ApiOperation(value = "修改文章") - @RequiresPermissions("articles:add") - public Articles updateArticles(@RequestBody Articles articles) { - articlesDao.update(articles); + @ApiOperation(value = "修改公告") + @RequiresPermissions("notice:add") + public Notice updateNotice(@RequestBody Notice notice) { + Notice no = noticeDao.getById(notice.getId()); + if (no.getStatus() == Status.PUBLISH) { + throw new IllegalArgumentException("发布状态的不能修改"); + } + noticeDao.update(notice); - return articles; + return notice; } @GetMapping - @ApiOperation(value = "文章列表") - @RequiresPermissions("articles:query") - public PageTableResponse listArticles(PageTableRequest request) { - return PageTableHandler. builder().countHandler(new CountHandler() { + @ApiOperation(value = "公告管理列表") + @RequiresPermissions("notice:query") + public PageTableResponse listNotice(PageTableRequest request) { + return PageTableHandler. builder().countHandler(new CountHandler() { @Override public int count(PageTableRequest request) { - return articlesDao.count(request.getParams()); + return noticeDao.count(request.getParams()); } - }).listHandler(new ListHandler() { + }).listHandler(new ListHandler() { @Override - public List list(PageTableRequest request) { - return articlesDao.list(request.getParams(), request.getOffset(), request.getLimit()); + public List list(PageTableRequest request) { + return noticeDao.list(request.getParams(), request.getOffset(), request.getLimit()); } }).build().handle(request); } @LogAnnotation @DeleteMapping("/{id}") - @ApiOperation(value = "删除文章") - @RequiresPermissions(value = { "articles:del" }) + @ApiOperation(value = "删除公告") + @RequiresPermissions(value = { "notice:del" }) public void delete(@PathVariable Long id) { - articlesDao.delete(id); + noticeDao.delete(id); + } + + @ApiOperation(value = "未读公告数") + @GetMapping("/count-unread") + public Integer countUnread() { + User user = UserUtil.getCurrentUser(); + return noticeDao.countUnread(user.getId()); + } + + @GetMapping("/published") + @ApiOperation(value = "公告列表") + public PageTableResponse listNoticeReadVO(PageTableRequest request) { + request.getParams().put("userId", UserUtil.getCurrentUser().getId()); + + return PageTableHandler. builder().countHandler(new CountHandler() { + + @Override + public int count(PageTableRequest request) { + return noticeDao.countNotice(request.getParams()); + } + }).listHandler(new ListHandler() { + + @Override + public List list(PageTableRequest request) { + return noticeDao.listNotice(request.getParams(), request.getOffset(), request.getLimit()); + } + }).build().handle(request); } } diff --git a/src/main/java/com/zw/admin/server/dao/ArticlesDao.java b/src/main/java/com/zw/admin/server/dao/NoticeDao.java similarity index 38% rename from src/main/java/com/zw/admin/server/dao/ArticlesDao.java rename to src/main/java/com/zw/admin/server/dao/NoticeDao.java index c84c26f376c4bbee2c8e3752c49906c778b41c0b..3f88eb16ad87c9e468fbac3bc3840dbbef0b8ecb 100644 --- a/src/main/java/com/zw/admin/server/dao/ArticlesDao.java +++ b/src/main/java/com/zw/admin/server/dao/NoticeDao.java @@ -11,26 +11,41 @@ import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; -import com.zw.admin.server.model.Articles; +import com.zw.admin.server.dto.NoticeReadVO; +import com.zw.admin.server.model.Notice; +import com.zw.admin.server.model.User; @Mapper -public interface ArticlesDao { +public interface NoticeDao { - @Select("select * from articles t where t.id = #{id}") - Articles getById(Long id); + @Select("select * from t_notice t where t.id = #{id}") + Notice getById(Long id); - @Delete("delete from articles where id = #{id}") + @Delete("delete from t_notice where id = #{id}") int delete(Long id); - @Update("update articles t set title = #{title}, content = #{content}, status = #{status}, updateTime = #{updateTime} where t.id = #{id}") - int update(Articles articles); + @Update("update t_notice t set title = #{title}, content = #{content}, status = #{status}, updateTime = #{updateTime} where t.id = #{id}") + int update(Notice notice); @Options(useGeneratedKeys = true, keyProperty = "id") - @Insert("insert into articles(title, content, status, createTime, updateTime) values(#{title}, #{content}, #{status}, #{createTime}, #{updateTime})") - int save(Articles articles); + @Insert("insert into t_notice(title, content, status, createTime, updateTime) values(#{title}, #{content}, #{status}, #{createTime}, #{updateTime})") + int save(Notice notice); int count(@Param("params") Map params); - List list(@Param("params") Map params, @Param("offset") Integer offset, + List list(@Param("params") Map params, @Param("offset") Integer offset, + @Param("limit") Integer limit); + + @Insert("insert ignore into t_notice_read(noticeId, userId, createTime) values(#{noticeId}, #{userId}, now())") + int saveReadRecord(@Param("noticeId") Long noticeId, @Param("userId") Long userId); + + List listReadUsers(Long noticeId); + + @Select("select count(1) from t_notice t left join t_notice_read r on r.noticeId = t.id and r.userId = #{userId} where t.status = 1 and r.userId is null") + int countUnread(Long userId); + + int countNotice(@Param("params") Map params); + + List listNotice(@Param("params") Map params, @Param("offset") Integer offset, @Param("limit") Integer limit); } diff --git a/src/main/java/com/zw/admin/server/dto/NoticeReadVO.java b/src/main/java/com/zw/admin/server/dto/NoticeReadVO.java new file mode 100644 index 0000000000000000000000000000000000000000..ffae09f152af70b1f6af9bf9da2f8284557ab505 --- /dev/null +++ b/src/main/java/com/zw/admin/server/dto/NoticeReadVO.java @@ -0,0 +1,19 @@ +package com.zw.admin.server.dto; + +import java.util.Date; + +import com.zw.admin.server.model.Notice; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class NoticeReadVO extends Notice { + + private static final long serialVersionUID = -3842182350180882396L; + + private Long userId; + private Date readTime; + private Boolean isRead; +} diff --git a/src/main/java/com/zw/admin/server/dto/NoticeVO.java b/src/main/java/com/zw/admin/server/dto/NoticeVO.java new file mode 100644 index 0000000000000000000000000000000000000000..806f446057115b9b54c3d611d6bf59d1b836df60 --- /dev/null +++ b/src/main/java/com/zw/admin/server/dto/NoticeVO.java @@ -0,0 +1,21 @@ +package com.zw.admin.server.dto; + +import java.io.Serializable; +import java.util.List; + +import com.zw.admin.server.model.Notice; +import com.zw.admin.server.model.User; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class NoticeVO implements Serializable { + + private static final long serialVersionUID = 7363353918096951799L; + + private Notice notice; + + private List users; +} diff --git a/src/main/java/com/zw/admin/server/model/Articles.java b/src/main/java/com/zw/admin/server/model/Notice.java similarity index 86% rename from src/main/java/com/zw/admin/server/model/Articles.java rename to src/main/java/com/zw/admin/server/model/Notice.java index bdeded5ead98db6dc587675893ea92c88bd96e9d..d33e39789a38dcab55c4e24ecdda16236e15eba9 100644 --- a/src/main/java/com/zw/admin/server/model/Articles.java +++ b/src/main/java/com/zw/admin/server/model/Notice.java @@ -5,7 +5,7 @@ import lombok.Setter; @Getter @Setter -public class Articles extends BaseEntity { +public class Notice extends BaseEntity { private static final long serialVersionUID = -4401913568806243090L; diff --git a/src/main/resources/mybatis-mappers/ArticlesMapper.xml b/src/main/resources/mybatis-mappers/ArticlesMapper.xml deleted file mode 100644 index db0824b93d3c144af08c7c3bff276a6c0202e798..0000000000000000000000000000000000000000 --- a/src/main/resources/mybatis-mappers/ArticlesMapper.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - and t.title like concat('%', #{params.title}, '%') - - - and t.status = #{params.status} - - - and t.updateTime >= #{params.beginTime} - - - - and DATE(t.updateTime) <= #{params.endTime} - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/mybatis-mappers/NoticeMapper.xml b/src/main/resources/mybatis-mappers/NoticeMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..4d1efb4eb5cdc2a4d9c907e6f69156dcf0c1a2ec --- /dev/null +++ b/src/main/resources/mybatis-mappers/NoticeMapper.xml @@ -0,0 +1,86 @@ + + + + + + + + and t.title like concat('%', #{params.title}, '%') + + + and t.status = #{params.status} + + + and t.updateTime >= #{params.beginTime} + + + + and DATE(t.updateTime) <= #{params.endTime} + + + + + + + + + + + + + t.status = 1 + + and t.title like concat('%', #{params.title}, '%') + + + + and t.updateTime >= #{params.beginTime} + + + + and DATE(t.updateTime) <= #{params.endTime} + + + + and r.createTime is null + + + and r.createTime is not null + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/public/index.html b/src/main/resources/public/index.html index 7492e00cac4e45c1624a2a8a94e38383c2134894..78f858e36183711137d673340a708b981f49e547 100644 --- a/src/main/resources/public/index.html +++ b/src/main/resources/public/index.html @@ -30,6 +30,9 @@