From 5fc32d6bba468b6e2353c89e240aa239a8dd860e Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 18 May 2021 12:23:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=85=B3=E4=BA=8E?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=20=E4=BB=A5=E5=8F=8A=20lic=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataease/controller/AboutController.java | 32 +++ .../io/dataease/service/AboutService.java | 54 +++++ frontend/src/api/system/about.js | 24 ++ frontend/src/assets/license_header.png | Bin 0 -> 32583 bytes frontend/src/layout/components/Licbar.vue | 6 +- frontend/src/layout/components/Topbar.vue | 9 +- frontend/src/layout/index.vue | 10 +- frontend/src/views/system/about/index.vue | 211 ++++++++++++++++++ 8 files changed, 337 insertions(+), 9 deletions(-) create mode 100644 backend/src/main/java/io/dataease/controller/AboutController.java create mode 100644 backend/src/main/java/io/dataease/service/AboutService.java create mode 100644 frontend/src/api/system/about.js create mode 100644 frontend/src/assets/license_header.png create mode 100644 frontend/src/views/system/about/index.vue diff --git a/backend/src/main/java/io/dataease/controller/AboutController.java b/backend/src/main/java/io/dataease/controller/AboutController.java new file mode 100644 index 0000000000..a4d9fa1e6d --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/AboutController.java @@ -0,0 +1,32 @@ +package io.dataease.controller; + + +import io.dataease.commons.license.F2CLicenseResponse; +import io.dataease.service.AboutService; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +@RequestMapping("/about") +@RestController +public class AboutController { + + @Resource + private AboutService aboutService; + + @PostMapping("/license/update") + public F2CLicenseResponse updateLicense(@RequestBody Map map) { + return aboutService.updateLicense(map.get("license")); + } + + @PostMapping("/license/validate") + public F2CLicenseResponse validateLicense(@RequestBody Map map) { + return aboutService.validateLicense(map.get("license")); + } + + @GetMapping("/build/version") + public Object getBuildVersion() { + return aboutService.getBuildVersion(); + } +} diff --git a/backend/src/main/java/io/dataease/service/AboutService.java b/backend/src/main/java/io/dataease/service/AboutService.java new file mode 100644 index 0000000000..70171f576b --- /dev/null +++ b/backend/src/main/java/io/dataease/service/AboutService.java @@ -0,0 +1,54 @@ +package io.dataease.service; + +import io.dataease.commons.license.DefaultLicenseService; +import io.dataease.commons.license.F2CLicenseResponse; +import io.dataease.commons.utils.CommonBeanFactory; +import io.dataease.commons.utils.LogUtil; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.File; +import java.util.Optional; + +@Service +public class AboutService { + private static final String BUILD_VERSION = "/opt/fit2cloud/conf/version"; + private static final String product = "dataease"; + + @Resource + private DefaultLicenseService defaultLicenseService; + + public F2CLicenseResponse updateLicense(String licenseKey) { + F2CLicenseResponse f2CLicenseResponse = defaultLicenseService.updateLicense(product, licenseKey); + return f2CLicenseResponse; + } + + public F2CLicenseResponse validateLicense(String licenseKey) { + if (StringUtils.isNotBlank(licenseKey)) { + return defaultLicenseService.validateLicense(product, licenseKey); + } else { + return defaultLicenseService.validateLicense(); + } + } + + public String getBuildVersion() { + try { + File file = new File(BUILD_VERSION); + if (file.exists()) { + String version = FileUtils.readFileToString(file, "UTF-8"); + if (StringUtils.isNotBlank(version)) { + return version; + } + } + String property = CommonBeanFactory.getBean(Environment.class).getProperty("cmp.version"); + String result = Optional.ofNullable(property).orElse("V1.0"); + return result; + } catch (Exception e) { + LogUtil.error("failed to get build version.", e); + } + return "unknown"; + } +} diff --git a/frontend/src/api/system/about.js b/frontend/src/api/system/about.js new file mode 100644 index 0000000000..b2a5d1739b --- /dev/null +++ b/frontend/src/api/system/about.js @@ -0,0 +1,24 @@ +import request from '@/utils/request' + +export function validate(data) { + return request({ + url: '/about/license/validate', + method: 'post', + data + }) +} + +export function buildVersion() { + return request({ + url: '/about/build/version', + method: 'get' + }) +} + +export function updateInfo(data) { + return request({ + url: '/about/license/update', + method: 'post', + data + }) +} diff --git a/frontend/src/assets/license_header.png b/frontend/src/assets/license_header.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd7dc62bc7dd46be4e1bcf6cdd235820f937862 GIT binary patch literal 32583 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 diff --git a/frontend/src/layout/components/Topbar.vue b/frontend/src/layout/components/Topbar.vue index ebb84789ec..86a7cb41cf 100644 --- a/frontend/src/layout/components/Topbar.vue +++ b/frontend/src/layout/components/Topbar.vue @@ -51,13 +51,16 @@ 重置密码 - + Docs - + + + 关于 + 退出 diff --git a/frontend/src/layout/index.vue b/frontend/src/layout/index.vue index 5a8fbb1abd..594e075b83 100644 --- a/frontend/src/layout/index.vue +++ b/frontend/src/layout/index.vue @@ -1,6 +1,6 @@