From 581ad855597442d14e158e7be2a5678da1b08efa Mon Sep 17 00:00:00 2001 From: WangXu10 Date: Tue, 8 Aug 2023 18:40:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=B3=BB=E7=BB=9F=E8=AE=BE=E7=BD=AE):=20?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=9B=BE=E7=89=87=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseDisplayController.java | 47 +++++++ .../system/service/BaseDisplayService.java | 71 ++++++++++ .../BaseDisplayControllerTests.java | 128 ++++++++++++++++++ .../test/resources/dml/init_display_test.sql | 9 ++ .../test/resources/dml/init_org_project.sql | 9 +- .../src/test/resources/dml/init_project.sql | 22 +-- .../src/test/resources/file/MS-full-logo.svg | 24 ++++ .../src/test/resources/file/favicon.ico | Bin 0 -> 1627 bytes .../src/test/resources/file/login-banner.jpg | Bin 0 -> 47305 bytes .../src/test/resources/file/login-logo.svg | 85 ++++++++++++ 10 files changed, 383 insertions(+), 12 deletions(-) create mode 100644 backend/services/system-setting/src/main/java/io/metersphere/system/controller/BaseDisplayController.java create mode 100644 backend/services/system-setting/src/main/java/io/metersphere/system/service/BaseDisplayService.java create mode 100644 backend/services/system-setting/src/test/java/io/metersphere/system/controller/BaseDisplayControllerTests.java create mode 100644 backend/services/system-setting/src/test/resources/dml/init_display_test.sql create mode 100644 backend/services/system-setting/src/test/resources/file/MS-full-logo.svg create mode 100644 backend/services/system-setting/src/test/resources/file/favicon.ico create mode 100644 backend/services/system-setting/src/test/resources/file/login-banner.jpg create mode 100644 backend/services/system-setting/src/test/resources/file/login-logo.svg diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/BaseDisplayController.java b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/BaseDisplayController.java new file mode 100644 index 0000000000..8b358ca49b --- /dev/null +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/BaseDisplayController.java @@ -0,0 +1,47 @@ +package io.metersphere.system.controller; + +import io.metersphere.system.service.BaseDisplayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; + +@Tag(name = "首页图片") +@RestController +@RequestMapping(value = "/base-display") +public class BaseDisplayController { + + @Resource + private BaseDisplayService displayService; + + + @Operation(summary = "获取icon图片") + @GetMapping("/get/icon") + public ResponseEntity getIcon() throws IOException { + return displayService.getFile("icon"); + } + + + @Operation(summary = "获取loginImage图片") + @GetMapping("/get/login-image") + public ResponseEntity getLoginImage() throws IOException { + return displayService.getFile("loginImage"); + } + + @Operation(summary = "获取loginLogo图片") + @GetMapping("/get/login-logo") + public ResponseEntity getLoginLogo() throws IOException { + return displayService.getFile("loginLogo"); + } + + @Operation(summary = "获取logoPlatform图片") + @GetMapping("/get/logo-platform") + public ResponseEntity getLogoPlatform() throws IOException { + return displayService.getFile("logoPlatform"); + } +} diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/BaseDisplayService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/BaseDisplayService.java new file mode 100644 index 0000000000..f6c9690cab --- /dev/null +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/BaseDisplayService.java @@ -0,0 +1,71 @@ +package io.metersphere.system.service; + +import io.metersphere.sdk.exception.MSException; +import io.metersphere.sdk.file.FileRequest; +import io.metersphere.sdk.file.MinioRepository; +import io.metersphere.sdk.log.constants.OperationLogModule; +import io.metersphere.system.domain.SystemParameter; +import io.metersphere.system.mapper.SystemParameterMapper; +import jakarta.annotation.Resource; +import org.apache.commons.io.IOUtils; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; + +@Service +@Transactional(rollbackFor = Exception.class) +public class BaseDisplayService { + + @Resource + private MinioRepository repository; + @Resource + private SystemParameterMapper systemParameterMapper; + + + public ResponseEntity getFile(String fileName) throws IOException { + byte[] bytes = null; + SystemParameter systemParameter = systemParameterMapper.selectByPrimaryKey("ui." + fileName); + if (systemParameter != null) { + FileRequest request = new FileRequest(); + request.setFileName(systemParameter.getParamValue()); + request.setProjectId("system"); + request.setResourceId(OperationLogModule.SYSTEM_PARAMETER_SETTING); + try { + bytes = repository.getFile(request); + } catch (Exception e) { + throw new MSException("get file error"); + } + } + + MediaType contentType = MediaType.parseMediaType("application/octet-stream"); + if (bytes == null) { + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(getClass().getClassLoader()); + switch (fileName) { + case "icon": + bytes = IOUtils.toByteArray(resolver.getResource("/static/favicon.ico").getInputStream()); + break; + case "logoPlatform": + bytes = IOUtils.toByteArray(resolver.getResource("/static/svg/MS-full-logo.svg").getInputStream()); + contentType = MediaType.valueOf("image/svg+xml"); + break; + case "loginImage": + bytes = IOUtils.toByteArray(resolver.getResource("/static/images/login-banner.jpg").getInputStream()); + break; + default: + bytes = IOUtils.toByteArray(resolver.getResource("/static/svg/login-logo.svg").getInputStream()); + contentType = MediaType.valueOf("image/svg+xml"); + break; + } + } + return ResponseEntity.ok() + .contentType(contentType) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"") + .body(bytes); + } + +} diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/BaseDisplayControllerTests.java b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/BaseDisplayControllerTests.java new file mode 100644 index 0000000000..39199a4486 --- /dev/null +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/BaseDisplayControllerTests.java @@ -0,0 +1,128 @@ +package io.metersphere.system.controller; + +import io.metersphere.sdk.base.BaseTest; +import io.metersphere.sdk.constants.SessionConstants; +import io.metersphere.sdk.file.FileRequest; +import io.metersphere.sdk.file.MinioRepository; +import io.metersphere.sdk.log.constants.OperationLogModule; +import jakarta.annotation.Resource; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; + +@SpringBootTest +@AutoConfigureMockMvc +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class BaseDisplayControllerTests extends BaseTest { + + public static final String DISPLAY_ICON = "/base-display/get/icon"; + public static final String DISPLAY_LOGINIMAGE = "/base-display/get/login-image"; + public static final String DISPLAY_LOGINLOGO = "/base-display/get/login-logo"; + public static final String DISPLAY_LOGOPLATFORM = "/base-display/get/logo-platform"; + + //默认图片 + @Resource + private MinioRepository repository; + + @Test + @Order(1) + public void getIconDefault() throws Exception { + this.requestGet(DISPLAY_ICON); + } + + @Test + @Order(2) + public void getLoginImageDefault() throws Exception { + this.requestGet(DISPLAY_LOGINIMAGE); + } + + @Test + @Order(3) + public void getLoginLogoDefault() throws Exception { + this.requestGet(DISPLAY_LOGINLOGO); + } + + @Test + @Order(4) + public void getLogoPlatformDefault() throws Exception { + this.requestGet(DISPLAY_LOGOPLATFORM); + } + + //文件先放入minio + @Test + @Order(6) + public void saveFile() throws Exception { + + saveImages("/file/favicon.ico","favicon","favicon.ico","ui.icon:favicon.ico"); + saveImages("/file/login-banner.jpg","login-banner","login-banner.jpg","ui.loginImage:login-banner.jpg"); + saveImages("/file/login-logo.svg","login-logo","login-logo.svg","ui.loginLogo:login-logo.svg"); + saveImages("/file/MS-full-logo.svg","MS-full-logo","MS-full-logo.svg","ui.logoPlatform:MS-full-logo.svg"); + + } + + private void saveImages(String url, String name, String originalFileName, String fileName) throws Exception{ + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(getClass().getClassLoader()); + byte[] bytes = IOUtils.toByteArray(resolver.getResource(url).getInputStream()); + MockMultipartFile mockFile = new MockMultipartFile(name, originalFileName, "application/octet-stream", bytes); + FileRequest request = new FileRequest(); + request.setFileName(fileName); + request.setProjectId("system"); + request.setResourceId(OperationLogModule.SYSTEM_PARAMETER_SETTING); + repository.saveFile(mockFile, request); + } + + + //取minio中的图片 + @Test + @Order(5) + @Sql(scripts = {"/dml/init_display_test.sql"}, + config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED), + executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + public void getIconError() throws Exception { + this.requestGet(DISPLAY_ICON); + } + + //取minio中的图片 + @Test + @Order(7) + public void getIcon() throws Exception { + this.requestGet(DISPLAY_ICON); + } + + @Test + @Order(7) + public void getLoginImage() throws Exception { + this.requestGet(DISPLAY_LOGINIMAGE); + } + + @Test + @Order(7) + public void getLoginLogo() throws Exception { + this.requestGet(DISPLAY_LOGINLOGO); + } + + @Test + @Order(8) + public void getLogoPlatform() throws Exception { + this.requestGet(DISPLAY_LOGOPLATFORM); + } + + private MvcResult requestGet(String url) throws Exception { + return mockMvc.perform(MockMvcRequestBuilders.get(url) + .header(SessionConstants.HEADER_TOKEN, sessionId) + .header(SessionConstants.CSRF_TOKEN, csrfToken)) + .andDo(print()).andReturn(); + } +} diff --git a/backend/services/system-setting/src/test/resources/dml/init_display_test.sql b/backend/services/system-setting/src/test/resources/dml/init_display_test.sql new file mode 100644 index 0000000000..647eeb328c --- /dev/null +++ b/backend/services/system-setting/src/test/resources/dml/init_display_test.sql @@ -0,0 +1,9 @@ +-- 模拟数据 +INSERT INTO system_parameter(`param_key`, `param_value`, `type`) VALUES ('ui.icon', 'ui.icon:favicon.ico', 'file'); +INSERT INTO system_parameter(`param_key`, `param_value`, `type`) VALUES ('ui.logoPlatform', 'ui.logoPlatform:MS-full-logo.svg', 'file'); +INSERT INTO system_parameter(`param_key`, `param_value`, `type`) VALUES ('ui.loginImage', 'ui.loginImage:login-banner.jpg', 'file'); +INSERT INTO system_parameter(`param_key`, `param_value`, `type`) VALUES ('ui.loginLogo', 'ui.loginLogo:login-logo.svg', 'file'); + + + + diff --git a/backend/services/system-setting/src/test/resources/dml/init_org_project.sql b/backend/services/system-setting/src/test/resources/dml/init_org_project.sql index c4d57320c3..be2ce31fb0 100644 --- a/backend/services/system-setting/src/test/resources/dml/init_org_project.sql +++ b/backend/services/system-setting/src/test/resources/dml/init_org_project.sql @@ -10,4 +10,11 @@ VALUES ('admin1', 'test1', 'admin1@metersphere.io', MD5('admin1@metersphere.io') replace into user(id, name, email, password, create_time, update_time, language, last_organization_id, phone, source, last_project_id, create_user, update_user) VALUES ('admin2', 'test2', 'admin2@metersphere.io', MD5('admin2@metersphere.io'), - UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, NULL, NUll, '', 'LOCAL', NULL, 'admin', 'admin'); \ No newline at end of file + UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, NULL, NUll, '', 'LOCAL', NULL, 'admin', 'admin'); + +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId1', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目1', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId2', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目2', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId3', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目3', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId4', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目4', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId5', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目5', '系统默认创建的项目', 'test', 'test', unix_timestamp() * 1000, unix_timestamp() * 1000); \ No newline at end of file diff --git a/backend/services/system-setting/src/test/resources/dml/init_project.sql b/backend/services/system-setting/src/test/resources/dml/init_project.sql index 6d691bad1e..b113486407 100644 --- a/backend/services/system-setting/src/test/resources/dml/init_project.sql +++ b/backend/services/system-setting/src/test/resources/dml/init_project.sql @@ -1,20 +1,20 @@ # 插入测试数据 -INSERT INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); -INSERT INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); -INSERT INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId1', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目1', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); -INSERT INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId2', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目2', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); -INSERT INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId3', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目3', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); -INSERT INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId4', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目4', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); -INSERT INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId5', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目5', '系统默认创建的项目', 'test', 'test', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId1', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目1', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId2', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目2', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId3', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目3', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId4', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目4', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000); +replace INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time) VALUES ('projectId5', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目5', '系统默认创建的项目', 'test', 'test', unix_timestamp() * 1000, unix_timestamp() * 1000); -insert into user(id, name, email, password, create_time, update_time, language, last_organization_id, phone, source, +replace into user(id, name, email, password, create_time, update_time, language, last_organization_id, phone, source, last_project_id, create_user, update_user) VALUES ('admin1', 'test1', 'admin1@metersphere.io', MD5('admin1@metersphere.io'), UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, NULL, NUll, '', 'LOCAL', 'projectId1', 'admin', 'admin'); -insert into user(id, name, email, password, create_time, update_time, language, last_organization_id, phone, source, +replace into user(id, name, email, password, create_time, update_time, language, last_organization_id, phone, source, last_project_id, create_user, update_user) VALUES ('admin2', 'test2', 'admin2@metersphere.io', MD5('admin2@metersphere.io'), UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, NULL, NUll, '', 'LOCAL', NULL, 'admin', 'admin'); -INSERT INTO user_role_relation VALUES ('c3bb9b4f-46d8-4952-9681-8889974487w','admin1','project_admin','projectId1','1684747668375','1684747668375'); -INSERT INTO user_role_relation VALUES ('c3bb9b4f-46d8-4952-9681-8889974487q','admin2','project_admin','projectId1','1684747668321','1684747668336'); \ No newline at end of file +replace INTO user_role_relation VALUES ('c3bb9b4f-46d8-4952-9681-8889974487w','admin1','project_admin','projectId1','1684747668375','1684747668375'); +replace INTO user_role_relation VALUES ('c3bb9b4f-46d8-4952-9681-8889974487q','admin2','project_admin','projectId1','1684747668321','1684747668336'); \ No newline at end of file diff --git a/backend/services/system-setting/src/test/resources/file/MS-full-logo.svg b/backend/services/system-setting/src/test/resources/file/MS-full-logo.svg new file mode 100644 index 0000000000..e8482400db --- /dev/null +++ b/backend/services/system-setting/src/test/resources/file/MS-full-logo.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/services/system-setting/src/test/resources/file/favicon.ico b/backend/services/system-setting/src/test/resources/file/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..45380f4db1048c70573ba774616ed68e0b4314d2 GIT binary patch literal 1627 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)n!3-o>S^vEPQjEnx?oNz1PwLbIIh+L^k;M!Q zddeWoSh3W;jDdmaV}MVHD^Rk+qMdlu?J*mUFm=JDkQoG(5w8H*SO^J0M)cQPk|WQYIN)W`{(cf|Np;!_*P*FiU^RbP2HKD7ytbFv$k)`>ZUEffBtUuo_ui0 ziAAMrAPVvrBcTPN@Bn7eOz`}+4UKF-Nm{{P?q zkFP$}*mj-Ued*ih?_b`3{rC6Z?Q{34ZM&Y|e);d;zk0{s&u_onJNKy3wSP*^yk~b` zKD_qi@{#K)+C^2?oeN7=Kf3bt_?oj9cVBDsol@h|aqG-opaXzt$F%*u5wp5OXUr~J za%R`XpWlD|`SZ6WtRLujAcCmr4w*4AX72S9x9k18ki{XgbMsexdh=yk%A#eh>#Ds# zzJ_arC;*c6PQ4IuxD*-}q7otq*9Bx?RR&QYyM3JsFwy@m3GxeO(8^9X=gYHVFes2< zOblcboWEYiJ(JxfNtmhp-T$whoIFthin$uzHy_0@$Y<$s<~XYD{CC2*FglE9%J;v^ z#F%|jSh8P!tYZ`KVx72(UHf#?!#Az_J^%mR(D`TLvLFAwKFwadanh^1o!43~|3BRH z{8QTwP*ne3)jxf~S0Donu5W{}{y*LiXA)vay@9FtW?0h>V$YO_^;X*q7CmBQFRG+@ z^Z(NjX4#Lws(F|a#3n733y1LhE&W+PHPpDU1jF%>H6By0TCfG{W_sRQEXGR*RNQ!Y8_+O zwQE-oFOia(JuBKlD*ASV&|BHLzOe=?-z}TB?B2eAA3ksjKYpz4`);ODsgzGv)#aXL zGi`l09|+n!`Lfo-Nk2M9fq-Zc~Y5NY>A;sjI`xP1j{caZifcUU&G| zQf+g`(%gGO`?hA@{0hY$O=<>yn2AUHx3vIVCg!0Cg-P00000 literal 0 HcmV?d00001 diff --git a/backend/services/system-setting/src/test/resources/file/login-banner.jpg b/backend/services/system-setting/src/test/resources/file/login-banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6211737f3acf6463c59858125ef3bfb96e370e7 GIT binary patch literal 47305 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 V-p%zs6cy_6awYZ;NBukV{{g5&-s%7V literal 0 HcmV?d00001 diff --git a/backend/services/system-setting/src/test/resources/file/login-logo.svg b/backend/services/system-setting/src/test/resources/file/login-logo.svg new file mode 100644 index 0000000000..14dc9179c8 --- /dev/null +++ b/backend/services/system-setting/src/test/resources/file/login-logo.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file