2021/05/25(화)
Spring 공유 캘린더 프로젝트 캘린더 화면 알고리즘 참고
https://cordingdoah.tistory.com/117
캘린더 화면에서 일정 추가를 클릭하면 모달창이 뜨고,
일정의 정보를 입력하고 확인 클릭하면 캘린더 화면에 일정 이름이 출력
<HomeController.java>
package org.zerock.controller;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.dao.ScheduleDao;
import org.zerock.data.DateData;
import org.zerock.dto.ScheduleDto;
import lombok.extern.log4j.Log4j;
/**
* Handles requests for the application home page.
*/
@Controller
@Log4j
public class HomeController {
@Autowired
public SqlSession sqlSession;
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@RequestMapping(value = "calendar.do", method = RequestMethod.GET)
public String calendar(Model model, HttpServletRequest request, DateData dateData) {
Calendar cal = Calendar.getInstance();
DateData calendarData;
// 검색 날짜
if (dateData.getDate().equals("") && dateData.getMonth().equals("")) {
dateData = new DateData(String.valueOf(cal.get(Calendar.YEAR)), String.valueOf(cal.get(Calendar.MONTH)),
String.valueOf(cal.get(Calendar.DATE)), null, null);
}
Map<String, Integer> today_info = dateData.today_info(dateData);
List<DateData> dateList = new ArrayList<DateData>();
// 검색 날짜 end
ScheduleDao scheduleDao = sqlSession.getMapper(ScheduleDao.class);
ArrayList<ScheduleDto> Schedule_list = scheduleDao.schedule_list(dateData);
// 달력데이터에 넣기 위한 배열 추가
ScheduleDto[][] schedule_data_arr = new ScheduleDto[32][4];
if (Schedule_list.isEmpty() != true) {
int j = 0;
for (int i = 0; i < Schedule_list.size(); i++) {
int date = Integer.parseInt(String.valueOf(Schedule_list.get(i).getSchedule_date()).substring(
String.valueOf(Schedule_list.get(i).getSchedule_date()).length() - 2,
String.valueOf(Schedule_list.get(i).getSchedule_date()).length()));
if (i > 0) {
int date_before = Integer.parseInt(String.valueOf(Schedule_list.get(i - 1).getSchedule_date())
.substring(String.valueOf(Schedule_list.get(i - 1).getSchedule_date()).length() - 2,
String.valueOf(Schedule_list.get(i - 1).getSchedule_date()).length()));
if (date_before == date) {
j = j + 1;
schedule_data_arr[date][j] = Schedule_list.get(i);
} else {
j = 0;
schedule_data_arr[date][j] = Schedule_list.get(i);
}
} else {
schedule_data_arr[date][j] = Schedule_list.get(i);
}
}
}
// 실질적인 달력 데이터 리스트에 데이터 삽입 시작.
// 일단 시작 인덱스까지 아무것도 없는 데이터 삽입
for (int i = 1; i < today_info.get("start"); i++) {
calendarData = new DateData(null, null, null, null, null);
dateList.add(calendarData);
}
// 날짜 삽입
for (int i = today_info.get("startDay"); i <= today_info.get("endDay"); i++) {
ScheduleDto[] schedule_data_arr3 = new ScheduleDto[4];
schedule_data_arr3 = schedule_data_arr[i];
if (i == today_info.get("today")) {
calendarData = new DateData(String.valueOf(dateData.getYear()), String.valueOf(dateData.getMonth()),
String.valueOf(i), "today", schedule_data_arr3);
} else {
calendarData = new DateData(String.valueOf(dateData.getYear()), String.valueOf(dateData.getMonth()),
String.valueOf(i), "normal_date", schedule_data_arr3);
}
dateList.add(calendarData);
}
// 달력 빈 곳 빈 데이터로 삽입
int index = 7 - dateList.size() % 7;
if (dateList.size() % 7 != 0) {
for (int i = 0; i < index; i++) {
calendarData = new DateData(null, null, null, null, null);
dateList.add(calendarData);
}
}
// 배열에 담음
model.addAttribute("dateList", dateList); // 날짜 데이터 배열
model.addAttribute("today_info", today_info);
return "schedule/calendar";
}
@RequestMapping(value = "schedule_add.do", method = RequestMethod.GET)
public String schedule_add(HttpServletRequest request, ScheduleDto scheduleDto, RedirectAttributes rttr) {
ScheduleDao scheduleDao = sqlSession.getMapper(ScheduleDao.class);
int count = scheduleDao.before_schedule_add_search(scheduleDto);
String message = "";
String url = "redirect:calendar.do";
if (count >= 4) {
message = "스케쥴은 최대 4개만 등록 가능합니다.";
} else {
scheduleDao.schedule_add(scheduleDto);
message = "스케쥴이 등록되었습니다";
}
rttr.addFlashAttribute("message", message);
return url;
}
@RequestMapping(value = "/schedule_show", method = RequestMethod.GET)
public String schedule_show(Model model,HttpServletRequest request, @RequestParam("schedule_idx") int idx, RedirectAttributes rttr) {
ScheduleDao scheduleDao = sqlSession.getMapper(ScheduleDao.class);
String url = "redirect:calendar.do";
scheduleDao.get(idx);
model.addAttribute("schedule_show",scheduleDao.get(idx));
return null;
}
@RequestMapping(value = "modify.do", method = RequestMethod.GET)
public String schedule_modify(Model model,HttpServletRequest request, ScheduleDto scheduleDto, RedirectAttributes rttr) {
ScheduleDao scheduleDao = sqlSession.getMapper(ScheduleDao.class);
scheduleDao.update(scheduleDto);
model.addAttribute("schedule_modify",scheduleDao.update(scheduleDto));
return "/modify";
}
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String schedule_delete(Model model,HttpServletRequest request, ScheduleDto scheduleDto, RedirectAttributes rttr) {
ScheduleDao scheduleDao = sqlSession.getMapper(ScheduleDao.class);
scheduleDao.delete(scheduleDto);
model.addAttribute("schedule_delete",scheduleDao.delete(scheduleDto));
return null;
}
}
controller에서 일정추가와 관련된 코드
@RequestMapping(value = "schedule_add.do", method = RequestMethod.GET)
public String schedule_add(HttpServletRequest request, ScheduleDto scheduleDto, RedirectAttributes rttr) {
ScheduleDao scheduleDao = sqlSession.getMapper(ScheduleDao.class);
int count = scheduleDao.before_schedule_add_search(scheduleDto);
String message = "";
String url = "redirect:calendar.do";
if (count >= 4) {
message = "스케쥴은 최대 4개만 등록 가능합니다.";
} else {
scheduleDao.schedule_add(scheduleDto);
message = "스케쥴이 등록되었습니다";
}
rttr.addFlashAttribute("message", message);
return url;
}
<ScheduleDto.java>
package org.zerock.dto;
import java.sql.Date;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class ScheduleDto {
int schedule_idx;
int schedule_num;
String schedule_subject;
String schedule_desc;
Date schedule_date;
//---------------
String schedule_share;
String schedule_mycolor;
public int getSchedule_idx() {
return schedule_idx;
}
public void setSchedule_idx(int schedule_idx) {
this.schedule_idx = schedule_idx;
}
public int getSchedule_num() {
return schedule_num;
}
public void setSchedule_num(int schedule_num) {
this.schedule_num = schedule_num;
}
public String getSchedule_subject() {
return schedule_subject;
}
public void setSchedule_subject(String schedule_subject) {
this.schedule_subject = schedule_subject;
}
public String getSchedule_desc() {
return schedule_desc;
}
public void setSchedule_desc(String schedule_desc) {
this.schedule_desc = schedule_desc;
}
public Date getSchedule_date() {
return schedule_date;
}
public void setSchedule_date(Date schedule_date) {
this.schedule_date = schedule_date;
}
/* 공유할 일정인지 아닌지 */
public String getSchedule_share() {
return schedule_share;
}
public void setSchedule_share(String schedule_share) {
this.schedule_share =schedule_share;
}
/* 일정 색상 입출력 */
public String getSchedule_mycolor() {
return schedule_mycolor;
}
public void setSchedule_mycolor(String schedule_mycolor) {
this.schedule_mycolor =schedule_mycolor;
}
@Override
public String toString() {
return "ScheduleDto [schedule_idx=" + schedule_idx + ", schedule_num=" + schedule_num + ", schedule_subject="
+ schedule_subject + ", schedule_desc=" + schedule_desc + ", schedule_date=" + schedule_date + ", schedule_share="+schedule_share
+", schedule_mycolor="+schedule_mycolor +"]";
}
}
sql문에서 가져온 값을 출력하거나 전달할 때 사용
<ScheduleDao.java>
package org.zerock.dao;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import org.zerock.data.DateData;
import org.zerock.dto.ScheduleDto;
public interface ScheduleDao {
public int schedule_add(ScheduleDto scheduleDto);
public int before_schedule_add_search(ScheduleDto scheduleDto);
public ArrayList<ScheduleDto> schedule_list(DateData dateData);
/* 수정, 삭제를 위한 리스트 불러오기 */
/* 조회하기 */
public ScheduleDto get(int idx);
/* 수정하기 */
public int update(ScheduleDto scheduleDto);
/* 삭제하기 */
public int delete(ScheduleDto scheduleDto);
}
웹 화면에서 일정의 정보 값을 dto를 매개변수로 xml파일의 sql문으로 값을 전달 후 dto로 값을 다시 반환
dao는 값을 전달받고 전달하는 중간역할
<SheduleDao.xml>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.zerock.dao.ScheduleDao">
<insert id="schedule_add">
insert into schedule
<include refid="schedule_cols" />
values
(nextval(schedule_sq), #{schedule_num}, #{schedule_subject}, #{schedule_desc}, #{schedule_date}, #{schedule_share}, #{schedule_mycolor})
</insert>
<sql id="schedule_cols">
(schedule_idx, schedule_num, schedule_subject, schedule_desc, schedule_date, schedule_share, schedule_mycolor)
</sql>
<select id="before_schedule_add_search" resultType="int">
select count(*) from schedule where schedule_date = #{schedule_date}
</select>
<select id="schedule_list" resultType="org.zerock.dto.ScheduleDto">
select * from schedule where schedule_date >= #{db_startDate} and schedule_date <= #{db_endDate}
order by schedule_date, schedule_num, schedule_idx
</select>
<!-- 리스트 가져오기 -->
<select id="get" resultType="org.zerock.dto.ScheduleDto">
<![CDATA[
select * from schedule where schedule_idx = #{schedule_idx}
]]>
</select>
<!-- 수정하기 -->
<update id="update">
update schedule
set schedule_num = #{schedule_num},
schedule_subject = #{schedule_subject},
schedule_desc = #{schedule_desc},
schedule_date=#{schedule_date},
schedule_share =#{schedule_share},
schedule_mycolor=#{schedule_mycolor}
where schedule_idx=#{schedule_idx}
</update>
<delete id="delete">
delete from schedule where schedule_idx=#{schedule_idx}
</delete>
</mapper>
sql문 실행하여 db 데이터 삽입, 삭제, 조회
ScheduleDao.java에서 id값을 통해 sql문 실행후 값 전달
<calendar.jsp>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Calendar"%>
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="path" value="${pageContext.request.contextPath}" />
<html lang="ko">
<head>
<title>캘린더</title>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<!-- jquery datepicker -->
<link rel="stylesheet"
href="http://code.jquery.com/ui/1.8.18/themes/base/jquery-ui.css"
type="text/css" />
<script src="http://code.jquery.com/ui/1.8.18/jquery-ui.min.js"></script>
<!-- jquery datepicker 끝 -->
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link href="${path}/resources/css/main.css" rel="stylesheet"
type="text/css">
<script src="${path}/resources/js/board.js"></script>
<script type="text/javaScript" language="javascript"></script>
<script
src="https://www.lgkids.co.kr/es_all/plugins/jscolor-2.0.5/jscolor.js"></script>
<style TYPE="text/css">
/* 배경색 */
html {
background-color: #EFEFEF;
}
body {
scrollbar-face-color: #F6F6F6;
scrollbar-highlight-color: #bbbbbb;
scrollbar-3dlight-color: #FFFFFF;
scrollbar-shadow-color: #bbbbbb;
scrollbar-darkshadow-color: #FFFFFF;
scrollbar-track-color: #FFFFFF;
scrollbar-arrow-color: #bbbbbb;
margin-left: "0px";
margin-right: "0px";
margin-top: "0px";
margin-bottom: "0px";
}
td {
font-size: 9pt;
color: #747474;
}
th {
font-size: 9pt;
color: #000000;
}
select {
font-size: 9pt;
color: #747474;
}
.divDotText {
overflow: hidden;
text-overflow: ellipsis;
}
a:link {
font-size: 9pt;
color: #000000;
text-decoration: none;
}
a:visited {
font-size: 9pt;
color: #000000;
text-decoration: none;
}
a:active {
font-size: 9pt;
color: red;
text-decoration: none;
}
a:hover {
font-size: 9pt;
color: red;
text-decoration: none;
}
.day {
width: 100px;
height: 30px;
font-weight: bold;
font-size: 15px;
font-weight: bold;
text-align: center;
}
.sat {
color: #0030DB;
}
.sun {
color: #ED0000;
}
.today_button_div {
float: right;
}
/* 버튼 */
.buttonstyle {
border: 1px solid #A0D9E2;
color: #A0D9E2;
background-color: white;
margin-bottom: 7px;
font-weight: bold;
border-radius: 5px;
font-size: 10pt;
}
.buttonstyle:hover {
box-shadow: 0px 15px 20px rgba(131, 131, 131, 0.4);
transform: translateY(-5px);
background-color: #A0D9E2;
color: white;
}
.buttonstyle:focus {
background-color: #A0D9E2;
color: white;
border: 3px solid #c9c9c9;
}
/* 캘린더 사이즈 */
.calendar {
width: 80%;
margin: auto;
}
/* 년/월 */
.navigation {
margin-top: 30px;
margin-bottom: 5px;
text-align: center;
font-size: 25px;
vertical-align: middle;
}
/* 캘린더 꾸미기 */
.calendar_body {
width: 100%;
background-color: #FFFFFF;
border: 1px solid #A0D9E2;
margin-bottom: 50px;
border-collapse: collapse;
}
/* 캘린더 꾸미기 */
.calendar_body .today {
border: 1px solid #A0D9E2;
height: 120px;
background-color: #EFEFEF;
text-align: left;
vertical-align: top;
}
.calendar_body .date {
font-weight: bold;
font-size: 15px;
padding-left: 3px;
padding-top: 3px;
}
.date {
margin-bottom: 10px;
}
.sat {
margin-bottom: 10px;
}
.sun {
margin-bottom: 10px;
}
/* 캘린더 꾸미기 */
.calendar_body .sat_day {
border: 1px solid #A0D9E2;
height: 120px;
background-color: white;
text-align: left;
vertical-align: top;
}
.calendar_body .sat_day .sat {
color: #0030DB;
font-weight: bold;
font-size: 15px;
padding-left: 3px;
padding-top: 3px;
}
/* 캘린더 꾸미기 */
.calendar_body .sun_day {
border: 1px solid #A0D9E2;
height: 120px;
background-color: white;
text-align: left;
vertical-align: top;
}
.calendar_body .sun_day .sun {
color: #ED0000;
font-weight: bold;
font-size: 15px;
padding-left: 3px;
padding-top: 3px;
}
/* 캘린더 꾸미기 */
.calendar_body .normal_day {
border: 1px solid #A0D9E2;
height: 120px;
background-color: white;
vertical-align: top;
text-align: left;
}
.before_after_month {
margin: 10px;
font-weight: bold;
}
.before_after_year {
font-weight: bold;
}
.this_month {
margin: 10px;
}
.schdule_add_button {
float: right;
}
/*
* 게시판 이동 모달
*/
#mask_board_move {
position: absolute;
z-index: 9000;
background-color: #000;
display: none;
left: 0;
top: 0;
}
.normal_move_board_modal {
display: none;
position: fixed;
z-index: 10000;
left: 25% !important;
top: 15% !important;
width: 50% !important;
height: 60% !important;
border-radius: 12px !important;
background-color: white !important;
}
.normal_move_board_modal .top {
background-color: #A0D9E2;
width: 100%;
height: 13%;
border-radius: 12px 12px 0px 0px;
}
.normal_move_board_modal .top .close {
float: right;
cursor: pointer;
color: white;
font-size: 25px;
font-weight: bold;
padding-top: 5px;
padding-right: 20px;
}
.normal_move_board_modal .top .subject {
float: left;
margin-left: 10px;
margin-top: 20px;
font-size: 30px;
font-weight: bold;
color: white;
padding-left: 20px;
}
.normal_move_board_modal .bottom {
width: 100%;
height: 15%;
vertical-align: middle;
}
.normal_move_board_modal .bottom .info {
padding: 10px 15px 10px 15px;
text-align: left;
font-size: 12px;
color: red;
margin-left: 50px;
}
.normal_move_board_modal .bottom .contents {
margin: 20px 50px 20px 50px;
text-align: center;
}
.normal_move_board_modal .bottom .contents .board_select {
width: 240px;
height: 40px;
font-size: 15px;
}
.normal_move_board_modal ul {
padding: 0;
margin: 0;
list-style: none;
}
.normal_move_board_modal ul li {
text-align: left;
padding: 5px;
height: 30px;
}
.normal_move_board_modal ul li .text_subject {
width: 10%;
height: 100%;
float: left;
font-size: 18px;
vertical-align: middle;
margin-top: 3px;
}
.normal_move_board_modal ul li .text_desc {
height: 25px;
width: 90%;
float: left;
}
.normal_move_board_modal ul li .text_area_desc {
width: 90%;
float: left;
}
.normal_move_board_modal ul li .text_type1 {
height: 100% !important;
width: 100%;
border: 1px solid #A0D9E2;
}
.normal_move_board_modal ul li .textarea_type1 {
width: 100%;
font-size: 18px;
border: 1px solid #A0D9E2;
}
.normal_move_board_modal ul .button_li {
padding-top: 40px;
width: 100%;
}
.normal_move_board_modal .bottom .contents .board_move_go {
width: 100% !important;
height: 40px;
font-size: 15px;
}
.date_subject {
margin: 0px;
margin-bottom: 5px;
margin-left: 12px;
font-size: 12px;
font-weight: bold;
border: none;
}
.date_subject:hover {
border: 1px solid #A0D9E2 !important;
border-radius: 7px;
}
.radio {
margin-top: 12px;
border: 1px solid #A0D9E2;
}
.colorbox {
margin-top: 5px;
border: 1px solid #A0D9E2;
}
/********************************일정 삭제 관리***************************************/
#mask_board_manage {
position: absolute;
z-index: 9000;
background-color: #000;
display: none;
left: 0;
top: 0;
}
.normal_manage_board_modal {
display: none;
position: fixed;
z-index: 10000;
left: 25% !important;
top: 15% !important;
width: 50% !important;
height: 60% !important;
border-radius: 12px !important;
background-color: white !important;
}
.normal_manage_board_modal .top {
background-color: #A0D9E2;
width: 100%;
height: 13%;
border-radius: 12px 12px 0px 0px;
}
.normal_manage_board_modal .top .close {
float: right;
cursor: pointer;
color: white;
font-size: 25px;
font-weight: bold;
padding-top: 5px;
padding-right: 20px;
}
.normal_manage_board_modal .top .subject {
float: left;
margin-left: 10px;
margin-top: 20px;
font-size: 30px;
font-weight: bold;
color: white;
padding-left: 20px;
}
.normal_manage_board_modal .bottom {
width: 100%;
height: 15%;
vertical-align: middle;
}
.normal_manage_board_modal .bottom .info {
padding: 10px 15px 10px 15px;
text-align: left;
font-size: 12px;
color: red;
margin-left: 50px;
}
.normal_manage_board_modal .bottom .contents {
margin: 20px 50px 20px 50px;
text-align: center;
}
.normal_manage_board_modal .bottom .contents .board_select {
width: 240px;
height: 40px;
font-size: 15px;
}
.normal_manage_board_modal ul {
padding: 0;
margin: 0;
list-style: none;
}
.normal_manage_board_modal ul li {
text-align: left;
padding: 5px;
height: 30px;
}
.normal_manage_board_modal ul li .text_subject {
width: 10%;
height: 100%;
float: left;
font-size: 18px;
vertical-align: middle;
margin-top: 3px;
}
.normal_manage_board_modal ul li .text_desc {
height: 25px;
width: 90%;
float: left;
}
.normal_manage_board_modal ul li .text_area_desc {
width: 90%;
float: left;
}
.normal_manage_board_modal ul li .text_type1 {
height: 100% !important;
width: 100%;
border: 1px solid #A0D9E2;
}
.normal_manage_board_modal ul li .textarea_type1 {
width: 100%;
font-size: 18px;
border: 1px solid #A0D9E2;
}
.normal_manage_board_modal ul .button_li {
padding-top: 40px;
width: 100%;
}
.normal_manage_board_modal .bottom .contents .board_manage_go {
width: 45% !important;
height: 40px;
font-size: 15px;
margin: 0 auto;
}
.managebutton {
width: 60%;
margin: 0 auto;
display: flex;
}
</style>
<script>
var idx;
var num;
var subject;
var desc;
var date;
var share;
var mycolor;
</script>
</head>
<body>
<form name="calendarFrm" id="calendarFrm" action="" method="GET">
<input type="hidden" name="year" value="${today_info.search_year}" />
<input type="hidden" name="month" value="${today_info.search_month-1}" />
<script>
/* 스케줄 등록시 등록완료 팝업창 */
var message = "${message}";
console.log(message);
if (message != "") {
alert(message);
}
</script>
<div class="calendar">
<!--날짜 네비게이션 -->
<div class="navigation">
<a class="before_after_year"
href="./calendar.do?year=${today_info.search_year-1}&month=${today_info.search_month-1}">
<< <!-- 이전해 -->
</a> <a class="before_after_month"
href="./calendar.do?year=${today_info.before_year}&month=${today_info.before_month}">
< <!-- 이전달 -->
</a> <span class="this_month"> ${today_info.search_year}. <c:if
test="${today_info.search_month<10}">0</c:if>${today_info.search_month}
</span> <a class="before_after_month"
href="/calendar.do?year=${today_info.after_year}&month=${today_info.after_month}">
<!-- 다음달 --> >
</a> <a class="before_after_year"
href="/calendar.do?year=${today_info.search_year+1}&month=${today_info.search_month-1}">
<!-- 다음해 --> >>
</a>
</div>
<div class="today_button_div">
<button type="button" class="buttonstyle"
onclick="javascript:location.href='/calendar.do'"
style="height: 30px; width: 80px;">Today</button>
<button type="button"
class="buttonstyle board_move openMask_board_move pointer"
style="height: 30px; width: 130px;">Add Schedule</button>
</div>
<table class="calendar_body">
<thead>
<tr bgcolor="#A0D9E2">
<td class="day sun">Sun</td>
<td class="day">Mon</td>
<td class="day">Tue</td>
<td class="day">Wed</td>
<td class="day">Thu</td>
<td class="day">Fri</td>
<td class="day sat">Sat</td>
</tr>
</thead>
<tbody>
<tr>
<c:forEach var="dateList" items="${dateList}"
varStatus="date_status">
<c:choose>
<c:when test="${dateList.value=='today'}">
<c:if test="${date_status.index%7==0}">
<tr>
</c:if>
<td class="today">
<div class="date">
</c:when>
<c:when test="${date_status.index%7==6}">
<td class="sat_day">
<div class="sat">
</c:when>
<c:when test="${date_status.index%7==0}">
</tr>
<tr>
<td class="sun_day">
<div class="sun">
</c:when>
<c:otherwise>
<td class="normal_day">
<div class="date">
</c:otherwise>
</c:choose>
${dateList.date}
</div>
<div>
<!-- 달력에 일정 띄우고 클릭 시 수정/삭제 창 띄우는 코드 -->
<c:forEach var="scheduleList"
items="${dateList.schedule_data_arr}"
varStatus="schedule_data_arr_status">
<a
href="/schedule_show?schedule_idx=${scheduleList.schedule_idx}"
onclick="window.open(this.href, '_blank', 'width=550,height=600,left=680%, top=200%, toolbars=no,scrollbars=no'); return false;"
class="date_subject "
style="color: ${scheduleList.schedule_mycolor}">${scheduleList.schedule_subject}</a>
<br>
</c:forEach>
</div>
</td>
</c:forEach>
</tbody>
</table>
</form>
<div id="mask_board_move"></div>
<div class="normal_move_board_modal">
<script>
$(function() {
$("#testDatepicker")
.datepicker(
{
dateFormat : "yy-mm-dd",
changeMonth : true,
changeYear : true,
dayNames : [ '월요일', '화요일', '수요일', '목요일',
'금요일', '토요일', '일요일' ],
dayNamesMin : [ '월', '화', '수', '목', '금',
'토', '일' ],
monthNamesShort : [ '1', '2', '3', '4',
'5', '6', '7', '8', '9', '10',
'11', '12' ]
});
});
function scheduleAdd() {
var schedule_add_form = document.schedule_add;
if (schedule_add_form.schedule_date.value == ""
|| schedule_add_form.schedule_date.value == null) {
alert("날짜를 입력해주세요.");
schedule_add_form.schedule_date.focus();
return false;
} else if (schedule_add_form.schedule_subject.value == ""
|| schedule_add_form.schedule_subject.value == null) {
alert("제목을 입력해주세요.");
schedule_add_form.schedule_date.focus();
return false;
}
schedule_add_form.submit();
}
</script>
<div class="top" style="">
<div class="close">x</div>
<div class="subject">Add Schedule</div>
</div>
<div class="bottom">
<div class="info">* 순번은 해당 날짜안에서 순서대로 입력이 됩니다.(하루에 최대 4개의 스케줄만
등록할 수 있습니다.)</div>
<form name="schedule_add" action="schedule_add.do">
<input type="hidden" name="year" value="${today_info.search_year}" />
<input type="hidden" name="month"
value="${today_info.search_month-1}" />
<div class="contents">
<ul>
<li>
<div class="text_subject">순번 :</div>
<div class="text_desc">
<input type="text" name="schedule_num" class="text_type1" />
</div>
</li>
<li>
<div class="text_subject">날짜 :</div>
<div class="text_desc">
<input type="text" name="schedule_date" class="text_type1"
id="testDatepicker" readonly="readonly" />
</div>
</li>
<li>
<div class="text_subject">제목 :</div>
<div class="text_desc">
<input type="text" name="schedule_subject" class="text_type1" />
</div>
</li>
<li style="margin-bottom: 70px;">
<div class="text_subject">내용 :</div>
<div class="text_area_desc">
<textarea name="schedule_desc" class="textarea_type1" rows="5"></textarea>
</div>
</li>
<li>
<div class="text_subject">공유 :</div> <input class="radio"
type="radio" name="schedule_share" value="1" checked="checked">공개
<input type="radio" name="schedule_share" value="2">비공개
</li>
<li>
<div class="text_subject">색상 :</div> <input class="colorbox"
type='color' name='schedule_mycolor' value='' />
</li>
<li class="button_li">
<button type="button" class="buttonstyle board_move_go pointer"
onclick="scheduleAdd();">Add</button>
</li>
</ul>
</div>
</form>
</div>
</div>
</body>
</html>
위 코드에서 일정 추가와 관련코드
<div>
<!-- 달력에 일정 띄우고 클릭 시 수정/삭제 창 띄우는 코드 -->
<c:forEach var="scheduleList"
items="${dateList.schedule_data_arr}"
varStatus="schedule_data_arr_status">
<a
href="/schedule_show?schedule_idx=${scheduleList.schedule_idx}"
onclick="window.open(this.href, '_blank', 'width=550,height=600,left=680%, top=200%, toolbars=no,scrollbars=no'); return false;"
class="date_subject "
style="color: ${scheduleList.schedule_mycolor}">${scheduleList.schedule_subject}</a>
<br>
</c:forEach>
</div>
a태그 위에 items 값으로 schedule_data_arr를 주면서 일정 목록을 forEach문을 통해 날짜별로 출력
<div class="normal_move_board_modal">
<script>
$(function() {
$("#testDatepicker")
.datepicker(
{
dateFormat : "yy-mm-dd",
changeMonth : true,
changeYear : true,
dayNames : [ '월요일', '화요일', '수요일', '목요일',
'금요일', '토요일', '일요일' ],
dayNamesMin : [ '월', '화', '수', '목', '금',
'토', '일' ],
monthNamesShort : [ '1', '2', '3', '4',
'5', '6', '7', '8', '9', '10',
'11', '12' ]
});
});
function scheduleAdd() {
var schedule_add_form = document.schedule_add;
if (schedule_add_form.schedule_date.value == ""
|| schedule_add_form.schedule_date.value == null) {
alert("날짜를 입력해주세요.");
schedule_add_form.schedule_date.focus();
return false;
} else if (schedule_add_form.schedule_subject.value == ""
|| schedule_add_form.schedule_subject.value == null) {
alert("제목을 입력해주세요.");
schedule_add_form.schedule_date.focus();
return false;
}
schedule_add_form.submit();
}
</script>
<div class="top" style="">
<div class="close">x</div>
<div class="subject">Add Schedule</div>
</div>
<div class="bottom">
<div class="info">* 순번은 해당 날짜안에서 순서대로 입력이 됩니다.(하루에 최대 4개의 스케줄만
등록할 수 있습니다.)</div>
<form name="schedule_add" action="schedule_add.do">
<input type="hidden" name="year" value="${today_info.search_year}" />
<input type="hidden" name="month"
value="${today_info.search_month-1}" />
<div class="contents">
<ul>
<li>
<div class="text_subject">순번 :</div>
<div class="text_desc">
<input type="text" name="schedule_num" class="text_type1" />
</div>
</li>
<li>
<div class="text_subject">날짜 :</div>
<div class="text_desc">
<input type="text" name="schedule_date" class="text_type1"
id="testDatepicker" readonly="readonly" />
</div>
</li>
<li>
<div class="text_subject">제목 :</div>
<div class="text_desc">
<input type="text" name="schedule_subject" class="text_type1" />
</div>
</li>
<li style="margin-bottom: 70px;">
<div class="text_subject">내용 :</div>
<div class="text_area_desc">
<textarea name="schedule_desc" class="textarea_type1" rows="5"></textarea>
</div>
</li>
<li>
<div class="text_subject">공유 :</div> <input class="radio"
type="radio" name="schedule_share" value="1" checked="checked">공개
<input type="radio" name="schedule_share" value="2">비공개
</li>
<li>
<div class="text_subject">색상 :</div> <input class="colorbox"
type='color' name='schedule_mycolor' value='' />
</li>
<li class="button_li">
<button type="button" class="buttonstyle board_move_go pointer"
onclick="scheduleAdd();">Add</button>
</li>
</ul>
</div>
</form>
</div>
</div>
1. Add Schedule 버튼을 통해 클릭 시 모달창 출력
2. 일정의 순번, 날짜, 제목, 내용, 공유, 색상을 선택하고 add버튼 클릭
3. scheduleAdd() 메소드를 실행하여 날짜와 제목이 빈칸인지 if문으로 확인
4. 조건이 맞다면 schedule_add form을 제출
5. form의 action인 schedule_add.do로 이동
6. controller의 schedule_add.do에서 하루 스케줄 4개초과 인지를 확인
7. 4개이하면 calendar.do로 이동하여 일정이 추가된 캘린더 화면 다시 보여줌
--> 결과화면
'코딩 연습장 > Spring' 카테고리의 다른 글
Spring 공유 캘린더 프로젝트 - 9 (일정 수정, 삭제) (0) | 2021.06.28 |
---|---|
Spring 공유 캘린더 프로젝트 - 8 (캘린더 일정 조회) (0) | 2021.06.28 |
Spring 공유 캘린더 프로젝트 - 6 (캘린더 화면) (0) | 2021.06.25 |
Spring 공유 캘린더 프로젝트 - 5 (메인 화면) (0) | 2021.06.24 |
Spring 공유 캘린더 프로젝트 - 4 (비밀 번호 찾기) (0) | 2021.06.24 |