Stormen123 2023-06-30
20230630 김성훈 노드등록페이지 추가, 라우터추가
@ae3a8b9b85c60ba08b31479ac4af61e1fb1172c4
client/views/component/OpenLayers.vue
--- client/views/component/OpenLayers.vue
+++ client/views/component/OpenLayers.vue
@@ -236,9 +236,9 @@
     setCenterPosition: function (lat, lon, source) {
 
       if (this.baseSource == source) {
-        this.map.getView().setCenter([lat, lon]);
+        this.map.getView().setCenter([lon, lat]);
       } else {
-        this.map.getView().setCenter(transform([lat, lon], source, this.baseSource));
+        this.map.getView().setCenter(transform([lon, lat], source, this.baseSource));
       }
 
     },
@@ -285,11 +285,11 @@
 
       if (this.baseSource !== source) {
         rome = new Feature({
-          geometry: new Point(transform([lat, lon], source, this.baseSource)),
+          geometry: new Point(transform([lon, lat], source, this.baseSource)),
         });
       } else {
         rome = new Feature({
-          geometry: new Point([lat, lon]),
+          geometry: new Point([lon, lat]),
         });
       }
 
client/views/pages/AppRouter.ts
--- client/views/pages/AppRouter.ts
+++ client/views/pages/AppRouter.ts
@@ -11,6 +11,7 @@
 import UserManagement from '../pages/SystemManagement/UserManagement.vue';
 import DongManagement from '../pages/SystemManagement/DongManagement.vue';
 import NodeManagement from '../pages/SystemManagement/NodeManagement.vue';
+import NodeAddForm from '../pages/SystemManagement/NodeAddForm.vue';
 import ChargeManagement from '../pages/SystemManagement/ChargeManagement.vue';
 import DataRecord from '../pages/SystemManagement/DataRecord.vue';
 import UserAddForm from '../pages/SystemManagement/UserAddForm.vue';
@@ -40,6 +41,7 @@
     { path: '/ErrorSearch.page', name: 'ErrorSearch', component: ErrorSearch},
     { path: '/DongManagement.page', name: 'DongManagement', component: DongManagement},
     { path: '/NodeManagement.page', name: 'NodeManagement', component: NodeManagement},
+    { path: '/NodeAddForm.page', name: 'NodeAddForm', component: NodeAddForm},
     { path: '/ChargeManagement.page', name: 'ChargeManagement', component: ChargeManagement},
     { path: '/DataRecord.page', name: 'DataRecord', component: DataRecord},
     { path: '/UserAddForm.page', name: 'UserAddForm', component: UserAddForm},
client/views/pages/SystemManagement/ChargeManagement.vue
--- client/views/pages/SystemManagement/ChargeManagement.vue
+++ client/views/pages/SystemManagement/ChargeManagement.vue
@@ -12,7 +12,7 @@
             <span> ~ </span>
             <input type="date" value-format="yyyyMMdd" v-model="managerListSearch.endDate"/>
             <select v-model="managerListSearch.searchType">
-              <option value="null">검색조건</option>
+              <option value="null" disabled>검색조건</option>
               <option value="mngr_nm">이름</option>
               <option value="mngr_ogdp_info">소속정보</option>
             </select>
 
