diff --git a/src/main/java/cn/celess/blog/BlogApplication.java b/src/main/java/cn/celess/blog/BlogApplication.java index dfa06c9..52c7e0e 100644 --- a/src/main/java/cn/celess/blog/BlogApplication.java +++ b/src/main/java/cn/celess/blog/BlogApplication.java @@ -1,9 +1,11 @@ package cn.celess.blog; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.ApplicationArguments; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.scheduling.annotation.EnableAsync; /** @@ -13,9 +15,20 @@ import org.springframework.scheduling.annotation.EnableAsync; @EnableAsync @MapperScan("cn.celess.blog.mapper") public class BlogApplication { - public static ApplicationContext context; + public static ConfigurableApplicationContext context; public static void main(String[] args) { context = SpringApplication.run(BlogApplication.class, args); } + + public static void restart() { + ApplicationArguments args = context.getBean(ApplicationArguments.class); + + Thread thread = new Thread(() -> { + context.close(); + context = SpringApplication.run(BlogApplication.class, args.getSourceArgs()); + }); + thread.setDaemon(false); + thread.start(); + } } diff --git a/src/main/java/cn/celess/blog/controller/InstallController.java b/src/main/java/cn/celess/blog/controller/InstallController.java new file mode 100644 index 0000000..6354ca2 --- /dev/null +++ b/src/main/java/cn/celess/blog/controller/InstallController.java @@ -0,0 +1,103 @@ +package cn.celess.blog.controller; + +import cn.celess.blog.BlogApplication; +import cn.celess.blog.enmu.ConfigKeyEnum; +import cn.celess.blog.enmu.ResponseEnum; +import cn.celess.blog.entity.Config; +import cn.celess.blog.entity.InstallParam; +import cn.celess.blog.entity.Response; +import cn.celess.blog.exception.MyException; +import cn.celess.blog.mapper.ConfigMapper; +import cn.celess.blog.service.fileserviceimpl.LocalFileServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.io.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +/** + * @author : xiaohai + * @date : 2020/10/18 15:36 + * @desc : + */ +@Slf4j +@Controller +public class InstallController { + @Autowired + ConfigMapper configMapper; + + public static final String MYSQL_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver"; + public static final String H2_DRIVER_CLASS_NAME = "org.h2.Driver"; + + @GetMapping("/is_install") + @ResponseBody + public Response> isInstall() { + Config installed = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); + Boolean isInstall = Boolean.valueOf(installed.getValue()); + Map result = new HashMap<>(3); + result.put("is_install", isInstall); + if (isInstall) { + Map configMap = configMapper.getConfigurations() + .stream() + .filter(config -> config.getValue() != null) + .collect(Collectors.toMap(Config::getName, Config::getValue)); + result.put(ConfigKeyEnum.FILE_TYPE.getKey(), configMap.get(ConfigKeyEnum.FILE_TYPE.getKey())); + result.put(ConfigKeyEnum.DB_TYPE.getKey(), configMap.get(ConfigKeyEnum.DB_TYPE.getKey())); + } + return Response.success(result); + } + + + @PostMapping("/install") + @ResponseBody + public Response install(@RequestBody InstallParam installParam) throws IOException { + Config install = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); + boolean isInstall = Boolean.parseBoolean(install.getValue()); + if (isInstall) { + throw new MyException(ResponseEnum.FAILURE, "已经安装过了"); + } + + Config config = new Config(ConfigKeyEnum.DB_TYPE); + config.setValue(installParam.getDbType()); + Properties properties = new Properties(); + if ("h2".equals(installParam.getDbType())) { + properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), H2_DRIVER_CLASS_NAME); + } else { + properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), MYSQL_DRIVER_CLASS_NAME); + } + properties.setProperty(ConfigKeyEnum.DB_URL.getKey(), installParam.getDbUrl()); + properties.setProperty(ConfigKeyEnum.DB_USERNAME.getKey(), installParam.getDbUsername()); + properties.setProperty(ConfigKeyEnum.DB_PASSWORD.getKey(), installParam.getDbPassword()); + + Config configuration = configMapper.getConfiguration(ConfigKeyEnum.BLOG_DB_PATH.getKey()); + + File file = new File(LocalFileServiceImpl.getPath(configuration.getValue())); + if (!file.exists() && file.createNewFile()) { + log.info("创建数据库配置文件: {}", file.getAbsolutePath()); + } + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(file); + properties.load(fis); + + configMapper.addConfiguration(config); + properties.store(fos, "DB CONFIG"); + + install.setValue(Boolean.valueOf(true).toString()); + configMapper.updateConfiguration(install); + + log.info("重启..."); + + // 重启 + BlogApplication.restart(); + + return Response.success(installParam); + } +} diff --git a/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java b/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java index 2f4f551..d25e59c 100644 --- a/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java +++ b/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java @@ -16,7 +16,13 @@ public enum ConfigKeyEnum { FILE_QINIU_BUCKET("file.qiniu.bucket"), FILE_LOCAL_DIRECTORY_PATH("file.local.directoryPath"), BLOG_FILE_PATH("blog.file.path"), - DB_TYPE("db.type"); + BLOG_INSTALLED("blog.installed"), + DB_TYPE("db.type"), + DB_URL("spring.datasource.url"), + DB_USERNAME("spring.datasource.username"), + DB_PASSWORD("spring.datasource.password"), + DB_DRIVER_CLASS_NAME("spring.datasource.driver-class-name"), + BLOG_DB_PATH("blog.db.path"); private final String key; diff --git a/src/main/java/cn/celess/blog/entity/Config.java b/src/main/java/cn/celess/blog/entity/Config.java index 5cdfcbd..1668e2b 100644 --- a/src/main/java/cn/celess/blog/entity/Config.java +++ b/src/main/java/cn/celess/blog/entity/Config.java @@ -1,6 +1,8 @@ package cn.celess.blog.entity; +import cn.celess.blog.enmu.ConfigKeyEnum; import lombok.Data; +import lombok.NoArgsConstructor; /** * @author : xiaohai @@ -8,8 +10,17 @@ import lombok.Data; * @desc : */ @Data +@NoArgsConstructor public class Config { private Integer id; private String name; private String value; + + public Config(String name) { + this.name = name; + } + + public Config(ConfigKeyEnum e) { + this.name = e.getKey(); + } } diff --git a/src/main/java/cn/celess/blog/entity/InstallParam.java b/src/main/java/cn/celess/blog/entity/InstallParam.java new file mode 100644 index 0000000..b73cb7b --- /dev/null +++ b/src/main/java/cn/celess/blog/entity/InstallParam.java @@ -0,0 +1,16 @@ +package cn.celess.blog.entity; + +import lombok.Data; + +/** + * @author : xiaohai + * @date : 2020/10/18 14:52 + * @desc : + */ +@Data +public class InstallParam { + private String dbType; + private String dbUrl; + private String dbUsername; + private String dbPassword; +} diff --git a/src/main/resources/sql/data.sql b/src/main/resources/sql/data.sql index 0c80ed2..0204f52 100644 --- a/src/main/resources/sql/data.sql +++ b/src/main/resources/sql/data.sql @@ -221,4 +221,5 @@ VALUES (1, 'file.type', 'local'), (4, 'file.qiniu.bucket', null), (5, 'blog.file.path', '~/blog/'), (6, 'file.local.directoryPath', '~/blog/files/'), - (7, 'db.type', 'h2') + (8, 'blog.installed', 'false'), + (9, 'blog.db.path', '~/blog/db.properties') \ No newline at end of file