mirror of https://github.com/halo-dev/halo
v1.0
parent
f11b3ca65a
commit
e900016874
|
@ -54,7 +54,8 @@ public class WebMvcAutoConfiguration implements WebMvcConfigurer {
|
||||||
registry.addResourceHandler("/static/**")
|
registry.addResourceHandler("/static/**")
|
||||||
.addResourceLocations("classpath:/static/");
|
.addResourceLocations("classpath:/static/");
|
||||||
registry.addResourceHandler("/**")
|
registry.addResourceHandler("/**")
|
||||||
.addResourceLocations("classpath:/templates/themes/");
|
.addResourceLocations("classpath:/templates/themes/")
|
||||||
|
.addResourceLocations("file:///" + System.getProperties().getProperty("user.home") + "/halo/templates/themes/");
|
||||||
registry.addResourceHandler("/upload/**")
|
registry.addResourceHandler("/upload/**")
|
||||||
.addResourceLocations("file:///" + System.getProperties().getProperty("user.home") + "/halo/upload/");
|
.addResourceLocations("file:///" + System.getProperties().getProperty("user.home") + "/halo/upload/");
|
||||||
registry.addResourceHandler("/favicon.ico")
|
registry.addResourceHandler("/favicon.ico")
|
||||||
|
|
|
@ -3,6 +3,8 @@ package cc.ryanc.halo.repository;
|
||||||
import cc.ryanc.halo.model.entity.Option;
|
import cc.ryanc.halo.model.entity.Option;
|
||||||
import cc.ryanc.halo.repository.base.BaseRepository;
|
import cc.ryanc.halo.repository.base.BaseRepository;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Option repository.
|
* Option repository.
|
||||||
*
|
*
|
||||||
|
@ -10,4 +12,18 @@ import cc.ryanc.halo.repository.base.BaseRepository;
|
||||||
*/
|
*/
|
||||||
public interface OptionRepository extends BaseRepository<Option, Integer> {
|
public interface OptionRepository extends BaseRepository<Option, Integer> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query option by key
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
* @return Option
|
||||||
|
*/
|
||||||
|
Optional<Option> findByOptionKey(String key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete option by key
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
*/
|
||||||
|
void removeByOptionKey(String key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,8 @@ package cc.ryanc.halo.service;
|
||||||
import cc.ryanc.halo.model.entity.Option;
|
import cc.ryanc.halo.model.entity.Option;
|
||||||
import cc.ryanc.halo.service.base.CrudService;
|
import cc.ryanc.halo.service.base.CrudService;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Option service.
|
* Option service.
|
||||||
*
|
*
|
||||||
|
@ -10,4 +12,33 @@ import cc.ryanc.halo.service.base.CrudService;
|
||||||
*/
|
*/
|
||||||
public interface OptionService extends CrudService<Option, Integer> {
|
public interface OptionService extends CrudService<Option, Integer> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save one option
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
* @param value value
|
||||||
|
*/
|
||||||
|
void saveOption(String key, String value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save multiple options
|
||||||
|
*
|
||||||
|
* @param options options
|
||||||
|
*/
|
||||||
|
void saveOptions(Map<String, String> options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all options
|
||||||
|
*
|
||||||
|
* @return Map
|
||||||
|
*/
|
||||||
|
Map<String, String> listOptions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get option by key
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
String getByKey(String key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,12 @@ import cc.ryanc.halo.model.entity.Option;
|
||||||
import cc.ryanc.halo.repository.OptionRepository;
|
import cc.ryanc.halo.repository.OptionRepository;
|
||||||
import cc.ryanc.halo.service.OptionService;
|
import cc.ryanc.halo.service.OptionService;
|
||||||
import cc.ryanc.halo.service.base.AbstractCrudService;
|
import cc.ryanc.halo.service.base.AbstractCrudService;
|
||||||
|
import cc.ryanc.halo.utils.ServiceUtils;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OptionService implementation class
|
* OptionService implementation class
|
||||||
|
@ -21,4 +26,65 @@ public class OptionServiceImpl extends AbstractCrudService<Option, Integer> impl
|
||||||
super(optionRepository);
|
super(optionRepository);
|
||||||
this.optionRepository = optionRepository;
|
this.optionRepository = optionRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save one option
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
* @param value value
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void saveOption(String key, String value) {
|
||||||
|
if (StrUtil.equals(value, "")) {
|
||||||
|
optionRepository.removeByOptionKey(key);
|
||||||
|
} else if (StrUtil.isNotEmpty(key)) {
|
||||||
|
Option options = optionRepository.findByOptionKey(key).map(option -> {
|
||||||
|
// Exist
|
||||||
|
option.setOptionValue(value);
|
||||||
|
return option;
|
||||||
|
}).orElseGet(() -> {
|
||||||
|
// Not exist
|
||||||
|
Option option = new Option();
|
||||||
|
option.setOptionKey(key);
|
||||||
|
option.setOptionValue(value);
|
||||||
|
return option;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Save or update the options
|
||||||
|
optionRepository.save(options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save multiple options
|
||||||
|
*
|
||||||
|
* @param options options
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void saveOptions(Map<String, String> options) {
|
||||||
|
if (!CollectionUtils.isEmpty(options)) {
|
||||||
|
options.forEach(this::saveOption);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all options
|
||||||
|
*
|
||||||
|
* @return Map
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Map<String, String> listOptions() {
|
||||||
|
return ServiceUtils.convertToMap(listAll(), Option::getOptionKey, Option::getOptionValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get option by key
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getByKey(String key) {
|
||||||
|
return optionRepository.findByOptionKey(key).map(Option::getOptionValue).orElse(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package cc.ryanc.halo.utils;
|
package cc.ryanc.halo.utils;
|
||||||
|
|
||||||
import cc.ryanc.halo.model.support.BackupDto;
|
|
||||||
import cc.ryanc.halo.model.support.Theme;
|
import cc.ryanc.halo.model.support.Theme;
|
||||||
import cn.hutool.core.io.FileUtil;
|
|
||||||
import cn.hutool.core.text.StrBuilder;
|
import cn.hutool.core.text.StrBuilder;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.qiniu.common.Zone;
|
import com.qiniu.common.Zone;
|
||||||
|
@ -208,17 +206,35 @@ public class HaloUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取所有主题
|
* Scan internal themes and user's themes
|
||||||
*
|
*
|
||||||
* @return List
|
* @return List
|
||||||
*/
|
*/
|
||||||
public static List<Theme> getThemes() {
|
public static List<Theme> getThemes() {
|
||||||
final List<Theme> themes = new ArrayList<>();
|
final List<Theme> themes = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
// 获取项目根路径
|
final File classPath = new File(ResourceUtils.getURL("classpath:").getPath());
|
||||||
final File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
|
final File internalThemesPath = new File(classPath.getAbsolutePath(), "templates/themes");
|
||||||
// 获取主题路径
|
themes.addAll(getThemesByPath(internalThemesPath));
|
||||||
final File themesPath = new File(basePath.getAbsolutePath(), "templates/themes");
|
|
||||||
|
final File userPath = new File(System.getProperties().getProperty("user.home"));
|
||||||
|
final File userThemesPath = new File(userPath.getAbsolutePath(),"halo/templates/themes");
|
||||||
|
themes.addAll(getThemesByPath(userThemesPath));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Themes scan failed", e);
|
||||||
|
}
|
||||||
|
return themes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scan themes by directory
|
||||||
|
*
|
||||||
|
* @param file file
|
||||||
|
* @return List<Theme>
|
||||||
|
*/
|
||||||
|
private static List<Theme> getThemesByPath(File themesPath) {
|
||||||
|
final List<Theme> themes = new ArrayList<>();
|
||||||
|
try {
|
||||||
final File[] files = themesPath.listFiles();
|
final File[] files = themesPath.listFiles();
|
||||||
if (null != files) {
|
if (null != files) {
|
||||||
Theme theme;
|
Theme theme;
|
||||||
|
|
|
@ -1,8 +1,16 @@
|
||||||
package cc.ryanc.halo.web.controller.admin;
|
package cc.ryanc.halo.web.controller.admin;
|
||||||
|
|
||||||
|
import cc.ryanc.halo.model.support.Theme;
|
||||||
|
import cc.ryanc.halo.service.OptionService;
|
||||||
|
import cc.ryanc.halo.utils.HaloUtils;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Themes controller
|
* Themes controller
|
||||||
*
|
*
|
||||||
|
@ -12,4 +20,22 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping(value = "/admin/themes")
|
@RequestMapping(value = "/admin/themes")
|
||||||
public class ThemeController {
|
public class ThemeController {
|
||||||
|
|
||||||
|
private OptionService optionService;
|
||||||
|
|
||||||
|
public ThemeController(OptionService optionService) {
|
||||||
|
this.optionService = optionService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
public String themes(Model model) {
|
||||||
|
Map<String, String> options = optionService.listOptions();
|
||||||
|
model.addAttribute("options",options);
|
||||||
|
|
||||||
|
List<Theme> themes = HaloUtils.getThemes();
|
||||||
|
|
||||||
|
model.addAttribute("themes", themes);
|
||||||
|
|
||||||
|
return "admin/admin_theme";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue