Compare commits

...

2 Commits

Author SHA1 Message Date
lunaticbum
69d2df4ac4 ... 2024-10-23 10:07:45 +09:00
lunaticbum
c4001848fc ... 2024-10-21 17:25:49 +09:00
26 changed files with 708 additions and 205 deletions

View File

@ -1,8 +1,13 @@
import com.github.jk1.license.render.*
import com.github.jk1.license.filter.ExcludeTransitiveDependenciesFilter
import com.github.jk1.license.filter.LicenseBundleNormalizer
plugins { plugins {
kotlin("jvm") version "1.9.25" kotlin("jvm") version "1.9.25"
kotlin("plugin.spring") version "1.9.25" kotlin("plugin.spring") version "1.9.25"
id("org.springframework.boot") version "3.3.4" id("org.springframework.boot") version "3.3.4"
id("io.spring.dependency-management") version "1.1.6" id("io.spring.dependency-management") version "1.1.6"
id("com.github.jk1.dependency-license-report") version "2.0"
} }
group = "kr.lunaticbum.back" group = "kr.lunaticbum.back"
@ -44,6 +49,7 @@ dependencies {
implementation("org.springframework.boot:spring-boot-starter-thymeleaf") implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect") implementation("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")
implementation ("org.jsoup:jsoup:1.18.1") implementation ("org.jsoup:jsoup:1.18.1")
implementation ("com.drewnoakes:metadata-extractor:2.19.0")
implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-security")
compileOnly("org.projectlombok:lombok") compileOnly("org.projectlombok:lombok")
runtimeOnly("org.mariadb.jdbc:mariadb-java-client") runtimeOnly("org.mariadb.jdbc:mariadb-java-client")
@ -100,3 +106,19 @@ tasks.jar {
} }
licenseReport {
// 라이센스 고지 파일을 반환할 경로 default는 $projectDir/reports/dependency-license
outputDir = "$projectDir/build/licenses"
// markdown 생성
// renderers = listOf(InventoryMarkdownReportRenderer()).toTypedArray()
// html 생성
renderers = listOf(InventoryHtmlReportRenderer()).toTypedArray()
// xml 생성
// renderers = [new XmlReportRenderer()]
// 보고서에 첫 번째 수준 종속성만 표기
filters = listOf(LicenseBundleNormalizer(), ExcludeTransitiveDependenciesFilter()).toTypedArray()
}

View File

