728x90
반응형

 

 

 

전체적인 화면 구성은 이렇다. 해당 상품을 클릭했을 때 modal창이 떠서 옵션, 수량을 선택할 수 있고 장바구니에 추가하면

 

 

이런식으로 쿠키에 담겨 오른쪽에 나타나게 되고, 우측 하단에 total 금액까지 나와 결제를 하면

 

 

KG이니시스와 연동이되어 결제가 가능하게끔 구현하였다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
728x90
반응형

이미 지금까지 설명해온 글들만 이해가 됐다면,  postNumber(게시물의 개수)를 다루는 법은 정말 쉽다.

 

1. 먼저 클라이언트 쪽에서 보여지는 드롭박스를 만든다.

<select id = "selectpage" name="data-table-default_length" aria-controls="data-table-default" class="custom-select custom-select-sm width-80 mb-2">
	<option class ="postnumber" value="10">10</option>
	<option class ="postnumber" value="25">25</option>
	<option class ="postnumber" value="50">50</option>
	<option class ="postnumber" value="100">100</option>
</select>

 

 

2. 그 다음 클릭 했을 경우의 selected된 값을 가져오고 selectpage 함수에 넘긴다.

$('#selectpage').click(function() {
  selectpage(pagingObject,{
  	option : $('#selectpage option:selected').val()
  })
});

 

 

3. selectpage 함수를 실행하고 마지막에 pagereload 실행

	// 페이지 개수 지정
	function selectpage(Object, jsondata) {
        if(Object.postNum != jsondata.option) {
			Object.postNum = jsondata.option
			pagereload(Object);
		}
    }

 

 

 

 

 

1. 그다음 엑셀 파일 다운로드는 먼저 클라이언트 코드는 이렇다.

<input type="button" class="ml-2 mb-2 btn btn-default" value="Excel" onclick="exceldownload(pagingObject);"/>

 

 

2. exceldownload 함수

function _excelDown(fileName, sheetName, Object, thlist, tdkeylist){
    	
    	const excelarray = Object.array;
    	var thlist = thlist;
    	var tdkeylist = tdkeylist;
    	
    	
			var html = ''; html += '<html xmlns:x="urn:schemas-microsoft-com:office:excel">';
			html += ' <head>';
			html += ' <meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';
			html += ' <xml>';
			html += ' <x:ExcelWorkbook>';
			html += ' <x:ExcelWorksheets>';
			html += ' <x:ExcelWorksheet>';
			html += ' <x:Name>' + sheetName + '</x:Name>';
			html += ' <x:WorksheetOptions><x:Panes></x:Panes></x:WorksheetOptions>';
			html += ' </x:ExcelWorksheet>';
			html += ' </x:ExcelWorksheets>';
			html += ' </x:ExcelWorkbook>';
			html += ' </xml>';
			html += ' </head>';
			html += ' <body>';
			// ----------------- 시트 내용 부분 -----------------
			
    			html += "<table >";
    			html +=		"	<thead>";
    			html +=		"		<tr>";
    			for ( var i = 0; i < thlist.length; i ++) {
    			    html += "<th>";
        			html += thlist[i];
        			html += "</th>";
    			}
    			
    			html += "</tr>";
    			html +=		"	</thead>";
    			html +=		"	<tbody>";
    			
    			
    			for (var i = 0; i < Object.array.length; i ++) {
    				html +=		"		<tr>";
    				for(var j = 0; j < tdkeylist.length; j ++) {
    				html +=		"		<td>";
    				if(tdkeylist[j] == "CA")
    				{
    					html +=	moment(Object.array[i][tdkeylist[j]]).format('YYYY-MM-DD');
    				}
    				else if(tdkeylist[j] == "PD") {
    					if (parseInt(Object.array[i].PD/60)==0)
							html += ((Object.array[i][tdkeylist[j]])%60)+"s";
						else 
							html += parseInt((Object.array[i][tdkeylist[j]])/60)+"m "+(parseInt(parseInt(Object.array[i][tdkeylist[j]])%60))+"s"
    				}
    				else 
    				{
    					html +=	Object.array[i][tdkeylist[j]];
    				}
    				html +=		"		</td>"   ;
    				}
    				html +=		"		</tr>";
    			}
    			html +=		"	</tbody>";
    			html +=		"</table>";
// 			}
			
			//시트 내용 부분 -----------------
			html += ' </body>'; html += '</html>';
			// 데이터 타입
			var data_type = 'data:application/vnd.ms-excel';
			var ua = window.navigator.userAgent; var blob = new Blob([html], {type: "application/csv;charset=utf-8;"});
			
			if ((ua.indexOf("MSIE ") > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) && window.navigator.msSaveBlob)
			{ // ie이고 msSaveBlob 기능을 지원하는 경우
				navigator.msSaveBlob(blob, fileName);
			}
			else { // ie가 아닌 경우 (바로 다운이 되지 않기 때문에 클릭 버튼을 만들어 클릭을 임의로 수행하도록 처리)
				var anchor = window.document.createElement('a');
				anchor.href = window.URL.createObjectURL(blob);
				anchor.download = fileName; document.body.appendChild(anchor); anchor.click();
				// 클릭(다운) 후 요소 제거
				document.body.removeChild(anchor);
			}
		}
		
function exceldownload(Object)
{ // 대상 테이블을 가져옴
    var table = document.getElementById("data-table-combine");
    if(table){ // CASE 대상 테이블이 존재하는 경우
    
    
        
        var thlist = []; // th 들어갈 배열
        var tdkeylist = []; // tr을 추출하기위해 배열의 식별 값을 가져옴
        
        for(var i = 0; i < $('#memDiv1 th').length; i ++) {
            if($('#memDiv1 th').eq(i).text() != "") {
                thlist.push($('#memDiv1 th').eq(i).text())
                tdkeylist.push($('#memDiv1 th').eq(i).attr('name'))
            }
        }
        
        // 엑셀다운 (엑셀파일명, 시트명, 내부데이터HTML)
        _excelDown("oasis_excel.xls", "Sheet", Object, thlist, tdkeylist)
    }
    
}

 

현재 보여지는 리스트들만 담아서 데이터를 엑셀로 다운로드 받을 수 있게끔 하였다.

728x90
반응형
728x90
반응형

1. 먼저 클라이언트 쪽에서 이전에 올렸던 carlist_condition 부분을 참고하면

insertTr += "<th width='28%' name='CN'>"+i18nconvert("CN")+"<a href='javascript:sortList(pagingObject,CN);'><i id = 'CN' class='float-right mx-1 fas fa-lg fa-fw m-t-3 ";
	if(Object.sort == "CN-2")
		insertTr += "fa-sort-up'></a></i></th>";
	else if(Object.sort == "CN")
		insertTr += "fa-sort-down'></a></i></th>";
	else 
		insertTr += "fa-sort'></a></i></th>";

 

 

 

이런식으로 sort 값에 따라 텍스트 옆에 화살표 모양이 바뀌는것을 설정해 둔 후 ( 정렬할 텍스트를 클릭할 경우 )

sort에 "-2" 텍스트를 추가하여 -2가 있을 경우 백엔드에서 거꾸로 sort 해주게끔 설계하였다.

 

 

2. sortList 함수 실행 후 pagereload 함수를 실행하여 백엔드에서 받아온 데이터를 리스트에 뿌려주게끔 하였다.

// 정렬 기능
function sortList(Object, sort) {
	var pagelist = Object.array;
	var sortPlus = sort.id;
	
	if(document.getElementById(sort.id).classList.contains('fa-sort-down')) {
 		var sortPlus2 = sortPlus + "-2";
	}
	else {
 		var sortPlus2 = sortPlus;
	}
	
	Object.array = pagelist;
	Object.sort = sortPlus2;
	pagereload(Object);
}

 

 

728x90
반응형
728x90
반응형

 

pagingObject에 있던 속성들 중

searchtext 검색 옵션(문자)
searchdate 검색 옵션(날짜)
search 검색 옵션

이 값들 위주로 검색을 구현한다.

 

 

1. 먼저 클라이언트 쪽에선 위에 화면구성에서 보여준 것과 같이 날짜에 관한 텍스트. 검색 옵션에 관한 드롭다운, 검색 내용이들어갈 input, 검색 버튼이 들어가게 구성한다.

 

<div class="search-box mt-2 mb-3 py-3 px-3 d-flex justify-content-between align-items-center bg-light">
  <div id ="searchdatetext" class ="d-flex justify-content-between align-items-center">
      <input type="date" id = "searchdatetext1" class ="form-control form-control-sm" placeholder ="" />
      &nbsp;&nbsp;~&nbsp;&nbsp;
      <input type="date" id = "searchdatetext2" class ="form-control form-control-sm" placeholder ="" />
  </div>
    <div class="d-flex justify-content-between align-items-center">
      <div class ="mr-2">
        <div class="btn-group m-r-5">
          <a id="searchoption" href="javascript:;" class="btn btn-sm btn-white">{{__('search')}}</a>
          <a href="#" data-toggle="dropdown" class="btn btn-sm btn-white dropdown-toggle" aria-expanded="false"><b class="caret"></b></a>
        <div class="dropdown-menu dropdown-menu-right">
          <a href="javascript:searchoption('ANA',pagingObject,{ANA : 'ANA',CN : 'CN',CPN : 'CPN'});" class="dropdown-item">{{__('agent_branch')}}</a>
          <a href="javascript:searchoption('CN',pagingObject,{ANA : 'ANA',CN : 'CN',CPN : 'CPN'});" class="dropdown-item">{{__('car_number')}}</a>
          <a href="javascript:searchoption('CPN',pagingObject,{ANA : 'ANA',CN : 'CN',CPN : 'CPN'});" class="dropdown-item">{{__('car_customer_phone')}}</a>
        </div>
      </div>
    </div>

    <div class="mr-2">
    	<input  id ="searchtext" type="text" class="w-100 form-control form-control-sm" placeholder ="" />
    </div>
    <div>
    	<button id ="searchbutton" class="btn btn-sm btn-primary text-white" onclick="searchtext(pagingObject)"><i class="mx-1 fas fa-lg fa-fw fa-search align-items-center"></i></button>
    </div>
    <a href='javascript:;' id ="gotolist" onclick=gotolist(pagingObject) class='d-none ml-1 btn btn-sm btn-primary mr-1 px-2'>{{__('all')}}</a>
  </div>
</div>

 

 

2. 그 다음 searchtext를 아이디로 갖는 부분에 keyup함수를 써서 key.keyCode가 13일 경우( 엔터를 눌렀을 경우 ) 검색이 이루어지게끔 한다. ( 버튼을 눌렀을 경우와 동일 )

	$('#searchtext').keyup(function(key) {
			if(key.keyCode == 13) {
				searchtext(pagingObject)
			}
		});

 

 

3. 검색 옵션을 지정했을 경우에 Object의 search 옵션을 바꿔주고, 버튼을 누르거나 엔터 키를 입력했을 경우에는

입력 했던 곳들의 value를 가져와서 pagereload를 실행하고, 백엔드에서 옵션별로 데이터를 다시 가져오게 된다.

	//검색 옵션 지정
	function searchoption(opt,Object,jsondata) {
    	Object.search = opt;
    	$("#searchoption").empty();
    	
    	var string = "";
    	
    	for (var item in jsondata) {
    		if (opt === item) {
    			string = i18nconvert(item);
    		}
    	}
    	$("#searchtext").val('');
    	$("#searchoption").append(string);
    	$("#searchoption").show();
    }
    
    //검색기능
    function searchtext (Object) {
		if(Object.search == "" && $('#searchtext').val() != "") {
			alert(i18nconvert('search_option_error'));
		}
		else{
	    	if(($('#searchdatetext1').val() != "") && ($('#searchdatetext2').val() != "")) {
				Object.searchtext = $('#searchtext').val();
				Object.searchdate ="";
	    		Object.searchdate += $('#searchdatetext1').val();
	    		Object.searchdate += "~";
	    		Object.searchdate += $('#searchdatetext2').val();
				pagereload(Object);
				document.getElementById('gotolist').classList.remove('d-none');
			}
			else {
				Object.searchtext = $('#searchtext').val();
				pagereload(Object);
				document.getElementById('gotolist').classList.remove('d-none');
			}
		}
	}

 

 

※ 이전에 게시했던 car list 백엔드 라우터 ( searchCNU는 미들웨어에서 이 사이트에서 필요한 내용을 실행한 것이므로 무시하고 원하는 데이터를 얻을 수 있게끔 하시면 됩니다. )

//car list
router.post('/car_list', isNotLoggedIn, DataSet, agentDevide, async function(req, res, next) {
  const CNU = req.body.CNU;
  var sort = req.body.sort;
  var search = req.body.search;
  var searchtext = req.body.searchtext;
  var searchdate = req.body.searchdate;
  var sortText = "";
  var sortNum = 0;
  var cars = new Object;
  
  // company list에서 접속한 것인지 확인
  if(CNU.includes("#") == true) {
    req.searchCNU = CNU.split("#")[0]; // '#' 을 잘라
  }
  else {
    req.searchCNU = req.searchCNU; // 기존 middleware에서 받아온 본사,지점 CNU 그대로 다시 담음
  }
  
  // 정렬 기능
  if(sort.includes('-') == true) {
    sortText = sort.split('-')[0];
    sortNum = 1;
  }
  else {
    sortText = sort;
    sortNum = -1;
  }
  
  try {
    
    var doc = {
      lookup : { from : "Company", localField : "CNU", foreignField : "CNU", as : "ANA" } ,
      unwind : "$ANA",
      match : {},
      project : { CN : '$CN', CPN : '$CPN', CA : '$CA', ANA : '$ANA.ANA' },
      sort : { [sortText]: sortNum }
    }
    
    if(cars.length == 0) {
        return res.send({ result : "nothing" });
      }
    else {
      if (searchdate) {
      var searchtext2 = searchdate.split("~");
        if(search == "ANA") {
          doc.match = { "CNU": { $regex: req.searchCNU }, "ANA.ANA" : {$regex:searchtext}, "CA" : { $gte: new Date(searchtext2[0]+"T00:00:00.000Z"), $lt: new Date(searchtext2[1]+"T23:59:59.999Z") } };
        }
        else if(search == "CN") {
          doc.match = { "CNU": { $regex: req.searchCNU }, "CN" : {$regex:searchtext}, "CA" : { $gte: new Date(searchtext2[0]+"T00:00:00.000Z"), $lt: new Date(searchtext2[1]+"T23:59:59.999Z") } };
        }
        else if(search == "CPN") {
          doc.match = { "CNU": { $regex: req.searchCNU }, "CPN" : {$regex:searchtext}, "CA" : { $gte: new Date(searchtext2[0]+"T00:00:00.000Z"), $lt: new Date(searchtext2[1]+"T23:59:59.999Z") } };
        }
        else {
          doc.match = { "CNU": { $regex: req.searchCNU }, "CA" : { $gte: new Date(searchtext2[0]+"T00:00:00.000Z"), $lt: new Date(searchtext2[1]+"T23:59:59.999Z") } } ;
        }
      }
      else {
          if(search == "ANA") {
            doc.match = { "CNU": { $regex: req.searchCNU }, "ANA.ANA" : {$regex:searchtext} };
          }
          else if (search =="CN") {
            doc.match = { "CNU": { $regex: req.searchCNU }, "CN" : {$regex:searchtext} };
          }
          else if (search =="CPN") {
            doc.match = { "CNU": { $regex: req.searchCNU }, "CPN" : {$regex:searchtext} };
          }
          else {
            doc.match ={ "CNU": { $regex: req.searchCNU } };
          }
      }
    }
  
    cars = await modelQuery(QUERY.Aggregate,COLLECTION_NAME.Car,doc,{});
    if(cars.length == 0) {
      return res.send({ result : "nothing" });
    }
    
    var carlist = [];
    if(cars.length) {
      for(var i = 0; i < cars.length; i ++) {
        carlist[i] = cars[i];
      }
    }
    
    res.send({ result: true, pagelist : carlist });
  
  } catch(err) {
    console.error(err);
    next(err);
  }
});
728x90
반응형
728x90
반응형

 

 

페이지가 처음 렌더링 될 때, pagereload( 아래 링크 참조 )함수가 실행되고, DB에서 전체 리스트를 가져온다고 했었다.

이 리스트들은 미리 만들어준 Object 객체에 전달하게 된다.

https://typo.tistory.com/39?category=890054

 

Node.js , JQuery | 테이블 만들기 | 데이터 조회

1. html 코드는 간단하다.  thead와 tbody에 id를 준 뒤에 내용이 바뀔 때마다 pagereload를 실행하도록 하였다. 2. script쪽에서 먼저 pagereload함수를 페이지가 켜지자마자 실행되도록 한다. 이전에 선언한

typo.tistory.com

 

 

- pagingObject

var pagingObject = new Object({name : "Car",url : "/ajax/car_list", CNU : "{{company.CNU}}", array : [], sort : "CA", page : 0, postNum : 10, pageNum : 5, startpage : 0, endpage : 0, search: "", searchtext : "", searchdate : ""});

 

name 사용할 스키마의 이름
url Ajax URL
CNU 사업자번호( 페이징과 무관)
array 백엔드에서 가져온 list
sort 정렬 옵션
page 현재 페이지 번호
postNum 게시될 데이터의 갯수
pageNum 게시될 페이지번호의 갯수
startpage 시작 페이지
endpage 끝 페이지
search 검색 옵션
searchtext 검색 옵션(문자)
searchdate 검색 옵션(날짜)

 

 

1. 먼저 위에 써있는거와 같이 Object에 관한 내용들의 초깃값을 정하고 인스턴스를 만들어준다.

그다음 데이터조회 글에서 다루었던 것과 같이 pagereload가 실행된다.

pagereload 함수에서 리스트의 내용이 달라질 때마다 화살표 사이의 숫자들이 바뀌게끔 해주는

구문이 있다.

insertTr +=	"<a href='javascript:;' onclick=pageDoubleBtn('left',pagingObject,'basic') class='btn btn-primary mr-1 px-2'><i class='fas fa-angle-double-left'></i></a>";
insertTr +=	"<a href='javascript:;' onclick=pageBtn('left',pagingObject,'basic') class='btn btn-primary mr-1 px-2'><i class='fas fa-angle-left'></i></a>";

for(var i = Object.startpage; i < Object.endpage; i ++) {
	if(Object.page == i) // 그 번호가 맞으면 색상을 넣어준다.
		insertTr +=	"<input type='button' onclick=pagebutton(pagingObject,"+ i +",'basic') value ='"+ (i+1) +"' class='btn btn-white mr-1 px-2 text-primary' style='background-color: #00acac; color: white !important;' >";
	else
		insertTr +=	"<input type='button' onclick=pagebutton(pagingObject,"+ i +",'basic') value ='"+ (i+1) +"' class='btn btn-white mr-1 px-2 text-primary' >";
}
insertTr +=	"<a href='javascript:;' onclick=pageBtn('right',pagingObject,'basic') class='btn btn-primary mr-1 px-2'><i class='fas fa-angle-right'></i></a>";
insertTr +=	"<a href='javascript:;' onclick=pageDoubleBtn('right',pagingObject,'basic') class='btn btn-primary mr-1 px-2'><i class='fas fa-angle-double-right'></i></a>";

 

onclick 부분을 자세히 보면 결국은 pageDoubleBtn(), pageBtn(), pagebutton() 이 세가지 함수에 다 엮여있는 것을 볼 수 있다. 우리에게 필요한 조건은 아래와 같다.

   1) 번호를 직접 눌렀을 경우

   2) < 또는 > 버튼을 클릭했을 경우

   3) << 또는 >> 버튼을 클릭했을 경우

 

번호에 맞게 함수를 만들어준다. 페이지네이션을 할 때 pagingObject에서의 array는 바뀌는 값이 없다. 즉 백엔드와 통신을 할 필요가 없이 클라이언트 쪽에서만 이루어지기에 훨씬 빠르게 할 수 있다.

 

 

 // 페이지 기능
	function pagebutton(Object, num, kind) {
		Object.page = num;
		pagereload(Object);
    }
    
    // 다음 페이지 기능
    function pageBtn(dir, Object, kind) {
		if(dir == 'left') {
			if((Object.page - 1) > -1)
			{
				Object.page -= 1;
				pagereload(Object);
			}
		}
		if(dir == 'right') {
			if((Object.page + 1) < Math.ceil(Object.array.length / Object.postNum))
			{
				Object.page += 1;
				pagereload(Object);
			}
			
		}
	}
	
	// <<, >> 버튼 기능
	function pageDoubleBtn(dir, Object, kind) {
		if(dir == 'left') {
			if((Object.page - Object.pageNum) < 0) {
				Object.page = 0;
				pagereload(Object);
			}
			else {
				Object.startpage -= 1;
				Object.page -= 5;
				pagereload(Object);
			}
		}
		if(dir == 'right') {
			
			if ((Object.page + Object.pageNum) >= Math.ceil(Object.array.length / Object.postNum))
			{
				Object.page = Math.ceil(Object.array.length / Object.postNum)-1;
				pagereload(Object);
			}
			else {
				Object.startpage += 1;
				Object.page += 5;
				pagereload(Object);
			}
		}
	}

 

이런 식으로 시작점과 끝점일 때의 조건문을 넣어주면 완성 !

결국은 전체 리스트는 array에 담겨있기 때문에 어떤 시작점에서부터 몇개를 보여줄지만 설정해주면 된다.

 

 

 

 

 

 

728x90
반응형
728x90
반응형

전 글은 데이터를 한개만 삭제를 했을 경우이다.

이번에는 checkbox 선택으로 여러개를 삭제했을 경우를 설명하겠다.

 

1. checkbox 또한 전 글처럼 carlist_condition을 참조하여 HTML 코드를 확인해준다.

    먼저 각 개체 별 checkbox는 이렇다.

insertTr += "<td class='with-btn' nowrap>";
insertTr += "<input id='ck' type='checkbox' name ='ck' class='neHeros' value="+  Object.array[i].CN +" onChange='eachCheckedBox(this);'/>";
insertTr += "</td>";

   

    다음 전체 checkbox 코드는 이렇다.

insertTr += "<th id ='allcheck' width='1%'>";
insertTr += "<input type='checkbox' name='allck' class='neHeros' value='' onChange='allCheckedBox(this);'/>";
insertTr += "</th>";

 

 

2. 위 코드를 보면 onChange 함수에 eachCheckedBox, allCheckedBox 함수가 있는걸 볼 수 있다.

    아래 코드와 같이 각 checkbox별로 checked 옵션을 바꿔줄 수 있다.

// 전체 선택 기능
	function allCheckedBox(obj) {
	   	// @brief ��택한 체크박스의 클래스 명칭을 가져온다.
	   	const termClass = obj.getAttribute("class");
	   	// @brief 선택한 클래스명과 같은 클래스의 갯수
	   	Array.prototype.forEach.call(document.getElementsByClassName(termClass), function(element, index, array) {
	        // @brief 엘리먼트의 값 출력
	        // @brief 선택한 클래스의 첫번째 checkbox의 상태가 체크가 되있는 경우
	        if(document.getElementsByClassName(termClass)[0].checked == true) {
	            // @brief 같은 클래스명을 가진 모든 checkbox의 상태를 선택 완료 처리 한다.
	            element.checked = true;
	        }
	        // @brief 선택한 클래스의 첫번째 checkbox의 상태가 체크가 해제된 경우
	        else {
	            // @brief 같은 클래스명을 가진 모든 checkbox의 상태를 선택 해제 처리 한다.
	            element.checked = false;
	        }
	   	});
    }

	// 항목 선택 기능
	function eachCheckedBox(obj) {
      // @brief 선택한 체크박스의 상태가 선택해제인 경우
      if(obj.checked == false) {
            // @brief 선택한 체크박스의 클래스 명칭을 가져온다.
            const termClass = obj.getAttribute("class");
            // @brief 첫번째 checkbox의 상태가 체크가 되어있는경우
            if(document.getElementsByClassName(termClass)[0].checked == true) {
                // @brief 첫번째 checkbox의 상태를 체크해제한다.
                document.getElementsByClassName(termClass)[0].checked = false;
            }
        }
    }

 

 

3. 그 다음 checked 된 내용들을 불러와 ajax에 담고 백엔드에 데이터를 전송한다.

	// 선택항목 삭제 기능
	function delete_check(url) {
		var check = $("input:checkbox[name='ck']").is(":checked");
		if(!check) {
			alert(i18nconvert('choiceerror'));
		}
		else {
			var select_obj = [];
	        $('input[name="ck"]:checked').each(function (index) {
	                select_obj[index] = $(this).val() ;
	        });
			var answer;
	    		answer = confirm(i18nconvert('deleteconfirm'));
			if(answer == true){
				$.ajax({
		    		url: url,
                    type: "POST",
                    dataType: 'json',
                    data: {
                    	select : select_obj,
                    }
		    	}).done(function (data) {  
					if(data.result == 'success') {
						alert(i18nconvert('deletesuccess'));
						location.reload();
					}
					else {
						alert(i18nconvert('choiceerror'));
					}
		    	});
			}
			else {
				$("input:checkbox[name='allck']").prop("checked", false);
				$("input:checkbox[name='ck']").prop("checked", false);
				return false;
			}
		}
	}

 

 

4. 백엔드에서 받은 데이터를 이용해 해당 데이터들을 삭제한다.

//차량 선택삭제
router.post('/ajax/car_delete', isNotLoggedIn ,async (req, res, next) => {
    var select = req.body["select[]"];
    // const CID = req.decoded.CID;
    const CNU = req.decoded.CNU;
    const CUA = moment().format('YYYY-MM-DD hh:mm:ss');
    try {
        if(!select) {
          res.send({ result : 'fail' });
        }
        else {
          if (typeof(select) == 'string') {
            const carone = await modelQuery(QUERY.Findone,COLLECTION_NAME.Car,{ "CNU" : CNU, "CN" : select },{});
            await modelQuery(QUERY.Create,COLLECTION_NAME.Cardelete,{
                "CNU" : carone.CNU,
                "CN" : carone.CN,
                "CPN" : carone.CPN,
            },{});
            await modelQuery(QUERY.Remove,COLLECTION_NAME.Car,{ "CNU" : CNU, "CN" : select },{});
          }
          else {
             for(var i = 0; i < select.length; i++){
                var carone = await modelQuery(QUERY.Findone,COLLECTION_NAME.Car,{ "CNU" : CNU, "CN" : select[i] },{});
                await modelQuery(QUERY.Create,COLLECTION_NAME.Cardelete,{
                    "CNU" : carone.CNU,
                    "CN" : carone.CN,
                    "CPN" : carone.CPN,
                },{});
                await modelQuery(QUERY.Remove,COLLECTION_NAME.Car,{ "CNU" : CNU, "CN" : select[i] },{});
             }
          }
          
          await modelQuery(QUERY.Update,COLLECTION_NAME.Company,{where : { "CNU" : CNU }, update : { "CUA" : CUA }},{});
            
          res.send({ result : 'success' });
        }
    } catch (err) {
      res.send({ result : 'fail' });
      console.error(err);
      next(err);
    }
});
728x90
반응형
728x90
반응형

