From 2270bf642283a2d7a770388fe81ca2f54a64c4b9 Mon Sep 17 00:00:00 2001 From: ArgonarioD Date: Thu, 7 Jul 2022 15:10:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86Announcement?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E7=B1=BB=E4=B8=8E=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E6=97=B6=E9=97=B4=E7=9B=B8=E5=85=B3=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E7=9A=84=E6=97=B6=E5=8C=BA=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E4=BA=86+8:00=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=BA=86TimeUtils?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E4=BD=BF=E7=94=A8=E7=9A=84bug=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86yml=E4=B8=AD=E7=9A=84=E8=BD=AC?= =?UTF-8?q?=E5=8F=91=E5=A4=84=E7=90=86=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/SerializeConfig.java | 10 +-- .../controller/AnnouncementController.java | 83 +++++++++++++++++++ .../controller/ProjectGroupController.java | 1 - .../entity/Announcement.java | 27 ++++++ .../projectmanagement/entity/Project.java | 7 +- .../entity/dto/AnnouncementDto.java | 19 +++++ .../mapper/AnnouncementMapper.java | 18 ++++ .../service/IAnnouncementService.java | 17 ++++ .../service/impl/AnnouncementServiceImpl.java | 28 +++++++ .../projectmanagement/utils/TimeUtils.java | 50 ++++++++--- src/main/resources/application.yml | 3 +- .../resources/mapper/AnnouncementMapper.xml | 34 ++++++++ .../projectmanagement/SerializeTests.java | 3 +- .../rmdjzz/projectmanagement/UtilTests.java | 24 ++++++ 14 files changed, 300 insertions(+), 24 deletions(-) create mode 100644 src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/AnnouncementController.java create mode 100644 src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Announcement.java create mode 100644 src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/dto/AnnouncementDto.java create mode 100644 src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/AnnouncementMapper.java create mode 100644 src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/IAnnouncementService.java create mode 100644 src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/AnnouncementServiceImpl.java create mode 100644 src/main/resources/mapper/AnnouncementMapper.xml create mode 100644 src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/UtilTests.java diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/SerializeConfig.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/SerializeConfig.java index 9b9f181..c5d940a 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/SerializeConfig.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/config/SerializeConfig.java @@ -34,14 +34,14 @@ public class SerializeConfig { @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value != null) { - gen.writeNumber(value.toEpochSecond(ZoneOffset.UTC)); + gen.writeNumber(value.toEpochSecond(ZoneOffset.of("+08:00"))); } } }); javaTimeModule.addDeserializer(LocalDateTime.class, new JsonDeserializer<>() { @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return Instant.ofEpochSecond(p.getValueAsLong(), 0).atOffset(ZoneOffset.UTC).toLocalDateTime(); + return Instant.ofEpochSecond(p.getValueAsLong(), 0).atOffset(ZoneOffset.of("+08:00")).toLocalDateTime(); } }); @@ -57,7 +57,7 @@ public class SerializeConfig { javaTimeModule.addDeserializer(LocalDate.class, new JsonDeserializer<>() { @Override public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return Instant.ofEpochSecond(p.getValueAsLong(), 0).atOffset(ZoneOffset.UTC).toLocalDate(); + return Instant.ofEpochSecond(p.getValueAsLong(), 0).atOffset(ZoneOffset.of("+08:00")).toLocalDate(); } }); @@ -66,14 +66,14 @@ public class SerializeConfig { @Override public void serialize(LocalTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value != null) { - gen.writeNumber(value.toEpochSecond(LocalDate.of(1970, 1, 1), ZoneOffset.UTC)); + gen.writeNumber(value.toEpochSecond(LocalDate.of(1970, 1, 1), ZoneOffset.of("+08:00"))); } } }); javaTimeModule.addDeserializer(LocalTime.class, new JsonDeserializer<>() { @Override public LocalTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return Instant.ofEpochSecond(p.getValueAsLong(), 0).atOffset(ZoneOffset.UTC).toLocalTime(); + return Instant.ofEpochSecond(p.getValueAsLong(), 0).atOffset(ZoneOffset.of("+08:00")).toLocalTime(); } }); diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/AnnouncementController.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/AnnouncementController.java new file mode 100644 index 0000000..5ca98f3 --- /dev/null +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/AnnouncementController.java @@ -0,0 +1,83 @@ +package cn.edu.hfut.rmdjzz.projectmanagement.controller; + +import cn.edu.hfut.rmdjzz.projectmanagement.entity.Announcement; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.AnnouncementDto; +import cn.edu.hfut.rmdjzz.projectmanagement.exception.BadRequestException; +import cn.edu.hfut.rmdjzz.projectmanagement.exception.ForbiddenException; +import cn.edu.hfut.rmdjzz.projectmanagement.service.IAnnouncementService; +import cn.edu.hfut.rmdjzz.projectmanagement.service.IProjectGroupService; +import cn.edu.hfut.rmdjzz.projectmanagement.utils.TokenUtils; +import cn.edu.hfut.rmdjzz.projectmanagement.utils.http.ResponseList; +import cn.edu.hfut.rmdjzz.projectmanagement.utils.http.ResponseMap; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author 佘语殊 + * @since 2022/7/7 11:29 + */ +@RestController +@RequestMapping("/project/{projectId}/announcement") +public class AnnouncementController { + + @Autowired + private IAnnouncementService announcementService; + @Autowired + private IProjectGroupService projectGroupService; + + @SneakyThrows + @GetMapping + public ResponseList getAnnouncementList(@RequestHeader("Token") String token, @PathVariable Integer projectId) { + if (projectGroupService.getProjectAccessLevel(token, projectId) == 0) { + throw new ForbiddenException("无该项目访问权限"); + } + return ResponseList.ofSuccess("查询成功", announcementService.getAnnouncementList(projectId)); + } + + @SneakyThrows + @GetMapping("/{announcementId}") + public ResponseMap getAnnouncementById( + @RequestHeader("Token") String token, + @PathVariable Integer projectId, + @PathVariable Long announcementId + ){ + if (projectGroupService.getProjectAccessLevel(token, projectId) == 0) { + throw new ForbiddenException("无该项目访问权限"); + } + return ResponseMap.ofSuccess("查询成功"); + } + + @SneakyThrows + @PostMapping + public ResponseMap createAnnouncement( + @RequestHeader("Token") String token, + @PathVariable Integer projectId, + @RequestBody Announcement announcement + ) { + if (projectGroupService.getProjectAccessLevel(token, projectId) > 2) { + throw new ForbiddenException("无该操作权限"); + } + announcement.setProjectId(projectId); + announcement.setAnnouncementPublisherId(TokenUtils.getStaffId(token)); + announcement.setAnnouncementPublishTime(null); + if (announcementService.save(announcement)) { + return ResponseMap.ofSuccess("创建成功"); + } + throw new BadRequestException("创建失败"); + } + + //TODO: 查询权限高低 + @PutMapping("/{announcementId}") + public ResponseMap modifyAnnouncement( + @RequestHeader("Token") String token, + @PathVariable Integer projectId, + @PathVariable Long announcementId, + @RequestBody Announcement announcement + ){ + + return ResponseMap.ofSuccess("更新成功"); + } + + +} diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java index 7484d0c..8529c0e 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/controller/ProjectGroupController.java @@ -80,7 +80,6 @@ public class ProjectGroupController { return ResponseMap.ofSuccess("更新成功"); } - //TODO: test @SneakyThrows @GetMapping("/stats") public ResponseMap getGroupPositionsStatistics( diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Announcement.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Announcement.java new file mode 100644 index 0000000..e1f2e1c --- /dev/null +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Announcement.java @@ -0,0 +1,27 @@ +package cn.edu.hfut.rmdjzz.projectmanagement.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 佘语殊 + * @since 2022/7/7 11:22 + */ +@Data +public class Announcement { + @TableId(type = IdType.AUTO) + private Long announcementId; + private Integer projectId; + private Integer announcementPublisherId; + private LocalDateTime announcementPublishTime; + private String announcementTitle; + private String announcementContent; + @TableField("is_deleted") + @TableLogic + private Boolean deleted; +} diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Project.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Project.java index 66644b4..1935c37 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Project.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/Project.java @@ -48,13 +48,10 @@ public class Project { private LocalDate projectClosedDate; public Boolean checkProjectDate() { - if(!TimeUtils.validateTimeLine(projectStartDate, projectFirstTestDate, projectFinalTestDate, projectEndDate)) { + if (!TimeUtils.validateDateLine(projectStartDate, projectFirstTestDate, projectFinalTestDate, projectEndDate)) { return false; } - if (!TimeUtils.validateTimeLine(projectStartDate, projectOnlineDate)) { - return false; - } - return true; + return TimeUtils.validateDateLine(projectStartDate, projectOnlineDate); } public Boolean checkModification(Project rawProject) { diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/dto/AnnouncementDto.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/dto/AnnouncementDto.java new file mode 100644 index 0000000..4affe2c --- /dev/null +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/entity/dto/AnnouncementDto.java @@ -0,0 +1,19 @@ +package cn.edu.hfut.rmdjzz.projectmanagement.entity.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 佘语殊 + * @since 2022/7/7 11:33 + */ +@Data +public class AnnouncementDto { + private Long announcementId; + private Integer announcementPublisherId; + private String announcementPublisherName; + private LocalDateTime announcementPublishTime; + private String announcementTitle; + private String announcementContent; +} diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/AnnouncementMapper.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/AnnouncementMapper.java new file mode 100644 index 0000000..57ee30c --- /dev/null +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/mapper/AnnouncementMapper.java @@ -0,0 +1,18 @@ +package cn.edu.hfut.rmdjzz.projectmanagement.mapper; + +import cn.edu.hfut.rmdjzz.projectmanagement.entity.Announcement; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.AnnouncementDto; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author 佘语殊 + * @since 2022/7/7 11:26 + */ +public interface AnnouncementMapper extends BaseMapper { + List selectAnnouncementList(@Param("projectId") Integer projectId); + + AnnouncementDto selectAnnouncementById(@Param("announcementId") Long announcementId); +} diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/IAnnouncementService.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/IAnnouncementService.java new file mode 100644 index 0000000..6d25c68 --- /dev/null +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/IAnnouncementService.java @@ -0,0 +1,17 @@ +package cn.edu.hfut.rmdjzz.projectmanagement.service; + +import cn.edu.hfut.rmdjzz.projectmanagement.entity.Announcement; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.AnnouncementDto; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * @author 佘语殊 + * @since 2022/7/7 11:27 + */ +public interface IAnnouncementService extends IService { + List getAnnouncementList(Integer projectId); + + AnnouncementDto getAnnouncementById(Long announcementId); +} diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/AnnouncementServiceImpl.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/AnnouncementServiceImpl.java new file mode 100644 index 0000000..2a2c9b8 --- /dev/null +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/AnnouncementServiceImpl.java @@ -0,0 +1,28 @@ +package cn.edu.hfut.rmdjzz.projectmanagement.service.impl; + +import cn.edu.hfut.rmdjzz.projectmanagement.entity.Announcement; +import cn.edu.hfut.rmdjzz.projectmanagement.entity.dto.AnnouncementDto; +import cn.edu.hfut.rmdjzz.projectmanagement.mapper.AnnouncementMapper; +import cn.edu.hfut.rmdjzz.projectmanagement.service.IAnnouncementService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author 佘语殊 + * @since 2022/7/7 11:28 + */ +@Service +public class AnnouncementServiceImpl extends ServiceImpl implements IAnnouncementService { + + @Override + public List getAnnouncementList(Integer projectId) { + return baseMapper.selectAnnouncementList(projectId); + } + + @Override + public AnnouncementDto getAnnouncementById(Long announcementId) { + return null; + } +} diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/TimeUtils.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/TimeUtils.java index 5cefa29..2a19b0e 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/TimeUtils.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/utils/TimeUtils.java @@ -1,7 +1,7 @@ package cn.edu.hfut.rmdjzz.projectmanagement.utils; -import java.time.Instant; -import java.time.temporal.TemporalAccessor; +import java.time.LocalDate; +import java.time.LocalDateTime; /** * @author 佘语殊 @@ -11,23 +11,51 @@ public class TimeUtils { /** * 验证参数是否按时间线先后顺序传入,忽略null */ - public static boolean validateTimeLine(TemporalAccessor... temporalAccessors) { + public static boolean validateDateLine(LocalDate... dates) { int first; - for (first = 0; first < temporalAccessors.length; first++) { - if (temporalAccessors[first] != null) { + for (first = 0; first < dates.length; first++) { + if (dates[first] != null) { break; } } - if (first >= temporalAccessors.length - 1) { + if (first >= dates.length - 1) { return true; } - Instant last = Instant.from(temporalAccessors[first]); - Instant current; - for (int i = first + 1; i < temporalAccessors.length; i++) { - if (temporalAccessors[i] == null) { + LocalDate last = dates[first]; + LocalDate current; + for (int i = first + 1; i < dates.length; i++) { + if (dates[i] == null) { continue; } - current = Instant.from(temporalAccessors[i]); + current = dates[i]; + if (last.isAfter(current)) { + return false; + } + last = current; + } + return true; + } + + /** + * 验证参数是否按时间线先后顺序传入,忽略null + */ + public static boolean validateDateTimeLine(LocalDateTime... dateTimes) { + int first; + for (first = 0; first < dateTimes.length; first++) { + if (dateTimes[first] != null) { + break; + } + } + if (first >= dateTimes.length - 1) { + return true; + } + LocalDateTime last = dateTimes[first]; + LocalDateTime current; + for (int i = first + 1; i < dateTimes.length; i++) { + if (dateTimes[i] == null) { + continue; + } + current = dateTimes[i]; if (last.isAfter(current)) { return false; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 45794b0..fbf947a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -29,5 +29,6 @@ server: charset: UTF-8 force: true enabled: true + forward-headers-strategy: framework springdoc: - packages-to-scan: cn.edu.hfut.rmdjzz.projectmanagement + packages-to-scan: cn.edu.hfut.rmdjzz.projectmanagement \ No newline at end of file diff --git a/src/main/resources/mapper/AnnouncementMapper.xml b/src/main/resources/mapper/AnnouncementMapper.xml new file mode 100644 index 0000000..98b772a --- /dev/null +++ b/src/main/resources/mapper/AnnouncementMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/SerializeTests.java b/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/SerializeTests.java index 6921e41..4c0fbd7 100644 --- a/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/SerializeTests.java +++ b/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/SerializeTests.java @@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.time.LocalDate; +import java.time.LocalDateTime; /** * @author 佘语殊 @@ -21,6 +22,6 @@ public class SerializeTests { @SneakyThrows @Test public void serializeTime() { - System.out.println(objectMapper.readValue("1656523481", LocalDate.class)); + System.out.println(objectMapper.readValue("1657166400", LocalDateTime.class)); } } diff --git a/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/UtilTests.java b/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/UtilTests.java new file mode 100644 index 0000000..9dd63c6 --- /dev/null +++ b/src/test/java/cn/edu/hfut/rmdjzz/projectmanagement/UtilTests.java @@ -0,0 +1,24 @@ +package cn.edu.hfut.rmdjzz.projectmanagement; + +import cn.edu.hfut.rmdjzz.projectmanagement.utils.TimeUtils; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +/** + * @author 佘语殊 + * @since 2022/7/7 14:36 + */ +public class UtilTests { + @Test + public void timeTest() { + LocalDateTime a = LocalDateTime.now(); + LocalDateTime b = LocalDateTime.now().minusDays(1); + LocalDateTime c = LocalDateTime.now(); + LocalDate d = LocalDate.now(); + LocalTime t = LocalTime.now(); + System.out.println(TimeUtils.validateDateTimeLine(a, b, c)); + } +}