Jelajahi Sumber

1、增加了招聘会相关需求
2、增加早报资讯模块

rayson 8 bulan lalu
induk
melakukan
5bc5cf39fc
31 mengubah file dengan 1540 tambahan dan 25 penghapusan
  1. 9 8
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/dal/dataobject/invoice/InvoiceListDO.java
  2. 9 9
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/dal/dataobject/invoice/InvoiceTitleDO.java
  3. 6 6
      menduner/menduner-flames-biz/src/main/java/com/citupro/module/menduner/flames/controller/app/AdvertisementMessageController.java
  4. 6 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  5. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/content/MorningNewsController.java
  6. 95 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobFairController.java
  7. 33 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/content/AppMorningNewsController.java
  8. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/content/MorningNewsPageReqVO.java
  9. 33 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/content/MorningNewsRespVO.java
  10. 24 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/content/MorningNewsSaveReqVO.java
  11. 44 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedExtendRespVO.java
  12. 28 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedExtendSaveReqVO.java
  13. 45 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/fair/JobFairPageReqVO.java
  14. 88 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/fair/JobFairRespVO.java
  15. 70 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/fair/JobFairSaveReqVO.java
  16. 39 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/content/MorningNewsDO.java
  17. 55 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobAdvertisedExtendDO.java
  18. 98 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobFairDO.java
  19. 45 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobFairDetailDO.java
  20. 33 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/content/MorningNewsMapper.java
  21. 15 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobAdvertisedExtendMapper.java
  22. 17 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobFairDetailMapper.java
  23. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobFairMapper.java
  24. 63 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/content/MorningNewsService.java
  25. 76 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/content/MorningNewsServiceImpl.java
  26. 56 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/fair/JobFairService.java
  27. 72 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/fair/JobFairServiceImpl.java
  28. 132 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/content/MorningNewsServiceImplTest.java
  29. 149 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/job/JobFairServiceImplTest.java
  30. 3 1
      menduner/menduner-system-biz/src/test/resources/sql/clean.sql
  31. 41 1
      menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

+ 9 - 8
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/dal/dataobject/invoice/InvoiceListDO.java

@@ -1,9 +1,11 @@
 package com.citu.module.member.dal.dataobject.invoice;
 
-import lombok.*;
-import java.util.*;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
 
 /**
  * 发票清单 DO
@@ -63,7 +65,6 @@ public class InvoiceListDO extends BaseDO {
     private Long price;
 
 
-
     /**
      * 单位地址
      */