client/views/pages/SystemManagement/NodeAddForm.vue (added)
+++ client/views/pages/SystemManagement/NodeAddForm.vue
@@ -0,0 +1,444 @@
+<template>
+  <div class="wrap">
+    <div>
+      <div class="sub-title-wrap">
+        <h3 class="sub-title">표준노드 등록</h3>
+      </div>
+      <div>
+        <table>
+          <colgroup>
+            <col style="width: 10%;">
+            <col style="width: 10%;">
+            <col style="width: 30%;">
+            <col style="width: 20%;">
+            <col style="width: 30%;">
+          </colgroup>
+          <tbody>
+            <tr>
+              <th colspan="2">ID</th>
+              <td><input type="text" v-model="node.node_id"></td>
+            </tr>
+            <tr>
+              <th colspan="2">노드명</th>
+              <td><input type="text" v-model="node.node_name"></td>
+            </tr>
+            <tr>
+              <th colspan="2">읍/면/동</th>
+              <!-- <td><input type="text" v-model="node.node_type"></td> -->
+              <td>{{ dong_nm }}</td>
+            </tr>
+            <tr>
+              <th rowspan="2">좌표  <button type="button" class="btn-2 gray-btn" @click="[map_open = true, openMap()]">좌표수정</button></th>
+              <th class="second">위도</th>
+              <td>{{ node.lat }}</td>
+            </tr>
+            <tr>
+              <th class="second">경도</th>
+              <td>{{ node.lon }}</td>
+             
+            </tr>
+          </tbody>
+        </table>
+      </div>
+      <div class="btn-wrap">
+        <button type="button" class="btn-2 green-btn" @click="modal_insert = true">등록</button>
+        <button type="button" class="btn-2 gray-btn" @click="nodeSelectListPage">취소</button>
+      </div>
+    </div>
+
+  </div>
+  <div class="modal-wrap" v-if="modal_insert == true">
+    <div class="modal-bg">
+    </div>
+    <div class="modal">
+      <p>노드를 <span class="txt-point">등록</span>하시겠습니까?</p>
+      <div class="btn-wrap">
+        <button type="button" class="green-btn" @click="nodeInsert">확인</button>
+        <button type="button" class="gray-btn" @click="modal_insert = false">취소</button>
+      </div>
+    </div>
+  </div>
+
+  <div class="modal-wrap" v-if="map_open">
+    <div class="modal-bg">
+    </div>
+    <div class="modalMap">
+      <div class="search">
+        <h2>교차로 검색</h2>
+        <dongSelectList @setDongCd="setDongCd" :nodeHiddenCk="true" :azimuthHiddenCk="true"></dongSelectList>
+      </div>
+      <button type="button" class="green-btn" @click="searchDong">검색</button>
+      <OpenLayers  ref="open_layers"/>
+          <label>위도 : </label>
+          <input style="width: 20rem" type="text" v-model="map_lat" disabled/>
+          <label>경도 : </label>
+          <input style="width: 20rem" type="text" v-model="map_lon" disabled/>
+      <div class="btn-wrap">
+        <button type="button" class="green-btn" @click="selectCoordinate">선택</button>
+        <button type="button" class="gray-btn" @click="closeMap">취소</button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from 'axios';
+import COMMON_UTIL from '../../../resources/js/commonUtil.ts';
+import OpenLayers from "../../component/OpenLayers.vue";
+import {
+  vworldBaseLayer,
+  vworldGrayLayer,
+  vworldMidnightLayer,
+  vworldHybridLayer,
+  vworldSatelliteLayer,
+} from "../../component/OpenLayersMap.vue";
+import {baseStyles} from '../../component/OpenLayersStyle.vue';
+import dongSelectList from '../../component/dongSelectList.vue';
+import { transform } from 'ol/proj';
+
+export default {
+  data:() => {
+    return {
+      node: {
+        node_id: null,
+        node_name: null,
+        node_type: null,
+        lat: null,
+        lon: null,
+      //  updatedate: null,
+        dong_cd: '22030',
+      },
+      dong_nm: null,
+      address: {},
+
+      //modal
+      modal_insert: false,
+
+      //좌표 modal 
+      map_open: false,
+      map_lat: null,
+      map_lon: null,
+
+    };
+  },
+  methods: {
+
+    //좌표수정 지도 열기
+    async openMap() {
+      const vm  = this;
+
+      //OpenLayers 랜더링 후 접근
+      await vm.$nextTick();
+      //기본맵 세팅
+      vm.$refs.open_layers.setBaseMap(vworldBaseLayer);
+      
+      //행정동 레이어
+      //this.$refs.open_layers.addVectorLayerByUrl('/testDongGeoJson.json','testMap','EPSG:4326', baseStyles['labelStyle'],'label');    
+      vm.$refs.open_layers.addVectorLayerByUrl('/common/getDongGeoJson.json','testMap','EPSG:5181', baseStyles['MultiPolygon'],'MultiPolygon',vm.node.dong_cd);
+      vm.$refs.open_layers.setCenterPosition(265352.91811139905,340098.7926937433,'EPSG:5181');
+      vm.$refs.open_layers.zoomChange(14.5);
+    },
+
+    closeMap() {
+      const vm = this;
+      vm.$refs.open_layers.removeLayerAll();
+      vm.dong_nm = null;
+      vm.map_open = false;
+    },
+
+    //지도 클릭 이벤트
+    childClick(prop,coordinate){        
+      const vm = this; 
+      console.log(prop);
+      console.log(coordinate);
+ 
+      // 레이어 삭제
+      vm.$refs.open_layers.removeLayer('point1');
+      
+      // Icon 그리기 
+      vm.$refs.open_layers.createIcon(coordinate[1],coordinate[0],'/client/resources/images/icon/fin.png',0.3, 'point1','EPSG:5181');
+      
+      //클릭위치로 이동
+      //  this.$refs.open_layers.setCenterPosition(coordinate[0],coordinate[1],'EPSG:5181');
+
+      //좌표계 변환
+      var changeCoordinate = transform([coordinate[0],coordinate[1]],'EPSG:5181','EPSG:4326');
+      console.log("lat 바꿈",changeCoordinate[1]);
+      console.log("lon 바꿈",changeCoordinate[0]);
+      vm.map_lat = changeCoordinate[1];
+      vm.map_lon = changeCoordinate[0];
+    },
+
+     //좌표 선택 완료
+     selectCoordinate() {
+      const vm = this; 
+      vm.node.lat = vm.map_lat;
+      vm.node.lon = vm.map_lon;
+      vm.map_open = false;
+     },
+
+     // 좌표수정에서 교차로 검색시 동레이어, 노드좌표 찍어주기
+     searchDong() {
+      const vm = this;
+      //기존 레이어 삭제
+      vm.$refs.open_layers.removeLayer('testMap');
+      vm.$refs.open_layers.removeLayer('point1');
+      //동 레이어 그리기
+      vm.$refs.open_layers.addVectorLayerByUrl('/common/getDongGeoJson.json','testMap','EPSG:5181', baseStyles['MultiPolygon'],'MultiPolygon',vm.address.dong_dong_cd);
+      axios({
+        url: '/dong/dongCenter.json',
+        method: 'post',
+        headers: {
+          'Content-Type': "application/json; charset=UTF-8"
+        },
+        data: {'dong_cd' : vm.address.dong_cd}
+      }).then(function (response) {
+        console.log("searchNode response : ",response.data);
+        vm.$refs.open_layers.setCenterPosition(response.data.dong_lat,response.data.dong_lon,'EPSG:5181');
+        vm.$refs.open_layers.zoomChange(15);
+        vm.dong_nm = response.data.dong_nm;
+      }).catch(function (error) {
+        console.log("serchNode error : ", error);
+        alert("검색에 실패 하였습니다. 관리자에게 문의하세요.");
+      })
+     },
+
+    //노드 등록
+    nodeInsert() {
+      const vm = this;
+      vm.node.dong_cd = vm.address.dong_cd;
+      
+      axios({
+        url: '/node/nodeInsert.json',
+        method: 'post',
+        headers: {
+          'Content-Type': "application/json; charset=UTF-8"
+        },
+        data: vm.node
+      }).then(function (response) {
+        console.log("nodeInsert - response : ", response.data);
+        let result = response.data;
+        if ( result > 0) {
+          alert("노드 등록을 완료 하였습니다.")
+          vm.modal_insert = false;
+          vm.nodeSelectListPage();
+        } else {
+          alert("등록 실패, 관리자에게 문의해주세요.")
+          vm.modal_insert = false;
+        }
+      }).catch(function (error) {
+        console.log("nodeInsert - error : ", error);
+        alert("노드등록 오류, 관리자에게 문의해주세요.")
+        vm.modal_insert = false;
+      })
+    },
+
+    //dongSelectList 컴포넌트에서 선택된 dong_cd 셋팅
+    setDongCd(value) {
+      console.log("value : ", value);
+      this.address = value;
+    },
+
+    //날짜에 '-' 넣기
+    dateHyphen(date) {
+      return COMMON_UTIL.dateHyphen(date);
+    },
+
+    nodeSelectListPage() {
+      this.$router.push({ path: '/NodeManagement.page'})
+    }
+  },
+  watch: {},
+  computed: {},
+  components: {
+    OpenLayers: OpenLayers,
+    dongSelectList: dongSelectList
+  },
+  mounted() {
+    console.log("Main4 mounted");
+  },
+};
+</script>
+
+<style scoped>
+.wrap {
+  width: 155rem;
+  margin: 100px auto;
+}
+
+.search-wrap {
+  margin-bottom: 30px;
+}
+
+.search-wrap input,
+.search-wrap select {
+  height: 22.5px;
+  border-radius: 3px;
+  border: 1px solid #949292;
+}
+
+.float-left {
+  float: left;
+}
+
+.float-left .sub-title,
+.sub-title-wrap .sub-title {
+  font-size: 20px;
+}
+
+.float-right {
+  float: right;
+}
+
+.sub-title-wrap>* {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.sub-title-wrap>*:not(:last-child) {
+  margin-right: 2rem;
+}
+
+.full {
+  width: 100%;
+}
+
+.txt-left {
+  text-align: left;
+}
+
+.txt-left .green-btn {
+  margin-right: 2rem;
+}
+
+.btn-2 {
+  display: inline-block;
+  padding: 0.3rem 2rem;
+  font-size: 13.333px;
+}
+
+label.btn-2 {
+  cursor: pointer;
+}
+
+.clear-fix::after {
+  content: "";
+  display: block;
+  clear: both;
+}
+
+.search-wrap .float-right form>*:not(:last-child) {
+  margin-right: 1rem;
+}
+
+table {
+  width: 100%;
+  text-align: center;
+  border-collapse: collapse;
+}
+
+th,
+td {
+  border-left: none;
+  border-right: none;
+}
+td input{width: -webkit-fill-available;}
+table th {
+  padding: 15px;
+  color: #fff;
+  background-color: #13833b;
+  border-bottom: 1px solid #e5e5dd;
+}
+
+table td {
+  padding: 10px;
+  border-bottom: 1px solid #e5e5dd;
+}
+
+table tbody th.second {
+  background-color: #31a257;
+}
+
+table tr:nth-child(odd) {
+  background-color: #f7f6f6;
+}
+
+table tr:nth-child(even) {
+  background-color: #fdfdf2;
+}
+
+.bottom-wrap {
+  position: relative;
+  padding: 1rem 0;
+}
+
+.pg-wrap {
+  text-align: center;
+}
+
+.pg-item {
+  display: inline-block;
+  padding: 10px;
+  color: #949292;
+}
+
+.pg-item.prev,
+.pg-item.next,
+.pg-item.active {
+  color: #13833b;
+}
+
+#fileBtn::file-selector-button {
+  display: none;
+}
+
+.btn-wrap {
+  text-align: right;
+  margin-top: 15px;
+}
+
+.btn-wrap>*:not(:last-child) {
+  margin-right: 15px;
+}
+
+
+
+.modal-bg {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, .6);
+}
+.modal {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  max-width: 350px;
+  padding: 5rem;
+  z-index: 2;
+  background-color: #fff;
+  border-radius: 1rem;
+  text-align: center;
+}
+
+.modalMap {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  width: 90%;
+  padding: 5rem;
+  z-index: 2;
+  background-color: #fff;
+  border-radius: 1rem;
+}
+
+.modal .btn-wrap {
+  text-align: center;
+}
+
+.txt-point {
+  color: #13833b;
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/SystemManagement/NodeManagement.vue
--- client/views/pages/SystemManagement/NodeManagement.vue
+++ client/views/pages/SystemManagement/NodeManagement.vue
@@ -66,7 +66,7 @@
     <div>
       <div class="sub-title-wrap">
         <h3 class="sub-title">표준노드 정보관리</h3>
-        <span class="btn-2 green-btn" @click="modal_insert = true">신규등록</span>
+        <span class="btn-2 green-btn" @click="nodeInsertPage">신규등록</span>
       </div>
       <div>
         <table>
@@ -80,9 +80,9 @@
           <tbody>
             <tr>
               <th colspan="2">ID</th>
-              <td><input type="text" :disabled="id_disabled == true" v-model="node.node_id"></td>
+              <td>{{ node.node_id }}</td>
               <th>등록일</th>
-              <td><input type="text" disabled v-model="node.updatedate"></td>
+              <td>{{ node.updatedate }}</td>
             </tr>
             <tr>
               <th colspan="2">노드명</th>
@@ -100,21 +100,21 @@
             <tr>
               <th rowspan="2">좌표  <button type="button" class="btn-2 gray-btn" @click="[map_open = true, openMap()]">좌표수정</button></th>
               <th class="second">위도</th>
-              <td><input type="text" v-model="node.lat"></td>
+              <td>{{ node.lat }}</td>
               <th>수정자</th>
               <td></td>
             </tr>
             <tr>
               <th class="second">경도</th>
-              <td><input type="text" v-model="node.lon"></td>
+              <td>{{ node.lon }}</td>
              
             </tr>
           </tbody>
         </table>
       </div>
       <div class="btn-wrap">
-        <button type="button" class="btn-2 gray-btn" @click="modal_delete = true">삭제</button>
         <button type="button" class="btn-2 green-btn" @click="modal_update = true">수정</button>
+        <button type="button" class="btn-2 gray-btn" @click="modal_delete = true">삭제</button>
       </div>
     </div>
 
@@ -290,7 +290,8 @@
         vm.$refs.open_layers.setCenterPosition(vm.node.lat,vm.node.lon,'EPSG:4326');
         vm.$refs.open_layers.createIcon(vm.node.lat,vm.node.lon,'/client/resources/images/icon/fin.png',0.3, 'point1','EPSG:4326');
       } else {
-        vm.$refs.open_layers.setCenterPosition(340463.3583643114,265112.9114570773,'EPSG:5181');
+        vm.$refs.open_layers.setCenterPosition(265352.91811139905,340098.7926937433,'EPSG:5181');
+        vm.$refs.open_layers.zoomChange(14.5);
       };
     },
 
