Merge pull request #89 from JohnNiang/dev

Refactor post search method, pageable and sort
pull/216/head
RYAN0UP_ 2019-01-31 23:05:38 +08:00 committed by GitHub
commit e3c3b6daf3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
55 changed files with 1068 additions and 591 deletions

View File

@ -34,7 +34,6 @@
<oh-my-email.version>0.0.4</oh-my-email.version>
<lombok.version>1.18.4</lombok.version>
<ehcache.version>3.6.3</ehcache.version>
<rome.version>1.0</rome.version>
<hutool-all.version>4.4.2</hutool-all.version>
<upyun-java-sdk.version>4.0.1</upyun-java-sdk.version>
<qiniu-java-sdk.version>7.2.18</qiniu-java-sdk.version>
@ -120,13 +119,6 @@
<version>${ehcache.version}</version>
</dependency>
<!-- rss -->
<dependency>
<groupId>rome</groupId>
<artifactId>rome</artifactId>
<version>${rome.version}</version>
</dependency>
<!-- hutool工具包 -->
<dependency>
<groupId>cn.hutool</groupId>

View File

@ -5,6 +5,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ApplicationContext;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
/**
* <pre>
@ -17,6 +18,7 @@ import org.springframework.context.ApplicationContext;
@Slf4j
@SpringBootApplication
@EnableCaching
@EnableJpaAuditing
public class Application {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(Application.class, args);

View File

@ -83,8 +83,7 @@ public class WebMvcAutoConfiguration implements WebMvcConfigurer {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/templates/themes/")
.addResourceLocations("classpath:/robots.txt");
.addResourceLocations("classpath:/templates/themes/");
registry.addResourceHandler("/upload/**")
.addResourceLocations("file:///" + System.getProperties().getProperty("user.home") + "/halo/upload/");
registry.addResourceHandler("/favicon.ico")

View File

@ -1,6 +1,5 @@
package cc.ryanc.halo.listener;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.Theme;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.service.OptionsService;
@ -19,6 +18,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cc.ryanc.halo.model.dto.HaloConst.*;
/**
* <pre>
*
@ -72,7 +73,7 @@ public class StartedListener implements ApplicationListener<ApplicationStartedEv
private void loadOptions() {
final Map<String, String> options = optionsService.findAllOptions();
if (options != null && !options.isEmpty()) {
HaloConst.OPTIONS = options;
OPTIONS = options;
}
}
@ -80,10 +81,10 @@ public class StartedListener implements ApplicationListener<ApplicationStartedEv
*
*/
private void loadThemes() {
HaloConst.THEMES.clear();
THEMES.clear();
final List<Theme> themes = HaloUtils.getThemes();
if (null != themes) {
HaloConst.THEMES = themes;
THEMES = themes;
}
}
@ -227,6 +228,6 @@ public class StartedListener implements ApplicationListener<ApplicationStartedEv
map.put("@(高兴)", "<img src='/static/halo-common/OwO/alu/高兴.png' alt='高兴.png' style='vertical-align: middle;'>");
map.put("@(黑线)", "<img src='/static/halo-common/OwO/alu/黑线.png' alt='黑线.png' style='vertical-align: middle;'>");
map.put("@(鼓掌)", "<img src='/static/halo-common/OwO/alu/鼓掌.png' alt='鼓掌.png' style='vertical-align: middle;'>");
HaloConst.OWO = map;
OWO = map;
}
}

View File