@@ -72,17 +73,17 @@ public class InvoiceListDO extends BaseDO {
     /**
      * 单位电话
      */
-    private String        enterprisePhone;
+    private String enterprisePhone;
 
     /**
-     *企业开户行名称
+     * 企业开户行名称
      */
     private String enterpriseBankTitle;
 
     /**
-     *银行基本户账号
+     * 银行基本户账号
      */
-    private String        enterpriseBankNo;
+    private String enterpriseBankNo;
 
     /**
      * 0.增值 1.普票

+ 9 - 9
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/dal/dataobject/invoice/InvoiceTitleDO.java

@@ -1,11 +1,11 @@
 package com.citu.module.member.dal.dataobject.invoice;
 
-import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
 
 /**
  * 发票抬头 DO
@@ -60,17 +60,17 @@ public class InvoiceTitleDO extends BaseDO {
     /**
      * 单位电话
      */
-    private String        enterprisePhone;
+    private String enterprisePhone;
 
     /**
-     *企业开户行名称
+     * 企业开户行名称
      */
     private String enterpriseBankTitle;
 
     /**
-     *银行基本户账号
+     * 银行基本户账号
      */
-    private String        enterpriseBankNo;
+    private String enterpriseBankNo;
 
     /**
      * 0.增值 1.普票

+ 6 - 6
menduner/menduner-flames-biz/src/main/java/com/citupro/module/menduner/flames/controller/app/AdvertisementMessageController.java

@@ -1,15 +1,15 @@
 package com.citupro.module.menduner.flames.controller.app;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-
 import com.citu.framework.common.pojo.CommonResult;
 import com.citupro.module.menduner.flames.controller.base.reqvo.AdvertisementMessageIdReqVo;
 import com.citupro.module.menduner.flames.controller.base.reqvo.AdvertisementMessageListReqVo;
-import com.citupro.module.menduner.flames.controller.base.vo.AdvertisementMessageInfoVo;
 import com.citupro.module.menduner.flames.dal.mysql.AdvertisementMessage;
 import com.citupro.module.menduner.flames.service.AdvertisementMessageService;
-import org.springframework.web.bind.annotation.*;
 import org.springframework.beans.factory.annotation.Autowired;
+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;
 
 /**
  * @author auto
@@ -20,7 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 @RequestMapping("/flames")
 @RestController
-public class AdvertisementMessageController  {
+public class AdvertisementMessageController {
     @SuppressWarnings("all")
     private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AdvertisementMessageController.class);
     @Autowired
@@ -68,7 +68,7 @@ public class AdvertisementMessageController  {
     /**
      * @param idReqVo
      * @return R
-     * @eo.name  通过id删除广告
+     * @eo.name 通过id删除广告
      * @eo.url /advertisement/message/del
      * @eo.method post
      * @eo.request-type json

+ 6 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java

@@ -570,4 +570,10 @@ public interface ErrorCodeConstants {
 
     ErrorCode ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW = new ErrorCode(1_100_054_002, "企业额度已超过");
 
+    // ========== 早报资讯 1_100_054_000 ==========
+    ErrorCode MORNING_NEWS_NOT_EXISTS = new ErrorCode(1_100_054_001, "早报资讯不存在");
+
+    // ========== 招聘会 1_100_055_000 ==========
+    ErrorCode JOB_FAIR_NOT_EXISTS = new ErrorCode(1_100_055_001, "招聘会不存在");
+
 }

+ 94 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/content/MorningNewsController.java

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.system.controller.admin.content;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsPageReqVO;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsRespVO;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.content.MorningNewsDO;
+import com.citu.module.menduner.system.service.content.MorningNewsService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 早报资讯")
+@RestController
+@RequestMapping("/menduner/system/morning-news")
+@Validated
+public class MorningNewsController {
+
+    @Resource
+    private MorningNewsService morningNewsService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建早报资讯")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:create')")
+    public CommonResult<Long> createMorningNews(@Valid @RequestBody MorningNewsSaveReqVO createReqVO) {
+        return success(morningNewsService.createMorningNews(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新早报资讯")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:update')")
+    public CommonResult<Boolean> updateMorningNews(@Valid @RequestBody MorningNewsSaveReqVO updateReqVO) {
+        morningNewsService.updateMorningNews(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除早报资讯")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:delete')")
+    public CommonResult<Boolean> deleteMorningNews(@RequestParam("id") Long id) {
+        morningNewsService.deleteMorningNews(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得早报资讯")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:query')")
+    public CommonResult<MorningNewsRespVO> getMorningNews(@RequestParam("id") Long id) {
+        MorningNewsDO morningNews = morningNewsService.getMorningNews(id);
+        return success(BeanUtils.toBean(morningNews, MorningNewsRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得早报资讯分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:query')")
+    public CommonResult<PageResult<MorningNewsRespVO>> getMorningNewsPage(@Valid MorningNewsPageReqVO pageReqVO) {
+        PageResult<MorningNewsDO> pageResult = morningNewsService.getMorningNewsPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, MorningNewsRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出早报资讯 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportMorningNewsExcel(@Valid MorningNewsPageReqVO pageReqVO,
+                                       HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<MorningNewsDO> list = morningNewsService.getMorningNewsPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "早报资讯.xls", "数据", MorningNewsRespVO.class,
+                BeanUtils.toBean(list, MorningNewsRespVO.class));
+    }
+
+}

+ 95 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobFairController.java

@@ -0,0 +1,95 @@
+package com.citu.module.menduner.system.controller.admin.job;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairPageReqVO;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairRespVO;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobFairDO;
+import com.citu.module.menduner.system.service.job.fair.JobFairService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - 招聘会")
+@RestController
+@RequestMapping("/menduner/system/job-fair")
+@Validated
+public class JobFairController {
+
+    @Resource
+    private JobFairService jobFairService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建招聘会")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:create')")
+    public CommonResult<Long> createJobFair(@Valid @RequestBody JobFairSaveReqVO createReqVO) {
+        return success(jobFairService.createJobFair(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新招聘会")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:update')")
+    public CommonResult<Boolean> updateJobFair(@Valid @RequestBody JobFairSaveReqVO updateReqVO) {
+        jobFairService.updateJobFair(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除招聘会")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:delete')")
+    public CommonResult<Boolean> deleteJobFair(@RequestParam("id") Long id) {
+        jobFairService.deleteJobFair(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得招聘会")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:query')")
+    public CommonResult<JobFairRespVO> getJobFair(@RequestParam("id") Long id) {
+        JobFairDO jobFair = jobFairService.getJobFair(id);
+        return success(BeanUtils.toBean(jobFair, JobFairRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得招聘会分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:query')")
+    public CommonResult<PageResult<JobFairRespVO>> getJobFairPage(@Valid JobFairPageReqVO pageReqVO) {
+        PageResult<JobFairDO> pageResult = jobFairService.getJobFairPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, JobFairRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出招聘会 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportJobFairExcel(@Valid JobFairPageReqVO pageReqVO,
+                                   HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<JobFairDO> list = jobFairService.getJobFairPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "招聘会.xls", "数据", JobFairRespVO.class,
+                BeanUtils.toBean(list, JobFairRespVO.class));
+    }
+
+}

+ 33 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/content/AppMorningNewsController.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.system.controller.app.jobhunt.content;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsRespVO;
+import com.citu.module.menduner.system.service.content.MorningNewsService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "求职端 - 早报资讯")
+@RestController
+@RequestMapping("/menduner/system/morning-news")
+@Validated
+public class AppMorningNewsController {
+
+    @Resource
+    private MorningNewsService morningNewsService;
+
+    @GetMapping("/get")
+    @Operation(summary = "获取最新的早报资讯")
+    public CommonResult<MorningNewsRespVO> get() {
+        MorningNewsRespVO resp = BeanUtils.toBean(morningNewsService.getLatest(), MorningNewsRespVO.class);
+        return success(resp);
+    }
+}

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/content/MorningNewsPageReqVO.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.controller.base.content;
+
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 早报资讯分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MorningNewsPageReqVO extends PageParam {
+
+    @Schema(description = "标题")
+    private String title;
+
+    @Schema(description = "外链地址", example = "https://www.iocoder.cn")
+    private String url;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 33 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/content/MorningNewsRespVO.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.system.controller.base.content;
+
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 早报资讯 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class MorningNewsRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "26256")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("标题")
+    private String title;
+
+    @Schema(description = "外链地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotEmpty(message = "外链地址不能为空")
+    private String url;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 24 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/content/MorningNewsSaveReqVO.java

@@ -0,0 +1,24 @@
+package com.citu.module.menduner.system.controller.base.content;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+
+@Schema(description = "管理后台 - 早报资讯新增/修改 Request VO")
+@Data
+public class MorningNewsSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "26256")
+    private Long id;
+
+    @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "标题不能为空")
+    private String title;
+
+    @Schema(description = "外链地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotEmpty(message = "外链地址不能为空")
+    private String url;
+
+}

+ 44 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedExtendRespVO.java

@@ -0,0 +1,44 @@
+package com.citu.module.menduner.system.controller.base.job;
+
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 招聘职位扩展 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class JobAdvertisedExtendRespVO {
+
+    @Schema(description = "自增编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32594")
+    @ExcelProperty("自增编号")
+    private Long id;
+
+    @Schema(description = "职位id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17732")
+    @ExcelProperty("职位id")
+    private Long jobId;
+
+    @Schema(description = "专业要求", example = "19754")
+    @ExcelProperty("专业要求")
+    private Long majorId;
+
+    @Schema(description = "0.非热门 1.热门")
+    @ExcelProperty("0.非热门 1.热门")
+    private Integer hot;
+
+    @Schema(description = "招聘部门")
+    @ExcelProperty("招聘部门")
+    private String dept;
+
+    @Schema(description = "上班时间")
+    @ExcelProperty("上班时间")
+    private String frequency;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 28 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedExtendSaveReqVO.java

@@ -0,0 +1,28 @@
+package com.citu.module.menduner.system.controller.base.job;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 招聘职位扩展新增/修改 Request VO")
+@Data
+public class JobAdvertisedExtendSaveReqVO {
+
+    @Schema(description = "自增编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32594")
+    private Long id;
+
+    @Schema(description = "职位id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17732")
+    private Long jobId;
+
+    @Schema(description = "专业要求", example = "19754")
+    private Long majorId;
+
+    @Schema(description = "0.非热门 1.热门")
+    private Integer hot;
+
+    @Schema(description = "招聘部门")
+    private String dept;
+
+    @Schema(description = "上班时间")
+    private Object frequency;
+
+}

+ 45 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/fair/JobFairPageReqVO.java

@@ -0,0 +1,45 @@
+package com.citu.module.menduner.system.controller.base.job.fair;
+
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 招聘会分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class JobFairPageReqVO extends PageParam {
+
+    @Schema(description = "类型", example = "1")
+    private String type;
+
+    @Schema(description = "标题")
+    private String title;
+
+    @Schema(description = "口号")
+    private String slogan;
+
+    @Schema(description = "开始时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] startTime;
+
+    @Schema(description = "结束时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] endTime;
+
+    @Schema(description = "什么等级的vip可以参与")
+    private String vipRequire;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 88 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/fair/JobFairRespVO.java

@@ -0,0 +1,88 @@
+package com.citu.module.menduner.system.controller.base.job.fair;
+
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 招聘会 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class JobFairRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "27706")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("类型")
+    private String type;
+
+    @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("标题")
+    private String title;
+
+    @Schema(description = "口号")
+    @ExcelProperty("口号")
+    private String slogan;
+
+    @Schema(description = "头图")
+    @ExcelProperty("头图")
+    private String headImg;
+
+    @Schema(description = "背景图")
+    @ExcelProperty("背景图")
+    private String backgroundImg;
+
+    @Schema(description = "底图")
+    @ExcelProperty("底图")
+    private String bottomImg;
+
+    @Schema(description = "头图_PC")
+    @ExcelProperty("头图_PC")
+    private String pcHeadImg;
+
+    @Schema(description = "背景图_PC")
+    @ExcelProperty("背景图_PC")
+    private String pcBackgroundImg;
+
+    @Schema(description = "底图_PC")
+    @ExcelProperty("底图_PC")
+    private String pcBottomImg;
+
+    @Schema(description = "内部小区块色号")
+    @ExcelProperty("内部小区块色号")
+    private String insideColour;
+
+    @Schema(description = "职位背景色号")
+    @ExcelProperty("职位背景色号")
+    private String jobColour;
+
+    @Schema(description = "背景色色号")
+    @ExcelProperty("背景色色号")
+    private String backgroundColour;
+
+    @Schema(description = "分享背景图")
+    @ExcelProperty("分享背景图")
+    private String shareImg;
+
+    @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("开始时间")
+    private LocalDateTime startTime;
+
+    @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("结束时间")
+    private LocalDateTime endTime;
+
+    @Schema(description = "什么等级的vip可以参与")
+    @ExcelProperty("什么等级的vip可以参与")
+    private String vipRequire;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 70 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/fair/JobFairSaveReqVO.java

@@ -0,0 +1,70 @@
+package com.citu.module.menduner.system.controller.base.job.fair;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 招聘会新增/修改 Request VO")
+@Data
+public class JobFairSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "27706")
+    private Long id;
+
+    @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotEmpty(message = "类型不能为空")
+    private String type;
+
+    @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "标题不能为空")
+    private String title;
+
+    @Schema(description = "口号")
+    private String slogan;
+
+    @Schema(description = "头图")
+    private String headImg;
+
+    @Schema(description = "背景图")
+    private String backgroundImg;
+
+    @Schema(description = "底图")
+    private String bottomImg;
+
+    @Schema(description = "头图_PC")
+    private String pcHeadImg;
+
+    @Schema(description = "背景图_PC")
+    private String pcBackgroundImg;
+
+    @Schema(description = "底图_PC")
+    private String pcBottomImg;
+
+    @Schema(description = "内部小区块色号")
+    private String insideColour;
+
+    @Schema(description = "职位背景色号")
+    private String jobColour;
+
+    @Schema(description = "背景色色号")
+    private String backgroundColour;
+
+    @Schema(description = "分享背景图")
+    private String shareImg;
+
+    @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "开始时间不能为空")
+    private LocalDateTime startTime;
+
+    @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "结束时间不能为空")
+    private LocalDateTime endTime;
+
+    @Schema(description = "什么等级的vip可以参与")
+    private String vipRequire;
+
+}

+ 39 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/content/MorningNewsDO.java

@@ -0,0 +1,39 @@
+package com.citu.module.menduner.system.dal.dataobject.content;
+
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+
+/**
+ * 早报资讯 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_morning_news")
+@KeySequence("mde_morning_news_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MorningNewsDO extends TenantBaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 标题
+     */
+    private String title;
+    /**
+     * 外链地址
+     */
+    private String url;
+
+}

