From 0c4786dcd460ea4138e2fa379537cdb0e5d55584 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Mon, 3 Feb 2020 23:25:24 +0800 Subject: [PATCH] =?UTF-8?q?feat[litemall-admin]:=20=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=90=8E=E5=8F=B0=E6=94=AF=E6=8C=81=E9=80=9A=E7=9F=A5=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E5=92=8C=E9=80=9A=E7=9F=A5=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/util/AdminResponseCode.java | 1 + .../admin/web/AdminNoticeController.java | 153 +++++++++ .../admin/web/AdminProfileController.java | 108 ++++++- litemall-admin/src/api/notice.js | 49 +++ litemall-admin/src/api/profile.js | 48 +++ .../src/components/Notice/index.vue | 51 +++ .../src/components/Screenfull/index.vue | 29 +- .../src/components/SizeSelect/index.vue | 11 +- litemall-admin/src/router/index.js | 16 + .../src/views/layout/components/Navbar.vue | 22 +- litemall-admin/src/views/profile/notice.vue | 196 +++++++++++ litemall-admin/src/views/sys/notice.vue | 305 ++++++++++++++++++ 12 files changed, 944 insertions(+), 45 deletions(-) create mode 100644 litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminNoticeController.java create mode 100644 litemall-admin/src/api/notice.js create mode 100644 litemall-admin/src/components/Notice/index.vue create mode 100644 litemall-admin/src/views/profile/notice.vue create mode 100644 litemall-admin/src/views/sys/notice.vue diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/AdminResponseCode.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/AdminResponseCode.java index 327df024..3722c1ca 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/AdminResponseCode.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/AdminResponseCode.java @@ -23,5 +23,6 @@ public class AdminResponseCode { public static final Integer GROUPON_GOODS_UNKNOWN = 650; public static final Integer GROUPON_GOODS_EXISTED = 651; public static final Integer GROUPON_GOODS_OFFLINE = 652; + public static final Integer NOTICE_UPDATE_NOT_ALLOWED = 660; } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminNoticeController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminNoticeController.java new file mode 100644 index 00000000..04531ef5 --- /dev/null +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminNoticeController.java @@ -0,0 +1,153 @@ +package org.linlinjava.litemall.admin.web; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.subject.Subject; +import org.linlinjava.litemall.admin.annotation.RequiresPermissionsDesc; +import org.linlinjava.litemall.core.util.JacksonUtil; +import org.linlinjava.litemall.core.util.ResponseUtil; +import org.linlinjava.litemall.core.validator.Order; +import org.linlinjava.litemall.core.validator.Sort; +import org.linlinjava.litemall.db.domain.*; +import org.linlinjava.litemall.db.service.LitemallAdminService; +import org.linlinjava.litemall.db.service.LitemallNoticeAdminService; +import org.linlinjava.litemall.db.service.LitemallNoticeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.linlinjava.litemall.admin.util.AdminResponseCode.NOTICE_UPDATE_NOT_ALLOWED; + +@RestController +@RequestMapping("/admin/notice") +@Validated +public class AdminNoticeController { + private final Log logger = LogFactory.getLog(AdminNoticeController.class); + + @Autowired + private LitemallNoticeService noticeService; + @Autowired + private LitemallAdminService adminService; + @Autowired + private LitemallNoticeAdminService noticeAdminService; + + @RequiresPermissions("admin:notice:list") + @RequiresPermissionsDesc(menu = {"系统管理", "通知管理"}, button = "查询") + @GetMapping("/list") + public Object list(String title, String content, + @RequestParam(defaultValue = "1") Integer page, + @RequestParam(defaultValue = "10") Integer limit, + @Sort @RequestParam(defaultValue = "add_time") String sort, + @Order @RequestParam(defaultValue = "desc") String order) { + List noticeList = noticeService.querySelective(title, content, page, limit, sort, order); + return ResponseUtil.okList(noticeList); + } + + private Object validate(LitemallNotice notice) { + String title = notice.getTitle(); + if (StringUtils.isEmpty(title)) { + return ResponseUtil.badArgument(); + } + return null; + } + + private Integer getAdminId(){ + Subject currentUser = SecurityUtils.getSubject(); + LitemallAdmin admin = (LitemallAdmin) currentUser.getPrincipal(); + return admin.getId(); + } + + @RequiresPermissions("admin:notice:create") + @RequiresPermissionsDesc(menu = {"推广管理", "通知管理"}, button = "添加") + @PostMapping("/create") + public Object create(@RequestBody LitemallNotice notice) { + Object error = validate(notice); + if (error != null) { + return error; + } + // 1. 添加通知记录 + notice.setAdminId(getAdminId()); + noticeService.add(notice); + // 2. 添加管理员通知记录 + List adminList = adminService.all(); + LitemallNoticeAdmin noticeAdmin = new LitemallNoticeAdmin(); + noticeAdmin.setNoticeId(notice.getId()); + noticeAdmin.setNoticeTitle(notice.getTitle()); + for(LitemallAdmin admin : adminList){ + noticeAdmin.setAdminId(admin.getId()); + noticeAdminService.add(noticeAdmin); + } + return ResponseUtil.ok(notice); + } + + @RequiresPermissions("admin:notice:read") + @RequiresPermissionsDesc(menu = {"推广管理", "通知管理"}, button = "详情") + @GetMapping("/read") + public Object read(@NotNull Integer id) { + LitemallNotice notice = noticeService.findById(id); + List noticeAdminList = noticeAdminService.queryByNoticeId(id); + Map data = new HashMap<>(2); + data.put("notice", notice); + data.put("noticeAdminList", noticeAdminList); + return ResponseUtil.ok(data); + } + + @RequiresPermissions("admin:notice:update") + @RequiresPermissionsDesc(menu = {"推广管理", "通知管理"}, button = "编辑") + @PostMapping("/update") + public Object update(@RequestBody LitemallNotice notice) { + Object error = validate(notice); + if (error != null) { + return error; + } + LitemallNotice originalNotice = noticeService.findById(notice.getId()); + if (originalNotice == null) { + return ResponseUtil.badArgument(); + } + // 如果通知已经有人阅读过,则不支持编辑 + if(noticeAdminService.countReadByNoticeId(notice.getId()) > 0){ + return ResponseUtil.fail(NOTICE_UPDATE_NOT_ALLOWED, "通知已被阅读,不能重新编辑"); + } + // 1. 更新通知记录 + notice.setAdminId(getAdminId()); + noticeService.updateById(notice); + // 2. 更新管理员通知记录 + if(!originalNotice.getTitle().equals(notice.getTitle())){ + LitemallNoticeAdmin noticeAdmin = new LitemallNoticeAdmin(); + noticeAdmin.setNoticeTitle(notice.getTitle()); + noticeAdminService.updateByNoticeId(noticeAdmin, notice.getId()); + } + return ResponseUtil.ok(notice); + } + + @RequiresPermissions("admin:notice:delete") + @RequiresPermissionsDesc(menu = {"推广管理", "通知管理"}, button = "删除") + @PostMapping("/delete") + public Object delete(@RequestBody LitemallNotice notice) { + // 1. 删除通知管理员记录 + noticeAdminService.deleteByNoticeId(notice.getId()); + // 2. 删除通知记录 + noticeService.deleteById(notice.getId()); + return ResponseUtil.ok(); + } + + @RequiresPermissions("admin:notice:batch-delete") + @RequiresPermissionsDesc(menu = {"推广管理", "通知管理"}, button = "批量删除") + @PostMapping("/batch-delete") + public Object batchDelete(@RequestBody String body) { + List ids = JacksonUtil.parseIntegerList(body, "ids"); + // 1. 删除通知管理员记录 + noticeAdminService.deleteByNoticeIds(ids); + // 2. 删除通知记录 + noticeService.deleteByIds(ids); + return ResponseUtil.ok(); + } +} diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminProfileController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminProfileController.java index d9f5f6ae..faa2dccb 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminProfileController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminProfileController.java @@ -1,5 +1,6 @@ package org.linlinjava.litemall.admin.web; +import io.swagger.models.auth.In; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.shiro.SecurityUtils; @@ -8,15 +9,25 @@ import org.apache.shiro.subject.Subject; import org.linlinjava.litemall.core.util.JacksonUtil; import org.linlinjava.litemall.core.util.ResponseUtil; import org.linlinjava.litemall.core.util.bcrypt.BCryptPasswordEncoder; +import org.linlinjava.litemall.core.validator.Order; +import org.linlinjava.litemall.core.validator.Sort; import org.linlinjava.litemall.db.domain.LitemallAdmin; +import org.linlinjava.litemall.db.domain.LitemallIssue; +import org.linlinjava.litemall.db.domain.LitemallNotice; +import org.linlinjava.litemall.db.domain.LitemallNoticeAdmin; import org.linlinjava.litemall.db.service.LitemallAdminService; +import org.linlinjava.litemall.db.service.LitemallNoticeAdminService; +import org.linlinjava.litemall.db.service.LitemallNoticeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; 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 org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import static org.linlinjava.litemall.admin.util.AdminResponseCode.ADMIN_INVALID_ACCOUNT; @@ -28,6 +39,10 @@ public class AdminProfileController { @Autowired private LitemallAdminService adminService; + @Autowired + private LitemallNoticeService noticeService; + @Autowired + private LitemallNoticeAdminService noticeAdminService; @RequiresAuthentication @PostMapping("/password") @@ -56,4 +71,89 @@ public class AdminProfileController { return ResponseUtil.ok(); } + private Integer getAdminId(){ + Subject currentUser = SecurityUtils.getSubject(); + LitemallAdmin admin = (LitemallAdmin) currentUser.getPrincipal(); + return admin.getId(); + } + + @RequiresAuthentication + @GetMapping("/nnotice") + public Object nNotice() { + int count = noticeAdminService.countUnread(getAdminId()); + return ResponseUtil.ok(count); + } + + @RequiresAuthentication + @GetMapping("/lsnotice") + public Object lsNotice(String title, String type, + @RequestParam(defaultValue = "1") Integer page, + @RequestParam(defaultValue = "10") Integer limit, + @Sort @RequestParam(defaultValue = "add_time") String sort, + @Order @RequestParam(defaultValue = "desc") String order) { + List noticeList = noticeAdminService.querySelective(title, type, getAdminId(), page, limit, sort, order); + return ResponseUtil.okList(noticeList); + } + + @RequiresAuthentication + @PostMapping("/catnotice") + public Object catNotice(@RequestBody String body) { + Integer noticeId = JacksonUtil.parseInteger(body, "noticeId"); + if(noticeId == null){ + return ResponseUtil.badArgument(); + } + + LitemallNoticeAdmin noticeAdmin = noticeAdminService.find(noticeId, getAdminId()); + if(noticeAdmin == null){ + return ResponseUtil.badArgumentValue(); + } + // 更新通知记录中的时间 + noticeAdmin.setReadTime(LocalDateTime.now()); + noticeAdminService.update(noticeAdmin); + + // 返回通知的相关信息 + Map data = new HashMap<>(); + LitemallNotice notice = noticeService.findById(noticeId); + data.put("title", notice.getTitle()); + data.put("content", notice.getContent()); + data.put("time", notice.getUpdateTime()); + Integer adminId = notice.getAdminId(); + if(adminId.equals(0)){ + data.put("admin", "系统"); + } + else{ + LitemallAdmin admin = adminService.findById(notice.getAdminId()); + data.put("admin", admin.getUsername()); + data.put("avatar", admin.getAvatar()); + } + return ResponseUtil.ok(data); + } + + @RequiresAuthentication + @PostMapping("/bcatnotice") + public Object bcatNotice(@RequestBody String body) { + List ids = JacksonUtil.parseIntegerList(body, "ids"); + noticeAdminService.markReadByIds(ids, getAdminId()); + return ResponseUtil.ok(); + } + + @RequiresAuthentication + @PostMapping("/rmnotice") + public Object rmNotice(@RequestBody String body) { + Integer id = JacksonUtil.parseInteger(body, "id"); + if(id == null){ + return ResponseUtil.badArgument(); + } + noticeAdminService.deleteById(id, getAdminId()); + return ResponseUtil.ok(); + } + + @RequiresAuthentication + @PostMapping("/brmnotice") + public Object brmNotice(@RequestBody String body) { + List ids = JacksonUtil.parseIntegerList(body, "ids"); + noticeAdminService.deleteByIds(ids, getAdminId()); + return ResponseUtil.ok(); + } + } diff --git a/litemall-admin/src/api/notice.js b/litemall-admin/src/api/notice.js new file mode 100644 index 00000000..a4666990 --- /dev/null +++ b/litemall-admin/src/api/notice.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +export function listNotice(query) { + return request({ + url: '/notice/list', + method: 'get', + params: query + }) +} + +export function createNotice(data) { + return request({ + url: '/notice/create', + method: 'post', + data + }) +} + +export function readNotice(query) { + return request({ + url: '/notice/read', + method: 'get', + params: query + }) +} + +export function updateNotice(data) { + return request({ + url: '/notice/update', + method: 'post', + data + }) +} + +export function deleteNotice(data) { + return request({ + url: '/notice/delete', + method: 'post', + data + }) +} + +export function batchDeleteNotice(data) { + return request({ + url: '/notice/batch-delete', + method: 'post', + data + }) +} diff --git a/litemall-admin/src/api/profile.js b/litemall-admin/src/api/profile.js index 1e94e4a7..4ceb6306 100644 --- a/litemall-admin/src/api/profile.js +++ b/litemall-admin/src/api/profile.js @@ -7,3 +7,51 @@ export function changePassword(data) { data }) } + +export function nNotice() { + return request({ + url: '/profile/nnotice', + method: 'get' + }) +} + +export function listNotice(query) { + return request({ + url: '/profile/lsnotice', + method: 'get', + params: query + }) +} + +export function catNotice(data) { + return request({ + url: '/profile/catnotice', + method: 'post', + data + }) +} + +export function bcatNotice(data) { + return request({ + url: '/profile/bcatnotice', + method: 'post', + data + }) +} + +export function rmotice(data) { + return request({ + url: '/profile/rmnotice', + method: 'post', + data + }) +} + +export function brmNotice(data) { + return request({ + url: '/profile/brmnotice', + method: 'post', + data + }) +} + diff --git a/litemall-admin/src/components/Notice/index.vue b/litemall-admin/src/components/Notice/index.vue new file mode 100644 index 00000000..f2a55df3 --- /dev/null +++ b/litemall-admin/src/components/Notice/index.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/litemall-admin/src/components/Screenfull/index.vue b/litemall-admin/src/components/Screenfull/index.vue index f2ac0b8e..3a3a03db 100644 --- a/litemall-admin/src/components/Screenfull/index.vue +++ b/litemall-admin/src/components/Screenfull/index.vue @@ -1,29 +1,6 @@ @@ -67,12 +44,12 @@ export default { diff --git a/litemall-admin/src/components/SizeSelect/index.vue b/litemall-admin/src/components/SizeSelect/index.vue index b3ebe5ac..2b4ab9f5 100644 --- a/litemall-admin/src/components/SizeSelect/index.vue +++ b/litemall-admin/src/components/SizeSelect/index.vue @@ -1,7 +1,7 @@