삭제버튼을 눌렀을 경우 삭제를 확인하는 alert를 띄어준 후, 확인버튼을 눌렀을 경우

백엔드에 데이터를 전송하고 DB쿼리문으로 해당 데이터를 삭제한다.

 

1. 전 글에서 수정했을 때와 마찬가지로 carlist_condition에 추가된 내용을 참조한다.

insertTr += "<input type='button' value='"+i18nconvert("delete")+"' onclick=delete_one(this,'/car/ajax/car_deleteone') class='btn btn-sm btn-white width-60' name =' "+  Object.array[i].CN +"'></td> ";

 

2. 클릭했을 경우 delete_one 함수를 실행해준다. ( obj는 HTML script에서 선언한 pagingObject이다. )

		
	// 일반 삭제 기능
	function delete_one(obj,url) {
		
		var answer;
	    	answer = confirm(i18nconvert('deleteconfirm'));
		if(answer == true){
			$.ajax({
	    		url: url,
	            type: "POST",
	            dataType: 'json',
	            data: {
	            	select : $(obj).attr('name'),
	            }
	    	}).done(function (data) {  
				if(data.result == 'success') {
					alert(i18nconvert('deletesuccess'));
					location.reload();
				}
				else {
					alert(i18nconvert('choiceerror'));
				}
	    	});
		}
		else {
			return false;
		}
	}

 

 

3. 백엔드에서 받은 데이터를 이용해 DB쿼리문으로 해당 데이터를 삭제해준다.

router.post('/ajax/car_deleteone', isNotLoggedIn, async (req, res, next) => {
  var select = req.body["select"];
  // const CID = req.decoded.CID;
  const CNU = req.decoded.CNU;
  const CUA = moment().format('YYYY-MM-DD hh:mm:ss');
  
  try {
    const carone = await modelQuery(QUERY.Findone,COLLECTION_NAME.Car,{ "CNU" : CNU, "CN" : select.split(' ') },{});
    await modelQuery(QUERY.Create,COLLECTION_NAME.Cardelete,{
      "CNU" : carone.CNU,
      "CC" : carone.CC,
      "CPN" : carone.CPN,
    },{});
    await modelQuery(QUERY.Remove,COLLECTION_NAME.Car,{ "CNU" : CNU, "CN" : select.split(' ') },{});
    await modelQuery(QUERY.Update,COLLECTION_NAME.Company,{where : {"CNU" : CNU}, update : { "CUA" : CUA }},{});
      
    res.send({ result : 'success' });
  } catch (err) {
    res.send({ result : 'fail' });
    console.error(err);
    next(err);
  }
});
728x90
반응형
728x90
반응형

수정하고자 하는 데이터 옆에 수정 버튼을 누르면 아래에 수정하고자 하는 내용이 생기고, 수정 버튼을 누르면

ajax로 백엔드에 필요한 데이터를 송신한다.

 

1. 전 글에서 만들어준 carlist_condition에서 수정버튼이 생성되는데, 이때 onclick으로 이어진 car_editone을 실행해준다.

 

carlist_condition

insertTr += "<a href='javascript:;' id = 'carid' onclick='car_editone(this);' data-type='show' name='"+ Object.array[i]._id +"' data-carnum='"+ Object.array[i].CN +"' class='btn btn-sm btn-primary width-60 m-r-2 edit-btn'>"+i18nconvert("modify")+"</a>";

 

 

car_editone

	// 차량 - 수정 나타내기
	function car_editone(obj) {
		var type = $(obj).data().type;
		var exCN = $(obj).data().carnum;
		console.log(exCN);
		$('.tr-edit').empty();
		$(obj).parents('tr').siblings().find('.edit-btn').text(i18nconvert("modify"));
		$(obj).parents('tr').siblings().find('.edit-btn').removeData().type;
		$(obj).parents('tr').siblings().find('.edit-btn').data('type', 'show');
		if(type == "show") {
			var car_id = $(obj).attr('name');
			if (car_id) {
				$.ajax({
					type: 'POST',
					url: '/car/ajax/car_list_edit1',
					dataType: 'json',
					data: {
						car_id: car_id
					}
				}).done(function(data) {
					if(data.result == 'success') {
						var carone = data.carone[0];
						var insertTr  = "";
						$(obj).text(i18nconvert("modify"));
						$(obj).removeData().type;
						$(obj).data('type', 'hide');
						insertTr += "<tr class='tr-edit'>";
						insertTr += "<td colspan='8'>";
					    insertTr += "<div class='panel-body'>";
						insertTr +=	"<form id='car-edit-form' action='' method='post' data-parsley-validate='true'>";
						insertTr +=	"<div class='form-group row m-b-15'>";
						insertTr +=	"<label class='col-md-4 col-sm-4 col-form-label' for='CN'>"+i18nconvert("CN")+" <span class='text-danger'>*</span> :</label>";
						insertTr +=	"<div class='col-md-8 col-sm-8'>";
						insertTr +=	"<input class='form-control' id='CN' type='text' name = 'CN' value='"+exCN+"'  placeholder='"+i18nconvert("CN")+"' data-parsley-required='true' />";
						insertTr += "<input type='hidden' name='exCN' value='"+exCN+"' />"
						insertTr +=	"</div>";
						insertTr +=	"</div>";
						insertTr +=	"<div class='form-group row m-b-15'>";
						insertTr +=	"<label class='col-md-4 col-sm-4 col-form-label' for='CN'>"+i18nconvert("CPN")+" :</label>";
						insertTr +=	"<div class='col-md-8 col-sm-8'>";
						insertTr +=	"<input class='form-control' id='CPN' type='text' name = 'CPN'  placeholder='"+i18nconvert("CPN")+"' />";
						insertTr +=	"<input class='form-control' id='car_id' type='hidden' name = 'car_id' value='"+carone._id+"'/>";
						insertTr +=	"</div>";
						insertTr +=	"</div>";
						insertTr +=	"<div class='d-flex justify-content-center align-items-center'>";
						insertTr +=	"<a href='javascript:;' onclick='carEdit(pagingObject);' class='btn btn-primary width-80 mx-2'>"+i18nconvert("modify")+"</a>";
						insertTr +=	"<button type='reset' class='btn btn-primary width-80 mx-2'>"+i18nconvert("reset")+"</button>";
						insertTr +=	"</div>";
						insertTr +=	"</form>";
						insertTr +=	"</div>";
						insertTr += "</td></tr>";
						$(obj).parents('tr').after(insertTr);
					}
					else {
						alert("{{__('modify_failed')}}");
					}
				});
			}
			else {
				alert("{{__('modify_failed')}}");
			}
		}
		else {
			$(obj).text(i18nconvert("modify"));
			$(obj).removeData().type;
			$(obj).data('type', 'show');
			$('.tr-edit').remove();
		}
	}
	
	// 차량 - 데이터 수정
	function carEdit(Object) {
		$.ajax({
			type: 'POST',
			url: '/car/ajax/car_list_edit2',
			dataType: 'json',
			data: {
				exCN : $('input[name=exCN]').val(),
				CN : $('#car-edit-form [name="CN"]').val(),
				CPN : $('#car-edit-form [name="CPN"]').val(),
				CNU : Object.CNU,
				car_id : $('#car-edit-form [name="car_id"]').val()
			}
		}).done(function(data) {
			if(data.result == 'success') {
				$('.tr-edit').remove();
				pagereload(Object);
				alert(i18nconvert("car_modify_success"));
			}
			else if(data.result == 'length') {
				alert(i18nconvert("car_length_error"));
			}
			else if(data.result == 'type') {
				alert(i18nconvert("car_type_error"));
			}
			else if(data.result == 'exist') {
				alert(i18nconvert("car_exist_error"));
			}
			else if(data.result == 'numErr') {
				alert(i18nconvert("register_digits_error"));
			}
			else {
				alert(i18nconvert("modify_failed"));
			}
		});
		
	}

 

 

