提交 346fb677 编写于 作者: 智布道's avatar 智布道 👁

增加广告位的功能

上级 7122e0b3
......@@ -23,3 +23,5 @@ hs_err_pid*
*.iml
*.versionsBackup
/logdir_IS_UNDEFINED/
/blog-codegen/generator-output/
*/target/
......@@ -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");
}
}
......@@ -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();
......
<#include "/include/macros.ftl">
<@header></@header>
<div class="clearfix"></div>
<div class="row">
<div class="col-md-12 col-sm-12 col-xs-12">
<ol class="breadcrumb">
<li><a href="/">首页</a></li>
<li class="active">广告管理</li>
</ol>
<div class="x_panel">
<div class="x_content">
<div class="btn-group hidden-xs" id="toolbar">
<@shiro.hasPermission name="bizAd:add">
<button id="btn_add" type="button" class="btn btn-info" title="新增广告">
<i class="fa fa-plus"></i> 新增
</button>
</@shiro.hasPermission>
<@shiro.hasPermission name="bizAd:batchDelete">
<button id="btn_delete_ids" type="button" class="btn btn-danger" title="批量删除">
<i class="fa fa-trash-o"></i> 批量删除
</button>
</@shiro.hasPermission>
</div>
<table id="tablelist">
</table>
</div>
</div>
</div>
</div>
<@addOrUpdateMOdal defaultTitle="添加广告">
<input type="hidden" name="id">
<div class="item form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-3" for="position">
广告位置
<span class="required">*</span>
</label>
<div class="col-md-7 col-sm-7 col-xs-7">
<select id="position" name="position" class="form-control col-md-5 col-xs-5" required>
<option value="">请选择</option>
<#list positions as item>
<option value="${item.name!}">${item.desc} - ${item.name!}</option>
</#list>
</select>
</div>
</div>
<div class="item form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-12"></label>
<div class="col-md-6 col-sm-6 col-xs-12">
<small>广告位置为 <code>首页开屏广告 - HOMEPAGE_OPEN_SCREEN</code> 时,广告类型必须为 <code>POP</code></small>
</div>
</div>
<div class="item form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-3" for="type">
广告类型
<span class="required">*</span>
</label>
<div class="col-md-7 col-sm-7 col-xs-7">
<select id="type" name="type" class="form-control col-md-5 col-xs-5" required>
<option value="">请选择</option>
<#list types as item>
<option value="${item.name!}">${item.desc} - ${item.name!}</option>
</#list>
</select>
</div>
</div>
<div class="item form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-3" for="title">
广告标题
</label>
<div class="col-md-7 col-sm-7 col-xs-7">
<input type="text" class="form-control" name="title" id="title" placeholder="请输入广告标题"/>
</div>
</div>
<div class="item form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-3" for="picture">
广告图片
</label>
<div class="col-md-7 col-sm-7 col-xs-7">
<input type="text" class="form-control" name="picture" id="picture" placeholder="请输入图片广告的图片地址(URL)"/>
</div>
</div>
<div class="item form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-3" for="link">
广告链接
</label>
<div class="col-md-7 col-sm-7 col-xs-7">
<input type="text" class="form-control" name="link" id="link" placeholder="请输入广告指向的链接地址(URL)"/>
</div>
</div>
<div class="item form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-3" for="content">
广告内容
</label>
<div class="col-md-7 col-sm-7 col-xs-7">
<textarea class="form-control col-md-7 col-xs-12" id="content" name="content" placeholder="仅作用于 JS 类型的广告。可以在此输入 HTML。" rows="10"></textarea>
</div>
</div>
<div class="item form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-3" for="expiringDate">
广告到期日
</label>
<div class="col-md-7 col-sm-7 col-xs-7">
<div class='input-group date myDatepicker'>
<input type='text' class="form-control" readonly="readonly" id="expiringDate" name="expiringDate" placeholder="请输入广告到期日"/>
<span class="input-group-addon">
<span class="fa fa-calendar"></span>
</span>
</div>
</div>
</div>
</@addOrUpdateMOdal>
<@footer>
<script>
var positionMap = {}
<#list positions as item>
positionMap['${item.name!}'] = '${item.desc}'
</#list>
var typeMap = {}
<#list types as item>
typeMap['${item.name!}'] = '${item.desc}'
</#list>
function operateFormatter(code, row, index) {
var trId = row.id;
var operateBtn = [
'<@shiro.hasPermission name="bizAd:edit"><a class="btn btn-xs btn-primary btn-update" data-id="' + trId + '"><i class="fa fa-edit"></i>编辑</a></@shiro.hasPermission>',
'<@shiro.hasPermission name="bizAd:delete"><a class="btn btn-xs btn-danger btn-remove" data-id="' + trId + '"><i class="fa fa-trash-o"></i>删除</a></@shiro.hasPermission>'
];
return operateBtn.join('');
}
$(function () {
var options = {
modalName: "广告",
url: "/bizAd/list",
getInfoUrl: "/bizAd/get/{id}",
updateUrl: "/bizAd/edit",
removeUrl: "/bizAd/remove",
createUrl: "/bizAd/add",
columns: [
{
checkbox: true
},
{
field: 'id',
title: 'ID',
formatter: function (code) {
return code ? code : '-';
}
},
{
field: 'type',
title: '广告类型',
width: '80px',
formatter: function (code) {
return code ? typeMap[code] : '-';
}
},
{
field: 'position',
title: '广告位置',
width: '160px',
formatter: function (code) {
return code ? positionMap[code] : '-';
}
},
{
field: 'title',
title: '广告标题',
width: '270px',
formatter: function (code, row, index) {
var content = code;
if(!content) {
return '-';
}
content = content.length > 30 ? (content.substr(0, 30) + '...') : content;
return '<span title="' + code + '">' + content + '</a>';
}
},
{
field: 'picture',
title: '广告图片',
width: '100px',
formatter: function (code) {
return code ? '<a href="' + code + '" class="showImage" rel="external nofollow">' +
'<img src="' + code + '" onerror="this.src=\'/assets/images/favicon.ico\'" class="img-rounded" style="width: 80px;">' +
'</a>' : '-';
}
},
{
field: 'link',
title: '广告链接',
width: '150px',
formatter: function (code) {
return code ? '<a href="' + code + '" rel="external nofollow" target="_blank">查看</a>' : '-';
}
},
{
field: 'expiringDate',
title: '广告到期日',
formatter: function (code) {
return code ? new Date(code).format("yyyy-MM-dd hh:mm:ss") : '-'
}
},
{
field: 'showNumber',
title: '展示次数',
width: '80px',
formatter: function (code) {
return code ? code : '-';
}
},
{
field: 'clickNumber',
title: '点击次数',
width: '80px',
formatter: function (code) {
return code ? code : '-';
}
},
{
field: 'operate',
title: '操作',
width: '130px',
formatter: operateFormatter //自定义方法,添加操作按钮
}
]
};
// 初始化table组件
var table = new Table(options);
table.init();
});
</script>
</@footer>
......@@ -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);
......
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<Map<String, String>> toListMap() {
AdPositionEnum[] adPositionEnums = AdPositionEnum.values();
List<Map<String, String>> res = new LinkedList<>();
Map<String, String> map = null;
for (AdPositionEnum adPositionEnum : adPositionEnums) {
map = new HashMap<>();
map.put("name", adPositionEnum.name());
map.put("desc", adPositionEnum.getDesc());
res.add(map);
}
return res;
}
}
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<Map<String, String>> toListMap() {
AdTypeEnum[] adTypeEnums = AdTypeEnum.values();
List<Map<String, String>> res = new LinkedList<>();
Map<String, String> map = null;
for (AdTypeEnum adTypeEnum : adTypeEnums) {
map = new HashMap<>();
map.put("name", adTypeEnum.name());
map.put("desc", adTypeEnum.getDesc());
res.add(map);
}
return res;
}
}
......@@ -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<BizAdBo, Long> {
* @return
*/
PageInfo<BizAdBo> findPageBreakByCondition(BizAdConditionVO vo);
BizAdBo getByPosition(AdPositionEnum positionEnum);
}
......@@ -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的属性不会保存,会使用数据库默认值
*
......
......@@ -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;
......
......@@ -7,7 +7,9 @@
<result property="content" jdbcType="VARCHAR" column="content"/>
<result property="picture" jdbcType="VARCHAR" column="picture"/>
<result property="link" jdbcType="VARCHAR" column="link"/>
<result property="title" jdbcType="VARCHAR" column="title"/>
<result property="position" jdbcType="VARCHAR" column="position"/>
<result property="type" jdbcType="VARCHAR" column="type"/>
<result property="expiringDate" jdbcType="TIMESTAMP" column="expiring_date"/>
<result property="showNumber" jdbcType="INTEGER" column="show_number"/>
<result property="clickNumber" jdbcType="INTEGER" column="click_number"/>
......@@ -18,10 +20,12 @@
<select id="findPageBreakByCondition" parameterType="com.zyd.blog.business.vo.BizAdConditionVO" resultMap="rm">
SELECT
t.id,
t.position,
t.type,
t.content,
t.picture,
t.link,
t.position,
t.title,
t.expiring_date,
t.show_number,
t.click_number,
......
......@@ -5,14 +5,12 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zyd.blog.business.annotation.BussinessLog;
import com.zyd.blog.business.entity.Article;
import com.zyd.blog.business.entity.BizAdBo;
import com.zyd.blog.business.entity.Comment;
import com.zyd.blog.business.entity.Link;
import com.zyd.blog.business.enums.CommentStatusEnum;
import com.zyd.blog.business.enums.PlatformEnum;
import com.zyd.blog.business.service.BizArticleService;
import com.zyd.blog.business.service.BizCommentService;
import com.zyd.blog.business.service.SysLinkService;
import com.zyd.blog.business.service.SysNoticeService;
import com.zyd.blog.business.service.*;
import com.zyd.blog.business.vo.CommentConditionVO;
import com.zyd.blog.framework.exception.ZhydArticleException;
import com.zyd.blog.framework.exception.ZhydCommentException;
......@@ -22,16 +20,17 @@ import com.zyd.blog.util.RestClientUtil;
import com.zyd.blog.util.ResultUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 网站接口类,申请友链、评论、点赞等
......@@ -55,6 +54,8 @@ public class RestApiController {
private BizArticleService articleService;
@Autowired
private SysNoticeService noticeService;
@Autowired
private BizAdService adService;
@PostMapping("/autoLink")
@BussinessLog(value = "自助申请友链", platform = PlatformEnum.WEB)
......@@ -177,4 +178,14 @@ public class RestApiController {
return ResultUtil.error("文章密码错误");
}
@GetMapping("/ads")
public ResponseVO ads() {
List<BizAdBo> list = adService.listAll();
Map<String, BizAdBo> res = null;
if (!CollectionUtils.isEmpty(list)) {
res = list.stream().collect(Collectors.toMap(BizAdBo::getPosition, Function.identity(), (key1, key2) -> key2));
}
return ResultUtil.success(res);
}
}
......@@ -3608,3 +3608,18 @@ img {
.navbar-brand img {
display: inline-block
}
/* 广告 */
.ad-mark {
padding: 8px;
position: relative;
}
.ad-mark:after {
content: '广告';
position: absolute;
right: 15px;
bottom: 15px;
color: #e8e8e8;
font-size: 12px;
}
......@@ -210,7 +210,7 @@ $(function () {
console.log("OneBlog,一个简洁美观、功能强大并且自适应的Java博客\n欢迎进QQ交流群(190886500)");
console.groupEnd();
console.group("推荐开源");
console.log("%c开源不易,所以原谅我在此推一下不算广告的广告", "color:red;font-size:12px;font-weight:blod");
console.log("%c开源不易,在此推一下开源项目", "color:red;font-size:12px;font-weight:blod");
console.log("%c① JustAuth,开箱即用的整合第三方登录的开源组件:https://github.com/justauth/JustAuth", "color:green;font-size:12px;font-weight:blod");
console.log("%c② JAP,一款开源的登录认证中间件,支持 Form、 OAuth2.0、OIDC、Http Basic、Digest、Bearer、LDAP、SAML、MFA、SSO 等:https://gitee.com/fujieid/jap", "color:green;font-size:12px;font-weight:blod");
console.log("%c欢迎关注、star、推荐", "color:green;font-size:12px;font-weight:blod");
......@@ -426,4 +426,59 @@ $(function () {
$(".nav.navbar-nav li.dropdown a.menu_a span.dropdown-toggle").attr("aria-expanded", "true")
}
var adResolver = {
IMG: function ($dom, adInfo, position) {
if(adInfo.link && adInfo.picture) {
var html = '<a href="' + adInfo.link + '" target="_blank" title="' + (adInfo.title || '') + '" rel="external nofollow">' +
'<img src="' + adInfo.picture + '" class="img-responsive" alt="' + (adInfo.title || '') + '" style="width: 100%;">' +
'</a>';
$dom.show().html(html);
}
},
JS: function ($dom, adInfo, position) {
$dom.show().html(adInfo.content);
},
TXT: function ($dom, adInfo, position) {
$dom.show().html(adInfo.content);
},
POP: function ($dom, adInfo, position) {
var html = '';
if(adInfo.link && adInfo.picture) {
html = '<a href="' + adInfo.link + '" target="_blank" title="' + (adInfo.title || '') + '" rel="external nofollow">' +
'<img src="' + adInfo.picture + '" class="img-responsive" alt="' + (adInfo.title || '') + '" style="width: 100%;">' +
'</a>';
}
html = html + '<p>' + adInfo.content + '</p>';
$dom.find('#ad-body').html(html);
$dom.show().modal('show');
}
};
$.ajax({
type: "get",
url: "/api/ads",
success: function (json) {
if (json.status == 200 && json.data) {
var data = json.data;
for(var key in data) {
var $dom = $('#' + key);
// 判断当前页面是否存在该广告位
if ($dom && $dom[0]) {
var adInfo = data[key];
if(adInfo.expired || adInfo.expired === 'true') {
// 广告已经过期
// console.log('广告已经过期', key)
} else {
var adType = adInfo.type;
adResolver[adType]($dom, adInfo, key);
}
}
}
}
},
error: function () {
$.alert.ajaxError();
}
});
});
......@@ -102,11 +102,8 @@
</ul>
</div>
</div>
<div class="blog-body">
<a href="https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=wylo59db&utm_source=wylo59db" target="_blank" rel="external nofollow">
<img src="${config.staticWebSite}/img/ad/aliyun_sale1000-60.png" alt="阿里云首购8折" class="img-responsive" style="width: 100%;">
</a>
</div>
<#-- 广告位 -->
<div class="blog-body ad-mark" id="ARTICLE_BOTTOM" style="display: none"></div>
<div class="blog-body prev-next">
<nav class="nav-single wow" data-wow-delay="0.3s">
<#if other.prev>
......@@ -199,6 +196,8 @@
</ul>
<div class="clear"></div>
</div>
<#-- 广告位 -->
<div class="blog-body ad-mark" id="COMMENT_BOX_TOP" style="display: none"></div>
<#--评论-->
<#if article.comment>
<div class="blog-body clear overflow-initial expansion">
......@@ -245,7 +244,7 @@
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/simplemde@1.11.2/dist/simplemde.min.js"></script>
<script>
var isPrivate = ${article.private};
var isPrivate = '${article.private}';
if(isPrivate || isPrivate == 'true') {
$("#lockModal").modal('show')
}
......
......@@ -44,6 +44,10 @@
</div>
</div>
</#if>
<#-- 广告位 -->
<div class="col-sm-12 blog-main">
<div class="blog-body ad-mark" id="COMMENT_BOX_TOP" style="display: none"></div>
</div>
<#if config.comment! && config.comment == 1>
<div class="col-sm-12 blog-main">
<div class="blog-body expansion">
......
......@@ -144,6 +144,18 @@
<#include "layout/sidebar.ftl"/>
</div>
</div>
<#-- 广告位 -->
<div id="HOMEPAGE_OPEN_SCREEN" style="display: none" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true" data-keyboard="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">站长力荐<i class="fa fa-fire red"></i></h4>
</div>
<div class="modal-body ad-mark" id="ad-body">
</div>
</div>
</div>
</div>
<@footer></@footer>
</@compress>
<div class="col-sm-3 blog-sidebar">
<#-- 广告位 -->
<div class="sidebar-module ad-mark" id="SIDEBAR_TOP" style="display: none"></div>
<#if articleDetail??>
<div class="sidebar-module">
<h5 class="custom-title"><i class="fa fa-hand-peace-o fa-fw icon"></i><strong>说给你听</strong><small></small></h5>
......@@ -178,4 +180,6 @@
</@zhydTag>
</ul>
</div>
<#-- 广告位 -->
<div class="sidebar-module ad-mark" id="SIDEBAR_BOTTOM" style="display: none"></div>
</div>
......@@ -13,14 +13,17 @@ if [ "$version" ]; then
fi
cd $pwd/blog-admin/ || exit
docker build -t justauth/blog-admin:v${current_version}
docker build -t justauth/blog-admin:v${current_version} .
docker push justauth/blog-admin:v${current_version}
cd $pwd/blog-web/ || exit
docker build -t justauth/blog-web:v${current_version}
docker build -t justauth/blog-web:v${current_version} .
docker push justauth/blog-web:v${current_version}
cd $pwd/docs/docker/mysql/ || exit
docker build -t justauth/blog-mysql:v${current_version}
docker push justauth/blog-mysql:v${current_version}
read -p '是否需要重新构建 blog-mysql?[y/n]' repeat
if [ "${repeat}" = "y" -o "${repeat}" = "Y" ];then
cd $pwd/docs/docker/mysql/ || exit
docker build -t justauth/blog-mysql:v${current_version} .
docker push justauth/blog-mysql:v${current_version}
fi
......@@ -12,6 +12,7 @@
<module>blog-web</module>
<module>blog-admin</module>
<module>blog-file</module>
<module>blog-codegen</module>
</modules>
<name>blog</name>
......@@ -75,6 +76,11 @@
<artifactId>blog-file</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.zyd</groupId>
<artifactId>blog-codegen</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
</dependencyManagement>
......
......@@ -6,6 +6,14 @@
### 2021-10-27
- 修复第三方登录失败的问题
- **增加代码生成模块 `blog-codegen`,新业务支持一键生成所有代码**
- 增加广告位
![img.png](./docs/_media/ad/img1.png)
![img.png](./docs/_media/ad/img2.png)
![img.png](./docs/_media/ad/img3.png)
![img.png](./docs/_media/ad/img4.png)
![img.png](./docs/_media/ad/img5.png)
### 2021-10-23
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册