본문 바로가기
💻 1. 웹개발_Front end/1-7 Ajax

[Ajax] 21. Contact Application 만들기

by 달님🌙 2021. 10. 7.
반응형

 

 

주소록 어플리케이션 만들기 실습

 

1. 순서 

1. 구조 잡기  ->  2. 뷰 템플릿  ->  3. 함수  ->  4. 이벤트 함수  ->  5. add  ->  6. update, delete

 

2. 소스 코드

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="lib/jpaginate/style.css">
<link rel="stylesheet" href="lib/waitme/waitMe.css">
<link rel="stylesheet" href="css/jquery-ui.css">
<script src="js/jquery-3.6.0.min.js"></script>
<script src="js/jsrender.js"></script>
<script src="js/jquery-ui.js"></script>
<script src="lib/waitme/waitMe.js"></script>
<script src="lib/jpaginate/jQuery.paginate.js"></script>
<title>주소록 어플리케이션</title>
<style>
	body {
		font-size : 75%;
	}
	
	input.text {
		margin-bottom : 12px;
		width : 95%;
		padding : .4em;
	}
</style>
</head>
<body>
	<h2 class="ui-widget ui-header">주소록 리스트</h2>
	<!-- 
		주소록 추가 버튼
		버튼 클릭 시 모달 창으로 입력 폼 열림
	 -->
	<button role="button" id="btnNewContact"
			class="add ui-button ui-state-default ui-button-text-only">
			<span class="ui-button-text">새로운 연락처 추가</span>
	</button>
	
	<!-- 주소록 출력 영역 -->
	<div id="output" style="text-align:center;width:630px;">
		<table id="contact_table" style="border:solid 1px black;">
			<thead>
				<tr style="background-color:#cb842e;color:white;">
					<th style="width:60px;">번호</th>
					<th style="width:90px;">이름</th>
					<th style="width:100px;">전화번호</th>
					<th style="width:250px;">주소</th>
					<th style="width:130px;">기능</th>
				</tr>
			</thead>
			
			<!-- 
				주소 목록 출력 부분 
				jsRender를 이용해서 viewtemplate과 데이터가 결합된 형태로 출력	
			-->
			<tbody id="contactlist">
			</tbody>
		</table>
		
		<!-- 페이지 이동 버튼 출력 부분(paginate 이용) -->
		<div id="paging">
		</div>
		
		<!-- 주소록 추가/수정 시 나타날 다이얼로그(모달) 창 영역 -->
		<div id="input_dialog" title="연락처 추가/수정">
			<form id="f_contact">
				<label for="no">일련번호</label>
				<input type="text" id="no" name="no" class="text" disabled/>
				<label for="name">이름</label>
				<input type="text" id="name" name="name" class="text"/>
				<label for="tel">전화번호</label>
				<input type="text" id="tel" name="tel" class="text"/>
				<label for="address">주소</label>
				<input type="text" id="address" name="address" class="text"/>
			</form>
		</div>
	</div>
	<script>
		$(document).ready(function() {
			// 1. 공통 변수, 옵션
			//서버로 list.do ajax 호출 시 전달할 파라미터 변수
			var param = { pageno : 1, pagesize : 5 };
			//페이징 처리 시 사용할 전체 페이지 변수 선언
			var totalPage = 0;
			
			//페이징 처리 옵션 설정
			var pageOption = {
					count : 1,
					start : 1,
					display : 10,
					border : true,
					border_color : "#333333",
					background_color : "#cb842e",
					text_color : "#ffffff",
					border_hover_color : "#333333",
					background_hover_color : "#cb842e",
					text_hover_color : "#000000",
					images : false,
					mouse : "press",
					onChange : function(page) {
						//페이지 클릭 시 파라미터의 pageno을 변경
						param.pageno = page;
						//서버로부터 list.do 요청할 메소드
						viewContactList();
					}
			};
			
			//다이얼로그(모달) 창 숨김처리
			$("#input_dialog").dialog({
				autoOpen : false,
				modal : true
			});
			
			// 2. 공통 함수
			var viewContactList = function() {
				//서버에서 list.do 요청
				$.get("/contact/list_long.do", param, function(data) {
					var obj = JSON.parse(data);
					
					//화면에 주소록 표출
					$("#contactlist").empty();
					var tmpl = $.templates("#tmpl_contact");
					var str = tmpl.render(obj.contacts);
					$("#contactlist").html(str);
					
					//페이징 처리를 위한 jpaginate 출력
					totalPage = Math.floor((obj.totalCount - 1) / param.pagesize) + 1;
					pageOption.count = totalPage;
					pageOption.start = param.pageno;
					$("#paging").paginate(pageOption);
				});
			}
			
			//로딩 표시 메소드
			var ajaxLoading = function(isLoading) {
				if(isLoading == true) {
					$("body").waitMe({
						effect : "ios",
						text : "처리중입니다",
						bg : "rgba(255, 255, 255, 0.7)",
						color : "#000",
						source : "lib/waitme/img.svg"
					});
				} else {
					//waitMe 숨김 처리
					$("body").waitMe("hide");
				}
			}
			
			//추가 다이얼로그 입력 폼 초기화
			var initializeInputForm = function() {
				//기존에 입력필드에 남아있던 값 초기화
				$("#f_contact")[0].reset();
			}
			
			//ajax 데이터 추가하는 메소드
			var addContact = function() {
				//입력필드를 인코딩된 폼 데이터로 생성
				var param = $("#f_contact").serialize();
				
				$.post("/contact/add.do", param, function(data) {
					//{{status : ok, message : 65번 데이터가 추가되었습니다.}};
					console.log(data);
					var obj = JSON.parse(data);
					console.log(obj);
					
					if(obj.status == "ok") {
						//정상 추가되었을 때 다시 목록 조회
						param.pageno = 1;
						viewContactList();
					} else {
						alert("주소록 추가 실패 : " + obj.message);
					}
					$("#input_dialog").dialog("close");
				});
			}
			
			//다이얼로그 취소 버튼 클릭 시 다이얼로그 닫는 메소드
			var cancelInput = function() {
				$("#input_dialog").dialog("close");
			}
			
			//수정 처리 전 표출할 해당 데이터 조회
			var editContact = function(no) {
				$.get("/contact/search.do", { no : no }, function(data) {
					var data = JSON.parse(data);
					
					if(data.errorMessage) {
						alert(data.errorMessage);
					} else {
						var dialog = $("#input_dialog");
						//find() : 해당 요소를 찾아서 선택
						//input 필드의 값 세팅
						dialog.find("#no").val(data.no);
						dialog.find("#name").val(data.name);
						dialog.find("#tel").val(data.tel);
						dialog.find("#address").val(data.address);
						
						//dialog 오픈
						dialog.dialog({
							autoOpen : true,
							modal : true,
							buttons : {
								"수정" : updateContact,
								"취소" : cancelInput
							}
						});
					}
				});
			}
			
			//수정 처리
			var updateContact = function() {
				var param = $("#f_contact").serialize();
				console.log(param);
				//input에 disabled 속성은 serialize로 묶이지 않음 따로 추가
				param += "&no=" + $("#no").val();
				console.log(param);
				
				$.post("/contact/update.do", param, function(data) {
					var data =JSON.parse(data);
					
					if(data.status == "ok") {
						//정상 수정 됐을 때 현재 페이지 다시 조회
						viewContactList();
					} else {
						alert("연락처 수정 실패 : " + data.message);
					}
					//다이얼로그(모달) 창 닫기
					$("#input_dialog").dialog("close");
				});
			}
			
			//삭제 처리
			var deleteContact = function(no) {
				if(confirm("정말로 삭제하시겠습니까?") == true) {
					$.post("/contact/delete.do", { no : no }, function(data) {
						var data =JSON.parse(data);
						
						if(data.status == "ok") {
							//정상 삭제 됐을 때 현재 페이지 다시 조회
							viewContactList();
						} else {
							alert("연락처 삭제 실패 : " + data.message);
						}
					});
				}
			}
			
			// 3. 이벤트 함수
			$(document).ajaxStart(function() {
				//ajax 호출 시 로딩 표시
				ajaxLoading(true);
			}).ajaxStop(function() {
				//ajax 완료 시 로딩 숨김
				ajaxLoading(false);
			});
			
			//추가 버튼 클릭 시 다이얼로그(모달) 창 오픈
			$("#btnNewContact").click(function() {
				//다이얼로그 초기화 메소드
				initializeInputForm();
				//다이얼로그 설정
				$("#input_dialog").dialog({
					modal : true,
					buttons : {
						"추가" : addContact,
						"취소" : cancelInput
					}
				});
				//다이얼로그(모달) 창 오픈
				$("#input_dialog").dialog("open");
			});
			
			//수정 버튼 클릭 시 발생 이벤트
			$("#contactlist").on("click", "button.update", function() {
				var no = $(this).data("no");
				editContact(no);
			});
			
			//삭제 버튼 클릭 시 발생 이벤트
			$("#contactlist").on("click", "button.delete", function() {
				var no = $(this).data("no");
				deleteContact(no);
			});
			
			// 4. 화면 초기화 코드
			//처음 접속 시 ajax 요청 및 데이터 표출
			viewContactList();
		});
	</script>
	
	<!-- viewtemplate 영역 -->
	<script id="tmpl_contact" type="text/x-jsrender">
		<tr>
			<td>{{:no}}</td>
			<td>{{:name}}</td>
			<td>{{:tel}}</td>
			<td>{{:address}}</td>
			<td>
				<button data-no="{{:no}}" role="button" 
						class="update ui-button ui-state-default ui-button-text-only">
					<span class="ui-button-text">수정</span>
				</button>
				<button data-no="{{:no}}" role="button" 
						class="delete ui-button ui-state-default ui-button-text-only">
					<span class="ui-button-text">삭제</span>
				</button>
			</td>
		</tr>
	</script>
</body>
</html>

 

 

 

 

1. 새로운 연락처 추가하기

 

 

2. 연락처 수정하기

 

3. 연락처 삭제하기

 

 

반응형

댓글