2. 백엔드에서 받아온 데이터로 DB쿼리문을 실행한다.

// 수정 - 브라우저 나타내기
router.post('/ajax/car_list_edit1', isNotLoggedIn, async(req, res, next) => {
  const { car_id } = req.body;
  
  var ObjectId = Mongoose.Types.ObjectId;
  const carone = await modelQuery(QUERY.Find,COLLECTION_NAME.Car,{ _id : ObjectId(car_id) },{});
  
  res.send({ result : "success", carone : carone });
});

// 수정 - 데이터 수정
router.post('/ajax/car_list_edit2', isNotLoggedIn, async(req, res, next) => {
  const { exCN, CN, CPN, CNU, car_id } = req.body;
  
  const exCar = await modelQuery(QUERY.Findone,COLLECTION_NAME.Car,{ "CNU" : CNU, "CN" :  CN },{});
  const check = /^[0-9]{2,3}[가-힣]{1}[0-9]{4}/gi;
  const numCheck = /^[0-9]*$/;
  const CUA = moment().format('YYYY-MM-DD hh:mm:ss');
  try{
    if (CN.length >= 7 && CN.length <= 8) {
      check.lastIndex = 0;
      if (check.test(CN) == true) {
        
        if(!exCar) {
          if(numCheck.test(CPN) == true) {
              await modelQuery(QUERY.Update,COLLECTION_NAME.Car, {where : { "_id" : car_id } , update : {
                "CNU" : CNU,
                "CN" : CN,
                "CPN" : CPN,
              }},{});
              await modelQuery(QUERY.Update,COLLECTION_NAME.Company,{where : { "CNU" : CNU }, update : {"CUA" : CUA}},{});
              
            return res.send({ result : "success" });
          }
          else {
            return res.send({ result : "numErr" });
          }
        }
        else {
          if(exCN == CN) {
            await modelQuery(QUERY.Update,COLLECTION_NAME.Car, {where : { "_id" : car_id } , update : {
              "CNU" : CNU,
              "CN" : CN,
              "CPN" : CPN,
            }},{});
            await modelQuery(QUERY.Update,COLLECTION_NAME.Company,{where : { "CNU" : CNU }, update : {"CUA" : CUA}},{});
            
            return res.send({ result : "success" });
          }
          else {
            return res.send({ result : 'exist' });
          }
        }
      }
      else {
        return res.send({ result : 'type' });
      }
    }
    else {
      return res.send({ result : 'length' });
    }
  }catch(err) {
    res.send({ result : "fail" });
    console.error(err);
    next(err);
  }
});
728x90
반응형
728x90
반응형

1. html 코드는 간단하다.
   thead와 tbody에 id를 준 뒤에 내용이 바뀔 때마다 pagereload를 실행하도록 하였다.

<table id="data-table-combine" class="table table-striped table-bordered table-hover table-td-valign-middle text-center">
  <thead id="memDiv1">
  </thead>
  <tbody id="memDiv2">
  </tbody>
</table>

 

 

2. script쪽에서 먼저 pagereload함수를 페이지가 켜지자마자 실행되도록 한다. 이전에 선언한 pagingObject를 인자로 담고 인자에 따라 리스트가 표시되도록 설정했다.( 어느 schema를 조회할지, 어떤 url로 보낼것인지 등)

var pagingObject = new Object({name : "Car",url : "/ajax/car_list", CNU : "{{company.CNU}}", array : [], sort : "CA", page : 0, postNum : 10, pageNum : 5, startpage : 0, endpage : 0, search: "", searchtext : "", searchdate : ""});

$(document).ready(function() {
		pagereload(pagingObject); // 첫 화면 페이지 로드
    });

 

- pagingObject

name 사용할 스키마의 이름
url Ajax URL
CNU 사업자번호( 페이징과 무관)
array 백엔드에서 가져온 list
sort 정렬 옵션
page 현재 페이지 번호
postNum 게시될 데이터의 갯수
pageNum 게시될 페이지번호의 갯수
startpage 시작 페이지
endpage 끝 페이지
search 검색 옵션
searchtext 검색 옵션(문자)
searchdate 검색 옵션(날짜)

 

 

3. pagereload 함수는 변경사항이 있을 때마다 (검색하거나 정렬하거나 페이지가 바뀌거나 등) 실행이 될것이며, 그 때마다 리스트의 내용을 바꿔주는 함수이다.

