getEventList() {
47 | return eventDAO.getEventList();
48 | }
49 |
50 | public EventDetailStatus getEventDetailStatus(Event event) {
51 | if (event.getEventStatus() == EventStatus.CLOSE) {
52 | return EventDetailStatus.CLOSE;
53 | } else if (event.getEventStatus() == EventStatus.LOTTERY) {
54 | return EventDetailStatus.LOTTERY;
55 | }
56 |
57 | LocalDateTime currentTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul")).toLocalDateTime();
58 | if (currentTime.isBefore(event.getEventStartTime())) {
59 | return EventDetailStatus.START_SOON;
60 | } else if (currentTime.isAfter(event.getEventEndTime())) {
61 | return EventDetailStatus.ALREADY_END;
62 | } else {
63 | return EventDetailStatus.OPEN;
64 | }
65 | }
66 |
67 | public void newEvent() {
68 | Event event = new Event();
69 | event.setEventTitle("허수아비 X차 이벤트");
70 | event.setEventDetail("이벤트 세부 일정");
71 | event.setEventStatus(EventStatus.CLOSE);
72 | event.setEventStartTime(ZonedDateTime.now(ZoneId.of("Asia/Seoul")).toLocalDateTime());
73 | event.setEventEndTime(ZonedDateTime.now(ZoneId.of("Asia/Seoul")).toLocalDateTime());
74 |
75 | updateEvent(event);
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/src/main/resources/templates/view/admin/duplicated.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
23 |
24 |
25 |
26 |
27 |
28 | 로딩 중
29 | 중복 개수
30 | 비고
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
45 |
46 |
47 | 서버로 부터 데이터를 불러오는 중입니다...
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
60 |
61 |
62 | 서버로 부터 데이터를 불러오지 못하였습니다.
63 |
64 |
65 |
66 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/src/main/resources/static/js/admin/Horyu.View.EventHistory.min.js.map:
--------------------------------------------------------------------------------
1 | {
2 | "version":3,
3 | "file":"Horyu.View.EventHistory.min.js",
4 | "lineCount":5,
5 | "mappings":"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",
6 | "sources":["/js/admin/Horyu.View.EventHistory.js"],
7 | "names":["Horyu","window","View","EventHistory","Horyu.View.EventHistory","options","_this","$","extend","defaultOptions","eventList","applicantCountMap","init","_this.init","changeMainContainerWidth","updateTable","bindEvents","_this.changeMainContainerWidth","$mainContainer","removeClass","addClass","_this.updateTable","$tableBody","$table","find","empty","forEach","event","$tr","append","text","eventId","eventTitle","eventDetail","getEventStatusText","eventStatus","html","moment","eventStartTime","format","eventEndTime","applicantCount","$eventDetailBtn","attr","_this.getEventStatusText","_this.bindEvents","click","target","location","href"]
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/controller/admin/PrizeController.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.controller.admin;
2 |
3 | import com.horyu1234.eventangel.constant.View;
4 | import com.horyu1234.eventangel.domain.Event;
5 | import com.horyu1234.eventangel.domain.Prize;
6 | import com.horyu1234.eventangel.factory.ModelAttributeNameFactory;
7 | import com.horyu1234.eventangel.form.PrizeSaveForm;
8 | import com.horyu1234.eventangel.service.CompanyService;
9 | import com.horyu1234.eventangel.service.EventService;
10 | import com.horyu1234.eventangel.service.PrizeService;
11 | import org.springframework.beans.factory.annotation.Autowired;
12 | import org.springframework.stereotype.Controller;
13 | import org.springframework.ui.Model;
14 | import org.springframework.web.bind.annotation.RequestMapping;
15 | import org.springframework.web.bind.annotation.RequestMethod;
16 |
17 | /**
18 | * Created by horyu on 2018-04-04
19 | */
20 | @RequestMapping("/admin/prizeSetting")
21 | @Controller
22 | public class PrizeController {
23 | private EventService eventService;
24 | private CompanyService companyService;
25 | private PrizeService prizeService;
26 |
27 | @Autowired
28 | public void setEventService(EventService eventService) {
29 | this.eventService = eventService;
30 | }
31 |
32 | @Autowired
33 | public void setCompanyService(CompanyService companyService) {
34 | this.companyService = companyService;
35 | }
36 |
37 | @Autowired
38 | public void setPrizeService(PrizeService prizeService) {
39 | this.prizeService = prizeService;
40 | }
41 |
42 | @RequestMapping(value = "/", method = RequestMethod.GET)
43 | public String prizeSetting(Model model) {
44 | Event currentEvent = eventService.getCurrentEvent();
45 |
46 | model.addAttribute(ModelAttributeNameFactory.EVENT_STATUS, currentEvent.getEventStatus());
47 | model.addAttribute("companyList", companyService.getCompanyList(currentEvent.getEventId()));
48 | model.addAttribute("prizeList", prizeService.getCompanyGiftData(currentEvent.getEventId()));
49 |
50 | model.addAttribute(ModelAttributeNameFactory.VIEW_NAME, View.ADMIN_PRIZE_SETTING.toView());
51 |
52 | return View.LAYOUT.getTemplateName();
53 | }
54 |
55 | @RequestMapping(value = "/savePrize", method = RequestMethod.POST)
56 | public String savePrize(PrizeSaveForm prizeSaveForm) {
57 | Event currentEvent = eventService.getCurrentEvent();
58 |
59 | Prize prize = new Prize();
60 | prize.setEventId(currentEvent.getEventId());
61 | prize.setPrizeId(prizeSaveForm.getPrizeId());
62 | prize.setCompanyId(prizeSaveForm.getCompanyId());
63 | prize.setPrizeName(prizeSaveForm.getPrizeName());
64 | prize.setPrizeAmount(prizeSaveForm.getPrizeAmount());
65 |
66 | prizeService.savePrize(prize);
67 |
68 | return View.ADMIN_PRIZE_SETTING.toRedirect();
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/domain/CompanyAndPrize.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.domain;
2 |
3 | /**
4 | * Created by horyu on 2018-04-14
5 | */
6 | public class CompanyAndPrize {
7 | private int prizeId;
8 | private int companyId;
9 | private String companyName;
10 | private String companyDetail;
11 | private String companyLogoImageFileName;
12 | private String prizeName;
13 | private int prizeAmount;
14 |
15 | public CompanyAndPrize() {
16 | }
17 |
18 | public CompanyAndPrize(Company company, Prize prize) {
19 | this.prizeId = prize.getPrizeId();
20 | this.companyId = prize.getCompanyId();
21 | this.companyName = company.getCompanyName();
22 | this.companyDetail = company.getCompanyDetail();
23 | this.companyLogoImageFileName = company.getCompanyLogoImageFileName();
24 | this.prizeName = prize.getPrizeName();
25 | this.prizeAmount = prize.getPrizeAmount();
26 | }
27 |
28 | public int getPrizeId() {
29 | return prizeId;
30 | }
31 |
32 | public void setPrizeId(int prizeId) {
33 | this.prizeId = prizeId;
34 | }
35 |
36 | public int getCompanyId() {
37 | return companyId;
38 | }
39 |
40 | public void setCompanyId(int companyId) {
41 | this.companyId = companyId;
42 | }
43 |
44 | public String getCompanyName() {
45 | return companyName;
46 | }
47 |
48 | public void setCompanyName(String companyName) {
49 | this.companyName = companyName;
50 | }
51 |
52 | public String getPrizeName() {
53 | return prizeName;
54 | }
55 |
56 | public void setPrizeName(String prizeName) {
57 | this.prizeName = prizeName;
58 | }
59 |
60 | public String getCompanyDetail() {
61 | return companyDetail;
62 | }
63 |
64 | public void setCompanyDetail(String companyDetail) {
65 | this.companyDetail = companyDetail;
66 | }
67 |
68 | public String getCompanyLogoImageFileName() {
69 | return companyLogoImageFileName;
70 | }
71 |
72 | public void setCompanyLogoImageFileName(String companyLogoImageFileName) {
73 | this.companyLogoImageFileName = companyLogoImageFileName;
74 | }
75 |
76 | public int getPrizeAmount() {
77 | return prizeAmount;
78 | }
79 |
80 | public void setPrizeAmount(int prizeAmount) {
81 | this.prizeAmount = prizeAmount;
82 | }
83 |
84 | public CompanyAndPrize copy() {
85 | CompanyAndPrize companyAndPrize = new CompanyAndPrize();
86 | companyAndPrize.setPrizeId(this.prizeId);
87 | companyAndPrize.setCompanyId(this.companyId);
88 | companyAndPrize.setCompanyName(this.companyName);
89 | companyAndPrize.setPrizeName(this.prizeName);
90 | companyAndPrize.setCompanyDetail(this.companyDetail);
91 | companyAndPrize.setPrizeAmount(this.prizeAmount);
92 |
93 | return companyAndPrize;
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/src/main/resources/static/js/admin/Horyu.View.EventHistory.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | var Horyu = window.Horyu || {};
4 | Horyu.View = window.Horyu.View || {};
5 | Horyu.View.EventHistory = function(options) {
6 | var _this = this;
7 |
8 | var defaultOptions = {
9 | eventList: [],
10 | applicantCountMap: {}
11 | };
12 |
13 | _this.options = $.extend(defaultOptions, options);
14 |
15 | _this.init = function() {
16 | _this.changeMainContainerWidth();
17 | _this.updateTable();
18 | _this.bindEvents();
19 | };
20 |
21 | _this.changeMainContainerWidth = function() {
22 | var $mainContainer = $('#main-container');
23 | $mainContainer.removeClass('container');
24 | $mainContainer.addClass('container-full');
25 | };
26 |
27 | _this.updateTable = function() {
28 | var $table = $('.event-history-table');
29 |
30 | var $tableBody = $table.find('tbody');
31 | $tableBody.empty();
32 |
33 | _this.options.eventList.forEach(function(event) {
34 | var $tr = $(' ');
35 | $tr.append($('').text(event.eventId));
36 | $tr.append($(' ').text(event.eventTitle));
37 | $tr.append($(' ').text(event.eventDetail));
38 | $tr.append($(' ').text(_this.getEventStatusText(event.eventStatus)));
39 | $tr.append($(' ').html(moment(event.eventStartTime).format('YYYY년 MMMM D일 dddd A h시 mm분 ss초')));
40 | $tr.append($(' ').html(moment(event.eventEndTime).format('YYYY년 MMMM D일 dddd A h시 mm분 ss초')));
41 |
42 | var applicantCount = _this.options.applicantCountMap[event.eventId];
43 | if (event.eventId > 5) {
44 | $tr.append($(' ').text(applicantCount + '개'));
45 | } else {
46 | $tr.append($(' ').text('-'));
47 | }
48 |
49 | var $eventDetailBtn = $(' ')
50 | .text('이벤트 결과 확인')
51 | .attr('data-event-id', event.eventId);
52 |
53 | $tr.append($(' ').append($eventDetailBtn));
54 |
55 | $tableBody.append($tr);
56 | });
57 | };
58 |
59 | _this.getEventStatusText = function(eventStatus) {
60 | if (eventStatus === 'OPEN') {
61 | return '응모 중';
62 | } else if (eventStatus === 'CLOSE') {
63 | return '응모 닫힘';
64 | } else if (eventStatus === 'LOTTERY') {
65 | return '추첨 진행';
66 | } else {
67 | return eventStatus;
68 | }
69 | };
70 |
71 | _this.bindEvents = function() {
72 | $('.viewEventBtn').click(function(event) {
73 | var eventId = $(event.target).attr('data-event-id');
74 | location.href = './view/' + eventId;
75 | });
76 | };
77 |
78 | return {
79 | init: function() {
80 | _this.init();
81 | }
82 | };
83 | };
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/controller/rest/CompanyLogoImageRestController.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.controller.rest;
2 |
3 | import com.horyu1234.eventangel.domain.Company;
4 | import com.horyu1234.eventangel.domain.Event;
5 | import com.horyu1234.eventangel.service.CompanyService;
6 | import com.horyu1234.eventangel.service.EventService;
7 | import org.slf4j.Logger;
8 | import org.slf4j.LoggerFactory;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.http.MediaType;
11 | import org.springframework.util.StreamUtils;
12 | import org.springframework.web.bind.annotation.RequestMapping;
13 | import org.springframework.web.bind.annotation.RequestMethod;
14 | import org.springframework.web.bind.annotation.RestController;
15 |
16 | import javax.servlet.http.HttpServletResponse;
17 | import java.io.File;
18 | import java.io.FileInputStream;
19 | import java.io.IOException;
20 | import java.io.InputStream;
21 |
22 | @RestController
23 | public class CompanyLogoImageRestController {
24 | private static final Logger LOGGER = LoggerFactory.getLogger(CompanyLogoImageRestController.class);
25 | private EventService eventService;
26 | private CompanyService companyService;
27 |
28 | @Autowired
29 | public CompanyLogoImageRestController(EventService eventService, CompanyService companyService) {
30 | this.eventService = eventService;
31 | this.companyService = companyService;
32 | }
33 |
34 | @RequestMapping(value = "/companyLogo", method = RequestMethod.GET)
35 | public void companyLogoImage(HttpServletResponse response, int companyId) {
36 | Event currentEvent = eventService.getCurrentEvent();
37 |
38 | Company company = companyService.getCompany(currentEvent.getEventId(), companyId);
39 |
40 | String companyLogoImageFileName = company.getCompanyLogoImageFileName();
41 |
42 | File companyLogoImage = companyService.getCompanyLogoImage(currentEvent.getEventId(), companyId);
43 | if (companyLogoImage == null) {
44 | response.setStatus(HttpServletResponse.SC_NOT_FOUND);
45 | return;
46 | }
47 |
48 | response.setContentType(getImageType(companyLogoImageFileName));
49 |
50 | try (InputStream inputStream = new FileInputStream(companyLogoImage)) {
51 | StreamUtils.copy(inputStream, response.getOutputStream());
52 | } catch (IOException ignored) {
53 | }
54 | }
55 |
56 | private String getImageType(String fileName) {
57 | String extension = fileName.split("\\.")[1];
58 |
59 | switch (extension.toLowerCase()) {
60 | case "png":
61 | return MediaType.IMAGE_PNG_VALUE;
62 | case "jpg":
63 | case "jpeg":
64 | return MediaType.IMAGE_JPEG_VALUE;
65 | case "gif":
66 | return MediaType.IMAGE_GIF_VALUE;
67 | default:
68 | return MediaType.IMAGE_PNG_VALUE;
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/src/main/resources/static/js/admin/Horyu.View.EventSetting.min.js:
--------------------------------------------------------------------------------
1 | var Horyu=window.Horyu||{};Horyu.View=window.Horyu.View||{};
2 | Horyu.View.EventSetting=function(c){var a=this;a.options=$.extend({eventStartTime:0,eventEndTime:0},c);a.init=function(){a.initDateRangePicker();a.bindEvents();a.updateVisibleStatus("OPEN"===a.getOpenEventBtnId())};a.initDateRangePicker=function(){$("#eventTerm").daterangepicker({timePicker:!0,timePickerIncrement:1,timePickerSeconds:!0,showDropdowns:!0,todayHighlight:!0,startDate:moment.unix(a.options.eventStartTime),endDate:moment.unix(a.options.eventEndTime),dateLimit:{year:1},locale:{format:"YYYY\ub144 MM\uc6d4 DD\uc77c A h\uc2dc mm\ubd84 ss\ucd08",
3 | applyLabel:"\uc801\uc6a9",cancelLabel:"\ucde8\uc18c",daysOfWeek:"\uc77c\uc6d4\ud654\uc218\ubaa9\uae08\ud1a0".split(""),monthNames:"1\uc6d4 2\uc6d4 3\uc6d4 4\uc6d4 5\uc6d4 6\uc6d4 7\uc6d4 8\uc6d4 9\uc6d4 10\uc6d4 11\uc6d4 12\uc6d4".split(" ")}})};a.bindEvents=function(){$(".eventStatusButton").change(function(){a.updateVisibleStatus("OPEN"===$(this).attr("id"))});$(".submitBtn").click(function(){var b=$("#eventTerm").data("daterangepicker");$("#eventStatus").val(a.getOpenEventBtnId());$("#eventStartTime").val(b.startDate.unix());
4 | $("#eventEndTime").val(b.endDate.unix());$("#eventSettingForm").submit()});$(".endEventBtn").click(function(){$("#end-event-modal").modal({backdrop:"static",keyboard:!1})});$("#endEventConfirmBtn").click(function(){$("#endEventConfirmBtn").html("\ucc98\ub9ac \uc911\uc785\ub2c8\ub2e4.");$("#endEventConfirmBtn").attr("disabled","");$(".abortBtn").css("visibility","hidden");$.ajax({type:"GET",url:"./endEvent",timeout:5E3}).done(function(){$("#endEventConfirmBtn").html("\uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.");
5 | setTimeout(function(){location.reload()},500)}).fail(function(a){$("#endEventConfirmBtn").html("\ud1b5\uc2e0\uc5d0 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc7a0\uc2dc \ud6c4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.");setTimeout(function(){location.reload()},3E3)})});$(".resetEventWinner").click(function(){$("#reset-event-winner-modal").modal({backdrop:"static",keyboard:!1})});$("#resetEventWinnerConfirmBtn").click(function(){$("#resetEventWinnerConfirmBtn").html("\ucc98\ub9ac \uc911\uc785\ub2c8\ub2e4.");
6 | $("#resetEventWinnerConfirmBtn").attr("disabled","");$(".abortBtn").css("visibility","hidden");$.ajax({type:"GET",url:"./resetEventWinner",timeout:5E3}).done(function(){$("#resetEventWinnerConfirmBtn").html("\uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.");setTimeout(function(){location.reload()},500)}).fail(function(a){$("#resetEventWinnerConfirmBtn").html("\ud1b5\uc2e0\uc5d0 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc7a0\uc2dc \ud6c4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.");setTimeout(function(){location.reload()},
7 | 3E3)})})};a.getOpenEventBtnId=function(){return $(".eventStatusBtnGroup .active input").attr("id")};a.updateVisibleStatus=function(a){a?$(".eventOpenSettingGroup").show(500):$(".eventOpenSettingGroup").hide(500)};return{init:function(){a.init()}}};
8 | //# sourceMappingURL=Horyu.View.EventSetting.min.js.map
--------------------------------------------------------------------------------
/src/main/resources/templates/view/apply/wrongWay.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 | 현재
0명 이 이벤트 응모를 하였습니다.
7 |
8 |
9 |
22 |
23 |
28 |
29 |
31 |
32 |
33 |
34 | 앞으로 있을 추첨 방송을 기대해주시기 바랍니다.
35 |
36 | 추첨 방송이 시작되면, 여기에도 당첨자 목록이 표시됩니다.
37 |
38 |
39 |
40 |
41 |
48 |
49 |
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/controller/admin/EventHistoryController.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.controller.admin;
2 |
3 | import com.horyu1234.eventangel.constant.View;
4 | import com.horyu1234.eventangel.domain.Event;
5 | import com.horyu1234.eventangel.factory.ModelAttributeNameFactory;
6 | import com.horyu1234.eventangel.service.ApplicantService;
7 | import com.horyu1234.eventangel.service.EventService;
8 | import com.horyu1234.eventangel.service.EventWinnerService;
9 | import com.horyu1234.eventangel.service.PrizeService;
10 | import org.springframework.beans.factory.annotation.Autowired;
11 | import org.springframework.stereotype.Controller;
12 | import org.springframework.ui.Model;
13 | import org.springframework.web.bind.annotation.PathVariable;
14 | import org.springframework.web.bind.annotation.RequestMapping;
15 | import org.springframework.web.bind.annotation.RequestMethod;
16 |
17 | import java.util.HashMap;
18 | import java.util.List;
19 | import java.util.Map;
20 |
21 | /**
22 | * Created by horyu on 2018-04-16
23 | */
24 | @RequestMapping("/admin/eventHistory")
25 | @Controller
26 | public class EventHistoryController {
27 | private EventService eventService;
28 | private PrizeService prizeService;
29 | private EventWinnerService eventWinnerService;
30 | private ApplicantService applicantService;
31 |
32 | @Autowired
33 | public EventHistoryController(EventService eventService, PrizeService prizeService, EventWinnerService eventWinnerService, ApplicantService applicantService) {
34 | this.eventService = eventService;
35 | this.prizeService = prizeService;
36 | this.eventWinnerService = eventWinnerService;
37 | this.applicantService = applicantService;
38 | }
39 |
40 | @RequestMapping(value = "/", method = RequestMethod.GET)
41 | public String eventHistory(Model model) {
42 | List eventList = eventService.getEventList();
43 | Map applicantCountMap = new HashMap<>();
44 |
45 | for (Event event : eventList) {
46 | int eventId = event.getEventId();
47 |
48 | long applyCount = applicantService.getApplyCount(eventId, true);
49 | applicantCountMap.put(eventId, applyCount);
50 | }
51 |
52 | model.addAttribute("eventList", eventList);
53 | model.addAttribute("applicantCountMap", applicantCountMap);
54 |
55 | model.addAttribute(ModelAttributeNameFactory.VIEW_NAME, View.ADMIN_EVENT_HISTORY.toView());
56 |
57 | return View.LAYOUT.getTemplateName();
58 | }
59 |
60 | @RequestMapping(value = "/view/{eventId}", method = RequestMethod.GET)
61 | public String eventHistory(Model model, @PathVariable int eventId) {
62 | model.addAttribute("companyGiftData", prizeService.getCompanyGiftData(eventId));
63 | model.addAttribute("eventWinnerData", eventWinnerService.getWinnerList(eventId));
64 |
65 | model.addAttribute(ModelAttributeNameFactory.VIEW_NAME, View.ADMIN_EVENT_HISTORY_VIEW.toView());
66 |
67 | return View.LAYOUT.getTemplateName();
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/database/dao/EventDAO.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.database.dao;
2 |
3 | import com.horyu1234.eventangel.database.mapper.EventMapper;
4 | import com.horyu1234.eventangel.domain.Event;
5 | import com.horyu1234.eventangel.factory.DateFactory;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.jdbc.core.BeanPropertyRowMapper;
8 | import org.springframework.jdbc.core.JdbcTemplate;
9 | import org.springframework.stereotype.Repository;
10 |
11 | import java.util.List;
12 |
13 | /**
14 | * Created by horyu on 2018-04-15
15 | */
16 | @Repository
17 | public class EventDAO {
18 | private JdbcTemplate jdbcTemplate;
19 | private EventMapper eventMapper;
20 |
21 | @Autowired
22 | public EventDAO(JdbcTemplate jdbcTemplate, EventMapper eventMapper) {
23 | this.jdbcTemplate = jdbcTemplate;
24 | this.eventMapper = eventMapper;
25 | }
26 |
27 | public void createTableIfNotExist() {
28 | jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `EVENT` ( " +
29 | "`EVENT_ID` INT(11) NOT NULL AUTO_INCREMENT, " +
30 | "`EVENT_TITLE` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci', " +
31 | "`EVENT_DETAIL` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci', " +
32 | "`EVENT_STATUS` VARCHAR(10) NOT NULL COLLATE 'utf8mb4_unicode_ci', " +
33 | "`EVENT_START_TIME` DATETIME NOT NULL, " +
34 | "`EVENT_END_TIME` DATETIME NOT NULL, " +
35 | "PRIMARY KEY (`EVENT_ID`) " +
36 | ") " +
37 | "COLLATE='utf8mb4_unicode_ci' " +
38 | "ENGINE=InnoDB;");
39 | }
40 |
41 | public Event getCurrentEvent() {
42 | return jdbcTemplate.queryForObject(
43 | "SELECT * FROM `EVENT` " +
44 | "ORDER BY EVENT_ID " +
45 | "DESC LIMIT 1;",
46 | eventMapper);
47 | }
48 |
49 | public List getEventList() {
50 | return jdbcTemplate.query(
51 | "SELECT * FROM `EVENT` " +
52 | "ORDER BY EVENT_ID " +
53 | "DESC;",
54 | new BeanPropertyRowMapper<>(Event.class));
55 | }
56 |
57 | public void updateOrInsertEvent(Event event) {
58 | String eventStartTime = DateFactory.DATABASE_FORMAT.format(event.getEventStartTime());
59 | String eventEndTime = DateFactory.DATABASE_FORMAT.format(event.getEventEndTime());
60 |
61 | jdbcTemplate.update("INSERT INTO `EVENT` (EVENT_ID, EVENT_TITLE, EVENT_DETAIL, EVENT_STATUS, EVENT_START_TIME, EVENT_END_TIME) VALUES (?, ?, ?, ?, ?, ?) " +
62 | "ON DUPLICATE KEY UPDATE EVENT_TITLE = ?, EVENT_DETAIL = ?, EVENT_STATUS = ?, EVENT_START_TIME = ?, EVENT_END_TIME = ?;",
63 | event.getEventId(), event.getEventTitle(), event.getEventDetail(), event.getEventStatus().name(), eventStartTime, eventEndTime,
64 | event.getEventTitle(), event.getEventDetail(), event.getEventStatus().name(), eventStartTime, eventEndTime);
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/database/dao/PrizeDAO.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.database.dao;
2 |
3 | import com.horyu1234.eventangel.domain.Prize;
4 | import org.springframework.beans.factory.annotation.Autowired;
5 | import org.springframework.jdbc.core.BeanPropertyRowMapper;
6 | import org.springframework.jdbc.core.JdbcTemplate;
7 | import org.springframework.stereotype.Repository;
8 |
9 | import java.util.List;
10 |
11 | /**
12 | * Created by horyu on 2018-04-15
13 | */
14 | @Repository
15 | public class PrizeDAO {
16 | private JdbcTemplate jdbcTemplate;
17 |
18 | @Autowired
19 | public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
20 | this.jdbcTemplate = jdbcTemplate;
21 | }
22 |
23 | public void createTableIfNotExist() {
24 | jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `PRIZE` ( " +
25 | "`EVENT_ID` INT(11) NOT NULL, " +
26 | "`PRIZE_ID` INT(11) NOT NULL, " +
27 | "`COMPANY_ID` INT(11) NOT NULL, " +
28 | "`PRIZE_NAME` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci', " +
29 | "`PRIZE_AMOUNT` INT(11) NOT NULL, " +
30 | "PRIMARY KEY (`EVENT_ID`, `PRIZE_ID`) " +
31 | ") " +
32 | "COLLATE='utf8mb4_unicode_ci' " +
33 | "ENGINE=InnoDB;");
34 | }
35 |
36 | public List getPrizeList(int eventId) {
37 | return jdbcTemplate.query(
38 | "SELECT * FROM `PRIZE` " +
39 | "WHERE EVENT_ID = ? " +
40 | "ORDER BY `PRIZE_ID` " +
41 | "DESC;",
42 | new Object[]{eventId},
43 | new BeanPropertyRowMapper<>(Prize.class));
44 | }
45 |
46 | public int getMaxPrizeId(int eventId) {
47 | return jdbcTemplate.queryForObject(
48 | "SELECT MAX(PRIZE_ID) " +
49 | "FROM `PRIZE` " +
50 | "WHERE EVENT_ID = ?;",
51 | new Object[]{eventId},
52 | Integer.class);
53 | }
54 |
55 | public void updateOrInsertPrize(Prize prize) {
56 | jdbcTemplate.update("INSERT INTO `PRIZE` (EVENT_ID, PRIZE_ID, COMPANY_ID, PRIZE_NAME, PRIZE_AMOUNT) VALUES (?, ?, ?, ?, ?) " +
57 | "ON DUPLICATE KEY UPDATE PRIZE_ID = ?, COMPANY_ID = ?, PRIZE_NAME = ?, PRIZE_AMOUNT = ?;",
58 | prize.getEventId(), prize.getPrizeId(), prize.getCompanyId(), prize.getPrizeName(), prize.getPrizeAmount(),
59 | prize.getPrizeId(), prize.getCompanyId(), prize.getPrizeName(), prize.getPrizeAmount());
60 | }
61 |
62 | public void deletePrize(int eventId, int prizeId) {
63 | jdbcTemplate.update("DELETE FROM `PRIZE` " +
64 | "WHERE EVENT_ID = ? AND PRIZE_ID = ?",
65 | eventId, prizeId);
66 | }
67 |
68 | public void deletePrizeByCompanyId(int eventId, int companyId) {
69 | jdbcTemplate.update("DELETE FROM `PRIZE` " +
70 | "WHERE EVENT_ID = ? AND COMPANY_ID = ?",
71 | eventId, companyId);
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/controller/admin/CompanySettingController.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.controller.admin;
2 |
3 | import com.horyu1234.eventangel.constant.View;
4 | import com.horyu1234.eventangel.domain.Company;
5 | import com.horyu1234.eventangel.domain.Event;
6 | import com.horyu1234.eventangel.factory.ModelAttributeNameFactory;
7 | import com.horyu1234.eventangel.form.CompanySaveForm;
8 | import com.horyu1234.eventangel.service.CompanyService;
9 | import com.horyu1234.eventangel.service.EventService;
10 | import org.springframework.beans.factory.annotation.Autowired;
11 | import org.springframework.stereotype.Controller;
12 | import org.springframework.ui.Model;
13 | import org.springframework.web.bind.annotation.RequestMapping;
14 | import org.springframework.web.bind.annotation.RequestMethod;
15 | import org.springframework.web.bind.annotation.RequestParam;
16 | import org.springframework.web.multipart.MultipartFile;
17 |
18 | /**
19 | * Created by horyu on 2018-04-04
20 | */
21 | @RequestMapping("/admin/companySetting")
22 | @Controller
23 | public class CompanySettingController {
24 | private EventService eventService;
25 | private CompanyService companyService;
26 |
27 | @Autowired
28 | public void setEventService(EventService eventService) {
29 | this.eventService = eventService;
30 | }
31 |
32 | @Autowired
33 | public void setCompanyService(CompanyService companyService) {
34 | this.companyService = companyService;
35 | }
36 |
37 | @RequestMapping(value = "/", method = RequestMethod.GET)
38 | public String companySetting(Model model) {
39 | Event currentEvent = eventService.getCurrentEvent();
40 |
41 | model.addAttribute("companyList", companyService.getCompanyList(currentEvent.getEventId()));
42 | model.addAttribute(ModelAttributeNameFactory.EVENT_STATUS, currentEvent.getEventStatus());
43 |
44 | model.addAttribute(ModelAttributeNameFactory.VIEW_NAME, View.ADMIN_COMPANY_SETTING.toView());
45 |
46 | return View.LAYOUT.getTemplateName();
47 | }
48 |
49 | @RequestMapping(value = "/saveCompany", method = RequestMethod.POST)
50 | public String saveCompany(CompanySaveForm companySaveForm,
51 | @RequestParam("companyLogoFile") MultipartFile multipartFile) {
52 | Event currentEvent = eventService.getCurrentEvent();
53 |
54 | int eventId = currentEvent.getEventId();
55 | int companyId = companySaveForm.getCompanyId();
56 |
57 | Company company = new Company();
58 | company.setEventId(eventId);
59 | company.setCompanyId(companyId);
60 | company.setCompanyName(companySaveForm.getCompanyName());
61 | company.setCompanyDetail(companySaveForm.getCompanyDetail());
62 |
63 | companyService.saveCompany(company);
64 |
65 | if (companyId == 0 && multipartFile.getContentType() != null && multipartFile.getContentType().startsWith("image/")) {
66 | companyService.saveCompanyLogoImage(eventId, company.getCompanyId(), multipartFile);
67 | }
68 |
69 | return View.ADMIN_COMPANY_SETTING.toRedirect();
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/controller/admin/EventSettingController.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.controller.admin;
2 |
3 | import com.horyu1234.eventangel.constant.View;
4 | import com.horyu1234.eventangel.domain.Event;
5 | import com.horyu1234.eventangel.factory.ModelAttributeNameFactory;
6 | import com.horyu1234.eventangel.form.EventSettingForm;
7 | import com.horyu1234.eventangel.service.EventService;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.stereotype.Controller;
10 | import org.springframework.ui.Model;
11 | import org.springframework.web.bind.annotation.RequestMapping;
12 | import org.springframework.web.bind.annotation.RequestMethod;
13 |
14 | import java.time.Instant;
15 | import java.time.LocalDateTime;
16 | import java.time.ZoneOffset;
17 |
18 | /**
19 | * Created by horyu on 2018-04-04
20 | */
21 | @RequestMapping("/admin/eventSetting")
22 | @Controller
23 | public class EventSettingController {
24 | private EventService eventService;
25 |
26 | @Autowired
27 | public void setEventService(EventService eventService) {
28 | this.eventService = eventService;
29 | }
30 |
31 | @RequestMapping(value = "/", method = RequestMethod.GET)
32 | public String eventSetting(Model model) {
33 | Event currentEvent = eventService.getCurrentEvent();
34 | model.addAttribute(ModelAttributeNameFactory.EVENT_ID, currentEvent.getEventId());
35 | model.addAttribute(ModelAttributeNameFactory.EVENT_STATUS, currentEvent.getEventStatus());
36 | model.addAttribute(ModelAttributeNameFactory.EVENT_TITLE, currentEvent.getEventTitle());
37 | model.addAttribute(ModelAttributeNameFactory.EVENT_DETAIL, currentEvent.getEventDetail());
38 | model.addAttribute(ModelAttributeNameFactory.EVENT_START_TIME, currentEvent.getEventStartTime().toInstant(ZoneOffset.ofHours(9)).toEpochMilli() / 1000);
39 | model.addAttribute(ModelAttributeNameFactory.EVENT_END_TIME, currentEvent.getEventEndTime().toInstant(ZoneOffset.ofHours(9)).toEpochMilli() / 1000);
40 |
41 | model.addAttribute(ModelAttributeNameFactory.VIEW_NAME, View.ADMIN_EVENT_SETTING.toView());
42 |
43 | return View.LAYOUT.getTemplateName();
44 | }
45 |
46 | @RequestMapping(value = "/general", method = RequestMethod.POST)
47 | public String eventSettingGeneral(EventSettingForm eventSettingForm) {
48 | Event currentEvent = new Event();
49 | currentEvent.setEventId(eventSettingForm.getEventId());
50 | currentEvent.setEventStatus(eventSettingForm.getEventStatus());
51 | currentEvent.setEventTitle(eventSettingForm.getEventTitle());
52 | currentEvent.setEventDetail(eventSettingForm.getEventDetail());
53 | currentEvent.setEventStartTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(eventSettingForm.getEventStartTime()), ZoneOffset.ofHours(9)));
54 | currentEvent.setEventEndTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(eventSettingForm.getEventEndTime()), ZoneOffset.ofHours(9)));
55 |
56 | eventService.updateEvent(currentEvent);
57 |
58 | return View.ADMIN_EVENT_SETTING.toRedirect();
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/main/resources/static/js/admin/Horyu.View.CompanySetting.min.js:
--------------------------------------------------------------------------------
1 | var Horyu=window.Horyu||{};Horyu.View=window.Horyu.View||{};
2 | Horyu.View.CompanySetting=function(){var a=this;a.deletingCompanyId=0;a.init=function(){a.bindEvents()};a.bindEvents=function(){$(".companyEditBtn").click(function(c){a.startCompanyEdit($(c.target))});$(".companyDeleteBtn").click(function(c){a.startDelete($(c.target))});$("#cancelEditBtn").click(function(){a.abortCompanyEdit()});$("#deleteAbortBtn").click(function(){a.abortDelete()});$("#deleteBtn").click(function(){a.deleteConfirm()});$("#companyLogoFile").on("change",function(){var c=$(this).next(".custom-file-label"),
3 | b=$(this)[0].files;0===b.length?a.resetImageInput():(b=b[0],console.log("file changed",b),b.type.startsWith("image/")?5242880<=b.size?($("#warning-modal-text").text("\ucd5c\ub300 5MB \ubbf8\ub9cc\uc758 \ud30c\uc77c\ub9cc \uc5c5\ub85c\ub4dc\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),$("#warning-modal").modal(),a.resetImageInput()):(c.text(b.name),a.previewCompanyLogo(b)):($("#warning-modal-text").text("\uc774\ubbf8\uc9c0 \ud30c\uc77c\ub9cc \uc120\ud0dd\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),
4 | $("#warning-modal").modal(),a.resetImageInput()))})};a.resetImageInput=function(){$("#companyLogoFile").next(".custom-file-label").text("\ud68c\uc0ac \ub85c\uace0 \uc774\ubbf8\uc9c0 \ud30c\uc77c\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694.");$("#companyLogoPreview").attr("src","")};a.previewCompanyLogo=function(a){var b=new FileReader;b.onload=function(a){$("#companyLogoPreview").attr("src",a.target.result)};b.readAsDataURL(a)};a.startCompanyEdit=function(a){a=a.closest("tr");$("#companyId").val(a.find(".company-id").text());
5 | $("#companyName").val(a.find(".company-name").text());$("#companyDetail").val(a.find(".company-detail").text());$(".card-header").text("\ub3c4\uc6c0\uc744 \uc8fc\uc2e0 \ud68c\uc0ac \uc218\uc815");$("#submitBtn").text("\ud68c\uc0ac \uc218\uc815");$("#cancelEditBtn").css("visibility","visible");$(".companyLogoFormInput").hide();$("html, body").animate({scrollTop:0},"fast")};a.abortCompanyEdit=function(){$("#companyId").val("0");$("#companyName").val("");$("#companyDetail").val("");$(".card-header").text("\ub3c4\uc6c0\uc744 \uc8fc\uc2e0 \ud68c\uc0ac \ucd94\uac00");
6 | $("#submitBtn").text("\ud68c\uc0ac \ucd94\uac00");$("#cancelEditBtn").css("visibility","hidden");$(".companyLogoFormInput").show()};a.startDelete=function(c){c=c.closest("tr");a.deletingCompanyId=Number(c.find(".company-id").text());$("#delete-modal").modal({backdrop:"static",keyboard:!1})};a.abortDelete=function(){a.deletingCompanyId=0};a.deleteConfirm=function(){$("#deleteBtn").html("\ucc98\ub9ac \uc911\uc785\ub2c8\ub2e4.");$("#deleteBtn").attr("disabled","");$("#deleteAbortBtn").css("visibility",
7 | "hidden");$.ajax({type:"POST",url:"./deleteCompany",data:{companyId:a.deletingCompanyId},timeout:5E3}).done(function(){$("#deleteBtn").html("\uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.");setTimeout(function(){location.reload()},500)}).fail(function(a){$("#deleteBtn").html("\ud1b5\uc2e0\uc5d0 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc7a0\uc2dc \ud6c4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.");setTimeout(function(){location.reload()},3E3)})};return{init:function(){a.init()}}};
8 | //# sourceMappingURL=Horyu.View.CompanySetting.min.js.map
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/domain/Applicant.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.domain;
2 |
3 | import java.time.LocalDateTime;
4 |
5 | /**
6 | * Created by horyu on 2018-04-03
7 | */
8 | public class Applicant {
9 | private int eventId;
10 | private String applyEmail;
11 | private String youtubeNickname;
12 | private LocalDateTime applyTime;
13 | private String ipAddress;
14 | private String referer;
15 | private String userAgent;
16 | private String fingerprint2;
17 | private boolean duplicated;
18 | private String dupCheckAdminName;
19 |
20 | public int getEventId() {
21 | return eventId;
22 | }
23 |
24 | public void setEventId(int eventId) {
25 | this.eventId = eventId;
26 | }
27 |
28 | public LocalDateTime getApplyTime() {
29 | return applyTime;
30 | }
31 |
32 | public void setApplyTime(LocalDateTime applyTime) {
33 | this.applyTime = applyTime;
34 | }
35 |
36 | public String getApplyEmail() {
37 | return applyEmail;
38 | }
39 |
40 | public void setApplyEmail(String applyEmail) {
41 | this.applyEmail = applyEmail;
42 | }
43 |
44 | public String getYoutubeNickname() {
45 | return youtubeNickname;
46 | }
47 |
48 | public void setYoutubeNickname(String youtubeNickname) {
49 | this.youtubeNickname = youtubeNickname;
50 | }
51 |
52 | public String getIpAddress() {
53 | return ipAddress;
54 | }
55 |
56 | public void setIpAddress(String ipAddress) {
57 | this.ipAddress = ipAddress;
58 | }
59 |
60 | public String getReferer() {
61 | return referer;
62 | }
63 |
64 | public void setReferer(String referer) {
65 | this.referer = referer;
66 | }
67 |
68 | public String getUserAgent() {
69 | return userAgent;
70 | }
71 |
72 | public void setUserAgent(String userAgent) {
73 | this.userAgent = userAgent;
74 | }
75 |
76 | public String getFingerprint2() {
77 | return fingerprint2;
78 | }
79 |
80 | public void setFingerprint2(String fingerprint2) {
81 | this.fingerprint2 = fingerprint2;
82 | }
83 |
84 | public boolean isDuplicated() {
85 | return duplicated;
86 | }
87 |
88 | public void setDuplicated(boolean duplicated) {
89 | this.duplicated = duplicated;
90 | }
91 |
92 | public String getDupCheckAdminName() {
93 | return dupCheckAdminName;
94 | }
95 |
96 | public void setDupCheckAdminName(String dupCheckAdminName) {
97 | this.dupCheckAdminName = dupCheckAdminName;
98 | }
99 |
100 | public void hidePrivacy() {
101 | String email = getApplyEmail();
102 |
103 | String originalEmailName = email.split("@")[0];
104 | String emailName = originalEmailName.substring(0, originalEmailName.length() - 1) + "*";
105 | String emailHost = email.split("@")[1].replaceAll("[a-zA-Z가-힣0-9\\-]", "*");
106 |
107 | setApplyEmail(emailName + '@' + emailHost);
108 | setApplyTime(null);
109 | setIpAddress(null);
110 | setUserAgent(null);
111 | setFingerprint2(null);
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/src/main/resources/static/js/admin/Horyu.View.ApplicantList.min.js:
--------------------------------------------------------------------------------
1 | var Horyu=window.Horyu||{};Horyu.View=window.Horyu.View||{};
2 | Horyu.View.ApplicantList=function(g){var a=this;a.options=$.extend({columnId:"",columnName:""},g);a.init=function(){a.changeMainContainerWidth();a.updateTable()};a.changeMainContainerWidth=function(){var a=$("#main-container");a.removeClass("container");a.addClass("container-full")};a.updateTable=function(){$("#loading-modal").modal({backdrop:"static",keyboard:!1});$.ajax({type:"POST",url:"./getApplicant",data:{columnId:null===a.options.columnId?void 0:a.options.columnId,columnName:null===a.options.columnName?
3 | void 0:a.options.columnName},timeout:1E4}).done(function(d){$("#loading-modal").modal("hide");Array.isArray(d)?a.updatePagination(d):($("#fail-modal").modal({backdrop:"static",keyboard:!1}),setTimeout(function(){location.reload()},4E3))})};a.updatePagination=function(d){$("#applyCount").text(d.length);$(".table-pagination").pagination({className:"paginationjs-theme-blue paginationjs-big",dataSource:d,pageSize:50,autoHidePrevious:!0,autoHideNext:!0,callback:function(c,e){a.renderTable(c)}});$(".duplicatedBtn").click(function(){var c=
4 | $(this).attr("data-apply-email");a.updateDuplicated(c,!0)});$(".notDuplicatedBtn").click(function(){var c=$(this).attr("data-apply-email");a.updateDuplicated(c,!1)})};a.renderTable=function(a){var c=$(".applicant-list-table").find("tbody");c.empty();a.forEach(function(a){var b=$("\x3ctr\x3e\x3c/tr\x3e").attr("data-apply-email",a.applyEmail);b.append($('\x3ctd class\x3d"apply-time"\x3e').html(moment(a.applyTime).format("YYYY\ub144 MMMM D\uc77c dddd\x3cbr/\x3eA h\uc2dc mm\ubd84 ss\ucd08")));b.append($('\x3ctd class\x3d"apply-email"\x3e').text(a.applyEmail));
5 | b.append($('\x3ctd class\x3d"apply-youtubeNickname"\x3e').text(a.youtubeNickname));b.append($('\x3ctd class\x3d"apply-ipAddress"\x3e').text(a.ipAddress));b.append($('\x3ctd class\x3d"apply-referer"\x3e').text(a.referer));b.append($('\x3ctd class\x3d"apply-userAgent"\x3e').text(a.userAgent));b.append($('\x3ctd class\x3d"apply-fingerprint2"\x3e').text(a.fingerprint2));b.append($('\x3ctd class\x3d"apply-duplicated"\x3e').text(a.duplicated));a.duplicated?(b.addClass("table-warning"),b.append($("\x3ctd\x3e").html($('\x3cbutton type\x3d"button" class\x3d"btn btn-danger btn-sm notDuplicatedBtn"\x3e\uc911\ubcf5 \uc751\ubaa8 \ucc98\ub9ac \ucde8\uc18c\x3c/button\x3e').attr("data-apply-email",
6 | a.applyEmail)))):b.append($("\x3ctd\x3e").html($('\x3cbutton type\x3d"button" class\x3d"btn btn-warning btn-sm duplicatedBtn"\x3e\uc911\ubcf5 \uc751\ubaa8 \ucc98\ub9ac(\ucd94\ucca8 \uc81c\uc678)\x3c/button\x3e').attr("data-apply-email",a.applyEmail)));b.append($('\x3ctd class\x3d"apply-dupCheckAdminName"\x3e').text(a.dupCheckAdminName));c.append(b)})};a.updateDuplicated=function(a,c){$.ajax({type:"POST",url:"./changeDuplicated",data:{applyEmail:a,isDuplicated:c},timeout:1E4}).done(function(){var e=
7 | $("tr[data-apply-email\x3d'"+a+"']"),b=e.find("td:eq(8)"),f=e.find("td:eq(9)");c?(e.addClass("table-warning"),b.text("\uc911\ubcf5 \ucc98\ub9ac\ub428"),f.text("\uc911\ubcf5 \ucc98\ub9ac\ub428")):(e.removeClass("table-warning"),b.text("\uc911\ubcf5 \ucc98\ub9ac \ucde8\uc18c\ub428"),f.text("\uc911\ubcf5 \ucc98\ub9ac \ucde8\uc18c\ub428"))})};return{init:function(){a.init()}}};
8 | //# sourceMappingURL=Horyu.View.ApplicantList.min.js.map
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/service/PrizeService.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.service;
2 |
3 | import com.horyu1234.eventangel.database.dao.CompanyDAO;
4 | import com.horyu1234.eventangel.database.dao.PrizeDAO;
5 | import com.horyu1234.eventangel.domain.Company;
6 | import com.horyu1234.eventangel.domain.CompanyAndPrize;
7 | import com.horyu1234.eventangel.domain.Prize;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.cache.annotation.CacheEvict;
10 | import org.springframework.cache.annotation.Cacheable;
11 | import org.springframework.stereotype.Service;
12 |
13 | import javax.annotation.PostConstruct;
14 | import java.util.ArrayList;
15 | import java.util.List;
16 |
17 | /**
18 | * Created by horyu on 2018-04-06
19 | */
20 | @Service
21 | public class PrizeService {
22 | private CompanyDAO companyDAO;
23 | private PrizeDAO prizeDAO;
24 |
25 | @PostConstruct
26 | public void init() {
27 | prizeDAO.createTableIfNotExist();
28 | }
29 |
30 | @Autowired
31 | public void setCompanyDAO(CompanyDAO companyDAO) {
32 | this.companyDAO = companyDAO;
33 | }
34 |
35 | @Autowired
36 | public void setPrizeDAO(PrizeDAO prizeDAO) {
37 | this.prizeDAO = prizeDAO;
38 | }
39 |
40 | @CacheEvict(value = {"prizeService.companyGiftData", "prizeService.totalPrizeAmount"}, allEntries = true)
41 | public void savePrize(Prize prize) {
42 | int eventId = prize.getEventId();
43 |
44 | if (prize.getPrizeId() == 0) {
45 | int maxPrizeId = 0;
46 | if (!prizeDAO.getPrizeList(eventId).isEmpty()) {
47 | maxPrizeId = prizeDAO.getMaxPrizeId(eventId);
48 | }
49 |
50 | prize.setPrizeId(maxPrizeId + 1);
51 | }
52 |
53 | prizeDAO.updateOrInsertPrize(prize);
54 | }
55 |
56 | @CacheEvict(value = {"prizeService.companyGiftData", "prizeService.totalPrizeAmount"}, allEntries = true)
57 | public void deletePrize(int eventId, int prizeId) {
58 | prizeDAO.deletePrize(eventId, prizeId);
59 | }
60 |
61 | @CacheEvict(value = {"prizeService.companyGiftData", "prizeService.totalPrizeAmount"}, allEntries = true)
62 | public void deletePrizeByCompanyId(int eventId, int companyId) {
63 | prizeDAO.deletePrizeByCompanyId(eventId, companyId);
64 | }
65 |
66 | @Cacheable(value = "prizeService.companyGiftData")
67 | public List getCompanyGiftData(int eventId) {
68 | List prizeList = prizeDAO.getPrizeList(eventId);
69 |
70 | List companyAndPrizeList = new ArrayList<>();
71 | for (Prize prize : prizeList) {
72 | Company company = companyDAO.getCompany(eventId, prize.getCompanyId());
73 |
74 | CompanyAndPrize companyAndPrize = new CompanyAndPrize(company, prize);
75 | companyAndPrizeList.add(companyAndPrize);
76 | }
77 |
78 | return companyAndPrizeList;
79 | }
80 |
81 | @Cacheable(value = "prizeService.totalPrizeAmount")
82 | public int getTotalPrizeAmount(int eventId) {
83 | int totalAmount = 0;
84 | for (CompanyAndPrize companyAndPrize : getCompanyGiftData(eventId)) {
85 | totalAmount += companyAndPrize.getPrizeAmount();
86 | }
87 |
88 | return totalAmount;
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/src/main/resources/static/js/admin/Horyu.View.PrizeSetting.min.js:
--------------------------------------------------------------------------------
1 | var Horyu=window.Horyu||{};Horyu.View=window.Horyu.View||{};
2 | Horyu.View.PrizeSetting=function(g){var a=this;a.deletingPrizeId=0;a.options=$.extend({prizeList:[]},g);a.init=function(){a.updateTable();a.bindEvents()};a.bindEvents=function(){$(".prizeEditBtn").click(function(b){a.startPrizeEdit($(b.target))});$(".prizeDeleteBtn").click(function(b){a.startDelete($(b.target))});$("#cancelEditBtn").click(function(){a.abortPrizeEdit()});$("#deleteAbortBtn").click(function(){a.abortDelete()});$("#deleteBtn").click(function(){a.deleteConfirm()})};a.startPrizeEdit=function(a){a=
3 | a.closest("tr");$("#prizeId").val(a.find(".prize-name").attr("data-prize-id"));$("#companyId").val(a.find(".prize-name").attr("data-company-id"));$("#prizeName").val(a.find(".prize-name").text());$("#prizeAmount").val(a.find(".prize-amount").text());$(".card-header").text("\uc0c1\ud488 \uc218\uc815");$("#submitBtn").text("\uc0c1\ud488 \uc218\uc815");$("#cancelEditBtn").css("visibility","visible");$("html, body").animate({scrollTop:0},"fast")};a.abortPrizeEdit=function(){$("#prizeId").val("0");$("#prizeName").val("");
4 | $("#prizeAmount").val("");$(".card-header").text("\uc0c1\ud488 \ucd94\uac00");$("#submitBtn").text("\uc0c1\ud488 \ucd94\uac00");$("#cancelEditBtn").css("visibility","hidden")};a.startDelete=function(b){b=b.closest("tr");a.deletingPrizeId=Number(b.find(".prize-name").attr("data-prize-id"));$("#delete-modal").modal({backdrop:"static",keyboard:!1})};a.abortDelete=function(){a.deletingPrizeId=0};a.deleteConfirm=function(){$("#deleteBtn").html("\ucc98\ub9ac \uc911\uc785\ub2c8\ub2e4.");$("#deleteBtn").attr("disabled",
5 | "");$("#deleteAbortBtn").css("visibility","hidden");$.ajax({type:"POST",url:"./deletePrize",data:{prizeId:a.deletingPrizeId},timeout:5E3}).done(function(){$("#deleteBtn").html("\uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.");setTimeout(function(){location.reload()},500)}).fail(function(a){$("#deleteBtn").html("\ud1b5\uc2e0\uc5d0 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc7a0\uc2dc \ud6c4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.");setTimeout(function(){location.reload()},3E3)})};a.updateTable=
6 | function(){var b=$("#prize-table tbody");b.empty();var d=a.options.prizeList.groupBy("companyId");Object.forEach(d,function(c){c=c.sortBy("prizeId");var d=0;Object.forEach(c,function(f){var e=$("\x3ctr\x3e");0===d&&e.append(a.makeCompanyCell(c.length,f));e.append($('\x3ctd class\x3d"prize-name"\x3e').attr("data-prize-id",f.prizeId).attr("data-company-id",f.companyId).text(f.prizeName));e.append($('\x3ctd class\x3d"prize-amount"\x3e').text(f.prizeAmount));e.append($('\x3ctd\x3e\x3cbutton type\x3d"button" class\x3d"btn btn-info btn-sm prizeEditBtn"\x3e\uc218\uc815\x3c/button\x3e\x3c/td\x3e'));
7 | e.append($('\x3ctd\x3e\x3cbutton type\x3d"button" class\x3d"btn btn-danger btn-sm prizeDeleteBtn"\x3e\uc0ad\uc81c\x3c/button\x3e\x3c/td\x3e'));b.append(e);d++})})};a.makeCompanyCell=function(a,d){var c=$('\x3ctd class\x3d"company-cell"\x3e').attr("rowspan",a),g=$('\x3cimg class\x3d"company-logo" src\x3d"/companyLogo?companyId\x3d'+d.companyId+'"/\x3e'),f=$('\x3ca style\x3d"font-size: 16pt;font-weight: bold;"\x3e'+d.companyName+"\x3c/a\x3e"),e=$('\x3ca style\x3d"color: gray"\x3e'+d.companyDetail+"\x3c/a\x3e");
8 | null!==d.companyLogoImageFileName?c.append(g):c.append(f);c.append("\x3cbr/\x3e");c.append(e);return c};return{init:function(){a.init()}}};
9 | //# sourceMappingURL=Horyu.View.PrizeSetting.min.js.map
--------------------------------------------------------------------------------
/src/main/resources/static/js/component/Horyu.View.CompanyGiftTable.min.js:
--------------------------------------------------------------------------------
1 | var Horyu=window.Horyu||{};Horyu.View=window.Horyu.View||{};
2 | Horyu.View.CompanyGiftTable=function(m){var h=$("#company-gift-table"),g=h.find("tbody"),n=h.find("thead"),a=this;a.companyGiftData=[];a.currentEventWinnerData=[];a.nextLotteryGift=null;a.options=$.extend({includeEventWinner:!0},m);a.init=function(){a.updateTableHeaders()};a.updateTableHeaders=function(){var b=n.find("tr");b.append("\x3cth\x3e\ub3c4\uc6c0\uc744 \uc8fc\uc2e0 \ud68c\uc0ac\x3c/th\x3e");b.append("\x3cth\x3e\uc0c1\ud488\x3c/th\x3e");a.options.includeEventWinner?(b.append('\x3cth width\x3d"250px"\x3e\ub2f9\ucca8\uc790 \uc774\uba54\uc77c\x3c/th\x3e'),
3 | b.append('\x3cth width\x3d"250px"\x3e\ub2f9\ucca8\uc790 \uc720\ud29c\ube0c \ub2c9\ub124\uc784\x3c/th\x3e')):b.append('\x3cth width\x3d"100px"\x3e\uc0c1\ud488 \uac1c\uc218\x3c/th\x3e')};a.updateTable=function(){a.nextLotteryGift=null;g.empty();var b=a.companyGiftData.groupBy("companyId");Object.keys(b).forEach(function(c){var d=b[c],d=d.sortBy("prizeId"),f=0;d.forEach(function(b){var d=b.prizeAmount;if(a.options.includeEventWinner)for(var k=0;k notDupApplyCount) {
61 | canStartLottery = false;
62 | cantStartMessage = "존재하는 상품의 수보다 응모 신청을 한 사람의 수가 적습니다.";
63 | }
64 |
65 | model.addAttribute("cantApply", eventDetailStatus == EventDetailStatus.ALREADY_END || eventDetailStatus == EventDetailStatus.CLOSE);
66 |
67 | model.addAttribute("canStartLottery", canStartLottery);
68 | model.addAttribute("cantStartMessage", cantStartMessage);
69 |
70 | model.addAttribute("notDupApplyCount", notDupApplyCount);
71 | model.addAttribute("dupApplyCount", dupApplyCount);
72 |
73 | List winnerList = eventWinnerService.getWinnerList(currentEvent.getEventId());
74 | winnerList = eventWinnerService.hidePrivacy(winnerList);
75 |
76 | model.addAttribute("companyGiftData", prizeService.getCompanyGiftData(currentEvent.getEventId()));
77 | model.addAttribute("eventWinnerData", winnerList);
78 |
79 | model.addAttribute(ModelAttributeNameFactory.VIEW_NAME, View.ADMIN_LOTTERY.toView());
80 |
81 | return View.LAYOUT.getTemplateName();
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/database/dao/CompanyDAO.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.database.dao;
2 |
3 | import com.horyu1234.eventangel.database.mapper.CompanyMapper;
4 | import com.horyu1234.eventangel.domain.Company;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.jdbc.core.JdbcTemplate;
7 | import org.springframework.stereotype.Repository;
8 |
9 | import java.util.List;
10 |
11 | @Repository
12 | public class CompanyDAO {
13 | private JdbcTemplate jdbcTemplate;
14 | private CompanyMapper companyMapper;
15 |
16 | @Autowired
17 | public CompanyDAO(JdbcTemplate jdbcTemplate, CompanyMapper companyMapper) {
18 | this.jdbcTemplate = jdbcTemplate;
19 | this.companyMapper = companyMapper;
20 | }
21 |
22 | public void createTableIfNotExist() {
23 | jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `COMPANY` ( " +
24 | "`EVENT_ID` INT(11) NOT NULL, " +
25 | "`COMPANY_ID` INT(11) NOT NULL, " +
26 | "`COMPANY_NAME` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci', " +
27 | "`COMPANY_DETAIL` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci', " +
28 | "`COMP_LOGO_IMG_FNAME` VARCHAR(100) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', " +
29 | "PRIMARY KEY (`EVENT_ID`, `COMPANY_ID`) " +
30 | ") " +
31 | "COLLATE='utf8mb4_unicode_ci' " +
32 | "ENGINE=InnoDB;");
33 | }
34 |
35 | public Company getCompany(int eventId, int companyId) {
36 | return jdbcTemplate.queryForObject(
37 | "SELECT * FROM `COMPANY` " +
38 | "WHERE EVENT_ID = ? AND COMPANY_ID = ? " +
39 | "ORDER BY `COMPANY_ID` " +
40 | "DESC;",
41 | new Object[]{eventId, companyId},
42 | companyMapper);
43 | }
44 |
45 | public List getCompanyList(int eventId) {
46 | return jdbcTemplate.query(
47 | "SELECT * FROM `COMPANY` " +
48 | "WHERE EVENT_ID = ? " +
49 | "ORDER BY `COMPANY_ID` " +
50 | "ASC;",
51 | new Object[]{eventId},
52 | companyMapper);
53 | }
54 |
55 | public int getMaxCompanyId(int eventId) {
56 | return jdbcTemplate.queryForObject(
57 | "SELECT MAX(COMPANY_ID) " +
58 | "FROM `COMPANY` " +
59 | "WHERE EVENT_ID = ?;",
60 | new Object[]{eventId},
61 | Integer.class);
62 | }
63 |
64 | public void updateOrInsertCompany(Company company) {
65 | jdbcTemplate.update("INSERT INTO `COMPANY` (EVENT_ID, COMPANY_ID, COMPANY_NAME, COMPANY_DETAIL) VALUES (?, ?, ?, ?) " +
66 | "ON DUPLICATE KEY UPDATE COMPANY_ID = ?, COMPANY_NAME = ?, COMPANY_DETAIL = ?;",
67 | company.getEventId(), company.getCompanyId(), company.getCompanyName(), company.getCompanyDetail(),
68 | company.getCompanyId(), company.getCompanyName(), company.getCompanyDetail());
69 | }
70 |
71 | public void updateCompanyLogo(int eventId, int companyId, String fileName) {
72 | jdbcTemplate.update("UPDATE `COMPANY` " +
73 | "SET COMP_LOGO_IMG_FNAME = ? " +
74 | "WHERE EVENT_ID = ? AND COMPANY_ID = ?",
75 | fileName, eventId, companyId);
76 | }
77 |
78 | public void deleteCompany(int eventId, int companyId) {
79 | jdbcTemplate.update("DELETE FROM `COMPANY` " +
80 | "WHERE EVENT_ID = ? AND COMPANY_ID = ?",
81 | eventId, companyId);
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/src/main/resources/static/lib/countUp-1.9.3/countUp.min.js:
--------------------------------------------------------------------------------
1 | !function(a,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n(require,exports,module):a.CountUp=n()}(this,function(a,n,t){var e=function(a,n,t,e,i,r){function o(a){var n,t,e,i,r,o,s=a<0;if(a=Math.abs(a).toFixed(l.decimals),a+="",n=a.split("."),t=n[0],e=n.length>1?l.options.decimal+n[1]:"",l.options.useGrouping){for(i="",r=0,o=t.length;rl.endVal,l.frameVal=l.startVal,l.initialized=!0,!0):(l.error="[CountUp] startVal ("+n+") or endVal ("+t+") is not a number",!1)):(l.error="[CountUp] target is null or undefined",!1))},l.printValue=function(a){var n=l.options.formattingFn(a);"INPUT"===l.d.tagName?this.d.value=n:"text"===l.d.tagName||"tspan"===l.d.tagName?this.d.textContent=n:this.d.innerHTML=n},l.count=function(a){l.startTime||(l.startTime=a),l.timestamp=a;var n=a-l.startTime;l.remaining=l.duration-n,l.options.useEasing?l.countDown?l.frameVal=l.startVal-l.options.easingFn(n,0,l.startVal-l.endVal,l.duration):l.frameVal=l.options.easingFn(n,l.startVal,l.endVal-l.startVal,l.duration):l.countDown?l.frameVal=l.startVal-(l.startVal-l.endVal)*(n/l.duration):l.frameVal=l.startVal+(l.endVal-l.startVal)*(n/l.duration),l.countDown?l.frameVal=l.frameVall.endVal?l.endVal:l.frameVal,l.frameVal=Math.round(l.frameVal*l.dec)/l.dec,l.printValue(l.frameVal),nl.endVal,l.rAF=requestAnimationFrame(l.count))}},l.initialize()&&l.printValue(l.startVal)};return e});
--------------------------------------------------------------------------------
/src/main/resources/static/js/admin/Horyu.View.Lottery.min.js:
--------------------------------------------------------------------------------
1 | var Horyu=window.Horyu||{};Horyu.View=window.Horyu.View||{};
2 | Horyu.View.Lottery=function(g){var a=this;a.companyGiftTable=null;a.currentEventWinnerData=[];a.options=$.extend({notDupApplyCount:0,dupApplyCount:0,companyGiftData:[],eventWinnerData:[]},g);a.init=function(){a.companyGiftTable=new Horyu.View.CompanyGiftTable;a.companyGiftTable.init();a.updateTable();a.bindEvents();setInterval(function(){$("#currentTime").text(moment().format("YYYY\ub144 MMMM D\uc77c dddd A h\uc2dc mm\ubd84 ss\ucd08"))},500);var b={useEasing:!0,useGrouping:!0,separator:",",decimal:"."},
3 | c=new CountUp("notDupApplyCount",0,a.options.notDupApplyCount,0,3,b);c.error?console.error(c.error):c.start();b=new CountUp("dupApplyCount",0,a.options.dupApplyCount,0,3,b);b.error?console.error(b.error):b.start()};a.updateTable=function(){a.companyGiftTable.updateTable(a.options.companyGiftData,a.options.eventWinnerData);var b=$(".next-gift-alert"),c=$(".next-gift-name"),d=$(".lotteryBtn"),e=a.companyGiftTable.getNextLotteryGift();null===e?(b.remove(),d.attr("disabled",""),d.html('\x3ci class\x3d"fas fa-random"\x3e\x3c/i\x3e\x26nbsp; [\ucd94\ucca8 \ubd88\uac00] \ubaa8\ub4e0 \uc0c1\ud488 \ucd94\ucca8\uc774 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.')):
4 | (c.text(e.prizeName),d.html('\x3ci class\x3d"fas fa-random"\x3e\x3c/i\x3e\x26nbsp; \ub2e4\uc74c \uc0c1\ud488 \ucd94\ucca8\ud558\uae30'))};a.bindEvents=function(){$(".lotteryBtn").click(function(){if(a.isIE())$("#ie-modal").modal({backdrop:"static",keyboard:!1});else{$(".lotteryBtn").attr("disabled","");$(".lotteryBtn").html('\x3ci class\x3d"fas fa-spinner fa-pulse"\x3e\x3c/i\x3e\x26nbsp; \ucd94\ucca8 \uc911\uc785\ub2c8\ub2e4...');var b=moment();$.ajax({type:"POST",url:"./lottery",data:{prizeId:a.companyGiftTable.getNextLotteryGift().prizeId},
5 | timeout:12E4}).done(function(c){if("object"!==typeof c)$(".lotteryBtn").html('\x3ci class\x3d"fas fa-exclamation-triangle"\x3e\x3c/i\x3e\x26nbsp; \ucd94\ucca8\uc5d0 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4.'),$(".lotteryBtn").removeClass("btn-success"),$(".lotteryBtn").addClass("btn-danger"),setTimeout(function(){location.reload()},4E3);else{var d=moment();5E3<=moment.duration(d.diff(b)).valueOf()?a.lotteryOut(c):setTimeout(function(){a.lotteryOut(c)},Math.round(3E3*Math.random())+3E3)}}).fail(function(a){$(".lotteryBtn").html('\x3ci class\x3d"fas fa-exclamation-triangle"\x3e\x3c/i\x3e\x26nbsp; \ucd94\ucca8\uc5d0 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4.');
6 | $(".lotteryBtn").removeClass("btn-success");$(".lotteryBtn").addClass("btn-danger");setTimeout(function(){location.reload()},4E3)})}});new ClipboardJS(".btn-copy");$(".btn-copy").click(function(){var b=a.companyGiftTable.getNextLotteryGift(),c=b.prizeId,b=b.prizeName,d=$("#modal-youtubeNickname").text(),e=$("#modal-email").text(),f=$(".btn-copy");f.attr("data-clipboard-text",c+". "+b+"\n"+d+" "+e+"\n\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n");
7 | f.attr("disabled","");f.text("\ubcf5\uc0ac \uc644\ub8cc!")})};a.lotteryOut=function(b){$(".lotteryBtn").html("\uc5f4\ub9b0 \ucc3d\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694.");var c=a.companyGiftTable.getNextLotteryGift(),d=$("#modal-company-logo");null!==c.companyLogoImageFileName?(d.show(),d.attr("src","/companyLogo?companyId\x3d"+c.companyId)):d.hide();$("#modal-companyName").text(c.companyName);$("#modal-companyDetail").text(c.companyDetail);$("#modal-prizeName").text(c.prizeName);$("#modal-youtubeNickname").text(b.youtubeNickname);
8 | $("#modal-email").text(b.applyEmail);$("#lottery-modal").modal({backdrop:"static",keyboard:!1})};a.isIE=function(){var a=window.navigator.userAgent.toLowerCase();return"netscape"===navigator.appName.toLowerCase()&&-1!==a.search("trident")||-1!==a.indexOf("msie")?!0:!1};return{init:function(){a.init()}}};
9 | //# sourceMappingURL=Horyu.View.Lottery.min.js.map
--------------------------------------------------------------------------------
/src/main/resources/static/js/admin/Horyu.View.EventSetting.min.js.map:
--------------------------------------------------------------------------------
1 | {
2 | "version":3,
3 | "file":"Horyu.View.EventSetting.min.js",
4 | "lineCount":7,
5 | "mappings":"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",
6 | "sources":["/js/admin/Horyu.View.EventSetting.js"],
7 | "names":["Horyu","window","View","EventSetting","Horyu.View.EventSetting","options","_this","$","extend","defaultOptions","eventStartTime","eventEndTime","init","_this.init","initDateRangePicker","bindEvents","updateVisibleStatus","getOpenEventBtnId","_this.initDateRangePicker","daterangepicker","timePicker","timePickerIncrement","timePickerSeconds","showDropdowns","todayHighlight","startDate","moment","unix","endDate","dateLimit","year","locale","format","applyLabel","cancelLabel","daysOfWeek","monthNames","_this.bindEvents","change","attr","click","data","val","submit","modal","backdrop","keyboard","html","css","ajax","type","url","timeout","done","setTimeout","location","reload","fail","msg","_this.getOpenEventBtnId","_this.updateVisibleStatus","isActive","show","hide"]
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/resources/static/js/Horyu.View.Apply.min.js:
--------------------------------------------------------------------------------
1 | var Horyu=window.Horyu||{};Horyu.View=window.Horyu.View||{};
2 | Horyu.View.Apply=function(d){var a=this;a.companyGiftTable=null;a.options=$.extend({applyCount:0,eventStatus:"CLOSE",eventStartTime:0,eventEndTime:0,companyGiftData:[],eventWinnerData:[]},d);a.init=function(){a.initFingerprint2();a.initParsley();a.updateAlertBanner();a.bindEvents()};a.initFingerprint2=function(){(new Fingerprint2({excludeWebGL:!0})).get(function(a){$("#fingerprint2").val(a)})};a.initParsley=function(){$("#applyForm").parsley({successClass:"is-valid",errorClass:"is-invalid",classHandler:function(a){return a.$element.closest("input")}})};
3 | a.updateAlertBanner=function(){var c=$(".alert-banner");if("START_SOON"===a.options.eventStatus)c.html('\x3ca style\x3d"font-weight: bold; font-size: 20pt;"\x3e\ub2e4\uc74c \uc2dc\uac04 \uc774\ud6c4\uc5d0 \uc751\ubaa8\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.\x3c/a\x3e\x3cbr/\x3e\x3ca id\x3d"time-countdown" style\x3d"font-weight: bold; font-size: 32pt;"\x3e\x3c/a\x3e'),$("#time-countdown").countdown(moment.unix(a.options.eventStartTime).toDate()).on("update.countdown",function(a){$(this).html(a.strftime("%D\uc77c %H\uc2dc\uac04 %M\ubd84 %S\ucd08"))}).on("finish.countdown",
4 | function(a){$(".alert-banner").html('\x3ca style\x3d"font-weight: bold; font-size: 20pt;"\x3e\ud398\uc774\uc9c0\uac00 \uc790\ub3d9 \uc0c8\ub85c\uace0\uce68\ub429\ub2c8\ub2e4.\x3cbr/\x3e\uc0c8\ub85c\uace0\uce68\uc774 \uc548\ub420 \uacbd\uc6b0, \uc9c1\uc811 \uc0c8\ub85c\uace0\uce68 \ubc84\ud2bc\uc744 \ub20c\ub7ec\uc8fc\uc138\uc694.\x3c/a\x3e');window.location.reload()});else if("ALREADY_END"===a.options.eventStatus){var b={useEasing:!0,useGrouping:!0,separator:",",decimal:".",suffix:"\uba85"},b=new CountUp("applyCount",
5 | 0,a.options.applyCount,0,5,b);b.error?console.error(b.error):b.start();c.html('\x3ca style\x3d"font-weight: bold; font-size: 20pt;"\x3e\ub2e4\uc74c \uc2dc\uac04 \uc804\uc5d0 \uc774\ubbf8 \uc751\ubaa8 \uc2e0\uccad\uc774 \ub9c8\uac10\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\x3c/a\x3e\x3cbr/\x3e\x3ca id\x3d"time-countdown" style\x3d"font-weight: bold; font-size: 32pt;"\x3e\x3c/a\x3e');c=moment.unix(a.options.eventEndTime).subtract(new Date);$("#time-countdown").countdown(c.toDate(),{elapse:!0}).on("update.countdown",
6 | function(a){$(this).html(a.strftime("%D\uc77c %H\uc2dc\uac04 %M\ubd84 %S\ucd08"))})}else"OPEN"===a.options.eventStatus?(c.html('\x3ca style\x3d"font-size: 12pt;"\x3e\x3ca id\x3d"time-countdown" style\x3d"font-weight: bold;"\x3e\x3c/a\x3e \uc774\ud6c4 \uc751\ubaa8 \uc2e0\uccad\uc774 \ub9c8\uac10\ub429\ub2c8\ub2e4.\x3c/a\x3e'),b={useEasing:!0,useGrouping:!0,separator:",",decimal:".",suffix:"\uba85"},b=new CountUp("applyCount",0,a.options.applyCount,0,3,b),b.error?console.error(b.error):b.start(),$("#time-countdown").countdown(moment.unix(a.options.eventEndTime).toDate()).on("update.countdown",
7 | function(a){$(this).html(a.strftime("%D\uc77c %H\uc2dc\uac04 %M\ubd84 %S\ucd08"))}).on("finish.countdown",function(a){$(".alert-banner").html('\x3ca style\x3d"font-weight: bold; font-size: 20pt;"\x3e\uc751\ubaa8 \uc2e0\uccad\uc774 \ub9c8\uac10\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\x3c/a\x3e');window.location.reload()}),a.companyGiftTable=new Horyu.View.CompanyGiftTable({includeEventWinner:!1}),a.companyGiftTable.init(),a.companyGiftTable.updateTable(a.options.companyGiftData,a.options.eventWinnerData)):
8 | "CLOSE"===a.options.eventStatus?c.text("\ud604\uc7ac \uc751\ubaa8 \uc2e0\uccad\uc744 \ubc1b\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4."):"LOTTERY"===a.options.eventStatus&&(c.html("\uc544\ub798\uc5d0\uc11c \ud604\uc7ac \uc774\ubca4\ud2b8 \ub2f9\ucca8\uc790 \ubaa9\ub85d\uc744 \ud655\uc778\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),c.removeClass("alert-warning"),c.addClass("alert-success"),a.companyGiftTable=new Horyu.View.CompanyGiftTable,a.companyGiftTable.init(),a.companyGiftTable.updateTable(a.options.companyGiftData,
9 | a.options.eventWinnerData))};a.bindEvents=function(){$(".submitBtn").click(function(){$("#applyForm").parsley().validate()&&grecaptcha.execute()});$(".notSubscriberBtn").click(function(){$("#submit-modal").modal()})};return{init:function(){a.init()}}};function onReCaptchaCallback(){$("#applyForm").submit()};
10 | //# sourceMappingURL=Horyu.View.Apply.min.js.map
--------------------------------------------------------------------------------
/src/main/resources/templates/navbar.html:
--------------------------------------------------------------------------------
1 |
2 |
76 |
77 |
--------------------------------------------------------------------------------
/src/main/java/com/horyu1234/eventangel/service/CompanyService.java:
--------------------------------------------------------------------------------
1 | package com.horyu1234.eventangel.service;
2 |
3 | import com.horyu1234.eventangel.database.dao.CompanyDAO;
4 | import com.horyu1234.eventangel.domain.Company;
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 | import org.springframework.beans.factory.annotation.Value;
9 | import org.springframework.stereotype.Service;
10 | import org.springframework.web.multipart.MultipartFile;
11 |
12 | import javax.annotation.PostConstruct;
13 | import java.io.File;
14 | import java.io.FileOutputStream;
15 | import java.io.IOException;
16 | import java.util.List;
17 | import java.util.UUID;
18 |
19 | /**
20 | * Created by horyu on 2018-04-06
21 | */
22 | @Service
23 | public class CompanyService {
24 | private static final Logger LOGGER = LoggerFactory.getLogger(CompanyService.class);
25 | private CompanyDAO companyDAO;
26 |
27 | @Value("${spring.upload-dir.company-logo-image}")
28 | private String companyLogoImageUploadDir;
29 |
30 | @PostConstruct
31 | public void init() {
32 | companyDAO.createTableIfNotExist();
33 | }
34 |
35 | @Autowired
36 | public void setCompanyDAO(CompanyDAO companyDAO) {
37 | this.companyDAO = companyDAO;
38 | }
39 |
40 | public void saveCompany(Company company) {
41 | int eventId = company.getEventId();
42 |
43 | if (company.getCompanyId() == 0) {
44 | int maxCompanyId = 0;
45 |
46 | if (!companyDAO.getCompanyList(eventId).isEmpty()) {
47 | maxCompanyId = companyDAO.getMaxCompanyId(eventId);
48 | }
49 |
50 | company.setCompanyId(maxCompanyId + 1);
51 | }
52 |
53 | companyDAO.updateOrInsertCompany(company);
54 | }
55 |
56 | public void saveCompanyLogoImage(int eventId, int companyId, MultipartFile multipartFile) {
57 | File uploadDir = new File(companyLogoImageUploadDir);
58 | if (!uploadDir.exists()) {
59 | uploadDir.mkdirs();
60 | }
61 |
62 | String originalFilename = multipartFile.getOriginalFilename();
63 |
64 | String extension = originalFilename.split("\\.")[1];
65 | String randomUUID = UUID.randomUUID().toString();
66 |
67 | String fileName = randomUUID + "." + extension;
68 |
69 | File file = new File(companyLogoImageUploadDir, fileName);
70 |
71 | try {
72 | file.createNewFile();
73 | } catch (IOException e) {
74 | LOGGER.error("업로드한 회사 로고 이미지 파일을 생성하는 중 오류가 발생하였습니다.", e);
75 | }
76 |
77 | try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
78 | fileOutputStream.write(multipartFile.getBytes());
79 | } catch (IOException e) {
80 | LOGGER.error("업로드한 회사 로고 이미지파일을 기록하는 중 오류가 발생하였습니다.", e);
81 | }
82 |
83 | companyDAO.updateCompanyLogo(eventId, companyId, fileName);
84 | }
85 |
86 | public void deleteCompany(int eventId, int companyId) {
87 | companyDAO.deleteCompany(eventId, companyId);
88 | }
89 |
90 | public void deleteCompanyLogoImage(int eventId, int companyId) {
91 | File companyLogoImage = getCompanyLogoImage(eventId, companyId);
92 | if (companyLogoImage == null) {
93 | return;
94 | }
95 |
96 | if (companyLogoImage.exists()) {
97 | companyLogoImage.delete();
98 | }
99 | }
100 |
101 | public List getCompanyList(int eventId) {
102 | return companyDAO.getCompanyList(eventId);
103 | }
104 |
105 | public Company getCompany(int eventId, int companyId) {
106 | return companyDAO.getCompany(eventId, companyId);
107 | }
108 |
109 | public File getCompanyLogoImage(int eventId, int companyId) {
110 | Company company = getCompany(eventId, companyId);
111 |
112 | String companyLogoImageFileName = company.getCompanyLogoImageFileName();
113 | if (companyLogoImageFileName == null) {
114 | return null;
115 | }
116 |
117 | return new File(companyLogoImageUploadDir, companyLogoImageFileName);
118 | }
119 | }
120 |
--------------------------------------------------------------------------------