From 346fb6773acb842acf8515706201bfa977a46b6f Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Wed, 27 Oct 2021 21:58:58 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=A2=9E=E5=8A=A0=E5=B9=BF?= =?UTF-8?q?=E5=91=8A=E4=BD=8D=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + .../zyd/blog/controller/RenderController.java | 13 +- .../blog/controller/RestBizAdController.java | 16 ++ .../main/resources/templates/bizAd/bizAd.ftl | 234 ++++++++++++++++++ .../com/zyd/blog/business/entity/BizAdBo.java | 35 ++- .../blog/business/enums/AdPositionEnum.java | 52 ++++ .../zyd/blog/business/enums/AdTypeEnum.java | 48 ++++ .../blog/business/service/BizAdService.java | 5 +- .../service/impl/BizAdServiceImpl.java | 12 + .../com/zyd/blog/persistence/beans/BizAd.java | 4 +- .../main/resources/mybatis/BizAdMapper.xml | 6 +- .../blog/controller/RestApiController.java | 27 +- .../main/resources/static/css/zhyd.core.css | 15 ++ blog-web/src/main/resources/static/js/zhyd.js | 57 ++++- .../src/main/resources/templates/article.ftl | 11 +- .../main/resources/templates/guestbook.ftl | 4 + .../src/main/resources/templates/index.ftl | 14 +- .../resources/templates/layout/sidebar.ftl | 4 + docs/_media/ad/img1.png | Bin 0 -> 84095 bytes docs/_media/ad/img2.png | Bin 0 -> 98837 bytes docs/_media/ad/img3.png | Bin 0 -> 140094 bytes docs/_media/ad/img4.png | Bin 0 -> 145063 bytes docs/_media/ad/img5.png | Bin 0 -> 75799 bytes docs/bin/deploy-docker.sh | 13 +- pom.xml | 6 + update.md | 8 + 26 files changed, 560 insertions(+), 26 deletions(-) create mode 100644 blog-admin/src/main/resources/templates/bizAd/bizAd.ftl create mode 100644 blog-core/src/main/java/com/zyd/blog/business/enums/AdPositionEnum.java create mode 100644 blog-core/src/main/java/com/zyd/blog/business/enums/AdTypeEnum.java create mode 100644 docs/_media/ad/img1.png create mode 100644 docs/_media/ad/img2.png create mode 100644 docs/_media/ad/img3.png create mode 100644 docs/_media/ad/img4.png create mode 100644 docs/_media/ad/img5.png diff --git a/.gitignore b/.gitignore index cf07d88..b9b0d0c 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ hs_err_pid* *.iml *.versionsBackup /logdir_IS_UNDEFINED/ +/blog-codegen/generator-output/ +*/target/ diff --git a/blog-admin/src/main/java/com/zyd/blog/controller/RenderController.java b/blog-admin/src/main/java/com/zyd/blog/controller/RenderController.java index 21366a8..433d0a8 100644 --- a/blog-admin/src/main/java/com/zyd/blog/controller/RenderController.java +++ b/blog-admin/src/main/java/com/zyd/blog/controller/RenderController.java @@ -12,8 +12,9 @@ package com.zyd.blog.controller; import com.zyd.blog.business.annotation.BussinessLog; import com.zyd.blog.business.entity.Article; +import com.zyd.blog.business.enums.AdPositionEnum; +import com.zyd.blog.business.enums.AdTypeEnum; import com.zyd.blog.business.service.BizArticleService; -import com.zyd.blog.business.service.SysConfigService; import com.zyd.blog.core.BlogHunterConfigProvider; import com.zyd.blog.core.websocket.server.ZydWebsocketServer; import com.zyd.blog.util.ResultUtil; @@ -225,4 +226,14 @@ public class RenderController { public ModelAndView page(Model model) { return ResultUtil.view("page/page"); } + + @RequiresPermissions("bizAds") + @BussinessLog("进入广告页面") + @GetMapping("/bizAd") + public ModelAndView bizAd(Model model) { + model.addAttribute("positions", AdPositionEnum.toListMap()); + model.addAttribute("types", AdTypeEnum.toListMap()); + return ResultUtil.view("bizAd/bizAd"); + } + } diff --git a/blog-admin/src/main/java/com/zyd/blog/controller/RestBizAdController.java b/blog-admin/src/main/java/com/zyd/blog/controller/RestBizAdController.java index 1d06b67..67a96cc 100644 --- a/blog-admin/src/main/java/com/zyd/blog/controller/RestBizAdController.java +++ b/blog-admin/src/main/java/com/zyd/blog/controller/RestBizAdController.java @@ -40,6 +40,10 @@ public class RestBizAdController { @RequiresPermissions("bizAd:add") @PostMapping(value = "/add") public ResponseVO add(BizAdBo bizAd) { + BizAdBo entity = bizAdService.getByPosition(bizAd.getPositionEnum()); + if (null != entity) { + return ResultUtil.error("当前广告位已存在广告,一个广告位仅支持一条广告"); + } bizAdService.insert(bizAd); return ResultUtil.success("成功"); } @@ -66,6 +70,18 @@ public class RestBizAdController { @PostMapping("/edit") public ResponseVO edit(BizAdBo bizAd) { try { + + BizAdBo entity = bizAdService.getByPrimaryKey(bizAd.getId()); + if (null == entity) { + return ResultUtil.error("广告不存在!"); + } + if (!entity.getPosition().equals(bizAd.getPosition())) { + entity = bizAdService.getByPosition(bizAd.getPositionEnum()); + if (null != entity) { + return ResultUtil.error("当前广告位已存在广告,一个广告位仅支持一条广告"); + } + } + bizAdService.updateSelective(bizAd); } catch (Exception e) { e.printStackTrace(); diff --git a/blog-admin/src/main/resources/templates/bizAd/bizAd.ftl b/blog-admin/src/main/resources/templates/bizAd/bizAd.ftl new file mode 100644 index 0000000..1415983 --- /dev/null +++ b/blog-admin/src/main/resources/templates/bizAd/bizAd.ftl @@ -0,0 +1,234 @@ +<#include "/include/macros.ftl"> +<@header> +
+
+
+ +
+
+ + +
+
+
+
+
+<@addOrUpdateMOdal defaultTitle="添加广告"> + +
+ +
+ +
+
+
+ +
+ 广告位置为 首页开屏广告 - HOMEPAGE_OPEN_SCREEN 时,广告类型必须为 POP +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + + + +
+
+
+ +<@footer> + + diff --git a/blog-core/src/main/java/com/zyd/blog/business/entity/BizAdBo.java b/blog-core/src/main/java/com/zyd/blog/business/entity/BizAdBo.java index 17a97ba..f1a4af1 100644 --- a/blog-core/src/main/java/com/zyd/blog/business/entity/BizAdBo.java +++ b/blog-core/src/main/java/com/zyd/blog/business/entity/BizAdBo.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.zyd.blog.business.consts.DateConst; import com.zyd.blog.business.enums.AdPositionEnum; +import com.zyd.blog.business.enums.AdTypeEnum; import com.zyd.blog.persistence.beans.BizAd; import org.springframework.format.annotation.DateTimeFormat; @@ -64,6 +65,14 @@ public class BizAdBo { this.bizAd.setLink(link); } + public String getTitle() { + return this.bizAd.getTitle(); + } + + public void setTitle(String title) { + this.bizAd.setTitle(title); + } + public String getPosition() { return this.bizAd.getPosition(); } @@ -78,7 +87,27 @@ public class BizAdBo { public AdPositionEnum getPositionEnum() { try { - return AdPositionEnum.valueOf(this.bizAd.getPosition()); + return AdPositionEnum.valueOf(this.getPosition()); + } catch (IllegalArgumentException e) { + return null; + } + } + + public String getType() { + return this.bizAd.getType(); + } + + public void setType(String type) { + this.bizAd.setType(type); + } + + public void setType(AdTypeEnum type) { + this.bizAd.setType(type.name()); + } + + public AdTypeEnum getTypeEnum() { + try { + return AdTypeEnum.valueOf(this.getType()); } catch (IllegalArgumentException e) { return null; } @@ -89,6 +118,10 @@ public class BizAdBo { return this.bizAd.getExpiringDate(); } + public boolean getExpired() { + return null != this.bizAd.getExpiringDate() && this.bizAd.getExpiringDate().before(new Date()); + } + @DateTimeFormat(pattern = DateConst.YYYY_MM_DD_HH_MM_SS_EN) public void setExpiringDate(Date expiringDate) { this.bizAd.setExpiringDate(expiringDate); diff --git a/blog-core/src/main/java/com/zyd/blog/business/enums/AdPositionEnum.java b/blog-core/src/main/java/com/zyd/blog/business/enums/AdPositionEnum.java new file mode 100644 index 0000000..70c9c97 --- /dev/null +++ b/blog-core/src/main/java/com/zyd/blog/business/enums/AdPositionEnum.java @@ -0,0 +1,52 @@ +package com.zyd.blog.business.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 广告位置 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0.0 + * @since 1.0.0 + */ +@Getter +@AllArgsConstructor +public enum AdPositionEnum { + + /** + * 每次刷新页面都弹窗显示,AdType 必须为 POP + */ + HOMEPAGE_OPEN_SCREEN("首页开屏广告"), + SIDEBAR_TOP("侧边栏顶部"), + SIDEBAR_BOTTOM("侧边栏底部"), + /** + * 文章详情底部,分页(上一篇下一篇)上方,标签和版权的下方 + */ + ARTICLE_BOTTOM("文章详情底部"), + /** + * 适用于文章详情页、留言板、等存在评论框的页面 + */ + COMMENT_BOX_TOP("评论框顶部"), + ; + + private String desc; + + public static List> toListMap() { + AdPositionEnum[] adPositionEnums = AdPositionEnum.values(); + List> res = new LinkedList<>(); + Map map = null; + for (AdPositionEnum adPositionEnum : adPositionEnums) { + map = new HashMap<>(); + map.put("name", adPositionEnum.name()); + map.put("desc", adPositionEnum.getDesc()); + res.add(map); + } + return res; + } +} diff --git a/blog-core/src/main/java/com/zyd/blog/business/enums/AdTypeEnum.java b/blog-core/src/main/java/com/zyd/blog/business/enums/AdTypeEnum.java new file mode 100644 index 0000000..9500769 --- /dev/null +++ b/blog-core/src/main/java/com/zyd/blog/business/enums/AdTypeEnum.java @@ -0,0 +1,48 @@ +package com.zyd.blog.business.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 广告类型 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0.0 + * @since 1.0.0 + */ +@Getter +@AllArgsConstructor +public enum AdTypeEnum { + + /** + * + */ + IMG("图片"), + POP("弹窗"), + /** + * 第三方的广告 + */ + JS("JS"), + TXT("纯文本"), + ; + + private String desc; + + public static List> toListMap() { + AdTypeEnum[] adTypeEnums = AdTypeEnum.values(); + List> res = new LinkedList<>(); + Map map = null; + for (AdTypeEnum adTypeEnum : adTypeEnums) { + map = new HashMap<>(); + map.put("name", adTypeEnum.name()); + map.put("desc", adTypeEnum.getDesc()); + res.add(map); + } + return res; + } +} diff --git a/blog-core/src/main/java/com/zyd/blog/business/service/BizAdService.java b/blog-core/src/main/java/com/zyd/blog/business/service/BizAdService.java index 37282c2..777f7af 100644 --- a/blog-core/src/main/java/com/zyd/blog/business/service/BizAdService.java +++ b/blog-core/src/main/java/com/zyd/blog/business/service/BizAdService.java @@ -2,13 +2,14 @@ package com.zyd.blog.business.service; +import com.zyd.blog.business.enums.AdPositionEnum; import com.zyd.blog.framework.object.AbstractService; import com.zyd.blog.business.entity.BizAdBo; import com.zyd.blog.business.vo.BizAdConditionVO; import com.github.pagehelper.PageInfo; /** - * + * * * @author generate by HouTu Generator * @version 1.0 @@ -24,4 +25,6 @@ public interface BizAdService extends AbstractService { * @return */ PageInfo findPageBreakByCondition(BizAdConditionVO vo); + + BizAdBo getByPosition(AdPositionEnum positionEnum); } diff --git a/blog-core/src/main/java/com/zyd/blog/business/service/impl/BizAdServiceImpl.java b/blog-core/src/main/java/com/zyd/blog/business/service/impl/BizAdServiceImpl.java index af9778d..bcee1be 100644 --- a/blog-core/src/main/java/com/zyd/blog/business/service/impl/BizAdServiceImpl.java +++ b/blog-core/src/main/java/com/zyd/blog/business/service/impl/BizAdServiceImpl.java @@ -3,6 +3,7 @@ package com.zyd.blog.business.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.zyd.blog.business.entity.BizAdBo; +import com.zyd.blog.business.enums.AdPositionEnum; import com.zyd.blog.business.service.BizAdService; import com.zyd.blog.business.vo.BizAdConditionVO; import com.zyd.blog.persistence.beans.BizAd; @@ -51,6 +52,17 @@ public class BizAdServiceImpl implements BizAdService { return bean; } + @Override + public BizAdBo getByPosition(AdPositionEnum positionEnum) { + if (null == positionEnum) { + return null; + } + BizAd ad = new BizAd(); + ad.setPosition(positionEnum.name()); + ad = this.bizAdMapper.selectOne(ad); + return null == ad ? null : new BizAdBo(ad); + } + /** * 保存一个实体,null的属性不会保存,会使用数据库默认值 * diff --git a/blog-core/src/main/java/com/zyd/blog/persistence/beans/BizAd.java b/blog-core/src/main/java/com/zyd/blog/persistence/beans/BizAd.java index 4c7cbbf..5a39f6c 100644 --- a/blog-core/src/main/java/com/zyd/blog/persistence/beans/BizAd.java +++ b/blog-core/src/main/java/com/zyd/blog/persistence/beans/BizAd.java @@ -21,10 +21,12 @@ import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) public class BizAd extends AbstractDO{ + private String position; + private String type; private String content; private String picture; private String link; - private String position; + private String title; private Date expiringDate; private Integer showNumber; private Integer clickNumber; diff --git a/blog-core/src/main/resources/mybatis/BizAdMapper.xml b/blog-core/src/main/resources/mybatis/BizAdMapper.xml index 44274cf..4c8ea19 100644 --- a/blog-core/src/main/resources/mybatis/BizAdMapper.xml +++ b/blog-core/src/main/resources/mybatis/BizAdMapper.xml @@ -7,7 +7,9 @@ + + @@ -18,10 +20,12 @@