function pagereload(Object) {
			$("input:checkbox[name='allck']").prop("checked", false);
			$("input:checkbox[name='ck']").prop("checked", false);
    	    $.ajax({
	    		url: Object.url,
                type: "POST",
                async: false,
                dataType: 'json',
                data: {
                	CID : Object.CID,
                	CNU : Object.CNU,
                    sort : Object.sort,
                    search : Object.search,
                    searchtext : Object.searchtext,
                    searchdate : Object.searchdate
                }
	        }).done(function (data) {
	        	if(data.result == true) {
	    		    Object.array = data.pagelist; // 전체 리스트
	    		    Object.startpage = Math.floor((Object.page) / Object.pageNum) * Object.pageNum;
	    		    Object.endpage = Object.startpage + Object.pageNum;
	    		    
	    		    var postNum = Object.postNum; // 게시될 페이지 숫자
	    		    var pageNum = Object.pageNum; // 페이지 번호의 갯수
	    		    var totalPage = Math.ceil(Object.array.length/Object.postNum); // 전체 페이지의 갯수
	    		    
	    		    if (Object.endpage > totalPage) { // 끝 페이지가 총 페이지 수보다 많다면 같게끔 처리
				        Object.endpage = totalPage;
				    }
	    		    
		        	//tr 초기화
		        	$("#data-table-combine > tbody > tr").remove();
		        	//페이지 넘버 박스 초기화
			     	$("#pagebox *").remove();
			    	
		    		if(Object.name == "Company") {
						companylist_condition(Object);
					
					}
					else if (Object.name == "Car") {
						carlist_condition(Object);
					}
					
					var insertTr = " ";
					insertTr +=	"<a href='javascript:;' onclick=pageDoubleBtn('left',pagingObject,'basic') class='btn btn-primary mr-1 px-2'><i class='fas fa-angle-double-left'></i></a>";
					insertTr +=	"<a href='javascript:;' onclick=pageBtn('left',pagingObject,'basic') class='btn btn-primary mr-1 px-2'><i class='fas fa-angle-left'></i></a>";
					
					for(var i = Object.startpage; i < Object.endpage; i ++) {
						if(Object.page == i)
							insertTr +=	"<input type='button' onclick=pagebutton(pagingObject,"+ i +",'basic') value ='"+ (i+1) +"' class='btn btn-white mr-1 px-2 text-primary' style='background-color: #00acac; color: white !important;' >";
						else
							insertTr +=	"<input type='button' onclick=pagebutton(pagingObject,"+ i +",'basic') value ='"+ (i+1) +"' class='btn btn-white mr-1 px-2 text-primary' >";
					}
					insertTr +=	"<a href='javascript:;' onclick=pageBtn('right',pagingObject,'basic') class='btn btn-primary mr-1 px-2'><i class='fas fa-angle-right'></i></a>";
					insertTr +=	"<a href='javascript:;' onclick=pageDoubleBtn('right',pagingObject,'basic') class='btn btn-primary mr-1 px-2'><i class='fas fa-angle-double-right'></i></a>";
					$("#pagebox").append(insertTr);
					
					$("#pagebox").show();
	        	}
	        	
	        	else if (data.result == "nothing") {
	        		$("#searchtext").val('');
			    	$("#searchdatetext1").val('');
			    	$("#searchdatetext2").val('');
			    	$("#memDiv2").empty();
			    	Object.array = [];
			    	
			    	if(Object.name == "Company") {
						companylist_condition(Object);
					}
					else if (Object.name == "Car") {
						carlist_condition(Object);
					}
					
	        	}
	        	else {
			    	$("#searchdatetext1").val('');
			    	$("#searchdatetext2").val('');
	        	}
			});
    }

 

4. 리스트에 따라 xx_condition 이라는 함수를 만들어서 리스트 내용을 채워준다.

ex}carlist_condition

 // 차량 리스트
    
    var carlist_condition = function (Object) {
		var num =  Object.array.length; 	
		var	insertTr = ""; // 채워넣을 HTML 초기화
		var indexcount = 1; // 인덱스번호 초기화
		
		$("#memDiv1").empty();
	    insertTr += "<tr>";
		insertTr += "<th id ='allcheck' width='1%'>";
		insertTr += "<input type='checkbox' name='allck' class='neHeros' value='' onChange='allCheckedBox(this);'/>";
		insertTr += "</th>";
		insertTr += "<th width='2.5%'></th>";
		insertTr += "<th width='10%' name='ANA'>"+i18nconvert("agent_branch")+"<a href='javascript:sortList(pagingObject,ANA);'><i id = 'ANA' class='float-right mx-1 fas fa-lg fa-fw m-t-3 ";
		if(Object.sort == "ANA-2")
			insertTr += "fa-sort-up'></a></i></th>";
		else if(Object.sort == "ANA")
			insertTr += "fa-sort-down'></a></i></th>";
		else 
			insertTr += "fa-sort'></a></i></th>";
		insertTr += "</th>";
		insertTr += "<th width='28%' name='CN'>"+i18nconvert("CN")+"<a href='javascript:sortList(pagingObject,CN);'><i id = 'CN' class='float-right mx-1 fas fa-lg fa-fw m-t-3 ";
		if(Object.sort == "CN-2")
			insertTr += "fa-sort-up'></a></i></th>";
		else if(Object.sort == "CN")
			insertTr += "fa-sort-down'></a></i></th>";
		else 
			insertTr += "fa-sort'></a></i></th>";
		
		insertTr += "<th width='30%'name='CPN'>"+i18nconvert("CPN")+"<a href='javascript:sortList(pagingObject,CPN);'><i id = 'CPN' class='float-right mx-1 fas fa-lg fa-fw m-t-3 ";
		if(Object.sort == "CPN-2")
			insertTr += "fa-sort-up'></a></i></th>";
		else if(Object.sort == "CPN")
			insertTr += "fa-sort-down'></a></i></th>";
		else 
			insertTr += "fa-sort'></a></i></th>";
			
		insertTr += "<th width='27.5%'name='CA'>"+i18nconvert("CA")+"<a href='javascript:sortList(pagingObject,CA);'><i id = 'CA' class='float-right mx-1 fas fa-lg fa-fw m-t-3 ";
		if(Object.sort == "CA-2")
			insertTr += "fa-sort-up'></a></i></th>";
		else if(Object.sort == "CA")
			insertTr += "fa-sort-down'></a></i></th>";
		else 
			insertTr += "fa-sort'></a></i></th>";
			
		insertTr += "<th width='1%'></th>";
		insertTr += "</tr>";
		
		$("#memDiv1").append(insertTr);
		
		insertTr = "";
		for (var i = ( Object.postNum *  Object.page) ; i < ( Object.postNum *  Object.page) +  Object.postNum ; i ++) { // 현재 페이지의 번호에 맞는 리스트 뽑아서 출력 (0 ~ 9, 10 ~ 19)
			if( Object.array.length != 0) {
				if( Object.array[i]) {
					insertTr += "<tr>";
					insertTr += "<td class='with-btn' nowrap>";
					insertTr += "<input id='ck' type='checkbox' name ='ck' class='neHeros' value="+  Object.array[i].CN +" onChange='eachCheckedBox(this);'/>";
					insertTr += "</td>";
					insertTr += "<td class='font-weight-bold'>"+(num - ( Object.page*10)) +" </td>";
					insertTr += "<td><a href='javascript:;' class='text-black' onclick=searchNow(pagingObject,'ANA','"+ Object.array[i].ANA +"')><u>"+ Object.array[i].ANA +"</u></a></td>";
					insertTr += "<td>"+ Object.array[i].CN+"</td>";
					
					if(! Object.array[i].CPN){
						insertTr+="<td>"+"N/A"+"</td><td>";
					}
					else {
						insertTr += "<td>"+  Object.array[i].CPN+"</td><td>";
					}
					
					if ( (moment( Object.array[i].CA).format('DD')) == moment().format('DD') )
					{
						insertTr +=  moment( Object.array[i].CA).format('HH:mm');
					}
					else {
						insertTr += moment( Object.array[i].CA).format('YYYY-MM-DD');
					}
					insertTr += "</td><td class='with-btn' nowrap>";
					insertTr += "<a href='javascript:;' id = 'carid' onclick='car_editone(this);' data-type='show' name='"+ Object.array[i]._id +"' data-carnum='"+ Object.array[i].CN +"' class='btn btn-sm btn-primary width-60 m-r-2 edit-btn'>"+i18nconvert("modify")+"</a>";
					insertTr += "<input type='button' value='"+i18nconvert("delete")+"' onclick=delete_one(this,'/car/ajax/car_deleteone') class='btn btn-sm btn-white width-60' name =' "+  Object.array[i].CN +"'></td> ";
					insertTr += "</tr>";
					num -= indexcount;
				}
			}
			else {
				insertTr += "<tr>";
				insertTr += "<td colspan='10'>No Data</td>";
				insertTr += "</tr>";
			
			break;
			}
		}
		
		$("#memDiv2").append(insertTr);
	};

 

 