@@ -304,21 +305,23 @@
     childClick(prop,coordinate){        
       const vm = this; 
       console.log(prop);
-      console.log(coordinate);
+      console.log("coordinate",coordinate);
  
       // 레이어 삭제
       vm.$refs.open_layers.removeLayer('point1');
       
       // Icon 그리기 
-      vm.$refs.open_layers.createIcon(coordinate[0],coordinate[1],'/client/resources/images/icon/fin.png',0.3, 'point1','EPSG:5181');
+      vm.$refs.open_layers.createIcon(coordinate[1],coordinate[0],'/client/resources/images/icon/fin.png',0.3, 'point1','EPSG:5181');
       
       //클릭위치로 이동
       //  this.$refs.open_layers.setCenterPosition(coordinate[0],coordinate[1],'EPSG:5181');
 
       //좌표계 변환
       var changeCoordinate = transform([coordinate[0],coordinate[1]],'EPSG:5181','EPSG:4326');
-      vm.map_lat = changeCoordinate[0];
-      vm.map_lon = changeCoordinate[1];
+      console.log("lat 바꿈",changeCoordinate[1]);
+      console.log("lon 바꿈",changeCoordinate[0]);
+      vm.map_lat = changeCoordinate[1];
+      vm.map_lon = changeCoordinate[0];
     },
 
      //좌표 선택 완료