+ 55 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobAdvertisedExtendDO.java

@@ -0,0 +1,55 @@
+package com.citu.module.menduner.system.dal.dataobject.job;
+
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+
+/**
+ * 招聘职位扩展 DO
+ *
+ * @author Rayson
+ */
+@TableName(value = "mde_job_advertised_extend", autoResultMap = true)
+@KeySequence("mde_job_advertised_extend_seq")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class JobAdvertisedExtendDO extends TenantBaseDO {
+
+    /**
+     * 自增编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 职位id
+     */
+    private Long jobId;
+    /**
+     * 专业要求
+     */
+    private Long majorId;
+    /**
+     * 0.非热门 1.热门
+     */
+    private Integer hot;
+    /**
+     * 招聘部门
+     */
+    private String dept;
+    /**
+     * 上班时间
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Object frequency;
+
+}

+ 98 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobFairDO.java

@@ -0,0 +1,98 @@
+package com.citu.module.menduner.system.dal.dataobject.job;
+
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 招聘会 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_job_fair")
+@KeySequence("mde_job_fair_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class JobFairDO extends TenantBaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 类型
+     */
+    private String type;
+    /**
+     * 标题
+     */
+    private String title;
+    /**
+     * 口号
+     */
+    private String slogan;
+    /**
+     * 头图
+     */
+    private String headImg;
+    /**
+     * 背景图
+     */
+    private String backgroundImg;
+    /**
+     * 底图
+     */
+    private String bottomImg;
+    /**
+     * 头图_PC
+     */
+    private String pcHeadImg;
+    /**
+     * 背景图_PC
+     */
+    private String pcBackgroundImg;
+    /**
+     * 底图_PC
+     */
+    private String pcBottomImg;
+    /**
+     * 内部小区块色号
+     */
+    private String insideColour;
+    /**
+     * 职位背景色号
+     */
+    private String jobColour;
+    /**
+     * 背景色色号
+     */
+    private String backgroundColour;
+    /**
+     * 分享背景图
+     */
+    private String shareImg;
+    /**
+     * 开始时间
+     */
+    private LocalDateTime startTime;
+    /**
+     * 结束时间
+     */
+    private LocalDateTime endTime;
+    /**
+     * 什么等级的vip可以参与
+     */
+    private String vipRequire;
+
+}