5. 백엔드에서 옵션에 관한 내용들을 받고, 데이터를 클라이언트로 보내준다.

 ( searchCNU는 미들웨어에서 이 사이트에서 필요한 내용을 실행한 것이므로 무시하고 원하는 데이터를 얻을 수 있게끔 하시면 됩니다. )

//car list
router.post('/car_list', isNotLoggedIn, DataSet, agentDevide, async function(req, res, next) {
  const CNU = req.body.CNU;
  var sort = req.body.sort;
  var search = req.body.search;
  var searchtext = req.body.searchtext;
  var searchdate = req.body.searchdate;
  var sortText = "";
  var sortNum = 0;
  var cars = new Object;
  
  // company list에서 접속한 것인지 확인
  if(CNU.includes("#") == true) {
    req.searchCNU = CNU.split("#")[0]; // '#' 을 잘라
  }
  else {
    req.searchCNU = req.searchCNU; // 기존 middleware에서 받아온 본사,지점 CNU 그대로 다시 담음
  }
  
  // 정렬 기능
  if(sort.includes('-') == true) {
    sortText = sort.split('-')[0];
    sortNum = 1;
  }
  else {
    sortText = sort;
    sortNum = -1;
  }
  
  try {
    
    var doc = {
      lookup : { from : "Company", localField : "CNU", foreignField : "CNU", as : "ANA" } ,
      unwind : "$ANA",
      match : {},
      project : { CN : '$CN', CPN : '$CPN', CA : '$CA', ANA : '$ANA.ANA' },
      sort : { [sortText]: sortNum }
    }
    
    if(cars.length == 0) {
        return res.send({ result : "nothing" });
      }
    else {
      if (searchdate) {
      var searchtext2 = searchdate.split("~");
        if(search == "ANA") {
          doc.match = { "CNU": { $regex: req.searchCNU }, "ANA.ANA" : {$regex:searchtext}, "CA" : { $gte: new Date(searchtext2[0]+"T00:00:00.000Z"), $lt: new Date(searchtext2[1]+"T23:59:59.999Z") } };
        }
        else if(search == "CN") {
          doc.match = { "CNU": { $regex: req.searchCNU }, "CN" : {$regex:searchtext}, "CA" : { $gte: new Date(searchtext2[0]+"T00:00:00.000Z"), $lt: new Date(searchtext2[1]+"T23:59:59.999Z") } };
        }
        else if(search == "CPN") {
          doc.match = { "CNU": { $regex: req.searchCNU }, "CPN" : {$regex:searchtext}, "CA" : { $gte: new Date(searchtext2[0]+"T00:00:00.000Z"), $lt: new Date(searchtext2[1]+"T23:59:59.999Z") } };
        }
        else {
          doc.match = { "CNU": { $regex: req.searchCNU }, "CA" : { $gte: new Date(searchtext2[0]+"T00:00:00.000Z"), $lt: new Date(searchtext2[1]+"T23:59:59.999Z") } } ;
        }
      }
      else {
          if(search == "ANA") {
            doc.match = { "CNU": { $regex: req.searchCNU }, "ANA.ANA" : {$regex:searchtext} };
          }
          else if (search =="CN") {
            doc.match = { "CNU": { $regex: req.searchCNU }, "CN" : {$regex:searchtext} };
          }
          else if (search =="CPN") {
            doc.match = { "CNU": { $regex: req.searchCNU }, "CPN" : {$regex:searchtext} };
          }
          else {
            doc.match ={ "CNU": { $regex: req.searchCNU } };
          }
      }
    }
  
    cars = await modelQuery(QUERY.Aggregate,COLLECTION_NAME.Car,doc,{});
    if(cars.length == 0) {
      return res.send({ result : "nothing" });
    }
    
    var carlist = [];
    if(cars.length) {
      for(var i = 0; i < cars.length; i ++) {
        carlist[i] = cars[i];
      }
    }
    
    res.send({ result: true, pagelist : carlist });
  
  } catch(err) {
    console.error(err);
    next(err);
  }
});

 

try catch  문에서 나는 mongoose aggregate라는 쿼리를 사용했지만, 각자 용도에 맞게 쿼리문을 사용하면 된다.

몽고 쿼리에 관한 내용은 차후에 올리도록 하겠다.

728x90
반응형
728x90
반응형

1. 백엔드 쪽에서 데이터를 받고 행해질 내용들을 구현한다.

   또한 성공할 경우, 실패할 경우에 맞는 데이터를 res.send로 반환한다.

//자동차 등록
  // 수기 입력(하나씩) 차량 등록
router.post('/car_join', isNotLoggedIn, async (req, res, next) => {
  const { data } = req.body;
  const jsonData = JSON.parse(data);
  // const CID = req.decoded.CID;
  const CNU = req.decoded.CNU;
  
  try {
    // 차량번호 정규식
    var check = /^[0-9]{2,3}[가-힣]{1}[0-9]{4}/gi;
    // 업체에 등록된 차량
    const exCar = await modelQuery(QUERY.Findone,COLLECTION_NAME.Car,{ "CNU" : CNU, "CN" :  jsonData.CN },{});
      
    if(jsonData.CN.length >= 7 && jsonData.CN.length <= 8) {
      if(check.test(jsonData.CN) == true) {
        if(!exCar) {
          await modelQuery(QUERY.Create,COLLECTION_NAME.Car,{
            "CNU" : CNU,
            "CN" : jsonData.CN,
            "CPN" : jsonData.CPN
          },{});
          
          const CUA = moment().format('YYYY-MM-DD hh:mm:ss');
          await modelQuery(QUERY.Update,COLLECTION_NAME.Company,{where : { "CNU" : CNU }, update : { "CUA" : CUA }},{});
            
          return res.send({ result : 'success', type : 'car' });
        }
        else {
          return res.send({ result : 'exist', type : 'car' });
        }
      }
      else {
        return res.send({ result : 'type', type : 'car' });
      }
    }
    else {
      return res.send({ result : 'length', type : 'car' });
    }
  } catch(err) {
    res.send({ result : "fail" });
    console.error(err);
    next(err);
  }
});
728x90
반응형

+ Recent posts