@ -1,11 +1,10 @@
package cc.ryanc.halo.model.domain;
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@ -20,6 +19,7 @@ import java.util.Date;
@Data
@Entity
@Table(name = "halo_attachment")
@EntityListeners(AuditingEntityListener.class)
public class Attachment implements Serializable {
private static final long serialVersionUID = 3060117944880138064L;
@ -59,6 +59,7 @@ public class Attachment implements Serializable {
/**
*
*/
@CreatedDate
private Date attachCreated;
/**

View File

@ -2,6 +2,8 @@ package cc.ryanc.halo.model.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.Email;
@ -21,6 +23,7 @@ import java.util.List;
@Data
@Entity
@Table(name = "halo_comment")
@EntityListeners(AuditingEntityListener.class)
public class Comment implements Serializable {
private static final long serialVersionUID = -6639021627094260505L;
@ -72,6 +75,7 @@ public class Comment implements Serializable {
/**
*
*/
@CreatedDate
private Date commentDate;
/**

View File

@ -1,11 +1,10 @@
package cc.ryanc.halo.model.domain;
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@ -20,6 +19,7 @@ import java.util.Date;
@Data
@Entity
@Table(name = "halo_logs")
@EntityListeners(AuditingEntityListener.class)
public class Logs implements Serializable {
private static final long serialVersionUID = -2571815432301283171L;
@ -49,6 +49,7 @@ public class Logs implements Serializable {
/**
*
*/
@CreatedDate
private Date logCreated;
public Logs() {

View File

@ -2,6 +2,9 @@ package cc.ryanc.halo.model.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
@ -20,6 +23,7 @@ import java.util.List;
@Data
@Entity
@Table(name = "halo_post")
@EntityListeners(AuditingEntityListener.class)
public class Post implements Serializable {
private static final long serialVersionUID = -6019684584665869629L;
@ -105,11 +109,13 @@ public class Post implements Serializable {
/**
*
*/
@CreatedDate
private Date postDate;
/**
*
*/
@LastModifiedDate
private Date postUpdate;
/**

View File

@ -5,7 +5,9 @@ import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.domain.Tag;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
@ -20,7 +22,7 @@ import java.util.List;
* @author : RYAN0UP
* @date : 2017/11/14
*/
public interface PostRepository extends JpaRepository<Post, Long> {
public interface PostRepository extends JpaRepository<Post, Long>, JpaSpecificationExecutor<Post> {
/**
*
@ -50,6 +52,7 @@ public interface PostRepository extends JpaRepository<Post, Long> {
* @param pageable pageable
* @return Page
*/
@Deprecated
Page<Post> findByPostTypeAndPostStatusAndPostTitleLikeOrPostTypeAndPostStatusAndPostContentLike(
String postType0,
Integer postStatus0,

View File

@ -6,6 +6,8 @@ import cc.ryanc.halo.model.domain.Tag;
import cc.ryanc.halo.model.dto.Archive;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
@ -70,9 +72,24 @@ public interface PostService {
* @param postStatus
* @param pageable
* @return Page
* @see PostService#searchPostsBy(java.lang.String, java.lang.String, java.lang.Integer, org.springframework.data.domain.Pageable)
*/
@Deprecated
Page<Post> searchPosts(String keyword, String postType, Integer postStatus, Pageable pageable);
/**
*
*
* @param keyword
* @param postType
* @param postStatus
* @param pageable
* @return a page of posts
*/
@NonNull
Page<Post> searchPostsBy(@Nullable String keyword, @Nullable String postType, @Nullable Integer postStatus, @NonNull Pageable pageable);
/**
*
*
@ -248,22 +265,6 @@ public interface PostService {
*/
Integer getCountByStatus(Integer status);
/**
* rss
*
* @param posts posts
* @return String
*/
String buildRss(List<Post> posts);
/**
* sitemap
*
* @param posts posts
* @return String
*/
String buildSiteMap(List<Post> posts);
/**
*
*

View File

@ -1,7 +1,6 @@
package cc.ryanc.halo.service.impl;
import cc.ryanc.halo.model.domain.Attachment;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.QiNiuPutSet;
import cc.ryanc.halo.model.enums.AttachLocationEnum;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
@ -42,6 +41,8 @@ import java.io.IOException;
import java.nio.file.Paths;
import java.util.*;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -62,6 +63,7 @@ public class AttachmentServiceImpl implements AttachmentService {
*
*
* @param attachment attachment
*
* @return Attachment
*/
@Override
@ -85,6 +87,7 @@ public class AttachmentServiceImpl implements AttachmentService {
*
*
* @param pageable pageable
*
* @return Page
*/
@Override
@ -96,6 +99,7 @@ public class AttachmentServiceImpl implements AttachmentService {
* id
*
* @param attachId attachId
*
* @return Optional
*/
@Override
@ -107,6 +111,7 @@ public class AttachmentServiceImpl implements AttachmentService {
*
*
* @param attachId attachId
*
* @return Attachment
*/
@Override
@ -122,12 +127,13 @@ public class AttachmentServiceImpl implements AttachmentService {
*
* @param file file
* @param request request
*
* @return Map
*/
@Override
public Map<String, String> upload(MultipartFile file, HttpServletRequest request) {
Map<String, String> resultMap;
String attachLoc = HaloConst.OPTIONS.get(BlogPropertiesEnum.ATTACH_LOC.getProp());
String attachLoc = OPTIONS.get(BlogPropertiesEnum.ATTACH_LOC.getProp());
if (StrUtil.isEmpty(attachLoc)) {
attachLoc = "server";
}
@ -153,6 +159,7 @@ public class AttachmentServiceImpl implements AttachmentService {
*
* @param file file
* @param request request
*
* @return Map
*/
@Override
@ -244,6 +251,7 @@ public class AttachmentServiceImpl implements AttachmentService {
*
* @param file file
* @param request request
*
* @return Map
*/
@Override
@ -252,11 +260,11 @@ public class AttachmentServiceImpl implements AttachmentService {
try {
final Configuration cfg = new Configuration(Zone.zone0());
final String key = Md5Util.getMD5Checksum(file);
final String accessKey = HaloConst.OPTIONS.get("qiniu_access_key");
final String secretKey = HaloConst.OPTIONS.get("qiniu_secret_key");
final String domain = HaloConst.OPTIONS.get("qiniu_domain");
final String bucket = HaloConst.OPTIONS.get("qiniu_bucket");
final String smallUrl = HaloConst.OPTIONS.get("qiniu_small_url");
final String accessKey = OPTIONS.get("qiniu_access_key");
final String secretKey = OPTIONS.get("qiniu_secret_key");
final String domain = OPTIONS.get("qiniu_domain");
final String bucket = OPTIONS.get("qiniu_bucket");
final String smallUrl = OPTIONS.get("qiniu_small_url");
if (StrUtil.isEmpty(accessKey) || StrUtil.isEmpty(secretKey) || StrUtil.isEmpty(domain) || StrUtil.isEmpty(bucket)) {
return resultMap;
}
@ -304,6 +312,7 @@ public class AttachmentServiceImpl implements AttachmentService {
*
* @param file file
* @param request request
*
* @return Map
*/
@Override
@ -311,12 +320,12 @@ public class AttachmentServiceImpl implements AttachmentService {
final Map<String, String> resultMap = new HashMap<>(6);
try {
final String key = Md5Util.getMD5Checksum(file);
final String ossSrc = HaloConst.OPTIONS.get("upyun_oss_src");
final String ossPwd = HaloConst.OPTIONS.get("upyun_oss_pwd");
final String bucket = HaloConst.OPTIONS.get("upyun_oss_bucket");
final String domain = HaloConst.OPTIONS.get("upyun_oss_domain");
final String operator = HaloConst.OPTIONS.get("upyun_oss_operator");
final String smallUrl = HaloConst.OPTIONS.get("upyun_oss_small");
final String ossSrc = OPTIONS.get("upyun_oss_src");
final String ossPwd = OPTIONS.get("upyun_oss_pwd");
final String bucket = OPTIONS.get("upyun_oss_bucket");
final String domain = OPTIONS.get("upyun_oss_domain");
final String operator = OPTIONS.get("upyun_oss_operator");
final String smallUrl = OPTIONS.get("upyun_oss_small");
if (StrUtil.isEmpty(ossSrc) || StrUtil.isEmpty(ossPwd) || StrUtil.isEmpty(domain) || StrUtil.isEmpty(bucket) || StrUtil.isEmpty(operator)) {
return resultMap;
}
@ -353,15 +362,16 @@ public class AttachmentServiceImpl implements AttachmentService {
*
*
* @param key key
*
* @return boolean
*/
@Override
public boolean deleteQiNiuAttachment(String key) {
boolean flag = true;
final Configuration cfg = new Configuration(Zone.zone0());
final String accessKey = HaloConst.OPTIONS.get("qiniu_access_key");
final String secretKey = HaloConst.OPTIONS.get("qiniu_secret_key");
final String bucket = HaloConst.OPTIONS.get("qiniu_bucket");
final String accessKey = OPTIONS.get("qiniu_access_key");
final String secretKey = OPTIONS.get("qiniu_secret_key");
final String bucket = OPTIONS.get("qiniu_bucket");
if (StrUtil.isEmpty(accessKey) || StrUtil.isEmpty(secretKey) || StrUtil.isEmpty(bucket)) {
return false;
}
@ -381,15 +391,16 @@ public class AttachmentServiceImpl implements AttachmentService {
*
*
* @param fileName fileName
*
* @return boolean
*/
@Override
public boolean deleteUpYunAttachment(String fileName) {
boolean flag = true;
final String ossSrc = HaloConst.OPTIONS.get("upyun_oss_src");
final String ossPwd = HaloConst.OPTIONS.get("upyun_oss_pwd");
final String bucket = HaloConst.OPTIONS.get("upyun_oss_bucket");
final String operator = HaloConst.OPTIONS.get("upyun_oss_operator");
final String ossSrc = OPTIONS.get("upyun_oss_src");
final String ossPwd = OPTIONS.get("upyun_oss_pwd");
final String bucket = OPTIONS.get("upyun_oss_bucket");
final String operator = OPTIONS.get("upyun_oss_operator");
if (StrUtil.isEmpty(ossSrc) || StrUtil.isEmpty(ossPwd) || StrUtil.isEmpty(bucket) || StrUtil.isEmpty(operator)) {
return false;
}

View File

@ -39,7 +39,6 @@ public class LogsServiceImpl implements LogsService {
final Logs logs = new Logs();
logs.setLogTitle(logTitle);
logs.setLogContent(logContent);
logs.setLogCreated(new Date());
logs.setLogIp(ServletUtil.getClientIP(request));
logsRepository.save(logs);
}

View File

@ -1,6 +1,5 @@
package cc.ryanc.halo.service.impl;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.service.MailService;
import cc.ryanc.halo.utils.HaloUtils;
@ -15,6 +14,8 @@ import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import java.io.File;
import java.util.Map;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -40,12 +41,12 @@ public class MailServiceImpl implements MailService {
public void sendMail(String to, String subject, String content) {
//配置邮件服务器
HaloUtils.configMail(
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
try {
OhMyEmail.subject(subject)
.from(HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
.from(OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
.to(to)
.text(content)
.send();
@ -66,15 +67,15 @@ public class MailServiceImpl implements MailService {
public void sendTemplateMail(String to, String subject, Map<String, Object> content, String templateName) {
//配置邮件服务器
HaloUtils.configMail(
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
StrBuilder text = new StrBuilder();
try {
final Template template = freeMarker.getConfiguration().getTemplate(templateName);
text.append(FreeMarkerTemplateUtils.processTemplateIntoString(template, content));
OhMyEmail.subject(subject)
.from(HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
.from(OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
.to(to)
.html(text.toString())
.send();
@ -96,16 +97,16 @@ public class MailServiceImpl implements MailService {
public void sendAttachMail(String to, String subject, Map<String, Object> content, String templateName, String attachSrc) {
//配置邮件服务器
HaloUtils.configMail(
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
File file = new File(attachSrc);
StrBuilder text = new StrBuilder();
try {
final Template template = freeMarker.getConfiguration().getTemplate(templateName);
text.append(FreeMarkerTemplateUtils.processTemplateIntoString(template, content));
OhMyEmail.subject(subject)
.from(HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
.from(OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
.to(to)
.html(text.toString())
.attach(file, file.getName())

View File

@ -4,7 +4,6 @@ import cc.ryanc.halo.model.domain.Category;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.domain.Tag;
import cc.ryanc.halo.model.dto.Archive;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.PostStatusEnum;
import cc.ryanc.halo.model.enums.PostTypeEnum;
@ -13,7 +12,6 @@ import cc.ryanc.halo.service.CategoryService;
import cc.ryanc.halo.service.PostService;
import cc.ryanc.halo.service.TagService;
import cc.ryanc.halo.utils.HaloUtils;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import org.springframework.beans.factory.annotation.Autowired;
@ -22,12 +20,24 @@ import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.domain.Specifications;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.*;
import static org.springframework.data.jpa.domain.Specification.where;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
import static cc.ryanc.halo.model.dto.HaloConst.POSTS_VIEWS;
/**
* <pre>
@ -57,14 +67,15 @@ public class PostServiceImpl implements PostService {
*
*
* @param post Post
*
* @return Post
*/
@Override
@CacheEvict(value = {POSTS_CACHE_NAME, COMMENTS_CACHE_NAME}, allEntries = true, beforeInvocation = true)
public Post save(Post post) {
int postSummary = 50;
if (StrUtil.isNotEmpty(HaloConst.OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp()))) {
postSummary = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp()));
if (StrUtil.isNotEmpty(OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp()))) {
postSummary = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp()));
}
final String summaryText = StrUtil.cleanBlank(HtmlUtil.cleanHtmlTag(post.getPostContent()));
if (summaryText.length() > postSummary) {
@ -73,7 +84,6 @@ public class PostServiceImpl implements PostService {
} else {
post.setPostSummary(summaryText);
}
post.setPostUpdate(DateUtil.date());
return postRepository.save(post);
}
@ -81,6 +91,7 @@ public class PostServiceImpl implements PostService {
*
*
* @param postId postId
*
* @return Post
*/
@Override
@ -96,6 +107,7 @@ public class PostServiceImpl implements PostService {
*
* @param postId postId
* @param status status
*
* @return Post
*/
@Override
@ -130,6 +142,7 @@ public class PostServiceImpl implements PostService {
*
*
* @param postType post or page
*
* @return List
*/
@Override
@ -145,11 +158,12 @@ public class PostServiceImpl implements PostService {
* @param postType
* @param postStatus
* @param pageable
*
* @return Page
*/
@Override
public Page<Post> searchPosts(String keyword, String postType, Integer postStatus, Pageable pageable) {
Page<Post> posts = postRepository.findByPostTypeAndPostStatusAndPostTitleLikeOrPostTypeAndPostStatusAndPostContentLike(
return postRepository.findByPostTypeAndPostStatusAndPostTitleLikeOrPostTypeAndPostStatusAndPostContentLike(
postType,
postStatus,
"%" + keyword + "%",
@ -157,13 +171,23 @@ public class PostServiceImpl implements PostService {
postStatus,
"%" + keyword + "%",
pageable
);
for (Post post : posts.getContent()) {
).map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostSummary("该文章为加密文章");
}
}
return posts;
return post;
});
}
@Override
public Page<Post> searchPostsBy(String keyword, String postType, Integer postStatus, Pageable pageable) {
return postRepository.findAll(buildSearchSepcification(keyword, postType, postStatus), pageable)
.map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostSummary("该文章为加密文章");
}
return post;
});
}
/**
@ -172,35 +196,35 @@ public class PostServiceImpl implements PostService {
* @param status 012
* @param postType post or page
* @param pageable
*
* @return Page
*/
@Override
public Page<Post> findPostByStatus(Integer status, String postType, Pageable pageable) {
Page<Post> posts = postRepository.findPostsByPostStatusAndPostType(status, postType, pageable);
for (Post post : posts.getContent()) {
return postRepository.findPostsByPostStatusAndPostType(status, postType, pageable).map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostSummary("该文章为加密文章");
}
}
return posts;
return post;
});
}
/**
*
*
* @param pageable pageable
*
* @return Page
*/
@Override
@Cacheable(value = POSTS_CACHE_NAME, key = "'posts_page_'+#pageable.pageNumber")
public Page<Post> findPostByStatus(Pageable pageable) {
Page<Post> posts = postRepository.findPostsByPostStatusAndPostType(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
for (Post post : posts.getContent()) {
return postRepository.findPostsByPostStatusAndPostType(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable).map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostSummary("该文章为加密文章");
}
}
return posts;
return post;
});
}
/**
@ -208,6 +232,7 @@ public class PostServiceImpl implements PostService {
*
* @param status 012
* @param postType post or page
*
* @return List
*/
@Override
@ -220,6 +245,7 @@ public class PostServiceImpl implements PostService {
*
*
* @param postId postId
*
* @return Optional
*/
@Override
@ -231,6 +257,7 @@ public class PostServiceImpl implements PostService {
*
*
* @param postId postId
*
* @return Post
*/
@Override
@ -243,6 +270,7 @@ public class PostServiceImpl implements PostService {
*
* @param postUrl
* @param postType post or page
*
* @return Post
*/
@Override
@ -266,6 +294,7 @@ public class PostServiceImpl implements PostService {
*
*
* @param postDate postDate
*
* @return Post
*/
@Override
@ -277,6 +306,7 @@ public class PostServiceImpl implements PostService {
*
*
* @param postDate postDate
*
* @return Post
*/
@Override
@ -329,6 +359,7 @@ public class PostServiceImpl implements PostService {
/**
* @return List
*
* @Author Aquan
* @Description
* @Date 2019.1.4 11:16
@ -355,6 +386,7 @@ public class PostServiceImpl implements PostService {
*
* @param year year
* @param month month
*
* @return List
*/
@Override
@ -367,6 +399,7 @@ public class PostServiceImpl implements PostService {
*
*
* @param year year
*
* @return List
*/
@Override
@ -381,57 +414,55 @@ public class PostServiceImpl implements PostService {
* @param year year year
* @param month month month
* @param pageable pageable pageable
*
* @return Page
*/
@Override
public Page<Post> findPostByYearAndMonth(String year, String month, Pageable pageable) {
Page<Post> posts = postRepository.findPostByYearAndMonth(year, month, null);
for (Post post : posts.getContent()) {
return postRepository.findPostByYearAndMonth(year, month, null).map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostSummary("该文章为加密文章");
}
}
return posts;
return post;
});
}
/**
*
*
* @param category category
* @param status status
* @param pageable pageable
*
* @return Page
*/
@Override
@CachePut(value = POSTS_CACHE_NAME, key = "'posts_category_'+#category.cateId+'_'+#pageable.pageNumber")
public Page<Post> findPostByCategories(Category category, Pageable pageable) {
Page<Post> posts = postRepository.findPostByCategoriesAndPostStatus(category, PostStatusEnum.PUBLISHED.getCode(), pageable);
for (Post post : posts.getContent()) {
return postRepository.findPostByCategoriesAndPostStatus(category, PostStatusEnum.PUBLISHED.getCode(), pageable).map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostSummary("该文章为加密文章");
}
}
return posts;
return post;
});
}
/**
*
*
* @param tag tag
* @param status status
* @param pageable pageable
*
* @return Page
*/
@Override
@CachePut(value = POSTS_CACHE_NAME, key = "'posts_tag_'+#tag.tagId+'_'+#pageable.pageNumber")
public Page<Post> findPostsByTags(Tag tag, Pageable pageable) {
Page<Post> posts = postRepository.findPostsByTagsAndPostStatus(tag, PostStatusEnum.PUBLISHED.getCode(), pageable);
for (Post post : posts.getContent()) {
return postRepository.findPostsByTagsAndPostStatus(tag, PostStatusEnum.PUBLISHED.getCode(), pageable).map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostSummary("该文章为加密文章");
}
}
return posts;
return post;
});
}
/**
@ -449,6 +480,7 @@ public class PostServiceImpl implements PostService {
*
*
* @param post post
*
* @return List
*/
@Override
@ -486,6 +518,7 @@ public class PostServiceImpl implements PostService {
*
*
* @param status
*
* @return
*/
@Override
@ -493,34 +526,6 @@ public class PostServiceImpl implements PostService {
return postRepository.countAllByPostStatusAndPostType(status, PostTypeEnum.POST_TYPE_POST.getDesc());
}
/**
* rss
*
* @param posts posts
* @return String
*/
@Override
public String buildRss(List<Post> posts) {
String rss = "";
try {
rss = HaloUtils.getRss(posts);
} catch (Exception e) {
e.printStackTrace();
}
return rss;
}
/**
* sitemap
*
* @param posts posts
* @return String
*/
@Override
public String buildSiteMap(List<Post> posts) {
return HaloUtils.getSiteMap(posts);
}
/**
*
*
@ -528,10 +533,10 @@ public class PostServiceImpl implements PostService {
*/
@Override
public void cacheViews(Long postId) {
if (null != HaloConst.POSTS_VIEWS.get(postId)) {
HaloConst.POSTS_VIEWS.put(postId, HaloConst.POSTS_VIEWS.get(postId) + 1);
if (null != POSTS_VIEWS.get(postId)) {
POSTS_VIEWS.put(postId, POSTS_VIEWS.get(postId) + 1);
} else {
HaloConst.POSTS_VIEWS.put(postId, 1L);
POSTS_VIEWS.put(postId, 1L);
}
}
@ -541,6 +546,7 @@ public class PostServiceImpl implements PostService {
* @param post post
* @param cateList cateList
* @param tagList tagList
*
* @return Post Post
*/
@Override
@ -558,10 +564,58 @@ public class PostServiceImpl implements PostService {
*
*
* @param limit
*
* @return List
*/
@Override
public List<Post> getRecentPosts(int limit) {
return postRepository.getPostsByLimit(limit);
}
@NonNull
private Specification<Post> buildSearchSepcification(@NonNull String keyword,
@NonNull String postType,
@NonNull Integer postStatus) {
return Specification.where(postTitleLike(keyword)).or(postContentLike(keyword)).and(postTypeEqual(postType)).and(postStatusEqual(postStatus));
// return (root, criteriaQuery, criteriaBuilder) -> {
// List<Predicate> predicates = new LinkedList<>();
//
// if (StringUtils.hasText(keyword)) {
// predicates.add(criteriaBuilder.like(root.get("postContent"), keyword));
// predicates.add(criteriaBuilder.or(criteriaBuilder.like(root.get("postTitle"), keyword)));
// }
//
// if (StringUtils.hasText(postType)) {
// predicates.add(criteriaBuilder.equal(root.get("postType"), postType));
// }
//
// if (postStatus != null) {
// predicates.add(criteriaBuilder.equal(root.get("postStatus"), postStatus));
// }
//
// return criteriaQuery.where(predicates.toArray(new Predicate[0])).getRestriction();
// };
}
private Specification<Post> postContentLike(@NonNull String keyword) {
Assert.hasText(keyword, "Keyword must not be blank");
return (root, criteriaQuery, criteriaBuilder) ->
criteriaBuilder.like(criteriaBuilder.lower(root.get("postContent")), "%" + keyword.toLowerCase() + "%");
}
private Specification<Post> postTitleLike(@NonNull String keyword) {
Assert.hasText(keyword, "Keyword must not be blank");
return (root, criteriaQuery, criteriaBuilder) ->
criteriaBuilder.like(criteriaBuilder.lower(root.get("postTitle")), "%" + keyword.toLowerCase() + "%");
}
private Specification<Post> postTypeEqual(@NonNull String postType) {
return (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get("postType"), postType);
}
private Specification<Post> postStatusEqual(@NonNull Integer postStatus) {
return (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get("postStatus"), postStatus);
}
}

View File

@ -1,11 +1,12 @@
package cc.ryanc.halo.task;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.service.PostService;
import cc.ryanc.halo.utils.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import static cc.ryanc.halo.model.dto.HaloConst.POSTS_VIEWS;
/**
* @author : RYAN0UP
* @date : 2018/12/5
@ -20,15 +21,15 @@ public class PostSyncTask {
final PostService postService = SpringUtil.getBean(PostService.class);
Post post = null;
int count = 0;
for (Long key : HaloConst.POSTS_VIEWS.keySet()) {
for (Long key : POSTS_VIEWS.keySet()) {
post = postService.findByPostId(key).orElse(null);
if (null != post) {
post.setPostViews(post.getPostViews() + HaloConst.POSTS_VIEWS.get(key));
post.setPostViews(post.getPostViews() + POSTS_VIEWS.get(key));
postService.save(post);
count++;
}
}
log.info("The number of visits to {} posts has been updated", count);
HaloConst.POSTS_VIEWS.clear();
POSTS_VIEWS.clear();
}
}

View File

@ -1,20 +1,11 @@
package cc.ryanc.halo.utils;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.BackupDto;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.Theme;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.CommonParamsEnum;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
import com.sun.syndication.feed.rss.Channel;
import com.sun.syndication.feed.rss.Content;
import com.sun.syndication.feed.rss.Item;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.WireFeedOutput;
import io.github.biezhi.ome.OhMyEmail;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert;
@ -284,84 +275,6 @@ public class HaloUtils {
}
}
/**
* rss
*
* @param posts posts
*
* @return String
*
* @throws FeedException FeedException
*/
public static String getRss(List<Post> posts) throws FeedException {
Assert.notEmpty(posts, "posts must not be empty");
final Channel channel = new Channel("rss_2.0");
if (null == HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp())) {
channel.setTitle("");
} else {
channel.setTitle(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
}
if (null == HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp())) {
channel.setLink("");
} else {
channel.setLink(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
}
if (null == HaloConst.OPTIONS.get(BlogPropertiesEnum.SEO_DESC.getProp())) {
channel.setDescription("");
} else {
channel.setDescription(HaloConst.OPTIONS.get(BlogPropertiesEnum.SEO_DESC.getProp()));
}
channel.setLanguage("zh-CN");
final List<Item> items = new ArrayList<>();
for (Post post : posts) {
final Item item = new Item();
item.setTitle(post.getPostTitle());
final Content content = new Content();
String value = post.getPostContent();
final char[] xmlChar = value.toCharArray();
for (int i = 0; i < xmlChar.length; ++i) {
if (xmlChar[i] > 0xFFFD) {
xmlChar[i] = ' ';
} else if (xmlChar[i] < 0x20 && xmlChar[i] != 't' & xmlChar[i] != 'n' & xmlChar[i] != 'r') {
xmlChar[i] = ' ';
}
}
value = new String(xmlChar);
content.setValue(value);
item.setContent(content);
item.setLink(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/" + post.getPostUrl());
item.setPubDate(post.getPostDate());
items.add(item);
}
channel.setItems(items);
final WireFeedOutput out = new WireFeedOutput();
return out.outputString(channel);
}
/**
* sitemap
*
* @param posts posts
*
* @return String
*/
public static String getSiteMap(List<Post> posts) {
Assert.notEmpty(posts, "post mut not be empty");
final StrBuilder head = new StrBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">");
final StrBuilder urlBody = new StrBuilder();
final String urlPath = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/";
for (Post post : posts) {
urlBody.append("<url><loc>");
urlBody.append(urlPath);
urlBody.append(post.getPostUrl());
urlBody.append("</loc><lastmod>");
urlBody.append(DateUtil.format(post.getPostDate(), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));
urlBody.append("</lastmod></url>");
}
return head.append(urlBody).append("</urlset>").toString();
}
/**
*
*

View File

@ -1,8 +1,9 @@
package cc.ryanc.halo.utils;
import cc.ryanc.halo.model.dto.HaloConst;
import lombok.extern.slf4j.Slf4j;
import static cc.ryanc.halo.model.dto.HaloConst.OWO;
/**
* <pre>
* OwO
@ -18,11 +19,12 @@ public class OwoUtil {
*
*
* @param mark
*
* @return
*/
public static String markToImg(String mark) {
for (String key : HaloConst.OWO.keySet()) {
mark = mark.replace(key, HaloConst.OWO.get(key));
for (String key : OWO.keySet()) {
mark = mark.replace(key, OWO.get(key));
}
return mark;
}

View File

@ -1,7 +1,6 @@
package cc.ryanc.halo.web.controller.admin;
import cc.ryanc.halo.model.domain.*;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.dto.LogsRecord;
import cc.ryanc.halo.model.enums.*;
@ -20,9 +19,9 @@ import cn.hutool.http.HtmlUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@ -33,6 +32,9 @@ import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.*;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
/**
* <pre>
*
@ -77,7 +79,6 @@ public class AdminController extends BaseController {
*
*
* @param model model
* @param session session
* @return admin/admin_index
*/
@GetMapping(value = {"", "/index"})
@ -107,7 +108,7 @@ public class AdminController extends BaseController {
model.addAttribute("postViewsSum", postViewsSum);
//成立天数
final Date blogStart = DateUtil.parse(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_START.getProp()));
final Date blogStart = DateUtil.parse(OPTIONS.get(BlogPropertiesEnum.BLOG_START.getProp()));
final long hadDays = DateUtil.between(blogStart, DateUtil.date(), DateUnit.DAY);
model.addAttribute("hadDays", hadDays);
return "admin/admin_index";
@ -117,11 +118,12 @@ public class AdminController extends BaseController {
*
*
* @param session session
*
* @return admin/admin_login
*/
@GetMapping(value = "/login")
public String login(HttpSession session) {
final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
final User user = (User) session.getAttribute(USER_SESSION_KEY);
//如果session存在跳转到后台首页
if (null != user) {
return "redirect:/admin";
@ -135,6 +137,7 @@ public class AdminController extends BaseController {
* @param loginName
* @param loginPwd loginPwd
* @param session session session
*
* @return JsonResult JsonResult
*/
@PostMapping(value = "/getLogin")
@ -163,7 +166,7 @@ public class AdminController extends BaseController {
userService.updateUserLoginLast(DateUtil.date());
//判断User对象是否相等
if (ObjectUtil.equal(aUser, user)) {
session.setAttribute(HaloConst.USER_SESSION_KEY, aUser);
session.setAttribute(USER_SESSION_KEY, aUser);
//重置用户的登录状态为正常
userService.updateUserNormal();
logsService.save(LogsRecord.LOGIN, LogsRecord.LOGIN_SUCCESS, request);
@ -186,12 +189,13 @@ public class AdminController extends BaseController {
* 退 session
*
* @param session session
*
* @return /admin/login
*/
@GetMapping(value = "/logOut")
public String logOut(HttpSession session) {
final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
session.removeAttribute(HaloConst.USER_SESSION_KEY);
final User user = (User) session.getAttribute(USER_SESSION_KEY);
session.removeAttribute(USER_SESSION_KEY);
logsService.save(LogsRecord.LOGOUT, user.getUserName(), request);
log.info("User {} has logged out", user.getUserName());
return "redirect:/admin/login";
@ -201,16 +205,11 @@ public class AdminController extends BaseController {
*
*
* @param model model model
* @param page page
* @param size size
* @return admin/widget/_logs-all
*/
@GetMapping(value = "/logs")
public String logs(Model model,
@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "size", defaultValue = "10") Integer size) {
public String logs(Model model, @PageableDefault Pageable pageable) {
final Sort sort = new Sort(Sort.Direction.DESC, "logId");
final Pageable pageable = PageRequest.of(page, size, sort);
final Page<Logs> logs = logsService.findAll(pageable);
model.addAttribute("logs", logs);
return "admin/widget/_logs-all";
@ -279,6 +278,7 @@ public class AdminController extends BaseController {
*
* @param file file
* @param request request
*
* @return JsonResult
*/
@PostMapping(value = "/tools/markdownImport")
@ -286,7 +286,7 @@ public class AdminController extends BaseController {
public JsonResult markdownImport(@RequestParam("file") MultipartFile file,
HttpServletRequest request,
HttpSession session) throws IOException {
final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
final User user = (User) session.getAttribute(USER_SESSION_KEY);
final String markdown = IoUtil.read(file.getInputStream(), "UTF-8");
final String content = MarkdownUtils.renderMarkdown(markdown);
final Map<String, List<String>> frontMatters = MarkdownUtils.getFrontMatter(markdown);

View File

@ -8,14 +8,14 @@ import cc.ryanc.halo.model.enums.ResultCodeEnum;
import cc.ryanc.halo.service.AttachmentService;
import cc.ryanc.halo.service.LogsService;
import cc.ryanc.halo.utils.LocaleMessageUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@ -55,15 +55,11 @@ public class AttachmentController {
*
*
* @param model model
*
* @return admin/admin_attachment
*/
@GetMapping
public String attachments(Model model,
@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "size", defaultValue = "18") Integer size) {
final Sort sort = new Sort(Sort.Direction.DESC, "attachId");
final Pageable pageable = PageRequest.of(page, size, sort);
@PageableDefault(size = 18, sort = "attachId", direction = Sort.Direction.DESC) Pageable pageable) {
final Page<Attachment> attachments = attachmentService.findAll(pageable);
model.addAttribute("attachments", attachments);
return "admin/admin_attachment";
@ -73,17 +69,13 @@ public class AttachmentController {
*
*
* @param model model
* @param page page
*
* @return admin/widget/_attachment-select
*/
@GetMapping(value = "/select")
public String selectAttachment(Model model,
@RequestParam(value = "page", defaultValue = "0") Integer page,
@PageableDefault(size = 18, sort = "attachId", direction = Sort.Direction.DESC) Pageable pageable,
@RequestParam(value = "id", defaultValue = "none") String id,
@RequestParam(value = "type", defaultValue = "normal") String type) {
final Sort sort = new Sort(Sort.Direction.DESC, "attachId");
final Pageable pageable = PageRequest.of(page, 18, sort);
final Page<Attachment> attachments = attachmentService.findAll(pageable);
model.addAttribute("attachments", attachments);
model.addAttribute("id", id);
@ -109,7 +101,6 @@ public class AttachmentController {
*
* @param file file
* @param request request
*
* @return Map
*/
@PostMapping(value = "/upload", produces = {"application/json;charset=UTF-8"})
@ -133,7 +124,6 @@ public class AttachmentController {
attachment.setAttachSmallPath(resultMap.get("smallPath"));
attachment.setAttachType(file.getContentType());
attachment.setAttachSuffix(resultMap.get("suffix"));
attachment.setAttachCreated(DateUtil.date());
attachment.setAttachSize(resultMap.get("size"));
attachment.setAttachWh(resultMap.get("wh"));
attachment.setAttachLocation(resultMap.get("location"));
@ -160,7 +150,6 @@ public class AttachmentController {
*
* @param model model
* @param attachId
*
* @return admin/widget/_attachment-detail
*/
@GetMapping(value = "/attachment")
@ -175,55 +164,52 @@ public class AttachmentController {
*
* @param attachId
* @param request request
*
* @return JsonResult
*/
@GetMapping(value = "/remove")
@ResponseBody
public JsonResult removeAttachment(@RequestParam("attachId") Long attachId,
HttpServletRequest request) {
Optional<Attachment> attachment = attachmentService.findByAttachId(attachId);
String attachLocation = attachment.get().getAttachLocation();
String delFileName = attachment.get().getAttachName();
final Attachment attachment = attachmentService.findByAttachId(attachId).orElse(new Attachment());
final String attachLocation = attachment.getAttachLocation();
final String attachName = attachment.getAttachName();
final String attachPath = attachment.getAttachPath();
boolean flag = true;
try {
//删除数据库中的内容
attachmentService.remove(attachId);
if (attachLocation != null) {
if (attachLocation.equals(SERVER.getDesc())) {
String delSmallFileName = delFileName.substring(0, delFileName.lastIndexOf('.')) + "_small" + attachment.get().getAttachSuffix();
//删除文件
String userPath = System.getProperties().getProperty("user.home") + "/halo";
File mediaPath = new File(userPath, attachment.get().getAttachPath().substring(0, attachment.get().getAttachPath().lastIndexOf('/')));
File delFile = new File(new StringBuffer(mediaPath.getAbsolutePath()).append("/").append(delFileName).toString());
File delSmallFile = new File(new StringBuffer(mediaPath.getAbsolutePath()).append("/").append(delSmallFileName).toString());
StrBuilder userPath = new StrBuilder(System.getProperties().getProperty("user.home"));
userPath.append("/halo");
//图片物理地址
StrBuilder delPath = new StrBuilder(userPath);
delPath.append(attachPath);
//缩略图物理地址
StrBuilder delSmallPath = new StrBuilder(userPath);
delSmallPath.append(attachment.getAttachSmallPath());
File delFile = new File(delPath.toString());
File delSmallFile = new File(delSmallPath.toString());
if (delFile.exists() && delFile.isFile()) {
flag = delFile.delete() && delSmallFile.delete();
}
} else if (attachLocation.equals(QINIU.getDesc())) {
//七牛删除
String attachPath = attachment.get().getAttachPath();
String key = attachPath.substring(attachPath.lastIndexOf("/") + 1);
flag = attachmentService.deleteQiNiuAttachment(key);
} else if (attachLocation.equals(UPYUN.getDesc())) {
//又拍删除
String attachPath = attachment.get().getAttachPath();
String fileName = attachPath.substring(attachPath.lastIndexOf("/") + 1);
flag = attachmentService.deleteUpYunAttachment(fileName);
} else {
//..
}
}
if (flag) {
log.info("Delete file {} successfully!", delFileName);
logsService.save(LogsRecord.REMOVE_FILE, delFileName, request);
attachmentService.remove(attachId);
log.info("Delete file {} successfully!", attachName);
logsService.save(LogsRecord.REMOVE_FILE, attachName, request);
} else {
log.error("Deleting attachment {} failed!", delFileName);
log.error("Deleting attachment {} failed!", attachName);
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.delete-failed"));
}
} catch (Exception e) {
e.printStackTrace();
log.error("Deleting attachment {} failed: {}", delFileName, e.getMessage());
log.error("Deleting attachment {} failed: {}", attachName, e.getMessage());
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.delete-failed"));
}
return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.common.delete-success"));

View File

@ -5,7 +5,6 @@ import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.domain.Tag;
import cc.ryanc.halo.model.domain.User;
import cc.ryanc.halo.model.dto.BackupDto;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.enums.*;
import cc.ryanc.halo.service.MailService;
@ -34,6 +33,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
/**
* <pre>
*
@ -170,14 +172,14 @@ public class BackupController {
content.append("date: ").append(post.getPostDate()).append("\n");
content.append("updated: ").append(post.getPostUpdate()).append("\n");
content.append("thumbnail: ").append(post.getPostThumbnail()).append("\n");
if(post.getTags().size()>0){
if (post.getTags().size() > 0) {
content.append("tags:").append("\n");
final List<Tag> tags = post.getTags();
for (Tag tag : tags) {
content.append(" - ").append(tag.getTagName()).append("\n");
}
}
if(post.getCategories().size()>0){
if (post.getCategories().size() > 0) {
content.append("categories:").append("\n");
final List<Category> categories = post.getCategories();
for (Category category : categories) {
@ -236,11 +238,11 @@ public class BackupController {
@RequestParam("type") String type,
HttpSession session) {
final String srcPath = System.getProperties().getProperty("user.home") + "/halo/backup/" + type + "/" + fileName;
final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
final User user = (User) session.getAttribute(USER_SESSION_KEY);
if (null == user.getUserEmail() || StrUtil.isEmpty(user.getUserEmail())) {
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.backup.no-email"));
}
if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.FALSE.getDesc())) {
if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.FALSE.getDesc())) {
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.no-post"));
}
new EmailToAdmin(srcPath, user).start();

View File

@ -3,7 +3,6 @@ package cc.ryanc.halo.web.controller.admin;
import cc.ryanc.halo.model.domain.Comment;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.domain.User;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.enums.*;
import cc.ryanc.halo.service.CommentService;
@ -11,7 +10,6 @@ import cc.ryanc.halo.service.MailService;
import cc.ryanc.halo.service.PostService;
import cc.ryanc.halo.utils.OwoUtil;
import cc.ryanc.halo.web.controller.core.BaseController;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
@ -24,6 +22,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@ -33,6 +32,9 @@ import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
/**
* <pre>
*
@ -60,18 +62,12 @@ public class CommentController extends BaseController {
*
* @param model model
* @param status status
* @param page page
* @param size size
*
* @return admin/admin_comment
*/
@GetMapping
public String comments(Model model,
@RequestParam(value = "status", defaultValue = "0") Integer status,
@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "size", defaultValue = "10") Integer size) {
final Sort sort = new Sort(Sort.Direction.DESC, "commentDate");
final Pageable pageable = PageRequest.of(page, size, sort);
@PageableDefault(sort = "commentDate", direction = Sort.Direction.DESC) Pageable pageable,
@RequestParam(value = "status", defaultValue = "0") Integer status) {
final Page<Comment> comments = commentService.findAll(status, pageable);
model.addAttribute("comments", comments);
model.addAttribute("publicCount", commentService.getCountByStatus(CommentStatusEnum.PUBLISHED.getCode()));
@ -86,19 +82,18 @@ public class CommentController extends BaseController {
*
* @param commentId
* @param status
*
* @return /admin/comments
*/
@GetMapping(value = "/throw")
public String moveToTrash(@RequestParam("commentId") Long commentId,
@RequestParam("status") String status,
@RequestParam(value = "page", defaultValue = "0") Integer page) {
@PageableDefault Pageable pageable) {
try {
commentService.updateCommentStatus(commentId, CommentStatusEnum.RECYCLE.getCode());
} catch (Exception e) {
log.error("Delete comment failed: {}", e.getMessage());
}
return "redirect:/admin/comments?status=" + status + "&page=" + page;
return "redirect:/admin/comments?status=" + status + "&page=" + pageable.getPageNumber();
}
/**
@ -107,7 +102,6 @@ public class CommentController extends BaseController {
* @param commentId
* @param status
* @param session session
*
* @return /admin/comments
*/
@GetMapping(value = "/revert")
@ -116,7 +110,7 @@ public class CommentController extends BaseController {
HttpSession session) {
final Comment comment = commentService.updateCommentStatus(commentId, CommentStatusEnum.PUBLISHED.getCode());
final Post post = comment.getPost();
final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
final User user = (User) session.getAttribute(USER_SESSION_KEY);
//判断是否启用邮件服务
new NoticeToAuthor(comment, post, user, status).start();
@ -128,20 +122,18 @@ public class CommentController extends BaseController {
*
* @param commentId commentId
* @param status status
* @param page
*
* @return string /admin/comments
*/
@GetMapping(value = "/remove")
public String moveToAway(@RequestParam("commentId") Long commentId,
@RequestParam("status") Integer status,
@RequestParam(value = "page", defaultValue = "0") Integer page) {
@PageableDefault Pageable pageable) {
try {
commentService.remove(commentId);
} catch (Exception e) {
log.error("Delete comment failed: {}", e.getMessage());
}
return "redirect:/admin/comments?status=" + status + "&page=" + page;
return "redirect:/admin/comments?status=" + status + "&page=" + pageable.getPageNumber();
}
@ -150,7 +142,6 @@ public class CommentController extends BaseController {
*
* @param commentId
* @param commentContent
*
* @return JsonResult
*/
@PostMapping(value = "/reply")
@ -165,7 +156,7 @@ public class CommentController extends BaseController {
final Post post = postService.findByPostId(postId).orElse(new Post());
//博主信息
final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
final User user = (User) session.getAttribute(USER_SESSION_KEY);
//被回复的评论
final Comment lastComment = commentService.findCommentById(commentId).orElse(new Comment());
@ -179,10 +170,9 @@ public class CommentController extends BaseController {
comment.setPost(post);
comment.setCommentAuthor(user.getUserDisplayName());
comment.setCommentAuthorEmail(user.getUserEmail());
comment.setCommentAuthorUrl(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
comment.setCommentAuthorUrl(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
comment.setCommentAuthorIp(ServletUtil.getClientIP(request));
comment.setCommentAuthorAvatarMd5(SecureUtil.md5(user.getUserEmail()));
comment.setCommentDate(DateUtil.date());
final StrBuilder buildContent = new StrBuilder("<a href='#comment-id-");
buildContent.append(lastComment.getCommentId());
@ -228,14 +218,14 @@ public class CommentController extends BaseController {
@Override
public void run() {
if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.COMMENT_REPLY_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.COMMENT_REPLY_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
if (Validator.isEmail(lastComment.getCommentAuthorEmail())) {
final Map<String, Object> map = new HashMap<>(8);
map.put("blogTitle", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
map.put("blogTitle", OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
map.put("commentAuthor", lastComment.getCommentAuthor());
map.put("pageName", lastComment.getPost().getPostTitle());
final StrBuilder pageUrl = new StrBuilder(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
final StrBuilder pageUrl = new StrBuilder(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
if (StrUtil.equals(post.getPostType(), PostTypeEnum.POST_TYPE_POST.getDesc())) {
pageUrl.append("/archives/");
} else {
@ -249,9 +239,9 @@ public class CommentController extends BaseController {
map.put("commentContent", lastComment.getCommentContent());
map.put("replyAuthor", user.getUserDisplayName());
map.put("replyContent", commentContent);
map.put("blogUrl", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
map.put("blogUrl", OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
mailService.sendTemplateMail(
lastComment.getCommentAuthorEmail(), "您在" + HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "的评论有了新回复", map, "common/mail_template/mail_reply.ftl");
lastComment.getCommentAuthorEmail(), "您在" + OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "的评论有了新回复", map, "common/mail_template/mail_reply.ftl");
}
}
}
@ -276,12 +266,12 @@ public class CommentController extends BaseController {
@Override
public void run() {
if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.COMMENT_REPLY_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.COMMENT_REPLY_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
try {
if (status == 1 && Validator.isEmail(comment.getCommentAuthorEmail())) {
final Map<String, Object> map = new HashMap<>(6);
final StrBuilder pageUrl = new StrBuilder(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
final StrBuilder pageUrl = new StrBuilder(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
if (StrUtil.equals(post.getPostType(), PostTypeEnum.POST_TYPE_POST.getDesc())) {
pageUrl.append("/archives/");
} else {
@ -294,12 +284,12 @@ public class CommentController extends BaseController {
map.put("pageUrl", pageUrl.toString());
map.put("pageName", post.getPostTitle());
map.put("commentContent", comment.getCommentContent());
map.put("blogUrl", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
map.put("blogTitle", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
map.put("blogUrl", OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
map.put("blogTitle", OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
map.put("author", user.getUserDisplayName());
mailService.sendTemplateMail(
comment.getCommentAuthorEmail(),
"您在" + HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "的评论已审核通过!", map, "common/mail_template/mail_passed.ftl");
"您在" + OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "的评论已审核通过!", map, "common/mail_template/mail_passed.ftl");
}
} catch (Exception e) {
log.error("Mail server not configured: {}", e.getMessage());

View File

@ -33,8 +33,6 @@ public class MenuController {
/**
*
*
* @param model model
*
* @return /admin/admin_menu
*/
@GetMapping
@ -46,7 +44,6 @@ public class MenuController {
* /
*
* @param menu menu
*
* @return /admin/menus
*/
@PostMapping(value = "/save")
@ -70,7 +67,6 @@ public class MenuController {
*
* @param menuId
* @param model model
*
* @return /admin/admin_menu
*/
@GetMapping(value = "/edit")
@ -84,7 +80,6 @@ public class MenuController {
*
*
* @param menuId
*
* @return /admin/menus
*/
@GetMapping(value = "/remove")

View File

@ -1,6 +1,5 @@
package cc.ryanc.halo.web.controller.admin;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.enums.ResultCodeEnum;
import cc.ryanc.halo.service.OptionsService;
@ -15,6 +14,8 @@ import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import javax.servlet.http.HttpSession;
import java.util.Map;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -61,8 +62,8 @@ public class OptionController {
optionsService.saveOptions(options);
//刷新options
configuration.setSharedVariable("options", optionsService.findAllOptions());
HaloConst.OPTIONS.clear();
HaloConst.OPTIONS = optionsService.findAllOptions();
OPTIONS.clear();
OPTIONS = optionsService.findAllOptions();
session.removeAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);
log.info("List of saved options: " + options);
return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.common.save-success"));

View File

@ -4,7 +4,6 @@ import cc.ryanc.halo.model.domain.Gallery;
import cc.ryanc.halo.model.domain.Link;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.domain.User;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.dto.LogsRecord;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
@ -27,6 +26,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
@ -42,6 +42,9 @@ import java.util.Date;
import java.util.List;
import java.util.Optional;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
/**
* <pre>
*
@ -77,7 +80,6 @@ public class PageController {
*
*
* @param model model
*
* @return admin/admin_page
*/
@GetMapping
@ -102,7 +104,6 @@ public class PageController {
*
* @param model model
* @param linkId linkId
*
* @return String admin/admin_page_link
*/
@GetMapping(value = "/links/edit")
@ -116,7 +117,6 @@ public class PageController {
* /
*
* @param link Link
*
* @return JsonResult
*/
@PostMapping(value = "/links/save")
@ -138,7 +138,6 @@ public class PageController {
*
*
* @param linkId
*
* @return /admin/page/links
*/
@GetMapping(value = "/links/remove")
@ -155,17 +154,11 @@ public class PageController {
*
*
* @param model model
* @param page
* @param size
*
* @return admin/admin_page_gallery
*/
@GetMapping(value = "/galleries")
public String gallery(Model model,
@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "size", defaultValue = "18") Integer size) {
final Sort sort = new Sort(Sort.Direction.DESC, "galleryId");
final Pageable pageable = PageRequest.of(page, size, sort);
@PageableDefault(size = 18, sort = "galleryId", direction = Sort.Direction.DESC) Pageable pageable) {
final Page<Gallery> galleries = galleryService.findAll(pageable);
model.addAttribute("galleries", galleries);
return "admin/admin_page_gallery";
@ -175,7 +168,6 @@ public class PageController {
*
*
* @param gallery gallery
*
* @return /admin/page/gallery
*/
@PostMapping(value = "/gallery/save")
@ -196,7 +188,6 @@ public class PageController {
*
* @param model model
* @param galleryId
*
* @return admin/widget/_gallery-detail
*/
@GetMapping(value = "/gallery")
@ -210,7 +201,6 @@ public class PageController {
*
*
* @param galleryId
*
* @return JsonResult
*/
@GetMapping(value = "/gallery/remove")
@ -229,12 +219,11 @@ public class PageController {
*
*
* @param model model
*
* @return admin/admin_page_md_editor
*/
@GetMapping(value = "/new")
public String newPage(Model model) {
final List<String> customTpls = HaloUtils.getCustomTpl(HaloConst.OPTIONS.get(BlogPropertiesEnum.THEME.getProp()));
final List<String> customTpls = HaloUtils.getCustomTpl(OPTIONS.get(BlogPropertiesEnum.THEME.getProp()));
model.addAttribute("customTpls", customTpls);
return "admin/admin_page_md_editor";
}
@ -251,7 +240,7 @@ public class PageController {
String msg = localeMessageUtil.getMessage("code.admin.common.save-success");
try {
//发表用户
final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
final User user = (User) session.getAttribute(USER_SESSION_KEY);
post.setUser(user);
post.setPostType(PostTypeEnum.POST_TYPE_PAGE.getDesc());
if (null != post.getPostId()) {
@ -261,14 +250,11 @@ public class PageController {
}
post.setPostViews(oldPost.getPostViews());
msg = localeMessageUtil.getMessage("code.admin.common.update-success");
} else {
post.setPostDate(DateUtil.date());
}
post.setPostUpdate(DateUtil.date());
post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd()));
//当没有选择文章缩略图的时候,自动分配一张内置的缩略图
if (StrUtil.equals(post.getPostThumbnail(), BlogPropertiesEnum.DEFAULT_THUMBNAIL.getProp())) {
post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 10) + ".jpg");
post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 11) + ".jpg");
}
postService.save(post);
logsService.save(LogsRecord.PUSH_PAGE, post.getPostTitle(), request);
@ -284,13 +270,12 @@ public class PageController {
*
* @param pageId
* @param model model
*
* @return admin/admin_page_md_editor
*/
@GetMapping(value = "/edit")
public String editPage(@RequestParam("pageId") Long pageId, Model model) {
final Optional<Post> post = postService.findByPostId(pageId);
final List<String> customTpls = HaloUtils.getCustomTpl(HaloConst.OPTIONS.get(BlogPropertiesEnum.THEME.getProp()));
final List<String> customTpls = HaloUtils.getCustomTpl(OPTIONS.get(BlogPropertiesEnum.THEME.getProp()));
model.addAttribute("post", post.orElse(new Post()));
model.addAttribute("customTpls", customTpls);
return "admin/admin_page_md_editor";
@ -300,7 +285,6 @@ public class PageController {
*
*
* @param postUrl postUrl
*
* @return JsonResult
*/
@GetMapping(value = "/checkUrl")

View File

@ -2,7 +2,6 @@ package cc.ryanc.halo.web.controller.admin;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.domain.User;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.dto.LogsRecord;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
@ -15,7 +14,6 @@ import cc.ryanc.halo.utils.HaloUtils;
import cc.ryanc.halo.utils.LocaleMessageUtil;
import cc.ryanc.halo.utils.MarkdownUtils;
import cc.ryanc.halo.web.controller.core.BaseController;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
@ -23,9 +21,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.ServletRequestDataBinder;
@ -38,6 +35,10 @@ import java.util.Date;
import java.util.List;
import java.util.Optional;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
import static org.springframework.data.domain.Sort.Direction.DESC;
/**
* <pre>
*
@ -67,6 +68,7 @@ public class PostController extends BaseController {
* htmlhtm-
*
* @param url url
*
* @return String
*/
private static String urlFilter(String url) {
@ -83,17 +85,12 @@ public class PostController extends BaseController {
*
*
* @param model model
* @param page
* @param size
* @return admin/admin_post
*/
@GetMapping
public String posts(Model model,
@RequestParam(value = "status", defaultValue = "0") Integer status,
@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "size", defaultValue = "10") Integer size) {
final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
final Pageable pageable = PageRequest.of(page, size, sort);
@PageableDefault(sort = "postDate", direction = DESC) Pageable pageable) {
final Page<Post> posts = postService.findPostByStatus(status, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
model.addAttribute("posts", posts);
model.addAttribute("publishCount", postService.getCountByStatus(PostStatusEnum.PUBLISHED.getCode()));
@ -108,20 +105,15 @@ public class PostController extends BaseController {
*
* @param model Model
* @param keyword keyword
* @param page page
* @param size size
* @return admin/admin_post
*/
@PostMapping(value = "/search")
public String searchPost(Model model,
@RequestParam(value = "keyword") String keyword,
@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "size", defaultValue = "10") Integer size) {
@PageableDefault(sort = "postId", direction = DESC) Pageable pageable) {
try {
//排序规则
final Sort sort = new Sort(Sort.Direction.DESC, "postId");
final Pageable pageable = PageRequest.of(page, size, sort);
model.addAttribute("posts", postService.searchPosts(keyword, PostTypeEnum.POST_TYPE_POST.getDesc(), PostStatusEnum.PUBLISHED.getCode(), pageable));
Page<Post> posts = postService.searchPostsBy(keyword, PostTypeEnum.POST_TYPE_POST.getDesc(), PostStatusEnum.PUBLISHED.getCode(), pageable);
model.addAttribute("posts", posts);
} catch (Exception e) {
log.error("未知错误:{}", e.getMessage());
}
@ -133,6 +125,7 @@ public class PostController extends BaseController {
*
* @param postId
* @param model model
*
* @return /themes/{theme}/post
*/
@GetMapping(value = "/view")
@ -157,6 +150,7 @@ public class PostController extends BaseController {
*
* @param postId
* @param model model
*
* @return admin/admin_editor
*/
@GetMapping(value = "/edit")
@ -180,10 +174,9 @@ public class PostController extends BaseController {
@RequestParam("cateList") List<String> cateList,
@RequestParam("tagList") String tagList,
HttpSession session) {
final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
final User user = (User) session.getAttribute(USER_SESSION_KEY);
try {
post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd()));
post.setPostDate(DateUtil.date());
post.setUser(user);
post = postService.buildCategoriesAndTags(post, cateList, tagList);
post.setPostUrl(urlFilter(post.getPostUrl()));
@ -192,7 +185,7 @@ public class PostController extends BaseController {
}
//当没有选择文章缩略图的时候,自动分配一张内置的缩略图
if (StrUtil.equals(post.getPostThumbnail(), BlogPropertiesEnum.DEFAULT_THUMBNAIL.getProp())) {
post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 10) + ".jpg");
post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 11) + ".jpg");
}
postService.save(post);
logsService.save(LogsRecord.PUSH_POST, post.getPostTitle(), request);
@ -210,7 +203,6 @@ public class PostController extends BaseController {
* @param post post
* @param cateList
* @param tagList
* @param session session
* @return JsonResult
*/
@PostMapping(value = "/update")
@ -232,7 +224,7 @@ public class PostController extends BaseController {
}
//当没有选择文章缩略图的时候,自动分配一张内置的缩略图
if (StrUtil.equals(post.getPostThumbnail(), BlogPropertiesEnum.DEFAULT_THUMBNAIL.getProp())) {
post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 10) + ".jpg");
post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 11) + ".jpg");
}
post = postService.save(post);
if (null != post) {
@ -246,6 +238,7 @@ public class PostController extends BaseController {
*
*
* @param postId
*
* @return /admin/posts
*/
@GetMapping(value = "/throw")
@ -263,6 +256,7 @@ public class PostController extends BaseController {
*
*
* @param postId
*
* @return /admin/posts
*/
@GetMapping(value = "/revert")
@ -281,6 +275,7 @@ public class PostController extends BaseController {
*
*
* @param postId
*
* @return /admin/posts
*/
@GetMapping(value = "/remove")
@ -302,6 +297,7 @@ public class PostController extends BaseController {
*
*
* @param postSummary
*
* @return JsonResult
*/
@GetMapping(value = "/updateSummary")
@ -321,6 +317,7 @@ public class PostController extends BaseController {
*
*
* @param postUrl
*
* @return JsonResult
*/
@GetMapping(value = "/checkUrl")
@ -338,6 +335,7 @@ public class PostController extends BaseController {
*
*
* @param baiduToken baiduToken
*
* @return JsonResult
*/
@GetMapping(value = "/pushAllToBaidu")
@ -346,7 +344,7 @@ public class PostController extends BaseController {
if (StrUtil.isBlank(baiduToken)) {
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.post.no-baidu-token"));
}
final String blogUrl = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp());
final String blogUrl = OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp());
final List<Post> posts = postService.findAll(PostTypeEnum.POST_TYPE_POST.getDesc());
final StringBuilder urls = new StringBuilder();
for (Post post : posts) {

View File

@ -1,6 +1,5 @@
package cc.ryanc.halo.web.controller.admin;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.dto.LogsRecord;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
@ -33,6 +32,9 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
import static cc.ryanc.halo.model.dto.HaloConst.THEMES;
/**
* <pre>
*
@ -70,8 +72,8 @@ public class ThemeController extends BaseController {
@GetMapping
public String themes(Model model) {
model.addAttribute("activeTheme", BaseController.THEME);
if (null != HaloConst.THEMES) {
model.addAttribute("themes", HaloConst.THEMES);
if (null != THEMES) {
model.addAttribute("themes", THEMES);
}
return "admin/admin_theme";
}
@ -94,10 +96,10 @@ public class ThemeController extends BaseController {
optionsService.saveOption(BlogPropertiesEnum.THEME.getProp(), siteTheme);
//设置主题
BaseController.THEME = siteTheme;
HaloConst.OPTIONS.clear();
HaloConst.OPTIONS = optionsService.findAllOptions();
OPTIONS.clear();
OPTIONS = optionsService.findAllOptions();
configuration.setSharedVariable("themeName", siteTheme);
configuration.setSharedVariable("options", HaloConst.OPTIONS);
configuration.setSharedVariable("options", OPTIONS);
log.info("Changed theme to {}", siteTheme);
logsService.save(LogsRecord.CHANGE_THEME, "更换为" + siteTheme, request);
return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.theme.change-success", new Object[]{siteTheme}));
@ -128,8 +130,8 @@ public class ThemeController extends BaseController {
logsService.save(LogsRecord.UPLOAD_THEME, file.getOriginalFilename(), request);
ZipUtil.unzip(themePath, new File(basePath.getAbsolutePath(), "templates/themes/"));
FileUtil.del(themePath);
HaloConst.THEMES.clear();
HaloConst.THEMES = HaloUtils.getThemes();
THEMES.clear();
THEMES = HaloUtils.getThemes();
} else {
log.error("Upload theme failed, no file selected");
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.upload-no-file"));
@ -154,8 +156,8 @@ public class ThemeController extends BaseController {
final File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
final File themePath = new File(basePath.getAbsolutePath(), "templates/themes/" + themeName);
FileUtil.del(themePath);
HaloConst.THEMES.clear();
HaloConst.THEMES = HaloUtils.getThemes();
THEMES.clear();
THEMES = HaloUtils.getThemes();
} catch (Exception e) {
log.error("Delete theme failed: {}", e.getMessage());
}
@ -194,8 +196,8 @@ public class ThemeController extends BaseController {
if (NOT_FOUND_GIT.equals(cmdResult)) {
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.no-git"));
}
HaloConst.THEMES.clear();
HaloConst.THEMES = HaloUtils.getThemes();
THEMES.clear();
THEMES = HaloUtils.getThemes();
} catch (FileNotFoundException e) {
log.error("Cloning theme failed: {}", e.getMessage());
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.clone-theme-failed") + e.getMessage());
@ -220,8 +222,8 @@ public class ThemeController extends BaseController {
if (NOT_FOUND_GIT.equals(cmdResult)) {
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.no-git"));
}
HaloConst.THEMES.clear();
HaloConst.THEMES = HaloUtils.getThemes();
THEMES.clear();
THEMES = HaloUtils.getThemes();
} catch (Exception e) {
log.error("Update theme failed: {}", e.getMessage());
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.update-theme-failed") + e.getMessage());

View File

@ -1,7 +1,6 @@
package cc.ryanc.halo.web.controller.admin;
import cc.ryanc.halo.model.domain.User;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.enums.ResultCodeEnum;
import cc.ryanc.halo.service.UserService;
@ -18,6 +17,8 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
/**
* <pre>
*
@ -55,6 +56,7 @@ public class UserController {
*
* @param user user
* @param session session
*
* @return JsonResult
*/
@PostMapping(value = "save")
@ -68,7 +70,7 @@ public class UserController {
}
userService.save(user);
configuration.setSharedVariable("user", userService.findUser());
session.removeAttribute(HaloConst.USER_SESSION_KEY);
session.removeAttribute(USER_SESSION_KEY);
} catch (Exception e) {
log.error("Failed to modify user profile: {}", e.getMessage());
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.edit-failed"));
@ -83,6 +85,7 @@ public class UserController {
* @param newPass
* @param userId
* @param session session
*
* @return JsonResult
*/
@PostMapping(value = "changePass")
@ -96,7 +99,7 @@ public class UserController {
if (null != user) {
user.setUserPass(SecureUtil.md5(newPass));
userService.save(user);
session.removeAttribute(HaloConst.USER_SESSION_KEY);
session.removeAttribute(USER_SESSION_KEY);
} else {
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.user.old-password-error"));
}

View File

@ -1,10 +1,29 @@
package cc.ryanc.halo.web.controller.api;
import cc.ryanc.halo.model.domain.Comment;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.ResponseStatusEnum;
import cc.ryanc.halo.model.enums.TrueFalseEnum;
import cc.ryanc.halo.service.CommentService;
import cc.ryanc.halo.service.PostService;
import cc.ryanc.halo.utils.OwoUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.http.HtmlUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
@ -21,4 +40,66 @@ public class ApiCommentController {
@Autowired
private CommentService commentService;
@Autowired
private PostService postService;
/**
*
*
* @param comment comment
* @param result result
* @param postId postId
* @param request request
*
* @return JsonResult
*/
@PostMapping(value = "/save")
@ResponseBody
public JsonResult save(@Valid Comment comment,
BindingResult result,
@RequestParam(value = "postId") Long postId,
HttpServletRequest request) {
if (result.hasErrors()) {
for (ObjectError error : result.getAllErrors()) {
return new JsonResult(ResponseStatusEnum.ERROR.getCode(), error.getDefaultMessage());
}
}
try {
Comment lastComment = null;
final Post post = postService.findByPostId(postId).orElse(new Post());
comment.setCommentAuthorEmail(HtmlUtil.escape(comment.getCommentAuthorEmail()).toLowerCase());
comment.setPost(post);
comment.setCommentAuthorIp(ServletUtil.getClientIP(request));
comment.setIsAdmin(0);
comment.setCommentAuthor(HtmlUtil.escape(comment.getCommentAuthor()));
if (StrUtil.isNotBlank(comment.getCommentAuthorEmail())) {
comment.setCommentAuthorAvatarMd5(SecureUtil.md5(comment.getCommentAuthorEmail()));
}
if (comment.getCommentParent() > 0) {
lastComment = commentService.findCommentById(comment.getCommentParent()).orElse(new Comment());
final StrBuilder buildContent = new StrBuilder("<a href='#comment-id-");
buildContent.append(lastComment.getCommentId());
buildContent.append("'>@");
buildContent.append(lastComment.getCommentAuthor());
buildContent.append("</a> ");
buildContent.append(OwoUtil.markToImg(HtmlUtil.escape(comment.getCommentContent()).replace("&lt;br/&gt;", "<br/>")));
comment.setCommentContent(buildContent.toString());
} else {
//将评论内容的字符专为安全字符
comment.setCommentContent(OwoUtil.markToImg(HtmlUtil.escape(comment.getCommentContent()).replace("&lt;br/&gt;", "<br/>")));
}
if (StrUtil.isNotEmpty(comment.getCommentAuthorUrl())) {
comment.setCommentAuthorUrl(URLUtil.normalize(comment.getCommentAuthorUrl()));
}
commentService.save(comment);
if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
return new JsonResult(ResponseStatusEnum.SUCCESS.getCode(), "你的评论已经提交,待博主审核之后可显示。");
} else {
return new JsonResult(ResponseStatusEnum.SUCCESS.getCode(), "你的评论已经提交,刷新后即可显示。");
}
} catch (Exception e) {
return new JsonResult(ResponseStatusEnum.ERROR.getCode(), "评论失败!");
}
}
}

View File

@ -3,7 +3,6 @@ package cc.ryanc.halo.web.controller.api;
import cc.ryanc.halo.model.domain.Category;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.domain.User;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.service.CategoryService;
import cc.ryanc.halo.service.PostService;
@ -26,6 +25,8 @@ import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* @author : RYAN0UP
* @date : 2018/12/11
@ -47,6 +48,7 @@ public class ApiMetaWeBlog {
/**
* @param request request
*
* @return String
*/
@PostMapping
@ -124,7 +126,9 @@ public class ApiMetaWeBlog {
/**
* @param methodCall
*
* @return
*
* @throws Exception
*/
private Post parsetPost(final JSONObject methodCall) throws Exception {
@ -136,20 +140,20 @@ public class ApiMetaWeBlog {
for (int i = 0; i < members.length(); i++) {
final JSONObject member = members.getJSONObject(i);
final String name = member.getString("name");
if("dateCreated".equals(name)){
if ("dateCreated".equals(name)) {
final String dateString = member.getJSONObject("value").getString("dateTime.iso8601");
Date date = DateUtil.parseDate(dateString);
ret.setPostDate(date);
}else if ("title".equals(name)){
} else if ("title".equals(name)) {
ret.setPostTitle(member.getJSONObject("value").getString("string"));
}else if("description".equals(name)){
} else if ("description".equals(name)) {
final String content = member.getJSONObject("value").optString("string");
ret.setPostContent(content);
ret.setPostContentMd(content);
}else if("categories".equals(name)){
} else if ("categories".equals(name)) {
final StrBuilder cateBuilder = new StrBuilder();
final JSONObject data = member.getJSONObject("value").getJSONObject("array").getJSONObject("data");
if(0==data.length()){
if (0 == data.length()) {
throw new Exception("At least one category");
}
}
@ -161,6 +165,7 @@ public class ApiMetaWeBlog {
*
*
* @param postId
*
* @return xml
*/
private String getPost(Long postId) {
@ -175,6 +180,7 @@ public class ApiMetaWeBlog {
*
*
* @param postId
*
* @return xml
*/
private String buildPost(final Long postId) {
@ -224,13 +230,13 @@ public class ApiMetaWeBlog {
* @return xml
*/
private String buildBlogInfo() {
final String blogId = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp());
final String blogTitle = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp());
final String blogId = OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp());
final String blogTitle = OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp());
final StrBuilder strBuilder = new StrBuilder("<member><name>blogid</name><value>");
strBuilder.append(blogId);
strBuilder.append("</value></member>");
strBuilder.append("<member><name>url</name><value>");
strBuilder.append(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
strBuilder.append(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
strBuilder.append("</value></member>");
strBuilder.append("<member><name>blogName</name><value>");
strBuilder.append(blogTitle);
@ -242,6 +248,7 @@ public class ApiMetaWeBlog {
*
*
* @return xml
*
* @throws Exception Exception
*/
private String getCategories() throws Exception {
@ -258,6 +265,7 @@ public class ApiMetaWeBlog {
*
*
* @return xml
*
* @throws Exception Exception
*/
private String buildCategories() throws Exception {
@ -271,7 +279,7 @@ public class ApiMetaWeBlog {
strBuilder.append("<member><name>description</name>").append("<value>").append(cateName).append("</value></member>");
strBuilder.append("<member><name>title</name>").append("<value>").append(cateName).append("</value></member>");
strBuilder.append("<member><name>categoryid</name>").append("<value>").append(cateId).append("</value></member>");
strBuilder.append("<member><name>htmlUrl</name>").append("<value>").append(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp())).append("/categories/").append(cateName).append("</value></member>");
strBuilder.append("<member><name>htmlUrl</name>").append("<value>").append(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp())).append("/categories/").append(cateName).append("</value></member>");
strBuilder.append("</struct></value>");
}
return strBuilder.toString();

View File

@ -85,8 +85,8 @@ public class ApiOptionController {
*
* @return JsonResult
*/
@GetMapping(value = "/{optionName}")
public JsonResult option(@PathVariable(value = "optionName") String optionName) {
@GetMapping(value = "/one")
public JsonResult option(@RequestParam(value = "optionName") String optionName) {
final String optionValue = optionsService.findOneOption(optionName);
return new JsonResult(ResponseStatusEnum.SUCCESS.getCode(), ResponseStatusEnum.SUCCESS.getMsg(), optionValue);
}

View File

@ -1,7 +1,6 @@
package cc.ryanc.halo.web.controller.api;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.PostStatusEnum;
@ -14,8 +13,12 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault;
import org.springframework.web.bind.annotation.*;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
import static org.springframework.data.domain.Sort.Direction.DESC;
/**
* <pre>
* API
@ -95,15 +98,13 @@ public class ApiPostController {
* </p>
*
* @param page
*
* @return JsonResult
*/
@GetMapping(value = "/page/{page}")
public JsonResult posts(@PathVariable(value = "page") Integer page) {
final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
public JsonResult posts(@PathVariable(value = "page") Integer page, @SortDefault(sort = "postDate", direction = DESC) Sort sort) {
int size = 10;
if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
}
final Pageable pageable = PageRequest.of(page - 1, size, sort);
final Page<Post> posts = postService.findPostByStatus(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
@ -147,7 +148,6 @@ public class ApiPostController {
* </p>
*
* @param postId
*
* @return JsonResult
*/
@GetMapping(value = "/{postId}")

View File

@ -41,7 +41,6 @@ public class CommonController implements ErrorController {
/**
* 404
*
* @param model model
* @return String
*/
@GetMapping(value = "/404")
@ -52,7 +51,6 @@ public class CommonController implements ErrorController {
/**
* 500
*
* @param model model
* @return String
*/
@GetMapping(value = "/500")

View File

@ -1,13 +1,13 @@
package cc.ryanc.halo.web.controller.core;
import cc.ryanc.halo.model.domain.*;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.dto.LogsRecord;
import cc.ryanc.halo.model.enums.*;
import cc.ryanc.halo.service.*;
import cc.ryanc.halo.utils.MarkdownUtils;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import freemarker.template.Configuration;
@ -23,6 +23,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cc.ryanc.halo.model.dto.HaloConst.*;
/**
* <pre>
*
@ -70,7 +72,7 @@ public class InstallController {
@GetMapping
public String install(Model model) {
try {
if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), HaloConst.OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
model.addAttribute("isInstall", true);
} else {
model.addAttribute("isInstall", false);
@ -85,8 +87,6 @@ public class InstallController {
*
*
* @param blogLocale
* @param siteTitle
* @param siteUrl
* @param userName
* @param userDisplayName
* @param userEmail
@ -106,7 +106,7 @@ public class InstallController {
@RequestParam("userPwd") String userPwd,
HttpServletRequest request) {
try {
if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), HaloConst.OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
return new JsonResult(ResultCodeEnum.FAIL.getCode(), "该博客已初始化,不能再次安装!");
}
//创建新的用户
@ -137,11 +137,11 @@ public class InstallController {
post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd()));
post.setPostSummary("欢迎使用Halo进行创作删除这篇文章后赶紧开始吧。");
post.setPostStatus(0);
post.setPostDate(DateUtil.date());
post.setPostUrl("hello-halo");
post.setUser(user);
post.setCategories(categories);
post.setAllowComment(AllowCommentEnum.ALLOW.getCode());
post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 11) + ".jpg");
postService.save(post);
//第一个评论
@ -152,7 +152,6 @@ public class InstallController {
comment.setCommentAuthorUrl("https://ryanc.cc");
comment.setCommentAuthorIp("127.0.0.1");
comment.setCommentAuthorAvatarMd5(SecureUtil.md5("i@ryanc.cc"));
comment.setCommentDate(DateUtil.date());
comment.setCommentContent("欢迎,欢迎!");
comment.setCommentStatus(0);
comment.setCommentAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36");
@ -190,9 +189,9 @@ public class InstallController {
menuArchive.setMenuIcon(" ");
menuService.save(menuArchive);
HaloConst.OPTIONS.clear();
HaloConst.OPTIONS = optionsService.findAllOptions();
configuration.setSharedVariable("options", HaloConst.OPTIONS);
OPTIONS.clear();
OPTIONS = optionsService.findAllOptions();
configuration.setSharedVariable("options", OPTIONS);
configuration.setSharedVariable("user", userService.findUser());
} catch (Exception e) {
log.error(e.getMessage());

View File

@ -3,7 +3,6 @@ package cc.ryanc.halo.web.controller.front;
import cc.ryanc.halo.model.domain.Comment;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.domain.Tag;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.ListPage;
import cc.ryanc.halo.model.enums.*;
import cc.ryanc.halo.service.CommentService;
@ -22,6 +21,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@ -33,6 +33,9 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static org.springframework.data.domain.Sort.Direction.DESC;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -58,11 +61,12 @@ public class FrontArchiveController extends BaseController {
*
*
* @param model model
*
* @return
*/
@GetMapping
public String archives(Model model) {
return this.archives(model, 1);
return this.archives(model, 1, Sort.by(DESC, "postDate"));
}
/**
@ -70,14 +74,14 @@ public class FrontArchiveController extends BaseController {
*
* @param model model
* @param page page
*
* @return /themes/{theme}/archives
*/
@GetMapping(value = "page/{page}")
public String archives(Model model,
@PathVariable(value = "page") Integer page) {
@PathVariable(value = "page") Integer page,
@SortDefault(sort = "postDate", direction = DESC) Sort sort) {
//所有文章数据分页material主题适用
final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
final Pageable pageable = PageRequest.of(page - 1, 5, sort);
final Page<Post> posts = postService.findPostByStatus(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
if (null == posts) {
@ -94,6 +98,7 @@ public class FrontArchiveController extends BaseController {
* @param model model
* @param year year
* @param month month
*
* @return /themes/{theme}/archives
*/
@GetMapping(value = "{year}/{month}")
@ -114,6 +119,7 @@ public class FrontArchiveController extends BaseController {
*
* @param postUrl
* @param model model
*
* @return /themes/{theme}/post
*/
@GetMapping(value = "{postUrl}")
@ -140,7 +146,7 @@ public class FrontArchiveController extends BaseController {
model.addAttribute("nextPost", nextPost);
}
List<Comment> comments = null;
if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
comments = commentService.findCommentsByPostAndCommentStatus(post, CommentStatusEnum.PUBLISHED.getCode());
} else {
comments = commentService.findCommentsByPostAndCommentStatusNot(post, CommentStatusEnum.RECYCLE.getCode());
@ -156,8 +162,8 @@ public class FrontArchiveController extends BaseController {
//默认显示10条
int size = 10;
//获取每页评论条数
if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()))) {
size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()));
if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()))) {
size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()));
}
//评论分页
final ListPage<Comment> commentsPage = new ListPage<Comment>(CommentUtil.getComments(comments), cp, size);
@ -187,6 +193,7 @@ public class FrontArchiveController extends BaseController {
* @param postId postId
* @param postPassword postPassword
* @param response response
*
* @return String
*/
@PostMapping(value = "/verifyPostPassword")

View File

@ -2,7 +2,6 @@ package cc.ryanc.halo.web.controller.front;
import cc.ryanc.halo.model.domain.Category;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.service.CategoryService;
import cc.ryanc.halo.service.PostService;
@ -14,6 +13,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@ -22,6 +22,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
import static org.springframework.data.domain.Sort.Direction.DESC;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -44,7 +47,6 @@ public class FrontCategoryController extends BaseController {
*
*
* @param model model
*
* @return String
*/
@GetMapping
@ -59,13 +61,12 @@ public class FrontCategoryController extends BaseController {
*
* @param model model
* @param cateUrl cateUrl
*
* @return string
*/
@GetMapping(value = "{cateUrl}")
public String categories(Model model,
@PathVariable("cateUrl") String cateUrl) {
return this.categories(model, cateUrl, 1);
return this.categories(model, cateUrl, 1, Sort.by(DESC, "postDate"));
}
/**
@ -74,21 +75,20 @@ public class FrontCategoryController extends BaseController {
* @param model model
* @param cateUrl
* @param page
*
* @return String
*/
@GetMapping("{cateUrl}/page/{page}")
public String categories(Model model,
@PathVariable("cateUrl") String cateUrl,
@PathVariable("page") Integer page) {
@PathVariable("page") Integer page,
@SortDefault(sort = "postDate", direction = DESC) Sort sort) {
final Category category = categoryService.findByCateUrl(cateUrl);
if (null == category) {
return this.renderNotFound();
}
final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
int size = 10;
if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
}
final Pageable pageable = PageRequest.of(page - 1, size, sort);
final Page<Post> posts = postService.findPostByCategories(category, pageable);

View File

@ -2,16 +2,16 @@ package cc.ryanc.halo.web.controller.front;
import cc.ryanc.halo.model.domain.Comment;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.enums.*;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.PostTypeEnum;
import cc.ryanc.halo.model.enums.ResultCodeEnum;
import cc.ryanc.halo.model.enums.TrueFalseEnum;
import cc.ryanc.halo.service.CommentService;
import cc.ryanc.halo.service.MailService;
import cc.ryanc.halo.service.PostService;
import cc.ryanc.halo.service.UserService;
import cc.ryanc.halo.utils.CommentUtil;
import cc.ryanc.halo.utils.OwoUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
@ -21,21 +21,19 @@ import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.http.HtmlUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
@ -86,7 +84,6 @@ public class FrontCommentController {
post = postService.findByPostId(post.getPostId()).orElse(new Post());
comment.setCommentAuthorEmail(HtmlUtil.escape(comment.getCommentAuthorEmail()).toLowerCase());
comment.setPost(post);
comment.setCommentDate(DateUtil.date());
comment.setCommentAuthorIp(ServletUtil.getClientIP(request));
comment.setIsAdmin(0);
comment.setCommentAuthor(HtmlUtil.escape(comment.getCommentAuthor()));
@ -116,7 +113,7 @@ public class FrontCommentController {
} else {
new EmailToAdmin(comment, post).start();
}
if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "你的评论已经提交,待博主审核之后可显示。");
} else {
return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "你的评论已经提交,刷新后即可显示。");
@ -140,11 +137,11 @@ public class FrontCommentController {
@Override
public void run() {
if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
try {
//发送邮件到博主
final Map<String, Object> map = new HashMap<>(5);
final StrBuilder pageUrl = new StrBuilder(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
final StrBuilder pageUrl = new StrBuilder(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
if (StrUtil.equals(post.getPostType(), PostTypeEnum.POST_TYPE_POST.getDesc())) {
pageUrl.append("/archives/");
} else {
@ -183,10 +180,10 @@ public class FrontCommentController {
@Override
public void run() {
//发送通知给对方
if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
if (Validator.isEmail(lastComment.getCommentAuthorEmail())) {
final Map<String, Object> map = new HashMap<>(8);
final StrBuilder pageUrl = new StrBuilder(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
final StrBuilder pageUrl = new StrBuilder(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
if (StrUtil.equals(post.getPostType(), PostTypeEnum.POST_TYPE_POST.getDesc())) {
pageUrl.append("/archives/");
@ -197,15 +194,15 @@ public class FrontCommentController {
pageUrl.append("#comment-id-");
pageUrl.append(comment.getCommentId());
map.put("pageUrl", pageUrl.toString());
map.put("blogTitle", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
map.put("blogTitle", OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
map.put("commentAuthor", lastComment.getCommentAuthor());
map.put("pageName", lastComment.getPost().getPostTitle());
map.put("commentContent", lastComment.getCommentContent());
map.put("replyAuthor", comment.getCommentAuthor());
map.put("replyContent", comment.getCommentContent());
map.put("blogUrl", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
map.put("blogUrl", OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
mailService.sendTemplateMail(
lastComment.getCommentAuthorEmail(), "您在" + HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()) + "的评论有了新回复", map, "common/mail_template/mail_reply.ftl");
lastComment.getCommentAuthorEmail(), "您在" + OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()) + "的评论有了新回复", map, "common/mail_template/mail_reply.ftl");
}
}
}

View File

@ -1,7 +1,6 @@
package cc.ryanc.halo.web.controller.front;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.service.PostService;
import cc.ryanc.halo.web.controller.core.BaseController;
@ -13,12 +12,16 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import static org.springframework.data.domain.Sort.Direction.DESC;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -40,11 +43,12 @@ public class FrontIndexController extends BaseController {
*
*
* @param model model
*
* @return
*/
@GetMapping
public String index(Model model) {
return this.index(model, 1);
return this.index(model, 1, Sort.by(DESC, "postDate"));
}
/**
@ -52,17 +56,16 @@ public class FrontIndexController extends BaseController {
*
* @param model model
* @param page
* @param size
* @return /themes/{theme}/index
*/
@GetMapping(value = "page/{page}")
public String index(Model model,
@PathVariable(value = "page") Integer page) {
final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
@PathVariable(value = "page") Integer page,
@SortDefault(sort = "postDate", direction = DESC) Sort sort) {
//默认显示10条
int size = 10;
if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
}
//所有文章数据,分页
final Pageable pageable = PageRequest.of(page - 1, size, sort);

View File

@ -1,22 +1,29 @@
package cc.ryanc.halo.web.controller.front;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.PostTypeEnum;
import cc.ryanc.halo.service.PostService;
import cn.hutool.core.util.StrUtil;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import java.io.IOException;
import java.util.List;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
* sitemaprss
@ -31,49 +38,102 @@ public class FrontOthersController {
@Autowired
private PostService postService;
@Autowired
private FreeMarkerConfigurer freeMarker;
/**
* rss
*
* @return rss
* @param model model
*
* @return String
*
* @throws IOException IOException
* @throws TemplateException TemplateException
*/
@GetMapping(value = {"feed", "feed.xml", "atom", "atom.xml"}, produces = "application/xml;charset=UTF-8")
@ResponseBody
public String feed() {
String rssPosts = HaloConst.OPTIONS.get(BlogPropertiesEnum.RSS_POSTS.getProp());
public String feed(Model model) throws IOException, TemplateException {
String rssPosts = OPTIONS.get(BlogPropertiesEnum.RSS_POSTS.getProp());
if (StrUtil.isBlank(rssPosts)) {
rssPosts = "20";
}
//获取文章列表并根据时间排序
final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
final Pageable pageable = PageRequest.of(0, Integer.parseInt(rssPosts), sort);
final Page<Post> postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
final List<Post> posts = postsPage.getContent();
for (Post post : posts) {
if(StrUtil.isNotEmpty(post.getPostPassword())){
final Page<Post> postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable).map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostContent("该文章为加密文章");
post.setPostSummary("该文章为加密文章");
}
}
return postService.buildRss(posts);
return post;
});
final List<Post> posts = postsPage.getContent();
model.addAttribute("posts", posts);
final Template template = freeMarker.getConfiguration().getTemplate("common/web/rss.ftl");
return FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
}
/**
* sitemap
* XML
*
* @return sitemap
* @param model model
*
* @return String
*
* @throws IOException IOException
* @throws TemplateException TemplateException
*/
@GetMapping(value = {"sitemap", "sitemap.xml"}, produces = "application/xml;charset=UTF-8")
@ResponseBody
public String siteMap() {
//获取文章列表并根据时间排序
final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
final Pageable pageable = PageRequest.of(0, 999, sort);
final Page<Post> postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
final List<Post> posts = postsPage.getContent();
for (Post post : posts) {
if(StrUtil.isNotEmpty(post.getPostPassword())){
public String sitemapXml(Model model) throws IOException, TemplateException {
final Page<Post> postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), null).map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostContent("该文章为加密文章");
post.setPostSummary("该文章为加密文章");
}
}
return postService.buildSiteMap(posts);
return post;
});
final List<Post> posts = postsPage.getContent();
model.addAttribute("posts", posts);
final Template template = freeMarker.getConfiguration().getTemplate("common/web/sitemap_xml.ftl");
return FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
}
/**
* HTML
*
* @param model model
*
* @return String
*/
@GetMapping(value = "sitemap.html", produces = {"text/html"})
public String sitemapHtml(Model model) {
final Page<Post> postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), null).map(post -> {
if (StrUtil.isNotEmpty(post.getPostPassword())) {
post.setPostContent("该文章为加密文章");
post.setPostSummary("该文章为加密文章");
}
return post;
});
final List<Post> posts = postsPage.getContent();
model.addAttribute("posts", posts);
return "common/web/sitemap_html";
}
/**
* robots
*
* @param model model
*
* @return String
*
* @throws IOException IOException
* @throws TemplateException TemplateException
*/
@GetMapping(value = "robots.txt", produces = {"text/plain"})
@ResponseBody
public String robots(Model model) throws IOException, TemplateException {
final Template template = freeMarker.getConfiguration().getTemplate("common/web/robots.ftl");
return FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
}
}

View File

@ -3,7 +3,6 @@ package cc.ryanc.halo.web.controller.front;
import cc.ryanc.halo.model.domain.Comment;
import cc.ryanc.halo.model.domain.Gallery;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.dto.ListPage;
import cc.ryanc.halo.model.enums.*;
import cc.ryanc.halo.service.CommentService;
@ -22,6 +21,8 @@ import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -81,15 +82,15 @@ public class FrontPageController extends BaseController {
return this.renderNotFound();
}
List<Comment> comments = null;
if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
comments = commentService.findCommentsByPostAndCommentStatus(post, CommentStatusEnum.PUBLISHED.getCode());
} else {
comments = commentService.findCommentsByPostAndCommentStatusNot(post, CommentStatusEnum.RECYCLE.getCode());
}
//默认显示10条
int size = 10;
if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()))) {
size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()));
if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()))) {
size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()));
}
//评论分页
final ListPage<Comment> commentsPage = new ListPage<Comment>(CommentUtil.getComments(comments), cp, size);

View File

@ -1,7 +1,6 @@
package cc.ryanc.halo.web.controller.front;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.PostStatusEnum;
import cc.ryanc.halo.model.enums.PostTypeEnum;
@ -16,6 +15,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@ -23,6 +23,9 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import static org.springframework.data.domain.Sort.Direction.DESC;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -44,12 +47,13 @@ public class FrontSearchController extends BaseController {
*
* @param model model
* @param keyword
*
* @return /themes/{theme}/search
*/
@GetMapping
public String search(Model model,
@RequestParam(value = "keyword") String keyword) {
return this.search(model, HtmlUtil.escape(keyword), 1);
return this.search(model, HtmlUtil.escape(keyword), 1, Sort.by(DESC, "postDate"));
}
/**
@ -58,19 +62,20 @@ public class FrontSearchController extends BaseController {
* @param model model
* @param keyword
* @param page
*
* @return /themes/{theme}/search
*/
@GetMapping(value = "page/{page}")
public String search(Model model,
@RequestParam(value = "keyword") String keyword,
@PathVariable(value = "page") Integer page) {
final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
@PathVariable(value = "page") Integer page,
@SortDefault(sort = "postDate", direction = DESC) Sort sort) {
int size = 10;
if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
}
final Pageable pageable = PageRequest.of(page - 1, size, sort);
final Page<Post> posts = postService.searchPosts(HtmlUtil.escape(keyword),PostTypeEnum.POST_TYPE_POST.getDesc(),PostStatusEnum.PUBLISHED.getCode(),pageable);
final Page<Post> posts = postService.searchPostsBy(HtmlUtil.escape(keyword), PostTypeEnum.POST_TYPE_POST.getDesc(), PostStatusEnum.PUBLISHED.getCode(), pageable);
final int[] rainbow = PageUtil.rainbow(page, posts.getTotalPages(), 3);
model.addAttribute("is_search", true);
model.addAttribute("keyword", keyword);

View File

@ -2,7 +2,6 @@ package cc.ryanc.halo.web.controller.front;
import cc.ryanc.halo.model.domain.Post;
import cc.ryanc.halo.model.domain.Tag;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.service.PostService;
import cc.ryanc.halo.service.TagService;
@ -14,12 +13,16 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import static org.springframework.data.domain.Sort.Direction.DESC;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -53,13 +56,12 @@ public class FrontTagController extends BaseController {
*
* @param tagUrl
* @param model model
*
* @return String
*/
@GetMapping(value = "{tagUrl}")
public String tags(Model model,
@PathVariable("tagUrl") String tagUrl) {
return this.tags(model, tagUrl, 1);
return this.tags(model, tagUrl, 1, Sort.by(DESC, "postDate"));
}
/**
@ -68,21 +70,20 @@ public class FrontTagController extends BaseController {
* @param model model
* @param tagUrl
* @param page
*
* @return String
*/
@GetMapping(value = "{tagUrl}/page/{page}")
public String tags(Model model,
@PathVariable("tagUrl") String tagUrl,
@PathVariable("page") Integer page) {
@PathVariable("page") Integer page,
@SortDefault(sort = "postDate", direction = DESC) Sort sort) {
final Tag tag = tagService.findByTagUrl(tagUrl);
if (null == tag) {
return this.renderNotFound();
}
final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
int size = 10;
if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
}
final Pageable pageable = PageRequest.of(page - 1, size, sort);
final Page<Post> posts = postService.findPostsByTags(tag, pageable);

View File

@ -1,6 +1,5 @@
package cc.ryanc.halo.web.interceptor;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.TrueFalseEnum;
import cn.hutool.core.util.StrUtil;
@ -14,6 +13,8 @@ import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
* API
@ -29,8 +30,8 @@ public class ApiInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), HaloConst.OPTIONS.get(BlogPropertiesEnum.API_STATUS.getProp()))) {
if (StrUtil.equals(request.getHeader(TOKEN), HaloConst.OPTIONS.get(BlogPropertiesEnum.API_TOKEN.getProp()))) {
if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), OPTIONS.get(BlogPropertiesEnum.API_STATUS.getProp()))) {
if (StrUtil.equals(request.getHeader(TOKEN), OPTIONS.get(BlogPropertiesEnum.API_TOKEN.getProp()))) {
return true;
} else {
response.setCharacterEncoding("UTF-8");

View File

@ -1,6 +1,5 @@
package cc.ryanc.halo.web.interceptor;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.TrueFalseEnum;
import cn.hutool.core.util.StrUtil;
@ -11,6 +10,8 @@ import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* <pre>
*
@ -24,7 +25,7 @@ public class InstallInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), HaloConst.OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
return true;
}
response.sendRedirect("/install");

View File

@ -1,6 +1,5 @@
package cc.ryanc.halo.web.interceptor;
import cc.ryanc.halo.model.dto.HaloConst;
import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.model.enums.LocaleEnum;
import cn.hutool.core.util.StrUtil;
@ -13,6 +12,8 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
/**
* @author : wangry
* @version : 1.0
@ -27,7 +28,7 @@ public class LocaleInterceptor implements HandlerInterceptor {
if (null != attribute) {
return true;
}
if (StrUtil.equals(LocaleEnum.EN_US.getValue(), HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_LOCALE.getProp()))) {
if (StrUtil.equals(LocaleEnum.EN_US.getValue(), OPTIONS.get(BlogPropertiesEnum.BLOG_LOCALE.getProp()))) {
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en", "US"));
} else {
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("zh", "CN"));

View File

@ -1,6 +1,5 @@
package cc.ryanc.halo.web.interceptor;
import cc.ryanc.halo.model.dto.HaloConst;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@ -8,6 +7,8 @@ import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
/**
* <pre>
*
@ -21,7 +22,7 @@ public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
final Object obj = request.getSession().getAttribute(HaloConst.USER_SESSION_KEY);
final Object obj = request.getSession().getAttribute(USER_SESSION_KEY);
//如果user不为空则放行
if (null != obj) {
return true;

View File

@ -0,0 +1,57 @@
server:
port: 8090
use-forward-headers: true
undertow:
io-threads: 2
worker-threads: 36
buffer-size: 1024
directBuffers: true
servlet:
session:
timeout: 86400s
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# H2database 配置
driver-class-name: org.h2.Driver
url: jdbc:h2:file:~/halo/halo-dev
username: admin
password: 123456
#MySql配置
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
# username: root
# password: 123456
h2:
console:
settings:
web-allow-others: true
path: /h2-console
enabled: true
jpa:
hibernate:
ddl-auto: update
show-sql: true
freemarker:
allow-request-override: false
cache: false
check-template-location: true
charset: utf-8
content-type: text/html
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: true
suffix: .ftl
settings:
auto_import: /spring.ftl as spring
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
# 多语言资源文件路径
messages:
basename: i18n/messages

View File

@ -0,0 +1,61 @@
server:
port: 8090
use-forward-headers: true
undertow:
io-threads: 2
worker-threads: 36
buffer-size: 1024
directBuffers: true
servlet:
session:
timeout: 86400s
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# H2database 配置
driver-class-name: org.h2.Driver
url: jdbc:h2:file:~/halo/halo
username: admin
password: 123456
#MySql配置
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
# username: root
# password: 123456
h2:
console:
settings:
web-allow-others: true
path: /h2-console
enabled: true
jpa:
hibernate:
ddl-auto: update
show-sql: false
freemarker:
allow-request-override: false
cache: false
check-template-location: true
charset: utf-8
content-type: text/html
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: true
suffix: .ftl
settings:
auto_import: /spring.ftl as spring
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
# 多语言资源文件路径
messages:
basename: i18n/messages
logging:
file: ./logs/log.log

View File

@ -0,0 +1,46 @@
server:
use-forward-headers: true
undertow:
io-threads: 2
worker-threads: 36
buffer-size: 1024
directBuffers: true
servlet:
session:
timeout: 86400s
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# H2database 配置
driver-class-name: org.h2.Driver
url: jdbc:h2:file:~/halo/halo-test
username: admin
password: 123456
jpa:
hibernate:
ddl-auto: update
show-sql: true
freemarker:
allow-request-override: false
cache: false
check-template-location: true
charset: utf-8
content-type: text/html
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: true
suffix: .ftl
settings:
auto_import: /spring.ftl as spring
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
# 多语言资源文件路径
messages:
basename: i18n/messages
logging:
file: ./logs/log.log

View File

@ -1,61 +1,3 @@
server:
port: 8090
use-forward-headers: true
undertow:
io-threads: 2
worker-threads: 36
buffer-size: 1024
directBuffers: true
servlet:
session:
timeout: 86400s
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# H2database 配置
driver-class-name: org.h2.Driver
url: jdbc:h2:file:~/halo/halo
username: admin
password: 123456
#MySql配置
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
# username: root
# password: 123456
h2:
console:
settings:
web-allow-others: true
path: /h2-console
enabled: true
jpa:
hibernate:
ddl-auto: update
show-sql: false
freemarker:
allow-request-override: false
cache: false
check-template-location: true
charset: utf-8
content-type: text/html
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: true
suffix: .ftl
settings:
auto_import: /spring.ftl as spring
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
# 多语言资源文件路径
messages:
basename: i18n/messages
logging:
file: ./logs/log.log
profiles:
active: prod

View File

@ -1,3 +0,0 @@
User-agent: *
Disallow: /admin/
Sitemap: /sitemap.xml

View File

@ -322,6 +322,23 @@
</div>
</div>
</div>
<div class="form-group">
<label class="col-lg-2 col-sm-4 control-label">API 评论开关:</label>
<div class="col-lg-4 col-sm-8 control-radio">
<div class="pretty p-default p-round">
<input type="radio" name="comment_api_switch" value="true" ${((options.comment_api_switch!)=='true')?string('checked','')}>
<div class="state p-primary">
<label><@spring.message code='common.radio.enable' /></label>
</div>
</div>
<div class="pretty p-default p-round">
<input type="radio" name="comment_api_switch" value="false" ${((options.comment_api_switch!'false')=='false')?string('checked','')}>
<div class="state p-primary">
<label><@spring.message code='common.radio.disable' /></label>
</div>
</div>
</div>
</div>
<div class="form-group">
<label for="indexComments" class="col-lg-2 col-sm-4 control-label"><@spring.message code='admin.setting.form.index-comments' />
<span data-toggle="tooltip" data-placement="top" title="<@spring.message code='admin.setting.form.index-comments-tips' />" style="cursor: pointer">

View File

@ -0,0 +1,4 @@
User-agent: *
Disallow: /admin/
Sitemap: ${options.blog_url!}/sitemap.xml
Sitemap: ${options.blog_url!}/sitemap.html

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<title>${options.blog_title!}</title>
<link>${options.blog_url!}</link>
<#if user.userDesc??>
<description>${user.userDesc!}</description>
</#if>
<language>zh-CN</language>
<#if posts?? && posts?size gt 0>
<#list posts as post>
<item>
<title>${post.postTitle!}</title>
<link>${options.blog_url}/archives/${post.postUrl!}</link>
<content:encoded>
<![CDATA[
${post.postContent!}
]]>
</content:encoded>
<pubDate>${post.postDate}</pubDate>
</item>
</#list>
</#if>
</channel>
</rss>

View File

@ -0,0 +1,201 @@
<#--
see https://gitee.com/yadong.zhang/DBlog/blob/master/blog-web/src/main/java/com/zyd/blog/controller/RestWebSiteController.java
-->
<#compress >
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>${options.blog_title!} 网站地图</title>
<meta name="robots" content="index,follow"/>
<style type="text/css">
body {
color: #000000;
background: #ffffff;
margin: 20px;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 14px;
}
#myTable {
list-style: none;
margin: 10px 0px 10px 0px;
padding: 0px;
width: 100%;
min-width: 804px;
}
#myTable li {
list-style-type: none;
width: 100%;
min-width: 404px;
height: 20px;
line-height: 20px;
padding: 2px 0;
}
.pull-left{
float: left!important;
}
.pull-right{
float: right!important;
}
#myTable li .T1-h {
font-weight: bold;
min-width: 300px;
}
#myTable li .T2-h {
width: 200px;
font-weight: bold;
}
#myTable li .T3-h {
width: 200px;
font-weight: bold;
}
#myTable li .T4-h {
width: 100px;
font-weight: bold;
}
#myTable li .T1 {
min-width: 300px;
}
#myTable li .T2 {
width: 200px;
}
#myTable li .T3 {
width: 200px;
}
#myTable li .T4 {
width: 100px;
}
#footer {
padding: 2px;
margin: 0px;
font-size: 8pt;
color: gray;
min-width: 900px;
}
#footer a {
color: gray;
}
.myClear {
clear: both;
}
#nav, #content, #footer {
padding: 8px;
border: 1px solid #EEEEEE;
clear: both;
width: 95%;
margin: auto;
margin-top: 10px;
}
/* 窗口缩小到768px以下时 */
@media (max-width: 768px) {
.T2-h, .T3-h, .T4-h, .T2, .T3, .T4 {
display: none;
}
#myTable, #footer, #myTable li .T1, #myTable li, #myTable li .T1-h, #myTable li .T1 {
max-width: 100%;
min-width: auto;
white-space: nowrap;
word-wrap: normal;
text-overflow: ellipsis;
overflow: hidden;
}
}
/* 窗口放大到768px以上时 */
@media (min-width: 768px) {
}
</style>
</head>
<body>
<h2 style="text-align: center; margin-top: 20px">${options.blog_title!} 网站地图 </h2>
<div id="nav"><a href="${options.blog_url!}"><strong>${options.blog_title!}</strong></a> &raquo; <a href="${options.blog_url!}/sitemap.html">站点地图</a></div>
<div id="content">
<h3>最新文章</h3>
<ul id="myTable">
<li>
<div class="T1-h pull-left">URL</div>
<div class="T2-h pull-right">Last Change</div>
<div class="T3-h pull-right">Change Frequency</div>
<div class="T4-h pull-right">Priority</div>
</li>
<div class="myClear"></div>
<li>
<div class="T1 pull-left"><a href="${options.blog_url!}" title="${options.blog_title!}">${options.blog_title!}</a></div>
<div class="T2 pull-right">${options.blog_start!}</div>
<div class="T3 pull-right">daily</div>
<div class="T4 pull-right">1</div>
</li>
<div class="myClear"></div>
<#if posts?? && posts?size gt 0>
<#list posts as post>
<li>
<div class="T1 pull-left"><a href="${options.blog_url!}/archives/${post.postUrl!}" title="${post.postTitle!}">${post.postTitle!} | ${options.blog_title!}</a></div>
<div class="T2 pull-right">${post.postDate?string('yyyy-MM-dd')}</div>
<div class="T3 pull-right">daily</div>
<div class="T4 pull-right">0.6</div>
</li>
<div class="myClear"></div>
</#list>
</#if>
</ul>
</div>
<div id="content">
<h3>分类目录</h3>
<ul id="myTable">
<@commonTag method="categories">
<#if categories?? && categories?size gt 0>
<#list categories as cate>
<li>
<div class="T1 pull-left"><a href="${options.blog_url}/categories/${cate.cateUrl!}" title="前端编程">${cate.cateName} | ${options.blog_title!}</a></div>
<div class="T2 pull-right">${options.blog_start!}</div>
<div class="T3 pull-right">daily</div>
<div class="T4 pull-right">0.6</div>
</li>
<div class="myClear"></div>
</#list>
</#if>
</@commonTag>
</ul>
</div>
<div id="content">
<h3>标签目录</h3>
<ul id="myTable">
<@commonTag method="tags">
<#if tags?? && tags?size gt 0>
<#list tags as tag>
<li>
<div class="T1 pull-left"><a href="${options.blog_url}/tags/${tag.tagUrl!}" title="前端编程">${tag.tagName} | ${options.blog_title!}</a></div>
<div class="T2 pull-right">${options.blog_start!}</div>
<div class="T3 pull-right">daily</div>
<div class="T4 pull-right">0.6</div>
</li>
<div class="myClear"></div>
</#list>
</#if>
</@commonTag>
</ul>
</div>
<div id="footer">
该文件由<a href="${options.blog_url!}" title="${options.blog_title!}">${options.blog_title!}</a>网站自动生成。
</div>
</body>
</html>
</#compress>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<#if posts?? && posts?size gt 0>
<#list posts as post>
<url>
<loc>${options.blog_url!}/archives/${post.postUrl!}</loc>
<lastmod>${post.postDate?iso_local}</lastmod>
</url>
</#list>
</#if>
</urlset>