From a1faed2ef06127beb89d4a77987dee5bcd010691 Mon Sep 17 00:00:00 2001 From: Roman Shishkin <71883204+5h15h4k1n9@users.noreply.github.com> Date: Tue, 25 Mar 2025 22:50:25 +0300 Subject: [PATCH] 94 custom sponsor logos (#95) * feat: Updated pages * feat: Added new vars to properties * feat: Added logo service * feat: Updated controllers * feat: Renamed val (cherry picked from commit e926ed694b13df328234ce31a447fa4ef933d9f3) --- .../controller/impl/main/LoginController.kt | 9 +++- .../controller/impl/main/MainController.kt | 7 ++- .../impl/main/RegistrationController.kt | 9 +++- .../testsys/webclient/service/LogoService.kt | 14 ++++++ .../webclient/service/impl/LogoServiceImpl.kt | 50 +++++++++++++++++++ .../webclient/util/config/Configuration.kt | 10 +++- .../testsys/webclient/view/impl/LogosView.kt | 42 ++++++++++++++++ src/main/resources/application.yml | 3 ++ src/main/resources/static/css/modal.css | 25 ++++++++++ .../resources/templates/fragments/main.html | 18 +++++++ src/main/resources/templates/login.html | 4 ++ src/main/resources/templates/main.html | 4 ++ .../resources/templates/registration.html | 4 ++ 13 files changed, 194 insertions(+), 5 deletions(-) create mode 100644 src/main/kotlin/trik/testsys/webclient/service/LogoService.kt create mode 100644 src/main/kotlin/trik/testsys/webclient/service/impl/LogoServiceImpl.kt create mode 100644 src/main/kotlin/trik/testsys/webclient/view/impl/LogosView.kt diff --git a/src/main/kotlin/trik/testsys/webclient/controller/impl/main/LoginController.kt b/src/main/kotlin/trik/testsys/webclient/controller/impl/main/LoginController.kt index 4a84370c..8ee983aa 100644 --- a/src/main/kotlin/trik/testsys/webclient/controller/impl/main/LoginController.kt +++ b/src/main/kotlin/trik/testsys/webclient/controller/impl/main/LoginController.kt @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.servlet.mvc.support.RedirectAttributes +import trik.testsys.webclient.service.LogoService import trik.testsys.webclient.service.security.login.impl.LoginData import trik.testsys.webclient.service.security.login.impl.LoginProcessor import trik.testsys.webclient.util.addInvalidAccessTokenMessage @@ -20,12 +21,18 @@ import trik.testsys.webclient.util.addSessionActiveInfo @RequestMapping("/login") class LoginController( private val loginData: LoginData, - private val loginProcessor: LoginProcessor + private val loginProcessor: LoginProcessor, + + private val logoService: LogoService ) { @GetMapping fun loginGet(model: Model): String { loginData.accessToken?.let { model.addSessionActiveInfo() } + + val logos = logoService.getLogos() + model.addAttribute("logos", logos) + return LOGIN_PAGE } diff --git a/src/main/kotlin/trik/testsys/webclient/controller/impl/main/MainController.kt b/src/main/kotlin/trik/testsys/webclient/controller/impl/main/MainController.kt index ce9d742a..152ffaa9 100644 --- a/src/main/kotlin/trik/testsys/webclient/controller/impl/main/MainController.kt +++ b/src/main/kotlin/trik/testsys/webclient/controller/impl/main/MainController.kt @@ -4,6 +4,7 @@ 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 trik.testsys.webclient.service.LogoService import trik.testsys.webclient.service.security.login.impl.LoginData import trik.testsys.webclient.util.addSessionActiveInfo @@ -14,13 +15,17 @@ import trik.testsys.webclient.util.addSessionActiveInfo @Controller @RequestMapping(MainController.MAIN_PATH) class MainController( - private val loginData: LoginData + private val loginData: LoginData, + private val logoService: LogoService ) { @GetMapping fun mainGet(model: Model): String { loginData.accessToken?.let { model.addSessionActiveInfo() } + val logos = logoService.getLogos() + model.addAttribute("logos", logos) + return MAIN_PAGE } diff --git a/src/main/kotlin/trik/testsys/webclient/controller/impl/main/RegistrationController.kt b/src/main/kotlin/trik/testsys/webclient/controller/impl/main/RegistrationController.kt index c6a26338..8b99842d 100644 --- a/src/main/kotlin/trik/testsys/webclient/controller/impl/main/RegistrationController.kt +++ b/src/main/kotlin/trik/testsys/webclient/controller/impl/main/RegistrationController.kt @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.servlet.View import org.springframework.web.servlet.mvc.support.RedirectAttributes import trik.testsys.core.entity.user.UserEntity +import trik.testsys.webclient.service.LogoService import trik.testsys.webclient.service.entity.RegEntityService import trik.testsys.webclient.service.security.login.impl.LoginData import trik.testsys.webclient.util.addPopupMessage @@ -25,7 +26,9 @@ import javax.servlet.http.HttpServletRequest @RequestMapping(RegistrationController.REGISTRATION_PATH) class RegistrationController( context: ApplicationContext, - private val loginData: LoginData + private val loginData: LoginData, + + private val logoService: LogoService ) { private val registrationServices = context.getBeansOfType(RegEntityService::class.java).values @@ -33,6 +36,10 @@ class RegistrationController( @GetMapping fun registrationGet(model: Model): String { loginData.accessToken?.let { model.addSessionActiveInfo() } + + val logos = logoService.getLogos() + model.addAttribute("logos", logos) + return REGISTRATION_PAGE } diff --git a/src/main/kotlin/trik/testsys/webclient/service/LogoService.kt b/src/main/kotlin/trik/testsys/webclient/service/LogoService.kt new file mode 100644 index 00000000..fd298241 --- /dev/null +++ b/src/main/kotlin/trik/testsys/webclient/service/LogoService.kt @@ -0,0 +1,14 @@ +package trik.testsys.webclient.service + +import trik.testsys.webclient.view.impl.LogosView + +/** + * Service for logos management. + * + * @author Roman Shishkin + * @since %CURRENT_VERSION% + */ +interface LogoService { + + fun getLogos(): LogosView +} \ No newline at end of file diff --git a/src/main/kotlin/trik/testsys/webclient/service/impl/LogoServiceImpl.kt b/src/main/kotlin/trik/testsys/webclient/service/impl/LogoServiceImpl.kt new file mode 100644 index 00000000..2ecd926b --- /dev/null +++ b/src/main/kotlin/trik/testsys/webclient/service/impl/LogoServiceImpl.kt @@ -0,0 +1,50 @@ +package trik.testsys.webclient.service.impl + +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Service +import trik.testsys.webclient.service.LogoService +import trik.testsys.webclient.view.impl.LogosView +import java.io.File + +/** + * @author Roman Shishkin + * @since %CURRENT_VERSION% + */ +@Service +class LogoServiceImpl( + @Value("\${path.logos.sponsor}") private val sponsorLogosPath: String, + @Value("\${path.logos.main}") private val mainLogoFilePath: String, +) : LogoService { + + private val sponsorLogosDir = File(sponsorLogosPath) + private val mainLogo = File(mainLogoFilePath) + + init { + if (!sponsorLogosDir.exists() || !sponsorLogosDir.isDirectory) { + logger.warn("Sponsor logos directory not found: $sponsorLogosPath. Creating...") + sponsorLogosDir.mkdirs() + } + + if (!mainLogo.exists() || !mainLogo.isFile) { + logger.warn("Main logo file not found: $mainLogoFilePath") + } + } + + override fun getLogos(): LogosView { + val builder = LogosView.builder() + + sponsorLogosDir.listFiles() + ?.filter { it.isFile } + ?.forEach { builder.addSponsorLogo(it.path) } + + mainLogo.takeIf { it.exists() }?.let { builder.addMainLogo(it.path) } + + return builder.build() + } + + companion object { + + private val logger = LoggerFactory.getLogger(LogoServiceImpl::class.java) + } +} \ No newline at end of file diff --git a/src/main/kotlin/trik/testsys/webclient/util/config/Configuration.kt b/src/main/kotlin/trik/testsys/webclient/util/config/Configuration.kt index 2204e0ec..fdadd473 100644 --- a/src/main/kotlin/trik/testsys/webclient/util/config/Configuration.kt +++ b/src/main/kotlin/trik/testsys/webclient/util/config/Configuration.kt @@ -1,5 +1,6 @@ package trik.testsys.webclient.util.config +import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.EnableAspectJAutoProxy @@ -19,7 +20,10 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer @EnableScheduling @EnableAspectJAutoProxy @EnableWebMvc -class Configuration : WebMvcConfigurer { +class Configuration( + @Value("\${path.logos.sponsor}") private val sponsorLogosPath: String, + @Value("\${path.logos.main}") private val mainLogoFilePath: String +) : WebMvcConfigurer { override fun addResourceHandlers(registry: ResourceHandlerRegistry) { registry.addResourceHandler( @@ -31,7 +35,9 @@ class Configuration : WebMvcConfigurer { "classpath:/static/img/", "classpath:/static/css/", "classpath:/static/js/", - "classpath:/static/assets/" + "classpath:/static/assets/", + "file:$sponsorLogosPath/", + "file:$mainLogoFilePath" ) } diff --git a/src/main/kotlin/trik/testsys/webclient/view/impl/LogosView.kt b/src/main/kotlin/trik/testsys/webclient/view/impl/LogosView.kt new file mode 100644 index 00000000..ee489383 --- /dev/null +++ b/src/main/kotlin/trik/testsys/webclient/view/impl/LogosView.kt @@ -0,0 +1,42 @@ +package trik.testsys.webclient.view.impl + +/** + * View for sponsor logos. + * + * @author Roman Shishkin + * @since %CURRENT_VERSION% + */ +data class LogosView( + val hasSponsors: Boolean = false, + val hasMain: Boolean = false, + val sponsorLogos: List? = null, + val mainLogo: LogoView? = null +) { + + data class LogoView(val path: String, val name: String = path.substringAfterLast('/')) + + class Builder { + + private var sponsorLogos: MutableList = mutableListOf() + private var mainLogo: LogoView? = null + + fun addSponsorLogo(path: String) = apply { sponsorLogos.add(LogoView(path)) } + + fun addMainLogo(path: String) = apply { mainLogo = LogoView(path) } + + fun build(): LogosView { + return LogosView( + hasSponsors = sponsorLogos.isNotEmpty(), + hasMain = mainLogo != null, + sponsorLogos, + mainLogo) + } + } + + companion object { + + fun empty() = LogosView() + + fun builder() = Builder() + } +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0ef719a8..b0cc4667 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -68,6 +68,9 @@ path: verdicts: "${PWD}/data/files/verdicts/" recordings: "${PWD}/data/files/recordings/" results: "${PWD}/data/files/results/" + logos: + sponsor: "${PWD}/data/logos/sponsor/" + main: "${PWD}/data/logos/main.png" trik-studio-version: "${TRIK_STUDIO_VERSION:latest}" grading-node-addresses: "${GRADING_NODE_ADDRESSES:}" diff --git a/src/main/resources/static/css/modal.css b/src/main/resources/static/css/modal.css index 690937bd..b19e71c1 100644 --- a/src/main/resources/static/css/modal.css +++ b/src/main/resources/static/css/modal.css @@ -11,6 +11,7 @@ background-repeat: no-repeat; background-size: 50%; background-position: center; + flex-direction: column; } /* Окно (модальное) */ @@ -75,3 +76,27 @@ transform: scale(1); } } + +.main-logo { + margin: 10px 0; + height: 120px; +} + +.main-logo img { + height: 100%; +} + +.sponsor-logos { + display: flex; + justify-content: center; + gap: 20px; + margin: 10px 0; + height: 120px; + width: auto; +} + +.sponsor-logos img { + height: 100%; + object-fit: contain; + margin: auto; +} diff --git a/src/main/resources/templates/fragments/main.html b/src/main/resources/templates/fragments/main.html index 6e20f774..dac18e57 100644 --- a/src/main/resources/templates/fragments/main.html +++ b/src/main/resources/templates/fragments/main.html @@ -23,4 +23,22 @@
+ +
+ +
+ + +
+ +
+ \ No newline at end of file diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html index 9b66974e..0fc3f5fb 100644 --- a/src/main/resources/templates/login.html +++ b/src/main/resources/templates/login.html @@ -14,6 +14,8 @@
diff --git a/src/main/resources/templates/main.html b/src/main/resources/templates/main.html index d7519890..f702b074 100644 --- a/src/main/resources/templates/main.html +++ b/src/main/resources/templates/main.html @@ -14,6 +14,8 @@
diff --git a/src/main/resources/templates/registration.html b/src/main/resources/templates/registration.html index 504fd5e0..865f1e1d 100644 --- a/src/main/resources/templates/registration.html +++ b/src/main/resources/templates/registration.html @@ -14,6 +14,8 @@