+ 45 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobFairDetailDO.java

@@ -0,0 +1,45 @@
+package com.citu.module.menduner.system.dal.dataobject.job;
+
+
+import com.citu.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 招聘会详情 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_job_fair_detail")
+@KeySequence("mde_job_fair_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class JobFairDetailDO extends TenantBaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 招聘会id
+     */
+    private Long jobFairId;
+    /**
+     * 企业id
+     */
+    private Long enterpriseId;
+    /**
+     * 职位id
+     */
+    private Long jobId;
+
+}

+ 33 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/content/MorningNewsMapper.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.system.dal.mysql.content;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.content.MorningNewsDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 早报资讯 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface MorningNewsMapper extends BaseMapperX<MorningNewsDO> {
+
+    default PageResult<MorningNewsDO> selectPage(MorningNewsPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<MorningNewsDO>()
+                .eqIfPresent(MorningNewsDO::getTitle, reqVO.getTitle())
+                .eqIfPresent(MorningNewsDO::getUrl, reqVO.getUrl())
+                .betweenIfPresent(MorningNewsDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(MorningNewsDO::getId));
+    }
+
+    /** 查询最新的一条记录 **/
+    default MorningNewsDO selectLatest() {
+        return selectOne(new LambdaQueryWrapperX<MorningNewsDO>()
+                .orderByDesc(MorningNewsDO::getCreateTime)
+                .last("limit 1"));
+    }
+
+}

