Compare commits
2 Commits
2caf83af1e
...
69d2df4ac4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69d2df4ac4 | ||
|
|
c4001848fc |
@ -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 {
|
||||
kotlin("jvm") version "1.9.25"
|
||||
kotlin("plugin.spring") version "1.9.25"
|
||||
id("org.springframework.boot") version "3.3.4"
|
||||
id("io.spring.dependency-management") version "1.1.6"
|
||||
id("com.github.jk1.dependency-license-report") version "2.0"
|
||||
}
|
||||
|
||||
group = "kr.lunaticbum.back"
|
||||
@ -44,6 +49,7 @@ dependencies {
|
||||
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
|
||||
implementation("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")
|
||||
implementation ("org.jsoup:jsoup:1.18.1")
|
||||
implementation ("com.drewnoakes:metadata-extractor:2.19.0")
|
||||
implementation("org.springframework.boot:spring-boot-starter-security")
|
||||
compileOnly("org.projectlombok:lombok")
|
||||
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()
|
||||
}
|
||||
@ -1,13 +1,15 @@
|
||||
package kr.lunaticbum.back.lun.controllers
|
||||
|
||||
import com.drew.imaging.ImageMetadataReader
|
||||
import com.drew.metadata.Metadata
|
||||
import com.google.gson.Gson
|
||||
import jakarta.servlet.http.HttpServletRequest
|
||||
import jakarta.servlet.http.HttpServletResponse
|
||||
import kr.lunaticbum.back.lun.configs.GlobalEnvironment
|
||||
import kr.lunaticbum.back.lun.model.CurrentWeather
|
||||
import kr.lunaticbum.back.lun.model.FileSaveResult
|
||||
import kr.lunaticbum.back.lun.model.LocationLogService
|
||||
import kr.lunaticbum.back.lun.model.ResponceResult
|
||||
import kr.lunaticbum.back.lun.controllers.UserController.Companion.ApiKeyWordKey
|
||||
import kr.lunaticbum.back.lun.controllers.UserController.Companion.EncType11
|
||||
import kr.lunaticbum.back.lun.controllers.UserController.Companion.EncTypeKey
|
||||
import kr.lunaticbum.back.lun.model.*
|
||||
import kr.lunaticbum.back.lun.utils.LogService
|
||||
import kr.lunaticbum.back.lun.utils.getFileExtension
|
||||
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.http.MediaType
|
||||
import org.springframework.http.ResponseEntity
|
||||
import org.springframework.security.core.userdetails.UserDetails
|
||||
import org.springframework.web.bind.annotation.*
|
||||
import org.springframework.web.multipart.MultipartFile
|
||||
import org.springframework.web.reactive.function.client.WebClient
|
||||
@ -35,11 +38,22 @@ class BlogController() {
|
||||
private lateinit var locationLogService: LocationLogService
|
||||
|
||||
@Autowired
|
||||
lateinit var logService: LogService
|
||||
private lateinit var postManageg: PostManageg
|
||||
|
||||
@GetMapping("write")
|
||||
fun writ() : ModelAndView{
|
||||
@Autowired
|
||||
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")
|
||||
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) {
|
||||
// 0L -> vm.modelMap.put(EncTypeKey,"T4")
|
||||
// 1L -> vm.modelMap.put(EncTypeKey,"T3")
|
||||
@ -50,6 +64,53 @@ class BlogController() {
|
||||
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}")
|
||||
fun viewer(@PathVariable blogId : String) : ModelAndView{
|
||||
val vm = ModelAndView("content/blog/viewer")
|
||||
@ -66,7 +127,7 @@ class BlogController() {
|
||||
@GetMapping("recent")
|
||||
fun recent() : ModelAndView{
|
||||
val vm = ModelAndView("content/blog/viewer")
|
||||
locationLogService.find50().forEach {
|
||||
locationLogService.find20().forEach {
|
||||
logService.log(Gson().toJson(it))
|
||||
}
|
||||
locationLogService.getLocationLog()?.let {
|
||||
@ -156,6 +217,13 @@ class BlogController() {
|
||||
// printWriter.flush()
|
||||
logService.log("imgUploadPath $imgUploadPath")
|
||||
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) {
|
||||
e.printStackTrace()
|
||||
} finally {
|
||||
|
||||
@ -11,9 +11,9 @@ import kr.lunaticbum.back.lun.utils.LogService
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.http.MediaType
|
||||
import org.springframework.http.ResponseEntity
|
||||
import org.springframework.security.core.userdetails.UserDetails
|
||||
import org.springframework.web.bind.annotation.*
|
||||
import org.springframework.web.reactive.function.client.WebClient
|
||||
import org.springframework.web.servlet.ModelAndView
|
||||
import java.util.*
|
||||
|
||||
|
||||
@ -29,6 +29,19 @@ class BumsPrivate {
|
||||
@Autowired
|
||||
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
|
||||
@PostMapping("save/loc.api")
|
||||
fun login(httpServletRequest: HttpServletRequest, @RequestBody jsonString: String) : ResponseEntity<ResponceResult> {
|
||||
|
||||
40
src/main/kotlin/kr/lunaticbum/back/lun/controllers/Home.kt
Normal file
40
src/main/kotlin/kr/lunaticbum/back/lun/controllers/Home.kt
Normal 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
|
||||
}
|
||||
|
||||
}
|
||||
@ -17,8 +17,12 @@ import org.springframework.context.annotation.Bean
|
||||
import org.springframework.scheduling.annotation.Scheduled
|
||||
import org.springframework.web.bind.annotation.*
|
||||
import org.springframework.web.reactive.function.client.WebClient
|
||||
import java.math.BigDecimal
|
||||
import java.math.RoundingMode
|
||||
import java.text.SimpleDateFormat
|
||||
import java.time.Duration
|
||||
import java.util.*
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
|
||||
@RestController
|
||||
@ -130,20 +134,22 @@ class Telegram {
|
||||
) {
|
||||
locationLogService.getLocationLog()?.let {
|
||||
try {
|
||||
val client0 = WebClient.create()
|
||||
val result = client0.get()
|
||||
WebClient.create().get()
|
||||
.uri("http://api.weatherapi.com/v1/current.json?key=${globalEvv.weatherApiKey}&q=${it.mLatitude},${it.mLongitude}&aqi=no")
|
||||
.retrieve()
|
||||
.bodyToMono(String::class.java)
|
||||
.block() ?: "FAIL"
|
||||
.timeout(Duration.ofSeconds(30L))
|
||||
.block()?.let { result ->
|
||||
Gson().fromJson(result, CurrentWeather::class.java)?.let { sss ->
|
||||
val client = WebClient.create()
|
||||
client.get()
|
||||
.uri("https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage?chat_id=${globalEvv.telegramMyId}&text=${sss.getSummaryInfo()}")
|
||||
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())}"
|
||||
logService.log("fullUrl >>> ${fullUrl}")
|
||||
WebClient.create().get()
|
||||
.uri(fullUrl)
|
||||
.retrieve()
|
||||
.bodyToMono(String::class.java).block() ?: "FAIL"
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (e : Exception) {
|
||||
|
||||
}
|
||||
|
||||
@ -23,12 +23,15 @@ import kotlin.math.log
|
||||
@RestController
|
||||
@RequestMapping("/user")
|
||||
class UserController {
|
||||
companion object{
|
||||
val EncTypeKey = "enc"
|
||||
val EncType00 = "T0"
|
||||
val EncType11 = "T3"
|
||||
val EncType10 = "T2"
|
||||
val EncType01 = "T1"
|
||||
val ApiKeyWordKey = "keyword"
|
||||
}
|
||||
|
||||
@Autowired
|
||||
lateinit var globalEvv : GlobalEnvironment
|
||||
|
||||
@ -54,6 +57,7 @@ class UserController {
|
||||
logService.log(file.absolutePath)
|
||||
vm.modelMap.put(EncTypeKey,EncType11)
|
||||
vm.modelMap.put(ApiKeyWordKey,"JOIN")
|
||||
vm.modelMap.put("title","회원이 들어는 구나~!!")
|
||||
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.resultMsg = lResultMsg
|
||||
})
|
||||
|
||||
@ -1,10 +1,6 @@
|
||||
package kr.lunaticbum.back.lun.model
|
||||
|
||||
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.utils.LogService
|
||||
import lombok.AllArgsConstructor
|
||||
@ -14,13 +10,11 @@ import org.bson.codecs.pojo.annotations.BsonIgnore
|
||||
import org.jsoup.Jsoup
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
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.repository.ReactiveMongoRepository
|
||||
import org.springframework.stereotype.Repository
|
||||
import org.springframework.stereotype.Service
|
||||
import org.springframework.web.reactive.function.client.WebClient
|
||||
import reactor.core.publisher.Flux
|
||||
import reactor.core.publisher.Mono
|
||||
import java.text.SimpleDateFormat
|
||||
import java.time.Duration
|
||||
@ -97,8 +91,8 @@ class LocationLogService : LocationService {
|
||||
@Autowired
|
||||
private lateinit var logRepository: LocationLogRepository
|
||||
|
||||
fun find50() : List<LocationLog> {
|
||||
return logRepository.findAll().takeLast(50).buffer(50).blockLast(Duration.ofSeconds(30)) ?: listOf()
|
||||
fun find20() : List<LocationLog> {
|
||||
return logRepository.findAll().takeLast(20).buffer(20).blockLast(Duration.ofSeconds(30)) ?: listOf()
|
||||
}
|
||||
fun getLocationLog() : LocationLog? {
|
||||
return logRepository.findFirstByOrderByTimeDesc().block()
|
||||
@ -110,7 +104,6 @@ class LocationLogService : LocationService {
|
||||
logRepository.save(log).subscribe( { println("saved msg after ${it}") },{e -> e.printStackTrace()},{
|
||||
println("saved msg comp")
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
75
src/main/kotlin/kr/lunaticbum/back/lun/model/Post.kt
Normal file
75
src/main/kotlin/kr/lunaticbum/back/lun/model/Post.kt
Normal 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}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -52,7 +52,6 @@ class Location {
|
||||
class CurrentWeather {
|
||||
var location: Location? = null
|
||||
var current: Current? = null
|
||||
|
||||
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=${this.location?.lat},${this.location?.lon}"
|
||||
fun getSummaryInfo(lat : String,lon : String) = "지역:${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}"
|
||||
}
|
||||
@ -26,6 +26,11 @@ spring.data.mongodb.database=l
|
||||
spring.thymeleaf.prefix=classpath:/templates/
|
||||
spring.thymeleaf.suffix=.html
|
||||
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
|
||||
# thymeleaf? ?? ??? ??? ???. cache=false ??(???? true)
|
||||
|
||||
@ -1,62 +1,124 @@
|
||||
:root {
|
||||
--WindowFull : 100%;
|
||||
--WindowFull : 99vw;
|
||||
--TopHeight: 160px;
|
||||
--FooterHeight: 160px;
|
||||
--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;
|
||||
background: #2d2f34;
|
||||
border: black;
|
||||
border-width: 1px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
position: relative;
|
||||
padding: 1vh 1vw;
|
||||
}
|
||||
body, html {
|
||||
background-color: black;
|
||||
margin: 0px;
|
||||
height: 100lvh;
|
||||
|
||||
/*#main_layer {*/
|
||||
/* width: 100%;*/
|
||||
/* 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 {
|
||||
width: 100%;
|
||||
align-content: center;
|
||||
top: 0;
|
||||
background: #F0F0F524;
|
||||
border-top: #ec914b8f;
|
||||
border-radius: 10px 30px;
|
||||
border-width: 1px;
|
||||
height: 8vh;
|
||||
min-height: 8vh;
|
||||
display: flex;
|
||||
position: relative;
|
||||
height: var(--TopHeight);
|
||||
background-image: url("../blog/post/images/42cc3207-42a4-4ceb-8a2f-f5f7a89496fc.jpg");
|
||||
background-repeat: revert;
|
||||
background-size: contain;
|
||||
background-origin: revert;
|
||||
}
|
||||
#bottom {
|
||||
float: right;
|
||||
display: inline-block;
|
||||
justify-content: space-between;
|
||||
margin-left: auto;
|
||||
grid-auto-flow: column;
|
||||
grid-template-columns: 3fr;
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
}
|
||||
|
||||
#content {
|
||||
margin-left: 2.5%;
|
||||
margin-right: 2.5%;
|
||||
#top {
|
||||
float: left;
|
||||
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;
|
||||
overflow-y: auto;
|
||||
overflow-x: clip;
|
||||
background: black;
|
||||
min-height: calc((var(--TopHeight) + var(--FooterHeight)) * 2);
|
||||
height: calc(var(--WindowFull) - calc(var(--FooterHeight) + var(--TopHeight)));
|
||||
background-image: url("../blog/post/images/bb109b5a-f907-4da1-9c4f-55533395ed6e.jpg");
|
||||
background-repeat: revert;
|
||||
background-size: contain;
|
||||
background-origin: revert;
|
||||
height: 68vh;
|
||||
max-height: 68vh;
|
||||
min-height: 8vh;
|
||||
}
|
||||
|
||||
#main_layer > div {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
|
||||
#content > * {
|
||||
margin-top: var(--ContentVerticalMargin);
|
||||
margin-bottom: var(--ContentVerticalMargin);
|
||||
|
||||
}
|
||||
|
||||
footer {
|
||||
width: 100%;
|
||||
align-content: center;
|
||||
display: flex;
|
||||
bottom: 0;
|
||||
border-top: #ec914b8f;
|
||||
background: #F0F0F524;
|
||||
border-radius: 30px 10px;
|
||||
border-width: 1px;
|
||||
height: 8vh;
|
||||
min-height: 8vh;
|
||||
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);
|
||||
}
|
||||
@ -6,11 +6,11 @@
|
||||
|
||||
.toastui-editor-dark .toastui-editor-md-container,
|
||||
.toastui-editor-dark .toastui-editor-ww-container {
|
||||
background-color: #121212;
|
||||
background-color: #12121288;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-defaultUI-toolbar {
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
border-bottom-color: #303238;
|
||||
}
|
||||
|
||||
@ -20,20 +20,20 @@
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-toolbar-icons:not(:disabled):hover {
|
||||
background-color: #36383f;
|
||||
background-color: #36383f88;
|
||||
border-color: #36383f;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-toolbar-divider {
|
||||
background-color: #303238;
|
||||
background-color: #30323888;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-tooltip {
|
||||
background-color: #535662;
|
||||
background-color: #53566288;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-tooltip .arrow {
|
||||
background-color: #535662;
|
||||
background-color: #53566288;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-defaultUI-toolbar .scroll-sync::before {
|
||||
@ -45,23 +45,23 @@
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-defaultUI-toolbar .switch {
|
||||
background-color: #2b4455;
|
||||
background-color: #2b445588;
|
||||
}
|
||||
|
||||
.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 {
|
||||
background-color: #8f939f;
|
||||
background-color: #8f939f88;
|
||||
}
|
||||
|
||||
.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 {
|
||||
background-color: #303238;
|
||||
background-color: #30323888;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-mode-switch {
|
||||
@ -71,25 +71,25 @@
|
||||
|
||||
.toastui-editor-dark .toastui-editor-mode-switch .tab-item {
|
||||
border-color: #393b42;
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
color: #757a86;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-mode-switch .tab-item.active {
|
||||
border-top-color: #121212;
|
||||
background-color: #121212;
|
||||
background-color: #12121288;
|
||||
color: #eee;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-popup,
|
||||
.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);
|
||||
border-color: #494c56;
|
||||
}
|
||||
|
||||
.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 {
|
||||
@ -133,7 +133,7 @@
|
||||
|
||||
.toastui-editor-dark .toastui-editor-popup-body .toastui-editor-file-select-button {
|
||||
border-color: #303238;
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
color: #eee;
|
||||
}
|
||||
|
||||
@ -144,7 +144,7 @@
|
||||
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-close-button {
|
||||
color: #eee;
|
||||
border-color: #303238;
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
}
|
||||
|
||||
.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 {
|
||||
color: #121212;
|
||||
background-color: #67ccff;
|
||||
background-color: #67ccff88;
|
||||
}
|
||||
|
||||
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-ok-button:hover {
|
||||
color: #121212;
|
||||
background-color: #32baff;
|
||||
background-color: #32baff88;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-cell {
|
||||
border-color: #303238;
|
||||
background-color: #121212;
|
||||
background-color: #12121288;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-cell.header {
|
||||
border-color: #303238;
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
}
|
||||
|
||||
.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 {
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
border-bottom-color: #303238;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-md-tab-container .tab-item {
|
||||
border-color: #393b42;
|
||||
background-color: #2d2f34;
|
||||
background-color: #2d2f3488;
|
||||
color: #757a86;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-md-tab-container .tab-item.active {
|
||||
border-bottom-color: #121212;
|
||||
background-color: #121212;
|
||||
background-color: #12121288;
|
||||
color: #eee;
|
||||
}
|
||||
|
||||
@ -208,7 +208,7 @@
|
||||
}
|
||||
|
||||
.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 {
|
||||
@ -217,7 +217,7 @@
|
||||
|
||||
.toastui-editor-dark .toastui-editor-dropdown-toolbar {
|
||||
border-color: #494c56;
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .ProseMirror,
|
||||
@ -251,7 +251,7 @@
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-contents pre {
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-contents pre code {
|
||||
@ -261,7 +261,7 @@
|
||||
|
||||
.toastui-editor-dark .toastui-editor-contents code {
|
||||
color: #c1798b;
|
||||
background-color: #35262a;
|
||||
background-color: #35262a88;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-contents div {
|
||||
@ -270,7 +270,7 @@
|
||||
|
||||
.toastui-editor-dark .toastui-editor-ww-code-block-language {
|
||||
border-color: #303238;
|
||||
background-color: #121212;
|
||||
background-color: #12121288;
|
||||
}
|
||||
|
||||
.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 {
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
border: 1px solid #393b42;
|
||||
color: #eee;
|
||||
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 {
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
border-color: #393b42;
|
||||
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 {
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
border-color: #595c68;
|
||||
}
|
||||
|
||||
@ -320,7 +320,7 @@
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-contents table th {
|
||||
background-color: #3a3c42;
|
||||
background-color: #3a3c4288;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-contents table td,
|
||||
@ -352,7 +352,7 @@
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-contents ul > li::before {
|
||||
background-color: #55575f;
|
||||
background-color: #55575f88;
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-contents hr {
|
||||
@ -369,7 +369,7 @@
|
||||
|
||||
.toastui-editor-dark .toastui-editor-contents .image-link:hover::before {
|
||||
border-color: #393b42;
|
||||
background-color: #232428;
|
||||
background-color: #23242888;
|
||||
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);
|
||||
}
|
||||
@ -424,11 +424,11 @@
|
||||
}
|
||||
|
||||
.toastui-editor-dark .toastui-editor-md-code {
|
||||
background-color: #35262a;
|
||||
background-color: #35262a88;
|
||||
}
|
||||
|
||||
.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 {
|
||||
@ -440,7 +440,7 @@
|
||||
}
|
||||
|
||||
.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 {
|
||||
|
||||
18
src/main/resources/static/js/blog.js
Normal file
18
src/main/resources/static/js/blog.js
Normal 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 {
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4,7 +4,7 @@
|
||||
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/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" th:src="@{/js/toast-ui-view.js}"></script>
|
||||
<link th:href="@{/css/toast-ui.css}" rel="stylesheet" />
|
||||
@ -49,8 +49,9 @@
|
||||
console.log(editor.getHTML())
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<div layout:fragment="content" id="content">
|
||||
</th:block>
|
||||
<th:block layout:fragment="content" id="content">
|
||||
<div id="main_layer">
|
||||
<input id="title_layer" />
|
||||
<div id="editor" ></div>
|
||||
<div id="hashtag_layer">
|
||||
@ -60,5 +61,6 @@
|
||||
<div id="controll_layer" >
|
||||
<button onclick="save()">asdsad</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
</html>
|
||||
|
||||
@ -4,9 +4,10 @@
|
||||
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||
layout:decorate="~{layout/default_layout}"
|
||||
>
|
||||
<head>
|
||||
<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.min.js" crossorigin="anonymous"></script>
|
||||
<th:block layout:fragment="head" id="head">
|
||||
<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/blog.js}"></script>
|
||||
<link th:href="@{/css/blog.css}" rel="stylesheet" />
|
||||
<link th:href="@{/css/toast-ui.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('--TopHeight'))
|
||||
var editorHeght = (
|
||||
document.querySelector('#content').getBoundingClientRect().height -
|
||||
document.querySelector('#main_layer').getBoundingClientRect().height -
|
||||
(
|
||||
Number(style.getPropertyValue('--ButtonHegit').replace("px","") * 3)
|
||||
+ Number(style.getPropertyValue('--TopHeight').replace("px",""))
|
||||
@ -32,7 +33,7 @@
|
||||
editor = new toastui.Editor({
|
||||
el: document.querySelector('#editor'),
|
||||
previewStyle: 'tab',
|
||||
height: editorHeght+ 'px',
|
||||
height: editorHeght + 'px',
|
||||
width:'95%',
|
||||
theme:'dark',
|
||||
usageStatistics : false,
|
||||
@ -63,12 +64,12 @@
|
||||
addImageBlobHook: (blob, callback) => {
|
||||
const formData = new FormData();
|
||||
formData.append('file', blob);
|
||||
|
||||
let url = 'post/images/';
|
||||
let uploadUrl = location.protocol + "//" + location.hostname + "/blog/post/imageUpload";
|
||||
let imageUrl = location.protocol + "//" + location.hostname + '/blog/post/images/';
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
enctype: 'multipart/form-data',
|
||||
url: 'post/imageUpload',
|
||||
url: uploadUrl,
|
||||
data: formData,
|
||||
dataType: 'json',
|
||||
processData: false,
|
||||
@ -76,8 +77,8 @@
|
||||
cache: false,
|
||||
timeout: 600000,
|
||||
success: function (data) {
|
||||
url += data.fileName;
|
||||
callback(url, '사진 대체 텍스트 입력');
|
||||
imageUrl += data.fileName;
|
||||
callback(imageUrl, '사진 대체 텍스트 입력');
|
||||
},
|
||||
error: function (e) {
|
||||
callback('image_load_fail', '사진 대체 텍스트 입력');
|
||||
@ -89,20 +90,27 @@
|
||||
}
|
||||
function save() {
|
||||
console.log(editor.getHTML())
|
||||
console.log(editor.getMarkdown())
|
||||
onclickWrite([[${enc}]],[[${keyword}]],editor.getMarkdown())
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<div layout:fragment="content" id="content">
|
||||
</th:block>
|
||||
<th:block layout:fragment="content" id="content">
|
||||
<div id="main_layer">
|
||||
<th:block th:if="${PERMISSION != 'OK'}">
|
||||
<h1>권한이 없는 뎁쇼?!</h1>
|
||||
</th:block>
|
||||
<th:block th:if="${PERMISSION == 'OK'}">
|
||||
<div class="layer">
|
||||
<input id="title_layer" />
|
||||
<input id="title_field" />
|
||||
</div>
|
||||
<div id="editor" ></div>
|
||||
<div class="layer">
|
||||
<select > </select>
|
||||
<input id="hashtag" />
|
||||
</div>
|
||||
<div id="layer" >
|
||||
<input id="hashtag_field" />
|
||||
<button id="save" onclick="save()">asdsad</button>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</th:block>
|
||||
</html>
|
||||
|
||||
@ -1,22 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
<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">
|
||||
<title>Spring Boot</title>
|
||||
|
||||
<!--/* css */-->
|
||||
<link th:href="@{/css/common.css}" rel="stylesheet" />
|
||||
</th:block>
|
||||
<body>
|
||||
<th:block layout:fragment="header" th:include="@{fragments/header}"></th:block>
|
||||
|
||||
<div layout:fragment="content" class="content">
|
||||
<h2>This is Content</h2>
|
||||
</div>
|
||||
|
||||
<th:block layout:fragment="footer" th:include="@{fragments/footer}"></th:block>
|
||||
</body>
|
||||
<th:block layout:fragment="content" id="content">
|
||||
<div id="main_layer"></div>
|
||||
</th:block>
|
||||
</html>
|
||||
151
src/main/resources/templates/content/licenses.html
Normal file
151
src/main/resources/templates/content/licenses.html
Normal 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>
|
||||
20
src/main/resources/templates/content/private/where.html
Normal file
20
src/main/resources/templates/content/private/where.html
Normal 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>
|
||||
@ -4,7 +4,7 @@
|
||||
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||
layout:decorate="~{layout/default_layout}"
|
||||
>
|
||||
<head>
|
||||
<th:block layout:fragment="head" id="head">
|
||||
<!--css,JS 추가영역-->
|
||||
<script th:inline="javascript">
|
||||
function jopinClick() {
|
||||
@ -12,9 +12,9 @@
|
||||
}
|
||||
</script>
|
||||
<script type="text/javascript" th:src="@{/js/user.js}"></script>
|
||||
</head>
|
||||
<div layout:fragment="content" id="content">
|
||||
<table>
|
||||
</th:block >
|
||||
<th:block layout:fragment="content">
|
||||
<table id="main_layer">
|
||||
<tr>
|
||||
<td><h2>회원가입</h2></td>
|
||||
</tr>
|
||||
@ -30,5 +30,5 @@
|
||||
<tr><td><input id="user_email" type="text" class="email"></td></tr>
|
||||
<tr><td><input type="submit" value="가입하기" class="btn" onclick="jopinClick()"></td></tr>
|
||||
</table>
|
||||
</div>
|
||||
</th:block>
|
||||
</html>
|
||||
@ -4,28 +4,25 @@
|
||||
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||
layout:decorate="~{layout/default_layout}">
|
||||
|
||||
<th:block layout:fragment="head">
|
||||
<head>
|
||||
<title>Spring Boot</title>
|
||||
<script th:inline="javascript">
|
||||
function loginClick() {
|
||||
onclickLogin([[${enc}]],[[${key}]])
|
||||
}
|
||||
</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>
|
||||
</th:block>
|
||||
</head>>
|
||||
<body onload="checkDebug()">
|
||||
<th:block layout:fragment="header" th:include="@{fragments/header}"></th:block>
|
||||
|
||||
<div layout:fragment="content" class="content">
|
||||
<div layout:fragment="content" id="content">
|
||||
<table>
|
||||
<tr><td>아이디</td></tr>
|
||||
<tr><td><input id="user_id" type="text" class="text"></td></tr>
|
||||
<tr><td>비밀번호</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>
|
||||
</div>
|
||||
|
||||
|
||||
@ -1,6 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org">
|
||||
<footer th:fragment="footer">
|
||||
asdasdasd
|
||||
</footer>
|
||||
<th:block th:fragment="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>
|
||||
@ -1,4 +0,0 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
<div class="head">
|
||||
</div>
|
||||
</html>
|
||||
@ -1,6 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org">
|
||||
<header th:fragment="header">
|
||||
header.html
|
||||
</header>
|
||||
<th:block th:fragment="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>
|
||||
13
src/main/resources/templates/fragments/includes.html
Normal file
13
src/main/resources/templates/fragments/includes.html
Normal 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>
|
||||
6
src/main/resources/templates/fragments/title.html
Normal file
6
src/main/resources/templates/fragments/title.html
Normal 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>
|
||||
@ -1,24 +1,25 @@
|
||||
<!DOCTYPE html>
|
||||
<html
|
||||
lagn="ko"
|
||||
<html lagn="ko"
|
||||
xmlns:th="http://www.thymeleaf.org"
|
||||
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||
xmlns="http://www.w3.org/1999/html">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<link th:href="@{/css/common.css}" rel="stylesheet" />
|
||||
<script type="text/javascript" th:src="@{/js/common.js}"></script>
|
||||
<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">
|
||||
<!-- <th:block layout:replace="fragments/includes" ></th:block>-->
|
||||
<th:block th:replace="~{fragments/includes :: includes}"></th:block>
|
||||
<!-- layout:fragment="head" -->
|
||||
<th:block layout:fragment="head"></th:block>
|
||||
<!-- <th:block layout:replace="fragments/title" ></th:block> -->
|
||||
<th:block th:replace="~{fragments/title :: title}"></th:block>
|
||||
</head>
|
||||
|
||||
<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>
|
||||
|
||||
<div th:replace="fragments/footer :: footer"></div>
|
||||
<th:block layout:fragment="content"></th:block>
|
||||
<!--<th:block th:replace="fragments/footer :: footer"></th:block>-->
|
||||
<th:block th:replace="~{fragments/footer :: footer}"></th:block>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Loading…
x
Reference in New Issue
Block a user