*.txt
album.zip
public/images/album
-public/images/album.zip
\ No newline at end of file
+public/images/album.zip
+log
\ No newline at end of file
useOauth2: false
id: seantywork@gmail.com
pw: sample
-giftPage: https://bolder-stew-a1f.notion.site/1f08f36af0df80c28a80cb530b8118b7?pvs=4
\ No newline at end of file
+album:
+ addr: "public/images"
+title: "Taehoon & Suya"
+groom: "윤태훈"
+bride: "반수야"
+comment: "HAPPILY EVER AFTER"
+giftPage: "#"
fi
-podman run --restart=always \
+podman run -d --restart=always \
--name our-wedding-rsvp --network rsvp0 \
--tty \
-p 8080:8080 \
-v ./data:/workspace/data \
+ -v ./log:/workspace/log \
localhost/our-wedding-rsvp
\ No newline at end of file
Id string `yaml:"id"`
Pw string `yaml:"pw"`
} `yaml:"admin"`
+ Album struct {
+ Addr string `yaml:"addr"`
+ }
+ Title string `yaml:"title"`
+ Groom string `yaml:"groom"`
+ Bride string `yaml:"bride"`
+ Comment string `yaml:"comment"`
GiftPage string `yaml:"giftPage"`
}
_comment = make(chan CommentData)
- f, err := os.OpenFile("mailerr.txt", os.O_APPEND|os.O_RDWR|os.O_CREATE, 0644)
+ f, err := os.OpenFile("log/mailerr.txt", os.O_APPEND|os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
func sendMail(commentId string, title string, content string) error {
var pass = API_JSON.MailPass
- var from = "seantywork@gmail.com"
- var to = "seantywork@gmail.com"
+ var from = pkgglob.G_CONF.Admin.Id
+ var to = pkgglob.G_CONF.Admin.Id
var smtpHost = "smtp.gmail.com"
callback := pkgglob.G_CONF.Url + "/api/comment/approve/" + commentId
--- /dev/null
+package api
+
+import (
+ "encoding/json"
+ "log"
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+var imageList []ImageInfo
+
+type ImageInfo struct {
+ Name string `json:"name"`
+}
+
+func AddImageList(paths []string) {
+
+ imageList = make([]ImageInfo, 0)
+
+ for i := 0; i < len(paths); i++ {
+
+ imageList = append(imageList, ImageInfo{
+ Name: paths[i],
+ })
+
+ }
+
+}
+
+func GetImageList(c *gin.Context) {
+
+ ibytes, err := json.Marshal(imageList)
+
+ if err != nil {
+ log.Printf("image list: marshal: %s\n", err.Error())
+
+ c.JSON(http.StatusBadRequest, SERVER_RESP{Status: "error", Reply: "invalid format"})
+
+ return
+ }
+
+ c.JSON(http.StatusOK, SERVER_RESP{Status: "success", Reply: string(ibytes)})
+
+}
package server
import (
+ "fmt"
+ "os"
pkgserverapi "our-wedding-rsvp/pkg/server/api"
+ "path/filepath"
+ "strings"
pkgauth "our-wedding-rsvp/pkg/auth"
pkgglob "our-wedding-rsvp/pkg/glob"
func configureServer(e *gin.Engine) error {
+ if !strings.HasPrefix(pkgglob.G_CONF.Album.Addr, "public/") {
+ return fmt.Errorf("album addr needs to start with 'public' prefix")
+ }
+
+ albumPath := filepath.Join(pkgglob.G_CONF.Album.Addr, "album")
+
+ if _, err := os.Stat(albumPath); err != nil {
+ return fmt.Errorf("album addr not found: %v", err)
+ }
+
+ de, err := os.ReadDir(albumPath)
+
+ if err != nil {
+ return fmt.Errorf("failed to readdir: %v", err)
+ }
+
+ paths := make([]string, 0)
+
+ delen := len(de)
+
+ if delen < 3 {
+ return fmt.Errorf("at least three images should exist: title, groom, bride")
+ }
+
+ for i := 0; i < delen; i++ {
+
+ if de[i].IsDir() {
+ return fmt.Errorf("album should not contain subdir")
+ }
+
+ path := filepath.Join(albumPath, de[i].Name())
+
+ paths = append(paths, path)
+
+ }
+
+ pkgserverapi.AddImageList(paths)
+
e.LoadHTMLGlob("view/*")
e.Static("/public", "./public")
e.GET("/api/story/list", pkgserverapi.GetStoryList)
+ e.GET("/api/image/list", pkgserverapi.GetImageList)
+
e.GET("/api/appkey", pkgserverapi.GetAppKey)
e.GET("/api/gift", pkgserverapi.GetGiftPage)
pkgauth "our-wedding-rsvp/pkg/auth"
pkgdb "our-wedding-rsvp/pkg/db"
+ pkgglob "our-wedding-rsvp/pkg/glob"
pkgserverapi "our-wedding-rsvp/pkg/server/api"
)
func getIndex(c *gin.Context) {
- c.HTML(200, "index.html", gin.H{})
+ c.HTML(200, "index.html", gin.H{
+ "title": pkgglob.G_CONF.Title,
+ "groom": pkgglob.G_CONF.Groom,
+ "bride": pkgglob.G_CONF.Bride,
+ "comment": pkgglob.G_CONF.Comment,
+ })
}
}
c.HTML(200, "read.html", gin.H{
"article_code": watchId,
+ "title": pkgglob.G_CONF.Title,
})
}
func GetComment(c *gin.Context) {
- c.HTML(200, "comment.html", gin.H{})
+ c.HTML(200, "comment.html", gin.H{
+ "title": pkgglob.G_CONF.Title,
+ })
}
URL = ""
APPKEY = ""
+IMAGE_TITLE = ""
+IMAGE_GROOM = ""
+IMAGE_BRIDE = ""
+
async function userSignin(){
}
- console.log(orderedEntry)
+
storyList.innerHTML = ""
}
-/*
- <button class="btn btn-default gift-btn"
- onclick="window.open('/story/r/${oe.id}')">
- <i class="fa fa-search"></i></button>
-<button class="btn btn-default gift-btn gift-send" data-name="와인셀러"
- onclick="alert('다른분에게 예약된 선물입니다.');"><i
- class="fa fa-gift"></i></button>
-*/
+
+
+async function getImageList(){
+
+
+ let resp = await fetch("/api/image/list", {
+ method: "GET"
+ })
+
+ let result = await resp.json()
+
+ if(result.status != "success"){
+
+ alert("failed to get comment list")
+
+ return
+
+ }
+
+ let imageList = document.getElementById("image-rows")
+
+ let imageEntry = JSON.parse(result.reply)
+
+ let entrylen = imageEntry.length
+
+ imageList.innerHTML = ""
+
+ for(let i = 0 ; i < entrylen; i++){
+
+ let ie = imageEntry[i]
+
+ if(IMAGE_TITLE == ""){
+ IMAGE_TITLE = ie.name
+ let homeprops = document.getElementsByClassName("ww-home-page");
+ homeprops[0].style.backgroundImage=`url("/${IMAGE_TITLE}")`
+
+ } else if (IMAGE_GROOM == ""){
+ IMAGE_GROOM = ie.name
+ let g = document.getElementById("couple-groom")
+ g.innerHTML += `
+ <img alt="Groom" class="img-fluid" src="/${IMAGE_GROOM}"/>
+ `
+ } else if (IMAGE_BRIDE == ""){
+ IMAGE_BRIDE = ie.name
+ let b = document.getElementById("couple-bride")
+ b.innerHTML += `
+ <img alt="Bride" class="img-fluid" src="/${IMAGE_BRIDE}"/>
+ `
+ }
+
+ let ieEl = `
+ <div class="card" data-groups="["party","wedding"]">
+ <a data-gallery="ww-gallery" data-toggle="lightbox">
+ <img alt="Gallery Pic 2" class="img-fluid" src="/${ie.name}"/>
+ </a>
+ </div>
+ `
+
+ imageList.innerHTML += ieEl
+ }
+}
async function registerComment(){
}
- alert("방명록을 성공적으로 남겼습니다: " + result.reply + "\n관리자 확인 후 게시 예정입니다.\n감사합니다 ^^")
+ alert("방명록을 성공적으로 남겼습니다: " + result.reply + "\n확인 후 게시 예정입니다.\n감사합니다 ^^")
location.href = "/"
let rawText = ""
let mdRenderd = ""
- console.log(commentEntry)
+
for(let i = 0 ; i < entrylen; i++){
objectType: 'feed',
content: {
title: '딸기 치즈 케익',
- description: '#케익 #딸기 #삼평동 #카페 #분위기 #소개팅',
+ description: '#결혼 #윤태훈 #반수야',
imageUrl:
'http://k.kakaocdn.net/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png',
link: {
webUrl: thisUrl,
},
},
- social: {
- likeCount: 286,
- commentCount: 45,
- sharedCount: 845,
- },
buttons: [
{
- title: '웹으로 보기',
- link: {
- mobileWebUrl: thisUrl,
- webUrl: thisUrl,
- },
- },
- {
- title: '앱으로 보기',
+ title: '보기',
link: {
mobileWebUrl: thisUrl,
webUrl: thisUrl,
console.log("data ready")
},
-// onChange: function(api, event) {
-// console.log('something changed', event);
-// }
+
})
onReady: function(){
console.log("data ready")
},
-// onChange: function(api, event) {
-// console.log('something changed', event);
-// }
+
}
);
return false;\r
});\r
\r
- $(".gift-send").click(function () {\r
- $("#gift-name").text($(this).data("name"));\r
- })\r
-\r
-\r
- $("#reserveGiftButton").click(function () {\r
- let name = $("#sender-name").val();\r
- let message = $("#sender-message").val();\r
- $("#reserveGiftButton").text("전송중...");\r
- $("#reserveGiftButton").prop("disabled", true);\r
-\r
- emailjs.init("user_yjLL5xG0A3kkOCH5BGIDh");\r
- emailjs.send("wedding-mail", "gift_send", {\r
- name: name,\r
- gift: $("#gift-name").text(),\r
- message: message\r
- }).then(function (response) {\r
- $('#giftMailModal').modal('hide');\r
- alert(name + "님의 메시지가 정상적으로 전송되었습니다.");\r
-\r
- $("#reserveGiftButton").text("예약하기!");\r
- $("#sender-name").val('');\r
- $("#sender-message").val('');\r
- $("#reserveGiftButton").prop("disabled", false);\r
- }, function (err) {\r
- alert("메시지 전송이 실패했습니다. 다시 시도해주세요.");\r
- });\r
- })\r
})\r
\r
// Smooth scroll for links with hashes\r
/* Home Page Style */
.ww-home-page {
- background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), url("/public/images/album/00.jpg") no-repeat center center;
+ background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), no-repeat center center;
background-size: cover;
background-position: 50%;
height: 100vh;
#!/bin/bash
-./start_mkdb.sh
+mkdir -p data
-./rsvp.out
+mkdir -p data/media
+
+mkdir -p log
+
+
+if [ ! -f "data/rsvp.db" ]
+then
+
+ sqlite3 data/rsvp.db "VACUUM;"
+
+fi
+
+datestr=$(date '+%Y-%m-%d-%H-%M-%S')
+
+./rsvp.out >> "log/$datestr" 2>&1
+++ /dev/null
-#!/bin/bash
-
-
-mkdir -p data
-
-mkdir -p data/media
-
-
-if [ ! -f "data/rsvp.db" ]
-then
-
- sqlite3 data/rsvp.db "VACUUM;"
-
-fi
-
-
-
+++ /dev/null
-{{ define "archive.html" }}
-<!DOCTYPE html>
-<html lang="en-US">
-<head>
- <meta charset="UTF-8">
- <meta content="IE=edge" http-equiv="X-UA-Compatible">
- <meta content="width=device-width, initial-scale=1" name="viewport">
- <title>최원영과 이소민의 결혼식</title>
- <meta content="최원영과 이소민의 결혼식에 와서 축하해주세요~!" name="description"/>
- <meta property="og:image" content="/public/images/pic2.jpeg">
- <meta property="fb:app_id" content="781066922265598" />
- <meta property="fb:admins" content="Choi.Anderson"/>
- <link href="/public/images/favicon/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180">
- <link href="/public/images/favicon/favicon-32x32.png" rel="icon" sizes="32x32" type="image/png">
- <link href="/public/images/favicon/favicon-16x16.png" rel="icon" sizes="16x16" type="image/png">
- <link href="https://fonts.googleapis.com/css?family=Dosis:400,500" rel="stylesheet">
- <link href="https://fonts.googleapis.com/css?family=Great+Vibes" rel="stylesheet">
- <link href="/public/css/ekko-lightbox.css" rel="stylesheet">
- <link href="/public/styles/main.css" rel="stylesheet">
- <link href="https://fonts.googleapis.com/css?family=Gamja+Flower|Gugi|Noto+Serif+KR|Stylish|Sunflower:300"
- rel="stylesheet">
- <script src="https://code.jquery.com/jquery-2.2.1.js"></script>
-
-
- <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
- <script src="https://cdn.emailjs.com/sdk/2.3.2/email.min.js" type="text/javascript"></script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/remarkable/1.7.1/remarkable.js" type="text/javascript"></script>
- <script type="text/javascript">
- function sendMail() {
-
- (function () {
- emailjs.init("user_yjLL5xG0A3kkOCH5BGIDh");
- emailjs.send("wedding-mail", "gift_send", {
- name: $("#sender-name").value,
- gift: $("#gift-name").text(),
- message: $("#sender-message").value
- }).then(function (response) {
- console.log("SUCCESS. status=%d, text=%s", response.status, response.text);
- }, function (err) {
- console.log("FAILED. error=", err);
- });
- })();
- }
-
- function findGetParameter(parameterName) {
- var result = null,
- tmp = [];
- location.search
- .substr(1)
- .split("&")
- .forEach(function (item) {
- tmp = item.split("=");
- if (tmp[0] === parameterName) result = decodeURIComponent(tmp[1]);
- });
- return result;
- }
-
- $(document).ready(function () {
-
- function getText(){
- var result = null;
- $.ajax( { url: "https://raw.githubusercontent.com/AndersonChoi/wedding-card/master/README.md",
- type: 'get',
- dataType: 'html',
- async: false,
- success: function(data) { result = data; }
- }
- );
- FileReady = true;
- return result;
- }
- var markdown_source = getText();
- var comment_contents = markdown_source.split("축하의 말")[1];
-
-
-
- var md = new Remarkable();
- $("#comments").append(md.render(comment_contents));
-
-
- if(findGetParameter('gift')=='false'){
- $('#gifts').hide();
- }
- });
-
-
-
-
- </script>
-</head>
-
-<body id="top">
-<header></header>
-<div id="fb-root"></div>
-<script async defer crossorigin="anonymous" src="https://connect.facebook.net/ko_KR/sdk.js#xfbml=1&version=v3.2"></script>
-<div class="page-content">
- <div class="div">
- <div class="ww-home-page" id="home">
- <div class="ww-wedding-announcement d-flex align-items-center justify-content-start">
- <div class="container ww-announcement-container">
- <p class="ww-couple-name ww-title" style="font-size:4.0em">Wonyoung & Somin</p>
- <p class="h2 mt-5 ww-title" style="font-family: 'Gugi', cursive; font-size:1.0em">
- | WE ARE GETTING MARRIED |
- </p>
- <p class="h2 mt-5 ww-title"
- style="font-family: 'Noto Serif KR', serif; font-size:1.0em; letter-spacing:-1px">
- <b style="font-size:1.4em;">2019. 05. 18. SAT PM 02:30</b>
- <br>부산 해운대 센텀시티 센텀사이언스파크 23층
- </p>
- </div>
- </div>
- </div>
- <div class="ww-nav-bar sticky-top bg-light">
- <nav class="navbar navbar-expand-lg navbar-light">
- <div class="container">
- <button aria-controls="ww-navbarNav" aria-expanded="false" aria-label="Toggle navigation"
- class="navbar-toggler"
- data-target="#ww-navbarNav" data-toggle="collapse" type="button">
- <span class="navbar-toggler-icon"></span>
- </button>
- <div class="collapse navbar-collapse text-uppercase" id="ww-navbarNav">
- <ul class="navbar-nav ml-auto">
- <li class="nav-item"><a class="nav-link smooth-scroll" href="#home">Home</a></li>
- <li class="nav-item"><a class="nav-link smooth-scroll" href="#couple">Couple</a></li>
- <li class="nav-item"><a class="nav-link smooth-scroll" href="#events">Events</a></li>
- <li class="nav-item"><a class="nav-link smooth-scroll" href="#gallery">Gallery</a></li>
- </ul>
- </div>
- </div>
- </nav>
- </div>
- <div class="ww-section" id="couple">
- <div class="container">
- <h2 class="h1 text-center pb-3 ww-title" style="font-family: 'Noto Serif KR', serif;">신랑 & 신부</h2>
- <div class="row text-center">
- <div class="col-md-6">
- <div class="mt-3">
- <h3 class="h2 ww-title" style="font-family: 'Sunflower', sans-serif; font-size:1.5em">
- 이소민</h3>
- <img alt="Groom" class="img-fluid" src="/public/images/pic8.jpeg"/>
- </div>
- </div>
- <div class="col-md-6">
- <div class="mt-3">
- <h3 class="h2 ww-title" style="font-family: 'Sunflower', sans-serif; font-size:1.5em">
- 최원영</h3>
- <img alt="Bride" class="img-fluid" src="/public/images/pic9.jpeg"/>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="ww-section bg-light" id="events">
- <div class="container ww-wedding-event">
- <h2 class="h1 text-center pb-3 ww-title" style="font-family: 'Noto Serif KR', serif;">초대합니다</h2>
- <div class="col text-center mb-5">
- <h6 style="font-family: 'Noto Serif KR', serif;">
- 1463<br>
- (만난지 4년+1일 되는날 결혼 = 1463일)
- </h6>
- </div>
- <div class="row">
- <div class="col-md-7 col-sm-12">
- <div class="my-3">
- <div class="h4">웨딩 본식</div>
- <ul>
- <li>
- <i class="text-muted fas fa-map-marker-alt"></i>
- <span class="pl-2 text-muted">부산 해운대 우동 센텀사이언스 파크 23층</span>
- </li>
- <li class="pt-2">
- <i class="text-muted far fa-calendar-alt"></i>
- <span class="pl-2 text-muted">2019년 5월 18일, 2:30PM</span>
- </li>
- </ul>
- </div>
- </div>
- <div class="col-md-5 col-sm-12">
- <div class="my-3">
- <img alt="Wedding Party" class="img-fluid" src="/public/images/wedding-party.jpg"/>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-md-7 col-sm-12">
- <div class="my-3">
- <div class="h4">식사</div>
- <ul>
- <li>
- <i class="text-muted fas fa-map-marker-alt "></i>
- <span class="pl-2 text-muted">부산 해운대 우동 센텀사이언스 파크 지하 1층 더파티 센텀점</span>
- </li>
- <li class="pt-2">
- <i class="text-muted far fa-calendar-alt "></i>
- <span class="pl-2 text-muted">2019년 5월 18일, 2:30PM - 4:30PM</span>
- </li>
- </ul>
- </div>
- </div>
- <div class="col-md-5 col-sm-12">
- <div class="my-3"><img alt="Reception" class="img-fluid" src="/public/images/reception.jpg"/></div>
- </div>
- </div>
- </div>
- </div>
- <div class="ww-section" id="gallery">
- <div class="ww-photo-gallery">
- <div class="container">
- <h2 class="h1 text-center pb-3 ww-title" style="font-family: 'Noto Serif KR', serif;">포토 갤러리</h2>
- <div class="ww-gallery">
- <div class="card-columns">
- <div class="card" data-groups="["party","wedding"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 2" class="img-fluid" src="/public/images/pic2.jpeg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 3" class="img-fluid" src="/public/images/pic3.jpeg"/>
- </a>
- </div>
- <div class="card" data-groups="["party","vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 4" class="img-fluid" src="/public/images/pic4.jpeg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 5" class="img-fluid" src="/public/images/pic6.jpeg"/>
- </a>
- </div>
- <div class="card"
- data-groups="["wedding","ceremony","party"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 6" class="img-fluid" src="/public/images/pic7.jpeg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/pic5.jpeg"/>
- </a>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="ww-section parallax-window text-white" data-parallax="scroll" data-image-src="/public/images/gift/gift-background.jpg" id="gifts">
- <div class="ww-gift-section">
- <div class="container">
- <h2 class="h1 text-center pb-3 ww-title" style="font-family: 'Noto Serif KR', serif;">Gift for our
- wedding</h2>
- <div class="col text-center mb-5">
- <h6 style="font-family: 'Noto Serif KR', serif;">
- 저희 부부가 앞으로 살아나갈 일상에<br>
- 오래도록 특별한 기억을 선물하고 싶으신가요?<br>
- 그렇다면 고민하는 대신 아래 목록을 참고해 주세요.<br>
- 저희가 필요로 하는 물건들을 정리해 두었습니다.<br>
- 애정어린 마음으로 보내주신 선물은<br>
- 가까이 두어 오래도록 아껴 쓰고,<br>
- 소중하게 간직하겠습니다.
- <br><br>
- (아래 선물버튼을 눌러 신랑, 신부에게 예약메시지를 보내세요!)
- </h6>
- </div>
- <div class="ww-gift">
- <div class="gift-columns">
- <div class="gift">
- <img alt="와인셀러" class="img-fluid gift-img gift-selected" src="/public/images/gift/wineceller.png"/>
- <div class="btn-group gift-btn-group" role="group">
- <button class="btn btn-default gift-btn"
- onclick="window.open('https://smartstore.naver.com/dhk00840/products/4311205513')">
- <i class="fa fa-search"></i></button>
- <button class="btn btn-default gift-btn gift-send" data-name="와인셀러"
- onclick="alert('다른분에게 예약된 선물입니다.');"><i
- class="fa fa-gift"></i></button>
- </div>
- </div>
- <div class="gift">
- <img alt="전동클렌저" class="img-fluid gift-img gift-selected"
- src="/public/images/gift/philips_clenser.png"/>
- <div class="btn-group gift-btn-group" role="group">
- <button class="btn btn-default gift-btn"
- onclick="window.open('https://www.philips.co.kr/c-p/BSC111_06/visapure-mini-facial-cleanser')">
- <i class="fa fa-search"></i></button>
- <button class="btn btn-default gift-btn gift-send" data-name="전동클렌저"
- onclick="alert('다른분에게 예약된 선물입니다.');"><i
- class="fa fa-gift"></i></button>
- </div>
- </div>
- <div class="gift">
- <img alt="드라이기" class="img-fluid gift-img gift-selected" src="/public/images/gift/dyson.png"/>
- <div class="btn-group gift-btn-group" role="group">
- <button class="btn btn-default gift-btn"
- onclick="window.open('https://www.kr.dyson.com/products/hair-care/dyson-supersonic-hair-dryer')">
- <i class="fa fa-search"></i></button>
- <button class="btn btn-default gift-btn gift-send" data-name="드라이기"
- onclick="alert('다른분에게 예약된 선물입니다.');"><i
- class="fa fa-gift"></i></button>
- </div>
- </div>
- <div class="gift">
- <img alt="믹서기" class="img-fluid gift-img gift-selected" src="/public/images/gift/blender.png"/>
- <div class="btn-group gift-btn-group" role="group">
- <button class="btn btn-default gift-btn"
- onclick="window.open('http://jenniferoom.co.kr/product/detail.html?product_no=85&cate_no=24&display_group=1')">
- <i class="fa fa-search"></i></button>
- <button class="btn btn-default gift-btn gift-send" data-name="믹서기"
- onclick="alert('다른분에게 예약된 선물입니다.');"><i
- class="fa fa-gift"></i></button>
- </div>
- </div>
- <div class="gift">
- <img alt="레고" class="img-fluid gift-img gift-selected" src="/public/images/gift/lego.png"/>
- <div class="btn-group gift-btn-group" role="group">
- <button class="btn btn-default gift-btn"
- onclick="window.open('https://shop.lego.com/ko-KR/product/10232')"><i
- class="fa fa-search"></i></button>
- <button class="btn btn-default gift-btn gift-send" data-name="레고"
-
- onclick="alert('다른분에게 예약된 선물입니다.');"><i
- class="fa fa-gift"></i></button>
- </div>
- </div>
- <div class="gift">
- <img alt="전기레인지" class="img-fluid gift-img gift-selected" src="/public/images/gift/range.png"/>
- <div class="btn-group gift-btn-group" role="group">
- <button class="btn btn-default gift-btn"
- onclick="window.open('https://www.lge.co.kr/lgekor/product/kitchen/electricRange/productDetail.do?cateId=4410&prdId=EPRD.333447')">
- <i class="fa fa-search"></i></button>
- <button class="btn btn-default gift-btn gift-send" data-name="전기레인지"
-
- onclick="alert('다른분에게 예약된 선물입니다.');"><i
- class="fa fa-gift"></i></button>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="ww-section ww-rsvp-detail" id="map">
- <div class="container">
- <div class="col text-center">
- <h2 class="h1 text-center pb-3 ww-title" style="font-family: 'Noto Serif KR', serif;">오시는 길</h2>
- <div>
- <h5 style="font-family: 'Noto Serif KR', serif;">센텀사이언스파크웨딩홀 23층 스카이홀</h5>
- <h6 style="font-family: 'Noto Serif KR', serif;">(부산 해운대구 센텀중앙로 79)</h6>
- </div>
- </div>
-
- <div class="form-group">
- <div class="col-md-12">
- <div class="my-3 text-center">
- <a href="http://naver.me/5pTy3HCa">
- <img alt="naver-map" class="map-icon" id="naver-map"
- src="/public/images/map/naver-map.png"/>
- </a>
- <a href="http://dmaps.kr/2bms8">
- <img alt="kakao-map" class="map-icon" id="kakao-map"
- src="/public/images/map/kakao-map.png"/>
- </a>
- <a href="https://maps.app.goo.gl/jfDxw">
- <img alt="google-map" class="map-icon" id="google-map"
- src="/public/images/map/google-map.png"/>
- </a>
- </div>
- <div class="col text-center">
- <label style="font-family: 'Noto Serif KR', serif; font-size: 15px;">
- 셔틀버스 - 센텀시티역 4번출구앞에서 15분 간격으로 운행
- </label>
- </div>
- <div class="my-3">
- <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3261.297439052569!2d129.1238775160104!3d35.1741384652207!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x356892c2513ecf5d%3A0x7d362ece2091e2f8!2z7IS87YWA7IKs7J207Ja47Iqk7YyM7YGsIOy7qOuypOyFmO2ZgA!5e0!3m2!1sko!2skr!4v1554092125630!5m2!1sko!2skr" width="100%" height="400" frameborder="0" style="border:0" allowfullscreen></iframe>
- </div>
- </div>
- </div>
-
-
- </div>
- </div>
-
- <div class="ww-section bg-light" id="comment">
- <div class="ww-photo-gallery">
- <div class="container">
- <div class="col text-center">
- <h2 class="h1 text-center pb-3 ww-title" style="font-family: 'Noto Serif KR', serif;">축하메시지</h2><br>
- <div id="comments"></div>
- <br>
- <div class="row">
- <div class="col text-center"><form action="https://github.com/AndersonChoi/wedding-card/blob/master/README.md">
- <button class="btn btn-primary btn-submit" type="submit">메시지 남기러 가기</button></form>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
-
- </div>
-</div>
-</div>
-<div aria-hidden="true" aria-labelledby="exampleModalLabel" class="modal fade" id="giftMailModal" role="dialog"
- tabindex="-1">
- <div class="modal-dialog modal-dialog-centered" role="document">
- <div class="modal-content">
- <div class="modal-header">
- <h5 class="modal-title" id="exampleModalLongTitle">선물하기 - <span id="gift-name"></span></h5>
- <button aria-label="Close" class="close" data-dismiss="modal" type="button">
- <span aria-hidden="true">×</span>
- </button>
- </div>
- <div class="modal-body">
- <div class="input-group mb-3">
- <div class="input-group-prepend">
- <span class="input-group-text">보내는 분 성함</span>
- </div>
- <input aria-describedby="basic-addon3" class="form-control" id="sender-name" type="text">
- </div>
- <div class="input-group">
- <textarea aria-label="With textarea" class="form-control" id="sender-message"
- placeholder="신랑, 신부에게 선물 예약과 함께 보낼 메시지를 입력해주세요. 이 메시지는 신랑, 신부에게 발송됩니다." rows=4></textarea>
- </div>
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" id="reserveGiftButton" type="button">예약</button>
- </div>
- </div>
- </div>
-</div>
-<footer></footer>
-<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
-<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
-<script src="/public/js/aos.js"></script>
-<script src="/public/js/parallax.min.js"></script>
-<script src="/public/js/ekko-lightbox.min.js"></script>
-<script src="/public/scripts/main.js"></script>
-
-<div class="bottom_right"><i class="fa fa-arrow-up fa-2x" id="go-to-top"></i>
-</div>
-
-<div class="bottom_left">
- <audio id="player" src="/public/mus.mp3"></audio>
- <div>
- <i class="fa fa-music fa-2x" onclick="document.getElementById('player').play()"></i>
- </div>
-</div>
-
-</body>
-</html>
-{{ end }}
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1" name="viewport">
- <title>윤태훈, 반수야 결혼한대요!</title>
- <meta content="윤태훈, 반수야 결혼한대요!" name="description"/>
+ <title>{{ .title }}</title>
<link href="/public/images/favicon/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180">
<link href="/public/images/favicon/favicon-32x32.png" rel="icon" sizes="32x32" type="image/png">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
- <script src="https://cdn.emailjs.com/sdk/2.3.2/email.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/remarkable/1.7.1/remarkable.js" type="text/javascript"></script>
</head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1" name="viewport">
- <title>윤태훈, 반수야 결혼한대요!</title>
- <meta content="윤태훈, 반수야 결혼한대요!" name="description"/>
+ <title>{{ .title }}</title>
+
<link href="/public/images/favicon/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180">
<link href="/public/images/favicon/favicon-32x32.png" rel="icon" sizes="32x32" type="image/png">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
- <script src="https://cdn.emailjs.com/sdk/2.3.2/email.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/remarkable/1.7.1/remarkable.js" type="text/javascript"></script>
</head>
<div class="ww-home-page" id="home">
<div class="ww-wedding-announcement d-flex align-items-center justify-content-start">
<div class="container ww-announcement-container">
- <p class="ww-couple-name ww-title" style="font-size:4.0em">Taehoon & Suya</p>
+ <p class="ww-couple-name ww-title" style="font-size:4.0em">{{ .title }}</p>
<p class="h2 mt-5 ww-title" style="font-family: 'Gugi', cursive; font-size:1.0em">
- | HAPPILY EVER AFTER |
+ | {{ .comment }} |
</p>
</div>
</div>
<h2 class="h1 text-center pb-3 ww-title" style="font-family: 'Noto Serif KR', serif;">신랑 & 신부</h2>
<div class="row text-center">
<div class="col-md-6">
- <div class="mt-3">
+ <div class="mt-3" id="couple-groom">
<h3 class="h2 ww-title" style="font-family: 'Sunflower', sans-serif; font-size:1.5em">
- 윤태훈</h3>
- <img alt="Groom" class="img-fluid" src="/public/images/album/00.jpg"/>
+ {{ .groom }}</h3>
</div>
</div>
<div class="col-md-6">
- <div class="mt-3">
+ <div class="mt-3" id="couple-bride">
<h3 class="h2 ww-title" style="font-family: 'Sunflower', sans-serif; font-size:1.5em">
- 반수야</h3>
- <img alt="Bride" class="img-fluid" src="/public/images/album/01.jpg"/>
+ {{ .bride }}</h3>
</div>
</div>
</div>
<div class="container">
<h2 class="h1 text-center pb-3 ww-title" style="font-family: 'Noto Serif KR', serif;">포토 갤러리</h2>
<div class="ww-gallery">
- <div class="card-columns">
- <div class="card" data-groups="["party","wedding"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 2" class="img-fluid" src="/public/images/album/01.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 3" class="img-fluid" src="/public/images/album/02.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["party","vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 4" class="img-fluid" src="/public/images/album/03.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 5" class="img-fluid" src="/public/images/album/04.jpg"/>
- </a>
- </div>
- <div class="card"
- data-groups="["wedding","ceremony","party"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 6" class="img-fluid" src="/public/images/album/05.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/06.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/07.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/08.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/09.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/10.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["party","wedding"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 2" class="img-fluid" src="/public/images/album/11.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 3" class="img-fluid" src="/public/images/album/12.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["party","vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 4" class="img-fluid" src="/public/images/album/13.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 5" class="img-fluid" src="/public/images/album/14.jpg"/>
- </a>
- </div>
- <div class="card"
- data-groups="["wedding","ceremony","party"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 6" class="img-fluid" src="/public/images/album/15.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/16.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/17.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/18.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/19.jpg"/>
- </a>
- </div>
- <div class="card" data-groups="["vacation"]">
- <a data-gallery="ww-gallery" data-toggle="lightbox">
- <img alt="Gallery Pic 7" class="img-fluid" src="/public/images/album/20.jpg"/>
- </a>
- </div>
+ <div class="card-columns" id="image-rows">
</div>
</div>
</div>
await getArticleList()
+ await getImageList()
+
await getCommentList()
await getAppShare()
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1" name="viewport">
- <title>윤태훈, 반수야 결혼한대요!</title>
- <meta content="윤태훈, 반수야 결혼한대요!" name="description"/>
-
+ <title>{{ .title }}</title>
+
<link href="/public/images/favicon/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180">
<link href="/public/images/favicon/favicon-32x32.png" rel="icon" sizes="32x32" type="image/png">
<link href="/public/images/favicon/favicon-16x16.png" rel="icon" sizes="16x16" type="image/png">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
- <script src="https://cdn.emailjs.com/sdk/2.3.2/email.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/remarkable/1.7.1/remarkable.js" type="text/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/@editorjs/header@latest"></script>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
- <script src="https://cdn.emailjs.com/sdk/2.3.2/email.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/remarkable/1.7.1/remarkable.js" type="text/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/@editorjs/header@latest"></script>