+ 15 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobAdvertisedExtendMapper.java

@@ -0,0 +1,15 @@
+package com.citu.module.menduner.system.dal.mysql.job;
+
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedExtendDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 招聘职位扩展 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface JobAdvertisedExtendMapper extends BaseMapperX<JobAdvertisedExtendDO> {
+
+}

+ 17 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobFairDetailMapper.java

@@ -0,0 +1,17 @@
+package com.citu.module.menduner.system.dal.mysql.job;
+
+
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.module.menduner.system.dal.dataobject.job.JobFairDetailDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 招聘会详情 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface JobFairDetailMapper extends BaseMapperX<JobFairDetailDO> {
+
+
+}

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobFairMapper.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.dal.mysql.job;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobFairDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 招聘会 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface JobFairMapper extends BaseMapperX<JobFairDO> {
+
+    default PageResult<JobFairDO> selectPage(JobFairPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<JobFairDO>()
+                .eqIfPresent(JobFairDO::getType, reqVO.getType())
+                .likeIfPresent(JobFairDO::getTitle, reqVO.getTitle())
+                .likeIfPresent(JobFairDO::getSlogan, reqVO.getSlogan())
+                .betweenIfPresent(JobFairDO::getStartTime, reqVO.getStartTime())
+                .betweenIfPresent(JobFairDO::getEndTime, reqVO.getEndTime())
+                .eqIfPresent(JobFairDO::getVipRequire, reqVO.getVipRequire())
+                .betweenIfPresent(JobFairDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(JobFairDO::getId));
+    }
+
+}

+ 63 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/content/MorningNewsService.java

@@ -0,0 +1,63 @@
+package com.citu.module.menduner.system.service.content;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsPageReqVO;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.content.MorningNewsDO;
+
+import javax.validation.Valid;
+
+/**
+ * 早报资讯 Service 接口
+ *
+ * @author Rayson
+ */
+public interface MorningNewsService {
+
+    /**
+     * 创建早报资讯
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createMorningNews(@Valid MorningNewsSaveReqVO createReqVO);
+
+    /**
+     * 更新早报资讯
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateMorningNews(@Valid MorningNewsSaveReqVO updateReqVO);
+
+    /**
+     * 删除早报资讯
+     *
+     * @param id 编号
+     */
+    void deleteMorningNews(Long id);
+
+    /**
+     * 获得早报资讯
+     *
+     * @param id 编号
+     * @return 早报资讯
+     */
+    MorningNewsDO getMorningNews(Long id);
+
+    /**
+     * 获得早报资讯分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 早报资讯分页
+     */
+    PageResult<MorningNewsDO> getMorningNewsPage(MorningNewsPageReqVO pageReqVO);
+
+
+    /**
+     * 获得最新早报
+     *
+     * @return 早报
+     */
+    MorningNewsDO getLatest();
+}

+ 76 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/content/MorningNewsServiceImpl.java

