org.apache.maven.plugins
maven-jar-plugin
@@ -273,7 +280,6 @@
-
org.apache.maven.plugins
maven-surefire-plugin
@@ -310,8 +316,6 @@
-
-
org.apache.maven.plugins
maven-jar-plugin
@@ -345,6 +349,11 @@
true
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.0.0
+
diff --git a/src/main/java/cc/ryanc/halo/Application.java b/src/main/java/cc/ryanc/halo/Application.java
index f67e743eb..0f65eb888 100755
--- a/src/main/java/cc/ryanc/halo/Application.java
+++ b/src/main/java/cc/ryanc/halo/Application.java
@@ -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;
/**
*
@@ -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);
diff --git a/src/main/java/cc/ryanc/halo/config/FreeMarkerConfig.java b/src/main/java/cc/ryanc/halo/config/FreeMarkerAutoConfiguration.java
similarity index 63%
rename from src/main/java/cc/ryanc/halo/config/FreeMarkerConfig.java
rename to src/main/java/cc/ryanc/halo/config/FreeMarkerAutoConfiguration.java
index 59c1df8ff..3646c50ba 100644
--- a/src/main/java/cc/ryanc/halo/config/FreeMarkerConfig.java
+++ b/src/main/java/cc/ryanc/halo/config/FreeMarkerAutoConfiguration.java
@@ -1,7 +1,10 @@
package cc.ryanc.halo.config;
-import cc.ryanc.halo.model.tag.ArticleTagDirective;
-import cc.ryanc.halo.model.tag.CommonTagDirective;
+import cc.ryanc.halo.model.freemarker.method.RandomMethod;
+import cc.ryanc.halo.model.freemarker.method.RecentCommentsMethod;
+import cc.ryanc.halo.model.freemarker.method.RecentPostsMethod;
+import cc.ryanc.halo.model.freemarker.tag.ArticleTagDirective;
+import cc.ryanc.halo.model.freemarker.tag.CommonTagDirective;
import cc.ryanc.halo.service.OptionsService;
import cc.ryanc.halo.service.UserService;
import freemarker.template.TemplateModelException;
@@ -21,7 +24,7 @@ import javax.annotation.PostConstruct;
*/
@Slf4j
@Configuration
-public class FreeMarkerConfig {
+public class FreeMarkerAutoConfiguration {
@Autowired
private freemarker.template.Configuration configuration;
@@ -38,6 +41,15 @@ public class FreeMarkerConfig {
@Autowired
private ArticleTagDirective articleTagDirective;
+ @Autowired
+ private RandomMethod randomMethod;
+
+ @Autowired
+ private RecentPostsMethod recentPostsMethod;
+
+ @Autowired
+ private RecentCommentsMethod recentCommentsMethod;
+
@PostConstruct
public void setSharedVariable() {
try {
@@ -46,6 +58,9 @@ public class FreeMarkerConfig {
configuration.setSharedVariable("articleTag", articleTagDirective);
configuration.setSharedVariable("options", optionsService.findAllOptions());
configuration.setSharedVariable("user", userService.findUser());
+ configuration.setSharedVariable("randomMethod", randomMethod);
+ configuration.setSharedVariable("recentPostsMethod", recentPostsMethod);
+ configuration.setSharedVariable("recentCommentsMethod", recentCommentsMethod);
} catch (TemplateModelException e) {
log.error("Custom tags failed to load:{}", e.getMessage());
}
diff --git a/src/main/java/cc/ryanc/halo/config/StartupConfig.java b/src/main/java/cc/ryanc/halo/config/StartupConfig.java
deleted file mode 100755
index 651f71008..000000000
--- a/src/main/java/cc/ryanc/halo/config/StartupConfig.java
+++ /dev/null
@@ -1,243 +0,0 @@
-package cc.ryanc.halo.config;
-
-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.TrueFalseEnum;
-import cc.ryanc.halo.service.OptionsService;
-import cc.ryanc.halo.utils.HaloUtils;
-import cc.ryanc.halo.web.controller.core.BaseController;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.cron.CronUtil;
-import freemarker.template.TemplateModelException;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.event.ApplicationStartedEvent;
-import org.springframework.context.ApplicationListener;
-import org.springframework.context.annotation.Configuration;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- *
- * 应用启动的时候所执行的方法
- *
- *
- * @author : RYAN0UP
- * @date : 2017/12/22
- */
-@Slf4j
-@Configuration
-public class StartupConfig implements ApplicationListener {
-
- @Autowired
- private OptionsService optionsService;
-
- @Autowired
- private freemarker.template.Configuration configuration;
-
- @Override
- public void onApplicationEvent(ApplicationStartedEvent event) {
- try {
- this.loadActiveTheme();
- } catch (TemplateModelException e) {
- e.printStackTrace();
- }
- this.loadOptions();
- this.loadThemes();
- this.loadOwo();
- this.autoBackup();
- }
-
- /**
- * 加载主题设置
- */
- private void loadActiveTheme() throws TemplateModelException {
- String themeValue = optionsService.findOneOption(BlogPropertiesEnum.THEME.getProp());
- if (StrUtil.isNotEmpty(themeValue) && !StrUtil.equals(themeValue, null)) {
- BaseController.THEME = themeValue;
- } else {
- //以防万一
- BaseController.THEME = "anatole";
- }
- configuration.setSharedVariable("themeName", BaseController.THEME);
- }
-
- /**
- * 加载设置选项
- */
- private void loadOptions() {
- Map options = optionsService.findAllOptions();
- if (options != null && !options.isEmpty()) {
- HaloConst.OPTIONS = options;
- }
- }
-
- /**
- * 加载所有主题
- */
- private void loadThemes() {
- HaloConst.THEMES.clear();
- List themes = HaloUtils.getThemes();
- if (null != themes) {
- HaloConst.THEMES = themes;
- }
- }
-
- /**
- * 启动定时备份
- */
- private void autoBackup() {
- String autoBackup = optionsService.findOneOption(BlogPropertiesEnum.AUTO_BACKUP.getProp());
- if (StrUtil.isNotEmpty(autoBackup) && StrUtil.equals(autoBackup, TrueFalseEnum.TRUE.getDesc())) {
- //启动定时任务
- CronUtil.start();
- log.info("The scheduled task starts successfully!");
- }
- }
-
- /**
- * 加载OwO表情
- */
- private void loadOwo() {
- Map map = new HashMap<>(135);
- map.put("@[nico]", " ");
- map.put("@[OK]", " ");
- map.put("@[what]", " ");
- map.put("@[三道杠]", " ");
- map.put("@[不高兴]", " ");
- map.put("@[乖]", " ");
- map.put("@[你懂的]", " ");
- map.put("@[便便]", " ");
- map.put("@[冷]", " ");
- map.put("@[勉强]", " ");
- map.put("@[吃瓜]", " ");
- map.put("@[吃翔]", " ");
- map.put("@[吐]", " ");
- map.put("@[吐舌]", " ");
- map.put("@[呀咩爹]", " ");
- map.put("@[呵呵]", " ");
- map.put("@[呼]", " ");
- map.put("@[咦]", " ");
- map.put("@[哈哈]", " ");
- map.put("@[啊]", " ");
- map.put("@[喷]", " ");
- map.put("@[嘚瑟]", " ");
- map.put("@[大拇指]", " ");
- map.put("@[太开心]", " ");
- map.put("@[太阳]", " ");
- map.put("@[委屈]", " ");
- map.put("@[小乖]", " ");
- map.put("@[小红脸]", " ");
- map.put("@[开心]", " ");
- map.put("@[弱]", " ");
- map.put("@[彩虹]", " ");
- map.put("@[心碎]", " ");
- map.put("@[怒]", " ");
- map.put("@[惊哭]", " ");
- map.put("@[惊恐]", " ");
- map.put("@[惊讶]", " ");
- map.put("@[懒得理]", " ");
- map.put("@[手纸]", " ");
- map.put("@[挖鼻]", " ");
- map.put("@[捂嘴笑]", " ");
- map.put("@[星星月亮]", " ");
- map.put("@[汗]", " ");
- map.put("@[沙发]", " ");
- map.put("@[泪]", " ");
- map.put("@[滑稽]", " ");
- map.put("@[灯泡]", " ");
- map.put("@[爱心]", " ");
- map.put("@[犀利]", " ");
- map.put("@[狂汗]", " ");
- map.put("@[玫瑰]", " ");
- map.put("@[生气]", " ");
- map.put("@[疑问]", " ");
- map.put("@[真棒]", " ");
- map.put("@[睡觉]", " ");
- map.put("@[礼物]", " ");
- map.put("@[笑尿]", " ");
- map.put("@[笑眼]", " ");
- map.put("@[红领巾]", " ");
- map.put("@[胜利]", " ");
- map.put("@[花心]", " ");
- map.put("@[茶杯]", " ");
- map.put("@[药丸]", " ");
- map.put("@[蛋糕]", " ");
- map.put("@[蜡烛]", " ");
- map.put("@[鄙视]", " ");
- map.put("@[酷]", " ");
- map.put("@[酸爽]", " ");
- map.put("@[钱]", " ");
- map.put("@[钱币]", " ");
- map.put("@[阴险]", " ");
- map.put("@[音乐]", " ");
- map.put("@[香蕉]", " ");
- map.put("@[黑线]", " ");
- map.put("@(不出所料)", " ");
- map.put("@(不说话)", " ");
- map.put("@(不高兴)", " ");
- map.put("@(中刀)", " ");
- map.put("@(中指)", " ");
- map.put("@(中枪)", " ");
- map.put("@(亲亲)", " ");
- map.put("@(便便)", " ");
- map.put("@(傻笑)", " ");
- map.put("@(内伤)", " ");
- map.put("@(击掌)", " ");
- map.put("@(口水)", " ");
- map.put("@(吐)", " ");
- map.put("@(吐舌)", " ");
- map.put("@(吐血倒地)", " ");
- map.put("@(呲牙)", " ");
- map.put("@(咽气)", " ");
- map.put("@(哭泣)", " ");
- map.put("@(喜极而泣)", " ");
- map.put("@(喷水)", " ");
- map.put("@(喷血)", " ");
- map.put("@(坐等)", " ");
- map.put("@(大囧)", " ");
- map.put("@(害羞)", " ");
- map.put("@(小怒)", " ");
- map.put("@(小眼睛)", " ");
- map.put("@(尴尬)", " ");
- map.put("@(得意)", " ");
- map.put("@(惊喜)", " ");
- map.put("@(想一想)", " ");
- map.put("@(愤怒)", " ");
- map.put("@(扇耳光)", " ");
- map.put("@(投降)", " ");
- map.put("@(抠鼻)", " ");
- map.put("@(抽烟)", " ");
- map.put("@(无奈)", " ");
- map.put("@(无所谓)", " ");
- map.put("@(无语)", " ");
- map.put("@(暗地观察)", " ");
- map.put("@(期待)", " ");
- map.put("@(欢呼)", " ");
- map.put("@(汗)", " ");
- map.put("@(深思)", " ");
- map.put("@(狂汗)", " ");
- map.put("@(献花)", " ");
- map.put("@(献黄瓜)", " ");
- map.put("@(皱眉)", " ");
- map.put("@(看不见)", " ");
- map.put("@(看热闹)", " ");
- map.put("@(肿包)", " ");
- map.put("@(脸红)", " ");
- map.put("@(蜡烛)", " ");
- map.put("@(装大款)", " ");
- map.put("@(观察)", " ");
- map.put("@(赞一个)", " ");
- map.put("@(邪恶)", " ");
- map.put("@(锁眉)", " ");
- map.put("@(长草)", " ");
- map.put("@(阴暗)", " ");
- map.put("@(高兴)", " ");
- map.put("@(黑线)", " ");
- map.put("@(鼓掌)", " ");
- HaloConst.OWO = map;
- }
-}
diff --git a/src/main/java/cc/ryanc/halo/config/MvcConfig.java b/src/main/java/cc/ryanc/halo/config/WebMvcAutoConfiguration.java
similarity index 82%
rename from src/main/java/cc/ryanc/halo/config/MvcConfig.java
rename to src/main/java/cc/ryanc/halo/config/WebMvcAutoConfiguration.java
index 001574563..621ffe815 100644
--- a/src/main/java/cc/ryanc/halo/config/MvcConfig.java
+++ b/src/main/java/cc/ryanc/halo/config/WebMvcAutoConfiguration.java
@@ -30,7 +30,7 @@ import java.util.Locale;
@EnableWebMvc
@ComponentScan(basePackages = "cc.ryanc.halo.web.controller")
@PropertySource(value = "classpath:application.yaml", ignoreResourceNotFound = true, encoding = "UTF-8")
-public class MvcConfig implements WebMvcConfigurer {
+public class WebMvcAutoConfiguration implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@@ -52,6 +52,7 @@ public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
+ .addPathPatterns("/admin.*")
.addPathPatterns("/admin/**")
.addPathPatterns("/backup/**")
.excludePathPatterns("/admin/login")
@@ -65,6 +66,7 @@ public class MvcConfig implements WebMvcConfigurer {
registry.addInterceptor(apiInterceptor)
.addPathPatterns("/api/**");
registry.addInterceptor(localeInterceptor)
+ .addPathPatterns("/admin.*")
.addPathPatterns("/admin/**")
.addPathPatterns("/install");
registry.addInterceptor(localeChangeInterceptor())
@@ -86,7 +88,7 @@ public class MvcConfig implements WebMvcConfigurer {
registry.addResourceHandler("/upload/**")
.addResourceLocations("file:///" + System.getProperties().getProperty("user.home") + "/halo/upload/");
registry.addResourceHandler("/favicon.ico")
- .addResourceLocations("classpath:/static/images/favicon.ico");
+ .addResourceLocations("classpath:/static/halo-backend/images/favicon.ico");
registry.addResourceHandler("/backup/**")
.addResourceLocations("file:///" + System.getProperties().getProperty("user.home") + "/halo/backup/");
}
@@ -98,11 +100,17 @@ public class MvcConfig implements WebMvcConfigurer {
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**")
- .allowCredentials(true)
+ registry.addMapping("/api/**")
.allowedHeaders("*")
.allowedOrigins("*")
- .allowedMethods("*");
+ .allowedMethods("GET", "POST")
+ .exposedHeaders("access-control-allow-headers",
+ "access-control-allow-methods",
+ "access-control-allow-origin",
+ "access-control-max-age",
+ "X-Frame-Options",
+ "token")
+ .allowCredentials(false).maxAge(3600);
}
/**
@@ -112,7 +120,7 @@ public class MvcConfig implements WebMvcConfigurer {
*/
@Bean
public LocaleResolver localeResolver() {
- SessionLocaleResolver slr = new SessionLocaleResolver();
+ final SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.CHINA);
return slr;
}
@@ -124,7 +132,7 @@ public class MvcConfig implements WebMvcConfigurer {
*/
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
- LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
+ final LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
diff --git a/src/main/java/cc/ryanc/halo/listener/StartedListener.java b/src/main/java/cc/ryanc/halo/listener/StartedListener.java
new file mode 100644
index 000000000..afa2e249e
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/listener/StartedListener.java
@@ -0,0 +1,232 @@
+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;
+import cc.ryanc.halo.utils.HaloUtils;
+import cc.ryanc.halo.web.controller.core.BaseController;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.cron.CronUtil;
+import freemarker.template.TemplateModelException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationStartedEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * 应用启动完成后所执行的方法
+ *
+ *
+ * @author : RYAN0UP
+ * @date : 2018/12/5
+ */
+@Slf4j
+@Configuration
+public class StartedListener implements ApplicationListener {
+
+ @Autowired
+ private OptionsService optionsService;
+
+ @Autowired
+ private freemarker.template.Configuration configuration;
+
+ @Override
+ public void onApplicationEvent(ApplicationStartedEvent event) {
+ try {
+ this.loadActiveTheme();
+ } catch (TemplateModelException e) {
+ e.printStackTrace();
+ }
+ this.loadOptions();
+ this.loadThemes();
+ this.loadOwo();
+ //启动定时任务
+ CronUtil.start();
+ log.info("The scheduled task starts successfully!");
+ }
+
+ /**
+ * 加载主题设置
+ */
+ private void loadActiveTheme() throws TemplateModelException {
+ final String themeValue = optionsService.findOneOption(BlogPropertiesEnum.THEME.getProp());
+ if (StrUtil.isNotEmpty(themeValue) && !StrUtil.equals(themeValue, null)) {
+ BaseController.THEME = themeValue;
+ } else {
+ //如果没有设置主题,则默认
+ BaseController.THEME = "anatole";
+ }
+ configuration.setSharedVariable("themeName", BaseController.THEME);
+ }
+
+ /**
+ * 加载设置选项
+ */
+ private void loadOptions() {
+ final Map options = optionsService.findAllOptions();
+ if (options != null && !options.isEmpty()) {
+ HaloConst.OPTIONS = options;
+ }
+ }
+
+ /**
+ * 加载所有主题
+ */
+ private void loadThemes() {
+ HaloConst.THEMES.clear();
+ final List themes = HaloUtils.getThemes();
+ if (null != themes) {
+ HaloConst.THEMES = themes;
+ }
+ }
+
+ /**
+ * 加载OwO表情
+ */
+ private void loadOwo() {
+ final Map map = new HashMap<>(135);
+ map.put("@[nico]", " ");
+ map.put("@[OK]", " ");
+ map.put("@[what]", " ");
+ map.put("@[三道杠]", " ");
+ map.put("@[不高兴]", " ");
+ map.put("@[乖]", " ");
+ map.put("@[你懂的]", " ");
+ map.put("@[便便]", " ");
+ map.put("@[冷]", " ");
+ map.put("@[勉强]", " ");
+ map.put("@[吃瓜]", " ");
+ map.put("@[吃翔]", " ");
+ map.put("@[吐]", " ");
+ map.put("@[吐舌]", " ");
+ map.put("@[呀咩爹]", " ");
+ map.put("@[呵呵]", " ");
+ map.put("@[呼]", " ");
+ map.put("@[咦]", " ");
+ map.put("@[哈哈]", " ");
+ map.put("@[啊]", " ");
+ map.put("@[喷]", " ");
+ map.put("@[嘚瑟]", " ");
+ map.put("@[大拇指]", " ");
+ map.put("@[太开心]", " ");
+ map.put("@[太阳]", " ");
+ map.put("@[委屈]", " ");
+ map.put("@[小乖]", " ");
+ map.put("@[小红脸]", " ");
+ map.put("@[开心]", " ");
+ map.put("@[弱]", " ");
+ map.put("@[彩虹]", " ");
+ map.put("@[心碎]", " ");
+ map.put("@[怒]", " ");
+ map.put("@[惊哭]", " ");
+ map.put("@[惊恐]", " ");
+ map.put("@[惊讶]", " ");
+ map.put("@[懒得理]", " ");
+ map.put("@[手纸]", " ");
+ map.put("@[挖鼻]", " ");
+ map.put("@[捂嘴笑]", " ");
+ map.put("@[星星月亮]", " ");
+ map.put("@[汗]", " ");
+ map.put("@[沙发]", " ");
+ map.put("@[泪]", " ");
+ map.put("@[滑稽]", " ");
+ map.put("@[灯泡]", " ");
+ map.put("@[爱心]", " ");
+ map.put("@[犀利]", " ");
+ map.put("@[狂汗]", " ");
+ map.put("@[玫瑰]", " ");
+ map.put("@[生气]", " ");
+ map.put("@[疑问]", " ");
+ map.put("@[真棒]", " ");
+ map.put("@[睡觉]", " ");
+ map.put("@[礼物]", " ");
+ map.put("@[笑尿]", " ");
+ map.put("@[笑眼]", " ");
+ map.put("@[红领巾]", " ");
+ map.put("@[胜利]", " ");
+ map.put("@[花心]", " ");
+ map.put("@[茶杯]", " ");
+ map.put("@[药丸]", " ");
+ map.put("@[蛋糕]", " ");
+ map.put("@[蜡烛]", " ");
+ map.put("@[鄙视]", " ");
+ map.put("@[酷]", " ");
+ map.put("@[酸爽]", " ");
+ map.put("@[钱]", " ");
+ map.put("@[钱币]", " ");
+ map.put("@[阴险]", " ");
+ map.put("@[音乐]", " ");
+ map.put("@[香蕉]", " ");
+ map.put("@[黑线]", " ");
+ map.put("@(不出所料)", " ");
+ map.put("@(不说话)", " ");
+ map.put("@(不高兴)", " ");
+ map.put("@(中刀)", " ");
+ map.put("@(中指)", " ");
+ map.put("@(中枪)", " ");
+ map.put("@(亲亲)", " ");
+ map.put("@(便便)", " ");
+ map.put("@(傻笑)", " ");
+ map.put("@(内伤)", " ");
+ map.put("@(击掌)", " ");
+ map.put("@(口水)", " ");
+ map.put("@(吐)", " ");
+ map.put("@(吐舌)", " ");
+ map.put("@(吐血倒地)", " ");
+ map.put("@(呲牙)", " ");
+ map.put("@(咽气)", " ");
+ map.put("@(哭泣)", " ");
+ map.put("@(喜极而泣)", " ");
+ map.put("@(喷水)", " ");
+ map.put("@(喷血)", " ");
+ map.put("@(坐等)", " ");
+ map.put("@(大囧)", " ");
+ map.put("@(害羞)", " ");
+ map.put("@(小怒)", " ");
+ map.put("@(小眼睛)", " ");
+ map.put("@(尴尬)", " ");
+ map.put("@(得意)", " ");
+ map.put("@(惊喜)", " ");
+ map.put("@(想一想)", " ");
+ map.put("@(愤怒)", " ");
+ map.put("@(扇耳光)", " ");
+ map.put("@(投降)", " ");
+ map.put("@(抠鼻)", " ");
+ map.put("@(抽烟)", " ");
+ map.put("@(无奈)", " ");
+ map.put("@(无所谓)", " ");
+ map.put("@(无语)", " ");
+ map.put("@(暗地观察)", " ");
+ map.put("@(期待)", " ");
+ map.put("@(欢呼)", " ");
+ map.put("@(汗)", " ");
+ map.put("@(深思)", " ");
+ map.put("@(狂汗)", " ");
+ map.put("@(献花)", " ");
+ map.put("@(献黄瓜)", " ");
+ map.put("@(皱眉)", " ");
+ map.put("@(看不见)", " ");
+ map.put("@(看热闹)", " ");
+ map.put("@(肿包)", " ");
+ map.put("@(脸红)", " ");
+ map.put("@(蜡烛)", " ");
+ map.put("@(装大款)", " ");
+ map.put("@(观察)", " ");
+ map.put("@(赞一个)", " ");
+ map.put("@(邪恶)", " ");
+ map.put("@(锁眉)", " ");
+ map.put("@(长草)", " ");
+ map.put("@(阴暗)", " ");
+ map.put("@(高兴)", " ");
+ map.put("@(黑线)", " ");
+ map.put("@(鼓掌)", " ");
+ HaloConst.OWO = map;
+ }
+}
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Attachment.java b/src/main/java/cc/ryanc/halo/model/domain/Attachment.java
index f49b84465..b7db4d068 100644
--- a/src/main/java/cc/ryanc/halo/model/domain/Attachment.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Attachment.java
@@ -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;
/**
@@ -70,4 +71,14 @@ public class Attachment implements Serializable {
* 附件长宽
*/
private String attachWh;
+
+ /**
+ * 附件存储地址
+ */
+ private String attachLocation;
+
+ /**
+ * 附件来源,0:上传,1:外部链接
+ */
+ private Integer attachOrigin = 0;
}
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Comment.java b/src/main/java/cc/ryanc/halo/model/domain/Comment.java
index 8fbc41664..d1dd17b04 100644
--- a/src/main/java/cc/ryanc/halo/model/domain/Comment.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Comment.java
@@ -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;
/**
@@ -84,6 +88,7 @@ public class Comment implements Serializable {
/**
* 评论者ua信息
*/
+ @Column(length = 512)
private String commentAgent;
/**
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Link.java b/src/main/java/cc/ryanc/halo/model/domain/Link.java
index 308a4930a..178aa19d6 100755
--- a/src/main/java/cc/ryanc/halo/model/domain/Link.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Link.java
@@ -6,6 +6,7 @@ import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
+import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
@@ -33,11 +34,13 @@ public class Link implements Serializable {
/**
* 友情链接名称
*/
+ @NotEmpty(message = "友情链接名称不能为空!")
private String linkName;
/**
* 友情链接地址
*/
+ @NotEmpty(message = "友情链接地址不能为空!")
private String linkUrl;
/**
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Logs.java b/src/main/java/cc/ryanc/halo/model/domain/Logs.java
index be550604a..604f026f3 100644
--- a/src/main/java/cc/ryanc/halo/model/domain/Logs.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Logs.java
@@ -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() {
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Menu.java b/src/main/java/cc/ryanc/halo/model/domain/Menu.java
index b4850ee7f..aaed95e9e 100644
--- a/src/main/java/cc/ryanc/halo/model/domain/Menu.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Menu.java
@@ -6,6 +6,8 @@ import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
@@ -33,16 +35,19 @@ public class Menu implements Serializable {
/**
* 菜单名称
*/
+ @NotEmpty(message = "菜单名称不能为空!")
private String menuName;
/**
* 菜单路径
*/
+ @NotEmpty(message = "菜单路径不能为空!")
private String menuUrl;
/**
* 排序编号
*/
+ @NotNull(message = "排序编号不能为空!")
private Integer menuSort;
/**
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Post.java b/src/main/java/cc/ryanc/halo/model/domain/Post.java
index b3da107be..4f54480e5 100755
--- a/src/main/java/cc/ryanc/halo/model/domain/Post.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Post.java
@@ -1,8 +1,10 @@
package cc.ryanc.halo.model.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
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;
@@ -21,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;
@@ -106,11 +109,13 @@ public class Post implements Serializable {
/**
* 发表日期
*/
+ @CreatedDate
private Date postDate;
/**
* 最后一次更新时间
*/
+ @LastModifiedDate
private Date postUpdate;
/**
@@ -130,6 +135,11 @@ public class Post implements Serializable {
*/
private Integer allowComment = 0;
+ /**
+ * 文章访问密码
+ */
+ private String postPassword;
+
/**
* 指定渲染模板
*/
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Tag.java b/src/main/java/cc/ryanc/halo/model/domain/Tag.java
index 1bc79b564..4922b3a26 100644
--- a/src/main/java/cc/ryanc/halo/model/domain/Tag.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Tag.java
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import javax.persistence.*;
+import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@@ -33,11 +34,13 @@ public class Tag implements Serializable {
/**
* 标签名称
*/
+ @NotEmpty(message = "标签名称不能为空!")
private String tagName;
/**
* 标签路径
*/
+ @NotEmpty(message = "标签路径不能为空!")
private String tagUrl;
@ManyToMany(mappedBy = "tags")
diff --git a/src/main/java/cc/ryanc/halo/model/dto/HaloConst.java b/src/main/java/cc/ryanc/halo/model/dto/HaloConst.java
index c9f1df8ab..6da24ae22 100644
--- a/src/main/java/cc/ryanc/halo/model/dto/HaloConst.java
+++ b/src/main/java/cc/ryanc/halo/model/dto/HaloConst.java
@@ -34,4 +34,9 @@ public class HaloConst {
* user_session
*/
public static String USER_SESSION_KEY = "user_session";
+
+ /**
+ * 文章阅读数缓存
+ */
+ public static Map POSTS_VIEWS = new HashMap<>();
}
diff --git a/src/main/java/cc/ryanc/halo/model/dto/QiNiuPutSet.java b/src/main/java/cc/ryanc/halo/model/dto/QiNiuPutSet.java
new file mode 100644
index 000000000..219bdebff
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/model/dto/QiNiuPutSet.java
@@ -0,0 +1,30 @@
+package cc.ryanc.halo.model.dto;
+
+import lombok.Data;
+
+/**
+ *
+ * 七牛上传自定义凭证回调解析
+ *
+ *
+ * @author : Yawn
+ * @date : 2018/12/3
+ */
+@Data
+public class QiNiuPutSet {
+
+ /**
+ * 图片大小
+ */
+ private Long size;
+
+ /**
+ * 长
+ */
+ private Integer w;
+
+ /**
+ * 宽
+ */
+ private Integer h;
+}
diff --git a/src/main/java/cc/ryanc/halo/model/enums/AttachLocationEnum.java b/src/main/java/cc/ryanc/halo/model/enums/AttachLocationEnum.java
new file mode 100644
index 000000000..280ca29a4
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/model/enums/AttachLocationEnum.java
@@ -0,0 +1,43 @@
+package cc.ryanc.halo.model.enums;
+
+/**
+ *
+ * 附件存储地址enum
+ *
+ *
+ * @author : Yawn
+ * @date : 2018/12/4
+ */
+public enum AttachLocationEnum {
+
+ /**
+ * 服务器
+ */
+ SERVER(0,"server"),
+
+ /**
+ * 七牛
+ */
+ QINIU(1,"qiniu"),
+
+ /**
+ * 又拍云
+ */
+ UPYUN(2,"upyun");
+
+ private Integer code;
+ private String desc;
+
+ AttachLocationEnum(Integer code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+}
diff --git a/src/main/java/cc/ryanc/halo/model/enums/BlogPropertiesEnum.java b/src/main/java/cc/ryanc/halo/model/enums/BlogPropertiesEnum.java
index 01be00b2b..4a9176b2e 100644
--- a/src/main/java/cc/ryanc/halo/model/enums/BlogPropertiesEnum.java
+++ b/src/main/java/cc/ryanc/halo/model/enums/BlogPropertiesEnum.java
@@ -138,7 +138,7 @@ public enum BlogPropertiesEnum {
/**
* 默认缩略图地址
*/
- DEFAULT_THUMBNAIL("/static/images/thumbnail/thumbnail.png"),
+ DEFAULT_THUMBNAIL("/static/halo-frontend/images/thumbnail/thumbnail.png"),
/**
* 自动备份
@@ -148,7 +148,12 @@ public enum BlogPropertiesEnum {
/**
* API Token
*/
- API_TOKEN("api_token");
+ API_TOKEN("api_token"),
+
+ /**
+ * 附件存储位置
+ */
+ ATTACH_LOC("attach_loc");
private String prop;
diff --git a/src/main/java/cc/ryanc/halo/model/freemarker/method/RandomMethod.java b/src/main/java/cc/ryanc/halo/model/freemarker/method/RandomMethod.java
new file mode 100644
index 000000000..4673a8445
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/model/freemarker/method/RandomMethod.java
@@ -0,0 +1,33 @@
+package cc.ryanc.halo.model.freemarker.method;
+
+import cn.hutool.core.util.RandomUtil;
+import freemarker.template.SimpleNumber;
+import freemarker.template.TemplateMethodModelEx;
+import freemarker.template.TemplateModelException;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author : RYAN0UP
+ * @date : 2018/12/21
+ */
+@Component
+public class RandomMethod implements TemplateMethodModelEx {
+
+ /**
+ * 生成随机数
+ *
+ * @param arguments 参数
+ * @return Object
+ * @throws TemplateModelException TemplateModelException
+ */
+ @Override
+ public Object exec(List arguments) throws TemplateModelException {
+ SimpleNumber argOne = (SimpleNumber) arguments.get(0);
+ SimpleNumber argTwo = (SimpleNumber) arguments.get(1);
+ int start = argOne.getAsNumber().intValue();
+ int end = argTwo.getAsNumber().intValue();
+ return RandomUtil.randomInt(start, end);
+ }
+}
diff --git a/src/main/java/cc/ryanc/halo/model/freemarker/method/RecentCommentsMethod.java b/src/main/java/cc/ryanc/halo/model/freemarker/method/RecentCommentsMethod.java
new file mode 100644
index 000000000..e18f1a221
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/model/freemarker/method/RecentCommentsMethod.java
@@ -0,0 +1,35 @@
+package cc.ryanc.halo.model.freemarker.method;
+
+import cc.ryanc.halo.service.CommentService;
+import freemarker.template.SimpleNumber;
+import freemarker.template.TemplateMethodModelEx;
+import freemarker.template.TemplateModelException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author : RYAN0UP
+ * @date : 2018/12/31
+ */
+@Component
+public class RecentCommentsMethod implements TemplateMethodModelEx {
+
+ @Autowired
+ private CommentService commentService;
+
+ /**
+ * 获取最近的评论
+ *
+ * @param arguments 参数
+ * @return Object
+ * @throws TemplateModelException TemplateModelException
+ */
+ @Override
+ public Object exec(List arguments) throws TemplateModelException {
+ SimpleNumber argOne = (SimpleNumber) arguments.get(0);
+ int limit = argOne.getAsNumber().intValue();
+ return commentService.getRecentComments(limit);
+ }
+}
diff --git a/src/main/java/cc/ryanc/halo/model/freemarker/method/RecentPostsMethod.java b/src/main/java/cc/ryanc/halo/model/freemarker/method/RecentPostsMethod.java
new file mode 100644
index 000000000..fd4abab81
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/model/freemarker/method/RecentPostsMethod.java
@@ -0,0 +1,35 @@
+package cc.ryanc.halo.model.freemarker.method;
+
+import cc.ryanc.halo.service.PostService;
+import freemarker.template.SimpleNumber;
+import freemarker.template.TemplateMethodModelEx;
+import freemarker.template.TemplateModelException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author : RYAN0UP
+ * @date : 2018/12/31
+ */
+@Component
+public class RecentPostsMethod implements TemplateMethodModelEx {
+
+ @Autowired
+ private PostService postService;
+
+ /**
+ * 获取最近的文章
+ *
+ * @param arguments 参数
+ * @return Object
+ * @throws TemplateModelException TemplateModelException
+ */
+ @Override
+ public Object exec(List arguments) throws TemplateModelException {
+ SimpleNumber argOne = (SimpleNumber) arguments.get(0);
+ int limit = argOne.getAsNumber().intValue();
+ return postService.getRecentPosts(limit);
+ }
+}
diff --git a/src/main/java/cc/ryanc/halo/model/tag/ArticleTagDirective.java b/src/main/java/cc/ryanc/halo/model/freemarker/tag/ArticleTagDirective.java
similarity index 92%
rename from src/main/java/cc/ryanc/halo/model/tag/ArticleTagDirective.java
rename to src/main/java/cc/ryanc/halo/model/freemarker/tag/ArticleTagDirective.java
index 2554d315c..93130af48 100644
--- a/src/main/java/cc/ryanc/halo/model/tag/ArticleTagDirective.java
+++ b/src/main/java/cc/ryanc/halo/model/freemarker/tag/ArticleTagDirective.java
@@ -1,4 +1,4 @@
-package cc.ryanc.halo.model.tag;
+package cc.ryanc.halo.model.freemarker.tag;
import cc.ryanc.halo.model.enums.PostStatusEnum;
import cc.ryanc.halo.model.enums.PostTypeEnum;
@@ -29,7 +29,7 @@ public class ArticleTagDirective implements TemplateDirectiveModel {
@Override
public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
- DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);
+ final DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);
if (map.containsKey(METHOD_KEY)) {
String method = map.get(METHOD_KEY).toString();
switch (method) {
diff --git a/src/main/java/cc/ryanc/halo/model/tag/CommonTagDirective.java b/src/main/java/cc/ryanc/halo/model/freemarker/tag/CommonTagDirective.java
similarity index 80%
rename from src/main/java/cc/ryanc/halo/model/tag/CommonTagDirective.java
rename to src/main/java/cc/ryanc/halo/model/freemarker/tag/CommonTagDirective.java
index 71d519271..577d913f4 100644
--- a/src/main/java/cc/ryanc/halo/model/tag/CommonTagDirective.java
+++ b/src/main/java/cc/ryanc/halo/model/freemarker/tag/CommonTagDirective.java
@@ -1,7 +1,5 @@
-package cc.ryanc.halo.model.tag;
+package cc.ryanc.halo.model.freemarker.tag;
-import cc.ryanc.halo.model.dto.HaloConst;
-import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
import cc.ryanc.halo.service.*;
import freemarker.core.Environment;
import freemarker.template.*;
@@ -41,24 +39,24 @@ public class CommonTagDirective implements TemplateDirectiveModel {
@Override
public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
- DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);
+ final DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);
if (map.containsKey(METHOD_KEY)) {
String method = map.get(METHOD_KEY).toString();
switch (method) {
case "menus":
- environment.setVariable("menus", builder.build().wrap(menuService.findAllMenus()));
+ environment.setVariable("menus", builder.build().wrap(menuService.findAll()));
break;
case "categories":
- environment.setVariable("categories", builder.build().wrap(categoryService.findAllCategories()));
+ environment.setVariable("categories", builder.build().wrap(categoryService.findAll()));
break;
case "tags":
- environment.setVariable("tags", builder.build().wrap(tagService.findAllTags()));
+ environment.setVariable("tags", builder.build().wrap(tagService.findAll()));
break;
case "links":
- environment.setVariable("links", builder.build().wrap(linkService.findAllLinks()));
+ environment.setVariable("links", builder.build().wrap(linkService.findAll()));
break;
case "newComments":
- environment.setVariable("newComments", builder.build().wrap(commentService.findAllComments(1)));
+ environment.setVariable("newComments", builder.build().wrap(commentService.findAll(1)));
break;
default:
break;
diff --git a/src/main/java/cc/ryanc/halo/repository/CategoryRepository.java b/src/main/java/cc/ryanc/halo/repository/CategoryRepository.java
index b77ed9708..8c4881403 100755
--- a/src/main/java/cc/ryanc/halo/repository/CategoryRepository.java
+++ b/src/main/java/cc/ryanc/halo/repository/CategoryRepository.java
@@ -20,4 +20,12 @@ public interface CategoryRepository extends JpaRepository {
* @return Category
*/
Category findCategoryByCateUrl(String cateUrl);
+
+ /**
+ * 根据分类名称查询
+ *
+ * @param cateName 分类名称
+ * @return Category
+ */
+ Category findCategoryByCateName(String cateName);
}
diff --git a/src/main/java/cc/ryanc/halo/repository/CommentRepository.java b/src/main/java/cc/ryanc/halo/repository/CommentRepository.java
index 46b7e64c3..d13ebe3a5 100644
--- a/src/main/java/cc/ryanc/halo/repository/CommentRepository.java
+++ b/src/main/java/cc/ryanc/halo/repository/CommentRepository.java
@@ -6,6 +6,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
import java.util.List;
@@ -88,4 +89,13 @@ public interface CommentRepository extends JpaRepository {
* @return 评论数量
*/
Integer countAllByCommentStatus(Integer status);
+
+ /**
+ * 获取指定条数的评论
+ *
+ * @param limit 条数
+ * @return List
+ */
+ @Query(value = "SELECT * FROM halo_comment WHERE comment_status = 0 ORDER BY comment_date DESC LIMIT :limit",nativeQuery = true)
+ List getCommentsByLimit(@Param(value = "limit") int limit);
}
diff --git a/src/main/java/cc/ryanc/halo/repository/PostRepository.java b/src/main/java/cc/ryanc/halo/repository/PostRepository.java
index dd79f5df2..e5a10bb95 100644
--- a/src/main/java/cc/ryanc/halo/repository/PostRepository.java
+++ b/src/main/java/cc/ryanc/halo/repository/PostRepository.java
@@ -27,7 +27,7 @@ public interface PostRepository extends JpaRepository {
*
* @return List
*/
- @Query(value = "SELECT * FROM halo_post where post_type='post' ORDER BY post_date DESC LIMIT 5", nativeQuery = true)
+ @Query(value = "SELECT * FROM halo_post WHERE post_type='post' ORDER BY post_date DESC LIMIT 5", nativeQuery = true)
List findTopFive();
/**
@@ -38,23 +38,27 @@ public interface PostRepository extends JpaRepository {
*/
List findPostsByPostType(String postType);
- /**
- * 分页查询文章
- *
- * @param postType post or page
- * @param pageable 分页信息
- * @return Page
- */
- Page findPostsByPostType(String postType, Pageable pageable);
-
/**
* 模糊查询
*
- * @param keyWord keyword
- * @param pageable pageable
- * @return List
+ * @param postType0 postType0
+ * @param postStatus0 postStatus0
+ * @param postTitle postTitle
+ * @param postType1 postType1
+ * @param postStatus1 postStatus1
+ * @param postContent postContent
+ * @param pageable pageable
+ * @return Page
*/
- List findByPostTitleLike(String keyWord, Pageable pageable);
+ Page findByPostTypeAndPostStatusAndPostTitleLikeOrPostTypeAndPostStatusAndPostContentLike(
+ String postType0,
+ Integer postStatus0,
+ String postTitle,
+ String postType1,
+ Integer postStatus1,
+ String postContent,
+ Pageable pageable
+ );
/**
* 根据文章的状态查询 分页
@@ -94,32 +98,29 @@ public interface PostRepository extends JpaRepository {
Post findPostByPostIdAndPostType(Long postId, String postType);
/**
- * 查询之后文章
+ * 查询指定日期之前的文章
*
- * @param postDate 发布时间
- * @param postStatus 0,1,2
- * @param postType post or page
- * @return List
+ * @param postDate 日期
+ * @return Post
*/
- List findByPostDateAfterAndPostStatusAndPostTypeOrderByPostDateDesc(Date postDate, Integer postStatus, String postType);
-
+ @Query(value = "SELECT * FROM halo_post WHERE post_status = 0 AND post_type='post' AND post_date < :postDate ORDER BY post_date DESC LIMIT 1", nativeQuery = true)
+ Post queryPrePost(@Param("postDate") Date postDate);
/**
- * 查询之前的文章
+ * 查询指定日期之后的文章
*
- * @param postDate 发布时间
- * @param postStatus 0,1,2
- * @param postType post or page
- * @return List
+ * @param postDate 日期
+ * @return Post
*/
- List findByPostDateBeforeAndPostStatusAndPostTypeOrderByPostDateAsc(Date postDate, Integer postStatus, String postType);
+ @Query(value = "SELECT * FROM halo_post WHERE post_status = 0 AND post_type='post' AND post_date > :postDate ORDER BY post_date ASC LIMIT 1", nativeQuery = true)
+ Post queryNextPost(@Param("postDate") Date postDate);
/**
* 查询文章归档信息 根据年份和月份
*
* @return List
*/
- @Query(value = "select year(post_date) as year,month(post_date) as month,count(*) as count from halo_post where post_status=0 and post_type='post' group by year(post_date),month(post_date) order by year desc,month desc", nativeQuery = true)
+ @Query(value = "SELECT YEAR(post_date) AS YEAR,MONTH(post_date) AS MONTH,COUNT(*) AS COUNT FROM halo_post WHERE post_status=0 and post_type='post' GROUP BY YEAR(post_date),MONTH(post_date) ORDER BY YEAR DESC,MONTH DESC", nativeQuery = true)
List findPostGroupByYearAndMonth();
/**
@@ -127,9 +128,31 @@ public interface PostRepository extends JpaRepository {
*
* @return List
*/
- @Query(value = "select year(post_date) as year,count(*) as count from halo_post where post_status=0 and post_type='post' group by year(post_date) order by year desc", nativeQuery = true)
+ @Query(value = "SELECT YEAR(post_date) AS YEAR,COUNT(*) AS COUNT FROM halo_post WHERE post_status=0 AND post_type='post' GROUP BY YEAR(post_date) ORDER BY YEAR DESC", nativeQuery = true)
List findPostGroupByYear();
+
+ /**
+ * @return List
+ * @Author Aquan
+ * @Description 查询文章归档信息 查询所有文章
+ * @Date 2019.1.4 11:19
+ * @Param
+ **/
+ @Query(value = "SELECT *,YEAR(post_date) AS YEAR FROM halo_post WHERE post_status=0 AND post_type='post' ORDER BY post_date DESC", nativeQuery = true)
+ List findAllPost();
+
+ /**
+ * @return Integer
+ * @Author Aquan
+ * @Description 查询文章总数
+ * @Date 2019.1.4 15:03
+ * @Param
+ **/
+ @Query(value = "SELECT count(1) AS COUNT FROM halo_post WHERE post_status=0 AND post_type='post'", nativeQuery = true)
+ Integer totalAllPostCount();
+
+
/**
* 根据年份和月份查询文章
*
@@ -137,7 +160,7 @@ public interface PostRepository extends JpaRepository {
* @param month month
* @return List
*/
- @Query(value = "select *,year(post_date) as year,month(post_date) as month from halo_post where post_status=0 and post_type='post' and year(post_date)=:year and month(post_date)=:month order by post_date desc", nativeQuery = true)
+ @Query(value = "SELECT *,YEAR(post_date) AS YEAR,MONTH(post_date) AS MONTH FROM halo_post WHERE post_status=0 and post_type='post' AND YEAR(post_date)=:year AND MONTH(post_date)=:month ORDER BY post_date DESC", nativeQuery = true)
List findPostByYearAndMonth(@Param("year") String year, @Param("month") String month);
/**
@@ -146,7 +169,7 @@ public interface PostRepository extends JpaRepository {
* @param year year
* @return List
*/
- @Query(value = "select *,year(post_date) as year from halo_post where post_status=0 and post_type='post' and year(post_date)=:year order by post_date desc", nativeQuery = true)
+ @Query(value = "SELECT *,YEAR(post_date) AS YEAR FROM halo_post WHERE post_status=0 AND post_type='post' AND YEAR(post_date)=:year ORDER BY post_date DESC", nativeQuery = true)
List findPostByYear(@Param("year") String year);
/**
@@ -157,7 +180,7 @@ public interface PostRepository extends JpaRepository {
* @param pageable pageable
* @return Page
*/
- @Query(value = "select * from halo_post where post_status=0 and post_type='post' and year(post_date)=:year and month(post_date)=:month order by post_date desc", countQuery = "select count(*) from halo_post where post_status=0 and year(post_date)=:year and month(post_date)=:month", nativeQuery = true)
+ @Query(value = "SELECT * FROM halo_post WHERE post_status=0 and post_type='post' AND YEAR(post_date)=:year AND MONTH(post_date)=:month ORDER BY post_date DESC", countQuery = "SELECT COUNT(*) FROM halo_post WHERE post_status=0 AND YEAR(post_date)=:year AND MONTH(post_date)=:month", nativeQuery = true)
Page findPostByYearAndMonth(@Param("year") String year, @Param("month") String month, Pageable pageable);
/**
@@ -188,16 +211,6 @@ public interface PostRepository extends JpaRepository {
*/
List findPostsByTags(Tag tag);
- /**
- * 模糊查询文章
- *
- * @param keyword 关键词
- * @param pageable 分页信息
- * @return Page
- */
- @Query(value = "select * from halo_post where post_status = 0 and post_type='post' and post_title like '%=:keyword%' or post_content like '%=:keyword%'", nativeQuery = true)
- Page findPostByPostTitleLikeOrPostContentLikeAndPostTypeAndPostStatus(String keyword, Pageable pageable);
-
/**
* 按热度从大到小排序
*
@@ -211,7 +224,7 @@ public interface PostRepository extends JpaRepository {
*
* @return Long
*/
- @Query(value = "select sum(post_views) from halo_post", nativeQuery = true)
+ @Query(value = "SELECT SUM(post_views) FROM halo_post", nativeQuery = true)
Long getPostViewsSum();
/**
@@ -222,4 +235,13 @@ public interface PostRepository extends JpaRepository {
* @return 文章数量
*/
Integer countAllByPostStatusAndPostType(Integer status, String postType);
+
+ /**
+ * 获取指定条数的文章
+ *
+ * @param limit 条数
+ * @return List
+ */
+ @Query(value = "SELECT * FROM halo_post WHERE post_status = 0 AND post_type = 'post' ORDER BY post_date DESC LIMIT :limit", nativeQuery = true)
+ List getPostsByLimit(@Param(value = "limit") int limit);
}
diff --git a/src/main/java/cc/ryanc/halo/service/AttachmentService.java b/src/main/java/cc/ryanc/halo/service/AttachmentService.java
index a59ed44fb..c5c724b99 100644
--- a/src/main/java/cc/ryanc/halo/service/AttachmentService.java
+++ b/src/main/java/cc/ryanc/halo/service/AttachmentService.java
@@ -3,8 +3,11 @@ package cc.ryanc.halo.service;
import cc.ryanc.halo.model.domain.Attachment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletRequest;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
/**
@@ -23,14 +26,14 @@ public interface AttachmentService {
* @param attachment attachment
* @return Attachment
*/
- Attachment saveByAttachment(Attachment attachment);
+ Attachment save(Attachment attachment);
/**
* 查询所有附件信息
*
* @return List
*/
- List findAllAttachments();
+ List findAll();
/**
* 查询所有附件,分页
@@ -38,7 +41,7 @@ public interface AttachmentService {
* @param pageable pageable
* @return Page
*/
- Page findAllAttachments(Pageable pageable);
+ Page findAll(Pageable pageable);
/**
* 根据编号查询
@@ -54,5 +57,64 @@ public interface AttachmentService {
* @param attachId attachId
* @return Attachment
*/
- Attachment removeByAttachId(Long attachId);
+ Attachment remove(Long attachId);
+
+ /**
+ * 上传转发
+ *
+ * @param file file
+ * @param request request
+ * @return Map
+ */
+ Map upload(MultipartFile file, HttpServletRequest request);
+
+ /**
+ * 原生服务器上传
+ *
+ * @param file file
+ * @param request request
+ * @return Map
+ */
+ Map attachUpload(MultipartFile file, HttpServletRequest request);
+
+ /**
+ * 七牛云上传
+ *
+ * @param file file
+ * @param request request
+ * @return Map
+ */
+ Map attachQiNiuUpload(MultipartFile file, HttpServletRequest request);
+
+ /**
+ * 又拍云上传
+ *
+ * @param file file
+ * @param request request
+ * @return Map
+ */
+ Map attachUpYunUpload(MultipartFile file, HttpServletRequest request);
+
+ /**
+ * 七牛云删除附件
+ *
+ * @param key key
+ * @return boolean
+ */
+ boolean deleteQiNiuAttachment(String key);
+
+ /**
+ * 又拍云删除附件
+ *
+ * @param fileName fileName
+ * @return boolean
+ */
+ boolean deleteUpYunAttachment(String fileName);
+
+ /**
+ * 获取附件总数
+ *
+ * @return Long
+ */
+ Long getCount();
}
diff --git a/src/main/java/cc/ryanc/halo/service/CategoryService.java b/src/main/java/cc/ryanc/halo/service/CategoryService.java
index 6055be016..0e481fa9f 100755
--- a/src/main/java/cc/ryanc/halo/service/CategoryService.java
+++ b/src/main/java/cc/ryanc/halo/service/CategoryService.java
@@ -21,7 +21,7 @@ public interface CategoryService {
* @param category 分类目录
* @return 如果插入成功,返回分类目录对象
*/
- Category saveByCategory(Category category);
+ Category save(Category category);
/**
* 根据编号删除分类目录
@@ -29,14 +29,14 @@ public interface CategoryService {
* @param cateId 分类目录编号
* @return category
*/
- Category removeByCateId(Long cateId);
+ Category remove(Long cateId);
/**
* 获取所有分类目录
*
* @return 返回List集合
*/
- List findAllCategories();
+ List findAll();
/**
* 根据编号查询单个分类
@@ -54,6 +54,14 @@ public interface CategoryService {
*/
Category findByCateUrl(String cateUrl);
+ /**
+ * 根据分类名称查询
+ *
+ * @param cateName 分类名称
+ * @return Category
+ */
+ Category findByCateName(String cateName);
+
/**
* 将分类字符串集合转化为Category泛型集合
*
diff --git a/src/main/java/cc/ryanc/halo/service/CommentService.java b/src/main/java/cc/ryanc/halo/service/CommentService.java
index 4500ceece..0314ca294 100644
--- a/src/main/java/cc/ryanc/halo/service/CommentService.java
+++ b/src/main/java/cc/ryanc/halo/service/CommentService.java
@@ -23,7 +23,7 @@ public interface CommentService {
*
* @param comment comment
*/
- void saveByComment(Comment comment);
+ void save(Comment comment);
/**
* 删除评论
@@ -31,7 +31,7 @@ public interface CommentService {
* @param commentId commentId
* @return Optional
*/
- Optional removeByCommentId(Long commentId);
+ Optional remove(Long commentId);
/**
* 查询所有的评论,用于后台管理
@@ -40,7 +40,7 @@ public interface CommentService {
* @param pageable pageable
* @return Page
*/
- Page findAllComments(Integer status, Pageable pageable);
+ Page findAll(Integer status, Pageable pageable);
/**
* 根据评论状态查询评论
@@ -48,14 +48,14 @@ public interface CommentService {
* @param status 评论状态
* @return List
*/
- List findAllComments(Integer status);
+ List findAll(Integer status);
/**
* 查询所有评论,不分页
*
* @return List
*/
- List findAllComments();
+ List findAll();
/**
* 更改评论的状态
@@ -125,4 +125,19 @@ public interface CommentService {
* @return 评论数量
*/
Integer getCountByStatus(Integer status);
+
+ /**
+ * 查询评论总数
+ *
+ * @return Long
+ */
+ Long getCount();
+
+ /**
+ * 获取最近的评论
+ *
+ * @param limit limit
+ * @return List
+ */
+ List getRecentComments(int limit);
}
diff --git a/src/main/java/cc/ryanc/halo/service/GalleryService.java b/src/main/java/cc/ryanc/halo/service/GalleryService.java
index 87672b73e..30879d9df 100644
--- a/src/main/java/cc/ryanc/halo/service/GalleryService.java
+++ b/src/main/java/cc/ryanc/halo/service/GalleryService.java
@@ -23,7 +23,7 @@ public interface GalleryService {
* @param gallery gallery
* @return Gallery
*/
- Gallery saveByGallery(Gallery gallery);
+ Gallery save(Gallery gallery);
/**
* 根据编号删除图片
@@ -31,15 +31,7 @@ public interface GalleryService {
* @param galleryId galleryId
* @return Gallery
*/
- Gallery removeByGalleryId(Long galleryId);
-
- /**
- * 修改图片信息
- *
- * @param gallery gallery
- * @return Gallery
- */
- Gallery updateByGallery(Gallery gallery);
+ Gallery remove(Long galleryId);
/**
* 查询所有图片 分页
@@ -47,14 +39,14 @@ public interface GalleryService {
* @param pageable pageable
* @return Page
*/
- Page findAllGalleries(Pageable pageable);
+ Page findAll(Pageable pageable);
/**
* 查询所有图片 不分页
*
* @return List
*/
- List findAllGalleries();
+ List findAll();
/**
* 根据编号查询图片信息
diff --git a/src/main/java/cc/ryanc/halo/service/LinkService.java b/src/main/java/cc/ryanc/halo/service/LinkService.java
index 030b6922b..be35a639a 100755
--- a/src/main/java/cc/ryanc/halo/service/LinkService.java
+++ b/src/main/java/cc/ryanc/halo/service/LinkService.java
@@ -21,7 +21,7 @@ public interface LinkService {
* @param link link
* @return Link
*/
- Link saveByLink(Link link);
+ Link save(Link link);
/**
* 根据编号删除
@@ -29,14 +29,14 @@ public interface LinkService {
* @param linkId linkId
* @return Link
*/
- Link removeByLinkId(Long linkId);
+ Link remove(Long linkId);
/**
* 查询所有
*
* @return List
*/
- List findAllLinks();
+ List findAll();
/**
* 根据编号查询单个链接
diff --git a/src/main/java/cc/ryanc/halo/service/LogsService.java b/src/main/java/cc/ryanc/halo/service/LogsService.java
index 750d5bd1e..f8698b2b8 100644
--- a/src/main/java/cc/ryanc/halo/service/LogsService.java
+++ b/src/main/java/cc/ryanc/halo/service/LogsService.java
@@ -4,8 +4,8 @@ import cc.ryanc.halo.model.domain.Logs;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
+import javax.servlet.http.HttpServletRequest;
import java.util.List;
-import java.util.Optional;
/**
*
@@ -20,22 +20,16 @@ public interface LogsService {
/**
* 保存日志
*
- * @param logs logs
- * @return Logs
+ * @param logTitle logTitle
+ * @param logContent logContent
+ * @param request request
*/
- Logs saveByLogs(Logs logs);
-
- /**
- * 根据编号移除
- *
- * @param logsId logsId
- */
- void removeByLogsId(Long logsId);
+ void save(String logTitle, String logContent, HttpServletRequest request);
/**
* 移除所有日志
*/
- void removeAllLogs();
+ void removeAll();
/**
* 查询所有日志并分页
@@ -43,7 +37,7 @@ public interface LogsService {
* @param pageable pageable
* @return Page
*/
- Page findAllLogs(Pageable pageable);
+ Page findAll(Pageable pageable);
/**
* 查询最新的五条日志
@@ -51,12 +45,4 @@ public interface LogsService {
* @return List
*/
List findLogsLatest();
-
- /**
- * 根据编号查询
- *
- * @param logsId logsId
- * @return Optional
- */
- Optional findLogsByLogsId(Long logsId);
}
diff --git a/src/main/java/cc/ryanc/halo/service/MenuService.java b/src/main/java/cc/ryanc/halo/service/MenuService.java
index 2d67f5f77..759ec2a8b 100644
--- a/src/main/java/cc/ryanc/halo/service/MenuService.java
+++ b/src/main/java/cc/ryanc/halo/service/MenuService.java
@@ -21,14 +21,14 @@ public interface MenuService {
* @param menu menu
* @return Menu
*/
- Menu saveByMenu(Menu menu);
+ Menu save(Menu menu);
/**
* 查询所有菜单
*
* @return List
*/
- List findAllMenus();
+ List findAll();
/**
* 删除菜单
@@ -36,7 +36,7 @@ public interface MenuService {
* @param menuId menuId
* @return Menu
*/
- Menu removeByMenuId(Long menuId);
+ Menu remove(Long menuId);
/**
* 根据编号查询菜单
diff --git a/src/main/java/cc/ryanc/halo/service/PostService.java b/src/main/java/cc/ryanc/halo/service/PostService.java
index 452285ba3..2a5bd1131 100755
--- a/src/main/java/cc/ryanc/halo/service/PostService.java
+++ b/src/main/java/cc/ryanc/halo/service/PostService.java
@@ -6,6 +6,7 @@ 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.web.bind.annotation.RequestParam;
import java.util.Date;
import java.util.List;
@@ -27,7 +28,7 @@ public interface PostService {
* @param post Post
* @return Post
*/
- Post saveByPost(Post post);
+ Post save(Post post);
/**
* 根据编号删除文章
@@ -35,7 +36,7 @@ public interface PostService {
* @param postId postId
* @return Post
*/
- Post removeByPostId(Long postId);
+ Post remove(Long postId);
/**
* 修改文章状态
@@ -46,13 +47,6 @@ public interface PostService {
*/
Post updatePostStatus(Long postId, Integer status);
- /**
- * 修改文章阅读量
- *
- * @param post post
- */
- void updatePostView(Post post);
-
/**
* 批量修改摘要
*
@@ -60,31 +54,24 @@ public interface PostService {
*/
void updateAllSummary(Integer postSummary);
- /**
- * 获取文章列表 分页
- *
- * @param postType post or page
- * @param pageable 分页信息
- * @return Page
- */
- Page findAllPosts(String postType, Pageable pageable);
-
/**
* 获取文章列表 不分页
*
* @param postType post or page
* @return List
*/
- List findAllPosts(String postType);
+ List findAll(String postType);
/**
* 模糊查询文章
*
- * @param keyWord keyword
- * @param pageable pageable
- * @return List
+ * @param keyword 关键词
+ * @param postType 文章类型
+ * @param postStatus 文章状态
+ * @param pageable 分页信息
+ * @return Page
*/
- List searchPosts(String keyWord, Pageable pageable);
+ Page searchPosts(String keyword, String postType, Integer postStatus, Pageable pageable);
/**
* 根据文章状态查询 分页,用于后台管理
@@ -147,20 +134,20 @@ public interface PostService {
List findPostLatest();
/**
- * 查询Id之后的文章
+ * 获取下一篇文章 较新
*
* @param postDate postDate
- * @return List
+ * @return Post
*/
- List findByPostDateAfter(Date postDate);
+ Post getNextPost(Date postDate);
/**
- * 查询Id之前的文章
+ * 获取下一篇文章 较老
*
* @param postDate postDate
- * @return List
+ * @return Post
*/
- List findByPostDateBefore(Date postDate);
+ Post getPrePost(Date postDate);
/**
* 查询归档信息 根据年份和月份
@@ -176,6 +163,16 @@ public interface PostService {
*/
List findPostGroupByYear();
+ /**
+ * @return List
+ * @Author Aquan
+ * @Description 查询归档信息 查看所有文章
+ * @Date 2019.1.4 11:14
+ * @Param
+ **/
+ List findAllPost();
+
+
/**
* 根据年份和月份查询文章
*
@@ -221,15 +218,6 @@ public interface PostService {
*/
Page findPostsByTags(Tag tag, Pageable pageable);
- /**
- * 搜索文章
- *
- * @param keyword 关键词
- * @param pageable 分页信息
- * @return Page
- */
- Page searchByKeywords(String keyword, Pageable pageable);
-
/**
* 热门文章
*
@@ -275,4 +263,29 @@ public interface PostService {
* @return String
*/
String buildSiteMap(List posts);
+
+ /**
+ * 缓存阅读数
+ *
+ * @param postId postId
+ */
+ void cacheViews(Long postId);
+
+ /**
+ * 组装分类目录和标签
+ *
+ * @param post post
+ * @param cateList cateList
+ * @param tagList tagList
+ * @return Post Post
+ */
+ Post buildCategoriesAndTags(Post post, List cateList, @RequestParam("tagList") String tagList);
+
+ /**
+ * 获取最近的文章
+ *
+ * @param limit 条数
+ * @return List
+ */
+ List getRecentPosts(int limit);
}
diff --git a/src/main/java/cc/ryanc/halo/service/TagService.java b/src/main/java/cc/ryanc/halo/service/TagService.java
index c6c5991fb..af334a3e7 100644
--- a/src/main/java/cc/ryanc/halo/service/TagService.java
+++ b/src/main/java/cc/ryanc/halo/service/TagService.java
@@ -21,7 +21,7 @@ public interface TagService {
* @param tag tag
* @return Tag
*/
- Tag saveByTag(Tag tag);
+ Tag save(Tag tag);
/**
* 根据编号移除标签
@@ -29,14 +29,14 @@ public interface TagService {
* @param tagId tagId
* @return Tag
*/
- Tag removeByTagId(Long tagId);
+ Tag remove(Long tagId);
/**
* 获取所有标签
*
* @return List
*/
- List findAllTags();
+ List findAll();
/**
* 根据编号查询标签
diff --git a/src/main/java/cc/ryanc/halo/service/UserService.java b/src/main/java/cc/ryanc/halo/service/UserService.java
index 273454d9c..e65c6be86 100755
--- a/src/main/java/cc/ryanc/halo/service/UserService.java
+++ b/src/main/java/cc/ryanc/halo/service/UserService.java
@@ -19,7 +19,7 @@ public interface UserService {
*
* @param user user
*/
- void saveByUser(User user);
+ void save(User user);
/**
* 根据用户名和密码查询,用于登录
diff --git a/src/main/java/cc/ryanc/halo/service/impl/AttachmentServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/AttachmentServiceImpl.java
index 2eee54a03..2431be8c8 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/AttachmentServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/AttachmentServiceImpl.java
@@ -1,17 +1,46 @@
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;
import cc.ryanc.halo.repository.AttachmentRepository;
import cc.ryanc.halo.service.AttachmentService;
+import cc.ryanc.halo.utils.HaloUtils;
+import cc.ryanc.halo.utils.Md5Util;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.text.StrBuilder;
+import cn.hutool.core.util.StrUtil;
+import com.UpYun;
+import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
+import com.qiniu.common.QiniuException;
+import com.qiniu.common.Zone;
+import com.qiniu.http.Response;
+import com.qiniu.storage.BucketManager;
+import com.qiniu.storage.Configuration;
+import com.qiniu.storage.UploadManager;
+import com.qiniu.storage.persistent.FileRecorder;
+import com.qiniu.util.Auth;
+import com.qiniu.util.StringMap;
+import com.upyun.UpException;
+import net.coobird.thumbnailator.Thumbnails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
-import java.util.List;
-import java.util.Optional;
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.*;
/**
*
@@ -37,7 +66,7 @@ public class AttachmentServiceImpl implements AttachmentService {
*/
@Override
@CacheEvict(value = ATTACHMENTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Attachment saveByAttachment(Attachment attachment) {
+ public Attachment save(Attachment attachment) {
return attachmentRepository.save(attachment);
}
@@ -48,7 +77,7 @@ public class AttachmentServiceImpl implements AttachmentService {
*/
@Override
@Cacheable(value = ATTACHMENTS_CACHE_NAME, key = "'attachment'")
- public List findAllAttachments() {
+ public List findAll() {
return attachmentRepository.findAll();
}
@@ -59,7 +88,7 @@ public class AttachmentServiceImpl implements AttachmentService {
* @return Page
*/
@Override
- public Page findAllAttachments(Pageable pageable) {
+ public Page findAll(Pageable pageable) {
return attachmentRepository.findAll(pageable);
}
@@ -82,9 +111,307 @@ public class AttachmentServiceImpl implements AttachmentService {
*/
@Override
@CacheEvict(value = ATTACHMENTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Attachment removeByAttachId(Long attachId) {
+ public Attachment remove(Long attachId) {
Optional attachment = this.findByAttachId(attachId);
- attachmentRepository.delete(attachment.get());
- return attachment.get();
+ attachmentRepository.delete(attachment.orElse(null));
+ return attachment.orElse(null);
+ }
+
+ /**
+ * 上传转发
+ *
+ * @param file file
+ * @param request request
+ * @return Map
+ */
+ @Override
+ public Map upload(MultipartFile file, HttpServletRequest request) {
+ Map resultMap;
+ String attachLoc = HaloConst.OPTIONS.get(BlogPropertiesEnum.ATTACH_LOC.getProp());
+ if (StrUtil.isEmpty(attachLoc)) {
+ attachLoc = "server";
+ }
+ switch (attachLoc) {
+ case "server":
+ resultMap = this.attachUpload(file, request);
+ break;
+ case "qiniu":
+ resultMap = this.attachQiNiuUpload(file, request);
+ break;
+ case "upyun":
+ resultMap = this.attachUpYunUpload(file, request);
+ break;
+ default:
+ resultMap = this.attachUpload(file, request);
+ break;
+ }
+ return resultMap;
+ }
+
+ /**
+ * 原生服务器上传
+ *
+ * @param file file
+ * @param request request
+ * @return Map
+ */
+ @Override
+ public Map attachUpload(MultipartFile file, HttpServletRequest request) {
+ final Map resultMap = new HashMap<>(6);
+ final String dateString = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss");
+ try {
+ //用户目录
+ final StrBuilder uploadPath = new StrBuilder(System.getProperties().getProperty("user.home"));
+ uploadPath.append("/halo/");
+ uploadPath.append("upload/");
+
+ //获取当前年月以创建目录,如果没有该目录则创建
+ uploadPath.append(DateUtil.thisYear()).append("/").append(DateUtil.thisMonth()).append("/");
+ final File mediaPath = new File(uploadPath.toString());
+ if (!mediaPath.exists()) {
+ if (!mediaPath.mkdirs()) {
+ resultMap.put("success", "0");
+ return resultMap;
+ }
+ }
+
+ //不带后缀
+ final StrBuilder nameWithOutSuffix = new StrBuilder(file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf('.')).replaceAll(" ", "_").replaceAll(",", ""));
+ nameWithOutSuffix.append(dateString);
+ nameWithOutSuffix.append(new Random().nextInt(1000));
+
+ //文件后缀
+ final String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.') + 1);
+
+ //带后缀
+ final StrBuilder fileName = new StrBuilder(nameWithOutSuffix);
+ fileName.append(".");
+ fileName.append(fileSuffix);
+
+ file.transferTo(new File(mediaPath.getAbsoluteFile(), fileName.toString()));
+
+ //文件原路径
+ final StrBuilder fullPath = new StrBuilder(mediaPath.getAbsolutePath());
+ fullPath.append("/");
+ fullPath.append(fileName);
+
+ //压缩文件路径
+ final StrBuilder fullSmallPath = new StrBuilder(mediaPath.getAbsolutePath());
+ fullSmallPath.append("/");
+ fullSmallPath.append(nameWithOutSuffix);
+ fullSmallPath.append("_small.");
+ fullSmallPath.append(fileSuffix);
+
+ //压缩图片
+ Thumbnails.of(fullPath.toString()).size(256, 256).keepAspectRatio(false).toFile(fullSmallPath.toString());
+
+ //映射路径
+ final StrBuilder filePath = new StrBuilder("/upload/");
+ filePath.append(DateUtil.thisYear());
+ filePath.append("/");
+ filePath.append(DateUtil.thisMonth());
+ filePath.append("/");
+ filePath.append(fileName);
+
+ //缩略图映射路径
+ final StrBuilder fileSmallPath = new StrBuilder("/upload/");
+ fileSmallPath.append(DateUtil.thisYear());
+ fileSmallPath.append("/");
+ fileSmallPath.append(DateUtil.thisMonth());
+ fileSmallPath.append("/");
+ fileSmallPath.append(nameWithOutSuffix);
+ fileSmallPath.append("_small.");
+ fileSmallPath.append(fileSuffix);
+
+ final String size = HaloUtils.parseSize(new File(fullPath.toString()).length());
+ final String wh = HaloUtils.getImageWh(new File(fullPath.toString()));
+
+ resultMap.put("fileName", fileName.toString());
+ resultMap.put("filePath", filePath.toString());
+ resultMap.put("smallPath", fileSmallPath.toString());
+ resultMap.put("suffix", fileSuffix);
+ resultMap.put("size", size);
+ resultMap.put("wh", wh);
+ resultMap.put("location", AttachLocationEnum.SERVER.getDesc());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return resultMap;
+ }
+
+ /**
+ * 七牛云上传
+ *
+ * @param file file
+ * @param request request
+ * @return Map
+ */
+ @Override
+ public Map attachQiNiuUpload(MultipartFile file, HttpServletRequest request) {
+ final Map resultMap = new HashMap<>(6);
+ 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");
+ if (StrUtil.isEmpty(accessKey) || StrUtil.isEmpty(secretKey) || StrUtil.isEmpty(domain) || StrUtil.isEmpty(bucket)) {
+ return resultMap;
+ }
+ final Auth auth = Auth.create(accessKey, secretKey);
+ final StringMap putPolicy = new StringMap();
+ putPolicy.put("returnBody", "{\"size\":$(fsize),\"w\":$(imageInfo.width),\"h\":$(imageInfo.height)}");
+ final String upToken = auth.uploadToken(bucket, null, 3600, putPolicy);
+ final String localTempDir = Paths.get(System.getenv("java.io.tmpdir"), bucket).toString();
+ QiNiuPutSet putSet = new QiNiuPutSet();
+ try {
+ final FileRecorder fileRecorder = new FileRecorder(localTempDir);
+ final UploadManager uploadManager = new UploadManager(cfg, fileRecorder);
+ final Response response = uploadManager.put(file.getInputStream(), key, upToken, null, null);
+ //解析上传成功的结果
+ putSet = new Gson().fromJson(response.bodyString(), QiNiuPutSet.class);
+ } catch (QiniuException e) {
+ final Response r = e.response;
+ System.err.println(r.toString());
+ try {
+ System.err.println(r.bodyString());
+ } catch (QiniuException ex2) {
+ //ignore
+ }
+ } catch (JsonSyntaxException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ final String filePath = domain.trim() + "/" + key;
+ resultMap.put("fileName", file.getOriginalFilename());
+ resultMap.put("filePath", filePath.trim());
+ resultMap.put("smallPath", smallUrl == null ? filePath.trim() : (filePath + smallUrl).trim());
+ resultMap.put("suffix", file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.')));
+ resultMap.put("size", HaloUtils.parseSize(file.getSize()));
+ resultMap.put("wh", putSet.getW() + "x" + putSet.getH());
+ resultMap.put("location", AttachLocationEnum.QINIU.getDesc());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return resultMap;
+ }
+
+ /**
+ * 又拍云上传
+ *
+ * @param file file
+ * @param request request
+ * @return Map
+ */
+ @Override
+ public Map attachUpYunUpload(MultipartFile file, HttpServletRequest request) {
+ final Map 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");
+ if (StrUtil.isEmpty(ossSrc) || StrUtil.isEmpty(ossPwd) || StrUtil.isEmpty(domain) || StrUtil.isEmpty(bucket) || StrUtil.isEmpty(operator)) {
+ return resultMap;
+ }
+ final String fileName = file.getOriginalFilename();
+ final String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
+ final UpYun upYun = new UpYun(bucket, operator, ossPwd);
+ upYun.setTimeout(60);
+ upYun.setApiDomain(UpYun.ED_AUTO);
+ upYun.setDebug(true);
+ upYun.writeFile(ossSrc + key + fileSuffix, file.getBytes(), true, null);
+ final String filePath = domain.trim() + ossSrc + key + fileSuffix;
+ String smallPath = filePath;
+ if (smallUrl != null) {
+ smallPath += smallUrl;
+ }
+ final BufferedImage image = ImageIO.read(file.getInputStream());
+ if (image != null) {
+ resultMap.put("wh", image.getWidth() + "x" + image.getHeight());
+ }
+ resultMap.put("fileName", fileName);
+ resultMap.put("filePath", filePath.trim());
+ resultMap.put("smallPath", smallPath.trim());
+ resultMap.put("suffix", fileSuffix);
+ resultMap.put("size", HaloUtils.parseSize(file.getSize()));
+ resultMap.put("location", AttachLocationEnum.UPYUN.getDesc());
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return resultMap;
+ }
+
+ /**
+ * 七牛云删除附件
+ *
+ * @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");
+ if (StrUtil.isEmpty(accessKey) || StrUtil.isEmpty(secretKey) || StrUtil.isEmpty(bucket)) {
+ return false;
+ }
+ final Auth auth = Auth.create(accessKey, secretKey);
+ final BucketManager bucketManager = new BucketManager(auth, cfg);
+ try {
+ bucketManager.delete(bucket, key);
+ } catch (QiniuException ex) {
+ System.err.println(ex.code());
+ System.err.println(ex.response.toString());
+ flag = false;
+ }
+ return flag;
+ }
+
+ /**
+ * 又拍云删除附件
+ *
+ * @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");
+ if (StrUtil.isEmpty(ossSrc) || StrUtil.isEmpty(ossPwd) || StrUtil.isEmpty(bucket) || StrUtil.isEmpty(operator)) {
+ return false;
+ }
+ final UpYun upYun = new UpYun(bucket, operator, ossPwd);
+ upYun.setApiDomain(UpYun.ED_AUTO);
+ try {
+ flag = upYun.deleteFile(ossSrc + fileName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (UpException e) {
+ e.printStackTrace();
+ }
+ return flag;
+ }
+
+ /**
+ * 获取附件总数
+ *
+ * @return Long
+ */
+ @Override
+ public Long getCount() {
+ return attachmentRepository.count();
}
}
diff --git a/src/main/java/cc/ryanc/halo/service/impl/CategoryServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/CategoryServiceImpl.java
index 1fc046db5..bcc692e41 100755
--- a/src/main/java/cc/ryanc/halo/service/impl/CategoryServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/CategoryServiceImpl.java
@@ -4,6 +4,7 @@ import cc.ryanc.halo.model.domain.Category;
import cc.ryanc.halo.repository.CategoryRepository;
import cc.ryanc.halo.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@@ -21,6 +22,8 @@ import java.util.Optional;
@Service
public class CategoryServiceImpl implements CategoryService {
+ private static final String POSTS_CACHE_NAME = "posts";
+
@Autowired
private CategoryRepository categoryRepository;
@@ -31,7 +34,8 @@ public class CategoryServiceImpl implements CategoryService {
* @return Category
*/
@Override
- public Category saveByCategory(Category category) {
+ @CacheEvict(value = POSTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
+ public Category save(Category category) {
return categoryRepository.save(category);
}
@@ -42,10 +46,11 @@ public class CategoryServiceImpl implements CategoryService {
* @return Category
*/
@Override
- public Category removeByCateId(Long cateId) {
- Optional category = this.findByCateId(cateId);
- categoryRepository.delete(category.get());
- return category.get();
+ @CacheEvict(value = POSTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
+ public Category remove(Long cateId) {
+ final Optional category = this.findByCateId(cateId);
+ categoryRepository.delete(category.orElse(null));
+ return category.orElse(null);
}
/**
@@ -54,7 +59,7 @@ public class CategoryServiceImpl implements CategoryService {
* @return List
*/
@Override
- public List findAllCategories() {
+ public List findAll() {
return categoryRepository.findAll();
}
@@ -80,6 +85,17 @@ public class CategoryServiceImpl implements CategoryService {
return categoryRepository.findCategoryByCateUrl(cateUrl);
}
+ /**
+ * 根据分类名称查询
+ *
+ * @param cateName 分类名称
+ * @return Category
+ */
+ @Override
+ public Category findByCateName(String cateName) {
+ return categoryRepository.findCategoryByCateName(cateName);
+ }
+
/**
* 将分类字符串集合转化为Category泛型集合
*
@@ -91,7 +107,7 @@ public class CategoryServiceImpl implements CategoryService {
if (null == strings) {
return null;
}
- List categories = new ArrayList<>();
+ final List categories = new ArrayList<>();
Optional category = null;
for (String str : strings) {
category = findByCateId(Long.parseLong(str));
diff --git a/src/main/java/cc/ryanc/halo/service/impl/CommentServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/CommentServiceImpl.java
index 27465fb0a..8f4a7f145 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/CommentServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/CommentServiceImpl.java
@@ -40,7 +40,7 @@ public class CommentServiceImpl implements CommentService {
*/
@Override
@CacheEvict(value = {COMMENTS_CACHE_NAME, POSTS_CACHE_NAME}, allEntries = true, beforeInvocation = true)
- public void saveByComment(Comment comment) {
+ public void save(Comment comment) {
commentRepository.save(comment);
}
@@ -52,9 +52,9 @@ public class CommentServiceImpl implements CommentService {
*/
@Override
@CacheEvict(value = {COMMENTS_CACHE_NAME, POSTS_CACHE_NAME}, allEntries = true, beforeInvocation = true)
- public Optional removeByCommentId(Long commentId) {
- Optional comment = this.findCommentById(commentId);
- commentRepository.delete(comment.get());
+ public Optional remove(Long commentId) {
+ final Optional comment = this.findCommentById(commentId);
+ commentRepository.delete(comment.orElse(null));
return comment;
}
@@ -65,7 +65,7 @@ public class CommentServiceImpl implements CommentService {
* @return Page
*/
@Override
- public Page findAllComments(Integer status, Pageable pageable) {
+ public Page findAll(Integer status, Pageable pageable) {
return commentRepository.findCommentsByCommentStatus(status, pageable);
}
@@ -77,7 +77,7 @@ public class CommentServiceImpl implements CommentService {
*/
@Override
@CachePut(value = COMMENTS_CACHE_NAME, key = "'comments_status_'+#status")
- public List findAllComments(Integer status) {
+ public List findAll(Integer status) {
return commentRepository.findCommentsByCommentStatus(status);
}
@@ -88,7 +88,7 @@ public class CommentServiceImpl implements CommentService {
*/
@Override
@Cacheable(value = COMMENTS_CACHE_NAME, key = "'comment'")
- public List findAllComments() {
+ public List findAll() {
return commentRepository.findAll();
}
@@ -102,7 +102,7 @@ public class CommentServiceImpl implements CommentService {
@Override
@CacheEvict(value = COMMENTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
public Comment updateCommentStatus(Long commentId, Integer status) {
- Optional comment = findCommentById(commentId);
+ final Optional comment = findCommentById(commentId);
comment.get().setCommentStatus(status);
return commentRepository.save(comment.get());
}
@@ -188,4 +188,25 @@ public class CommentServiceImpl implements CommentService {
public Integer getCountByStatus(Integer status) {
return commentRepository.countAllByCommentStatus(status);
}
+
+ /**
+ * 查询评论总数
+ *
+ * @return Long
+ */
+ @Override
+ public Long getCount() {
+ return commentRepository.count();
+ }
+
+ /**
+ * 获取最近的评论
+ *
+ * @param limit limit
+ * @return List
+ */
+ @Override
+ public List getRecentComments(int limit) {
+ return commentRepository.getCommentsByLimit(limit);
+ }
}
diff --git a/src/main/java/cc/ryanc/halo/service/impl/GalleryServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/GalleryServiceImpl.java
index afe3ec669..e58625fd4 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/GalleryServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/GalleryServiceImpl.java
@@ -37,7 +37,7 @@ public class GalleryServiceImpl implements GalleryService {
*/
@Override
@CacheEvict(value = GALLERIES_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Gallery saveByGallery(Gallery gallery) {
+ public Gallery save(Gallery gallery) {
return galleryRepository.save(gallery);
}
@@ -49,24 +49,12 @@ public class GalleryServiceImpl implements GalleryService {
*/
@Override
@CacheEvict(value = GALLERIES_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Gallery removeByGalleryId(Long galleryId) {
- Optional gallery = this.findByGalleryId(galleryId);
+ public Gallery remove(Long galleryId) {
+ final Optional gallery = this.findByGalleryId(galleryId);
galleryRepository.delete(gallery.get());
return gallery.get();
}
- /**
- * 修改图片信息
- *
- * @param gallery gallery
- * @return Gallery
- */
- @Override
- @CacheEvict(value = GALLERIES_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Gallery updateByGallery(Gallery gallery) {
- return galleryRepository.save(gallery);
- }
-
/**
* 查询所有图片 分页
*
@@ -74,7 +62,7 @@ public class GalleryServiceImpl implements GalleryService {
* @return Page
*/
@Override
- public Page findAllGalleries(Pageable pageable) {
+ public Page findAll(Pageable pageable) {
return galleryRepository.findAll(pageable);
}
@@ -85,7 +73,7 @@ public class GalleryServiceImpl implements GalleryService {
*/
@Override
@Cacheable(value = GALLERIES_CACHE_NAME, key = "'gallery'")
- public List findAllGalleries() {
+ public List findAll() {
return galleryRepository.findAll();
}
diff --git a/src/main/java/cc/ryanc/halo/service/impl/LinkServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/LinkServiceImpl.java
index c33b5bcd1..8ac598757 100755
--- a/src/main/java/cc/ryanc/halo/service/impl/LinkServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/LinkServiceImpl.java
@@ -37,7 +37,7 @@ public class LinkServiceImpl implements LinkService {
*/
@Override
@CacheEvict(value = LINKS_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Link saveByLink(Link link) {
+ public Link save(Link link) {
return linkRepository.save(link);
}
@@ -49,8 +49,8 @@ public class LinkServiceImpl implements LinkService {
*/
@Override
@CacheEvict(value = LINKS_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Link removeByLinkId(Long linkId) {
- Optional link = this.findByLinkId(linkId);
+ public Link remove(Long linkId) {
+ final Optional link = this.findByLinkId(linkId);
linkRepository.delete(link.get());
return link.get();
}
@@ -62,7 +62,7 @@ public class LinkServiceImpl implements LinkService {
*/
@Override
@Cacheable(value = LINKS_CACHE_NAME, key = LINKS_CACHE_KEY)
- public List findAllLinks() {
+ public List findAll() {
return linkRepository.findAll();
}
diff --git a/src/main/java/cc/ryanc/halo/service/impl/LogsServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/LogsServiceImpl.java
index 7148bbfca..cf0cd042d 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/LogsServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/LogsServiceImpl.java
@@ -3,13 +3,15 @@ package cc.ryanc.halo.service.impl;
import cc.ryanc.halo.model.domain.Logs;
import cc.ryanc.halo.repository.LogsRepository;
import cc.ryanc.halo.service.LogsService;
+import cn.hutool.extra.servlet.ServletUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
import java.util.List;
-import java.util.Optional;
/**
*
@@ -28,30 +30,24 @@ public class LogsServiceImpl implements LogsService {
/**
* 保存日志
*
- * @param logs logs
- * @return Logs
+ * @param logTitle logTitle
+ * @param logContent logContent
+ * @param request request
*/
@Override
- public Logs saveByLogs(Logs logs) {
- return logsRepository.save(logs);
- }
-
- /**
- * 根据编号移除
- *
- * @param logsId logsId
- */
- @Override
- public void removeByLogsId(Long logsId) {
- Optional logs = this.findLogsByLogsId(logsId);
- logsRepository.delete(logs.get());
+ public void save(String logTitle, String logContent, HttpServletRequest request) {
+ final Logs logs = new Logs();
+ logs.setLogTitle(logTitle);
+ logs.setLogContent(logContent);
+ logs.setLogIp(ServletUtil.getClientIP(request));
+ logsRepository.save(logs);
}
/**
* 移除所有日志
*/
@Override
- public void removeAllLogs() {
+ public void removeAll() {
logsRepository.deleteAll();
}
@@ -62,7 +58,7 @@ public class LogsServiceImpl implements LogsService {
* @return Page
*/
@Override
- public Page findAllLogs(Pageable pageable) {
+ public Page findAll(Pageable pageable) {
return logsRepository.findAll(pageable);
}
@@ -75,15 +71,4 @@ public class LogsServiceImpl implements LogsService {
public List findLogsLatest() {
return logsRepository.findTopFive();
}
-
- /**
- * 根据编号查询
- *
- * @param logsId logsId
- * @return Optional
- */
- @Override
- public Optional findLogsByLogsId(Long logsId) {
- return logsRepository.findById(logsId);
- }
}
diff --git a/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java
index caed6d170..56e69011f 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java
@@ -4,6 +4,7 @@ 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;
+import cn.hutool.core.text.StrBuilder;
import freemarker.template.Template;
import io.github.biezhi.ome.OhMyEmail;
import org.springframework.beans.factory.annotation.Autowired;
@@ -68,14 +69,14 @@ public class MailServiceImpl implements MailService {
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
- String text = "";
+ StrBuilder text = new StrBuilder();
try {
- Template template = freeMarker.getConfiguration().getTemplate(templateName);
- text = FreeMarkerTemplateUtils.processTemplateIntoString(template, content);
+ 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()))
.to(to)
- .html(text)
+ .html(text.toString())
.send();
} catch (Exception e) {
e.printStackTrace();
@@ -99,14 +100,14 @@ public class MailServiceImpl implements MailService {
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
File file = new File(attachSrc);
- String text = "";
+ StrBuilder text = new StrBuilder();
try {
- Template template = freeMarker.getConfiguration().getTemplate(templateName);
- text = FreeMarkerTemplateUtils.processTemplateIntoString(template, content);
+ 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()))
.to(to)
- .html(text)
+ .html(text.toString())
.attach(file, file.getName())
.send();
} catch (Exception e) {
diff --git a/src/main/java/cc/ryanc/halo/service/impl/MenuServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/MenuServiceImpl.java
index d81ead43c..1463b3fe7 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/MenuServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/MenuServiceImpl.java
@@ -36,7 +36,7 @@ public class MenuServiceImpl implements MenuService {
*/
@Override
@Cacheable(value = MENUS_CACHE_NAME, key = MENUS_CACHE_KEY)
- public List findAllMenus() {
+ public List findAll() {
return menuRepository.findAll();
}
@@ -48,7 +48,7 @@ public class MenuServiceImpl implements MenuService {
*/
@Override
@CacheEvict(value = MENUS_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Menu saveByMenu(Menu menu) {
+ public Menu save(Menu menu) {
return menuRepository.save(menu);
}
@@ -60,10 +60,10 @@ public class MenuServiceImpl implements MenuService {
*/
@Override
@CacheEvict(value = MENUS_CACHE_NAME, allEntries = true, beforeInvocation = true)
- public Menu removeByMenuId(Long menuId) {
- Optional menu = this.findByMenuId(menuId);
- menuRepository.delete(menu.get());
- return menu.get();
+ public Menu remove(Long menuId) {
+ final Optional menu = this.findByMenuId(menuId);
+ menuRepository.delete(menu.orElse(null));
+ return menu.orElse(null);
}
/**
diff --git a/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java
index 358287e31..b806cb4aa 100755
--- a/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java
@@ -5,6 +5,7 @@ import cc.ryanc.halo.repository.OptionsRepository;
import cc.ryanc.halo.service.OptionsService;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import java.util.HashMap;
@@ -25,12 +26,15 @@ public class OptionsServiceImpl implements OptionsService {
@Autowired
private OptionsRepository optionsRepository;
+ private static final String POSTS_CACHE_NAME = "posts";
+
/**
* 批量保存设置
*
* @param options options
*/
@Override
+ @CacheEvict(value = POSTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
public void saveOptions(Map options) {
if (null != options && !options.isEmpty()) {
options.forEach((k, v) -> saveOption(k, v));
@@ -84,8 +88,8 @@ public class OptionsServiceImpl implements OptionsService {
*/
@Override
public Map findAllOptions() {
- Map options = new HashMap<>();
- List optionsList = optionsRepository.findAll();
+ final Map options = new HashMap<>();
+ final List optionsList = optionsRepository.findAll();
if (null != optionsList) {
optionsList.forEach(option -> options.put(option.getOptionName(), option.getOptionValue()));
}
@@ -100,7 +104,7 @@ public class OptionsServiceImpl implements OptionsService {
*/
@Override
public String findOneOption(String key) {
- Options options = optionsRepository.findOptionsByOptionName(key);
+ final Options options = optionsRepository.findOptionsByOptionName(key);
if (null != options) {
return options.getOptionValue();
}
diff --git a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
index 9b621e104..8671464ff 100755
--- a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
@@ -4,11 +4,16 @@ 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;
import cc.ryanc.halo.repository.PostRepository;
+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;
@@ -42,6 +47,12 @@ public class PostServiceImpl implements PostService {
@Autowired
private PostRepository postRepository;
+ @Autowired
+ private CategoryService categoryService;
+
+ @Autowired
+ private TagService tagService;
+
/**
* 保存文章
*
@@ -50,7 +61,18 @@ public class PostServiceImpl implements PostService {
*/
@Override
@CacheEvict(value = {POSTS_CACHE_NAME, COMMENTS_CACHE_NAME}, allEntries = true, beforeInvocation = true)
- public Post saveByPost(Post post) {
+ 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()));
+ }
+ final String summaryText = StrUtil.cleanBlank(HtmlUtil.cleanHtmlTag(post.getPostContent()));
+ if (summaryText.length() > postSummary) {
+ final String summary = summaryText.substring(0, postSummary);
+ post.setPostSummary(summary);
+ } else {
+ post.setPostSummary(summaryText);
+ }
return postRepository.save(post);
}
@@ -62,8 +84,8 @@ public class PostServiceImpl implements PostService {
*/
@Override
@CacheEvict(value = {POSTS_CACHE_NAME, COMMENTS_CACHE_NAME}, allEntries = true, beforeInvocation = true)
- public Post removeByPostId(Long postId) {
- Optional post = this.findByPostId(postId);
+ public Post remove(Long postId) {
+ final Optional post = this.findByPostId(postId);
postRepository.delete(post.get());
return post.get();
}
@@ -78,22 +100,11 @@ public class PostServiceImpl implements PostService {
@Override
@CacheEvict(value = POSTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
public Post updatePostStatus(Long postId, Integer status) {
- Optional post = this.findByPostId(postId);
+ final Optional post = this.findByPostId(postId);
post.get().setPostStatus(status);
return postRepository.save(post.get());
}
- /**
- * 修改文章阅读量
- *
- * @param post post
- */
- @Override
- public void updatePostView(Post post) {
- post.setPostViews(post.getPostViews() + 1);
- postRepository.save(post);
- }
-
/**
* 批量更新文章摘要
*
@@ -102,9 +113,9 @@ public class PostServiceImpl implements PostService {
@Override
@CacheEvict(value = POSTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
public void updateAllSummary(Integer postSummary) {
- List posts = this.findAllPosts(PostTypeEnum.POST_TYPE_POST.getDesc());
+ final List posts = this.findAll(PostTypeEnum.POST_TYPE_POST.getDesc());
for (Post post : posts) {
- String text = StrUtil.trim(HtmlUtil.cleanHtmlTag(post.getPostContent()));
+ String text = StrUtil.cleanBlank(HtmlUtil.cleanHtmlTag(post.getPostContent()));
if (text.length() > postSummary) {
post.setPostSummary(text.substring(0, postSummary));
} else {
@@ -114,18 +125,6 @@ public class PostServiceImpl implements PostService {
}
}
- /**
- * 获取文章列表 分页
- *
- * @param postType post or page
- * @param pageable 分页信息
- * @return Page
- */
- @Override
- public Page findAllPosts(String postType, Pageable pageable) {
- return postRepository.findPostsByPostType(postType, pageable);
- }
-
/**
* 获取文章列表 不分页
*
@@ -134,20 +133,36 @@ public class PostServiceImpl implements PostService {
*/
@Override
@Cacheable(value = POSTS_CACHE_NAME, key = "'posts_type_'+#postType")
- public List findAllPosts(String postType) {
+ public List findAll(String postType) {
return postRepository.findPostsByPostType(postType);
}
/**
* 模糊查询文章
*
- * @param keyWord keyword
- * @param pageable pageable
- * @return List
+ * @param keyword 关键词
+ * @param postType 文章类型
+ * @param postStatus 文章状态
+ * @param pageable 分页信息
+ * @return Page
*/
@Override
- public List searchPosts(String keyWord, Pageable pageable) {
- return postRepository.findByPostTitleLike(keyWord, pageable);
+ public Page searchPosts(String keyword, String postType, Integer postStatus, Pageable pageable) {
+ Page posts = postRepository.findByPostTypeAndPostStatusAndPostTitleLikeOrPostTypeAndPostStatusAndPostContentLike(
+ postType,
+ postStatus,
+ "%" + keyword + "%",
+ postType,
+ postStatus,
+ "%" + keyword + "%",
+ pageable
+ );
+ for (Post post : posts.getContent()) {
+ if (StrUtil.isNotEmpty(post.getPostPassword())) {
+ post.setPostSummary("该文章为加密文章");
+ }
+ }
+ return posts;
}
/**
@@ -160,7 +175,13 @@ public class PostServiceImpl implements PostService {
*/
@Override
public Page findPostByStatus(Integer status, String postType, Pageable pageable) {
- return postRepository.findPostsByPostStatusAndPostType(status, postType, pageable);
+ Page posts = postRepository.findPostsByPostStatusAndPostType(status, postType, pageable);
+ for (Post post : posts.getContent()) {
+ if (StrUtil.isNotEmpty(post.getPostPassword())) {
+ post.setPostSummary("该文章为加密文章");
+ }
+ }
+ return posts;
}
/**
@@ -172,7 +193,13 @@ public class PostServiceImpl implements PostService {
@Override
@Cacheable(value = POSTS_CACHE_NAME, key = "'posts_page_'+#pageable.pageNumber")
public Page findPostByStatus(Pageable pageable) {
- return postRepository.findPostsByPostStatusAndPostType(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
+ Page posts = postRepository.findPostsByPostStatusAndPostType(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
+ for (Post post : posts.getContent()) {
+ if (StrUtil.isNotEmpty(post.getPostPassword())) {
+ post.setPostSummary("该文章为加密文章");
+ }
+ }
+ return posts;
}
/**
@@ -235,28 +262,27 @@ public class PostServiceImpl implements PostService {
}
/**
- * 查询之后的文章
+ * 获取下一篇文章 较新
*
- * @param postDate 发布时间
- * @return List
+ * @param postDate postDate
+ * @return Post
*/
@Override
- public List findByPostDateAfter(Date postDate) {
- return postRepository.findByPostDateAfterAndPostStatusAndPostTypeOrderByPostDateDesc(postDate, PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc());
+ public Post getNextPost(Date postDate) {
+ return postRepository.queryNextPost(postDate);
}
/**
- * 查询Id之前的文章
+ * 获取下一篇文章 较老
*
- * @param postDate 发布时间
- * @return List
+ * @param postDate postDate
+ * @return Post
*/
@Override
- public List findByPostDateBefore(Date postDate) {
- return postRepository.findByPostDateBeforeAndPostStatusAndPostTypeOrderByPostDateAsc(postDate, PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc());
+ public Post getPrePost(Date postDate) {
+ return postRepository.queryPrePost(postDate);
}
-
/**
* 查询归档信息 根据年份和月份
*
@@ -265,8 +291,8 @@ public class PostServiceImpl implements PostService {
@Override
@Cacheable(value = POSTS_CACHE_NAME, key = "'archives_year_month'")
public List findPostGroupByYearAndMonth() {
- List objects = postRepository.findPostGroupByYearAndMonth();
- List archives = new ArrayList<>();
+ final List objects = postRepository.findPostGroupByYearAndMonth();
+ final List archives = new ArrayList<>();
Archive archive = null;
for (Object[] obj : objects) {
archive = new Archive();
@@ -287,8 +313,8 @@ public class PostServiceImpl implements PostService {
@Override
@Cacheable(value = POSTS_CACHE_NAME, key = "'archives_year'")
public List findPostGroupByYear() {
- List objects = postRepository.findPostGroupByYear();
- List archives = new ArrayList<>();
+ final List objects = postRepository.findPostGroupByYear();
+ final List archives = new ArrayList<>();
Archive archive = null;
for (Object[] obj : objects) {
archive = new Archive();
@@ -300,6 +326,29 @@ public class PostServiceImpl implements PostService {
return archives;
}
+ /**
+ * @return List
+ * @Author Aquan
+ * @Description 查询归档信息 返回所有文章
+ * @Date 2019.1.4 11:16
+ * @Param
+ **/
+ @Override
+ @Cacheable(value = POSTS_CACHE_NAME, key = "'archives_all'")
+ public List findAllPost() {
+ final List posts = postRepository.findAllPost();
+ final Integer count = postRepository.totalAllPostCount();
+ final List archives = new ArrayList<>();
+ Archive archive = null;
+ archive = new Archive();
+ archive.setCount(String.valueOf(count));
+ archive.setPosts(posts);
+ archives.add(archive);
+
+ return archives;
+ }
+
+
/**
* 根据年份和月份查询文章
*
@@ -335,7 +384,13 @@ public class PostServiceImpl implements PostService {
*/
@Override
public Page findPostByYearAndMonth(String year, String month, Pageable pageable) {
- return postRepository.findPostByYearAndMonth(year, month, null);
+ Page posts = postRepository.findPostByYearAndMonth(year, month, null);
+ for (Post post : posts.getContent()) {
+ if (StrUtil.isNotEmpty(post.getPostPassword())) {
+ post.setPostSummary("该文章为加密文章");
+ }
+ }
+ return posts;
}
/**
@@ -349,7 +404,13 @@ public class PostServiceImpl implements PostService {
@Override
@CachePut(value = POSTS_CACHE_NAME, key = "'posts_category_'+#category.cateId+'_'+#pageable.pageNumber")
public Page findPostByCategories(Category category, Pageable pageable) {
- return postRepository.findPostByCategoriesAndPostStatus(category, PostStatusEnum.PUBLISHED.getCode(), pageable);
+ Page posts = postRepository.findPostByCategoriesAndPostStatus(category, PostStatusEnum.PUBLISHED.getCode(), pageable);
+ for (Post post : posts.getContent()) {
+ if (StrUtil.isNotEmpty(post.getPostPassword())) {
+ post.setPostSummary("该文章为加密文章");
+ }
+ }
+ return posts;
}
/**
@@ -363,19 +424,13 @@ public class PostServiceImpl implements PostService {
@Override
@CachePut(value = POSTS_CACHE_NAME, key = "'posts_tag_'+#tag.tagId+'_'+#pageable.pageNumber")
public Page findPostsByTags(Tag tag, Pageable pageable) {
- return postRepository.findPostsByTagsAndPostStatus(tag, PostStatusEnum.PUBLISHED.getCode(), pageable);
- }
-
- /**
- * 搜索文章
- *
- * @param keyword 关键词
- * @param pageable 分页信息
- * @return Page
- */
- @Override
- public Page searchByKeywords(String keyword, Pageable pageable) {
- return postRepository.findPostByPostTitleLikeOrPostContentLikeAndPostTypeAndPostStatus(keyword, pageable);
+ Page posts = postRepository.findPostsByTagsAndPostStatus(tag, PostStatusEnum.PUBLISHED.getCode(), pageable);
+ for (Post post : posts.getContent()) {
+ if (StrUtil.isNotEmpty(post.getPostPassword())) {
+ post.setPostSummary("该文章为加密文章");
+ }
+ }
+ return posts;
}
/**
@@ -399,15 +454,15 @@ public class PostServiceImpl implements PostService {
@CachePut(value = POSTS_CACHE_NAME, key = "'posts_related_'+#post.getPostId()")
public List relatedPosts(Post post) {
//获取当前文章的所有标签
- List tags = post.getTags();
- List tempPosts = new ArrayList<>();
+ final List tags = post.getTags();
+ final List tempPosts = new ArrayList<>();
for (Tag tag : tags) {
tempPosts.addAll(postRepository.findPostsByTags(tag));
}
//去掉当前的文章
tempPosts.remove(post);
//去掉重复的文章
- List allPosts = new ArrayList<>();
+ final List allPosts = new ArrayList<>();
for (int i = 0; i < tempPosts.size(); i++) {
if (!allPosts.contains(tempPosts.get(i))) {
allPosts.add(tempPosts.get(i));
@@ -464,4 +519,48 @@ public class PostServiceImpl implements PostService {
public String buildSiteMap(List posts) {
return HaloUtils.getSiteMap(posts);
}
+
+ /**
+ * 缓存阅读数
+ *
+ * @param postId postId
+ */
+ @Override
+ public void cacheViews(Long postId) {
+ if (null != HaloConst.POSTS_VIEWS.get(postId)) {
+ HaloConst.POSTS_VIEWS.put(postId, HaloConst.POSTS_VIEWS.get(postId) + 1);
+ } else {
+ HaloConst.POSTS_VIEWS.put(postId, 1L);
+ }
+ }
+
+ /**
+ * 组装分类目录和标签
+ *
+ * @param post post
+ * @param cateList cateList
+ * @param tagList tagList
+ * @return Post Post
+ */
+ @Override
+ public Post buildCategoriesAndTags(Post post, List cateList, String tagList) {
+ final List categories = categoryService.strListToCateList(cateList);
+ post.setCategories(categories);
+ if (StrUtil.isNotEmpty(tagList)) {
+ final List tags = tagService.strListToTagList(StrUtil.trim(tagList));
+ post.setTags(tags);
+ }
+ return post;
+ }
+
+ /**
+ * 获取最近的文章
+ *
+ * @param limit 条数
+ * @return List
+ */
+ @Override
+ public List getRecentPosts(int limit) {
+ return postRepository.getPostsByLimit(limit);
+ }
}
diff --git a/src/main/java/cc/ryanc/halo/service/impl/TagServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/TagServiceImpl.java
index 14b43a6f8..711beb20c 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/TagServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/TagServiceImpl.java
@@ -4,6 +4,7 @@ import cc.ryanc.halo.model.domain.Tag;
import cc.ryanc.halo.repository.TagRepository;
import cc.ryanc.halo.service.TagService;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@@ -21,6 +22,8 @@ import java.util.Optional;
@Service
public class TagServiceImpl implements TagService {
+ private static final String POSTS_CACHE_NAME = "posts";
+
@Autowired
private TagRepository tagRepository;
@@ -31,7 +34,8 @@ public class TagServiceImpl implements TagService {
* @return Tag
*/
@Override
- public Tag saveByTag(Tag tag) {
+ @CacheEvict(value = POSTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
+ public Tag save(Tag tag) {
return tagRepository.save(tag);
}
@@ -42,8 +46,9 @@ public class TagServiceImpl implements TagService {
* @return Tag
*/
@Override
- public Tag removeByTagId(Long tagId) {
- Optional tag = findByTagId(tagId);
+ @CacheEvict(value = POSTS_CACHE_NAME, allEntries = true, beforeInvocation = true)
+ public Tag remove(Long tagId) {
+ final Optional tag = findByTagId(tagId);
tagRepository.delete(tag.get());
return tag.get();
}
@@ -54,7 +59,7 @@ public class TagServiceImpl implements TagService {
* @return List
*/
@Override
- public List findAllTags() {
+ public List findAll() {
return tagRepository.findAll();
}
@@ -99,10 +104,10 @@ public class TagServiceImpl implements TagService {
*/
@Override
public List strListToTagList(String tagList) {
- String[] tags = tagList.split(",");
- List tagsList = new ArrayList<>();
+ final String[] tags = tagList.split(",");
+ final List tagsList = new ArrayList<>();
for (String tag : tags) {
- Tag t = findTagByTagName(tag);
+ final Tag t = findTagByTagName(tag);
Tag nt = null;
if (null != t) {
tagsList.add(t);
@@ -110,7 +115,7 @@ public class TagServiceImpl implements TagService {
nt = new Tag();
nt.setTagName(tag);
nt.setTagUrl(tag);
- tagsList.add(saveByTag(nt));
+ tagsList.add(save(nt));
}
}
return tagsList;
diff --git a/src/main/java/cc/ryanc/halo/service/impl/UserServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/UserServiceImpl.java
index fb96e0895..710e6722d 100755
--- a/src/main/java/cc/ryanc/halo/service/impl/UserServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/UserServiceImpl.java
@@ -30,7 +30,7 @@ public class UserServiceImpl implements UserService {
* @param user user
*/
@Override
- public void saveByUser(User user) {
+ public void save(User user) {
userRepository.save(user);
}
@@ -65,7 +65,7 @@ public class UserServiceImpl implements UserService {
*/
@Override
public User findUser() {
- List users = userRepository.findAll();
+ final List users = userRepository.findAll();
if (users != null && users.size() > 0) {
return users.get(0);
} else {
@@ -92,7 +92,8 @@ public class UserServiceImpl implements UserService {
*/
@Override
public void updateUserLoginEnable(String enable) {
- User user = this.findUser();
+ final User user = this.findUser();
+ user.setLoginError(0);
user.setLoginEnable(enable);
userRepository.save(user);
}
@@ -105,7 +106,7 @@ public class UserServiceImpl implements UserService {
*/
@Override
public User updateUserLoginLast(Date lastDate) {
- User user = this.findUser();
+ final User user = this.findUser();
user.setLoginLast(lastDate);
userRepository.save(user);
return user;
@@ -118,7 +119,7 @@ public class UserServiceImpl implements UserService {
*/
@Override
public Integer updateUserLoginError() {
- User user = this.findUser();
+ final User user = this.findUser();
user.setLoginError((user.getLoginError() == null ? 0 : user.getLoginError()) + 1);
userRepository.save(user);
return user.getLoginError();
@@ -131,7 +132,7 @@ public class UserServiceImpl implements UserService {
*/
@Override
public User updateUserNormal() {
- User user = this.findUser();
+ final User user = this.findUser();
user.setLoginEnable(TrueFalseEnum.TRUE.getDesc());
user.setLoginError(0);
user.setLoginLast(new Date());
diff --git a/src/main/java/cc/ryanc/halo/task/PostSyncTask.java b/src/main/java/cc/ryanc/halo/task/PostSyncTask.java
new file mode 100644
index 000000000..bb01797eb
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/task/PostSyncTask.java
@@ -0,0 +1,34 @@
+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;
+
+/**
+ * @author : RYAN0UP
+ * @date : 2018/12/5
+ */
+@Slf4j
+public class PostSyncTask {
+
+ /**
+ * 将缓存的图文浏览数写入数据库
+ */
+ public void postSync() {
+ final PostService postService = SpringUtil.getBean(PostService.class);
+ Post post = null;
+ int count = 0;
+ for (Long key : HaloConst.POSTS_VIEWS.keySet()) {
+ post = postService.findByPostId(key).orElse(null);
+ if (null != post) {
+ post.setPostViews(post.getPostViews() + HaloConst.POSTS_VIEWS.get(key));
+ postService.save(post);
+ count++;
+ }
+ }
+ log.info("The number of visits to {} posts has been updated", count);
+ HaloConst.POSTS_VIEWS.clear();
+ }
+}
diff --git a/src/main/java/cc/ryanc/halo/utils/CommentUtil.java b/src/main/java/cc/ryanc/halo/utils/CommentUtil.java
index 44db0792b..bc4d99917 100644
--- a/src/main/java/cc/ryanc/halo/utils/CommentUtil.java
+++ b/src/main/java/cc/ryanc/halo/utils/CommentUtil.java
@@ -1,14 +1,13 @@
package cc.ryanc.halo.utils;
+import cc.ryanc.halo.model.domain.Comment;
+import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import org.springframework.util.Assert;
-import org.springframework.util.CollectionUtils;
-
-import cc.ryanc.halo.model.domain.Comment;
-
/**
*
* 拼装评论
@@ -30,7 +29,7 @@ public class CommentUtil {
return Collections.emptyList();
}
- List commentsResult = new ArrayList<>();
+ final List commentsResult = new ArrayList<>();
for (Comment comment : commentsRoot) {
if (comment.getCommentParent() == 0) {
@@ -60,7 +59,7 @@ public class CommentUtil {
return null;
}
- List commentsChild = new ArrayList<>();
+ final List commentsChild = new ArrayList<>();
for (Comment comment : commentsRoot) {
if (comment.getCommentParent() != 0) {
if (comment.getCommentParent().equals(id)) {
diff --git a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java
index 1d1a2796f..d11273f71 100755
--- a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java
+++ b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java
@@ -8,6 +8,7 @@ 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;
@@ -16,14 +17,12 @@ 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;
import org.springframework.util.ResourceUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
-import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Files;
@@ -49,13 +48,16 @@ public class HaloUtils {
* 获取备份文件信息
*
* @param dir dir
+ *
* @return List
*/
public static List getBackUps(String dir) {
- String srcPathStr = System.getProperties().getProperty("user.home") + "/halo/backup/" + dir;
- File srcPath = new File(srcPathStr);
- File[] files = srcPath.listFiles();
- List backupDtos = new ArrayList<>();
+ final StrBuilder srcPathStr = new StrBuilder(System.getProperties().getProperty("user.home"));
+ srcPathStr.append("/halo/backup/");
+ srcPathStr.append(dir);
+ final File srcPath = new File(srcPathStr.toString());
+ final File[] files = srcPath.listFiles();
+ final List backupDtos = new ArrayList<>();
BackupDto backupDto = null;
// 遍历文件
if (null != files) {
@@ -81,25 +83,26 @@ public class HaloUtils {
* 转换文件大小
*
* @param size size
+ *
* @return String
*/
public static String parseSize(long size) {
- if (size < CommonParamsEnum.NOT_FOUND.getValue()) {
- return String.valueOf(size) + "B";
+ if (size < CommonParamsEnum.BYTE.getValue()) {
+ return size + "B";
} else {
size = size / 1024;
}
- if (size < CommonParamsEnum.NOT_FOUND.getValue()) {
- return String.valueOf(size) + "KB";
+ if (size < CommonParamsEnum.BYTE.getValue()) {
+ return size + "KB";
} else {
size = size / 1024;
}
- if (size < CommonParamsEnum.NOT_FOUND.getValue()) {
+ if (size < CommonParamsEnum.BYTE.getValue()) {
size = size * 100;
- return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "MB";
+ return size / 100 + "." + size % 100 + "MB";
} else {
size = size * 100 / 1024;
- return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "GB";
+ return size / 100 + "." + size % 100 + "GB";
}
}
@@ -107,21 +110,21 @@ public class HaloUtils {
* 获取文件创建时间
*
* @param srcPath 文件绝对路径
+ *
* @return 时间
*/
public static Date getCreateTime(String srcPath) {
- Path path = Paths.get(srcPath);
- BasicFileAttributeView basicview = Files.getFileAttributeView(path, BasicFileAttributeView.class,
- LinkOption.NOFOLLOW_LINKS);
+ final Path path = Paths.get(srcPath);
+ final BasicFileAttributeView basicview = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS);
BasicFileAttributes attr;
try {
attr = basicview.readAttributes();
- Date createDate = new Date(attr.creationTime().toMillis());
+ final Date createDate = new Date(attr.creationTime().toMillis());
return createDate;
} catch (Exception e) {
e.printStackTrace();
}
- Calendar cal = Calendar.getInstance();
+ final Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 1, 0, 0, 0);
return cal.getTime();
}
@@ -130,11 +133,12 @@ public class HaloUtils {
* 获取文件长和宽
*
* @param file file
+ *
* @return String
*/
public static String getImageWh(File file) {
try {
- BufferedImage image = ImageIO.read(new FileInputStream(file));
+ final BufferedImage image = ImageIO.read(new FileInputStream(file));
return image.getWidth() + "x" + image.getHeight();
} catch (Exception e) {
e.printStackTrace();
@@ -148,13 +152,13 @@ public class HaloUtils {
* @return List
*/
public static List getThemes() {
- List themes = new ArrayList<>();
+ final List themes = new ArrayList<>();
try {
// 获取项目根路径
- File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
+ final File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
// 获取主题路径
- File themesPath = new File(basePath.getAbsolutePath(), "templates/themes");
- File[] files = themesPath.listFiles();
+ final File themesPath = new File(basePath.getAbsolutePath(), "templates/themes");
+ final File[] files = themesPath.listFiles();
if (null != files) {
Theme theme = null;
for (File file : files) {
@@ -191,18 +195,19 @@ public class HaloUtils {
* 获取主题下的模板文件名
*
* @param theme theme
+ *
* @return List
*/
public static List getTplName(String theme) {
- List tpls = new ArrayList<>();
+ final List tpls = new ArrayList<>();
try {
// 获取项目根路径
- File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
+ final File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
// 获取主题路径
- File themesPath = new File(basePath.getAbsolutePath(), "templates/themes/" + theme);
- File modulePath = new File(themesPath.getAbsolutePath(), "module");
- File[] baseFiles = themesPath.listFiles();
- File[] moduleFiles = modulePath.listFiles();
+ final File themesPath = new File(basePath.getAbsolutePath(), "templates/themes/" + theme);
+ final File modulePath = new File(themesPath.getAbsolutePath(), "module");
+ final File[] baseFiles = themesPath.listFiles();
+ final File[] moduleFiles = modulePath.listFiles();
if (null != moduleFiles) {
for (File file : moduleFiles) {
if (file.isFile() && file.getName().endsWith(".ftl")) {
@@ -229,12 +234,12 @@ public class HaloUtils {
* @return List
*/
public static List getCustomTpl(String theme) {
- List tpls = new ArrayList<>();
+ final List tpls = new ArrayList<>();
try {
- File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
+ final File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
// 获取主题路径
- File themePath = new File(basePath.getAbsolutePath(), "templates/themes/" + theme);
- File[] themeFiles = themePath.listFiles();
+ final File themePath = new File(basePath.getAbsolutePath(), "templates/themes/" + theme);
+ final File[] themeFiles = themePath.listFiles();
if (null != themeFiles && themeFiles.length > 0) {
for (File file : themeFiles) {
String[] split = StrUtil.removeSuffix(file.getName(), ".ftl").split("_");
@@ -260,7 +265,7 @@ public class HaloUtils {
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
try {
- File file = new File(filePath);
+ final File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
@@ -283,13 +288,15 @@ public class HaloUtils {
* 生成rss
*
* @param posts posts
+ *
* @return String
- * @throws FeedException
+ *
+ * @throws FeedException FeedException
*/
public static String getRss(List posts) throws FeedException {
Assert.notEmpty(posts, "posts must not be empty");
- Channel channel = new Channel("rss_2.0");
+ final Channel channel = new Channel("rss_2.0");
if (null == HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp())) {
channel.setTitle("");
} else {
@@ -306,13 +313,13 @@ public class HaloUtils {
channel.setDescription(HaloConst.OPTIONS.get(BlogPropertiesEnum.SEO_DESC.getProp()));
}
channel.setLanguage("zh-CN");
- List- items = new ArrayList<>();
+ final List
- items = new ArrayList<>();
for (Post post : posts) {
- Item item = new Item();
+ final Item item = new Item();
item.setTitle(post.getPostTitle());
- Content content = new Content();
+ final Content content = new Content();
String value = post.getPostContent();
- char[] xmlChar = value.toCharArray();
+ final char[] xmlChar = value.toCharArray();
for (int i = 0; i < xmlChar.length; ++i) {
if (xmlChar[i] > 0xFFFD) {
xmlChar[i] = ' ';
@@ -323,13 +330,12 @@ public class HaloUtils {
value = new String(xmlChar);
content.setValue(value);
item.setContent(content);
- item.setLink(
- HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/" + post.getPostUrl());
+ item.setLink(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/" + post.getPostUrl());
item.setPubDate(post.getPostDate());
items.add(item);
}
channel.setItems(items);
- WireFeedOutput out = new WireFeedOutput();
+ final WireFeedOutput out = new WireFeedOutput();
return out.outputString(channel);
}
@@ -337,21 +343,23 @@ public class HaloUtils {
* 获取sitemap
*
* @param posts posts
+ *
* @return String
*/
public static String getSiteMap(List
posts) {
Assert.notEmpty(posts, "post mut not be empty");
-
- String head = "\n";
- String urlBody = "";
- String urlItem;
- String urlPath = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/";
+ final StrBuilder head = new StrBuilder("\n");
+ final StrBuilder urlBody = new StrBuilder();
+ final String urlPath = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/";
for (Post post : posts) {
- urlItem = "" + urlPath + post.getPostUrl() + " "
- + DateUtil.format(post.getPostDate(), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") + " " + " ";
- urlBody += urlItem;
+ urlBody.append("");
+ urlBody.append(urlPath);
+ urlBody.append(post.getPostUrl());
+ urlBody.append(" ");
+ urlBody.append(DateUtil.format(post.getPostDate(), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));
+ urlBody.append(" ");
}
- return head + urlBody + " ";
+ return head.append(urlBody).append(" ").toString();
}
/**
@@ -362,57 +370,18 @@ public class HaloUtils {
* @param password password
*/
public static void configMail(String smtpHost, String userName, String password) {
- Properties properties = OhMyEmail.defaultConfig(false);
+ final Properties properties = OhMyEmail.defaultConfig(false);
properties.setProperty("mail.smtp.host", smtpHost);
OhMyEmail.config(properties, userName, password);
}
- /**
- * 访问路径获取json数据
- *
- * @param enterUrl 路径
- * @return String
- */
- public static String getHttpResponse(String enterUrl) {
- Assert.hasText(enterUrl, "enter url must not be blank");
-
- BufferedReader in = null;
- StringBuffer result = null;
- try {
- URI uri = new URI(enterUrl);
- URL url = uri.toURL();
- URLConnection connection = url.openConnection();
- connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
- connection.setRequestProperty("Charset", "utf-8");
- connection.connect();
- result = new StringBuffer();
- in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
- String line;
- while ((line = in.readLine()) != null) {
- result.append(line);
- }
- return result.toString();
-
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (in != null) {
- in.close();
- }
- } catch (Exception e2) {
- e2.printStackTrace();
- }
- }
- return null;
- }
-
/**
* 百度主动推送
*
* @param blogUrl 博客地址
* @param token 百度推送token
* @param urls 文章路径
+ *
* @return String
*/
public static String baiduPost(String blogUrl, String token, String urls) {
@@ -420,13 +389,17 @@ public class HaloUtils {
Assert.hasText(token, "token must not be blank");
Assert.hasText(urls, "urls must not be blank");
- String url = "http://data.zz.baidu.com/urls?site=" + blogUrl + "&token=" + token;
- String result = "";
+ final StrBuilder url = new StrBuilder("http://data.zz.baidu.com/urls?site=");
+ url.append(blogUrl);
+ url.append("&token=");
+ url.append(token);
+
+ final StrBuilder result = new StrBuilder();
PrintWriter out = null;
BufferedReader in = null;
try {
// 建立URL之间的连接
- URLConnection conn = new URL(url).openConnection();
+ final URLConnection conn = new URL(url.toString()).openConnection();
// 设置通用的请求属性
conn.setRequestProperty("Host", "data.zz.baidu.com");
conn.setRequestProperty("User-Agent", "curl/7.12.1");
@@ -446,7 +419,7 @@ public class HaloUtils {
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
- result += line;
+ result.append(line);
}
} catch (Exception e) {
e.printStackTrace();
@@ -462,7 +435,7 @@ public class HaloUtils {
ex.printStackTrace();
}
}
- return result;
+ return result.toString();
}
}
diff --git a/src/main/java/cc/ryanc/halo/utils/MarkdownUtils.java b/src/main/java/cc/ryanc/halo/utils/MarkdownUtils.java
new file mode 100644
index 000000000..96e149dd4
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/utils/MarkdownUtils.java
@@ -0,0 +1,67 @@
+package cc.ryanc.halo.utils;
+
+import org.commonmark.Extension;
+import org.commonmark.ext.front.matter.YamlFrontMatterExtension;
+import org.commonmark.ext.front.matter.YamlFrontMatterVisitor;
+import org.commonmark.ext.gfm.tables.TablesExtension;
+import org.commonmark.node.Node;
+import org.commonmark.parser.Parser;
+import org.commonmark.renderer.html.HtmlRenderer;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author : RYAN0UP
+ * @date : 2018/11/14
+ */
+public class MarkdownUtils {
+
+ /**
+ * Front-matter插件
+ */
+ private static final Set EXTENSIONS_YAML = Collections.singleton(YamlFrontMatterExtension.create());
+
+ /**
+ * Table插件
+ */
+ private static final Set EXTENSIONS_TABLE = Collections.singleton(TablesExtension.create());
+
+ /**
+ * 解析Markdown文档
+ */
+ private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS_YAML).extensions(EXTENSIONS_TABLE).build();
+
+ /**
+ * 渲染HTML文档
+ */
+ private static final HtmlRenderer RENDERER = HtmlRenderer.builder().extensions(EXTENSIONS_YAML).extensions(EXTENSIONS_TABLE).build();
+
+ /**
+ * 渲染Markdown
+ *
+ * @param content content
+ *
+ * @return String
+ */
+ public static String renderMarkdown(String content) {
+ final Node document = PARSER.parse(content);
+ return RENDERER.render(document);
+ }
+
+ /**
+ * 获取元数据
+ *
+ * @param content content
+ *
+ * @return Map
+ */
+ public static Map> getFrontMatter(String content) {
+ final YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor();
+ final Node document = PARSER.parse(content);
+ document.accept(visitor);
+ return visitor.getData();
+ }
+}
diff --git a/src/main/java/cc/ryanc/halo/utils/Md5Util.java b/src/main/java/cc/ryanc/halo/utils/Md5Util.java
new file mode 100644
index 000000000..75b36be9b
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/utils/Md5Util.java
@@ -0,0 +1,64 @@
+package cc.ryanc.halo.utils;
+
+import cn.hutool.core.text.StrBuilder;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
+import java.security.MessageDigest;
+
+/**
+ *
+ * 获取文件hash
+ *
+ *
+ * @author : Yawn
+ * @date : 2018/12/04
+ */
+public class Md5Util {
+
+ /**
+ * 计算文件MD5编码
+ *
+ * @param file file
+ *
+ * @return byte
+ *
+ * @throws Exception Exception
+ */
+ private static byte[] createChecksum(MultipartFile file) throws Exception {
+ final InputStream fis = file.getInputStream();
+
+ final byte[] buffer = new byte[1024];
+ final MessageDigest complete = MessageDigest.getInstance("MD5");
+ int numRead;
+
+ do {
+ numRead = fis.read(buffer);
+ if (numRead > 0) {
+ complete.update(buffer, 0, numRead);
+ }
+ } while (numRead != -1);
+
+ fis.close();
+ return complete.digest();
+ }
+
+ /**
+ * 生成文件hash值
+ *
+ * @param file file
+ *
+ * @return String
+ *
+ * @throws Exception Exception
+ */
+ public static String getMD5Checksum(MultipartFile file) throws Exception {
+ final byte[] b = createChecksum(file);
+ StrBuilder result = new StrBuilder();
+
+ for (int i = 0; i < b.length; i++) {
+ result.append(Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1));
+ }
+ return result.toString();
+ }
+}
diff --git a/src/main/java/cc/ryanc/halo/utils/SpringUtil.java b/src/main/java/cc/ryanc/halo/utils/SpringUtil.java
new file mode 100644
index 000000000..aaaea82bf
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/utils/SpringUtil.java
@@ -0,0 +1,53 @@
+package cc.ryanc.halo.utils;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author : RYAN0UP
+ * @date : 2018/12/5
+ */
+@Component
+public class SpringUtil implements ApplicationContextAware {
+
+ private static ApplicationContext applicationContext;
+
+ /**
+ * 获取applicationContext
+ *
+ * @return ApplicationContext
+ */
+ public static ApplicationContext getApplicationContext() {
+ return applicationContext;
+ }
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ if (SpringUtil.applicationContext == null) {
+ SpringUtil.applicationContext = applicationContext;
+ }
+ }
+
+ /**
+ * 通过name获取 Bean.
+ *
+ * @param name name
+ * @return Object
+ */
+ public static Object getBean(String name) {
+ return getApplicationContext().getBean(name);
+ }
+
+ /**
+ * 通过class获取Bean
+ *
+ * @param clazz clazz
+ * @param
+ * @return T
+ */
+ public static T getBean(Class clazz) {
+ return getApplicationContext().getBean(clazz);
+ }
+}
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java
index 1acbfead7..6069aabbb 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java
@@ -1,26 +1,21 @@
package cc.ryanc.halo.web.controller.admin;
-import cc.ryanc.halo.model.domain.Comment;
-import cc.ryanc.halo.model.domain.Logs;
-import cc.ryanc.halo.model.domain.Post;
-import cc.ryanc.halo.model.domain.User;
+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.CommonParamsEnum;
-import cc.ryanc.halo.model.enums.ResponseStatusEnum;
-import cc.ryanc.halo.model.enums.ResultCodeEnum;
-import cc.ryanc.halo.model.enums.TrueFalseEnum;
+import cc.ryanc.halo.model.enums.*;
import cc.ryanc.halo.service.*;
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.DateUnit;
import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
-import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.http.HtmlUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -31,12 +26,12 @@ import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
-import java.util.Date;
-import java.util.List;
-import java.util.Random;
+import java.io.IOException;
+import java.util.*;
/**
*
@@ -69,6 +64,12 @@ public class AdminController extends BaseController {
@Autowired
private AttachmentService attachmentService;
+ @Autowired
+ private CategoryService categoryService;
+
+ @Autowired
+ private TagService tagService;
+
@Autowired
private LocaleMessageUtil localeMessageUtil;
@@ -83,27 +84,32 @@ public class AdminController extends BaseController {
public String index(Model model) {
//查询评论的条数
- Integer commentCount = commentService.findAllComments().size();
+ final Long commentCount = commentService.getCount();
model.addAttribute("commentCount", commentCount);
//查询最新的文章
- List postsLatest = postService.findPostLatest();
+ final List postsLatest = postService.findPostLatest();
model.addAttribute("postTopFive", postsLatest);
//查询最新的日志
- List logsLatest = logsService.findLogsLatest();
+ final List logsLatest = logsService.findLogsLatest();
model.addAttribute("logs", logsLatest);
//查询最新的评论
- List comments = commentService.findCommentsLatest();
+ final List comments = commentService.findCommentsLatest();
model.addAttribute("comments", comments);
//附件数量
- model.addAttribute("mediaCount", attachmentService.findAllAttachments().size());
+ model.addAttribute("mediaCount", attachmentService.getCount());
//文章阅读总数
- Long postViewsSum = postService.getPostViews();
+ final Long postViewsSum = postService.getPostViews();
model.addAttribute("postViewsSum", postViewsSum);
+
+ //成立天数
+ final Date blogStart = DateUtil.parse(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_START.getProp()));
+ final long hadDays = DateUtil.between(blogStart, DateUtil.date(), DateUnit.DAY);
+ model.addAttribute("hadDays", hadDays);
return "admin/admin_index";
}
@@ -115,7 +121,7 @@ public class AdminController extends BaseController {
*/
@GetMapping(value = "/login")
public String login(HttpSession session) {
- User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+ final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
//如果session存在,跳转到后台首页
if (null != user) {
return "redirect:/admin";
@@ -137,13 +143,13 @@ public class AdminController extends BaseController {
@ModelAttribute("loginPwd") String loginPwd,
HttpSession session) {
//已注册账号,单用户,只有一个
- User aUser = userService.findUser();
+ final User aUser = userService.findUser();
//首先判断是否已经被禁用已经是否已经过了10分钟
Date loginLast = DateUtil.date();
if (null != aUser.getLoginLast()) {
loginLast = aUser.getLoginLast();
}
- Long between = DateUtil.between(loginLast, DateUtil.date(), DateUnit.MINUTE);
+ final Long between = DateUtil.between(loginLast, DateUtil.date(), DateUnit.MINUTE);
if (StrUtil.equals(aUser.getLoginEnable(), TrueFalseEnum.FALSE.getDesc()) && (between < CommonParamsEnum.TEN.getValue())) {
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.login.disabled"));
}
@@ -160,25 +166,18 @@ public class AdminController extends BaseController {
session.setAttribute(HaloConst.USER_SESSION_KEY, aUser);
//重置用户的登录状态为正常
userService.updateUserNormal();
- logsService.saveByLogs(new Logs(LogsRecord.LOGIN, LogsRecord.LOGIN_SUCCESS, ServletUtil.getClientIP(request), DateUtil.date()));
+ logsService.save(LogsRecord.LOGIN, LogsRecord.LOGIN_SUCCESS, request);
log.info("User {} login succeeded.", aUser.getUserDisplayName());
return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.login.success"));
} else {
//更新失败次数
- Integer errorCount = userService.updateUserLoginError();
+ final Integer errorCount = userService.updateUserLoginError();
//超过五次禁用账户
if (errorCount >= CommonParamsEnum.FIVE.getValue()) {
userService.updateUserLoginEnable(TrueFalseEnum.FALSE.getDesc());
}
- logsService.saveByLogs(
- new Logs(
- LogsRecord.LOGIN,
- LogsRecord.LOGIN_ERROR + "[" + HtmlUtil.escape(loginName) + "," + HtmlUtil.escape(loginPwd) + "]",
- ServletUtil.getClientIP(request),
- DateUtil.date()
- )
- );
- Object[] args = {(5 - errorCount)};
+ logsService.save(LogsRecord.LOGIN, LogsRecord.LOGIN_ERROR + "[" + HtmlUtil.escape(loginName) + "," + HtmlUtil.escape(loginPwd) + "]", request);
+ final Object[] args = {(5 - errorCount)};
return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.login.failed", args));
}
}
@@ -191,9 +190,9 @@ public class AdminController extends BaseController {
*/
@GetMapping(value = "/logOut")
public String logOut(HttpSession session) {
- User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+ final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
session.removeAttribute(HaloConst.USER_SESSION_KEY);
- logsService.saveByLogs(new Logs(LogsRecord.LOGOUT, user.getUserName(), ServletUtil.getClientIP(request), DateUtil.date()));
+ logsService.save(LogsRecord.LOGOUT, user.getUserName(), request);
log.info("User {} has logged out", user.getUserName());
return "redirect:/admin/login";
}
@@ -210,9 +209,9 @@ public class AdminController extends BaseController {
public String logs(Model model,
@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "size", defaultValue = "10") Integer size) {
- Sort sort = new Sort(Sort.Direction.DESC, "logId");
- Pageable pageable = PageRequest.of(page, size, sort);
- Page logs = logsService.findAllLogs(pageable);
+ final Sort sort = new Sort(Sort.Direction.DESC, "logId");
+ final Pageable pageable = PageRequest.of(page, size, sort);
+ final Page logs = logsService.findAll(pageable);
model.addAttribute("logs", logs);
return "admin/widget/_logs-all";
}
@@ -225,7 +224,7 @@ public class AdminController extends BaseController {
@GetMapping(value = "/logs/clear")
public String logsClear() {
try {
- logsService.removeAllLogs();
+ logsService.removeAll();
} catch (Exception e) {
log.error("Clear log failed:{}" + e.getMessage());
}
@@ -233,7 +232,7 @@ public class AdminController extends BaseController {
}
/**
- * 不可描述的页面
+ * Halo关于页面
*
* @return 模板路径admin/admin_halo
*/
@@ -250,7 +249,105 @@ public class AdminController extends BaseController {
@GetMapping(value = "/getToken")
@ResponseBody
public JsonResult getToken() {
- String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + "";
+ final String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + "";
return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), ResponseStatusEnum.SUCCESS.getMsg(), SecureUtil.md5(token));
}
+
+
+ /**
+ * 小工具
+ *
+ * @return String
+ */
+ @GetMapping(value = "/tools")
+ public String tools() {
+ return "admin/admin_tools";
+ }
+
+ /**
+ * Markdown 导入页面
+ *
+ * @return String
+ */
+ @GetMapping(value = "/tools/markdownImport")
+ public String markdownImport() {
+ return "admin/widget/_markdown_import";
+ }
+
+ /**
+ * Markdown 导入
+ *
+ * @param file file
+ * @param request request
+ * @return JsonResult
+ */
+ @PostMapping(value = "/tools/markdownImport")
+ @ResponseBody
+ public JsonResult markdownImport(@RequestParam("file") MultipartFile file,
+ HttpServletRequest request,
+ HttpSession session) throws IOException {
+ final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+ final String markdown = IoUtil.read(file.getInputStream(), "UTF-8");
+ final String content = MarkdownUtils.renderMarkdown(markdown);
+ final Map> frontMatters = MarkdownUtils.getFrontMatter(markdown);
+ final Post post = new Post();
+ List elementValue = null;
+ final List tags = new ArrayList<>();
+ final List categories = new ArrayList<>();
+ Tag tag = null;
+ Category category = null;
+ if (frontMatters.size() > 0) {
+ for (String key : frontMatters.keySet()) {
+ elementValue = frontMatters.get(key);
+ for (String ele : elementValue) {
+ if ("title".equals(key)) {
+ post.setPostTitle(ele);
+ } else if ("date".equals(key)) {
+ post.setPostDate(DateUtil.parse(ele));
+ } else if ("updated".equals(key)) {
+ post.setPostUpdate(DateUtil.parse(ele));
+ } else if ("tags".equals(key)) {
+ tag = tagService.findTagByTagName(ele);
+ if (null == tag) {
+ tag = new Tag();
+ tag.setTagName(ele);
+ tag.setTagUrl(ele);
+ tag = tagService.save(tag);
+ }
+ tags.add(tag);
+ } else if ("categories".equals(key)) {
+ category = categoryService.findByCateName(ele);
+ if (null == category) {
+ category = new Category();
+ category.setCateName(ele);
+ category.setCateUrl(ele);
+ category.setCateDesc(ele);
+ category = categoryService.save(category);
+ }
+ categories.add(category);
+ }
+ }
+ }
+ } else {
+ post.setPostDate(new Date());
+ post.setPostUpdate(new Date());
+ post.setPostTitle(file.getOriginalFilename());
+ }
+ post.setPostContentMd(markdown);
+ post.setPostContent(content);
+ post.setPostType(PostTypeEnum.POST_TYPE_POST.getDesc());
+ post.setAllowComment(AllowCommentEnum.ALLOW.getCode());
+ post.setUser(user);
+ post.setTags(tags);
+ post.setCategories(categories);
+ post.setPostUrl(StrUtil.removeSuffix(file.getOriginalFilename(), ".md"));
+ if (null == post.getPostDate()) {
+ post.setPostDate(new Date());
+ }
+ if (null == post.getPostUpdate()) {
+ post.setPostUpdate(new Date());
+ }
+ postService.save(post);
+ return new JsonResult(ResultCodeEnum.SUCCESS.getCode());
+ }
}
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/AttachmentController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/AttachmentController.java
index 392caaf85..ff9ded0b3 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/AttachmentController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/AttachmentController.java
@@ -1,20 +1,16 @@
package cc.ryanc.halo.web.controller.admin;
import cc.ryanc.halo.model.domain.Attachment;
-import cc.ryanc.halo.model.domain.Logs;
import cc.ryanc.halo.model.dto.JsonResult;
import cc.ryanc.halo.model.dto.LogsRecord;
import cc.ryanc.halo.model.enums.PostTypeEnum;
import cc.ryanc.halo.model.enums.ResultCodeEnum;
import cc.ryanc.halo.service.AttachmentService;
import cc.ryanc.halo.service.LogsService;
-import cc.ryanc.halo.utils.HaloUtils;
import cc.ryanc.halo.utils.LocaleMessageUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
-import cn.hutool.extra.servlet.ServletUtil;
import lombok.extern.slf4j.Slf4j;
-import net.coobird.thumbnailator.Thumbnails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
@@ -27,11 +23,11 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
-import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
-import java.util.Random;
+
+import static cc.ryanc.halo.model.enums.AttachLocationEnum.*;
/**
*
@@ -56,18 +52,19 @@ public class AttachmentController {
private LocaleMessageUtil localeMessageUtil;
/**
- * 获取upload的所有图片资源并渲染页面
+ * 复印件列表
*
* @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) {
- Sort sort = new Sort(Sort.Direction.DESC, "attachId");
- Pageable pageable = PageRequest.of(page, size, sort);
- Page attachments = attachmentService.findAllAttachments(pageable);
+ final Sort sort = new Sort(Sort.Direction.DESC, "attachId");
+ final Pageable pageable = PageRequest.of(page, size, sort);
+ final Page attachments = attachmentService.findAll(pageable);
model.addAttribute("attachments", attachments);
return "admin/admin_attachment";
}
@@ -77,6 +74,7 @@ public class AttachmentController {
*
* @param model model
* @param page page 当前页码
+ *
* @return 模板路径admin/widget/_attachment-select
*/
@GetMapping(value = "/select")
@@ -84,9 +82,9 @@ public class AttachmentController {
@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "id", defaultValue = "none") String id,
@RequestParam(value = "type", defaultValue = "normal") String type) {
- Sort sort = new Sort(Sort.Direction.DESC, "attachId");
- Pageable pageable = PageRequest.of(page, 18, sort);
- Page attachments = attachmentService.findAllAttachments(pageable);
+ final Sort sort = new Sort(Sort.Direction.DESC, "attachId");
+ final Pageable pageable = PageRequest.of(page, 18, sort);
+ final Page attachments = attachmentService.findAll(pageable);
model.addAttribute("attachments", attachments);
model.addAttribute("id", id);
if (StrUtil.equals(type, PostTypeEnum.POST_TYPE_POST.getDesc())) {
@@ -95,88 +93,59 @@ public class AttachmentController {
return "admin/widget/_attachment-select";
}
+
+ /**
+ * 上传附件窗口
+ *
+ * @return String
+ */
+ @GetMapping(value = "/uploadModal")
+ public String uploadModal() {
+ return "admin/widget/_attachment-upload";
+ }
+
/**
* 上传附件
*
* @param file file
* @param request request
+ *
* @return Map
*/
@PostMapping(value = "/upload", produces = {"application/json;charset=UTF-8"})
@ResponseBody
public Map upload(@RequestParam("file") MultipartFile file,
HttpServletRequest request) {
- return uploadAttachment(file, request);
- }
-
- /**
- * editor.md上传图片
- *
- * @param file file
- * @param request request
- * @return Map
- */
- @PostMapping(value = "/upload/editor", produces = {"application/json;charset=UTF-8"})
- @ResponseBody
- public Map editorUpload(@RequestParam("editormd-image-file") MultipartFile file,
- HttpServletRequest request) {
- return uploadAttachment(file, request);
- }
-
-
- /**
- * 上传图片
- *
- * @param file file
- * @param request request
- * @return Map
- */
- private Map uploadAttachment(MultipartFile file, HttpServletRequest request) {
- Map result = new HashMap<>(3);
+ final Map result = new HashMap<>(3);
if (!file.isEmpty()) {
try {
- //用户目录
- String userPath = System.getProperties().getProperty("user.home") + "/halo";
- //upload的路径
- StringBuffer sbMedia = new StringBuffer("upload/");
- //获取当前年月以创建目录,如果没有该目录则创建
- sbMedia.append(DateUtil.thisYear()).append("/").append(DateUtil.thisMonth()).append("/");
- File mediaPath = new File(userPath, sbMedia.toString());
- if (!mediaPath.exists()) {
- mediaPath.mkdirs();
+ final Map resultMap = attachmentService.upload(file, request);
+ if (resultMap == null || resultMap.isEmpty()) {
+ log.error("File upload failed");
+ result.put("success", ResultCodeEnum.FAIL.getCode());
+ result.put("message", localeMessageUtil.getMessage("code.admin.attachment.upload-failed"));
+ return result;
}
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
- String nameWithOutSuffix = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf('.')).replaceAll(" ", "_").replaceAll(",", "") + dateFormat.format(DateUtil.date()) + new Random().nextInt(1000);
- String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.') + 1);
- String fileName = nameWithOutSuffix + "." + fileSuffix;
- file.transferTo(new File(mediaPath.getAbsoluteFile(), fileName));
-
- //压缩图片
- Thumbnails.of(new StringBuffer(mediaPath.getAbsolutePath()).append("/").append(fileName).toString()).size(256, 256).keepAspectRatio(false).toFile(new StringBuffer(mediaPath.getAbsolutePath()).append("/").append(nameWithOutSuffix).append("_small.").append(fileSuffix).toString());
- String filePath = new StringBuffer("/upload/").append(DateUtil.thisYear()).append("/").append(DateUtil.thisMonth()).append("/").append(fileName).toString();
//保存在数据库
Attachment attachment = new Attachment();
- attachment.setAttachName(fileName);
- attachment.setAttachPath(filePath);
- attachment.setAttachSmallPath(new StringBuffer("/upload/").append(DateUtil.thisYear()).append("/").append(DateUtil.thisMonth()).append("/").append(nameWithOutSuffix).append("_small.").append(fileSuffix).toString());
+ attachment.setAttachName(resultMap.get("fileName"));
+ attachment.setAttachPath(resultMap.get("filePath"));
+ attachment.setAttachSmallPath(resultMap.get("smallPath"));
attachment.setAttachType(file.getContentType());
- attachment.setAttachSuffix(new StringBuffer(".").append(fileSuffix).toString());
- attachment.setAttachCreated(DateUtil.date());
- attachment.setAttachSize(HaloUtils.parseSize(new File(mediaPath, fileName).length()));
- attachment.setAttachWh(HaloUtils.getImageWh(new File(mediaPath, fileName)));
- attachmentService.saveByAttachment(attachment);
- log.info("Upload file {} to {} successfully", fileName, mediaPath.getAbsolutePath());
- logsService.saveByLogs(
- new Logs(LogsRecord.UPLOAD_FILE, fileName, ServletUtil.getClientIP(request), DateUtil.date())
- );
-
- result.put("success", 1);
+ attachment.setAttachSuffix(resultMap.get("suffix"));
+ attachment.setAttachSize(resultMap.get("size"));
+ attachment.setAttachWh(resultMap.get("wh"));
+ attachment.setAttachLocation(resultMap.get("location"));
+ attachmentService.save(attachment);
+ log.info("Upload file {} to {} successfully", resultMap.get("fileName"), resultMap.get("filePath"));
+ result.put("success", ResultCodeEnum.SUCCESS.getCode());
result.put("message", localeMessageUtil.getMessage("code.admin.attachment.upload-success"));
result.put("url", attachment.getAttachPath());
- result.put("filename", filePath);
+ result.put("filename", resultMap.get("filePath"));
+ logsService.save(LogsRecord.UPLOAD_FILE, resultMap.get("fileName"), request);
} catch (Exception e) {
log.error("Upload file failed:{}", e.getMessage());
- result.put("success", 0);
+ result.put("success", ResultCodeEnum.FAIL.getCode());
result.put("message", localeMessageUtil.getMessage("code.admin.attachment.upload-failed"));
}
} else {
@@ -190,12 +159,13 @@ public class AttachmentController {
*
* @param model model
* @param attachId 附件编号
+ *
* @return 模板路径admin/widget/_attachment-detail
*/
@GetMapping(value = "/attachment")
public String attachmentDetail(Model model, @RequestParam("attachId") Long attachId) {
- Optional