@@ -408,42 +411,6 @@
         console.log("nodeSelectList - error : ", error);
         alert("노드 목록 조회 오류, 관리자에게 문의해주세요.");
       });
-    },
-
-    //노드 등록
-    nodeInsert() {
-      const vm = this;
-      axios({
-        url: '/node/nodeInsert.json',
-        method: 'post',
-        headers: {
-          'Content-Type': "application/json; charset=UTF-8"
-        },
-        data: vm.node
-      }).then(function (response) {
-        console.log("nodeInsert - response : ", response.data);
-        let result = response.data;
-        if ( result > 0) {
-          alert("노드 등록을 완료 하였습니다.")
-          vm.modal_insert = false;
-          vm.nodeSelectList();
-          vm.node = {
-            node_id: null,
-            node_name: null,
-            node_type: null,
-            lat: null,
-            lon: null,
-            updatedate: null
-          };
-        } else {
-          alert("등록 실패, 관리자에게 문의해주세요.")
-          vm.modal_insert = false;
-        }
-      }).catch(function (error) {
-        console.log("nodeInsert - error : ", error);
-        alert("노드등록 오류, 관리자에게 문의해주세요.")
-        vm.modal_insert = false;
-      })
     },
 
     //노드 수정
@@ -549,6 +516,10 @@
     dateHyphen(date) {
       return COMMON_UTIL.dateHyphen(date);
     },
+
+    nodeInsertPage() {
+      this.$router.push({ path: '/NodeAddForm.page'})
+    }
   },
   watch: {},
   computed: {},
client/views/pages/SystemManagement/UserManagement.vue
--- client/views/pages/SystemManagement/UserManagement.vue
+++ client/views/pages/SystemManagement/UserManagement.vue
@@ -18,7 +18,7 @@
       <div class="search-wrap clear-fix">
         <div class="float-left">
           <select v-model="userListSearch.authorFilter" @change="userSelectList">
-            <option value="null">권한필터</option>
+            <option value="null" disabled>권한필터</option>
             <option value="시청관리자">시청관리자</option>
             <option value="지자체관리자">지자체관리자</option>
           </select>
@@ -29,7 +29,7 @@
           <span> ~ </span>
           <input type="date" value-format="yyyyMMdd" v-model="userListSearch.endDate"/>
           <select v-model="userListSearch.searchType">
-            <option value="null">검색조건</option>
+            <option value="null" disabled>검색조건</option>
             <option value="user_id">ID</option>
             <option value="user_nm">이름</option>
             <option value="dong_cd">관리구역</option>
Add a comment
List