@@ -0,0 +1,76 @@
+package com.citu.module.menduner.system.service.content;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsPageReqVO;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.content.MorningNewsDO;
+import com.citu.module.menduner.system.dal.mysql.content.MorningNewsMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MORNING_NEWS_NOT_EXISTS;
+
+/**
+ * 早报资讯 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class MorningNewsServiceImpl implements MorningNewsService {
+
+    @Resource
+    private MorningNewsMapper mapper;
+
+    @Override
+    public Long createMorningNews(MorningNewsSaveReqVO createReqVO) {
+        // 插入
+        MorningNewsDO morningNews = BeanUtils.toBean(createReqVO, MorningNewsDO.class);
+        mapper.insert(morningNews);
+        // 返回
+        return morningNews.getId();
+    }
+
+    @Override
+    public void updateMorningNews(MorningNewsSaveReqVO updateReqVO) {
+        // 校验存在
+        validateMorningNewsExists(updateReqVO.getId());
+        // 更新
+        MorningNewsDO updateObj = BeanUtils.toBean(updateReqVO, MorningNewsDO.class);
+        mapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteMorningNews(Long id) {
+        // 校验存在
+        validateMorningNewsExists(id);
+        // 删除
+        mapper.deleteById(id);
+    }
+
+    private void validateMorningNewsExists(Long id) {
+        if (mapper.selectById(id) == null) {
+            throw exception(MORNING_NEWS_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public MorningNewsDO getMorningNews(Long id) {
+        return mapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<MorningNewsDO> getMorningNewsPage(MorningNewsPageReqVO pageReqVO) {
+        return mapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public MorningNewsDO getLatest() {
+        return mapper.selectLatest();
+    }
+}

+ 56 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/fair/JobFairService.java

@@ -0,0 +1,56 @@
+package com.citu.module.menduner.system.service.job.fair;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairPageReqVO;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobFairDO;
+
+import javax.validation.Valid;
+
+/**
+ * 招聘会 Service 接口
+ *
+ * @author Rayson
+ */
+public interface JobFairService {
+
+    /**
+     * 创建招聘会
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createJobFair(@Valid JobFairSaveReqVO createReqVO);
+
+    /**
+     * 更新招聘会
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateJobFair(@Valid JobFairSaveReqVO updateReqVO);
+
+    /**
+     * 删除招聘会
+     *
+     * @param id 编号
+     */
+    void deleteJobFair(Long id);
+
+    /**
+     * 获得招聘会
+     *
+     * @param id 编号
+     * @return 招聘会
+     */
+    JobFairDO getJobFair(Long id);
+
+    /**
+     * 获得招聘会分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 招聘会分页
+     */
+    PageResult<JobFairDO> getJobFairPage(JobFairPageReqVO pageReqVO);
+
+}

+ 72 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/fair/JobFairServiceImpl.java