@ -1,13 +1,15 @@
package kr.lunaticbum.back.lun.controllers package kr.lunaticbum.back.lun.controllers
import com.drew.imaging.ImageMetadataReader
import com.drew.metadata.Metadata
import com.google.gson.Gson import com.google.gson.Gson
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse import jakarta.servlet.http.HttpServletResponse
import kr.lunaticbum.back.lun.configs.GlobalEnvironment import kr.lunaticbum.back.lun.configs.GlobalEnvironment
import kr.lunaticbum.back.lun.model.CurrentWeather import kr.lunaticbum.back.lun.controllers.UserController.Companion.ApiKeyWordKey
import kr.lunaticbum.back.lun.model.FileSaveResult import kr.lunaticbum.back.lun.controllers.UserController.Companion.EncType11
import kr.lunaticbum.back.lun.model.LocationLogService import kr.lunaticbum.back.lun.controllers.UserController.Companion.EncTypeKey
import kr.lunaticbum.back.lun.model.ResponceResult import kr.lunaticbum.back.lun.model.*
import kr.lunaticbum.back.lun.utils.LogService import kr.lunaticbum.back.lun.utils.LogService
import kr.lunaticbum.back.lun.utils.getFileExtension import kr.lunaticbum.back.lun.utils.getFileExtension
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
@ -16,6 +18,7 @@ import org.springframework.core.io.Resource
import org.springframework.core.io.UrlResource import org.springframework.core.io.UrlResource
import org.springframework.http.MediaType import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.*
import org.springframework.web.multipart.MultipartFile import org.springframework.web.multipart.MultipartFile
import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.WebClient
@ -35,11 +38,22 @@ class BlogController() {
private lateinit var locationLogService: LocationLogService private lateinit var locationLogService: LocationLogService
@Autowired @Autowired
lateinit var logService: LogService private lateinit var postManageg: PostManageg
@GetMapping("write") @Autowired
fun writ() : ModelAndView{ lateinit var logService: LogService
val WRITE_PERMISSION_KEY = "PERMISSION"
@GetMapping("write/{token}","write")
fun writ(@PathVariable token : String? ) : ModelAndView{
val vm = ModelAndView("content/blog/write") val vm = ModelAndView("content/blog/write")
if (token.equals("TEMP_TOKEN_VIBUM")) {
vm.modelMap.put(WRITE_PERMISSION_KEY,"OK")
vm.modelMap.put(EncTypeKey, EncType11)
vm.modelMap.put(ApiKeyWordKey,"WRITE")
vm.modelMap.put("title","회원이 들어는 구나~!!")
} else {
vm.modelMap.put(WRITE_PERMISSION_KEY,"NO")
}
// when(System.currentTimeMillis() % 5L) { // when(System.currentTimeMillis() % 5L) {
// 0L -> vm.modelMap.put(EncTypeKey,"T4") // 0L -> vm.modelMap.put(EncTypeKey,"T4")
// 1L -> vm.modelMap.put(EncTypeKey,"T3") // 1L -> vm.modelMap.put(EncTypeKey,"T3")
@ -50,6 +64,53 @@ class BlogController() {
return vm return vm
} }
@PostMapping("post.ajax")
fun post(httpServletRequest: HttpServletRequest, @RequestBody jsonString: String) : ResponseEntity<ResponceResult> {
logService.log("${httpServletRequest.requestURI}")
logService.log(jsonString)
var lResultCode = 0
var lResultMsg = "Suscces"
var u : UserDetails? = null
val decodedBytes: ByteArray = Base64.getDecoder().decode(jsonString)
String(decodedBytes).let {
Gson().fromJson<RequestModel>(it, RequestModel::class.java)?.let { model ->
logService.log(Gson().toJson(model))
model.data?.let { jsonString ->
try {
val reqString = jsonString.split(globalEvv.padding(model.getKeyword()))
val nb = arrayListOf<String>()
val na = arrayListOf<String>()
reqString[0].replace(globalEvv.padding(model.getKeyword()),"").split("").toList().let { na.addAll(it) }
reqString[1].replace(globalEvv.padding(model.getKeyword()),"").split("").toList().let { nb.addAll(it) }
var max = nb.size + na.size
var fullData = arrayListOf<String>()
for (idx in 0..max) { if (idx % 2 == 0) { if (nb.size > 0) { fullData.add(nb.removeLast()) } } else { if (na.size > 0) { fullData.add(na.removeLast()) } } }
logService.log(fullData.joinToString(""))
val target = Gson().fromJson(fullData.joinToString(""), Post::class.java) ?: Post()
var user = postManageg.save(target)
if (user != null) {
lResultMsg = "save post"
lResultCode = 0
} else {
lResultMsg = "not founding user[can't find same id,email.. ]"
lResultCode = 7100
}
} catch (e: Exception) {
e.printStackTrace()
lResultMsg = "unknown exception"
lResultCode = 7999
}
}
}
}
val responce = ResponseEntity.ok().headers {
}.contentType(MediaType.APPLICATION_JSON).body(ResponceResult().apply {
this.resultCode = lResultCode
this.resultMsg = lResultMsg
})
return responce
}
@GetMapping("viewer/{blogId}") @GetMapping("viewer/{blogId}")
fun viewer(@PathVariable blogId : String) : ModelAndView{ fun viewer(@PathVariable blogId : String) : ModelAndView{
val vm = ModelAndView("content/blog/viewer") val vm = ModelAndView("content/blog/viewer")
@ -66,7 +127,7 @@ class BlogController() {
@GetMapping("recent") @GetMapping("recent")
fun recent() : ModelAndView{ fun recent() : ModelAndView{
val vm = ModelAndView("content/blog/viewer") val vm = ModelAndView("content/blog/viewer")
locationLogService.find50().forEach { locationLogService.find20().forEach {
logService.log(Gson().toJson(it)) logService.log(Gson().toJson(it))
} }
locationLogService.getLocationLog()?.let { locationLogService.getLocationLog()?.let {
@ -156,6 +217,13 @@ class BlogController() {
// printWriter.flush() // printWriter.flush()
logService.log("imgUploadPath $imgUploadPath") logService.log("imgUploadPath $imgUploadPath")
logService.log("imgUploadPath ${File(imgUploadPath).exists()}") logService.log("imgUploadPath ${File(imgUploadPath).exists()}")
val metadata: Metadata? = ImageMetadataReader.readMetadata(File(imgUploadPath))
metadata?.let {
it.directories?.forEach { directory ->
logService.log(directory.name)
logService.log(directory.tags.map { tag -> logService.log("tag.tagName >>> ${tag.tagName} || tag.description ${tag.description}")}.joinToString(" \n"))
}
}
} catch (e: IOException) { } catch (e: IOException) {
e.printStackTrace() e.printStackTrace()
} finally { } finally {

View File

@ -11,9 +11,9 @@ import kr.lunaticbum.back.lun.utils.LogService
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.MediaType import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.*
import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.WebClient
import org.springframework.web.servlet.ModelAndView
import java.util.* import java.util.*
@ -29,6 +29,19 @@ class BumsPrivate {
@Autowired @Autowired
lateinit var locationService: LocationLogService lateinit var locationService: LocationLogService
@GetMapping("where")
fun where() : ModelAndView {
val m = ModelAndView("content/private/where")
locationService.find20().apply {
m.modelMap.put("locations",this.reversed())
forEach {
logService.log(it.timeString.plus(it.mAddressLines.joinToString(",")))
}
}
m.modelMap.put("title","돼지 여기있다요~!!")
return m
}
@ResponseBody @ResponseBody
@PostMapping("save/loc.api") @PostMapping("save/loc.api")
fun login(httpServletRequest: HttpServletRequest, @RequestBody jsonString: String) : ResponseEntity<ResponceResult> { fun login(httpServletRequest: HttpServletRequest, @RequestBody jsonString: String) : ResponseEntity<ResponceResult> {

View File

@ -0,0 +1,40 @@
package kr.lunaticbum.back.lun.controllers
import com.google.gson.Gson
import kr.lunaticbum.back.lun.model.PostManageg
import kr.lunaticbum.back.lun.utils.LogService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.servlet.ModelAndView
@RestController
@RequestMapping()
class Home {
@Autowired
lateinit var logService: LogService
@Autowired
private lateinit var postManageg: PostManageg
@GetMapping("/","/home")
fun home() : ModelAndView {
val vm = ModelAndView("content/home")
vm.modelMap.put("posts", postManageg.find20().apply {
this.forEach {
logService.log(Gson().toJson(it))
}
})
return vm
}
@GetMapping("/licenses")
fun licenses() : ModelAndView {
val vm = ModelAndView("content/licenses")
return vm
}
}

View File

@ -17,8 +17,12 @@ import org.springframework.context.annotation.Bean
import org.springframework.scheduling.annotation.Scheduled import org.springframework.scheduling.annotation.Scheduled
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.*
import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.WebClient
import java.math.BigDecimal
import java.math.RoundingMode
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.time.Duration
import java.util.* import java.util.*
import java.util.concurrent.TimeUnit
@RestController @RestController
@ -130,19 +134,21 @@ class Telegram {
) { ) {
locationLogService.getLocationLog()?.let { locationLogService.getLocationLog()?.let {
try { try {
val client0 = WebClient.create() WebClient.create().get()
val result = client0.get()
.uri("http://api.weatherapi.com/v1/current.json?key=${globalEvv.weatherApiKey}&q=${it.mLatitude},${it.mLongitude}&aqi=no") .uri("http://api.weatherapi.com/v1/current.json?key=${globalEvv.weatherApiKey}&q=${it.mLatitude},${it.mLongitude}&aqi=no")
.retrieve() .retrieve()
.bodyToMono(String::class.java) .bodyToMono(String::class.java)
.block() ?: "FAIL" .timeout(Duration.ofSeconds(30L))
Gson().fromJson(result, CurrentWeather::class.java)?.let { sss -> .block()?.let { result ->
val client = WebClient.create() Gson().fromJson(result, CurrentWeather::class.java)?.let { sss ->
client.get() val fullUrl = "https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage?chat_id=${globalEvv.telegramMyId}&text=${sss.getSummaryInfo(BigDecimal(it.mLatitude).setScale(3, RoundingMode.HALF_UP).toString(),BigDecimal(it.mLongitude).setScale(3, RoundingMode.HALF_UP).toString())}"
.uri("https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage?chat_id=${globalEvv.telegramMyId}&text=${sss.getSummaryInfo()}") logService.log("fullUrl >>> ${fullUrl}")
.retrieve() WebClient.create().get()
.bodyToMono(String::class.java).block() ?: "FAIL" .uri(fullUrl)
} .retrieve()
.bodyToMono(String::class.java).block() ?: "FAIL"
}
}
} }
catch (e : Exception) { catch (e : Exception) {

View File

@ -23,12 +23,15 @@ import kotlin.math.log
@RestController @RestController
@RequestMapping("/user") @RequestMapping("/user")
class UserController { class UserController {
val EncTypeKey = "enc" companion object{
val EncType00 = "T0" val EncTypeKey = "enc"
val EncType11 = "T3" val EncType00 = "T0"
val EncType10 = "T2" val EncType11 = "T3"
val EncType01 = "T1" val EncType10 = "T2"
val ApiKeyWordKey = "keyword" val EncType01 = "T1"
val ApiKeyWordKey = "keyword"
}
@Autowired @Autowired
lateinit var globalEvv : GlobalEnvironment lateinit var globalEvv : GlobalEnvironment
@ -54,6 +57,7 @@ class UserController {
logService.log(file.absolutePath) logService.log(file.absolutePath)
vm.modelMap.put(EncTypeKey,EncType11) vm.modelMap.put(EncTypeKey,EncType11)
vm.modelMap.put(ApiKeyWordKey,"JOIN") vm.modelMap.put(ApiKeyWordKey,"JOIN")
vm.modelMap.put("title","회원이 들어는 구나~!!")
return vm return vm
} }
@ -120,7 +124,8 @@ class UserController {
} }
} }
} }
val responce = ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(ResponceResult().apply { val responce = ResponseEntity.ok().headers {
}.contentType(MediaType.APPLICATION_JSON).body(ResponceResult().apply {
this.resultCode = lResultCode this.resultCode = lResultCode
this.resultMsg = lResultMsg this.resultMsg = lResultMsg
}) })

View File

@ -1,10 +1,6 @@
package kr.lunaticbum.back.lun.model package kr.lunaticbum.back.lun.model
import com.google.gson.Gson import com.google.gson.Gson
import com.mongodb.client.model.Sorts.descending
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kr.lunaticbum.back.lun.configs.GlobalEnvironment import kr.lunaticbum.back.lun.configs.GlobalEnvironment
import kr.lunaticbum.back.lun.utils.LogService import kr.lunaticbum.back.lun.utils.LogService
import lombok.AllArgsConstructor import lombok.AllArgsConstructor
@ -14,13 +10,11 @@ import org.bson.codecs.pojo.annotations.BsonIgnore
import org.jsoup.Jsoup import org.jsoup.Jsoup
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.annotation.Id import org.springframework.data.annotation.Id
import org.springframework.data.domain.Page
import org.springframework.data.mongodb.core.mapping.Document import org.springframework.data.mongodb.core.mapping.Document
import org.springframework.data.mongodb.repository.ReactiveMongoRepository import org.springframework.data.mongodb.repository.ReactiveMongoRepository
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.WebClient
import reactor.core.publisher.Flux
import reactor.core.publisher.Mono import reactor.core.publisher.Mono
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.time.Duration import java.time.Duration
@ -97,8 +91,8 @@ class LocationLogService : LocationService {
@Autowired @Autowired
private lateinit var logRepository: LocationLogRepository private lateinit var logRepository: LocationLogRepository
fun find50() : List<LocationLog> { fun find20() : List<LocationLog> {
return logRepository.findAll().takeLast(50).buffer(50).blockLast(Duration.ofSeconds(30)) ?: listOf() return logRepository.findAll().takeLast(20).buffer(20).blockLast(Duration.ofSeconds(30)) ?: listOf()
} }
fun getLocationLog() : LocationLog? { fun getLocationLog() : LocationLog? {
return logRepository.findFirstByOrderByTimeDesc().block() return logRepository.findFirstByOrderByTimeDesc().block()
@ -110,7 +104,6 @@ class LocationLogService : LocationService {
logRepository.save(log).subscribe( { println("saved msg after ${it}") },{e -> e.printStackTrace()},{ logRepository.save(log).subscribe( { println("saved msg after ${it}") },{e -> e.printStackTrace()},{
println("saved msg comp") println("saved msg comp")
}) })
} }
} }

View File

@ -0,0 +1,75 @@
package kr.lunaticbum.back.lun.model
import kr.lunaticbum.back.lun.utils.LogService
import lombok.AllArgsConstructor
import lombok.Data
import lombok.NoArgsConstructor
import org.bson.BsonType
import org.bson.codecs.pojo.annotations.BsonCreator
import org.bson.codecs.pojo.annotations.BsonId
import org.bson.codecs.pojo.annotations.BsonRepresentation
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.mongodb.core.mapping.Document
import org.springframework.data.mongodb.repository.Query
import org.springframework.data.mongodb.repository.ReactiveMongoRepository
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UserDetailsService
import org.springframework.security.crypto.password.PasswordEncoder
import org.springframework.stereotype.Repository
import org.springframework.stereotype.Service
import reactor.core.publisher.Mono
import java.time.Duration
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "Post")
class Post {
@BsonId
@BsonRepresentation(BsonType.OBJECT_ID)
var id: String? = null
var title : String? = null
var content : String? = null
var category : String? = null
var tags : String? = null
var writer : String? = null
var writeTime : Long = 0
var modifyTime : Long = 0
var posting : Boolean = false
}
@Repository
interface PostRepository : ReactiveMongoRepository<Post, String> {
}
@Service
class PostManageg {
@Autowired
private lateinit var logService: LogService
@Autowired
private lateinit var postRepository: PostRepository
@Autowired
private lateinit var bCryptPasswordEncoder: PasswordEncoder
fun find20() : List<Post> {
return postRepository.findAll().takeLast(20).buffer(20).blockLast(Duration.ofSeconds(30)) ?: listOf()
}
fun save(post: Post): Mono<Post> {
println("saved user before ${post}")
// user.hashPassword(bCryptPasswordEncoder)
return postRepository.save(post).apply {
subscribe {
println("saved user after ${this@apply}")
}
}
}
}

View File

@ -52,7 +52,6 @@ class Location {
class CurrentWeather { class CurrentWeather {
var location: Location? = null var location: Location? = null
var current: Current? = null var current: Current? = null
fun getSummaryInfo(lat : String,lon : String) = "지역:${this.location?.name}\n날씨:${this.current?.condition?.text}\n온도:${this.current?.temp_c}\n습도:${this.current?.humidity}\n" +
fun getSummaryInfo() = "지역:${this.location?.name}\n날씨:${this.current?.condition?.text}\n온도:${this.current?.temp_c}\n습도:${this.current?.humidity}\n" + "체감온도:${this.current?.feelslike_c}\nhttps://www.accuweather.com/ko/search-locations?query=${lat},${lon}"
"체감온도:${this.current?.feelslike_c}\nhttps://www.accuweather.com/ko/search-locations?query=${this.location?.lat},${this.location?.lon}"
} }

View File

@ -26,6 +26,11 @@ spring.data.mongodb.database=l
spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html spring.thymeleaf.suffix=.html
spring.thymeleaf.enabled=true spring.thymeleaf.enabled=true
spring.servlet.multipart.max-file-size=1024MB
spring.servlet.multipart.max-request-size=1024MB
spring.servlet.multipart.enabled=true
# ?? ???? ??? ?? ? ?? ????. # ?? ???? ??? ?? ? ?? ????.
spring.devtools.livereload.enabled=true spring.devtools.livereload.enabled=true
# thymeleaf? ?? ??? ??? ???. cache=false ??(???? true) # thymeleaf? ?? ??? ??? ???. cache=false ??(???? true)

View File

@ -1,62 +1,124 @@
:root { :root {
--WindowFull : 100%; --WindowFull : 99vw;
--TopHeight: 160px; --TopHeight: 160px;
--FooterHeight: 160px; --FooterHeight: 160px;
--ContentVerticalMargin: 5px; --ContentVerticalMargin: 5px;
/*background-image: url("data:image/svg+xml,<svg id='patternId' width='100%' height='100%' xmlns='http://www.w3.org/2000/svg'><defs><pattern id='a' patternUnits='userSpaceOnUse' width='45' height='51.96' patternTransform='scale(2) rotate(20)'><rect x='0' y='0' width='100%' height='100%' fill='%23202025ff'/><path d='M52.48 44.47a15 15 0 01-14.96 0 15 15 0 00-7.48 12.96M7.48 44.42a15 15 0 01-14.96 0M15 57.44c0-5.35-2.9-10.35-7.52-13.02a15 15 0 017.48-12.97M7.48 18.5a14.97 14.97 0 01-14.98-.03m15.02-.03A15 15 0 0115 5.47a15 15 0 00-4.4-10.62m23.8.05A15 15 0 0030 5.53a15 15 0 017.48 12.96 14.9 14.9 0 0015.02-.03m-22.5 13a15.13 15.13 0 017.52 13.01m-7.56-39a15 15 0 01-14.96 0M7.48 18.5a15 15 0 017.48 12.96 15 15 0 0015.04 0 15 15 0 017.48-12.96' stroke-width='3' stroke='%23ec914b8f' fill='none'/></pattern></defs><rect width='800%' height='800%' transform='translate(-38,-21.84)' fill='url(%23a)'/></svg>")*/
} }
input, select ,button{
html {
margin: 1vh 1vw;
background: #202025ee;
}
#where{
table-layout: fixed;
}
.where_item {
display: table-cell;
}
body {
user-select: none;
-webkit-user-select: none;
align-content: center;
padding: 1vh 1vw;
background-image: url("data:image/svg+xml,<svg id='patternId' width='100%' height='100%' xmlns='http://www.w3.org/2000/svg'><defs><pattern id='a' patternUnits='userSpaceOnUse' width='45' height='51.96' patternTransform='scale(2) rotate(20)'><rect x='0' y='0' width='100%' height='100%' fill='%23202025ff'/><path d='M52.48 44.47a15 15 0 01-14.96 0 15 15 0 00-7.48 12.96M7.48 44.42a15 15 0 01-14.96 0M15 57.44c0-5.35-2.9-10.35-7.52-13.02a15 15 0 017.48-12.97M7.48 18.5a14.97 14.97 0 01-14.98-.03m15.02-.03A15 15 0 0115 5.47a15 15 0 00-4.4-10.62m23.8.05A15 15 0 0030 5.53a15 15 0 017.48 12.96 14.9 14.9 0 0015.02-.03m-22.5 13a15.13 15.13 0 017.52 13.01m-7.56-39a15 15 0 01-14.96 0M7.48 18.5a15 15 0 017.48 12.96 15 15 0 0015.04 0 15 15 0 017.48-12.96' stroke-width='3' stroke='%23ec914b8f' fill='none'/></pattern></defs><rect width='800%' height='800%' transform='translate(-38,-21.84)' fill='url(%23a)'/></svg>")
}
body > *{
align-content: center;
color: white; color: white;
background: #2d2f34; padding: 1vh 1vw;
border: black;
border-width: 1px;
padding: 0;
margin: 0;
position: relative;
} }
body, html {
background-color: black; /*#main_layer {*/
margin: 0px; /* width: 100%;*/
height: 100lvh; /* margin: 0 auto;*/
/* position: relative;*/
/* background: #F0F0F524;*/
/* border-radius: 10px;*/
/*}*/
input, select ,button {
align-content: center;
top: 0;
bottom: 0;
color: white;
background: #40404564;
position: relative;
outline-width: thin;
outline-color: #ec914b8f;
border-color: #ec914b8f;
border-style: groove;
border-width: 1px;
} }
header { header {
width: 100%; top: 0;
align-content: center; background: #F0F0F524;
border-top: #ec914b8f;
border-radius: 10px 30px;
border-width: 1px;
height: 8vh;
min-height: 8vh;
display: flex;
position: relative; position: relative;
height: var(--TopHeight); }
background-image: url("../blog/post/images/42cc3207-42a4-4ceb-8a2f-f5f7a89496fc.jpg"); #bottom {
background-repeat: revert; float: right;
background-size: contain; display: inline-block;
background-origin: revert; justify-content: space-between;
margin-left: auto;
grid-auto-flow: column;
grid-template-columns: 3fr;
position: absolute;
right: 30px;
} }
#content { #top {
margin-left: 2.5%; float: left;
margin-right: 2.5%; display: inline-block;
justify-content: space-between;
margin-left: auto;
grid-auto-flow: column;
grid-template-columns: 3fr;
position: absolute;
left: 30px;
}
h2 {
margin: 1vw;
}
#main_layer {
border-radius: 10px 10px 0px 10px;
padding: 10px;
margin: 1vw 1vh;
position: relative; position: relative;
overflow-y: auto; overflow-y: auto;
overflow-x: clip; overflow-x: clip;
background: black; height: 68vh;
min-height: calc((var(--TopHeight) + var(--FooterHeight)) * 2); max-height: 68vh;
height: calc(var(--WindowFull) - calc(var(--FooterHeight) + var(--TopHeight))); min-height: 8vh;
background-image: url("../blog/post/images/bb109b5a-f907-4da1-9c4f-55533395ed6e.jpg");
background-repeat: revert;
background-size: contain;
background-origin: revert;
} }
#main_layer > div {
position: relative;
}
#content > * { #content > * {
margin-top: var(--ContentVerticalMargin);
margin-bottom: var(--ContentVerticalMargin);
} }
footer { footer {
width: 100%; display: flex;
align-content: center; bottom: 0;
border-top: #ec914b8f;
background: #F0F0F524;
border-radius: 30px 10px;
border-width: 1px;
height: 8vh;
min-height: 8vh;
position: relative; position: relative;
height: var(--FooterHeight);
background-image: url("../blog/post/images/42cc3207-42a4-4ceb-8a2f-f5f7a89496fc.jpg");
background-repeat: revert;
background-size: contain;
transform: scaleY(-1);
} }

View File

@ -6,11 +6,11 @@
.toastui-editor-dark .toastui-editor-md-container, .toastui-editor-dark .toastui-editor-md-container,
.toastui-editor-dark .toastui-editor-ww-container { .toastui-editor-dark .toastui-editor-ww-container {
background-color: #121212; background-color: #12121288;
} }
.toastui-editor-dark .toastui-editor-defaultUI-toolbar { .toastui-editor-dark .toastui-editor-defaultUI-toolbar {
background-color: #232428; background-color: #23242888;
border-bottom-color: #303238; border-bottom-color: #303238;
} }
@ -20,20 +20,20 @@
} }
.toastui-editor-dark .toastui-editor-toolbar-icons:not(:disabled):hover { .toastui-editor-dark .toastui-editor-toolbar-icons:not(:disabled):hover {
background-color: #36383f; background-color: #36383f88;
border-color: #36383f; border-color: #36383f;
} }
.toastui-editor-dark .toastui-editor-toolbar-divider { .toastui-editor-dark .toastui-editor-toolbar-divider {
background-color: #303238; background-color: #30323888;
} }
.toastui-editor-dark .toastui-editor-tooltip { .toastui-editor-dark .toastui-editor-tooltip {
background-color: #535662; background-color: #53566288;
} }
.toastui-editor-dark .toastui-editor-tooltip .arrow { .toastui-editor-dark .toastui-editor-tooltip .arrow {
background-color: #535662; background-color: #53566288;
} }
.toastui-editor-dark .toastui-editor-defaultUI-toolbar .scroll-sync::before { .toastui-editor-dark .toastui-editor-defaultUI-toolbar .scroll-sync::before {
@ -45,23 +45,23 @@
} }
.toastui-editor-dark .toastui-editor-defaultUI-toolbar .switch { .toastui-editor-dark .toastui-editor-defaultUI-toolbar .switch {
background-color: #2b4455; background-color: #2b445588;
} }
.toastui-editor-dark .toastui-editor-defaultUI-toolbar input:checked + .switch { .toastui-editor-dark .toastui-editor-defaultUI-toolbar input:checked + .switch {
background-color: #2b4455; background-color: #2b445588;
} }
.toastui-editor-dark .toastui-editor-defaultUI-toolbar .switch::before { .toastui-editor-dark .toastui-editor-defaultUI-toolbar .switch::before {
background-color: #8f939f; background-color: #8f939f88;
} }
.toastui-editor-dark .toastui-editor-defaultUI-toolbar input:checked + .switch::before { .toastui-editor-dark .toastui-editor-defaultUI-toolbar input:checked + .switch::before {
background-color: #67ccff; background-color: #67ccff88;
} }
.toastui-editor-dark .toastui-editor-main .toastui-editor-md-splitter { .toastui-editor-dark .toastui-editor-main .toastui-editor-md-splitter {
background-color: #303238; background-color: #30323888;
} }
.toastui-editor-dark .toastui-editor-mode-switch { .toastui-editor-dark .toastui-editor-mode-switch {
@ -71,25 +71,25 @@
.toastui-editor-dark .toastui-editor-mode-switch .tab-item { .toastui-editor-dark .toastui-editor-mode-switch .tab-item {
border-color: #393b42; border-color: #393b42;
background-color: #232428; background-color: #23242888;
color: #757a86; color: #757a86;
} }
.toastui-editor-dark .toastui-editor-mode-switch .tab-item.active { .toastui-editor-dark .toastui-editor-mode-switch .tab-item.active {
border-top-color: #121212; border-top-color: #121212;
background-color: #121212; background-color: #12121288;
color: #eee; color: #eee;
} }
.toastui-editor-dark .toastui-editor-popup, .toastui-editor-dark .toastui-editor-popup,
.toastui-editor-dark .toastui-editor-context-menu { .toastui-editor-dark .toastui-editor-context-menu {
background-color: #121212; background-color: #12121288;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08);
border-color: #494c56; border-color: #494c56;
} }
.toastui-editor-dark .toastui-editor-popup-add-heading ul li:hover { .toastui-editor-dark .toastui-editor-popup-add-heading ul li:hover {
background-color: #36383f; background-color: #36383f88;
} }
.toastui-editor-dark .toastui-editor-popup-body label { .toastui-editor-dark .toastui-editor-popup-body label {
@ -133,7 +133,7 @@
.toastui-editor-dark .toastui-editor-popup-body .toastui-editor-file-select-button { .toastui-editor-dark .toastui-editor-popup-body .toastui-editor-file-select-button {
border-color: #303238; border-color: #303238;
background-color: #232428; background-color: #23242888;
color: #eee; color: #eee;
} }
@ -144,7 +144,7 @@
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-close-button { .toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-close-button {
color: #eee; color: #eee;
border-color: #303238; border-color: #303238;
background-color: #232428; background-color: #23242888;
} }
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-close-button:hover { .toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-close-button:hover {
@ -153,22 +153,22 @@
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-ok-button { .toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-ok-button {
color: #121212; color: #121212;
background-color: #67ccff; background-color: #67ccff88;
} }
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-ok-button:hover { .toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-ok-button:hover {
color: #121212; color: #121212;
background-color: #32baff; background-color: #32baff88;
} }
.toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-cell { .toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-cell {
border-color: #303238; border-color: #303238;
background-color: #121212; background-color: #12121288;
} }
.toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-cell.header { .toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-cell.header {
border-color: #303238; border-color: #303238;
background-color: #232428; background-color: #23242888;
} }
.toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-selection-layer { .toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-selection-layer {
@ -181,19 +181,19 @@
} }
.toastui-editor-dark .toastui-editor-md-tab-container { .toastui-editor-dark .toastui-editor-md-tab-container {
background-color: #232428; background-color: #23242888;
border-bottom-color: #303238; border-bottom-color: #303238;
} }
.toastui-editor-dark .toastui-editor-md-tab-container .tab-item { .toastui-editor-dark .toastui-editor-md-tab-container .tab-item {
border-color: #393b42; border-color: #393b42;
background-color: #2d2f34; background-color: #2d2f3488;
color: #757a86; color: #757a86;
} }
.toastui-editor-dark .toastui-editor-md-tab-container .tab-item.active { .toastui-editor-dark .toastui-editor-md-tab-container .tab-item.active {
border-bottom-color: #121212; border-bottom-color: #121212;
background-color: #121212; background-color: #12121288;
color: #eee; color: #eee;
} }
@ -208,7 +208,7 @@
} }
.toastui-editor-dark .toastui-editor-context-menu li:not(.disabled):hover { .toastui-editor-dark .toastui-editor-context-menu li:not(.disabled):hover {
background-color: #36383f; background-color: #36383f88;
} }
.toastui-editor-dark .toastui-editor-context-menu li.disabled { .toastui-editor-dark .toastui-editor-context-menu li.disabled {
@ -217,7 +217,7 @@
.toastui-editor-dark .toastui-editor-dropdown-toolbar { .toastui-editor-dark .toastui-editor-dropdown-toolbar {
border-color: #494c56; border-color: #494c56;
background-color: #232428; background-color: #23242888;
} }
.toastui-editor-dark .ProseMirror, .toastui-editor-dark .ProseMirror,
@ -251,7 +251,7 @@
} }
.toastui-editor-dark .toastui-editor-contents pre { .toastui-editor-dark .toastui-editor-contents pre {
background-color: #232428; background-color: #23242888;
} }
.toastui-editor-dark .toastui-editor-contents pre code { .toastui-editor-dark .toastui-editor-contents pre code {
@ -261,7 +261,7 @@
.toastui-editor-dark .toastui-editor-contents code { .toastui-editor-dark .toastui-editor-contents code {
color: #c1798b; color: #c1798b;
background-color: #35262a; background-color: #35262a88;
} }
.toastui-editor-dark .toastui-editor-contents div { .toastui-editor-dark .toastui-editor-contents div {
@ -270,7 +270,7 @@
.toastui-editor-dark .toastui-editor-ww-code-block-language { .toastui-editor-dark .toastui-editor-ww-code-block-language {
border-color: #303238; border-color: #303238;
background-color: #121212; background-color: #12121288;
} }
.toastui-editor-dark .toastui-editor-ww-code-block-language input { .toastui-editor-dark .toastui-editor-ww-code-block-language input {
@ -278,7 +278,7 @@
} }
.toastui-editor-dark .toastui-editor-contents .toastui-editor-ww-code-block:after { .toastui-editor-dark .toastui-editor-contents .toastui-editor-ww-code-block:after {
background-color: #232428; background-color: #23242888;
border: 1px solid #393b42; border: 1px solid #393b42;
color: #eee; color: #eee;
background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjIuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuugiOydtOyWtF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMzAgMzAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMwIDMwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I2ZmZjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPGc+CgkJCTxnPgoJCQkJPGc+CgkJCQkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE1LjUsMTIuNWwyLDJMMTIsMjBoLTJ2LTJMMTUuNSwxMi41eiBNMTgsMTBsMiwybC0xLjUsMS41bC0yLTJMMTgsMTB6Ii8+CgkJCQk8L2c+CgkJCTwvZz4KCQk8L2c+Cgk8L2c+CjwvZz4KPC9zdmc+Cg=='); background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjIuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuugiOydtOyWtF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMzAgMzAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMwIDMwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I2ZmZjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPGc+CgkJCTxnPgoJCQkJPGc+CgkJCQkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE1LjUsMTIuNWwyLDJMMTIsMjBoLTJ2LTJMMTUuNSwxMi41eiBNMTgsMTBsMiwybC0xLjUsMS41bC0yLTJMMTgsMTB6Ii8+CgkJCQk8L2c+CgkJCTwvZz4KCQk8L2c+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==');
@ -296,13 +296,13 @@
} }
.toastui-editor-dark .toastui-editor-custom-block-view button { .toastui-editor-dark .toastui-editor-custom-block-view button {
background-color: #232428; background-color: #23242888;
border-color: #393b42; border-color: #393b42;
background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjIuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuugiOydtOyWtF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMzAgMzAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMwIDMwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I2ZmZjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPGc+CgkJCTxnPgoJCQkJPGc+CgkJCQkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE1LjUsMTIuNWwyLDJMMTIsMjBoLTJ2LTJMMTUuNSwxMi41eiBNMTgsMTBsMiwybC0xLjUsMS41bC0yLTJMMTgsMTB6Ii8+CgkJCQk8L2c+CgkJCTwvZz4KCQk8L2c+Cgk8L2c+CjwvZz4KPC9zdmc+Cg=='); background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjIuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuugiOydtOyWtF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMzAgMzAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMwIDMwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I2ZmZjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPGc+CgkJCTxnPgoJCQkJPGc+CgkJCQkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE1LjUsMTIuNWwyLDJMMTIsMjBoLTJ2LTJMMTUuNSwxMi41eiBNMTgsMTBsMiwybC0xLjUsMS41bC0yLTJMMTgsMTB6Ii8+CgkJCQk8L2c+CgkJCTwvZz4KCQk8L2c+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==');
} }
.toastui-editor-dark .toastui-editor-custom-block-view button:hover { .toastui-editor-dark .toastui-editor-custom-block-view button:hover {
background-color: #232428; background-color: #23242888;
border-color: #595c68; border-color: #595c68;
} }
@ -320,7 +320,7 @@
} }
.toastui-editor-dark .toastui-editor-contents table th { .toastui-editor-dark .toastui-editor-contents table th {
background-color: #3a3c42; background-color: #3a3c4288;
} }
.toastui-editor-dark .toastui-editor-contents table td, .toastui-editor-dark .toastui-editor-contents table td,
@ -352,7 +352,7 @@
} }
.toastui-editor-dark .toastui-editor-contents ul > li::before { .toastui-editor-dark .toastui-editor-contents ul > li::before {
background-color: #55575f; background-color: #55575f88;
} }
.toastui-editor-dark .toastui-editor-contents hr { .toastui-editor-dark .toastui-editor-contents hr {
@ -369,7 +369,7 @@
.toastui-editor-dark .toastui-editor-contents .image-link:hover::before { .toastui-editor-dark .toastui-editor-contents .image-link:hover::before {
border-color: #393b42; border-color: #393b42;
background-color: #232428; background-color: #23242888;
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KICAgICAgICA8ZyBzdHJva2U9IiNFRUUiIHN0cm9rZS13aWR0aD0iMS41Ij4KICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy42NjUgMTUuMDdsLTEuODE5LS4wMDJjLTEuNDg2IDAtMi42OTItMS4yMjgtMi42OTItMi43NDR2LS4xOTJjMC0xLjUxNSAxLjIwNi0yLjc0NCAyLjY5Mi0yLjc0NGgzLjg0NmMxLjQ4NyAwIDIuNjkyIDEuMjI5IDIuNjkyIDIuNzQ0di4xOTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDQ1IC0xNzQzKSB0cmFuc2xhdGUoMTA0MCAxNzM4KSB0cmFuc2xhdGUoNSA1KSBzY2FsZSgxIC0xKSByb3RhdGUoNDUgMzcuMjkzIDApIi8+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyLjMyNiA0LjkzNGwxLjgyMi4wMDJjMS40ODcgMCAyLjY5MyAxLjIyOCAyLjY5MyAyLjc0NHYuMTkyYzAgMS41MTUtMS4yMDYgMi43NDQtMi42OTMgMi43NDRoLTMuODQ1Yy0xLjQ4NyAwLTIuNjkyLTEuMjI5LTIuNjkyLTIuNzQ0VjcuNjgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDQ1IC0xNzQzKSB0cmFuc2xhdGUoMTA0MCAxNzM4KSB0cmFuc2xhdGUoNSA1KSBzY2FsZSgxIC0xKSByb3RhdGUoNDUgMzAuOTk2IDApIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPgo='); background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KICAgICAgICA8ZyBzdHJva2U9IiNFRUUiIHN0cm9rZS13aWR0aD0iMS41Ij4KICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy42NjUgMTUuMDdsLTEuODE5LS4wMDJjLTEuNDg2IDAtMi42OTItMS4yMjgtMi42OTItMi43NDR2LS4xOTJjMC0xLjUxNSAxLjIwNi0yLjc0NCAyLjY5Mi0yLjc0NGgzLjg0NmMxLjQ4NyAwIDIuNjkyIDEuMjI5IDIuNjkyIDIuNzQ0di4xOTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDQ1IC0xNzQzKSB0cmFuc2xhdGUoMTA0MCAxNzM4KSB0cmFuc2xhdGUoNSA1KSBzY2FsZSgxIC0xKSByb3RhdGUoNDUgMzcuMjkzIDApIi8+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyLjMyNiA0LjkzNGwxLjgyMi4wMDJjMS40ODcgMCAyLjY5MyAxLjIyOCAyLjY5MyAyLjc0NHYuMTkyYzAgMS41MTUtMS4yMDYgMi43NDQtMi42OTMgMi43NDRoLTMuODQ1Yy0xLjQ4NyAwLTIuNjkyLTEuMjI5LTIuNjkyLTIuNzQ0VjcuNjgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDQ1IC0xNzQzKSB0cmFuc2xhdGUoMTA0MCAxNzM4KSB0cmFuc2xhdGUoNSA1KSBzY2FsZSgxIC0xKSByb3RhdGUoNDUgMzAuOTk2IDApIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPgo=');
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08);
} }
@ -424,11 +424,11 @@
} }
.toastui-editor-dark .toastui-editor-md-code { .toastui-editor-dark .toastui-editor-md-code {
background-color: #35262a; background-color: #35262a88;
} }
.toastui-editor-dark .toastui-editor-md-code-block-line-background { .toastui-editor-dark .toastui-editor-md-code-block-line-background {
background-color: #232428; background-color: #23242888;
} }
.toastui-editor-dark .toastui-editor-md-code-block .toastui-editor-md-meta { .toastui-editor-dark .toastui-editor-md-code-block .toastui-editor-md-meta {
@ -440,7 +440,7 @@
} }
.toastui-editor-dark .toastui-editor-md-custom-block-line-background { .toastui-editor-dark .toastui-editor-md-custom-block-line-background {
background-color: #392d31; background-color: #392d3188;
} }
.toastui-editor-dark .toastui-editor-md-custom-block .toastui-editor-md-delimiter { .toastui-editor-dark .toastui-editor-md-custom-block .toastui-editor-md-delimiter {

View File

@ -0,0 +1,18 @@
function onclickWrite(type, keyword, html) {
let title_field = document.getElementById('title_field')
var hasValues = true
if (hasValues) {
let data = {
'title': title_field.value,
'content': encodeURIComponent(html),
}
let uploadUrl = location.protocol + "//" + location.hostname + "/blog/post.ajax";
if(confirm(JSON.stringify(data) + "\n해당 내용으로\n유저 등록 하실??")) {
post(uploadUrl,type,JSON.stringify(data),keyword, function (resultData) {
alert(resultData)
})
} else {
}
}
}

View File

@ -4,7 +4,7 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/default_layout}" layout:decorate="~{layout/default_layout}"
> >
<head> <th:block layout:fragment="head">
<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.min.js" crossorigin="anonymous"></script> <script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.min.js" crossorigin="anonymous"></script>
<script type="text/javascript" th:src="@{/js/toast-ui-view.js}"></script> <script type="text/javascript" th:src="@{/js/toast-ui-view.js}"></script>
<link th:href="@{/css/toast-ui.css}" rel="stylesheet" /> <link th:href="@{/css/toast-ui.css}" rel="stylesheet" />
@ -49,16 +49,18 @@
console.log(editor.getHTML()) console.log(editor.getHTML())
} }
</script> </script>
</head> </th:block>
<div layout:fragment="content" id="content"> <th:block layout:fragment="content" id="content">
<input id="title_layer" /> <div id="main_layer">
<div id="editor" ></div> <input id="title_layer" />
<div id="hashtag_layer"> <div id="editor" ></div>
<select > </select> <div id="hashtag_layer">
<input id="hashtag" /> <select > </select>
<input id="hashtag" />
</div>
<div id="controll_layer" >
<button onclick="save()">asdsad</button>
</div>
</div> </div>
<div id="controll_layer" > </th:block>
<button onclick="save()">asdsad</button>
</div>
</div>
</html> </html>

View File

@ -4,9 +4,10 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/default_layout}" layout:decorate="~{layout/default_layout}"
> >
<head> <th:block layout:fragment="head" id="head">
<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.min.js" crossorigin="anonymous"></script> <script type="text/javascript" th:src="@{https://code.jquery.com/jquery-3.5.1.min.js}" crossorigin="anonymous"></script>
<script type="text/javascript" th:src="@{/js/toast-ui.js}"></script> <script type="text/javascript" th:src="@{/js/toast-ui.js}"></script>
<script type="text/javascript" th:src="@{/js/blog.js}"></script>
<link th:href="@{/css/blog.css}" rel="stylesheet" /> <link th:href="@{/css/blog.css}" rel="stylesheet" />
<link th:href="@{/css/toast-ui.css}" rel="stylesheet" /> <link th:href="@{/css/toast-ui.css}" rel="stylesheet" />
<link th:href="@{/css/toast-ui-dark.css}" rel="stylesheet" /> <link th:href="@{/css/toast-ui-dark.css}" rel="stylesheet" />
@ -22,7 +23,7 @@
console.log(style.getPropertyValue('--FooterHeight')) console.log(style.getPropertyValue('--FooterHeight'))
console.log(style.getPropertyValue('--TopHeight')) console.log(style.getPropertyValue('--TopHeight'))
var editorHeght = ( var editorHeght = (
document.querySelector('#content').getBoundingClientRect().height - document.querySelector('#main_layer').getBoundingClientRect().height -
( (
Number(style.getPropertyValue('--ButtonHegit').replace("px","") * 3) Number(style.getPropertyValue('--ButtonHegit').replace("px","") * 3)
+ Number(style.getPropertyValue('--TopHeight').replace("px","")) + Number(style.getPropertyValue('--TopHeight').replace("px",""))
@ -32,7 +33,7 @@
editor = new toastui.Editor({ editor = new toastui.Editor({
el: document.querySelector('#editor'), el: document.querySelector('#editor'),
previewStyle: 'tab', previewStyle: 'tab',
height: editorHeght+ 'px', height: editorHeght + 'px',
width:'95%', width:'95%',
theme:'dark', theme:'dark',
usageStatistics : false, usageStatistics : false,
@ -63,12 +64,12 @@
addImageBlobHook: (blob, callback) => { addImageBlobHook: (blob, callback) => {
const formData = new FormData(); const formData = new FormData();
formData.append('file', blob); formData.append('file', blob);
let uploadUrl = location.protocol + "//" + location.hostname + "/blog/post/imageUpload";
let url = 'post/images/'; let imageUrl = location.protocol + "//" + location.hostname + '/blog/post/images/';
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
enctype: 'multipart/form-data', enctype: 'multipart/form-data',
url: 'post/imageUpload', url: uploadUrl,
data: formData, data: formData,
dataType: 'json', dataType: 'json',
processData: false, processData: false,
@ -76,8 +77,8 @@
cache: false, cache: false,
timeout: 600000, timeout: 600000,
success: function (data) { success: function (data) {
url += data.fileName; imageUrl += data.fileName;
callback(url, '사진 대체 텍스트 입력'); callback(imageUrl, '사진 대체 텍스트 입력');
}, },
error: function (e) { error: function (e) {
callback('image_load_fail', '사진 대체 텍스트 입력'); callback('image_load_fail', '사진 대체 텍스트 입력');
@ -89,20 +90,27 @@
} }
function save() { function save() {
console.log(editor.getHTML()) console.log(editor.getHTML())
console.log(editor.getMarkdown())
onclickWrite([[${enc}]],[[${keyword}]],editor.getMarkdown())
} }
</script> </script>
</head> </th:block>
<div layout:fragment="content" id="content"> <th:block layout:fragment="content" id="content">
<div class="layer"> <div id="main_layer">
<input id="title_layer" /> <th:block th:if="${PERMISSION != 'OK'}">
<h1>권한이 없는 뎁쇼?!</h1>
</th:block>
<th:block th:if="${PERMISSION == 'OK'}">
<div class="layer">
<input id="title_field" />
</div>
<div id="editor" ></div>
<div class="layer">
<select > </select>
<input id="hashtag_field" />
<button id="save" onclick="save()">asdsad</button>
</div>
</th:block>
</div> </div>
<div id="editor" ></div> </th:block>
<div class="layer">
<select > </select>
<input id="hashtag" />
</div>
<div id="layer" >
<button id="save" onclick="save()">asdsad</button>
</div>
</div>
</html> </html>

View File

@ -1,22 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" <html
xmlns:th="http://www.thymeleaf.org" xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/default_layout}"> layout:decorate="~{layout/default_layout}">
<th:block layout:fragment="head"> <th:block layout:fragment="head">
<title>Spring Boot</title>
<!--/* css */-->
<link th:href="@{/css/common.css}" rel="stylesheet" />
</th:block> </th:block>
<body> <th:block layout:fragment="content" id="content">
<th:block layout:fragment="header" th:include="@{fragments/header}"></th:block> <div id="main_layer"></div>
</th:block>
<div layout:fragment="content" class="content"> </html>
<h2>This is Content</h2>
</div>
<th:block layout:fragment="footer" th:include="@{fragments/footer}"></th:block>
</body>
</html>

View File

@ -0,0 +1,151 @@
<!DOCTYPE html>
<html
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/default_layout}"
>
<th:block layout:fragment="head">
<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.min.js" crossorigin="anonymous"></script>
<script type="text/javascript" th:src="@{/js/toast-ui-view.js}"></script>
<link th:href="@{/css/toast-ui.css}" rel="stylesheet" />
<link th:href="@{/css/toast-ui-dark.css}" rel="stylesheet" />
<script th:inline="javascript">
let editor
let onChange = () => {console.log(editor.getMarkdown())}
document.addEventListener("DOMContentLoaded", onLoaded);
function onLoaded() {
var h = document.querySelector('#main_layer').getBoundingClientRect().height + 'px'
editor = new toastui.Editor({
el: document.querySelector('#editor'),
height: '500px',
width:'100%',
viewer: true,
usageStatistics : false,
initialValue:
"\n" +
"#lun\n" +
"##Dependency License Report\n" +
"_2024-10-22 15:24:32 KST_\n" +
"## Apache License, Version 2.0\n" +
"\n" +
"**1** **Group:** `com.drewnoakes` **Name:** `metadata-extractor` **Version:** `2.19.0` \n" +
"> - **POM Project URL**: [https://drewnoakes.com/code/exif/](https://drewnoakes.com/code/exif/)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"\n" +
"**2** **Group:** `com.fasterxml.jackson.module` **Name:** `jackson-module-kotlin` **Version:** `2.17.2` \n" +
"> - **Project URL**: [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)\n" +
"> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **Embedded license files**: [jackson-module-kotlin-2.17.2.jar/META-INF/LICENSE](jackson-module-kotlin-2.17.2.jar/META-INF/LICENSE) \n" +
" - [jackson-module-kotlin-2.17.2.jar/META-INF/NOTICE](jackson-module-kotlin-2.17.2.jar/META-INF/NOTICE)\n" +
"\n" +
"**3** **Group:** `com.google.code.gson` **Name:** `gson` **Version:** `2.11.0` \n" +
"> - **Manifest Project URL**: [https://github.com/google/gson](https://github.com/google/gson)\n" +
"> - **Manifest License**: \"Apache-2.0\";link=\"https://www.apache.org/licenses/LICENSE-2.0.txt\" (Not Packaged)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"\n" +
"**4** **Group:** `io.projectreactor.kotlin` **Name:** `reactor-kotlin-extensions` **Version:** `1.2.3` \n" +
"> - **POM Project URL**: [https://github.com/reactor/reactor-kotlin-extensions](https://github.com/reactor/reactor-kotlin-extensions)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"\n" +
"**5** **Group:** `nz.net.ultraq.thymeleaf` **Name:** `thymeleaf-layout-dialect` **Version:** `3.3.0` \n" +
"> - **POM Project URL**: [https://github.com/ultraq/thymeleaf-layout-dialect/](https://github.com/ultraq/thymeleaf-layout-dialect/)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"\n" +
"**6** **Group:** `org.apache.tomcat.embed` **Name:** `tomcat-embed-jasper` **Version:** `10.1.30` \n" +
"> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)\n" +
"> - **POM Project URL**: [https://tomcat.apache.org/](https://tomcat.apache.org/)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **Embedded license files**: [tomcat-embed-jasper-10.1.30.jar/META-INF/LICENSE](tomcat-embed-jasper-10.1.30.jar/META-INF/LICENSE) \n" +
" - [tomcat-embed-jasper-10.1.30.jar/META-INF/NOTICE](tomcat-embed-jasper-10.1.30.jar/META-INF/NOTICE)\n" +
"\n" +
"**7** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-reflect` **Version:** `1.9.25` \n" +
"> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"\n" +
"**8** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `1.9.25` \n" +
"> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"\n" +
"**9** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-coroutines-reactor` **Version:** `1.8.1` \n" +
"> - **POM Project URL**: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"\n" +
"**10** **Group:** `org.slf4j` **Name:** `jcl-over-slf4j` **Version:** `2.0.16` \n" +
"> - **Project URL**: [http://www.slf4j.org](http://www.slf4j.org)\n" +
"> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT)\n" +
"> - **Embedded license files**: [jcl-over-slf4j-2.0.16.jar/META-INF/LICENSE.txt](jcl-over-slf4j-2.0.16.jar/META-INF/LICENSE.txt)\n" +
"\n" +
"**11** **Group:** `org.springframework.boot` **Name:** `spring-boot-starter-data-mongodb-reactive` **Version:** `3.3.4` \n" +
"> - **POM Project URL**: [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **Embedded license files**: [spring-boot-starter-data-mongodb-reactive-3.3.4.jar/META-INF/LICENSE.txt](spring-boot-starter-data-mongodb-reactive-3.3.4.jar/META-INF/LICENSE.txt) \n" +
" - [spring-boot-starter-data-mongodb-reactive-3.3.4.jar/META-INF/NOTICE.txt](spring-boot-starter-data-mongodb-reactive-3.3.4.jar/META-INF/NOTICE.txt)\n" +
"\n" +
"**12** **Group:** `org.springframework.boot` **Name:** `spring-boot-starter-security` **Version:** `3.3.4` \n" +
"> - **POM Project URL**: [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **Embedded license files**: [spring-boot-starter-security-3.3.4.jar/META-INF/LICENSE.txt](spring-boot-starter-security-3.3.4.jar/META-INF/LICENSE.txt) \n" +
" - [spring-boot-starter-security-3.3.4.jar/META-INF/NOTICE.txt](spring-boot-starter-security-3.3.4.jar/META-INF/NOTICE.txt)\n" +
"\n" +
"**13** **Group:** `org.springframework.boot` **Name:** `spring-boot-starter-quartz` **Version:** `3.3.4` \n" +
"> - **POM Project URL**: [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **Embedded license files**: [spring-boot-starter-quartz-3.3.4.jar/META-INF/LICENSE.txt](spring-boot-starter-quartz-3.3.4.jar/META-INF/LICENSE.txt) \n" +
" - [spring-boot-starter-quartz-3.3.4.jar/META-INF/NOTICE.txt](spring-boot-starter-quartz-3.3.4.jar/META-INF/NOTICE.txt)\n" +
"\n" +
"**14** **Group:** `org.springframework.boot` **Name:** `spring-boot-starter-thymeleaf` **Version:** `3.3.4` \n" +
"> - **POM Project URL**: [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **Embedded license files**: [spring-boot-starter-thymeleaf-3.3.4.jar/META-INF/LICENSE.txt](spring-boot-starter-thymeleaf-3.3.4.jar/META-INF/LICENSE.txt) \n" +
" - [spring-boot-starter-thymeleaf-3.3.4.jar/META-INF/NOTICE.txt](spring-boot-starter-thymeleaf-3.3.4.jar/META-INF/NOTICE.txt)\n" +
"\n" +
"**15** **Group:** `org.springframework.boot` **Name:** `spring-boot-starter-webflux` **Version:** `3.3.4` \n" +
"> - **POM Project URL**: [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **Embedded license files**: [spring-boot-starter-webflux-3.3.4.jar/META-INF/LICENSE.txt](spring-boot-starter-webflux-3.3.4.jar/META-INF/LICENSE.txt) \n" +
" - [spring-boot-starter-webflux-3.3.4.jar/META-INF/NOTICE.txt](spring-boot-starter-webflux-3.3.4.jar/META-INF/NOTICE.txt)\n" +
"\n" +
"**16** **Group:** `org.springframework.boot` **Name:** `spring-boot-starter-web` **Version:** `3.3.4` \n" +
"> - **POM Project URL**: [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **Embedded license files**: [spring-boot-starter-web-3.3.4.jar/META-INF/LICENSE.txt](spring-boot-starter-web-3.3.4.jar/META-INF/LICENSE.txt) \n" +
" - [spring-boot-starter-web-3.3.4.jar/META-INF/NOTICE.txt](spring-boot-starter-web-3.3.4.jar/META-INF/NOTICE.txt)\n" +
"\n" +
"## LGPL-2.1\n" +
"\n" +
"**17** **Group:** `org.mariadb.jdbc` **Name:** `mariadb-java-client` **Version:** `3.3.3` \n" +
"> - **Project URL**: [https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/](https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/)\n" +
"> - **Manifest License**: \"LGPL-2.1\" (Not Packaged)\n" +
"> - **POM License**: LGPL-2.1\n" +
"\n" +
"## MIT License\n" +
"\n" +
"**18** **Group:** `org.jsoup` **Name:** `jsoup` **Version:** `1.18.1` \n" +
"> - **Project URL**: [https://jsoup.org/](https://jsoup.org/)\n" +
"> - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT)\n" +
"> - **Embedded license files**: [jsoup-1.18.1.jar/META-INF/LICENSE](jsoup-1.18.1.jar/META-INF/LICENSE) \n" +
" - [jsoup-1.18.1.jar/META-INF/README.md](jsoup-1.18.1.jar/META-INF/README.md)\n" +
"\n" +
"**19** **Group:** `org.slf4j` **Name:** `jcl-over-slf4j` **Version:** `2.0.16` \n" +
"> - **Project URL**: [http://www.slf4j.org](http://www.slf4j.org)\n" +
"> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)\n" +
"> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n" +
"> - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT)\n" +
"> - **Embedded license files**: [jcl-over-slf4j-2.0.16.jar/META-INF/LICENSE.txt](jcl-over-slf4j-2.0.16.jar/META-INF/LICENSE.txt)\n" +
"\n" +
"\n"
,
theme:"dark",
});
}
</script>
</th:block>
<th:block layout:fragment="content" id="content">
<div id="main_layer" style="background:#30303594;">
<div id="editor" ></div>
</div>
</th:block>
</html>

View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/default_layout}">
<th:block layout:fragment="head">
</th:block>
<th:block layout:fragment="content" id="content">
<table id="main_layer">
<tr id="where" th:each="location : ${locations}">
<td class="where_item"><span th:text="${location.timeString}"></span></td>
<td class="where_item"><span th:text="${location.mAddressLines}"></span></td>
<td class="where_item"><span th:text="${location.mCountryName}"></span></td>
<td class="where_item"><span th:text="${location.mLatitude}"></span></td>
<td class="where_item"><span th:text="${location.mLongitude}"></span></td>
</tr>
</table>
</th:block>
</html>

View File

@ -4,7 +4,7 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/default_layout}" layout:decorate="~{layout/default_layout}"
> >
<head> <th:block layout:fragment="head" id="head">
<!--css,JS 추가영역--> <!--css,JS 추가영역-->
<script th:inline="javascript"> <script th:inline="javascript">
function jopinClick() { function jopinClick() {
@ -12,9 +12,9 @@
} }
</script> </script>
<script type="text/javascript" th:src="@{/js/user.js}"></script> <script type="text/javascript" th:src="@{/js/user.js}"></script>
</head> </th:block >
<div layout:fragment="content" id="content"> <th:block layout:fragment="content">
<table> <table id="main_layer">
<tr> <tr>
<td><h2>회원가입</h2></td> <td><h2>회원가입</h2></td>
</tr> </tr>
@ -30,5 +30,5 @@
<tr><td><input id="user_email" type="text" class="email"></td></tr> <tr><td><input id="user_email" type="text" class="email"></td></tr>
<tr><td><input type="submit" value="가입하기" class="btn" onclick="jopinClick()"></td></tr> <tr><td><input type="submit" value="가입하기" class="btn" onclick="jopinClick()"></td></tr>
</table> </table>
</div> </th:block>
</html> </html>

View File

@ -4,28 +4,25 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/default_layout}"> layout:decorate="~{layout/default_layout}">
<th:block layout:fragment="head"> <head>
<title>Spring Boot</title> <title>Spring Boot</title>
<script th:inline="javascript"> <script th:inline="javascript">
function loginClick() { function loginClick() {
onclickLogin([[${enc}]],[[${key}]]) onclickLogin([[${enc}]],[[${key}]])
} }
</script> </script>
<!--/* css */-->
<link th:href="@{/css/common.css}" rel="stylesheet" />
<script type="text/javascript" th:src="@{/js/common.js}"></script>
<script type="text/javascript" th:src="@{/js/user.js}"></script> <script type="text/javascript" th:src="@{/js/user.js}"></script>
</th:block> </head>>
<body onload="checkDebug()"> <body onload="checkDebug()">
<th:block layout:fragment="header" th:include="@{fragments/header}"></th:block> <th:block layout:fragment="header" th:include="@{fragments/header}"></th:block>
<div layout:fragment="content" class="content"> <div layout:fragment="content" id="content">
<table> <table>
<tr><td>아이디</td></tr> <tr><td>아이디</td></tr>
<tr><td><input id="user_id" type="text" class="text"></td></tr> <tr><td><input id="user_id" type="text" class="text"></td></tr>
<tr><td>비밀번호</td></tr> <tr><td>비밀번호</td></tr>
<tr><td><input id="user_pw" type="password" class="text"></td></tr> <tr><td><input id="user_pw" type="password" class="text"></td></tr>
<tr><td><input type="submit" value="가입하기" class="btn" onclick="loginClick()"></td></tr> <tr><td><input type="submit" value="로그인" class="btn" onclick="loginClick()"></td></tr>
</table> </table>
</div> </div>

View File

@ -1,6 +1,13 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"> <html xmlns:th="http://www.thymeleaf.org">
<footer th:fragment="footer"> <th:block th:fragment="footer">
asdasdasd <footer>
</footer> <table >
<tr id="bottom">
<td><h2><a aria-label="licenses" style="color: white" href="../licenses" title="Gmail">licenses</a></h2></td>
<td><h2><a aria-label="sendToMe" style="color: white" href="mailto:lunaticbum@gmail.com" title="Gmail">lunaticbum@gmail.com</a></h2></td>
</tr>
</table>
</footer>
</th:block>
</html> </html>

View File

@ -1,4 +0,0 @@
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<div class="head">
</div>
</html>

View File

@ -1,6 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"> <html xmlns:th="http://www.thymeleaf.org">
<header th:fragment="header"> <th:block th:fragment="header">
header.html <header>
</header> <table >
<tr id="top">
<td><h2><a aria-label="licenses" style="color: white" href="../" title="Gmail">HOME</a></h2></td>
</tr>
</table>
</header>
</th:block>
</html> </html>

View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<th:block th:fragment="includes">
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="Referrer" content="origin"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width,height=device-height,initial-scale=1"/>
<link th:href="@{/css/common.css}" rel="stylesheet" />
<script type="text/javascript" th:src="@{/js/common.js}"></script>
<script async th:src="@{https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9504446465764716}" crossorigin="anonymous"></script>
</th:block>
</html>

View File

@ -0,0 +1,6 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<th:block th:fragment="title">
<title th:text="${title}">Bum's</title>
</th:block>
</html>

View File

@ -1,24 +1,25 @@
<!DOCTYPE html> <!DOCTYPE html>
<html <html lagn="ko"
lagn="ko" xmlns:th="http://www.thymeleaf.org"
xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns="http://www.w3.org/1999/html">
xmlns="http://www.w3.org/1999/html">
<head> <head>
<meta charset="UTF-8" /> <!-- <th:block layout:replace="fragments/includes" ></th:block>-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <th:block th:replace="~{fragments/includes :: includes}"></th:block>
<link th:href="@{/css/common.css}" rel="stylesheet" /> <!-- layout:fragment="head" -->
<script type="text/javascript" th:src="@{/js/common.js}"></script> <th:block layout:fragment="head"></th:block>
<meta name="Referrer" content="origin"> <!-- <th:block layout:replace="fragments/title" ></th:block> -->
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <th:block th:replace="~{fragments/title :: title}"></th:block>
<meta name="viewport" content="width=device-width,height=device-height,initial-scale=1">
</head> </head>
<body> <body>
<div th:replace="fragments/header :: header"></div> <!--<th:block th:replace="fragments/header :: header"></th:block>-->
<th:block th:replace="~{fragments/header :: header}"></th:block>
<!--<th:block layout:fragment="content"></th:block>-->
<div layout:fragment="content"></div> <th:block layout:fragment="content"></th:block>
<!--<th:block th:replace="fragments/footer :: footer"></th:block>-->
<div th:replace="fragments/footer :: footer"></div> <th:block th:replace="~{fragments/footer :: footer}"></th:block>
</body> </body>
</html> </html>