@@ -0,0 +1,72 @@
+package com.citu.module.menduner.system.service.job.fair;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairPageReqVO;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobFairDO;
+import com.citu.module.menduner.system.dal.mysql.job.JobFairMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.JOB_FAIR_NOT_EXISTS;
+
+/**
+ * 招聘会 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class JobFairServiceImpl implements JobFairService {
+
+    @Resource
+    private JobFairMapper jobFairMapper;
+
+    @Override
+    public Long createJobFair(JobFairSaveReqVO createReqVO) {
+        // 插入
+        JobFairDO jobFair = BeanUtils.toBean(createReqVO, JobFairDO.class);
+        jobFairMapper.insert(jobFair);
+        // 返回
+        return jobFair.getId();
+    }
+
+    @Override
+    public void updateJobFair(JobFairSaveReqVO updateReqVO) {
+        // 校验存在
+        validateJobFairExists(updateReqVO.getId());
+        // 更新
+        JobFairDO updateObj = BeanUtils.toBean(updateReqVO, JobFairDO.class);
+        jobFairMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteJobFair(Long id) {
+        // 校验存在
+        validateJobFairExists(id);
+        // 删除
+        jobFairMapper.deleteById(id);
+    }
+
+    private void validateJobFairExists(Long id) {
+        if (jobFairMapper.selectById(id) == null) {
+            throw exception(JOB_FAIR_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public JobFairDO getJobFair(Long id) {
+        return jobFairMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<JobFairDO> getJobFairPage(JobFairPageReqVO pageReqVO) {
+        return jobFairMapper.selectPage(pageReqVO);
+    }
+
+}

+ 132 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/content/MorningNewsServiceImplTest.java

@@ -0,0 +1,132 @@
+package com.citu.module.menduner.system.service.content;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsPageReqVO;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.content.MorningNewsDO;
+import com.citu.module.menduner.system.dal.mysql.content.MorningNewsMapper;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static com.citu.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static com.citu.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static com.citu.framework.test.core.util.AssertUtils.assertServiceException;
+import static com.citu.framework.test.core.util.RandomUtils.randomLongId;
+import static com.citu.framework.test.core.util.RandomUtils.randomPojo;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MORNING_NEWS_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link MorningNewsServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(MorningNewsServiceImpl.class)
+public class MorningNewsServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private MorningNewsServiceImpl morningNewsService;
+
+    @Resource
+    private MorningNewsMapper morningNewsMapper;
+
+    @Test
+    public void testCreateMorningNews_success() {
+        // 准备参数
+        MorningNewsSaveReqVO createReqVO = randomPojo(MorningNewsSaveReqVO.class).setId(null);
+
+        // 调用
+        Long morningNewsId = morningNewsService.createMorningNews(createReqVO);
+        // 断言
+        assertNotNull(morningNewsId);
+        // 校验记录的属性是否正确
+        MorningNewsDO morningNews = morningNewsMapper.selectById(morningNewsId);
+        assertPojoEquals(createReqVO, morningNews, "id");
+    }
+
+    @Test
+    public void testUpdateMorningNews_success() {
+        // mock 数据
+        MorningNewsDO dbMorningNews = randomPojo(MorningNewsDO.class);
+        morningNewsMapper.insert(dbMorningNews);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        MorningNewsSaveReqVO updateReqVO = randomPojo(MorningNewsSaveReqVO.class, o -> {
+            o.setId(dbMorningNews.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        morningNewsService.updateMorningNews(updateReqVO);
+        // 校验是否更新正确
+        MorningNewsDO morningNews = morningNewsMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, morningNews);
+    }
+
+    @Test
+    public void testUpdateMorningNews_notExists() {
+        // 准备参数
+        MorningNewsSaveReqVO updateReqVO = randomPojo(MorningNewsSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> morningNewsService.updateMorningNews(updateReqVO), MORNING_NEWS_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteMorningNews_success() {
+        // mock 数据
+        MorningNewsDO dbMorningNews = randomPojo(MorningNewsDO.class);
+        morningNewsMapper.insert(dbMorningNews);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbMorningNews.getId();
+
+        // 调用
+        morningNewsService.deleteMorningNews(id);
+        // 校验数据不存在了
+        assertNull(morningNewsMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteMorningNews_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> morningNewsService.deleteMorningNews(id), MORNING_NEWS_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetMorningNewsPage() {
+        // mock 数据
+        MorningNewsDO dbMorningNews = randomPojo(MorningNewsDO.class, o -> { // 等会查询到
+            o.setTitle(null);
+            o.setUrl(null);
+            o.setCreateTime(null);
+        });
+        morningNewsMapper.insert(dbMorningNews);
+        // 测试 title 不匹配
+        morningNewsMapper.insert(cloneIgnoreId(dbMorningNews, o -> o.setTitle(null)));
+        // 测试 url 不匹配
+        morningNewsMapper.insert(cloneIgnoreId(dbMorningNews, o -> o.setUrl(null)));
+        // 测试 createTime 不匹配
+        morningNewsMapper.insert(cloneIgnoreId(dbMorningNews, o -> o.setCreateTime(null)));
+        // 准备参数
+        MorningNewsPageReqVO reqVO = new MorningNewsPageReqVO();
+        reqVO.setTitle(null);
+        reqVO.setUrl(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<MorningNewsDO> pageResult = morningNewsService.getMorningNewsPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbMorningNews, pageResult.getList().get(0));
+    }
+
+}

+ 149 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/job/JobFairServiceImplTest.java

@@ -0,0 +1,149 @@
+package com.citu.module.menduner.system.service.job;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairPageReqVO;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobFairDO;
+import com.citu.module.menduner.system.dal.mysql.job.JobFairMapper;
+import com.citu.module.menduner.system.service.job.fair.JobFairServiceImpl;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static com.citu.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static com.citu.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static com.citu.framework.test.core.util.AssertUtils.assertServiceException;
+import static com.citu.framework.test.core.util.RandomUtils.randomLongId;
+import static com.citu.framework.test.core.util.RandomUtils.randomPojo;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.JOB_FAIR_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link JobFairServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(JobFairServiceImpl.class)
+public class JobFairServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private JobFairServiceImpl jobFairService;
+
+    @Resource
+    private JobFairMapper jobFairMapper;
+
+    @Test
+    public void testCreateJobFair_success() {
+        // 准备参数
+        JobFairSaveReqVO createReqVO = randomPojo(JobFairSaveReqVO.class).setId(null);
+
+        // 调用
+        Long jobFairId = jobFairService.createJobFair(createReqVO);
+        // 断言
+        assertNotNull(jobFairId);
+        // 校验记录的属性是否正确
+        JobFairDO jobFair = jobFairMapper.selectById(jobFairId);
+        assertPojoEquals(createReqVO, jobFair, "id");
+    }
+
+    @Test
+    public void testUpdateJobFair_success() {
+        // mock 数据
+        JobFairDO dbJobFair = randomPojo(JobFairDO.class);
+        jobFairMapper.insert(dbJobFair);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        JobFairSaveReqVO updateReqVO = randomPojo(JobFairSaveReqVO.class, o -> {
+            o.setId(dbJobFair.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        jobFairService.updateJobFair(updateReqVO);
+        // 校验是否更新正确
+        JobFairDO jobFair = jobFairMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, jobFair);
+    }
+
+    @Test
+    public void testUpdateJobFair_notExists() {
+        // 准备参数
+        JobFairSaveReqVO updateReqVO = randomPojo(JobFairSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> jobFairService.updateJobFair(updateReqVO), JOB_FAIR_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteJobFair_success() {
+        // mock 数据
+        JobFairDO dbJobFair = randomPojo(JobFairDO.class);
+        jobFairMapper.insert(dbJobFair);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbJobFair.getId();
+
+        // 调用
+        jobFairService.deleteJobFair(id);
+        // 校验数据不存在了
+        assertNull(jobFairMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteJobFair_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> jobFairService.deleteJobFair(id), JOB_FAIR_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetJobFairPage() {
+        // mock 数据
+        JobFairDO dbJobFair = randomPojo(JobFairDO.class, o -> { // 等会查询到
+            o.setType(null);
+            o.setTitle(null);
+            o.setSlogan(null);
+            o.setStartTime(null);
+            o.setEndTime(null);
+            o.setVipRequire(null);
+            o.setCreateTime(null);
+        });
+        jobFairMapper.insert(dbJobFair);
+        // 测试 type 不匹配
+        jobFairMapper.insert(cloneIgnoreId(dbJobFair, o -> o.setType(null)));
+        // 测试 title 不匹配
+        jobFairMapper.insert(cloneIgnoreId(dbJobFair, o -> o.setTitle(null)));
+        // 测试 slogan 不匹配
+        jobFairMapper.insert(cloneIgnoreId(dbJobFair, o -> o.setSlogan(null)));
+        // 测试 startTime 不匹配
+        jobFairMapper.insert(cloneIgnoreId(dbJobFair, o -> o.setStartTime(null)));
+        // 测试 endTime 不匹配
+        jobFairMapper.insert(cloneIgnoreId(dbJobFair, o -> o.setEndTime(null)));
+        // 测试 vipRequire 不匹配
+        jobFairMapper.insert(cloneIgnoreId(dbJobFair, o -> o.setVipRequire(null)));
+        // 测试 createTime 不匹配
+        jobFairMapper.insert(cloneIgnoreId(dbJobFair, o -> o.setCreateTime(null)));
+        // 准备参数
+        JobFairPageReqVO reqVO = new JobFairPageReqVO();
+        reqVO.setType(null);
+        reqVO.setTitle(null);
+        reqVO.setSlogan(null);
+        reqVO.setStartTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+        reqVO.setEndTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+        reqVO.setVipRequire(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<JobFairDO> pageResult = jobFairService.getJobFairPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbJobFair, pageResult.getList().get(0));
+    }
+
+}

+ 3 - 1
menduner/menduner-system-biz/src/test/resources/sql/clean.sql

@@ -43,4 +43,6 @@ DELETE FROM "mde_redeem";
 DELETE FROM "mde_user_package";
 DELETE FROM "mde_user_entitlement";
 DELETE FROM "mde_enterprise_package";
-DELETE FROM "mde_enterprise_entitlement";
+DELETE FROM "mde_enterprise_entitlement";
+DELETE FROM "mde_morning_news";
+DELETE FROM "mde_job_fair";

+ 41 - 1
menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

@@ -777,4 +777,44 @@ CREATE TABLE IF NOT EXISTS "mde_enterprise_entitlement" (
     "deleted" bit NOT NULL DEFAULT FALSE,
     "tenant_id" bigint NOT NULL,
     PRIMARY KEY ("id")
-) COMMENT '企业权益记录';
+) COMMENT '企业权益记录';
+
+CREATE TABLE IF NOT EXISTS "mde_morning_news" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "title" varchar NOT NULL,
+    "url" varchar NOT NULL,
+    "creator" varchar DEFAULT '',
+    "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar DEFAULT '',
+    "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint NOT NULL,
+    PRIMARY KEY ("id")
+) COMMENT '早报资讯';
+
+CREATE TABLE IF NOT EXISTS "mde_job_fair" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "type" varchar NOT NULL,
+    "title" varchar NOT NULL,
+    "slogan" varchar,
+    "head_img" varchar,
+    "background_img" varchar,
+    "bottom_img" varchar,
+    "pc_head_img" varchar,
+    "pc_background_img" varchar,
+    "pc_bottom_img" varchar,
+    "inside_colour" varchar,
+    "job_colour" varchar,
+    "background_colour" varchar,
+    "share_img" varchar,
+    "start_time" varchar NOT NULL,
+    "end_time" varchar NOT NULL,
+    "vip_require" varchar,
+    "creator" varchar DEFAULT '',
+    "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar DEFAULT '',
+    "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint NOT NULL,
+    PRIMARY KEY ("id")
+) COMMENT '招聘会';