김성원 김성원 2023-07-18
UI 개발
@6408a5258f17026170991bdd1b204a4cbddc0ad5
 
client/views/component/MapPage copy 2.vue (deleted)
--- client/views/component/MapPage copy 2.vue
@@ -1,38 +0,0 @@
-<template>
-  <div id="map">
-    <l-map :zoom="15" :center="mapCenter">
-      <l-tile-layer :url="tileLayerUrl" :attribution="attribution"></l-tile-layer>
-    </l-map>
-  </div>
-</template>
-
-<script>
-import { LMap, LTileLayer } from 'vue3-leaflet';
-
-// 영천시 json - 기존
-// import am5geodata_yeongcheon from "./map";
-
-export default {
-  components: {
-    LMap,
-    LTileLayer,
-  },
-  data() {
-    return {
-      mapCenter: [ 35.87172388583504,  128.55915532852885], // Initial center coordinates
-      tileLayerUrl: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', // Tile layer URL
-      attribution: '&copy; OpenStreetMap contributors', // Attribution text
-    };
-  },
-  }
-</script>
-
-<style>
-.layerlist_title{
-background: #42547f;
-color: #fff;
-padding: 10px;
-font-size: 14px;
-}
-#map{min-height: 866px !important;}
-</style>
 
client/views/component/MapPage copy.vue (deleted)
--- client/views/component/MapPage copy.vue
@@ -1,55 +0,0 @@
-<template>
-  <div>
-    <div id="map" class="map"></div>
-  </div>
-</template>
-
-<script>
-export default {
-  
-  data() {
-    return {
-    }
-  },
-  mounted() {
-    window.kakao && window.kakao.maps
-      ? this.loadMap()
-      : this.addKakaoMapScript();
-      
-  },
-  methods: {
-    addKakaoMapScript() {
-      const script = document.createElement("script");
-      /* global kakao */
-      script.onload = () => kakao.maps.load(this.loadMap);
-      script.src =
-        "http://dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=d0f88d63bd41b545d08ea9984995f082";
-      document.head.appendChild(script);
-    },
-    loadMap() {
-      var mapContainer = document.getElementById("map"); //지도를 담을 영역의 DOM 레퍼런스
-      var map = {
-        //지도를 생성할 때 필요한 기본 옵션
-        center: new kakao.maps.LatLng(35.87172388583504, 128.55915532852885), //지도의 중심좌표.
-        level: 5, //지도의 레벨(확대, 축소 정도)
-      };
-
-      var map = new kakao.maps.Map(mapContainer, map); //지도 생성 및 객체 리턴
-      // 지도 확대 축소를 제어할 수 있는  줌 컨트롤을 생성합니다
-      var zoomControl = new kakao.maps.ZoomControl();
-      map.addControl(zoomControl, kakao.maps.ControlPosition.RIGHT);
-   
-
-    },
-    zoomControl() {},
-    
-  },
-};
-</script>
-
-<style>
-.map {
-  width: 100%;
-  height: 866px;
-}
-</style>
 
client/views/component/MapPage kakao.vue (deleted)
--- client/views/component/MapPage kakao.vue
@@ -1,55 +0,0 @@
-<template>
-  <div>
-    <div id="map" class="map"></div>
-  </div>
-</template>
-
-<script>
-export default {
-  
-  data() {
-    return {
-    }
-  },
-  mounted() {
-    window.kakao && window.kakao.maps
-      ? this.loadMap()
-      : this.addKakaoMapScript();
-      
-  },
-  methods: {
-    addKakaoMapScript() {
-      const script = document.createElement("script");
-      /* global kakao */
-      script.onload = () => kakao.maps.load(this.loadMap);
-      script.src =
-        "http://dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=d0f88d63bd41b545d08ea9984995f082";
-      document.head.appendChild(script);
-    },
-    loadMap() {
-      var mapContainer = document.getElementById("map"); //지도를 담을 영역의 DOM 레퍼런스
-      var map = {
-        //지도를 생성할 때 필요한 기본 옵션
-        center: new kakao.maps.LatLng(35.87172388583504, 128.55915532852885), //지도의 중심좌표.
-        level: 5, //지도의 레벨(확대, 축소 정도)
-      };
-
-      var map = new kakao.maps.Map(mapContainer, map); //지도 생성 및 객체 리턴
-      // 지도 확대 축소를 제어할 수 있는  줌 컨트롤을 생성합니다
-      var zoomControl = new kakao.maps.ZoomControl();
-      map.addControl(zoomControl, kakao.maps.ControlPosition.RIGHT);
-   
-
-    },
-    zoomControl() {},
-    
-  },
-};
-</script>
-
-<style>
-.map {
-  width: 100%;
-  height: 797px;
-}
-</style>
 
client/views/component/OpenLayers.vue (deleted)
--- client/views/component/OpenLayers.vue
@@ -1,459 +0,0 @@
-<template>
-  <div>
-    <div id="map" class="map"></div>
-  </div>
-</template>
-
-<script>
-import axios from 'axios';
-import Map from "ol/Map";
-import View from "ol/View";
-import { fromLonLat } from 'ol/proj.js';
-import Point from 'ol/geom/Point';
-import Feature from 'ol/Feature';
-import TileLayer from "ol/layer/Tile";
-import Group from "ol/layer/Group";
-import { transform } from "ol/proj";
-import { XYZ, Vector as VectorSource } from "ol/source";
-import VectorSources from 'ol/source/Vector.js';
-import GeoJSON from 'ol/format/GeoJSON';
-import { Vector as VectorLayer } from "ol/layer";
-import { baseStyles } from './OpenLayersStyle.vue';
-import { Select } from 'ol/interaction';
-import { Icon, Style, Circle as CircleStyle, Fill, Stroke, Text } from 'ol/style.js';
-import { BASE_DIR } from '../../../Global'
-import proj4 from "proj4";
-import { register } from "ol/proj/proj4";
-import { Cluster } from 'ol/source';
-import { fromExtent } from 'ol/geom/Polygon';
-
-
-// V월드 메인키
-var API_KEY = "640F33E7-A813-3EF5-A503-7F2946B5A944";
-
-
-
-export default {
-  data() {
-    return {
-      // 맵 객첵 
-      map: Object,
-      // 레이어 리스트 
-      mapLayer: [],
-      // 오버레이 
-      mapOverLay: Object,
-      // 뷰객체 
-      mapView: Object,
-      hover: null,
-      baseSource: String,
-    };
-  },
-  components: {
-    Map: Map,
-  },
-  mounted() {
-    this.loadMap();
-
-  },
-  methods: {
-
-    setZoom(zoomIdx) {
-      this.map.getView().setZoom(zoomIdx);
-    },
-
-    loadMap() {
-      var vm = this;
-      this.baseSource = "EPSG:5181";
-
-      // 좌표계 추가
-      proj4.defs("EPSG:5181",
-        "+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +units=m +no_defs"
-      );
-
-      proj4.defs("EPSG:5179",
-        "+proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs"
-      );
-
-      proj4.defs("ESPG:4326",
-        "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
-      );
-
-      register(proj4);
-
-      // View 정보
-      this.mapView = new View({
-        projection: this.baseSource, ///EPSG:3857
-        center: transform([339979.82131209393, 265331.9344441357], "EPSG:5181", vm.baseSource), //126.9757184, 37.564388 
-        zoom: 14,
-        minZoom: 8,
-        maxZoom: 19
-      });
-      // 맵객체 생성 
-      this.map = new Map({
-        layers: [],
-        view: vm.mapView,
-        target: "map",
-      });
-      // 이벤트 초기화 
-      this.mouse_ev();
-    },
-
-    // 레이어 추가 함수 
-    addLayer: function (layer) {
-      this.map.addLayer(layer);
-    },
-
-    // 벡터 레이어 추가 URL
-    addVectorLayerByJson: function (geojson, layerName, geoType) {
-
-      var tempfeatures = new GeoJSON().readFeatures(geojson);
-
-      var layerSource = new VectorSource({});
-      if (geoType === vm.baseSource) {
-        layerSource = new VectorSource({
-          features: tempfeatures
-        });
-      } else {
-        tempfeatures.forEach(function (feature) {
-          // 좌표변환   
-          feature.getGeometry().transform(geoType, this.baseSource);
-          pointSource.addFeature(feature);
-        });
-      }
-
-      // 레리어 생성 
-      const vector = new VectorLayer({
-        properties: { name: layerName },
-        source: layerSource,
-        style: function (feature) {
-          return baseStyles[feature.getGeometry().getType()];
-        },
-      });
-      vector.setZIndex(10);
-      this.map.addLayer(vector);
-    },
-
-    // 벡터레이어 추가 JSON
-    addVectorLayerByUrl: function (sourceUrl, layerName, geoType, style, type, dong_cd, node_id) {
-      const vm = this;
-
-      axios({
-        url: sourceUrl,
-        method: 'post',
-        headers: {
-          'Content-Type': 'application/json; charset=UTF-8'
-        },
-        data: { "dong_cd": dong_cd, "node_id": node_id },
-      }).then(function (response) {
-        console.log("url : ", sourceUrl);
-
-        console.log("addVectorLayerByUrl response : ", response.data);
-
-        const tempfeatures = new GeoJSON().readFeatures(response.data);
-        console.log("tempfeatures response : ", tempfeatures);
-
-        // const areaSize=response.data.features.area;
-        let layerSource = new VectorSource({});
-        if (geoType === vm.baseSource) {
-          layerSource = new VectorSource({
-            features: tempfeatures
-          });
-        } else {
-          tempfeatures.forEach(function (feature) {
-            // 좌표변환   
-            feature.getGeometry().transform(geoType, vm.baseSource);
-            layerSource.addFeature(feature)
-          });
-        }
-        // 레이어 생성 
-        const vector = new VectorLayer({
-          properties: { name: layerName },
-          source: layerSource,
-          style: function (feature) {
-            // 라벨스타일 일때
-            if (type == 'label') {
-              if(feature.get('dong_nm')){
-                style.getText().setText(feature.get('dong_nm'))
-              }
-              else{
-                style.getText().setText(feature.get('node_name'))
-
-              }
-              style.getImage().setRadius(vm.map.getView().getZoom() + 12);
-              return style
-            } else if (type == 'MultiPolygon') {
-              return style
-            } else {
-              return baseStyles[feature.getGeometry().getType()];
-            }
-          },
-        });
-
-        vector.setZIndex(10);
-
-        //vector size 조절
-        const extent = vector.getSource().getExtent();
-        vm.map.getView().fit(extent,{
-          padding:[100,100,100,100],
-          duration:1000,
-        });
-        vm.map.addLayer(vector);
-
-      }).catch(function (error) {
-        console.log("error : ", error);
-      });
-    },
-
-    // 전체 삭제 함수
-    removeLayerAll: function () {
-      this.map
-        .getAllLayers()
-        .forEach((layer) => this.map.removeLayer(layer));
-    },
-
-    // 특정 레이어 삭제 
-    removeLayer: function (layerName) {
-      this.map
-        .getAllLayers()
-        .filter((layer) => layer.get("name").startsWith(layerName))
-        .forEach((layer) => this.map.removeLayer(layer));
-    },
-
-    // 클릭이벤트
-    mouse_ev: function (layerName) {
-      var vm = this;
-
-      if (this.map) {
-        this.map.on("pointerdrag", (evt) => {
-          // 화면이동 이벤트
-          console.log("pointerdrag");
-        });
-        this.map.on('moveend', function (e) {
-          var newZoom = vm.map.getView().getZoom();
-          console.log('zoom end, new zoom: ' + newZoom);
-          // vm.$parent.childMoveEnd(newZoom);
-        });
-
-        this.map.on("click", (evt) => {
-          const prop = [];
-          // 마우스 클릭 이벤트
-          console.log("click");
-          this.map.forEachFeatureAtPixel(
-            evt.pixel,
-            function (feature, layer) {
-              let values = feature;
-              values['layerName'] = layer.get('name');
-              prop.push(values);
-            }
-          );
-          //특정 layer 선택 틀릭 시, 
-          
-          vm.$parent.childClick(prop, evt.coordinate);
-        });
-
-        //pointerMove event
-        this.map.on("pointermove", (event) => {
-          var features = this.map.getFeaturesAtPixel(event.pixel);
-          if (features) {
-            // var properties = features[0].getProperties();
-            // console.log("pointerMove properties : ",properties.geometry.extent_[0])
-            // this.setCenterPosition(properties.geometry.extent_[1],properties.geometry.extent_[0],'EPSG:5181');
-          }
-        });
-      }
-    },
-
-    // 좌표 센터 이동
-    setCenterPosition: function (lat, lon, source) {
-
-      if (this.baseSource == source) {
-        this.map.getView().setCenter([lon, lat]);
-      } else {
-        this.map.getView().setCenter(transform([lon, lat], source, this.baseSource));
-      }
-    },
-
-    // 기본맵 세팅 
-    setBaseMap: function (map, dong_cd, node_id) {
-      const vm = this;
-
-      if (dong_cd != null) {
-        //dong_cd로 중간 위치 받아오기
-        axios({
-          url: '/dong/dongCenter.json',
-          method: 'post',
-          headers: {
-            'Content-Type': 'application/json; charset=UTF-8'
-          },
-          data: { "dong_cd": dong_cd, "node_id": node_id },
-        }).then(function (response) {
-          console.log("setBaseMap response", response.data)
-          vm.setCenterPosition(response.data.dong_lat, response.data.dong_lon, 'EPSG:5181');
-
-        }).catch(function (error) {
-          console.log("error : ", error);
-        });
-
-      }
-
-      this.map.getAllLayers()
-        .filter((layer) => layer.get("name").startsWith("base"))
-        .forEach((layer) => this.map.removeLayer(layer));
-
-      this.map.addLayer(map);
-    },
-    // 아이콘 생성 
-    createIcon: function (lat, lon, iconSrc, iconSclae, layername, source) {
-      var rome = new Feature({});
-
-      if (this.baseSource !== source) {
-        rome = new Feature({
-          geometry: new Point(transform([lon, lat], source, this.baseSource)),
-        });
-      } else {
-        rome = new Feature({
-          geometry: new Point([lon, lat]),
-        });
-      }
-
-      rome.setStyle(
-        new Style({
-          image: new Icon({
-            scale: iconSclae,
-            src: iconSrc,
-          }),
-        })
-      );
-
-      const vectorSources = new VectorSource({});
-      vectorSources.addFeature(rome);
-
-      // 레이어 생성 
-      const vector = new VectorLayer({
-        properties: { name: layername },
-        source: vectorSources
-      });
-
-      vector.setZIndex(99);
-      this.map.addLayer(vector);
-    },
-    // 클러스터링 기능 추가
-    addClusterLayer(sourceUrl, layerName, geoType, style, type, dong_cd) {
-      const vm = this;
-
-      axios({
-        url: sourceUrl,
-        method: 'post',
-        headers: {
-          'Content-Type': 'application/json; charset=UTF-8'
-        },
-        data: { "dong_cd": dong_cd },
-      }).then(function (response) {
-        console.log("addClusterLayer response : ", response)
-        const tempfeatures = new GeoJSON().readFeatures(response.data);
-        console.log("addClusterLayer tempfeatures : ", tempfeatures);
-        const count = 20000;
-
-        const features = new Array(count);
-        const e = 15000;
-        for (let i = 0; i < count; ++i) {
-          const coordinates = [2 * e * Math.random() + 320000, 2 * e * Math.random() + 260000];
-          features[i] = new Feature(new Point(coordinates));
-        }
-        features[0] = new Feature(new Point(transform([338492.222420045, 243951.915081981], "EPSG:5181", "EPSG:5181")));
-        const source = new VectorSource({
-          features: features,
-        });
-
-        const clusterSource = new Cluster({
-          distance: parseInt(25, 30),
-          minDistance: parseInt(10, 10),
-          source: source,
-        });
-
-        // let source = new VectorSource({});
-        // if (geoType === vm.baseSource) {
-        //   source = new VectorSource({
-        //     features: tempfeatures
-        //   });
-        // } else {
-        //   tempfeatures.forEach(function (feature) {
-        //     // 좌표변환   
-        //     feature.getGeometry().transform(geoType, vm.baseSource);
-        //     source.addFeature(feature)
-        //   });
-        // }
-        // 클러스터 레이어 생성
-        //const clusterSource = new Cluster({
-        // distance: 40,
-        // minDistance: 10,
-        // source: source,
-        // geometryFunction: function (feature) {
-        //   // Custom geometryFunction to handle different geometry types
-        //   const geometry = feature.getGeometry();
-        //   if (geometry.getType() === 'Polygon' || geometry.getType() === 'MultiPolygon') {
-        //     // For Polygon and MultiPolygon geometries, calculate the center point
-        //     const coordinates = geometry.getCoordinates();
-        //     const center = coordinates[0].reduce((acc, coordinate) => [acc[0] + coordinate[0], acc[1] + coordinate[1]], [0, 0]);
-        //     const numVertices = coordinates[0].length;
-        //     return new Point([center[0] / numVertices, center[1] / numVertices]);
-        //   } else {
-        //     // For other geometry types (e.g., Point, LineString), use the default geometryFunction
-        //     return feature.getGeometry();
-        //   }
-        // }
-        //});
-        const styleCache = {};
-
-        // 스타일 함수 설정
-        const clusterStyle = function (feature) {
-          const size = feature.get('features').length;
-          let style = styleCache[size];
-          if (!style) {
-            style = new Style({
-              image: new CircleStyle({
-                radius: 10,
-                stroke: new Stroke({
-                  color: '#fff',
-                }),
-                fill: new Fill({
-                  color: '#3399CC',
-                }),
-              }),
-              text: new Text({
-                text: size.toString(),
-                fill: new Fill({
-                  color: '#fff',
-                }),
-              }),
-            });
-            styleCache[size] = style;
-          }
-          return style;
-        };
-
-        const vector = new VectorLayer({
-          properties: { name: layerName },
-          source: clusterSource,
-          style: clusterStyle,
-        });
-
-        vector.setZIndex(10);
-        vm.map.addLayer(vector);
-      }).catch(function (error) {
-        console.log("error : ", error);
-      });
-    },
-  },
-};
-
-</script>
-
-<style>
-.map {
-  width: 100%;
-  height: 861px;
-}
-</style>
-
-
 
client/views/component/OpenLayersIcon.vue (deleted)
--- client/views/component/OpenLayersIcon.vue
@@ -1,4 +0,0 @@
-<script>
-
-
-</script>
 
client/views/component/OpenLayersMap.vue (deleted)
--- client/views/component/OpenLayersMap.vue
@@ -1,97 +0,0 @@
-<script>
-import TileLayer from 'ol/layer/Tile';
-import { XYZ, Vector as VectorSource } from 'ol/source';
-
-// V월드 메인키
-var API_KEY = '640F33E7-A813-3EF5-A503-7F2946B5A944';
-// var API_KEY = 'd0f88d63bd41b545d08ea9984995f082';
-
-// http://dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=d0f88d63bd41b545d08ea9984995f082
-// 기본지도
-export const vworldBaseLayer = new TileLayer({
-  source: new XYZ({ url: 'https://api.vworld.kr/req/wmts/1.0.0/'+API_KEY+'/Base/{z}/{y}/{x}.png' }),
-  properties: { name: 'base-vworld-base' },
-  minZoom: 5,
-  maxZoom: 19,
-  zIndex: 2,
-  preload: Infinity
-});
-export const naverBaseLayer = new TileLayer({
-  source: new XYZ({ 
-    projection : 'EPSG:3857',
-    url: 'https://map.pstatic.net/nrb/styles/basic/d0f88d63bd41b545d08ea9984995f082/{z}/{x}/{y}@2x.png',
-    tilePixelRatio: 2,     
-    // crossOrigin: 'anonymous',
-  }),
-  id: 'naver_base',
-  visible: false,
-  // properties: { name: 'base-kakao-base' },
-  minZoom: 5,
-  maxZoom: 19,
-  zIndex: 2,
-  // preload: Infinity
-});
-
-// 백지도
-export const vworldGrayLayer = new TileLayer({
-  source: new XYZ({ url: 'https://api.vworld.kr/req/wmts/1.0.0/'+API_KEY+'/gray/{z}/{y}/{x}.png' }),
-  properties: { name: 'base-vworld-gray' },
-  minZoom: 5,
-  maxZoom: 18,
-  zIndex: 2,
-  preload: Infinity
-});
-
-// 야간지도
-export const vworldMidnightLayer = new TileLayer({
-  source: new XYZ({ url: 'https://api.vworld.kr/req/wmts/1.0.0/'+API_KEY+'/midnight/{z}/{y}/{x}.png' }),
-  properties: { name: 'base-vworld-midnight' },
-  minZoom: 5,
-  maxZoom: 18,
-  zIndex: 2,
-  preload: Infinity
-});
-
-// 하이브리드 지도
-export const vworldHybridLayer = new TileLayer({
-  source: new XYZ({ url: 'https://api.vworld.kr/req/wmts/1.0.0/'+API_KEY+'/Hybrid/{z}/{y}/{x}.png' }),
-  properties: { name: 'base-vworld-hybrid' },
-  minZoom: 5,
-  maxZoom: 19,
-  zIndex: 3,
-  preload: Infinity
-});
-
-// 위성지도
-export const vworldSatelliteLayer = new TileLayer({
-  source: new XYZ({ url: 'https://api.vworld.kr/req/wmts/1.0.0/'+API_KEY+'/Satellite/{z}/{y}/{x}.jpeg' }),
-  properties: { name: 'base-vworld-satellite' },
-  minZoom: 5,
-  maxZoom: 19,
-  zIndex: 2,
-  preload: Infinity
-});      
- 
- 
-/* 
-  const geojsonObject = {
-  'type': 'FeatureCollection',
-  'crs': {
-    'type': 'name',
-    'properties': {
-      'name': 'EPSG:3857',
-    },
-  },
-  'features': [
-    {
-      'type': 'Feature',
-      'geometry': {
-        'type': 'Point',
-        'coordinates': [ 14135490.777017945, 4518386.883679577 ],
-      },
-    }
-  ]
-  };
-  */
- 
-</script>
 
client/views/component/OpenLayersStyle.vue (deleted)
--- client/views/component/OpenLayersStyle.vue
@@ -1,58 +0,0 @@
-<script>
-import { Circle as CircleStyle, Style, Stroke, Fill, Text } from "ol/style"; //데이터를 그릴 스타일들
-
-// V월드 메인키
-var API_KEY = '640F33E7-A813-3EF5-A503-7F2946B5A944';
-
- export const baseStyles = {
-  'Point': new Style({
-    image: new CircleStyle({
-      radius: 10,
-      fill: new Fill({
-      color: 'rgba(255,0,0,0.2)',
-    }),
-      stroke: new Stroke({color: 'red', width: 2}),
-    }),
-  }),
-   'MultiPolygon': new Style({
-    stroke: new Stroke({
-      color: 'yellow',
-      width: 1,
-    }),
-    fill: new Fill({
-      color: 'rgba(255, 255, 0, 0.1)',
-    }),
-  }),
-  'Polygon': new Style({
-    stroke: new Stroke({
-      color: 'blue',
-      lineDash: [4],
-      width: 3,
-    }),
-    fill: new Fill({
-      color: 'rgba(0, 0, 255, 0.1)',
-    }),
-  }),
-  'labelStyle': new Style({
-    image: new CircleStyle({
-      radius: 0,
-      fill: new Fill({
-      color: 'rgba(0,255,0,0.5)',
-      }),
-        stroke: new Stroke({
-        color: 'rgba(255,0,0,1)',
-        width: 1
-      }),  
-    }),
-    text: new Text({
-      font: '12px Calibri,sans-serif',
-      overflow: false,
-      fill: new Fill({
-          color: 'rgba(255,0,0,1)'
-      }),
-    }),
-    
-  }),  
-};
-
-</script>
 
client/views/component/dongSelectList.vue (deleted)
--- client/views/component/dongSelectList.vue
@@ -1,245 +0,0 @@
-<template>
-    <div class="flex-between m-b" id="siDoHiddenCk">
-        <label for="">시/도</label>
-        <select name="siDoSelectList" id="siDoSelectList" v-model="address['siDo_dong_cd']" @change="siDoGunGuSelectF($event)">
-            <option :value=null disabled> 시/도</option>
-            <option v-for="(item, key) in siDoList" :key="key" :value="item['dong_cd']">
-                {{ item['dong_nm'] }}
-            </option>
-        </select>
-    </div>
-    <div class="flex-between m-b" id="gunGuHiddenCk">
-        <label for="">시/군/구</label>
-        <select name="gunGuSelectList" id="gunGuSelectList" v-model="address['guGun_dong_cd']" @change="siDoGunGuSelectF($event)">
-            <option :value=null disabled> 시/군/구 </option>
-            <option v-for="(item, key) in gunGuList" :key="key" :value="item['dong_cd']">
-                {{ item['dong_nm'] }}
-            </option>
-        </select>
-    </div>
-    <div class="flex-between m-b" id="dongHiddenCk">
-        <label for="">행정동</label>
-        <select name="dongSelectList" id="dongSelectList" v-model="address['dong_dong_cd']" @change="dongSelectF($event)">
-            <option :value=null disabled> 행정동 </option>
-            <option v-for="(item, key) in dongList" :key="key" :value="item['dong_cd']">
-                {{ item['dong_nm'] }}
-            </option>
-        </select>
-    </div>
-    <div class="flex-between m-b" id="nodeHiddenCk">
-        <label for="">교차로</label>
-        <select name="nodeSelectList" id="nodeSelectList" v-model="address['node_id']" @change="nodeSelectF($event)">
-            <option :value=null disabled> 교차로 </option>
-            <option v-for="(item, key) in nodeList" :key="key" :value="item['node_id']">
-                {{ item['node_name'] }}
-            </option>
-        </select>
-    </div>
-    <div class="flex-between m-b" id="crslk_azHiddenCk">
-        <label for="">방위각</label>
-        <select name="crslk_azSelectList" id="crslk_azSelectList" v-model="address['crslk_az']">
-            <option :value="0" disabled> 방위각 </option>
-            <option :value="10">북</option>
-            <option :value="50">북동</option>
-            <option :value="20">동</option>
-            <option :value="60">남동</option>
-            <option :value="30">남</option>
-            <option :value="70">남서</option>
-            <option :value="40">서</option>
-            <option :value="80">북서</option>
-            </select>
-    </div>
-</template>
-  
-<script>
-import axios from 'axios';
-
-export default {
-    props:{
-        siDoHiddenCk:Boolean,
-        gunGuHiddenCk:Boolean,
-        dongHiddenCk:Boolean,
-        nodeHiddenCk:Boolean,
-        crslk_azHiddenCk:Boolean,
-    },
-    data() {
-        return {
-            address: {
-                //지역 설정
-                dong_cd : "22030",
-                siDo_dong_cd : "22",
-                guGun_dong_cd : "22030",
-                dong_dong_cd : null,
-                node_id : null,
-                zoomLevel : null,
-                crslk_az : null,
-            },
-            siDoList: [],
-            gunGuList: [],
-            dongList: [],
-            nodeList:[],
-        };
-    },
-    
-    components: {
-    },
-    watch: {
-        'address.siDo_dong_cd': function (newValue, oldValue) {
-            console.log("newValue : ", newValue);
-            console.log("oldValue : ", oldValue);
-            this.address.dong_cd = newValue;
-            this.onEmit();
-            this.address.zoomLevel=11.5;
-            // this.address.guGun_dong_cd = null;
-            // this.address.dong_dong_cd = null;
-            this.gunGuList = null;
-            this.dongList = null;
-
-            this.gunGuSelect(newValue);
-
-        },
-        'address.guGun_dong_cd': function (newValue, oldValue) {
-            console.log("guGun_dong_cd newValue : ", newValue);
-            console.log("guGun_dong_cd oldValue : ", oldValue);
-            this.address.dong_cd = newValue;
-            this.address.zoomLevel=14;
-
-            this.onEmit();
-
-            // this.address.dong_dong_cd = null;
-            this.dongList = null;
-            if (newValue != null) {
-                this.dongSelectList(newValue);
-            }
-        },
-        'address.dong_dong_cd': function (newValue, oldValue) {
-            console.log("dong_dong_cd newValue : ", newValue);
-            console.log("dong_dong_cd oldValue : ", oldValue);
-            this.address.dong_cd = newValue;
-            this.address.zoomLevel=15;
-            this.findNodeUsingDongSelectList(newValue);
-            this.onEmit();
-        },
-        'address.node_id': function (newValue, oldValue) {
-            console.log("node_id newValue : ", newValue);
-            console.log("node_id oldValue : ", oldValue);
-            this.address.node_id = newValue;
-            this.address.zoomLevel=19;
-            this.onEmit();
-        },
-    },
-    methods: {
-        //시/도 받아오기
-        siDoSelectList: function () {
-            const vm = this;
-            axios({
-                url: '/dong/siDoSelectList.json',
-                method: 'post',
-                headers: {
-                    'Content-Type': "application/json; charset=UTF-8",
-                },
-                data: {}
-            }).then(function (response) {
-                console.log("siDoSelectList - response : ", response.data);
-                vm.siDoList = response.data;
-            }).catch(function (error) {
-                console.log("siDoSelectList - error : ", error);
-            });
-        },
-
-        //군/구 받아오기
-        gunGuSelect: function (dong_cd) {
-            const vm = this;
-            axios({
-                url: '/dong/gunGuSelectList.json',
-                method: 'post',
-                headers: {
-                    'Content-Type': "application/json; charset=UTF-8",
-                },
-                data: { 'dong_cd': dong_cd }
-            }).then(function (response) {
-                console.log("gunGuSelect - response : ", response.data);
-                vm.gunGuList = response.data;
-            }).catch(function (error) {
-                console.log("gunGuSelect - error : ", error);
-            });
-        },
-
-        //행정동 받아오기
-        dongSelectList: function (dong_cd) {
-            const vm = this;
-            axios({
-                url: '/dong/dongSelectList.json',
-                method: 'post',
-                headers: {
-                    'Content-Type': "application/json; charset=UTF-8",
-                },
-                data: { 'dong_cd': dong_cd }
-            }).then(function (response) {
-                console.log("dongSelectList - response : ", response.data);
-                vm.dongList = response.data;
-            }).catch(function (error) {
-                console.log("dongSelectList - error : ", error);
-            });
-        },
-        //노드(교차로) 받아오기
-        findNodeUsingDongSelectList: function (dong_cd) {
-            const vm = this;
-            axios({
-                url: '/node/findNodeUsingDongSelectList.json',
-                method: 'post',
-                headers: {
-                    'Content-Type': "application/json; charset=UTF-8",
-                },
-                data: { 'dong_cd': dong_cd }
-            }).then(function (response) {
-                console.log("findNodeUsingDongSelectList - response : ", response.data);
-                vm.nodeList = response.data;
-            }).catch(function (error) {
-                console.log("findNodeUsingDongSelectList - error : ", error);
-            });
-        },
-        siDoGunGuSelectF(event){
-            this.$parent.siDoGunGuSelectF(event)
-        },
-        dongSelectF(event){
-            this.$parent.dongSelectF(event)
-        },
-        nodeSelectF(event){
-            this.$parent.nodeSelectF(event)
-        },
-        onEmit() {
-            console.log("child this.address.dong_cd : ", this.address);
-            this.$emit("setDongCd", this.address);
-
-        },
-    },
-    mounted() {
-        console.log("dongSelectList mounted : ");
-        this.siDoSelectList();
-        this.gunGuSelect(this.address.siDo_dong_cd);
-        this.dongSelectList(this.address.guGun_dong_cd);
-        this.onEmit();
-        if(this.siDoHiddenCk){
-            document.getElementById("siDoHiddenCk").style.display ='none';
-        }
-        if(this.gunGuHiddenCk){
-            document.getElementById("gunGuHiddenCk").style.display ='none';
-        }
-        if(this.dongHiddenCk){
-            document.getElementById("dongHiddenCk").style.display ='none';
-        }
-        if(this.nodeHiddenCk){
-            document.getElementById("nodeHiddenCk").style.display ='none';
-        }
-        if(this.crslk_azHiddenCk){
-            document.getElementById("crslk_azHiddenCk").style.display ='none';
-        }
-    },
-};
-
-</script>
-  
-
-  
-  (No newline at end of file)
client/views/index.ts
--- client/views/index.ts
+++ client/views/index.ts
@@ -10,7 +10,7 @@
 import AppFilters from './pages/AppFilters';
 import App from './pages/App.vue';
 
-import OpenLayersMap from "vue3-openlayers";
+
 import "vue3-openlayers/dist/vue3-openlayers.css";
 
 // const vue = createApp(App).use(AppRouter).mount('#root');
@@ -18,8 +18,6 @@
 vue.use(AppStore);
 vue.use(AppRouter);
 vue.config.globalProperties.$filters = AppFilters
-
-vue.use(OpenLayersMap);
 
 vue.mount('#root');
 
client/views/layout/Header.vue
--- client/views/layout/Header.vue
+++ client/views/layout/Header.vue
@@ -49,102 +49,21 @@
     </div>
     <div class="header_menu">
       <nav class="flex">
-        <router-link to="/Introduction.page">
-          <span
-            @mouseover="showDropdown = true"
-            @mouseleave="showDropdown = false"
-            >플랫폼 소개
-          </span>
+        <router-link to="/ApiTokenManagement.page">
+          <span v-show="loginCheck()" >API 토큰 관리</span>
         </router-link>
-        <div
-          class="nav"
-          v-show="showDropdown"
-          @mouseover="showDropdown = true"
-          @mouseleave="showDropdown = false"
-        >
-          <div class="menu flex-end">
-            <ul>
-              <li
-                v-for="option in dropdownOptions"
-                :key="option.value"
-                @click="navigateToPage(option)"
-              >
-                <router-link :to="option.route">{{ option.label }}</router-link>
-              </li>
-            </ul>
-            <ul>
-              <li
-                v-for="option in dropdownOptions2"
-                :key="option.value"
-                @click="navigateToPage(option)"
-              >
-                <router-link :to="option.route">{{ option.label }}</router-link>
-              </li>
-            </ul>
-            <ul>
-              <li
-                v-for="option in dropdownOptions5"
-                :key="option.value"
-                @click="navigateToPage(option)"
-              >
-                <router-link :to="option.route">{{ option.label }}</router-link>
-              </li>
-            </ul>
-            <ul>
-              <li
-                v-for="option in dropdownOptions3"
-                :key="option.value"
-                @click="navigateToPage(option)"
-              >
-                <router-link :to="option.route">{{ option.label }}</router-link>
-              </li>
-            </ul>
-            <ul>
-              <li
-                v-for="option in dropdownOptions4"
-                :key="option.value"
-                @click="navigateToPage(option)"
-              >
-                <router-link :to="option.route">{{ option.label }}</router-link>
-              </li>
-            </ul>
-          </div>
-        </div>
-
-        <router-link to="/RealtimeStatus.page">
-          <span
-            @mouseover="showDropdown = true"
-            @mouseleave="showDropdown = false"
-            >현황관제</span
-          >
+        <router-link to="/RequestLog.page">
+          <span v-show="loginCheck()">수집로그</span>
         </router-link>
-        <router-link to="/Analysis.page">
-          <span
-            @mouseover="showDropdown = true"
-            @mouseleave="showDropdown = false"
-            >통계분석
-          </span>
-        </router-link>
-        <router-link to="/CrosswalkInsert.page">
-          <span
-            @mouseover="showDropdown = true"
-            @mouseleave="showDropdown = false"
-            >횡단보도 관리</span
-          >
-        </router-link>
-        <router-link to="/UserManagement.page">
-          <span
-            @mouseover="showDropdown = true"
-            @mouseleave="showDropdown = false"
-            >시스템 관리</span
-          >
-        </router-link>
+        <router-link to="/ResponseLog.page">
+          <span v-show="loginCheck()">발송로그</span>
+        </router-link>     
+        <router-link to="/ResponseLog.page" >
+           <button class="logout-btn" @click="logout" v-show="loginCheck()" style="float: right;">로그아웃</button>
+        </router-link>     
       </nav>
-      <div class="sub_menu">       
-        <router-link to="/Login.page">
-          <span>로그인</span>
-        </router-link>
-        <button class="logout-btn" @click="logout"  v-show="!store.state.loginUser == false && store.state.loginUser != null">로그아웃</button>
+      <div class="sub_menu">    
+     
       </div>
     </div>
   </header>
@@ -161,161 +80,35 @@
       imageSrc: 'https://firebasestorage.googleapis.com/v0/b/senior-care-system-dcf90.appspot.com/o/menu2.png?alt=media&token=6f3b2966-0820-419d-ba82-97290e71a7b5',
       menuOpen: false,
       showDropdown: false,
-      showSubmenu: false,
-      dropdownOptions: [
-        {
-          label: "스마트 횡단보도란?",
-          value: "Introduction",
-          route: "/Introduction.page",
-        },
-        // { label: '매뉴얼 다운로드', value: 'ManualDown', route: '/ManualDown.page' },
-      ],
-      selectedOption: null,
-      dropdownOptions2: [
-        {
-          label: "실시간 현황 관제",
-          value: "RealtimeStatus",
-          route: "/RealtimeStatus.page",
-        },
-        {
-          label: "상황발생 정보 조회",
-          value: "SituationSearch",
-          route: "/SituationSearch.page",
-        },
-        {
-          label: "장애발생 정보 조회",
-          value: "ErrorSearch",
-          route: "/ErrorSearch.page",
-        },
-        {
-          label: "횡단보도 목록 조회",
-          value: "CrosswalkListSearch",
-          route: "/CrosswalkListSearch.page",
-        },
-      ],
-      selectedOption2: null,
-      dropdownOptions3: [
-        {
-          label: "횡단보도 등록",
-          value: "CrosswalkInsert",
-          route: "/CrosswalkInsert.page",
-        },
-        {
-          label: "횡단보도 조회",
-          value: "CrosswalkSearch",
-          route: "/CrosswalkSearch.page",
-        },
-      ],
-      selectedOption3: null,
-      dropdownOptions4: [
-        {
-          label: "사용자 관리",
-          value: "UserManagement",
-          route: "/UserManagement.page",
-        },
-        {
-          label: "유지보수담당자 관리",
-          value: "ChargeManagement",
-          route: "/ChargeManagement.page",
-        },
-        {
-          label: "표준노드 관리",
-          value: "NodeManagement",
-          route: "/NodeManagement.page",
-        },
-        {
-          label: "행정동 관리",
-          value: "DongManagement",
-          route: "/DongManagement.page",
-        },
-        {
-          label: "데이터 수집 기록",
-          value: "DataRecord",
-          route: "/DataRecord.page",
-        },
-      ],
-      selectedOption4: null,
-      dropdownOptions5: [
-        { label: "통계분석", value: "Analysis", route: "/Analysis.page" },
-      ],
-      selectedOption5: null,
-      menuItems: [
-        {
-          title: "플랫폼 소개",
-          open: false,
-          subMenu: [
-            { title: "스마트 횡단보도란?", route: "/Introduction.page" },
-          ]
-        },
-        {
-          title: "현황관제",
-          open: false,
-          subMenu: [
-          { title: "실시간 현황관제", route: "/RealtimeStatus.page" },
-          { title: "상황발생 정보조회", route: "/SituationSearch.page" },
-          { title: "장애 발생 정보조회", route: "/ErrorSearch.page" },
-          { title: "횡단보도 목록조회", route: "/CrosswalkListSearch.page" },
-          ],
-        },
-        {
-          title: "통계분석",
-          open: false,
-          subMenu: [{ title: "통계분석", route: "/Analysis.page" },],
-        },
-        {
-          title: "횡단보도 관리",
-          open: false,
-          subMenu: [
-            { title: "횡단보도 등록", route: "/CrosswalkInsert.page" },
-            { title: "횡단보도 조회", route: "/CrosswalkSearch.page" },
-            ],
-        },
-        {
-          title: "시스템 관리",
-          open: false,
-          subMenu: [
-            { title: "사용자 관리", route: "/UserManagement.page" },
-            { title: "유지보수 담당자 관리", route: "/ChargeManagement.page" },
-            { title: "표준노드 관리", route: "/NodeManagement.page" },
-            { title: "행정동 관리", route: "/DongManagement.page" },
-            { title: "데이터 수집기록", route: "/DataRecord.page" },
-          ],
-        },
-        // {
-        //   title: "마이페이지",
-        //   open: false,
-        //   route: "/Mypage.page" 
-        // },
-        // {
-        //   title: "로그인",
-        //   open: false,
-        //   subMenu: [{ title: "로그인", route: "/Login.page" },],
-        // },
-      ],
+      showSubmenu: false,    
       store : useStore(),
+      showData : false
     };
   },
+  computed : {
+  loginChecks: function(){
+        if(sessionStorage.getItem('login') == 'true'){
+          return true;
+        }else{
+          return false;
+        }
+    },
+  },
   methods: {
+    loginCheck : function(){
+        if(sessionStorage.getItem('login') == 'true'){
+          return true;
+        }else{
+          return false;
+        }
+    },
     //로그아웃
     logout: function () {
-            if (confirm('로그아웃 하시겠습니까?') == false) {
-                return;
-            }
-            let vm = this;
-            axios({
-                url: "/user/logout.json",
-                method: "post",
-                headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
-                },
-            }).then(function (response) {
-                // console.log("logout - response : ", response);
-                vm.$router.push({ path: '/Login.page', query: {} });
-            }).catch(function (error) {
-                console.log("logout - error : ", error);
-            });
-        },
-
+        if (confirm('로그아웃 하시겠습니까?')) {
+            sessionStorage.setItem("login", false);            
+            this.$router.push({ path: '/Login.page', query: {} });
+        }           
+    },
     toggleSubMenu(index) {
       this.menuItems[index].open = !this.menuItems[index].open;
       this.showSubmenu = true;
 
client/views/pages/Analysis/Analysis.vue (deleted)
--- client/views/pages/Analysis/Analysis.vue
@@ -1,316 +0,0 @@
-<template>
-  <div class="flex">
-    <button @click="toggleSlide" class="toggle">{{ slideText }}</button>
-    <div :class="['slide-content left', { active: showSlide }]">
-      <div class="wrap flex-between">
-        <div class="iconlist">
-          <ul>
-            <li
-              v-for="item in items"
-              :key="item.id"
-              :class="{ active: item.isActive }"
-              @click="toggleActive(item)"
-            >
-              <div></div>
-              <p>{{ item.name }}</p>
-            </li>
-          </ul>
-        </div>
-        <div class="search">
-          <h2 style="background: #00b050">무단횡단 분석</h2>
-          <h2>지역별</h2>
-          <div class="box" style="background: #eaebec">
-            <div class="flex gap m-b">
-              <label style="width: 7rem">분석날짜</label>
-              <input type="date" name="" id="" />
-              <span>~</span>
-              <input type="date" name="" id="" />
-            </div>
-            <DongSelectList
-              @setDongCd="setDongCd"
-              :azimuthHiddenCk="false"
-            ></DongSelectList>
-            <div class="flex-between m-b">
-              <label for="">횡단보도</label>
-              <select name="" id=""></select>
-            </div>
-            <div class="flex-center">
-              <button type="button" class="btn-2 green-btn btn-l">조회</button>
-            </div>
-          </div>
-          <h2>검색결과</h2>
-          <div class="box bg-white tab-buttons result">
-            <h4>총 <em style="color: #13833b">200</em>건</h4>
-            <ul>
-              <li class="result">
-                <h5>1</h5>
-                <p class="m-b">시도: 대구광역시 서구 평리동</p>
-                <p class="m-b">
-                  <em style="color: #13833b">장소: 남평리네거리</em>
-                </p>
-                <p class="m-b">X좌표: 00.0000</p>
-                <p class="m-b">Y좌표: 00.0000</p>
-                <p class="">무단횡단 수: 120</p>
-              </li>
-            </ul>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="right">
-      <div class="top flex gap">
-        <button>클러스터</button>
-        <button>레이어</button>
-        <button>히트맵</button>
-      </div>
-      <div>
-        <OpenLayers ref="open_layers" />
-      </div>
-    </div>
-    <div class="chart">
-      <h2>보행자 수 대비 무단횡단 수</h2>
-      <div class=""></div>
-      <h2>무단횡단 비율</h2>
-      <div class="">
-        <h2 style="background: #f7f6f6; color: #333">시/군/구 별</h2>
-        <div class=""></div>
-        <h2 style="background: #f7f6f6; color: #333">읍/면/동 별</h2>
-        <div class=""></div>
-      </div>
-      <h2>시/도 전체 시간/요일별 발생현황</h2>
-      <div class=""></div>
-    </div>
-  </div>
-</template>
-<script>
-import Map from "../../component/map/map.vue";
-import MapPage from "../../component/map/map.vue";
-import OpenLayers from "../../component/OpenLayers.vue";
-import {
-  vworldBaseLayer,
-  vworldGrayLayer,
-  vworldMidnightLayer,
-  vworldHybridLayer,
-  vworldSatelliteLayer,
-} from "../../component/OpenLayersMap.vue";
-import { baseStyles } from "../../component/OpenLayersStyle.vue";
-import axios from "axios";
-import DongSelectList from "../../component/dongSelectList.vue";
-
-export default {
-  data() {
-    return {
-      showSlide: false,
-      slideText: '검색하기',
-      tabs: [
-        {
-          id: 1,
-          title: "상황발생현황",
-          content1: "This is the content for Tab 1",
-        },
-        {
-          id: 2,
-          title: "장애발생현황",
-          content2: "This is the content for Tab 2",
-        },
-      ],
-      activeTab: 1,
-      items: [
-        { id: 1, name: "무단횡단", isActive: false },
-        { id: 2, name: "신호연장", isActive: false },
-        { id: 3, name: "우회전 차량", isActive: false },
-        { id: 4, name: "장애발생", isActive: false },
-      ],
-    };
-  },
-  components: {
-    MapPage: MapPage,
-    Map,
-    OpenLayers: OpenLayers,
-    DongSelectList: DongSelectList,
-  },
-  methods: {
-    toggleSlide() {
-      if (this.showSlide) {
-        this.slideText = "검색하기";
-      } else {
-        this.slideText = "창닫기";
-      }
-      this.showSlide = !this.showSlide;
-    },
-    changeTab(tabId) {
-      this.activeTab = tabId;
-    },
-    toggleActive(item) {
-      for (var i = 0; i < 4; i++) {
-        this.items[i].isActive = false;
-      }
-      item.isActive = !item.isActive;
-    },
-    statusSearch: function () {
-      console.log("statusSearch this.address.dong_cd : ", this.address.dong_cd);
-
-      this.$refs.open_layers.removeLayerAll();
-      this.$refs.open_layers.setBaseMap(vworldBaseLayer);
-      // this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsGeoJson.json','realtimeStatusMap','EPSG:5181', baseStyles['MultiPolygon'],'MultiPolygon',this.address.dong_cd);
-      this.$refs.open_layers.addClusterLayer(
-        "/common/getDongsGeoJson.json",
-        "realtimeStatusMap",
-        "EPSG:5181",
-        "",
-        "",
-        this.address.dong_cd
-      );
-      // this.$refs.open_layers.createClusterSource();
-    },
-    setDongCd(value) {
-      console.log("value : ", value);
-      this.address = value;
-    },
-  },
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main2 mounted");
-    this.$refs.open_layers.setBaseMap(vworldBaseLayer);
-  },
-};
-</script>
-
-<style scoped>
-@media all and (max-width: 479px) {
-  .wrap{margin: 0 !important;}
-  .result{min-height: 30rem;}
-  .iconlist {
-    width: -webkit-fill-available;
-    height: 6rem;
-    padding: 1rem;
-  }
-  .iconlist ul {
-    display: flex;
-    align-items: center;
-    justify-content: space-around;
-  }
-  .top p {
-    padding-right: 1rem;
-  }
-  .chart {
-    width: -webkit-fill-available !important;
-  }
-
-  .top {
-    width: auto;
-    right: -1rem;
-  }
-  .top ul {
-    width: 137rem;
-    overflow: hidden;
-    justify-content: space-between !important;
-    padding: 2rem 1rem !important;
-  }
-  .top li {
-    display: flex;
-    align-items: center;
-  }
-  .search {
-    width: inherit;
-  }
-  .toggle {
-    color: #fff;
-    font-weight: bold;
-    background: #13833b;
-    display: block !important;
-    position: absolute;
-    z-index: 150;
-    top: 7.5rem;
-    right: 1rem;
-  }
-  .wrap {
-    height: auto !important;
-    width: inherit;
-    display: block;
-  }
-  .slide-content {
-    position: absolute;
-    z-index: 104;
-    top: 0rem;
-    left: 0rem;
-    /* width: 46rem;*/
-    background-color: #f0f0f0;
-    transition: transform 0.3s ease;
-    transform: translateX(100%);
-  }
-
-  .slide-content.active {
-    transform: translateX(0);
-  }
-}
-.toggle {
-  display: none;
-}
-.chart {
-  width: 600px;
-}
-.chart div {
-  min-height: 17.53rem;
-}
-.chart h2 {
-  padding: 0.5rem 0;
-}
-.search .box ul li {
-  padding: 1rem 1rem 1rem 3rem;
-}
-.result {
-  position: relative;
-}
-h5 {
-  position: absolute;
-  left: 0;
-  font-size: 2rem;
-}
-.box {
-  text-align: left;
-}
-h4 {
-  position: relative;
-  border-bottom: 1px solid #e5e3e3;
-  padding: 0 0 1rem 0;
-  text-align: left;
-}
-.btn_set div {
-  position: absolute;
-  top: 40px;
-  width: 313px;
-  height: 380px;
-  background: #fff;
-  padding: 1rem;
-}
-.bg-white::-webkit-scrollbar-thumb {
-  background-color: #fff;
-}
-h2 {
-  background: #50ba8a;
-  text-align: center;
-  color: #fff;
-  padding: 1.6rem 0;
-}
-
-.top {
-  background: none;
-  margin: 2rem;
-}
-.wrap {
-  z-index: 100;
-  top: 0;
-  height: 865px;
-}
-.left {
-  background: #fff;
-}
-.right {
-  width: -webkit-fill-available;
-}
-.top button.clicked {
-  background: #50ba8a;
-}
-</style>
client/views/pages/App.vue
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
@@ -5,7 +5,7 @@
     <div class="main-warp">
       <router-view />
     </div>
-    <Footer></Footer>
+    <!-- <Footer></Footer> -->
   </div>
 </template>
 
@@ -16,6 +16,10 @@
 import Menu from "../layout/Menu.vue";
 import Footer from "../layout/Footer.vue";
 
+var sessionOptions = {
+  persist: true
+}
+
 const App = {
   data: function () {
         return {
@@ -25,33 +29,7 @@
     methods: {
         //로그인 사용자 조회
         loginUserSelectOne: function (callback) {
-            let vm = this;
-           /* axios({
-                url: "/user/loginUserSelectOne.json",
-                method: "post",
-                headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
-                },
-            }).then(function (response) {
-                console.log("getIsLogin - response : ", response);
-                if (response.data.loginUser != null && response.data.loginUser['user_id'] != null) {
-                    vm.store.commit("setLoginUser", response.data.loginUser);
-                } else {
-                    vm.store.commit("setLoginUser", null);
-                }
-                if (response.data.key != null && response.data.key['salt'] != null) {
-                    vm.store.commit("setKey", response.data.key);
-                    // console.log("vm.store",vm.store);
-                    // console.log("response.data.key['salt']",response.data.key['salt']);
-                } else {
-                    vm.store.commit("setKey", null);
-                }
-                            console.log("vm.store  : ", vm.store);
-
-                callback(response.data);
-            }).catch(function (error) {
-                console.log("getIsLogin - error : ", error);
-            });*/
+            let vm = this;           
         }
     },
   watch: {},
@@ -61,13 +39,32 @@
     Menu: Menu,
     Footer: Footer, 
   },
-  mounted: function () {
-      //vue router에게 페이지 변경 요청을 하여, router가 페이지 변경 전, 실행되는 훅(이벤트)
-       // this.$router.beforeEach((to, from, next) => { 
-            //console.log("to : ", to, ", from : ", from);
-            //로그인 사용자 조회 후, callback을 통해 로그인 사용자 정보 받기
-      //      next("/Login.page");
-      //  });
+  mounted: function () { 
+    var vm = this;
+      this.$router.beforeEach((to, from, next) => {      
+        console.log(' xx ');  
+         vm.$forceUpdate();
+         let isLogin = sessionStorage.getItem('login');           
+         if(isLogin == 'true'){                 
+            if (to.path == '/Login.page') {
+                next('ApiTokenManagement.page');
+            } else {//로그인 페이지 이 외의 페이지들을 이동 가능하게 함
+                next();
+            }        
+         }else{           
+           if (from.path == '/Login.page') {
+                next(false);
+            } else {//로그인 페이지 이외의 페이지에서, 페이지 이동을 하려고 할 때            
+                //로그인 페이지로 이동은 무조건 가능
+                if (to.path == "/Login.page") {
+                    next();
+                } else {//로그인 페이지로 무조건 이동
+                    next("/Login.page");
+                }
+            }
+         }
+        
+      });      
     },
 };
 
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -1,52 +1,22 @@
 import { createWebHistory, createRouter } from "vue-router";
 
 import Main from '../pages/main/Main.vue';
-import RealtimeStatus from '../pages/RealtimeStatus/RealtimeStatus.vue';
-import CrosswalkListSearch from '../pages/RealtimeStatus/CrosswalkListSearch.vue';
-import SituationSearch from '../pages/RealtimeStatus/SituationSearch.vue';
-import ErrorSearch from '../pages/RealtimeStatus/ErrorSearch.vue';
-import Analysis from '../pages/Analysis/Analysis.vue';
-import CrosswalkInsert from '../pages/CrosswalkManagement/CrosswalkInsert.vue';
-import CrosswalkSearch from '../pages/CrosswalkManagement/CrosswalkSearch.vue';
 import UserManagement from '../pages/SystemManagement/UserManagement.vue';
-import DongManagement from '../pages/SystemManagement/DongManagement.vue';
-import NodeManagement from '../pages/SystemManagement/NodeManagement.vue';
-import ChargeManagement from '../pages/SystemManagement/ChargeManagement.vue';
-import DataRecord from '../pages/SystemManagement/DataRecord.vue';
-import UserAddForm from '../pages/SystemManagement/UserAddForm.vue';
-import UserModifyForm from '../pages/SystemManagement/UserModifyForm.vue';
-import ManagerAddForm from '../pages/SystemManagement/ManagerAddForm.vue';
+import ApiTokenManagement from '../pages/SystemManagement/ApiTokenManagement.vue';
+import RequestLog from '../pages/SystemManagement/RequestLogView.vue';
+import ResponseLog from '../pages/SystemManagement/ResponseLogView.vue';
 import Mypage from '../pages/User/Mypage.vue';
 import Login from '../pages/main/Login.vue';
-import IdFind from '../pages/main/IdFind.vue';
-import Introduction from '../pages/Introduction/Introduction.vue';
-import ManualDown from '../pages/Introduction/ManualDown.vue';
-import UserModifyForm from '../pages/SystemManagement/UserModifyForm.vue';
 
 const routes = [
     /* 메인화면 */
-    { path: '/', name: 'Main', component: Main},
-    { path: '/RealtimeStatus.page', name: 'RealtimeStatus', component: RealtimeStatus},
-    { path: '/Analysis.page', name: 'Analysis', component: Analysis},
-    { path: '/CrosswalkInsert.page', name: 'CrosswalkInsert', component: CrosswalkInsert},
-    { path: '/CrosswalkSearch.page', name: 'CrosswalkSearch', component: CrosswalkSearch},
-    { path: '/UserManagement.page', name: 'UserManagement', component: UserManagement},
+    { path: '/', name: 'Main', component: UserManagement},
+    { path: 'admin/UserManagement.page', name: 'UserManagement', component: ApiTokenManagement},
+    { path: '/RequestLog.page', name: 'RequestLog', component: RequestLog},
+    { path: '/ResponseLog.page', name: 'ResponseLog', component: ResposeLog},
     { path: '/Mypage.page', name: 'Mypage', component: Mypage},
     { path: '/Login.page', name: 'Login', component: Login},
-    { path: '/Introduction.page', name: 'Introduction', component: Introduction},
-    { path: '/ManualDown.page', name: 'ManualDown', component: ManualDown},
-    { path: '/CrosswalkListSearch.page', name: 'CrosswalkListSearch', component: CrosswalkListSearch},
-    { path: '/SituationSearch.page', name: 'SituationSearch', component: SituationSearch},
-    { path: '/ErrorSearch.page', name: 'ErrorSearch', component: ErrorSearch},
-    { path: '/DongManagement.page', name: 'DongManagement', component: DongManagement},
-    { path: '/NodeManagement.page', name: 'NodeManagement', component: NodeManagement},
-    { path: '/ChargeManagement.page', name: 'ChargeManagement', component: ChargeManagement},
-    { path: '/DataRecord.page', name: 'DataRecord', component: DataRecord},
-    { path: '/UserAddForm.page', name: 'UserAddForm', component: UserAddForm},
-    { path: '/UserModifyForm.page', name: 'UserModifyForm', component: UserModifyForm},
-    { path: '/ManagerAddForm.page', name: 'ManagerAddForm', component: ManagerAddForm},
-    { path: '/IdFind.page', name: 'IdFind', component: IdFind},
-    { path: '/UserModifyForm.page', name: 'UserModifyForm', component: UserModifyForm},
+    { path: '/ApiTokenManagement.page', name: 'apiApiTokenManagementokenManagement', component: ApiTokenManagement}, 
 ];
 
 const AppRouter = createRouter({
client/views/pages/AppRouter.ts
--- client/views/pages/AppRouter.ts
+++ client/views/pages/AppRouter.ts
@@ -1,56 +1,22 @@
 import { createWebHistory, createRouter } from "vue-router";
 
 import Main from '../pages/main/Main.vue';
-import RealtimeStatus from '../pages/RealtimeStatus/RealtimeStatus.vue';
-import CrosswalkListSearch from '../pages/RealtimeStatus/CrosswalkListSearch.vue';
-import SituationSearch from '../pages/RealtimeStatus/SituationSearch.vue';
-import ErrorSearch from '../pages/RealtimeStatus/ErrorSearch.vue';
-import Analysis from '../pages/Analysis/Analysis.vue';
-import CrosswalkInsert from '../pages/CrosswalkManagement/CrosswalkInsert.vue';
-import CrosswalkSearch from '../pages/CrosswalkManagement/CrosswalkSearch.vue';
 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';
-import ManagerAddForm from '../pages/SystemManagement/ManagerAddForm.vue';
-import AccessRecord from '../pages/SystemManagement/AccessRecord.vue';
+import ApiTokenManagement from './SystemManagement/ApiTokenManagement.vue';
+import requestLog from './SystemManagement/RequestLogView.vue';
+import responseLog from './SystemManagement/ResponseLogView.vue';
 import Mypage from '../pages/User/Mypage.vue';
 import Login from '../pages/main/Login.vue';
-import IdFind from '../pages/main/IdFind.vue';
-import Introduction from '../pages/Introduction/Introduction.vue';
-import ManualDown from '../pages/Introduction/ManualDown.vue';
-import UserModifyForm from '../pages/SystemManagement/UserModifyForm.vue';
-import ManagerModifyForm from '../pages/SystemManagement/ManagerModifyForm.vue';
 
 const routes = [
     /* 메인화면 */
     { path: '/', name: 'Main', component: Main},
-    { path: '/RealtimeStatus.page', name: 'RealtimeStatus', component: RealtimeStatus},
-    { path: '/Analysis.page', name: 'Analysis', component: Analysis},
-    { path: '/CrosswalkInsert.page', name: 'CrosswalkInsert', component: CrosswalkInsert},
-    { path: '/CrosswalkSearch.page', name: 'CrosswalkSearch', component: CrosswalkSearch},
     { path: '/UserManagement.page', name: 'UserManagement', component: UserManagement},
+    { path: '/requestLog.page', name: 'requestLog', component: requestLog},
+    { path: '/responseLog.page', name: 'resposeLog', component: responseLog},
     { path: '/Mypage.page', name: 'Mypage', component: Mypage},
     { path: '/Login.page', name: 'Login', component: Login},
-    { path: '/Introduction.page', name: 'Introduction', component: Introduction},
-    { path: '/ManualDown.page', name: 'ManualDown', component: ManualDown},
-    { path: '/CrosswalkListSearch.page', name: 'CrosswalkListSearch', component: CrosswalkListSearch},
-    { path: '/SituationSearch.page', name: 'SituationSearch', component: SituationSearch},
-    { 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},
-    { path: '/ManagerAddForm.page', name: 'ManagerAddForm', component: ManagerAddForm},
-    { path: '/IdFind.page', name: 'IdFind', component: IdFind},
-    { path: '/AccessRecord.page', name: 'AccessRecord', component: AccessRecord},
-    { path: '/UserModifyForm.page', name: 'UserModifyForm', component: UserModifyForm},
-    { path: '/ManagerModifyForm.page', name: 'ManagerModifyForm', component: ManagerModifyForm},
+    { path: '/ApiTokenManagement.page', name: 'ApiTokenManagement', component: ApiTokenManagement}, 
 ];
 
 const AppRouter = createRouter({
 
client/views/pages/CrosswalkManagement/CrosswalkInsert copy.vue (deleted)
--- client/views/pages/CrosswalkManagement/CrosswalkInsert copy.vue
@@ -1,492 +0,0 @@
-<template>
-  <div class="flex">
-    <button @click="toggleSlide" class="toggle">검색하기</button>
-    <div :class="['slide-content left', { active: showSlide }]">
-      <div class="wrap flex-between">
-        <div class="search">
-          <h2>횡단보도 등록</h2>
-          <div class="box">
-            <div class="flex-between m-b">
-              <label for="">시/도</label>
-              <select name="" id=""></select>
-            </div>
-            <div class="flex-between m-b">
-              <label for="">시/군/구</label>
-              <select name="" id=""></select>
-            </div>
-            <div class="flex-between m-b">
-              <label for="">행정동</label>
-              <select name="" id=""></select>
-            </div>
-            <div class="flex-between m-b">
-              <label for="">교차로</label>
-              <select name="" id=""></select>
-            </div>
-            <div class="flex-between m-b">
-              <label for="">방위각</label>
-              <select name="" id=""></select>
-            </div>
-            <div class="m-b">
-              <div class="flex m-b">
-                <label for="" class="m-r">횡단보도 좌표</label
-                ><button>좌표수정</button>
-              </div>
-              <div class="flex gap">
-                <div class="flex m-b">
-                  <label class="m-r">위도 : </label>
-                  <input
-                    style="width: 9rem"
-                    type="text"
-                    name=""
-                    id=""
-                    placeholder="00.0000"
-                  />
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">경도 : </label>
-                  <input
-                    style="width: 9rem"
-                    type="text"
-                    name=""
-                    id=""
-                    placeholder="00.0000"
-                  />
-                </div>
-              </div>
-            </div>
-            <div class="">
-              <div class="m-b flex-start" style="margin-top: 3rem">
-                <label for="">검지장비 선택</label>
-              </div>
-              <div class="flex-between m-b">
-                <input type="checkbox" /><label for="">무단횡단</label>
-                <input type="checkbox" /><label for="">신호연장</label>
-                <input type="checkbox" /><label for="">우회전차량</label>
-              </div>
-              <div class="bottom">
-                <div class="flex m-b">
-                  <label class="m-r">무단횡단 검지 범위 : </label>
-                  <input type="text" name="" id="" placeholder="" />
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">왕복차선 정보 : </label>
-                  <input type="text" name="" id="" placeholder="" />
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">우회전 차선 유무 : </label>
-                  <select style="width: 9rem" name="" id="">
-                    <option value=""></option>
-                  </select>
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">우회전 차선 유형 : </label>
-                  <input type="text" name="" id="" placeholder="" />
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">횡단보도 관리자 : </label>
-                  <div class="flex gap">
-                    <input type="text" name="" id="" placeholder="" />
-                    <button @click="modal_1 = true">검색</button>
-                    <div class="modal-wrap" v-if="modal_1 == true">
-                      <div class="modal-bg"></div>
-                      <div class="modal">
-                        <h2 class="flex-between">
-                          횡단보도 유지보수 담당자 검색<button
-                            type="button"
-                            class="gray-btn"
-                            @click="modal_1 = false"
-                          >
-                            <img
-                              src="../../../resources/images/close.png"
-                              alt=""
-                            />
-                          </button>
-                        </h2>
-                        <div class="modalmain">
-                          <div
-                            class="flex-end gap m-b"
-                            style="margin-top: 3rem"
-                          >
-                            <select name="" id="">
-                              <option value="">검색조건</option>
-                              <option value="">이름</option>
-                              <option value="">소속정보</option>
-                            </select>
-                            <input type="text" />
-                            <button type="button" class="btn-2 green-btn">
-                              검색
-                            </button>
-                          </div>
-                          <table>
-                            <thead>
-                              <tr>
-                                <td>No</td>
-                                <td>이름</td>
-                                <td>전화번호</td>
-                                <td>소속정보</td>
-                              </tr>
-                            </thead>
-                            <tbody>
-                              <tr>
-                                <td></td>
-                                <td></td>
-                                <td></td>
-                                <td></td>
-                              </tr>
-                            </tbody>
-                          </table>
-                          <div class="bottom-wrap">
-                            <div class="pg-wrap">
-                              <a href="#" class="pg-item prev">◀</a>
-                              <a href="#" class="pg-item active">1</a>
-                              <a href="#" class="pg-item">2</a>
-                              <a href="#" class="pg-item">3</a>
-                              <a href="#" class="pg-item">4</a>
-                              <a href="#" class="pg-item">5</a>
-                              <a href="#" class="pg-item next">▶</a>
-                            </div>
-                          </div>
-                        </div>
-                      </div>
-                    </div>
-                  </div>
-                </div>
-              </div>
-            </div>
-            <div class="flex-center gap" style="margin-top: 3rem">
-              <button @click="modal_2 = true">등록</button>
-              <div class="modal-wrap" v-if="modal_2 == true">
-                <div class="modal-bg"></div>
-                <div class="modal2">                  
-                  <div class="modalmain2"><h4 class="flex-between">
-                    횡단보도를&nbsp;<em style="color: blue">등록</em>&nbsp;하시겠습니까?
-                  </h4>
-                  <div class="flex-center gap" style="margin-top: 3rem;">
-                    <button @click="modal_2 = false">확인</button>
-                    <button @click="modal_2 = false">취소</button>
-                  </div>
-                  </div>
-                </div>
-              </div>
-              <button>취소</button>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="right">
-      <div><OpenLayers  ref="open_layers" /></div>
-    </div>
-  </div>
-</template>
-<style scoped>
-@media all and (max-width: 479px) {
-  .top {
-    overflow: scroll;
-  }
-  .top ul {
-    width: 137rem;
-    overflow: hidden;
-    justify-content: space-between !important;
-    padding: 2rem 1rem !important;
-  }
-  .top li {
-    display: flex;
-  }
-  .search {
-    width: inherit;
-  }
-  .toggle {
-    color: #fff;
-    font-weight: bold;
-    background: #13833b;
-    display: block !important;
-    position: absolute;
-    z-index: 150;
-    top: 7.5rem;
-    right: 1rem;
-  }
-  .wrap {
-    height: auto !important;
-    width: inherit;
-  }
-  .slide-content {
-    position: absolute;
-    z-index: 97;
-    top: 6.5rem;
-    left: -36rem;
-    width: 34rem;
-    height: 100vh;
-    background-color: #f0f0f0;
-    transition: transform 0.3s ease;
-    transform: translateX(100%);
-  }
-
-  .slide-content.active {
-    transform: translateX(0);
-  }
-}
-.toggle {
-  display: none;
-}
-label {
-  width: max-content;
-  text-align: left;
-}
-.search .box {
-  padding: 1rem 2rem;
-}
-.search input[type="text"] {
-  width: 9rem;
-}
-
-.btn_set {
-  position: relative;
-  border-bottom: 1px solid #e5e3e3;
-  padding: 0 0 1rem 0;
-}
-.btn_set div {
-  position: absolute;
-  top: 40px;
-  width: 313px;
-  height: 380px;
-  background: #fff;
-  padding: 1rem;
-}
-.bg-white {
-  min-height: 46.6rem;
-  max-height: 46.6rem;
-  overflow: scroll;
-  overflow-x: hidden;
-}
-.bg-white::-webkit-scrollbar-thumb {
-  background-color: #fff;
-}
-h2 {
-  background: #50ba8a;
-  text-align: center;
-  color: #fff;
-  padding: 1.6rem 0;
-}
-.top p {
-  font-size: 15px;
-}
-.top ul {
-  padding: 1rem 0;
-}
-.top li {
-  width: calc(100% / 6);
-  text-align: center;
-}
-.top h3 {
-  font-size: 20px;
-}
-.wrap {
-  z-index: 100;
-  top: 0;
-  height: 865px;
-}
-.left {
-  background: #fff;
-}
-.right {
-  width: -webkit-fill-available;
-}
-.pg-item {
-  display: inline-block;
-  padding: 10px;
-  color: #949292;
-}
-table {
-  width: 100%;
-  text-align: center;
-  border-collapse: collapse;
-}
-
-th,
-td {
-  border-left: none;
-  border-right: none;
-}
-
-table th {
-  padding: 15px 0;
-  color: #fff;
-  background-color: #13833b;
-}
-
-table td {
-  padding: 10px 0;
-  border-bottom: 1px solid #e5e5dd;
-}
-
-table thead tr {
-  background-color: #f7f6f6;
-}
-.modal2{padding: 3rem;}
-.modal2 h4{font-size: 2rem;}
-.modal {
-  width: 100rem;
-}
-.modalmain {
-  padding: 1rem;
-  max-height: 70rem;
-  overflow: scroll;
-  overflow-x: hidden;
-}
-.modalmain select {
-  width: max-content;
-}
-.modalmain input[type="text"] {
-  width: inherit;
-}
-.modalmain table thead {
-  background: #f7f6f6;
-}
-.modalmain table td {
-  border: 1px solid #eee;
-}
-.modal h2 {
-  background: #e5e5dd;
-  font-size: 2rem;
-  padding: 1rem;
-  color: #333;
-}
-.modal-bg h2 {
-  background: #e5e5dd;
-  font-size: 2rem;
-  padding: 1rem;
-}
-.modal h3 {
-  font-size: 1.8rem;
-  border-bottom: 1px solid #eee;
-  padding: 1rem 0 0.2rem 0;
-}
-.modal h4 {
-  font-size: 1.6rem;
-  font-weight: 100;
-  padding: 0.2rem 0 1rem 0;
-}
-.modal h2 button {
-  border: 0;
-  background: none;
-  height: 30px;
-  cursor: pointer;
-}
-.modal-bg button {
-  border: 0;
-  background: none;
-  height: 30px;
-  cursor: pointer;
-}
-.modal button img {
-  width: 25px;
-}
-</style>
-<script>
-import axios from 'axios';
-import MapPage from "../../component/MapPage.vue";
-import OpenLayers from "../../component/OpenLayers.vue";
-import {
-  vworldBaseLayer,
-  vworldGrayLayer,
-  vworldMidnightLayer,
-  vworldHybridLayer,
-  vworldSatelliteLayer,
-} from "../../component/OpenLayersMap.vue"; 
-import {baseStyles} from '../../component/OpenLayersStyle.vue';
-
-var freeBus = {
-    "type": "FeatureCollection",
-    "features": [
-        {
-            "type": "Feature",
-            "properties": {
-                "popupContent": "18th & California Light Rail Stop",
-                "data" : 123
-            },
-            "geometry": {
-                "type": "Point",
-                "coordinates": [126.9757184, 37.564388]                
-            }
-        },{
-            "type": "Feature",
-            "properties": {
-                "popupContent": "20th & Welton Light Rail Stop",
-                "data" : 456
-            },
-            "geometry": {
-                "type": "Point",
-                "coordinates": [124.9748523, 37.5796212]
-            }
-        }
-    ]
-};
-
-export default {
-  data() {
-    return {
-      showSlide: false,
-      modal_1: false,
-      modal_2: false,
-      tabs: [
-        {
-          id: 1,
-          title: "상황발생현황",
-          content1: "This is the content for Tab 1",
-        },
-        {
-          id: 2,
-          title: "장애발생현황",
-          content2: "This is the content for Tab 2",
-        },
-      ],
-      activeTab: 1,
-      items: [
-        { id: 1, name: "무단횡단", isActive: false },
-        { id: 2, name: "신호연장", isActive: false },
-        { id: 3, name: "우회전 차량", isActive: false },
-        { id: 4, name: "장애발생", isActive: false },
-      ],
-    };
-  },
-  components: {
-    MapPage: MapPage,
-    OpenLayers: OpenLayers,
-  },
-  methods: {
-    toggleSlide() {
-      this.showSlide = !this.showSlide;
-    },
-    changeTab(tabId) {
-      this.activeTab = tabId;
-    },
-    toggleActive(item) {
-      item.isActive = !item.isActive;
-    },
-    childClick : function(prop,coordinate){        
-       
-      console.log(prop);
-      console.log(coordinate);
-
-      // 레이어 삭제
-      this.$refs.open_layers.removeLayer('point1');
-
-      // Icon 그리기 
-      this.$refs.open_layers.createIcon(coordinate[0],coordinate[1],'/client/resources/images/icon/fin.png',0.3, 'point1');        
-
-    }
-  },
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main2 mounted");   
-    var vm = this;
-    // 지도 초기화 
-    this.$refs.open_layers.setBaseMap(vworldBaseLayer);    
-     //this.$refs.open_layers.addVectorLayerByUrl('/testDongGeoJson.json','testMap','EPSG:4326', baseStyles['labelStyle'],'label');    
-     this.$refs.open_layers.addVectorLayerByUrl('/testDongGeoJson2.json','testMap','EPSG:5181', baseStyles['MultiPolygon'],'MultiPolygon'); 
-
-  },
-};
-</script>
 
client/views/pages/CrosswalkManagement/CrosswalkInsert.vue (deleted)
--- client/views/pages/CrosswalkManagement/CrosswalkInsert.vue
@@ -1,892 +0,0 @@
-<template>
-  <div class="flex">
-    <button @click="toggleSlide" class="toggle">{{ slideText }}</button>
-    <div :class="['slide-content left', { active: showSlide }]">
-      <div class="wrap flex-between">
-        <div class="search">
-          <h2>횡단보도 등록</h2>
-
-          <div class="box">
-            <div class="flex-between m-b" id="siDoHiddenCk">
-              <label for="">시/도</label>
-              <select name="siDoSelectList" id="siDoSelectList" v-model="address['siDo_dong_cd']" @change="siDoGunGuSelectF($event)">
-                <option :value=null disabled> 대구광역시</option>
-                <option v-for="(item, key) in siDoList" :key="key" :value="item['dong_cd']">
-                  {{ item['dong_nm'] }}
-                </option>
-              </select>
-            </div>
-            <div class="flex-between m-b" id="gunGuHiddenCk">
-              <label for="">시/군/구</label>
-              <select name="gunGuSelectList" id="gunGuSelectList" v-model="address['guGun_dong_cd']" @change="siDoGunGuSelectF($event)">
-                <option :value=null disabled> 서구 </option>
-                <option v-for="(item, key) in gunGuList" :key="key" :value="item['dong_cd']">
-                  {{ item['dong_nm'] }}
-                </option>
-              </select>
-            </div>
-            <div class="flex-between m-b" id="dongHiddenCk">
-              <label for="">행정동</label>
-              <select name="dongSelectList" id="dongSelectList" v-model="address['dong_dong_cd']" @change="dongSelectF($event)">
-                <option :value=null disabled> 행정동 </option>
-                <option v-for="(item, key) in dongList" :key="key" :value="item['dong_cd']">
-                  {{ item['dong_nm'] }}
-                </option>
-              </select>
-            </div>
-            <div class="flex-between m-b" id="nodeHiddenCk">
-              <label for="">교차로</label>
-              <select name="nodeSelectList" id="nodeSelectList" v-model="address['node_id']" @change="nodeSelectF($event)">
-                <option :value=null disabled> 교차로 </option>
-                <option v-for="(item, key) in nodeList" :key="key" :value="item['node_id']" >
-                  {{ item['node_name'] }}
-                </option>
-              </select>
-            </div>
-            <div class="flex-between m-b" id="azimuthHiddenCk">
-              <label for="">방위각</label>
-              <select name="azimutSelectList" id="azimutSelectList" v-model="address['crslk_az']">
-                <option :value="0" disabled> 방위각 </option>
-                <option :value="10">북</option>
-                <option :value="50">북동</option>
-                <option :value="20">동</option>
-                <option :value="60">남동</option>
-                <option :value="30">남</option>
-                <option :value="70">남서</option>
-                <option :value="40">서</option>
-                <option :value="80">북서</option>
-              </select>
-            </div>
-
-            <div class="m-b">
-              <div class="flex m-b">
-                <label for="" class="m-r">횡단보도 좌표</label><button @click="clickStateChange()">좌표선택</button>
-              </div>
-              <div class="flex gap">
-                <div class="flex m-b">
-                  <label class="m-r">위도 : </label>
-                  <input style="width: 9rem" type="text" name="" id="" placeholder="00.0000" v-model="address.coordinate[1]"/>
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">경도 : </label>
-                  <input style="width: 9rem" type="text" name="" id="" placeholder="00.0000" v-model="address.coordinate[0]"/>
-                </div>
-              </div>
-            </div>
-            <div class="">
-              <div class="m-b flex-start" style="margin-top: 3rem">
-                <label for="">검지장비 선택</label>
-              </div>
-              <div class="flex-between m-b">
-                <input type="checkbox" v-model="condition.wtrms_crosng_eqpmn_instl_yn"/><label for="">무단횡단</label>
-                <input type="checkbox" v-model="condition.signl_extn_eqpmn_instl_yn"/><label for="">신호연장</label>
-                <input type="checkbox" v-model="condition.rittrn_vhcle_eqpmn_instl_yn"/><label for="">우회전차량</label>
-              </div>
-              <div class="bottom">
-                <div class="flex m-b">
-                  <label class="m-r">무단횡단 검지 범위 : </label>
-                  <input type="text" name="" id="" placeholder="검지 범위 입력" v-model="condition.wtrms_crosng_detct_rate" />
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">왕복차선 정보 : </label>
-                  <input type="text" name="" id="" placeholder="왕복 차선 정보 입력" v-model="condition.rndtp_tfclne_info"/>
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">우회전 차선 유무 : </label>
-                  <select style="width: 9rem" name="" id="" v-model="condition.rittrn_tfclne_yn">
-                    <option :value="null">우회전 차선 유무 선택</option>
-                    <option :value=true>있음</option>
-                    <option :value=false>없음</option>
-                  </select>
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">우회전 차선 유형 : </label>
-                  <input type="text" name="" id="" placeholder="우회전 차선 유형 입력" v-model="condition.rittrn_tfclne_ty"/>
-                </div>
-                <div class="flex m-b">
-                  <label class="m-r">횡단보도 관리자 : </label>
-                  <div class="flex gap">
-                    <input type="text" name="" id="" placeholder="" v-model="managerInfo.mngr_nm">
-                    <button @click="modal_1 = true">검색</button>
-                    <div class="modal-wrap" v-if="modal_1 == true">
-                      <div class="modal-bg"></div>
-                      <div class="modal">
-                        <h2 class="flex-between">
-                          횡단보도 유지보수 담당자 검색<button type="button" class="gray-btn" @click="modal_1 = false">
-                            <img src="../../../resources/images/close.png" alt="" />
-                          </button>
-                        </h2>
-                        <div class="modalmain">
-                          <div class="flex-end gap m-b" style="margin-top: 3rem">
-                            <select name="" id="">
-                              <option value="">검색조건</option>
-                              <option value="">이름</option>
-                              <option value="">소속정보</option>
-                            </select>
-                            <input type="text" />
-                            <button type="button" class="btn-2 green-btn">
-                              검색
-                            </button>
-                          </div>
-                          <table>
-                            <thead>
-                              <tr>
-                                <td>No</td>
-                                <td>이름</td>
-                                <td>전화번호</td>
-                                <td>소속정보</td>
-                              </tr>
-                            </thead>
-                            <tbody>
-                              <tr v-for="(item, idx) in managerList" :key="idx" @click="managerSelect(item)">
-                                  <td data-title="No">{{ managerIdx - idx }}</td>
-                                  <td data-title="이름">{{ item['mngr_nm'] }}</td>
-                                  <td data-title="전화번호">{{ HyphenMinus(item['mngr_telno']) }}</td>
-                                  <td data-title="소속정보">{{ item['mngr_ogdp_info'] }}</td>
-                                </tr>
-                                <tr v-show="managerList.length == 0">
-                                    <td class="exception" colspan="9">조회된 데이터가 없습니다</td>
-                                </tr>
-                            </tbody>
-                          </table>
-                          <div class="bottom-wrap">
-                            <div class="pg-wrap">
-                              <a href="#" class="pg-item prev">◀</a>
-                              <a href="#" class="pg-item active">1</a>
-                              <a href="#" class="pg-item">2</a>
-                              <a href="#" class="pg-item">3</a>
-                              <a href="#" class="pg-item">4</a>
-                              <a href="#" class="pg-item">5</a>
-                              <a href="#" class="pg-item next">▶</a>
-                            </div>
-                          </div>
-                        </div>
-                      </div>
-                    </div>
-                  </div>
-                </div>
-              </div>
-            </div>
-            <div class="flex-center gap" style="margin-top: 3rem">
-              <button @click="modal_2 = true">등록</button>
-              <div class="modal-wrap" v-if="modal_2 == true">
-                <div class="modal-bg"></div>
-                <div class="modal2">
-                  <div class="modalmain2">
-                    <h4 class="flex-between">
-                      횡단보도를&nbsp;<em style="color: blue">등록</em>&nbsp;하시겠습니까?
-                    </h4>
-                    <div class="flex-center gap" style="margin-top: 3rem;">
-                      <button @click="crslkInsert">확인</button>
-                      <button @click="modal_2 = false">취소</button>
-                    </div>
-                  </div>
-                </div>
-              </div>
-              <button>취소</button>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="right">
-      <div>
-        <OpenLayers ref="open_layers" />
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-
-import axios from 'axios';
-import MapPage from "../../component/MapPage.vue";
-import OpenLayers from "../../component/OpenLayers.vue";
-import {
-  naverBaseLayer,
-  vworldBaseLayer,
-  vworldGrayLayer,
-  vworldMidnightLayer,
-  vworldHybridLayer,
-  vworldSatelliteLayer,
-} from "../../component/OpenLayersMap.vue";
-import { baseStyles } from '../../component/OpenLayersStyle.vue';
-import DongSelectList from '../../component/dongSelectList.vue';
-import COMMON_UTIL from "../../../resources/js/commonUtil.ts";
-import PaginationButton from "../../component/pagination/PaginationButton.vue";
-
-var freeBus = {
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "type": "Feature",
-      "properties": {
-        "popupContent": "18th & California Light Rail Stop",
-        "data": 123
-      },
-      "geometry": {
-        "type": "Point",
-        "coordinates": [126.9757184, 37.564388]
-      }
-    }, {
-      "type": "Feature",
-      "properties": {
-        "popupContent": "20th & Welton Light Rail Stop",
-        "data": 456
-      },
-      "geometry": {
-        "type": "Point",
-        "coordinates": [124.9748523, 37.5796212]
-      }
-    }
-  ]
-};
-
-export default {
-  data() {
-    return {
-      showSlide: false,
-      slideText: '횡단보도 등록',
-      address: {
-        //지역 설정
-        dong_cd : "22030",
-        siDo_dong_cd : "22",
-        guGun_dong_cd : "22030",
-        dong_dong_cd : null,
-        node_id : null,
-        node_name :null,
-        zoomLevel : null,
-        crslk_az : "0",
-        coordinate : [],
-        lat : null,
-        lon : null,
-        baseSource:"EPSG:5181",
-      },
-      //조건설정
-      condition: {
-        //체크박스(장비 설치 유무)
-        signl_extn_eqpmn_instl_yn: false,
-        wtrms_crosng_eqpmn_instl_yn: false,
-        rittrn_vhcle_eqpmn_instl_yn: false,
-        //무단횐단 검지 범위
-        wtrms_crosng_detct_rate:null,
-        //왕복차선 정보
-        rndtp_tfclne_info:null,
-        //우회전 차선 유무
-        rittrn_tfclne_yn:null,
-        //우회전 차선 유형
-        rittrn_tfclne_ty:null,
-      },
-      managerListSearch :{
-        currentPage: 1,
-        perPage: 10,
-        searchType: null,
-        searchText: null,
-        startDate: null,
-        endDate: null,
-      },
-      managerInfo:{
-        mngr_eml: null,
-        mngr_nm: null,
-        mngr_ogdp_info: null,
-        mngr_telno:null,
-        mntnce_mngr_id: null,
-        reg_dt: null,
-        rgtr_id: null,
-      },
-      managerList:[],
-      managetListCount:0,
-      managerIdx: 0,
-      
-
-      siDoList: [],
-      gunGuList: [],
-      dongList: [],
-      nodeList: [],
-
-
-      clickState : false,
-      modal_1: false,
-      modal_2: false,
-      tabs: [
-        {
-          id: 1,
-          title: "상황발생현황",
-          content1: "This is the content for Tab 1",
-        },
-        {
-          id: 2,
-          title: "장애발생현황",
-          content2: "This is the content for Tab 2",
-        },
-      ],
-      activeTab: 1,
-      items: [
-        { id: 1, name: "무단횡단", isActive: false },
-        { id: 2, name: "신호연장", isActive: false },
-        { id: 3, name: "우회전 차량", isActive: false },
-        { id: 4, name: "장애발생", isActive: false },
-      ],
-    };
-  },
-  components: {
-    MapPage: MapPage,
-    OpenLayers: OpenLayers,
-    DongSelectList: DongSelectList,
-  },
-  methods: {
-    toggleSlide() {
-      if (this.showSlide) {
-        this.slideText = "횡단보도 등록";
-      } else {
-        this.slideText = "창닫기";
-      }
-      this.showSlide = !this.showSlide;
-    },
-    changeTab(tabId) {point_lat 
-      this.activeTab = tabId;
-    },
-    toggleActive(item) {
-      item.isActive = !item.isActive;
-    },
-
-    childClick: function (prop, coordinate) {
-      if(this.clickState){
-        this.address.coordinate=coordinate;
-        console.log("prop : ", prop);
-        console.log("coordinate : ", coordinate);
-        // 레이어 삭제
-        this.$refs.open_layers.removeLayer('point1');
-        // Icon 그리기 
-        this.$refs.open_layers.createIcon(coordinate[1], coordinate[0], '/client/resources/images/icon/fin2.png', 0.3, 'point1', 'EPSG:5181');
-        this.clickState=false;
-      }
-      else{
-        this.$refs.open_layers.removeLayer('point1');
-        this.address.coordinate[0]=null;
-        this.address.coordinate[1]=null;
-      }
-    },
-    moveClick: function (){
-      
-    },
-    //시/도 받아오기
-    siDoSelectList: function () {
-      const vm = this;
-      axios({
-        url: '/dong/siDoSelectList.json',
-        method: 'post',
-        headers: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: {}
-      }).then(function (response) {
-        console.log("siDoSelectList - response : ", response.data);
-        vm.siDoList = response.data;
-      }).catch(function (error) {
-        console.log("siDoSelectList - error : ", error);
-      });
-    },
-
-    //군/구 받아오기
-    gunGuSelect: function (dong_cd) {
-      const vm = this;
-      axios({
-        url: '/dong/gunGuSelectList.json',
-        method: 'post',
-        headers: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: { 'dong_cd': dong_cd }
-      }).then(function (response) {
-        console.log("gunGuSelect - response : ", response.data);
-        vm.gunGuList = response.data;
-      }).catch(function (error) {
-        console.log("gunGuSelect - error : ", error);
-      });
-    },
-
-    //행정동 받아오기
-    dongSelectList: function (dong_cd) {
-      const vm = this;
-      axios({
-        url: '/dong/dongSelectList.json',
-        method: 'post',
-        headers: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: { 'dong_cd': dong_cd }
-      }).then(function (response) {
-        console.log("dongSelectList - response : ", response.data);
-        vm.dongList = response.data;
-      }).catch(function (error) {
-        console.log("dongSelectList - error : ", error);
-      });
-    },
-
-    //노드(교차로) 받아오기
-    findNodeUsingDongSelectList: function (dong_cd) {
-      const vm = this;
-      axios({
-        url: '/node/findNodeUsingDongSelectList.json',
-        method: 'post',
-        headers: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: { 'dong_cd': dong_cd }
-      }).then(function (response) {
-        console.log("findNodeUsingDongSelectList - response : ", response.data);
-        vm.nodeList = response.data;
-      }).catch(function (error) {
-        console.log("findNodeUsingDongSelectList - error : ", error);
-      });
-    },
-
-    //횡단보도 등록
-    crslkInsert:function(){
-      const vm = this;
-      axios({
-        url: "/management/crslkInsert.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
-        },
-        data: {"address":vm.address,"condition":vm.condition,"managerInfo":vm.managerInfo},
-      })
-        .then(function (response) {
-          console.log("crslkInsert - response : ", response.data);
-          vm.modal_2 = false;
-        })
-        .catch(function (error) {
-          console.log("crslkInsert - error : ", error);
-          alert(
-            "횡단보도 등록 오류, 관리자에게 문의해주세요."
-          );
-        });
-    },
-
-    //횡단보도 유지보수 관리자 목록 조회
-    managerSelectList: function () {
-      const vm = this;
-      axios({
-        url: "/managerSelectList.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
-        },
-        data: vm.managerListSearch,
-      })
-        .then(function (response) {
-          console.log("managerSelectList - response : ", response.data);
-          vm.managerListCount = response.data.managerListCount;
-          vm.managerList = response.data.managerList;
-          vm.managerIdx = vm.managerListCount-(vm.managerListSearch.currentPage-1)*vm.managerList.length;
-        })
-        .catch(function (error) {
-          console.log("managerSelectList - error : ", error);
-          alert(
-            "횡단보도 유지보수 관리자 목록 조회 오류, 관리자에게 문의해주세요."
-          );
-        });
-    },
-    managerSelect:function(managerInfo){
-      this.managerInfo=managerInfo;
-    },
-
-    // 전화번호 '-' 추가 후 출력
-    HyphenMinus: function (telno) {
-      return COMMON_UTIL.HyphenMinus(telno);
-    },
-
-    //날짜 시,분,초 자르기
-    yyyymmdd: function (date) {
-      return COMMON_UTIL.yyyymmdd(date);
-    },
-
-    //DongSelectList에서 dong_cd 받아오기
-    setDongCd(value) {
-      console.log("value : ", value);
-      this.address = value;
-    },
-
-    //시/도/군/구 Select 선택시 바로 위치 이동
-    siDoGunGuSelectF: function (event) {
-      //기존 layer 지우기
-      this.$refs.open_layers.removeLayerAll();
-      //기본 지도 layer 그리기 + 해당 위치로 이동
-      this.$refs.open_layers.setBaseMap(vworldBaseLayer,event.target.value);
-      this.$refs.open_layers.setZoom(this.address.zoomLevel);
-      //polygon 그리기
-      this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsGeoJson.json', 'multPolygonLayer', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd);
-      // 지역 중앙에 노드 + 이름 넣기
-      this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsCenterJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label', this.address.dong_cd);
-
-    },
-
-    //행정동 Select 선택시 바로 위치 이동
-    dongSelectF: function (event) {
-      //기존 layer 지우기
-      this.$refs.open_layers.removeLayerAll();
-      //기본 지도 layer 그리기 + 해당 위치로 이동
-      this.$refs.open_layers.setBaseMap(vworldBaseLayer,event.target.value);
-      this.$refs.open_layers.setZoom(this.address.zoomLevel);
-      //polygon 그리기
-      this.$refs.open_layers.addVectorLayerByUrl('/common/getDongGeoJson.json', 'multPolygonLayer', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd);
-      // 행정동에 포함된 노드 넣기
-      this.$refs.open_layers.addVectorLayerByUrl('/common/getNodesGeoJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label', this.address.dong_cd);
-    },
-
-    //노드 Select 선택시 바로 위치 이동
-    nodeSelectF: function (event) {
-      //기존 layer 지우기
-      this.$refs.open_layers.removeLayerAll();
-      //기본 지도 layer 그리기 + 해당 위치로 이동
-      this.$refs.open_layers.setBaseMap(vworldBaseLayer,this.address.dong_cd,  event.target.value);
-      this.$refs.open_layers.setZoom(this.address.zoomLevel);
-      //polygon 그리기
-      this.$refs.open_layers.addVectorLayerByUrl('/node/getNodeGeoJson.json', 'multPolygonLayer', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd, this.address.node_id);
-      // 노드 중앙에 노드 그리기
-      this.$refs.open_layers.addVectorLayerByUrl('/node/getNodeGeoJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label', this.address.dong_cd, this.address.node_id);
-    },   
-    
-    childMoveEnd(zoom) {
-      console.log("zoom : ", zoom);
-      if(zoom <= 19) {
-        // this.$refs.open_layers.removeLayer('multPolygonLayer');
-        this.$refs.open_layers.removeLayer('nodeLayer');
-        this.$refs.open_layers.addVectorLayerByUrl('/testgetnodeGeoJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label',this.address.dong_cd);
-      } else if (zoom <= 15) {
-        this.$refs.open_layers.removeLayer('nodeLayer');
-        this.$refs.open_layers.addVectorLayerByUrl('/testDdongGeoJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label',this.address.dong_cd);
-      } else if (zoom <= 14) {
-        this.$refs.open_layers.removeLayer('nodeLayer');
-        this.$refs.open_layers.addVectorLayerByUrl('/testgetSigunguGeoJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label',this.address.dong_cd);
-        // this.$refs.open_layers.removeLayer('multPolygonLayer');
-        // this.$refs.open_layers.addVectorLayerByUrl('/common/getDongGeoJson.json','multPolygonLayer','EPSG:5181', baseStyles['MultiPolygon'],'MultiPolygon');
-      } 
-      else {
-        // this.$refs.open_layers.removeLayer('multPolygonLayer');
-        // this.$refs.open_layers.addVectorLayerByUrl('/common/getDongGeoJson.json','multPolygonLayer','EPSG:5181', baseStyles['MultiPolygon'],'MultiPolygon');
-        this.$refs.open_layers.removeLayer('nodeLayer');
-        this.$refs.open_layers.addVectorLayerByUrl('/testgetSidoGeoJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label',this.address.dong_cd);  
-      }
-    },
-    clickStateChange(){
-      this.clickState=true;
-    }
-  },
-  watch: {
-    'address.siDo_dong_cd': function (newValue, oldValue) {
-      console.log("siDo_dong_cd newValue : ", newValue);
-      console.log("siDo_dong_cd oldValue : ", oldValue);
-      this.address.dong_cd = newValue;
-      this.address.zoomLevel = 11.5;
-      this.gunGuList = null; 
-      this.dongList = null;
-
-      this.gunGuSelect(newValue);
-
-    },
-    'address.guGun_dong_cd': function (newValue, oldValue) {
-      console.log("guGun_dong_cd newValue : ", newValue);
-      console.log("guGun_dong_cd oldValue : ", oldValue);
-      this.address.dong_cd = newValue;
-      this.address.zoomLevel = 14;
-      this.dongList = null;
-      if (newValue != null) {
-        this.dongSelectList(newValue);
-      }
-    },
-    'address.dong_dong_cd': function (newValue, oldValue) {
-      console.log("dong_dong_cd newValue : ", newValue);
-      console.log("dong_dong_cd oldValue : ", oldValue);
-      this.address.dong_cd = newValue;
-      this.address.zoomLevel = 15;
-      this.findNodeUsingDongSelectList(newValue);
-    },
-    'address.node_id': function (newValue, oldValue) {
-      console.log("node_id newValue : ", newValue);
-      console.log("node_id oldValue : ", oldValue);
-      this.address.node_id = newValue;
-      this.nodeList.forEach((node)=>{
-        if(node.node_id==newValue){
-          this.address.node_name=node.node_name;
-        }
-      })
-      this.address.zoomLevel = 19;
-    },
-    'address.coordinate': function (newValue, oldValue) {
-      console.log("coordinate newValue : ", newValue);
-      console.log("coordinate oldValue : ", oldValue);
-      this.address.lat=newValue[0];
-      this.address.lon=newValue[1];
-    },
-    'managerInfo': function (newValue, oldValue) {
-      console.log("managerInfo newValue : ", newValue);
-      console.log("managerInfo oldValue : ", oldValue);
-    },
-  },
-  computed: {},
-  mounted() {
-    console.log("Main2 mounted");
-    this.siDoSelectList();
-    this.gunGuSelect(this.address.siDo_dong_cd);
-    this.dongSelectList(this.address.guGun_dong_cd);
-    this.managerSelectList();
-    // 지도 초기화 
-    this.$refs.open_layers.setBaseMap(vworldBaseLayer);
-    // 지도 폴리곤 넣기
-    this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsGeoJson.json', 'multPolygonLayer', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd);
-    // 지역 중앙에 노드 + 이름 넣기
-    this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsCenterJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label', this.address.dong_cd);
-
-
-  },
-};
-</script>
-<style scoped>
-@media all and (max-width: 479px) {
-  .top {
-    overflow: scroll;
-  }
-
-  .top ul {
-    width: 137rem;
-    overflow: hidden;
-    justify-content: space-between !important;
-    padding: 2rem 1rem !important;
-  }
-
-  .top li {
-    display: flex;
-  }
-
-  .search {
-    width: inherit;
-  }
-
-  .toggle {
-    color: #fff;
-    font-weight: bold;
-    background: #13833b;
-    display: block !important;
-    position: absolute;
-    z-index: 150;
-    top: 1.3rem;
-    right: 1rem;
-  }
-
-  .wrap {
-    height: auto !important;
-    width: inherit;
-    margin: 0 !important;
-  }
-
-  .slide-content {
-    position: absolute;
-    z-index: 97;
-    left: 0;
-    width: -webkit-fill-available;
-    height: 100vh;
-    background-color: #f0f0f0;
-    transition: transform 0.3s ease;
-    transform: translateX(100%);
-  }
-
-  .slide-content.active {
-    transform: translateX(0);
-  }
-}
-
-.toggle {
-  display: none;
-}
-
-label {
-  width: max-content;
-  text-align: left;
-}
-
-.search .box {
-  padding: 1rem 2rem;
-}
-
-.search input[type="text"] {
-  width: 9rem;
-}
-
-.btn_set {
-  position: relative;
-  border-bottom: 1px solid #e5e3e3;
-  padding: 0 0 1rem 0;
-}
-
-.btn_set div {
-  position: absolute;
-  top: 40px;
-  width: 313px;
-  height: 380px;
-  background: #fff;
-  padding: 1rem;
-}
-
-.bg-white {
-  min-height: 46.6rem;
-  max-height: 46.6rem;
-  overflow: scroll;
-  overflow-x: hidden;
-}
-
-.bg-white::-webkit-scrollbar-thumb {
-  background-color: #fff;
-}
-
-h2 {
-  background: #50ba8a;
-  text-align: center;
-  color: #fff;
-  padding: 1.6rem 0;
-}
-
-.top p {
-  font-size: 15px;
-}
-
-.top ul {
-  padding: 1rem 0;
-}
-
-.top li {
-  width: calc(100% / 6);
-  text-align: center;
-}
-
-.top h3 {
-  font-size: 20px;
-}
-
-.wrap {
-  z-index: 100;
-  top: 0;
-  height: 865px;
-}
-
-.left {
-  background: #fff;
-}
-
-.right {
-  width: -webkit-fill-available;
-}
-
-.pg-item {
-  display: inline-block;
-  padding: 10px;
-  color: #949292;
-}
-
-table {
-  width: 100%;
-  text-align: center;
-  border-collapse: collapse;
-}
-
-th,
-td {
-  border-left: none;
-  border-right: none;
-}
-
-table th {
-  padding: 15px 0;
-  color: #fff;
-  background-color: #13833b;
-}
-
-table td {
-  padding: 10px 0;
-  border-bottom: 1px solid #e5e5dd;
-}
-
-table thead tr {
-  background-color: #f7f6f6;
-}
-
-.modal2 {
-  padding: 3rem;
-}
-
-.modal2 h4 {
-  font-size: 2rem;
-}
-
-.modal {
-  width: 100rem;
-}
-
-.modalmain {
-  padding: 1rem;
-  max-height: 70rem;
-  overflow: scroll;
-  overflow-x: hidden;
-}
-
-.modalmain select {
-  width: max-content;
-}
-
-.modalmain input[type="text"] {
-  width: inherit;
-}
-
-.modalmain table thead {
-  background: #f7f6f6;
-}
-
-.modalmain table td {
-  border: 1px solid #eee;
-}
-
-.modal h2 {
-  background: #e5e5dd;
-  font-size: 2rem;
-  padding: 1rem;
-  color: #333;
-}
-
-.modal-bg h2 {
-  background: #e5e5dd;
-  font-size: 2rem;
-  padding: 1rem;
-}
-
-.modal h3 {
-  font-size: 1.8rem;
-  border-bottom: 1px solid #eee;
-  padding: 1rem 0 0.2rem 0;
-}
-
-.modal h4 {
-  font-size: 1.6rem;
-  font-weight: 100;
-  padding: 0.2rem 0 1rem 0;
-}
-
-.modal h2 button {
-  border: 0;
-  background: none;
-  height: 30px;
-  cursor: pointer;
-}
-
-.modal-bg button {
-  border: 0;
-  background: none;
-  height: 30px;
-  cursor: pointer;
-}
-
-.modal button img {
-  width: 25px;
-}
-</style>(No newline at end of file)
 
client/views/pages/CrosswalkManagement/CrosswalkSearch.vue (deleted)
--- client/views/pages/CrosswalkManagement/CrosswalkSearch.vue
@@ -1,304 +0,0 @@
-<template>
-  <div class="flex">
-    <div class="left">
-      <div class="wrap flex-between">
-        <div class="search">
-          <h2>횡단보도 조회</h2>
-          <div class="box">
-            <DongSelectList @setDongCd="setDongCd" ref="parent" :crslk_azHiddenCk=true :open_layers="this.$refs.open_layers"
-            @siDoGunGuSelectF="siDoGunGuSelectF" @dongSelectF="dongSelectF" @nodeSelectF="nodeSelectF"></DongSelectList>
-            <div class="flex-center"><button class="btn-l">검색</button></div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="right">
-      <div><OpenLayers ref="open_layers" /></div>
-    </div>
-  </div>
-</template>
-
-<script>
-import OpenLayers from "../../component/OpenLayers.vue";
-import {
-  vworldBaseLayer,
-  vworldGrayLayer,
-  vworldMidnightLayer,
-  vworldHybridLayer,
-  vworldSatelliteLayer,
-} from "../../component/OpenLayersMap.vue";
-import { baseStyles } from '../../component/OpenLayersStyle.vue';
-import axios from "axios";
-import DongSelectList from '../../component/dongSelectList.vue';
-import MapPage from "../../component/MapPage.vue";
-
-export default {
-  data() {
-    return {
-      address: {
-        //지역 설정
-        dong_cd : "22030",
-        siDo_dong_cd : "22",
-        guGun_dong_cd : "22030",
-        dong_dong_cd : null,
-        node_id : null,
-        node_name :null,
-        zoomLevel : null,
-        crslk_az : "0",
-        coordinate : [],
-        lat : null,
-        lon : null,
-        baseSource:"EPSG:5181",
-      },
-
-      modal_1: false,
-      modal_2: false,
-      tabs: [
-        {
-          id: 1,
-          title: "상황발생현황",
-          content1: "This is the content for Tab 1",
-        },
-        {
-          id: 2,
-          title: "장애발생현황",
-          content2: "This is the content for Tab 2",
-        },
-      ],
-      activeTab: 1,
-      items: [
-        { id: 1, name: "무단횡단", isActive: false },
-        { id: 2, name: "신호연장", isActive: false },
-        { id: 3, name: "우회전 차량", isActive: false },
-        { id: 4, name: "장애발생", isActive: false },
-      ],
-    };
-  },
-  components: {
-    OpenLayers: OpenLayers,
-    DongSelectList: DongSelectList,
-  },
-  methods: {
-    //DongSelectList에서 dong_cd 받아오기
-    setDongCd(value) {
-      console.log("value : ", value);
-      this.address = value;
-    },
-
-    //시/도/군/구 Select 선택시 바로 위치 이동
-    siDoGunGuSelectF: function (event) {
-      //기존 layer 지우기
-      this.$refs.open_layers.removeLayerAll();
-      //기본 지도 layer 그리기 + 해당 위치로 이동
-      this.$refs.open_layers.setBaseMap(vworldBaseLayer,event.target.value);
-      this.$refs.open_layers.setZoom(this.address.zoomLevel);
-      //polygon 그리기
-      this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsGeoJson.json', 'multPolygonLayer', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd);
-      // 지역 중앙에 노드 + 이름 넣기
-      this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsCenterJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label', this.address.dong_cd);
-
-    },
-
-    //행정동 Select 선택시 바로 위치 이동
-    dongSelectF: function (event) {
-      //기존 layer 지우기
-      this.$refs.open_layers.removeLayerAll();
-      //기본 지도 layer 그리기 + 해당 위치로 이동
-      this.$refs.open_layers.setBaseMap(vworldBaseLayer,event.target.value);
-      this.$refs.open_layers.setZoom(this.address.zoomLevel);
-      //polygon 그리기
-      this.$refs.open_layers.addVectorLayerByUrl('/common/getDongGeoJson.json', 'multPolygonLayer', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd);
-      // 행정동에 포함된 노드 넣기
-      this.$refs.open_layers.addVectorLayerByUrl('/common/getNodesGeoJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label', this.address.dong_cd);
-    },
-
-    //노드 Select 선택시 바로 위치 이동
-    nodeSelectF: function (event) {
-      //기존 layer 지우기
-      this.$refs.open_layers.removeLayerAll();
-      //기본 지도 layer 그리기 + 해당 위치로 이동
-      this.$refs.open_layers.setBaseMap(vworldBaseLayer,this.address.dong_cd,  event.target.value);
-      this.$refs.open_layers.setZoom(this.address.zoomLevel);
-      //polygon 그리기
-      this.$refs.open_layers.addVectorLayerByUrl('/node/getNodeGeoJson.json', 'multPolygonLayer', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd, this.address.node_id);
-      // 노드 중앙에 노드 그리기
-      this.$refs.open_layers.addVectorLayerByUrl('/node/getNodeGeoJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label', this.address.dong_cd, this.address.node_id);
-    },   
-
-    changeTab(tabId) {
-      this.activeTab = tabId;
-    },
-    toggleActive(item) {
-      item.isActive = !item.isActive;
-    },
-  },
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main2 mounted");
-    this.$refs.open_layers.setBaseMap(vworldBaseLayer);
-    this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsGeoJson.json', 'multPolygonLayer', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd);
-    this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsCenterJson.json', 'nodeLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label', this.address.dong_cd);
-
-  },
-};
-</script>
-<style scoped>
-label {
-  width: max-content;
-  text-align: left;
-}
-.search .box {
-  padding: 1rem 2rem;
-}
-.search input[type="text"] {
-  width: 9rem;
-}
-
-.btn_set {
-  position: relative;
-  border-bottom: 1px solid #e5e3e3;
-  padding: 0 0 1rem 0;
-}
-.btn_set div {
-  position: absolute;
-  top: 40px;
-  width: 313px;
-  height: 380px;
-  background: #fff;
-  padding: 1rem;
-}
-.bg-white {
-  min-height: 46.6rem;
-  max-height: 46.6rem;
-  overflow: scroll;
-  overflow-x: hidden;
-}
-.bg-white::-webkit-scrollbar-thumb {
-  background-color: #fff;
-}
-h2 {
-  background: #50ba8a;
-  text-align: center;
-  color: #fff;
-  padding: 1.6rem 0;
-}
-.top p {
-  font-size: 15px;
-}
-.top ul {
-  padding: 1rem 0;
-}
-.top li {
-  width: calc(100% / 6);
-  text-align: center;
-}
-.top h3 {
-  font-size: 20px;
-}
-.wrap {
-  z-index: 100;
-  top: 0;
-  height: 865px;
-}
-.left {
-  background: #fff;
-}
-.right {
-  width: -webkit-fill-available;
-}
-.pg-item {
-  display: inline-block;
-  padding: 10px;
-  color: #949292;
-}
-table {
-  width: 100%;
-  text-align: center;
-  border-collapse: collapse;
-}
-
-th,
-td {
-  border-left: none;
-  border-right: none;
-}
-
-table th {
-  padding: 15px 0;
-  color: #fff;
-  background-color: #13833b;
-}
-
-table td {
-  padding: 10px 0;
-  border-bottom: 1px solid #e5e5dd;
-}
-
-table thead tr {
-  background-color: #f7f6f6;
-}
-.modal2 {
-  padding: 3rem;
-}
-.modal2 h4 {
-  font-size: 2rem;
-}
-.modal {
-  width: 100rem;
-}
-.modalmain {
-  padding: 1rem;
-  max-height: 70rem;
-  overflow: scroll;
-  overflow-x: hidden;
-}
-.modalmain select {
-  width: max-content;
-}
-.modalmain input[type="text"] {
-  width: inherit;
-}
-.modalmain table thead {
-  background: #f7f6f6;
-}
-.modalmain table td {
-  border: 1px solid #eee;
-}
-.modal h2 {
-  background: #e5e5dd;
-  font-size: 2rem;
-  padding: 1rem;
-  color: #333;
-}
-.modal-bg h2 {
-  background: #e5e5dd;
-  font-size: 2rem;
-  padding: 1rem;
-}
-.modal h3 {
-  font-size: 1.8rem;
-  border-bottom: 1px solid #eee;
-  padding: 1rem 0 0.2rem 0;
-}
-.modal h4 {
-  font-size: 1.6rem;
-  font-weight: 100;
-  padding: 0.2rem 0 1rem 0;
-}
-.modal h2 button {
-  border: 0;
-  background: none;
-  height: 30px;
-  cursor: pointer;
-}
-.modal-bg button {
-  border: 0;
-  background: none;
-  height: 30px;
-  cursor: pointer;
-}
-.modal button img {
-  width: 25px;
-}
-</style>(No newline at end of file)
 
client/views/pages/Introduction/Introduction.vue (deleted)
--- client/views/pages/Introduction/Introduction.vue
@@ -1,50 +0,0 @@
-<template>
-  <div><h2>플랫폼 소개</h2>
- <h3 style="margin-top: 3rem;">1. AI 안정통합 횡단보도 플랫폼이란?</h3> 
- <p>AI 영상감지, 실시간 신호개방 등 최첨단 기술을 적용하여 횡단보도를 이용하는 보행자 보호를 위한 보행신호 자동연장, 
-무단횡단 방지, 우회전 차량사고등을 예방하고 주행중인 차량 내비게이션에 실시간으로 횡단보도 내 위험 정보를 제공하여 
-교통안전 예방정책을 추진하고, 횡단보도 사고를 줄이는데 목표를 둔 플랫폼
-</p>
- <h3 style="margin-top: 3rem;">2. 주요 서비스</h3> 
- <p>① 보행약자를 위한 보행신호 자동연장 서비스
-</p>
-<p>- AI 영상인식으로 사람, 목발, 우산, 휠체어, 유모차 등 보행자를 판별하고 보행자의 상태 정 보를 식별하여 
-     신호제어기에 신호연장 신호를 전달</p>
- <p>② 무단횡단 방지 및 무단횡단 사고 예방 서비스</p>
- <p>- 차량 및 보행신호, 횡단보도 대기공간의 보행대기자를 판별하여 보행신호 시 우회전 차량의 진입 상황을 현장 음향신호 장비로 
-    안내</p>
- <p>③ 우회전 차량 교통사고 예방 서비스</p>
- <p>- 신호대기 상태에서 보행 대기자 판별 및 횡단보도 진입 여부를 인식하고 보행자 무단횡단 발생 시 음향 신호방비로 정보를 전달</p>
- <p>④ 차량 운전자 안내를 위한 실시간 내비게이션 안내 서비스</p>
- <p>- 횡단보도 대기 공간의 보행대기자를 판별하고 횡단보도 내 무단횡단 및 우회전 준법 주행이 가능한지에 대한 정보를 
-      내비게이션을 통해 안내 할 수 있도록 정보 제공</p>
- <p>⑤ 실시간 관제 시스템</p>
- <p>- 현장 실시간 CCTV 영상을 제공하고, 발생하는 위험/사고현황을 한눈에 쉽게 볼 수 있는 서비스를 제공</p>
- <p>⑥ GIS기반 분석 시스템</p>
- <p>- 실시간으로 발생하는 위험/사고 정보를 수집하고 수집된 데이터를 활용하여 상황발생 테마별로 데이터를 분석, 시각화 하여 
-   현황파악 및 해결책 도출에 도움을 주는 서비스를 제공</p>
-  </div>
-</template>
-<style scoped>
-@media all and (max-width: 479px) {
-  div{padding: 3rem 1rem !important;}
-}
-  div{padding: 3rem 15rem; line-height: 4rem;}
-  h2{font-size: 2rem;}
-  h3{font-size: 1.8rem;}
-  p{font-size: 1.6rem;}
-</style>
-
-<script>
-export default {
-  data() {
-    return {};
-  },
-  methods: {},
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main4 mounted");
-  },
-};
-</script>
 
client/views/pages/Introduction/ManualDown.vue (deleted)
--- client/views/pages/Introduction/ManualDown.vue
@@ -1,17 +0,0 @@
-<template>
-  <div>로그인/로그아웃</div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {};
-  },
-  methods: {},
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main4 mounted");
-  },
-};
-</script>
 
client/views/pages/Introduction/openlayers.vue (deleted)
--- client/views/pages/Introduction/openlayers.vue
@@ -1,171 +0,0 @@
-<template>
-  <div class="flex">
-    <div class="left">
-      <div class="wrap flex-between">
-        <div class="iconlist">
-          <ul>
-            <li
-              v-for="item in items"
-              :key="item.id"
-              :class="{ active: item.isActive }"
-              @click="toggleActive(item)"
-            >
-              <div></div>
-              <p>{{ item.name }}</p>
-            </li>
-          </ul>
-        </div>
-        <div class="search">
-          <h2>지역설정</h2>
-          <div class="box">
-            <div class="flex-between m-b">
-              <label for="">시/도</label>
-              <select name="" id=""></select>
-            </div>
-            <div class="flex-between m-b">
-              <label for="">시/군/구</label>
-              <select name="" id=""></select>
-            </div>
-            <div class="flex-between m-b">
-              <label for="">행정동</label>
-              <select name="" id=""></select>
-            </div>
-            <div class="flex-between m-b">
-              <label for="">교차로</label>
-              <select name="" id=""></select>
-            </div>
-          </div>
-          <h2>조건설정</h2>
-          <div class="box">
-            <div class="flex-between m-b">
-              <input type="checkbox" /><label for="">무단횡단</label>
-              <input type="checkbox" /><label for="">신호연장</label>
-              <input type="checkbox" /><label for="">신호위반</label>
-              <input type="checkbox" /><label for="">장애발생</label>
-            </div>
-            <div class="flex-between m-b" >
-              <label for="date-input">일자</label>
-              <input id="date-input" type="date" v-model="selectedDate" /> ~ <input id="date-input" type="date" v-model="selectedDate" />
-            </div>
-            <div class="flex-between m-b" >
-              <label for="time-input">시간대</label>
-              <input
-                id="time-input"
-                type="time"
-                v-model="selectedTime"
-              />~<input id="time-input" type="time" v-model="selectedTime" />
-            </div>
-            <button class="btn-l green-btn">검색</button>
-          </div>
-          <h2>지역설정</h2>
-          <div class="box bg-white">
-            <button c>상황발생현황</button>
-            <button>장애발생현황</button>
-            <ul>
-              <li>
-                <p class="m-b">발생일시: 2023-05-04 14:27</p>
-                <p class="m-b">상황명: 무단횡단</p>
-                <p class="m-b">발생장소: 영재어린이집(서측) 동쪽횡단보도</p>
-              </li>
-            </ul>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="right">
-      <div class="top">
-        <ul class="flex-end">
-          <li>
-            <p>금일 보행자</p>
-            <h3>명</h3>
-          </li>
-          <li>
-            <p>금일 무단횡단 발생</p>
-            <h3>회</h3>
-          </li>
-          <li>
-            <p>금일 신호연장 발생</p>
-            <h3>회</h3>
-          </li>
-          <li>
-            <p>금일 신호연장 시간</p>
-            <h3>초</h3>
-          </li>
-          <li>
-            <p>금일 차량 신호위반 발생</p>
-            <h3>회</h3>
-          </li>
-          <li>
-            <p>금일 장애 발생</p>
-            <h3>회</h3>
-          </li>
-        </ul>
-      </div>
-      <div><MapPage /></div>
-    </div>
-  </div>
-</template>
-<style scoped>
-.bg-white{min-height: 46.6rem; max-height: 46.6rem; overflow: scroll; overflow-x: hidden;}
-.bg-white::-webkit-scrollbar-thumb {background-color: #fff;}
-h2 {
-  background: #50ba8a;
-  text-align: center;
-  color: #fff;
-  padding: 1.6rem 0;
-}
-.top p {
-  font-size: 15px;
-}
-.top ul {
-  padding: 1rem 0;
-}
-.top li {
-  width: calc(100% / 6);
-  text-align: center;
-}
-.top h3 {
-  font-size: 20px;
-}
-.wrap {
-  z-index: 100;
-  top: 0;
-  height: 865px;
-}
-.left {
-  background: #fff;
-}
-.right {
-  width: -webkit-fill-available;
-  
-}
-</style>
-<script>
-import MapPage from "../../component/MapPage.vue";
-
-export default {
-  data() {
-    return {
-      items: [
-        { id: 1, name: "무단횡단", isActive: false },
-        { id: 2, name: "신호연장", isActive: false },
-        { id: 3, name: "우회전 차량", isActive: false },
-        { id: 4, name: "장애발생", isActive: false },
-      ],
-    };
-  },
-  components: {
-    MapPage: MapPage,
-  },
-  methods: {
-    toggleActive(item) {
-      item.isActive = !item.isActive;
-    },
-  },
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main2 mounted");
-  },
-};
-</script>
 
client/views/pages/RealtimeStatus/CrosswalkListSearch.vue (deleted)
--- client/views/pages/RealtimeStatus/CrosswalkListSearch.vue
@@ -1,462 +0,0 @@
-<template>
-  <div class="wrap">
-    <div class="board-wrap">
-      <div class="search-wrap">
-        <div class="flex m-b gap mb-block" style="margin-bottom: 2rem">
-          <div class="flex gap m-r date" style="margin-right: 5rem">
-            <label>조회기간: </label>
-            <input type="date" name="" id="" />
-            <span>~</span>
-            <input type="date" name="" id="" />
-          </div>
-          <label>지역: </label>
-          <dongSelectList @setDongCd="setDongCd" :nodeHiddenCk="true" :azimuthHiddenCk="true"></dongSelectList>
-        </div>
-        <div class="flex-between gap line">
-          <div class="gap flex mb-block">
-            <div class="flex m-b gap">
-              <label>우회차선: </label>
-              <select name="" id="">
-                <option value="">전체</option>
-              </select>
-              <label>왕복차선: </label>
-              <select name="" id="">
-                <option value="">전체</option>
-              </select>
-            </div>
-            <div class="flex">
-              <div class="m-r flex gap">
-                <label class="m-r">장비: </label>
-                <label>무단횡단</label>
-                <input class="m-r" type="checkbox" name="" id="" />
-                <label>신호연장</label>
-                <input class="m-r" type="checkbox" name="" id="" />
-                <label>우회차량</label>
-                <input class="m-r" type="checkbox" name="" id="" />
-              </div>
-            </div>
-            <div class="flex gap">
-              <label>상태: </label>
-              <select name="" id="">
-                <option value="">정상</option>
-              </select>
-              <button type="button" class="btn-2 green-btn">조회</button>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div>
-        <table class="pc">
-          <!-- <colgroup>
-            <col style="width: 10%;">
-            <col style="width: 20%;">
-            <col style="width: 20%;">
-            <col style="width: 30%;">
-            <col style="width: 20%;">
-          </colgroup> -->
-          <thead>
-            <tr>
-              <th>No</th>
-              <th>설치일자</th>
-              <th>시/도</th>
-              <th>시/군/구</th>
-              <th>행정동</th>
-              <th>교차로</th>
-              <th>횡단보도명</th>
-            </tr>
-          </thead>
-          <tbody>
-            <tr @click="modal_1 = true">
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-            </tr>
-          </tbody>
-        </table>
-        <table class="mobile">
-                <colgroup>
-                  <col style="width: 10%" />
-                  <col style="width: 20%" />
-                </colgroup>
-                <tbody>
-                  <tr>
-                    <th>No</th>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <th>설치일자</th>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <th>시/도</th>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <th>시/군/구</th>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <th>행정동</th>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <th>교차로</th>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <th>횡단보도명</th>
-                    <td></td>
-                  </tr>
-                </tbody>
-              </table>
-        <div class="modal-wrap" v-if="modal_1 == true">
-          <div class="modal-bg"></div>
-          <div class="modal">
-            <h2 class="flex-between">
-              횡단보도 상세정보
-              <button type="button" class="gray-btn" @click="modal_1 = false">
-                <img src="../../../resources/images/close.png" alt="" />
-              </button>
-            </h2>
-            <div class="modalmain">
-              <div class="flex-between">
-                <div class="img">무단횡단검지카메라 이미지</div>
-                <div class="img">무단횡단검지카메라 이미지</div>
-                <div class="img">신호연장검지카메라 이미지</div>
-                <div class="img">신호연장검지카메라 이미지</div>
-                <div class="img">우회차량검지카메라 이미지</div>
-              </div>
-              <table>
-                <colgroup>
-                  <col style="width: 20%" />
-                  <col style="width: 20%" />
-                  <col style="width: 60%" />
-                </colgroup>
-                <tbody>
-                  <tr>
-                    <td colspan="2">시/도</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">시/군/구</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">행정동</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">노드명</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">방위각</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td rowspan="2">좌표</td>
-                    <td>경도</td>
-                  </tr>
-                  <tr>
-                    <td>위도</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td rowspan="3">설치된 검시장비</td>
-                    <td>무단횡단</td>
-                  </tr>
-                  <tr>
-                    <td>신호연장</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td>우회전차량</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">무단횡단 검지범위</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">왕복차선</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">우회전차선유무</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">우회전차선유형</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">등록일자</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2">횡단보도 유지보수 담당자</td>
-                    <td></td>
-                  </tr>
-                </tbody>
-              </table>
-              <h4 style="margin-top: 2rem">횡단보도 유지보수 담당자 정보</h4>
-              <table>
-                <colgroup>
-                  <col style="width: 50%" />
-                  <col style="width: 50%" />
-                </colgroup>
-                <tbody>
-                  <tr>
-                    <td>이름</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td>이메일</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td>소속정보</td>
-                    <td></td>
-                  </tr>
-                </tbody>
-              </table>
-              
-            </div>
-          </div>
-        </div>
-      </div>
-      <div class="bottom-wrap">
-        <div class="pg-wrap">
-          <a href="#" class="pg-item prev">◀</a>
-          <a href="#" class="pg-item active">1</a>
-          <a href="#" class="pg-item">2</a>
-          <a href="#" class="pg-item">3</a>
-          <a href="#" class="pg-item">4</a>
-          <a href="#" class="pg-item">5</a>
-          <a href="#" class="pg-item next">▶</a>
-        </div>
-        <div class="btn-wrap">
-          <router-link to="/UserManagement.page">
-            <span class="btn-2 green-btn">Excel로 저장</span>
-          </router-link>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import Modal from "../../component/Modal.vue";
-import dongSelectList from '../../component/dongSelectList.vue';
-
-export default {
-  data() {
-    return {
-      modal_1: false,
-    };
-  },
-  methods: {},
-  watch: {},
-  computed: {
-    Modal: Modal,
-  },
-  components: {
-    dongSelectList: dongSelectList
-  },
-  mounted() {
-    console.log("Main4 mounted");
-  },
-};
-</script>
-
-<style scoped>
-@media all and (max-width: 479px) {
-  .date {
-    margin-right: 0 !important;
-    margin-bottom: 1rem;
-  }
-  .line select {
-    width: 10rem;
-  }
-  .local select {
-    width: 8.7rem;
-  }
-}
-.mobile {
-  display: none;
-}
-::v-deep select {
-  width: 15rem;
-}
-.img {
-  width: 20rem;
-  height: 20rem;
-  border: 1px solid #e5e5dd;
-}
-label {
-  width: max-content;
-}
-select {
-  width: 15rem;
-}
-.modal {
-  width: 100rem;
-}
-.modalmain {
-  padding: 1rem;
-  max-height: 70rem;
-  overflow: scroll;
-  overflow-x: hidden;
-}
-.modalmain table tbody tr:nth-child(odd) {
-  background: #f7f6f6;
-}
-.modalmain table tbody tr:nth-child(even) {
-  background: #ffffff;
-}
-.modalmain table td {
-  border: 1px solid #eee;
-}
-.modal h2 {
-  background: #e5e5dd;
-  font-size: 2rem;
-  padding: 1rem;
-}
-.modal-bg h2 {
-  background: #e5e5dd;
-  font-size: 2rem;
-  padding: 1rem;
-}
-.modal h3 {
-  font-size: 1.8rem;
-  border-bottom: 1px solid #eee;
-  padding: 1rem 0 0.2rem 0;
-}
-.modal h4 {
-  font-size: 1.6rem;
-  font-weight: 100;
-  padding: 0.2rem 0 1rem 0;
-}
-.modal button {
-  border: 0;
-  background: none;
-  height: 30px;
-  cursor: pointer;
-}
-.modal-bg button {
-  border: 0;
-  background: none;
-  height: 30px;
-  cursor: pointer;
-}
-.modal button img {
-  width: 25px;
-}
-.txt-point {
-  color: #333;
-}
-.wrap {
-  width: 155rem;
-  margin: 100px auto;
-}
-
-.search-wrap {
-  margin-bottom: 30px;
-  background: #f7f6f6;
-  padding: 1rem;
-}
-
-.search-wrap input,
-.search-wrap select {
-  height: 22.5px;
-  border-radius: 3px;
-  border: 1px solid #949292;
-}
-
-.float-right {
-  float: right;
-}
-
-.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;
-}
-
-table th {
-  padding: 15px 0;
-  color: #fff;
-  background-color: #13833b;
-}
-
-table td {
-  padding: 10px 0;
-  border-bottom: 1px solid #e5e5dd;
-}
-
-table tr:nth-child(odd) {
-  background-color: #f7f6f6;
-}
-
-table tr:nth-child(even) {
-  background-color: #fdfdf2;
-}
-
-.bottom-wrap {
-  position: relative;
-  padding: 1rem 0;
-}
-
-.btn-2 {
-  display: inline-block;
-  padding: 0.3rem 2rem;
-  font-size: 13.333px;
-}
-
-.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;
-}
-
-.btn-wrap {
-  position: absolute;
-  right: 0;
-  top: 1.5em;
-  z-index: 10;
-}
-
-.btn-wrap button {
-  cursor: pointer;
-}
-</style>
 
client/views/pages/RealtimeStatus/ErrorSearch.vue (deleted)
--- client/views/pages/RealtimeStatus/ErrorSearch.vue
@@ -1,405 +0,0 @@
-<template>
-  <div class="wrap">
-    <div class="board-wrap">
-      <div class="search-wrap">
-        <div class="flex m-b gap mb-block" style="margin-bottom: 2rem">
-          <div class="flex gap m-r date" style="margin-right: 5rem">
-            <label>조회기간: </label>
-            <input type="date" name="" id="" />
-            <span>~</span>
-            <input type="date" name="" id="" />
-          </div>
-          <div class="flex gap local">
-            <label>지역: </label>
-            <select name="" id="">
-              <option value="">대구광역시</option>
-            </select>
-            <select name="" id="">
-              <option value="">서구</option>
-            </select>
-            <select name="" id="">
-              <option value="">전체</option>
-            </select>
-          </div>
-        </div>
-        <div class="flex-between gap m-b mb-block">
-          <div class="gap flex mb-block">
-            <div class="m-b">
-              <label>장애타입: </label>
-              <select name="" id="">
-                <option value="">전체</option>
-              </select>
-            </div>
-            <div class="m-b">
-              <label>장비타입: </label>
-              <select name="" id="">
-                <option value="">전체</option>
-              </select>
-            </div>
-            <div class="m-b flex-between gap">
-              <div>
-                <label>복구여부: </label>
-                <select name="" id="">
-                  <option value="">정상</option>
-                </select>
-              </div>
-              <button type="button" class="btn-2 green-btn">조회</button>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div>
-        <table class="pc">
-          <!-- <colgroup>
-            <col style="width: 10%;">
-            <col style="width: 20%;">
-            <col style="width: 20%;">
-            <col style="width: 30%;">
-            <col style="width: 20%;">
-          </colgroup> -->
-          <thead>
-            <tr>
-              <th>No</th>
-              <th>장애 발생일시</th>
-              <th>시/도</th>
-              <th>시/군/구</th>
-              <th>행정동</th>
-              <th>교차로</th>
-              <th>횡단보도명</th>
-              <th>장비명</th>
-              <th>장애명</th>
-              <th>복구여부</th>
-              <th>복구시간</th>
-            </tr>
-          </thead>
-          <tbody>
-            <tr @click="modal_1 = true">
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-            </tr>
-          </tbody>
-        </table>
-        <table class="mobile">
-          <colgroup>
-            <col style="width: 10%" />
-            <col style="width: 20%" />
-          </colgroup>
-          <tbody>
-            <tr>
-              <th>No</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>장애 발생일시</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>시/도</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>시/군/구</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>행정동</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>교차로</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>횡단보도명</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>장비명</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>장애명</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>복구여부</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>복구시간</th>
-              <td></td>
-            </tr>
-          </tbody>
-        </table>
-        <div class="modal-wrap" v-if="modal_1 == true">
-          <div class="modal-bg"></div>
-          <div class="modal">
-            <h2 class="flex">
-              장애발생 상세정보
-              <button type="button" class="gray-btn" @click="modal_1 = false">
-                <img src="../../../resources/images/close.png" alt="" />
-              </button>
-            </h2>
-            <div class="modalmain">
-              <h3>영재어린이집(서측)</h3>
-              <h4>동쪽횡단보도</h4>
-              <table>
-                <colgroup>
-                  <col style="width: 50%" />
-                  <col style="width: 50%" />
-                </colgroup>
-                <tbody>
-                  <tr>
-                    <td>발생일시</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td>장비명</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td>장애명</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td>복구여부</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td>복구상태</td>
-                    <td></td>
-                  </tr>
-                </tbody>
-              </table>
-              <h4 style="margin-top: 2rem">횡단보도 유지보수 담당자 정보</h4>
-              <table>
-                <colgroup>
-                  <col style="width: 50%" />
-                  <col style="width: 50%" />
-                </colgroup>
-                <tbody>
-                  <tr>
-                    <td>이름</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td>이메일</td>
-                    <td></td>
-                  </tr>
-                  <tr>
-                    <td>소속정보</td>
-                    <td></td>
-                  </tr>
-                </tbody>
-              </table>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div class="bottom-wrap">
-        <div class="pg-wrap">
-          <a href="#" class="pg-item prev">◀</a>
-          <a href="#" class="pg-item active">1</a>
-          <a href="#" class="pg-item">2</a>
-          <a href="#" class="pg-item">3</a>
-          <a href="#" class="pg-item">4</a>
-          <a href="#" class="pg-item">5</a>
-          <a href="#" class="pg-item next">▶</a>
-        </div>
-        <div class="btn-wrap">
-          <router-link to="/UserManagement.page">
-            <span class="btn-2 green-btn">Excel로 저장</span>
-          </router-link>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import Modal from "../../component/Modal.vue";
-
-export default {
-  data() {
-    return {
-      modal_1: false,
-    };
-  },
-  methods: {},
-  watch: {},
-  computed: {
-    Modal: Modal,
-  },
-  mounted() {
-    console.log("Main4 mounted");
-  },
-};
-</script>
-
-<style scoped>
-@media all and (max-width: 479px) {
-  .local select { width: 8.7rem;
-  }
-  .date{margin: 0 0 1rem 0;     margin-right: 0rem !important;}
- 
-}
-.mobile{display: none;}
-label {
-  width: max-content;
-}
-select {
-  width: 15rem;
-}
-.modal {
-  width: max-content;
-}
-.modalmain {
-  padding: 1rem;
-}
-.modalmain table tbody tr:nth-child(odd) {
-  background: #f7f6f6;
-}
-.modalmain table tbody tr:nth-child(even) {
-  background: #ffffff;
-}
-.modalmain table td {
-  border: 1px solid #eee;
-}
-.modal h2 {
-  background: #e5e5dd;
-  font-size: 2rem;
-  padding: 1rem;
-}
-.modal h3 {
-  font-size: 1.8rem;
-  border-bottom: 1px solid #eee;
-  padding: 1rem 0 0.2rem 0;
-}
-.modal h4 {
-  font-size: 1.6rem;
-  font-weight: 100;
-  padding: 0.2rem 0 1rem 0;
-}
-.modal button {
-  border: 0;
-  background: none;
-  height: 30px;
-  padding: 0 0 0 50rem;
-  cursor: pointer;
-}
-.modal button img {
-  width: 25px;
-}
-.txt-point {
-  color: #333;
-}
-.wrap {
-  width: 155rem;
-  margin: 100px auto;
-}
-
-.search-wrap {
-  margin-bottom: 30px;
-  background: #f7f6f6;
-  padding: 1rem;
-}
-
-.search-wrap input,
-.search-wrap select {
-  height: 22.5px;
-  border-radius: 3px;
-  border: 1px solid #949292;
-}
-
-.float-right {
-  float: right;
-}
-
-.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;
-}
-
-table th {
-  padding: 15px 0;
-  color: #fff;
-  background-color: #13833b;
-}
-
-table td {
-  padding: 10px 0;
-  border-bottom: 1px solid #e5e5dd;
-}
-
-table tr:nth-child(odd) {
-  background-color: #f7f6f6;
-}
-
-table tr:nth-child(even) {
-  background-color: #fdfdf2;
-}
-
-.bottom-wrap {
-  position: relative;
-  padding: 1rem 0;
-}
-
-.btn-2 {
-  display: inline-block;
-  padding: 0.3rem 2rem;
-  font-size: 13.333px;
-}
-
-.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;
-}
-
-.btn-wrap {
-  position: absolute;
-  right: 0;
-  top: 1.5em;
-  z-index: 10;
-}
-
-.btn-wrap button {
-  cursor: pointer;
-}
-</style>
 
client/views/pages/RealtimeStatus/RealtimeStatus.vue (deleted)
--- client/views/pages/RealtimeStatus/RealtimeStatus.vue
@@ -1,443 +0,0 @@
-<template>
-  <div class="flex">
-    <button @click="toggleSlide" class="toggle">{{ slideText }}</button>
-    <div :class="['slide-content left', { active: showSlide }]">
-      <div class="wrap flex-between">
-        <!-- <div class="iconlist">
-          <ul>
-            <li v-for="item in items" :key="item.id" :class="{ active: item.isActive }" @click="toggleActive(item)">
-              <div></div>
-              <p>{{ item.name }}</p>
-            </li>
-          </ul>
-        </div> -->
-        <div class="search">
-          <h2>지역설정</h2>
-          <div class="box">
-            <DongSelectList @setDongCd="setDongCd" :crslk_azHiddenCk=true :open_layers="this.$refs.open_layers"></DongSelectList>
-          </div>
-          <h2>조건설정</h2>
-          <div class="box">
-            <div class="flex-between m-b">
-              <input type="checkbox" v-model="condition['wtrms']"><label for="">무단횡단</label>
-              <input type="checkbox" v-model="condition['signExtn']" /><label for="">신호연장</label>
-              <input type="checkbox" v-model="condition['rittrnVhcle']" /><label for="">신호위반</label>
-              <input type="checkbox" v-model="condition['eqpmnTrobl']" /><label for="">장애발생</label>
-            </div>
-            <div class="flex-between m-b">
-              <label for="date-input">일자</label>
-              <input id="date-input" type="date" v-model="condition['start_date']" :picker-options="startDateOptions" /> ~
-              <input id="date-input" type="date" v-model="condition['end_date']" :picker-options="endDateOptions" />
-            </div>
-            <div class="flex-between m-b">
-              <label for="time-input">시간대</label>
-              <input id="time-input" type="time" v-model="condition['start_time']" />~<input id="time-input" type="time"
-                v-model="condition['end_time']" />
-            </div>
-            <button class="btn-l green-btn" @click="statusSearch" style="padding: 0.5rem 0">
-              검색
-            </button>
-          </div>
-          <h2>지역설정</h2>
-          <div class="box bg-white tab-buttons">
-            <div class="btn_set flex-center">
-              <button class="m-r" v-for="tab in tabs" :key="tab.id" :class="{ active: activeTab === tab.id }" @click="changeTab(tab.id)">
-                {{ tab.title }}
-              </button>
-            </div>
-            <div class="tab-content" v-for="tab in tabs" :key="tab.id" v-show="activeTab === tab.id">
-              <ul v-show="tab.content1">
-                <li>
-                  <p class="m-b">발생일시: 2023-05-04 14:27</p>
-                  <p class="m-b">상황명: 무단횡단</p>
-                  <p class="">발생장소: 영재어린이집(서측) 동쪽횡단보도</p>
-                </li>
-              </ul>
-              <ul v-show="tab.content2">
-                <li>
-                  <p class="m-b">발생일시: 2023-05-04 14:27</p>
-                  <p class="m-b">장애명: CPU 사용 90% 이상</p>
-                  <p class="m-b">발생장소: 영재어린이집(서측) 동쪽횡단보도</p>
-                  <p class="m-b">담당자: 김담당</p>
-                  <p class="m-b">연락처: 010-1234-5678</p>
-                  <p class="">복구여부: 미복구</p>
-                  <!-- <div class="flex-end"><button>확인</button></div> -->
-                </li>
-              </ul>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="right">
-      <div class="top">
-        <ul class="flex-end">
-          <li>
-            <p class="flex-center">
-              <img
-                class="m-r"
-                src="../../../resources/images/icon/scumulativenumberofpedestrians.png"
-                alt
-              />금일 보행자
-            </p>
-            <h3>명</h3>
-          </li>
-          <li>
-            <p class="flex-center">
-              <img
-                class="m-r"
-                src="../../../resources/images/icon/scumulativenumberofpedestrians.png"
-                alt
-              />금일 무단횡단 발생
-            </p>
-            <h3>회</h3>
-          </li>
-          <li>
-            <p class="flex-center">
-              <img
-                class="m-r"
-                src="../../../resources/images/icon/Numberofsignalextensionstoday.png"
-                alt
-              />금일 신호연장 발생
-            </p>
-            <h3>회</h3>
-          </li>
-          <li>
-            <p class="flex-center">
-              <img
-                class="m-r"
-                src="../../../resources/images/icon/Numberofsignalextensionstoday.png"
-                alt
-              />금일 신호연장 시간
-            </p>
-            <h3>초</h3>
-          </li>
-          <li>
-            <p class="flex-center">
-              <img
-                class="m-r"
-                src="../../../resources/images/icon/Numberofsignalviolationstoday.png"
-                alt
-              />금일 차량 신호위반 발생
-            </p>
-            <h3>회</h3>
-          </li>
-          <li>
-            <p class="flex-center">
-              <img
-                class="m-r"
-                src="../../../resources/images/icon/Numberofsignalviolationstoday.png"
-                alt
-              />금일 장애 발생
-            </p>
-            <h3>회</h3>
-          </li>
-        </ul>
-      </div>
-      <div>
-        <OpenLayers ref="open_layers" />
-      </div>
-    </div>
-    <div class="chart">
-      <h2>금일 횡단보도 별 무단횡단 발생 건수 (상위10개소)</h2>
-      <div class=""></div>
-      <h2>금일 횡단보도 별 무단횡단 발생 건수 (상위10개소)</h2>
-      <div class=""></div>
-      <h2>금일 횡단보도 별 무단횡단 발생 건수 (상위10개소)</h2>
-      <div class=""></div>
-      <h2>금일 횡단보도 별 무단횡단 발생 건수 (상위10개소)</h2>
-      <div class=""></div>
-    </div>
-  </div>
-</template>
-<script>
-import OpenLayers from "../../component/OpenLayers.vue";
-import {
-  vworldBaseLayer,
-  vworldGrayLayer,
-  vworldMidnightLayer,
-  vworldHybridLayer,
-  vworldSatelliteLayer,
-} from "../../component/OpenLayersMap.vue";
-import { baseStyles } from '../../component/OpenLayersStyle.vue';
-import axios from "axios";
-import DongSelectList from '../../component/dongSelectList.vue';
-export default {
-  data() {
-    return {
-      showSlide: false,
-      slideText: '검색하기',
-      address: {},
-      //조건설정
-      condition: {
-        //체크박스
-        signExtn: false,
-        wtrms: false,
-        rittrnVhcle: false,
-        eqpmnTrobl: false,
-        //일자
-        start_date: null,
-        end_date: null,
-        //시간대
-        start_time: null,
-        end_time: null,
-      },
-      //달력에서 범위 설정 해주기 위해 (미완) -:picker-options-
-      startDateOptions: {
-        disabledDate: this.disabledStDate
-      },
-      endDateOptions: {
-        disabledDate: this.disabledEdDate
-      },
-      ck : true,
-      tabs: [
-        {
-          id: 1,
-          title: "상황발생현황",
-          content1: "This is the content for Tab 1",
-        },
-        {
-          id: 2,
-          title: "장애발생현황",
-          content2: "This is the content for Tab 2",
-        },
-      ],
-      activeTab: 1,
-      items: [
-        { id: 1, name: "무단횡단", isActive: true },
-        { id: 2, name: "신호연장", isActive: false },
-        { id: 3, name: "우회전 차량", isActive: false },
-        { id: 4, name: "장애발생", isActive: false },
-      ],
-    };
-  },
-  components: {
-    OpenLayers: OpenLayers,
-    DongSelectList: DongSelectList,
-  },
-  methods: {
-    toggleSlide() {
-      if (this.showSlide) {
-        this.slideText = "검색하기";
-      } else {
-        this.slideText = "창닫기";
-      }
-      this.showSlide = !this.showSlide;
-    },
-    //지역 및 조건 설정 안에 있는 횡단보도의 금일 보행자 무단횡단 신호연장 신호위반 장애발생 위치와 횟수
-
-
-    //지역 및 조건 설정 안에 있는 횡단보도의 위치와 횟수의 합
-
-    changeTab(tabId) {
-      this.activeTab = tabId;
-    },
-    toggleActive(item) {
-      for (var i = 0; i < 4; i++) {
-        this.items[i].isActive = false;
-      }
-      item.isActive = !item.isActive;
-    },
-    // disabledStDate(date){
-    //   date = moment(String(date)).format('YYYYMMDD') 
-    //   return date > moment().format('YYYYMMDD') || date < moment().add(-1, 'years').format('YYYYMMDD') 
-    // },
-    disabledEdDate(date) {
-      return date < this.condition.start_date
-    },
-    statusSearch: function () {
-      console.log("statusSearch this.address : ", this.address);
-      //지도 영역 수정
-      if(this.address.node_id==null){
-        this.$refs.open_layers.removeLayerAll();
-        this.$refs.open_layers.setBaseMap(vworldBaseLayer,this.address.dong_cd);
-        this.$refs.open_layers.addVectorLayerByUrl('/common/getDongsGeoJson.json', 'realtimeStatusMap', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd);
-      }
-      else{
-        this.$refs.open_layers.removeLayerAll();
-        // ,this.address.zoomLevel
-        this.$refs.open_layers.setBaseMap(vworldBaseLayer,this.address.dong_cd,  this.address.node_id);
-
-        // this.$refs.open_layers.addVectorLayerByUrl('/node/getNodeGeoJson.json', 'realtimeStatusMap', 'EPSG:5181', baseStyles['MultiPolygon'], 'MultiPolygon', this.address.dong_cd, this.address.node_id);
-      } 
-      // this.$refs.open_layers.addClusterLayer('/common/getDongsGeoJson.json', 'realtimeStatusMap', 'EPSG:5181', '', '', this.address.dong_cd);
-      // this.situationOccurrenceStatusSearch();
-
-    },
-
-    //상황 발행 현황 검색
-    situationOccurrenceStatusSearch: function () {
-      //검색 데이터 
-      const vm = this;
-      axios({
-        url: '/statusControl/statusSearch.json',
-        method: 'post',
-        headers: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: { "address": vm.address, "condition": vm.condition }
-      }).then(function (response) {
-        console.log("statusSearch - response : ", response.data);
-        // vm.nodeList = response.data;
-      }).catch(function (error) {
-        console.log("statusSearch - error : ", error);
-      });
-
-    },
-
-    //DongSelectList에서 dong_cd 받아오기
-    setDongCd(value) {
-      console.log("value : ", value);
-      this.address = value;
-    }
-  },
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main2 mounted ");
-    this.$refs.open_layers.setBaseMap(vworldBaseLayer);
-
-    // this.$refs.open_layers.addVectorLayerByUrl('/testDongGeoJson.json','testMap','EPSG:4326', baseStyles['labelStyle'],'label');    
-  },
-};
-</script>
-
-<style scoped>
-@media all and (max-width: 479px) {
-
-  .top h3 {font-size: 15px !important;}
-  .top p {
-   padding-right: 1rem;
-}
-  .chart{width: -webkit-fill-available !important;}
-  
-  .top {
-    overflow: scroll;
-  }
-  .top ul {
-    width: 137rem;
-    overflow: hidden;
-    justify-content: space-between !important;
-    padding: 2rem 1rem !important;
-  }
-  .top li {
-    display: flex;
-    align-items: center;
-  }
-  .search {
-    width: inherit;
-  }
-  .toggle {
-    color: #fff;
-    font-weight: bold;
-    background: #13833b;
-    display: block !important;
-    position: absolute;
-    z-index: 150;
-    top: 7.2rem;
-    right: 1rem;
-  }
-  .wrap {
-    height: auto !important;
-    width: inherit;
-    margin: 0 !important;
-  }
-  .slide-content {
-    position: absolute;
-    z-index: 97;
-    top: 6rem;
-       /* left: -31rem; */
-       width: -webkit-fill-available;
-    height: 100vh;
-    background-color: #f0f0f0;
-    transition: transform 0.3s ease;
-    transform: translateX(100%);
-  }
-
-  .slide-content.active {
-    transform: translateX(0);
-  }
-}
-.toggle {
-  display: none;
-}
-.chart div {
-  min-height: 13rem;
-}
-
-.chart {
-  width: 600px;
-}
-
-.search .box ul li {
-  text-align: left;
-}
-
-.btn_set {
-  position: relative;
-  border-bottom: 1px solid #e5e3e3;
-  padding: 0 0 1rem 0;
-}
-
-.btn_set div {
-  position: absolute;
-  top: 40px;
-  width: 313px;
-  height: 380px;
-  background: #fff;
-  padding: 1rem;
-}
-
-.bg-white {
-  min-height: 41.6rem;
-  max-height: 41.6rem;
-  overflow: scroll;
-  overflow-x: hidden;
-}
-
-.bg-white::-webkit-scrollbar-thumb {
-  background-color: #fff;
-}
-
-h2 {
-  background: #50ba8a;
-  text-align: center;
-  color: #fff;
-  padding: 1.6rem 0;
-}
-
-.top p {
-  font-size: 15px;
-}
-
-.top ul {
-  padding: 1rem 0;
-  justify-content: space-evenly;
-}
-
-.top li {
-  text-align: center;
-}
-
-.top li img {
-  width: 20px;
-}
-
-.top h3 {
-  font-size: 20px;
-}
-
-.wrap {
-  z-index: 100;
-  top: 0;
-  height: 865px;
-}
-
-.left {
-  background: #fff;
-}
-
-.right {
-  width: -webkit-fill-available;
-}
-</style>
 
client/views/pages/RealtimeStatus/SituationSearch.vue (deleted)
--- client/views/pages/RealtimeStatus/SituationSearch.vue
@@ -1,295 +0,0 @@
-<template>
-  <div class="wrap">
-    <div class="board-wrap">
-      <div class="search-wrap">
-        <div class="flex-between mb-block">
-          <div class="flex gap m-b date">
-            <label>날짜를 선택해주세요.</label>
-            <input type="date" name="" id="" />
-            <span>~</span>
-            <input type="date" name="" id="" />
-          </div>
-          <div class="flex gap m-b">
-            <label>시/도</label>
-            <select name="" id="">
-              <option value="">대구광역시</option>
-            </select>
-            <label>시/군/구</label>
-            <select name="" id="">
-              <option value="">서구</option>
-            </select>
-            <label>행정동</label>
-            <select name="" id="">
-              <option value="">전체</option>
-            </select>
-            </div>
-            <div class="flex gap m-b situ">
-              <label>상황명</label>
-              <select name="" id="">
-                <option value="">전체</option>
-                <option value="">무단횡단</option>
-                <option value="">신호연장</option>
-                <option value="">신호위반</option>
-              </select>
-              <input type="text" />
-              <button type="button" class="btn-2 green-btn">조회</button>
-            </div>
-        </div>
-      </div>
-      <div>
-        <table class="pc">
-          <!-- <colgroup>
-            <col style="width: 10%;">
-            <col style="width: 20%;">
-            <col style="width: 20%;">
-            <col style="width: 30%;">
-            <col style="width: 20%;">
-          </colgroup> -->
-          <thead>
-            <tr>
-              <th>No</th>
-              <th>발생일시</th>
-              <th>시/도</th>
-              <th>시/군/구</th>
-              <th>행정동</th>
-              <th>상황명</th>
-            </tr>
-          </thead>
-          <tbody>
-            <tr @click="modal_1 = true">
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td></td>
-            </tr>
-          </tbody>
-        </table>
-        <table class="mobile">
-          <colgroup>
-            <col style="width: 10%" />
-            <col style="width: 20%" />
-          </colgroup>
-          <tbody>
-            <tr>
-              <th>No</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>발생일시</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>시/도</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>시/군/구</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>행정동</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>상황명</th>
-              <td></td>
-            </tr>            
-          </tbody>
-        </table>
-        <div class="modal-wrap" v-if="modal_1 == true">
-          <div class="modal-bg"></div>
-          <div class="modal">
-            <h2 class="flex">상황발생 상세정보 <button type="button" class="gray-btn" @click="modal_1 = false">
-                <img src="../../../resources/images/close.png" alt="">
-              </button></h2>
-            <div class="modalmain">
-              <h3>영재어린이집(서측)</h3>
-              <h4>동쪽횡단보도</h4>
-              <table>
-            <colgroup>
-              <col style="width: 50%;">
-              <col style="width: 50%;">
-            </colgroup>
-            <tbody>
-              <tr @click="modal_1 = true">
-                <td>발생일시</td>
-                <td>2023-05-03 14:48</td>
-              </tr>
-              <tr @click="modal_1 = true">
-                <td>상황명</td>
-                <td>무단횡단</td>
-              </tr>
-              <tr @click="modal_1 = true">
-                <td>신호상태</td>
-                <td>적색불</td>
-              </tr>
-            </tbody>
-          </table>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div class="bottom-wrap">
-        <div class="pg-wrap">
-          <a href="#" class="pg-item prev">◀</a>
-          <a href="#" class="pg-item active">1</a>
-          <a href="#" class="pg-item">2</a>
-          <a href="#" class="pg-item">3</a>
-          <a href="#" class="pg-item">4</a>
-          <a href="#" class="pg-item">5</a>
-          <a href="#" class="pg-item next">▶</a>
-        </div>
-        <div class="btn-wrap">
-          <router-link to="/UserManagement.page">
-            <span class="btn-2 green-btn">Excel로 저장</span>
-          </router-link>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import Modal from "../../component/Modal.vue";
-
-export default {
-  data() {
-    return {
-      modal_1: false,
-    };
-  },
-  methods: {
-    
-  },
-  watch: {},
-  computed: {
-    Modal: Modal,
-  },
-  mounted() {
-    console.log("Main4 mounted");
-  },
-};
-</script>
-
-<style scoped>
-@media all and (max-width: 479px) {
-  .situ input{width: 13rem;}
-  .date input{width: 10rem;}
- 
-}
-.mobile{display: none;}
-.modal{width: max-content;}
-.modalmain{ padding: 1rem;}
-.modalmain table tbody tr:nth-child(odd){background: #f7f6f6;}
-.modalmain table tbody tr:nth-child(even){background: #ffffff;}
-.modalmain table td{border: 1px solid #eee;}
-.modal h2{background: #e5e5dd; font-size: 2rem; padding: 1rem ;}
-.modal h3{font-size: 1.8rem; border-bottom: 1px solid #eee; padding: 1rem  0  0.2rem 0;}
-.modal h4{font-size: 1.6rem; font-weight: 100; padding: 0.2rem 0 1rem 0 ;}
-.modal button{border: 0; background: none;     height: 30px;
-    padding: 0 0 0 50rem; cursor: pointer;}
-.modal button img{width: 25px;}
-.txt-point {
-  color: #333;
-}
-.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-right {
-  float: right;
-}
-
-.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;
-}
-
-table th {
-  padding: 15px 0;
-  color: #fff;
-  background-color: #13833b;
-}
-
-table td {
-  padding: 10px 0;
-  border-bottom: 1px solid #e5e5dd;
-}
-
-table tr:nth-child(odd) {
-  background-color: #f7f6f6;
-}
-
-table tr:nth-child(even) {
-  background-color: #fdfdf2;
-}
-
-.bottom-wrap {
-  position: relative;
-  padding: 1rem 0;
-}
-
-.btn-2 {
-  display: inline-block;
-  padding: 0.3rem 2rem;
-  font-size: 13.333px;
-}
-
-.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;
-}
-
-.btn-wrap {
-  position: absolute;
-  right: 0;
-  top: 1.5em;
-  z-index: 10;
-}
-
-.btn-wrap button {
-  cursor: pointer;
-}
-</style>
 
client/views/pages/SystemManagement/AccessRecord.vue (deleted)
--- client/views/pages/SystemManagement/AccessRecord.vue
@@ -1,331 +0,0 @@
-<template>
-  <div class="wrap">
-    <div class="tab-wrap">
-      <ul>
-        <li>
-          <span class="tab" @click="userSelectListPage">사용자 관리</span>
-        </li>
-        <li>
-          <span class="tab active" @click="accessLogPage">접속기록 조회</span>
-        </li>
-      </ul>
-    </div>
-    <div class="board-wrap">
-      <div>
-        <h2 class="page-title">접속기록 조회</h2>
-      </div>
-      <hr class="margin" />
-      <div class="search-wrap clear-fix">
-        <div class="float-right flex gap">
-          <div class="flex gap m-b">
-            <label>접속일자</label>
-            <input
-              type="date"
-              value-format="yyyymmdd"
-              v-model="userAccessListSearch.startDate"
-            />
-            <span>~</span>
-            <input
-              type="date"
-              value-format="yyyymmdd"
-              v-model="userAccessListSearch.endDate"
-            />
-          </div>
-          <div class="flex gap">
-            <select v-model="userAccessListSearch.searchType">
-              <option value="null" disabled>검색조건</option>
-              <option value="user_id">ID</option>
-              <option value="user_nm">이름</option>
-            </select>
-            <input
-              type="text"
-              placeholder="검색어를 입력 해주세요."
-              v-model="userAccessListSearch.searchText"
-              @keyup.enter="userAccessList"
-            />
-            <button type="button" class="green-btn" @click="userAccessSelectList">
-              검색
-            </button>
-          </div>
-        </div>
-      </div>
-      <div>
-        <table class="pc">
-          <colgroup>
-            <col style="width: 5%" />
-            <col style="width: 20%" />
-            <col style="width: 15%" />
-            <col style="width: 20%" />
-            <col style="width: 20%" />
-            <col style="width: 20%" />
-          </colgroup>
-          <thead>
-            <tr>
-              <th>No</th>
-              <th>접속자 ID</th>
-              <th>접속자 이름</th>
-              <th>접속 일시</th>
-              <th>접속 IP</th>
-              <th>접속 타입</th>
-            </tr>
-          </thead>
-          <tbody>
-            <tr v-for="(item, idx) in userAccessList" :key="idx">
-              <td data-title="NO">{{ idx + 1 }}</td>
-              <td data-title="접속ID">{{ item.user_id }}</td>
-              <td data-title="접속자이름">{{ item.user_nm }}</td>
-              <td data-title="접속일시">{{ yyyymmdd(item.cntn_dt) }}</td>
-              <td data-title="접속IP">{{ item.cntn_ip }}</td>
-              <td data-title="접속타입">{{ item.cntn_ty }}</td>
-            </tr>
-          </tbody>
-        </table>
-        <table class="mobile">
-          <colgroup>
-            <col style="width: 10%" />
-            <col style="width: 20%" />
-          </colgroup>
-          <tbody>
-            <tr>
-              <th>No</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>접속자 ID</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>접속자 이름</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>접속 일시</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>접속 IP</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th>접속 타입</th>
-              <td></td>
-            </tr>
-          </tbody>
-        </table>
-      </div>
-      <div class="bottom-wrap">
-        <PaginationButton
-          v-model:currentPage="userAccessListSearch.currentPage"
-          :per-page="userAccessListSearch.perPage"
-          :total-count="userAccessCount"
-          :max-range="5"
-          :click="userAccessList"
-        />
-        <div class="btn-wrap">
-          <button type="button" class="green-btn">Excel로 저장</button>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import axios from 'axios';
-import PaginationButton from '../../component/pagination/PaginationButton.vue';
-import COMMON_UTIL from '../../../resources/js/commonUtil.ts';
-
-export default {
-  data: () => {
-    return {
-      userAccessListSearch: {
-        currentPage: 1,
-        perPage: 10,
-        searchType: null,
-        searchText: null,
-        startDate: null,
-        endDate: null,
-      },
-      userAccessCount: 0,
-      userAccessList: [],
-    };
-  },
-  methods: {
-    //접속기록 목록 조회
-    userAccessSelectList: function () {
-      const vm = this;
-      axios({
-        url: "/user/userAccessLog.json",
-        method: "post",
-        herders: {
-          "Content-Type": "application/json; charset=UTF-8",
-        },
-        data: vm.userAccessListSearch,
-      })
-        .then(function (response) {
-          console.log("userAccessList - response : ", response.data);
-          vm.userAccessCount = response.data.userAccessCount;
-          vm.userAccessList = response.data.userAccessList;
-        })
-        .catch(function (error) {
-          console.log("userAccessList - error : ", error);
-          alert("접속기록 목록 조회 오류, 관리자에게 문의해주세요.");
-        });
-    },
-    
-    //날짜 시,분,초 자르기
-    yyyymmdd: function (date) {
-      return COMMON_UTIL.yyyymmdd(date);
-    },
-
-    //사용자 목록 페이지 이동
-    userSelectListPage: function () {
-      this.$router.push({ path: "/UserManagement.page" });
-    },
-
-    //접속기록조회 페이지 이동
-    accessLogPage: function () {
-      this.$router.push({ path: "/AccessRecord.page" });
-    },
-  },
-  watch: {},
-  computed: {},
-  components: {
-    PaginationButton: PaginationButton,
-  },
-  mounted() {
-    console.log("Main4 mounted");
-    this.userAccessSelectList();
-  },
-};
-</script>
-
-<style scoped>
-.mobile{display: none;}
-.wrap {
-  width: 155rem;
-  margin: 100px auto;
-}
-
-.tab-wrap {
-  margin-bottom: 30px;
-}
-
-.tab-wrap ul {
-  display: flex;
-  gap: 2rem;
-}
-
-.tab {
-  display: inline-block;
-  width: 20rem;
-  height: 3rem;
-  line-height: 3rem;
-  text-align: center;
-  border-radius: 5px;
-  background: #fff;
-  color: #949292;
-  border: 1px solid #949292;
-}
-
-.tab.active {
-  background: #13833b;
-  color: #fff;
-  border-color: #13833b;
-}
-
-.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-right {
-  float: right;
-}
-
-.clear-fix::after {
-  content: "";
-  display: block;
-  clear: both;
-}
-
-.search-wrap .float-right form > *:not(:last-child) {
-  margin-right: 1rem;
-}
-
-h2.page-title {
-  font-size: 24px;
-}
-
-hr.margin {
-  margin: 30px 0;
-}
-
-table {
-  width: 100%;
-  text-align: center;
-  border-collapse: collapse;
-}
-
-th,
-td {
-  border-left: none;
-  border-right: none;
-}
-
-table th {
-  padding: 15px 0;
-  color: #fff;
-  background-color: #13833b;
-}
-
-table td {
-  padding: 10px 0;
-  border-bottom: 1px solid #e5e5dd;
-}
-
-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;
-}
-
-.btn-wrap {
-  position: absolute;
-  right: 0;
-  top: 1.5em;
-  z-index: 10;
-}
-</style>
client/views/pages/SystemManagement/ApiTokenManagement.vue (Renamed from client/views/pages/SystemManagement/NodeManagement.vue)
--- client/views/pages/SystemManagement/NodeManagement.vue
+++ client/views/pages/SystemManagement/ApiTokenManagement.vue
@@ -37,7 +37,7 @@
           </thead>
           <tbody>
             <tr v-for="(item, idx) in tokkenList" :key="idx" @click="nodeSelectOne(item)" v-bind:class="{'select_row' : (item.api_key == selectTokken.api_key) }" >
-              <td data-title="NO">{{ idx }}</td>
+              <td data-title="NO">{{ pagenation.totalRow -  ((pagenation.currentPage ) * pagenation.perPage) + ( pagenation.perPage - idx) }}</td>
               <td data-title="토큰">{{ item.api_key }}</td>
               <td data-title="사용자명">{{ item.user_nm }}</td>
               <td data-title="타입">{{ item.key_type }}</td>
@@ -217,7 +217,7 @@
     },
 
     //노드 상세 조회 
-    nodeSelectOne(nodeOne) {
+    nodeSelectOne(nodeOne) { 
       const vm = this;
       this.selectTokken =  Object.assign({}, nodeOne); 
     },
@@ -313,7 +313,7 @@
 
 .search-wrap input,
 .search-wrap select {
-  height: 22.5px;
+   height: 22.5px;
   border-radius: 3px;
   border: 1px solid #949292;
 }
@@ -403,7 +403,7 @@
 }
 
 table td {
-  padding: 10px;
+  padding: 15px;
   border-bottom: 1px solid #e5e5dd;
 }
 
 
client/views/pages/SystemManagement/ChargeManagement.vue (deleted)
--- client/views/pages/SystemManagement/ChargeManagement.vue
@@ -1,334 +0,0 @@
-<template>
-  <div class="wrap">
-    <div class="board-wrap">
-      <div>
-        <h2 class="page-title">횡단보도 유지보수 담당자 관리</h2>
-      </div>
-      <hr class="margin" />
-      <div class="search-wrap clear-fix">
-        <div class="float-right flex gap">
-          <div class="flex gap date">
-            <label>등록일자</label>
-            <input
-              type="date"
-              value-format="yyyyMMdd"
-              v-model="managerListSearch.startDate"
-            />
-            <span> ~ </span>
-            <input
-              type="date"
-              value-format="yyyyMMdd"
-              v-model="managerListSearch.endDate"
-            />
-          </div>
-      <div class="flex gap search">
-            <select v-model="managerListSearch.searchType">
-              <option value="null" disabled>검색조건</option>
-              <option value="mngr_nm">이름</option>
-              <option value="mngr_ogdp_info">소속정보</option>
-            </select>
-            <input
-              type="search"
-              placeholder="검색어를 입력 해주세요."
-              v-model="managerListSearch.searchText"
-              @keyup.enter="managerSelectList"
-            />
-            <button class="btn-2 green-btn" @click="managerSelectList">
-              검색
-            </button>
-      </div>
-        </div>
-      </div>
-      <div>
-        <table class="pc">
-          <colgroup>
-            <col style="width: 15%" />
-            <col style="width: 15%" />
-            <col style="width: 25%" />
-            <col style="width:15%" />
-            <col style="width: 10%" />
-          </colgroup>
-          <thead>
-            <tr>
-              <th>No</th>
-              <th>이름</th>
-              <th>전화번호</th>
-              <th>이메일</th>
-              <th>소속정보</th>
-              <th>등록일자</th>
-            </tr>
-          </thead>
-          <tbody>
-            <tr
-              v-for="(item, idx) in managerList"
-              :key="idx"
-              @click="managerSelectOnePage(item)"
-            >
-              <td data-title="NO">{{ managerIdx - idx }}</td>
-              <td data-title="이름">{{ item.mngr_nm }}</td>
-              <td data-title="전화번호">{{ HyphenMinus(item.mngr_telno) }}</td>
-              <td data-title="이메일">{{ item.mngr_eml }}</td>
-              <td data-title="소속정보">{{ item.mngr_ogdp_info }}</td>
-              <td data-title="등록일자">{{ yyyymmdd(item.reg_dt) }}</td>
-            </tr>
-          </tbody>
-        </table>
-        <table class="mobile">
-          <colgroup>
-            <col style="width: 10%" />
-            <col style="width: 20%" />
-          </colgroup>
-          <tbody
-            v-for="(item, idx) in managerList"
-            :key="idx"
-            @click="managerSelectOnePage(item)"
-          >
-            <tr>
-              <th>No</th>
-              <td data-title="NO">{{ managerIdx - idx }}</td>
-            </tr>
-            <tr>
-              <th>이름</th>
-              <td data-title="이름">{{ item.mngr_nm }}</td>
-            </tr>
-            <tr>
-              <th>전화번호</th>
-              <td data-title="전화번호">{{ HyphenMinus(item.mngr_telno) }}</td>
-            </tr>
-            <tr>
-              <th>이메일</th>
-              <td data-title="이메일">{{ item.mngr_eml }}</td>
-            </tr>
-            <tr>
-              <th>소속정보</th>
-              <td data-title="소속정보">
-                {{ item.mngr_ogdp_info }}
-              </td>
-            </tr>
-            <tr>
-              <th>등록일자</th>
-              <td data-titel="등록일자">{{ yyyymmdd(item.reg_dt) }}</td>
-            </tr>
-            
-            <hr class="margin2 m-b" />
-          </tbody>
-        </table>
-      </div>
-      <div class="bottom-wrap">
-        <PaginationButton
-          v-model:currentPage="managerListSearch.currentPage"
-          :per-page="managerListSearch.perPage"
-          :total-count="managerListCount"
-          :max-range="5"
-          :click="managerSelectList"
-        />
-        <div class="btn-wrap">
-          <button @click="managerInsertPage" class="btn-2 green-btn">
-            등록
-          </button>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import axios from "axios";
-import PaginationButton from "../../component/pagination/PaginationButton.vue";
-import COMMON_UTIL from "../../../resources/js/commonUtil.ts";
-
-export default {
-  data: function () {
-    return {
-      managerListSearch: {
-        currentPage: 1,
-        perPage: 10,
-        searchType: null,
-        searchText: null,
-        startDate: null,
-        endDate: null,
-      },
-      managerListCount: 0,
-      managerList: [],
-      managerIdx: 0
-    };
-  },
-  methods: {
-    //횡단보도 유지보수 관리자 목록 조회
-    managerSelectList: function () {
-      const vm = this;
-      axios({
-        url: "/managerSelectList.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
-        },
-        data: vm.managerListSearch,
-      })
-        .then(function (response) {
-          console.log("managerSelectList - response : ", response.data);
-          vm.managerListCount = response.data.managerListCount;
-          vm.managerList = response.data.managerList;
-          vm.managerIdx = vm.managerListCount-(vm.managerListSearch.currentPage-1)*vm.managerList.length;
-        })
-        .catch(function (error) {
-          console.log("managerSelectList - error : ", error);
-          alert(
-            "횡단보도 유지보수 관리자 목록 조회 오류, 관리자에게 문의해주세요."
-          );
-        });
-    },
-
-    // 전화번호 '-' 추가 후 출력
-    HyphenMinus: function (telno) {
-      return COMMON_UTIL.HyphenMinus(telno);
-    },
-
-    //날짜 시,분,초 자르기
-    yyyymmdd: function (date) {
-      return COMMON_UTIL.yyyymmdd(date);
-    },
-
-    //횡단보도 유지보수 관리자 상세조회 페이지 이동
-    managerSelectOnePage: function (manager) {
-      this.$router.push({
-        path: "/ManagerModifyForm.page",
-        query: { mntnce_mngr_id: manager.mntnce_mngr_id },
-      });
-    },
-
-    //횡단보도 유지보수 관리자 등록 페이지 이동
-    managerInsertPage: function () {
-      this.$router.push({ path: "/ManagerAddForm.page" });
-    },
-  },
-
-  watch: {},
-  computed: {},
-  components: {
-    PaginationButton: PaginationButton,
-  },
-  mounted() {
-    console.log("Main4 mounted");
-    this.managerSelectList();
-  },
-};
-</script>
-
-<style scoped>
-@media all and (max-width: 479px) {
-  .form-wrap{width: -webkit-fill-available !important;}
-  .wrap{padding: 0 1rem;}
-  .date{margin: 0rem 0 1rem 0 !important;}
-  .search input{width: 14rem;}
-  .search select{width: 9rem;}
-}
-.mobile{display: none;}
-.date{margin-right: 3rem;}
-.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-right {
-  float: right;
-}
-
-.clear-fix::after {
-  content: "";
-  display: block;
-  clear: both;
-}
-
-.search-wrap .float-right form > *:not(:last-child) {
-  margin-right: 1rem;
-}
-
-h2.page-title {
-  font-size: 24px;
-}
-
-hr.margin {
-  margin: 30px 0;
-}
-
-table {
-  width: 100%;
-  text-align: center;
-  border-collapse: collapse;
-}
-
-th,
-td {
-  border-left: none;
-  border-right: none;
-}
-
-table th {
-  padding: 15px 0;
-  color: #fff;
-  background-color: #13833b;
-}
-
-table td {
-  padding: 10px 0;
-  border-bottom: 1px solid #e5e5dd;
-}
-
-table tr:nth-child(odd) {
-  background-color: #f7f6f6;
-}
-
-table tr:nth-child(even) {
-  background-color: #fdfdf2;
-}
-
-.bottom-wrap {
-  position: relative;
-  padding: 1rem 0;
-}
-
-.btn-2 {
-  display: inline-block;
-  padding: 0.3rem 2rem;
-  font-size: 13.333px;
-}
-
-.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;
-}
-
-.btn-wrap {
-  position: absolute;
-  right: 0;
-  top: 1.5em;
-  z-index: 10;
-}
-
-.btn-wrap button {
-  cursor: pointer;
-}
-</style>
 
client/views/pages/SystemManagement/DataRecord.vue (deleted)
--- client/views/pages/SystemManagement/DataRecord.vue
@@ -1,17 +0,0 @@
-<template>
-  <div>통합관리</div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {};
-  },
-  methods: {},
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main4 mounted");
-  },
-};
-</script>
 
client/views/pages/SystemManagement/DongManagement.vue (deleted)
--- client/views/pages/SystemManagement/DongManagement.vue
@@ -1,385 +0,0 @@
-<template>
-  <div class="wrap">
-    <div>
-      <div class="search-wrap clear-fix">
-        <div class="float-left">
-          <h3 class="sub-title">행정동 목록</h3>
-        </div>
-        <div class="float-right">
-          <form action="">
-            <select name="" id="">
-              <option value="">검색조건</option>
-            </select>
-            <input type="text" />
-            <button type="button" class="btn-2 green-btn">검색</button>
-          </form>
-        </div>
-      </div>
-      <div>
-        <table>
-          <colgroup>
-            <col style="width: 5%;">
-            <col style="width: 10%;">
-            <col style="width: 10%;">
-            <col style="width: 20%;">
-            <col style="width: 10%;">
-            <col style="width: 10%;">
-            <col style="width: 15%;">
-            <col style="width: 20%;">
-          </colgroup>
-          <thead>
-            <tr>
-              <th rowspan="2">순번</th>
-              <th rowspan="2">ID</th>
-              <th rowspan="2">한글명</th>
-              <th rowspan="2">영문명</th>
-              <th colspan="2">좌표</th>
-              <th rowspan="2">레이어</th>
-              <th rowspan="2">등록일</th>
-            </tr>
-            <tr>
-              <th>위도</th>
-              <th>경도</th>
-            </tr>
-          </thead>
-          <tbody>
-            <tr>
-              <td>1</td>
-              <td>2203060</td>
-              <td>평리1동</td>
-              <td>Pyeongni 1–dong</td>
-              <td>00.000000</td>
-              <td>00.000000</td>
-              <td></td>
-              <td>2023-03-03 12:50</td>
-            </tr>
-          </tbody>
-        </table>
-      </div>
-      <div class="bottom-wrap">
-        <div class="pg-wrap">
-          <a href="#" class="pg-item prev">◀</a>
-          <a href="#" class="pg-item active">1</a>
-          <a href="#" class="pg-item">2</a>
-          <a href="#" class="pg-item">3</a>
-          <a href="#" class="pg-item">4</a>
-          <a href="#" class="pg-item">5</a>
-          <a href="#" class="pg-item next">▶</a>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="sub-title-wrap">
-        <h3 class="sub-title">행정동 정보관</h3>
-        <span class="btn-2 green-btn">신규등록</span>
-      </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" class="full"></td>
-              <th>레이어</th>
-              <td><input type="text" class="full"></td>
-            </tr>
-            <tr>
-              <th colspan="2">한글명</th>
-              <td><input type="text" class="full"></td>
-              <th>등록일</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th colspan="2">영문명</th>
-              <td><input type="text" class="full"></td>
-              <th>수정일</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th rowspan="2">좌표</th>
-              <th class="second">위도</th>
-              <td><input type="text" class="full"></td>
-              <th>등록자</th>
-              <td></td>
-            </tr>
-            <tr>
-              <th class="second">경도</th>
-              <td><input type="text" class="full"></td>
-              <th>수정자</th>
-              <td></td>
-            </tr>
-          </tbody>
-        </table>
-      </div>
-      <div class="btn-wrap">
-        <button type="button" class="btn-2 gray-btn" @click="modal_2 = true">삭제</button>
-        <button type="button" class="btn-2 green-btn" @click="modal_1 = true">저장</button>
-      </div>
-    </div>
-
-    <div>
-      <div class="sub-title-wrap">
-        <h3 class="sub-title">파일 업로드</h3>
-      </div>
-      <div>
-        <table>
-          <colgroup>
-            <col style="width: 30%;">
-            <col style="width: 70%;">
-          </colgroup>
-          <tbody>
-            <tr>
-              <th>ID</th>
-              <td class="txt-left">
-                <input type="file" name="" id="fileBtn">
-                <label for="fileBtn" class="btn-2 green-btn">
-                  파일선택
-                </label>
-                <button type="button" class="gray-btn">등록</button>
-              </td>
-            </tr>
-            <tr>
-              <th>양식다운로드</th>
-              <td></td>
-            </tr>
-          </tbody>
-        </table>
-      </div>
-    </div>
-  </div>
-
-  <div class="modal-wrap" v-if="modal_1 == 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">확인</button>
-        <button type="button" class="gray-btn" @click="modal_1 = false">취소</button>
-      </div>
-    </div>
-  </div>
-
-  <div class="modal-wrap" v-if="modal_2 == true">
-    <div class="modal-bg">
-    </div>
-    <div class="modal">
-      <p>
-        해당 기능은 데이터 삭제 기능입니다.<br>
-        데이터 삭제 후, 조회에서 해당 데이터를 확인할 수 없습니다.<br>
-        삭제를 원하시면 아래 삭제 버튼을 눌러주세요.
-      </p>
-      <div class="btn-wrap">
-        <button type="button" class="green-btn">삭제</button>
-        <button type="button" class="gray-btn" @click="modal_2 = false">취소</button>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      modal_1: false,
-      modal_2: false,
-    };
-  },
-  methods: {},
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main4 mounted");
-  },
-};
-</script>
-
-<style scoped>
-.wrap {
-  width: 155rem;
-  margin: 100px auto;
-}
-
-.search-wrap,
-.sub-title-wrap {
-  margin-bottom: 30px;
-}
-
-.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;
-}
-
-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-wrap {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-
-.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;
-}
-
-.modal .btn-wrap {
-  margin-top: 15px;
-  text-align: center;
-}
-
-.txt-point {
-  color: #13833b;
-}
-</style>(No newline at end of file)
 
client/views/pages/SystemManagement/ManagerAddForm.vue (deleted)
--- client/views/pages/SystemManagement/ManagerAddForm.vue
@@ -1,297 +0,0 @@
-<template>
-  <div class="wrap">
-    <div>
-      <div>
-        <h2 class="page-title">횡단보도 유지보수 담당자 등록</h2>
-      </div>
-      <hr class="margin">
-      <div class="form-wrap">
-        <div class="flex m-b">
-          <span>이름 : </span>
-          <input type="text" placeholder=" Name" v-model="manager.mngr_nm">
-        </div>
-        <div class="flex m-b">
-          <span>전화번호 : </span>
-          <input type="text" placeholder=" '-' 을 제외하고 입력해주세요." maxlength="13" v-model="telno" @change="phoneCheck" @keyup="getPhoneMask(telno)">
-          <p style="color:red" v-if="telno_boolean === false">&nbsp;전화번호 9~11자리를 입력해주세요.</p>
-        </div>
-        <div class="flex m-b">
-          <span>이메일 : </span>
-          <input type="text" placeholder=" 예) [email protected]" v-model="manager.mngr_eml" @change="emailCheck">
-          <p style="color:red" v-if="email_boolean === false">&nbsp;잘못된 이메일 형식입니다.</p>
-        </div>
-        <div class="flex m-b">
-          <span>소속명 : </span>
-          <input type="text" placeholder=" 소속정보를 입력해주세요." v-model="manager.mngr_ogdp_info">
-        </div>
-
-        <div class="btn-wrap">
-          <button type="button" class="green-btn" @click="managerInsertCheck">등록</button>
-          <button class="btn-2 gray-btn" @click="managerSelectListPage">취소</button>
-        </div>
-      </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="managerInsert">확인</button>
-        <button type="button" class="gray-btn" @click="modal_insert = false">취소</button>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import axios from 'axios';
-import COMMON_UTIL from '../../../resources/js/commonUtil.ts';
-
-export default {
-  data: () => {
-    return {
-      manager: {
-        mngr_nm: null,
-        mngr_telno: null,
-        mngr_eml: null,
-        mngr_ogdp_info: null
-      },
-
-      telno_boolean: true,
-      email_boolean: true,
-      telno: null,
-      modal_insert: false
-    };
-  },
-  methods: {
-
-    //전화번호 입력 시 자동 '-' 삽입
-    getPhoneMask: function(telNumber) {
-      var res = COMMON_UTIL.getMask(telNumber)
-      this.telno = res
-      //서버 전송 값에는 '-' 를 제외하고 숫자만 저장
-      this.manager.mngr_telno = this.telno.replace(/[^0-9]/g, '')
-    },
-    
-    emailCheck: function() {
-      this.email_boolean = true;
-      if (COMMON_UTIL.checkEmail(this.manager.mngr_eml) === false) this.email_boolean = false;
-    },
-
-    phoneCheck: function() {
-      this.telno_boolean = true;
-      if (COMMON_UTIL.checkPhone(this.manager.mngr_telno) === false) this.telno_boolean = false;
-    },
-
-    // 등록버튼 클릭 시 빈칸 검사
-    managerInsertCheck: function() {
-
-      if (COMMON_UTIL.isEmpty(this.manager.mngr_nm) === false) {
-        alert('이름을 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.manager.mngr_telno) === false) {
-        alert('전화번호를 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkPhone(this.manager.mngr_telno) === false) {
-        alert('전화번호 형식을 확인해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.manager.mngr_eml) === false) {
-        alert('이메일을 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkEmail(this.manager.mngr_eml) === false) {
-        alert('이메일 형식을 확인해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.manager.mngr_ogdp_info) === false) {
-        alert('소속정보를 입력해주세요.');
-        return false;
-      }
-
-      this.modal_insert = true
-    },
-
-    // 횡단보도 유지보수 담당자 등록
-    managerInsert: function() {
-      const vm = this;
-      axios({
-        url: '/managerInsert.json',
-        method: 'post',
-        herders: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: vm.manager
-      }).then(function (response) {
-        console.log("managerInsert - response : ", response.data);
-        let result = response.data;
-        if (result > 0) {
-          alert("횡단보도 유지보수 담당자 등록을 완료 하였습니다.");
-          vm.managerSelectListPage();
-        } else {
-          alert('등록 실패, 관리자에게 문의해주세요.');
-          vm.modal_insert = false;
-        }
-      }).catch(function(error) {
-        console.log("managerInsert - error : ", error);
-        alert('횡단보도 유지보수 담당자 등록 오류, 관리자에게 문의해주세요.');
-        vm.modal_insert = false;
-      })
-    },
-
-    //횡단보도 유지보수 관리자 목록 페이지 이동
-    managerSelectListPage: function () {
-      this.$router.push({ path : '/ChargeManagement.page'});
-    },
-  },
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main4 mounted");
-  },
-};
-</script>
-
-<style scoped>
-@media all and (max-width: 479px) {
-  .form-wrap{width: -webkit-fill-available !important;}
-  .wrap{padding: 0 1rem;}
-  .form-wrap input{min-width: 27rem !important;}
-}
-.wrap {
-  width: 155rem;
-  margin: 100px auto;
-}
-
-.tab-wrap {
-  margin-bottom: 30px;
-}
-
-.tab-wrap ul {
-  display: flex;
-  gap: 2rem;
-}
-
-.tab {
-  display: inline-block;
-  width: 20rem;
-  height: 3rem;
-  line-height: 3rem;
-  text-align: center;
-  border-radius: 5px;
-  background: #fff;
-  color: #949292;
-  border: 1px solid #949292;
-}
-
-.tab.active {
-  background: #13833b;
-  color: #fff;
-  border-color: #13833b;
-}
-
-h2.page-title {
-  font-size: 24px;
-}
-
-hr.margin {
-  margin: 30px 0;
-}
-
-.form-wrap {
-  width: 52rem;
-  margin: 0 auto;
-}
-
-.idchk {
-  margin-left: 1rem;
-}
-
-.btn-wrap {
-  margin-top: 30px;
-  text-align: center;
-}
-
-.btn-2 {
-  display: inline-block;
-  padding: 0.3rem 2rem;
-  font-size: 13.333px;
-  color: #000;
-}
-
-.btn-wrap>*:not(:last-child) {
-  margin-right: 2rem;
-}
-
-.form-wrap .flex span {
-  display: inline-block;
-  width: 10rem;
-  padding: 0 5px;
-}
-
-.form-wrap input:not([type="radio"]) {
-  min-width: 30rem;
-}
-
-.form-wrap select {
-  min-width: 9rem;
-}
-
-.form-wrap select:not(:last-child) {
-  margin-right: 1.5rem;
-}
-
-.form-wrap input[type="radio"] {
-  vertical-align: middle;
-}
-
-.form-wrap label:not(:last-child) {
-  margin-right: 2rem;
-}
-
-.modal-wrap {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-
-.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;
-}
-
-.modal .btn-wrap {
-  margin-top: 15px;
-  text-align: center;
-}
-.txt-point {
-  color: #13833b;
-}
-</style>(No newline at end of file)
 
client/views/pages/SystemManagement/ManagerModifyForm.vue (deleted)
--- client/views/pages/SystemManagement/ManagerModifyForm.vue
@@ -1,370 +0,0 @@
-<template>
-  <div class="wrap">
-    <div>
-      <div>
-        <h2 class="page-title">횡단보도 유지보수 담당자 정보</h2>
-      </div>
-      <hr class="margin">
-      <div class="form-wrap">
-        <div class="flex m-b">
-          <span>이름 : </span>
-          <input type="text" placeholder=" Name" v-model="manager.mngr_nm">
-        </div>
-        <div class="flex m-b">
-          <span>전화번호 : </span>
-          <input type="text" placeholder=" '-' 을 제외하고 입력해주세요." maxlength="13" v-model="manager.mngr_telno" @change="phoneCheck" @keyup="getPhoneMask(manager.mngr_telno)">
-          <p style="color:red" v-if="telno_boolean === false">&nbsp;전화번호 9~11자리를 입력해주세요.</p>
-        </div>
-        <div class="flex m-b">
-          <span>이메일 : </span>
-          <input type="text" placeholder=" 예) [email protected]" v-model="manager.mngr_eml" @change="emailCheck">
-          <p style="color:red" v-if="email_boolean === false">&nbsp;잘못된 이메일 형식입니다.</p>
-        </div>
-        <div class="flex m-b">
-          <span>소속명 : </span>
-          <input type="text" placeholder=" 소속정보를 입력해주세요." v-model="manager.mngr_ogdp_info">
-        </div>
-
-        <div class="btn-wrap">
-          <button type="button" class="green-btn" @click="managerUpdateCheck">수정</button>
-          <button type="button" class="green-btn" @click="modal_delete = true">삭제</button>
-          <button class="btn-2 gray-btn" @click="managerSelectListPage">취소</button>
-        </div>
-      </div>
-    </div>
-  </div>
-
-  <div class="modal-wrap" v-if="modal_update == 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="managerUpdate">확인</button>
-        <button type="button" class="gray-btn" @click="modal_update = false">취소</button>
-      </div>
-    </div>
-  </div>
-
-  <div class="modal-wrap"  v-if="modal_delete == true">
-    <div class="modal-bg">
-    </div>
-    <div class="modal">
-      <p>
-        해당 기능은 데이터 <span class="txt-point-red">삭제</span>기능입니다.<br>
-        데이터 <span class="txt-point-red">삭제</span> 후, 조회에서 해당 데이터를 확인할 수 없습니다.<br>
-        <span class="txt-point-red">삭제</span>를 원하시면 아래 삭제 버튼을 눌러주세요.
-      </p>
-      <div class="btn-wrap">
-        <button type="button" class="green-btn" @click="managerDelete">삭제</button>
-        <button type="button" class="gray-btn" @click="modal_delete = false">취소</button>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import axios from 'axios';
-import COMMON_UTIL from '../../../resources/js/commonUtil.ts';
-import { useRoute } from 'vue-router';
-
-export default {
-  data: () => {
-    return {
-      manager: {
-        mngr_nm: null,
-        mngr_telno: null,
-        mngr_eml: null,
-        mngr_ogdp_info: null
-      },
-      route: useRoute(),
-
-      telno_boolean: true,
-      email_boolean: true,
-      modal_update: false,
-      modal_delete: false
-    };
-  },
-  methods: {
-
-    managerSelectOne: function() {
-      const vm = this;
-      axios({
-        url: '/managerSelectOne.json',
-        method: 'post',
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8"
-        },
-        data: vm.route.query
-      }).then(function(response) {
-        console.log("managerSelectOne - response : ", response.data);
-        vm.manager = response.data;
-        vm.manager.mngr_telno = vm.HyphenMinus(response.data.mngr_telno);
-      }).catch(function(error) {
-        console.log("managerSelectOne - error : ", error);
-      });
-    },
-
-    // 전화번호 '-' 추가 후 출력
-    HyphenMinus: function (telno) {
-      return COMMON_UTIL.HyphenMinus(telno);
-    },
-
-    //전화번호 입력 시 자동 '-' 삽입
-    getPhoneMask: function(telNumber) {
-      var res = COMMON_UTIL.getMask(telNumber)
-      this.manager.mngr_telno = res
-      //서버 전송 값에는 '-' 를 제외하고 숫자만 저장
-      this.manager.mngr_telno = this.telno.replace(/[^0-9]/g, '')
-    },
-    
-    emailCheck: function() {
-      this.email_boolean = true;
-      if (COMMON_UTIL.checkEmail(this.manager.mngr_eml) === false) this.email_boolean = false;
-    },
-
-    phoneCheck: function() {
-      this.telno_boolean = true;
-      if (COMMON_UTIL.checkPhone(this.manager.mngr_telno) === false) this.telno_boolean = false;
-    },
-
-    // 수정버튼 클릭 시 빈칸 검사
-    managerUpdateCheck: function() {
-
-      if (COMMON_UTIL.isEmpty(this.manager.mngr_nm) === false) {
-        alert('이름을 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.manager.mngr_telno) === false) {
-        alert('전화번호를 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkPhone(this.manager.mngr_telno) === false) {
-        alert('전화번호 형식을 확인해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.manager.mngr_eml) === false) {
-        alert('이메일을 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkEmail(this.manager.mngr_eml) === false) {
-        alert('이메일 형식을 확인해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.manager.mngr_ogdp_info) === false) {
-        alert('소속정보를 입력해주세요.');
-        return false;
-      }
-
-      this.modal_update = true
-    },
-
-    // 횡단보도 유지보수 담당자 수정
-    managerUpdate: function() {
-      const vm = this;
-      //서버 전송 값에는 '-' 를 제외하고 숫자만 저장
-      vm.manager.mngr_telno = vm.manager.mngr_telno.replace(/[^0-9]/g, '');
-
-      axios({
-        url: '/managerUpdate.json',
-        method: 'post',
-        herders: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: vm.manager
-      }).then(function (response) {
-        console.log("managerUpdate - response : ", response.data);
-        let result = response.data;
-        if (result > 0) {
-          alert("횡단보도 유지보수 담당자 수정을 완료 하였습니다.");
-          vm.managerSelectListPage();
-        } else {
-          alert('수정 실패, 관리자에게 문의해주세요.');
-          vm.modal_update = false;
-        }
-      }).catch(function(error) {
-        console.log("managerInsert - error : ", error);
-        alert('횡단보도 유지보수 담당자 등록 오류, 관리자에게 문의해주세요.');
-        vm.modal_update = false;
-      })
-    },
-
-    //횡단보도 유지보수 담당자 삭제
-    managerDelete: function() {
-      const vm = this;
-
-      axios({
-        url: '/managerDelete.json',
-        method: 'post',
-        headers: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: vm.manager
-      }).then(function(response) {
-        console.log("managerDelete - response : ",response.data);
-        let result = response.data;
-        if(result > 0) {
-          alert("횡단보도 유지보수 담당자 삭제를 완료 하였습니다.");
-          vm.managerSelectListPage();
-        } else {
-          alert("삭제 실패, 관리자에게 문의해주세요.");
-          vm.modal_delete = false;
-        }
-      }).catch(function (error) {
-        console.log("managerDelete - error : ", error);
-        alert("횡단보도 유지보수 담당자 삭제 오류, 관리자에게 문의해주세요.");
-        vm.modal_delete = false;
-      })
-    },
-
-    //횡단보도 유지보수 관리자 목록 페이지 이동
-    managerSelectListPage: function () {
-      this.$router.push({ path : '/ChargeManagement.page'});
-    },
-  },
-  watch: {},
-  computed: {},
-  mounted() {
-    console.log("Main4 mounted");
-    this.managerSelectOne();
-  },
-};
-</script>
-
-<style scoped>
-.wrap {
-  width: 155rem;
-  margin: 100px auto;
-}
-
-.tab-wrap {
-  margin-bottom: 30px;
-}
-
-.tab-wrap ul {
-  display: flex;
-  gap: 2rem;
-}
-
-.tab {
-  display: inline-block;
-  width: 20rem;
-  height: 3rem;
-  line-height: 3rem;
-  text-align: center;
-  border-radius: 5px;
-  background: #fff;
-  color: #949292;
-  border: 1px solid #949292;
-}
-
-.tab.active {
-  background: #13833b;
-  color: #fff;
-  border-color: #13833b;
-}
-
-h2.page-title {
-  font-size: 24px;
-}
-
-hr.margin {
-  margin: 30px 0;
-}
-
-.form-wrap {
-  width: 52rem;
-  margin: 0 auto;
-}
-
-.idchk {
-  margin-left: 1rem;
-}
-
-.btn-wrap {
-  margin-top: 30px;
-  text-align: center;
-}
-
-.btn-2 {
-  display: inline-block;
-  padding: 0.3rem 2rem;
-  font-size: 13.333px;
-  color: #000;
-}
-
-.btn-wrap>*:not(:last-child) {
-  margin-right: 2rem;
-}
-
-.form-wrap .flex span {
-  display: inline-block;
-  width: 10rem;
-  padding: 0 5px;
-}
-
-.form-wrap input:not([type="radio"]) {
-  min-width: 30rem;
-}
-
-.form-wrap select {
-  min-width: 9rem;
-}
-
-.form-wrap select:not(:last-child) {
-  margin-right: 1.5rem;
-}
-
-.form-wrap input[type="radio"] {
-  vertical-align: middle;
-}
-
-.form-wrap label:not(:last-child) {
-  margin-right: 2rem;
-}
-
-.modal-wrap {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-
-.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;
-}
-
-.modal .btn-wrap {
-  margin-top: 15px;
-  text-align: center;
-}
-.txt-point {
-  color: #13833b;
-}
-
-.txt-point-red {
-  color: red;
-}
-</style>(No newline at end of file)
 
client/views/pages/SystemManagement/NodeAddForm.vue (deleted)
--- client/views/pages/SystemManagement/NodeAddForm.vue
@@ -1,446 +0,0 @@
-<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: '22',
-      },
-      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/getDongsGeoJson.json','nodeMap','EPSG:5181', baseStyles['MultiPolygon'],'MultiPolygon',vm.node.dong_cd);
-      vm.$refs.open_layers.setZoom(11);
-    },
-
-    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('nodePoint');
-      
-      // Icon 그리기 
-      vm.$refs.open_layers.createIcon(coordinate[1],coordinate[0],'/client/resources/images/icon/fin2.png',0.3, 'nodePoint','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[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('nodeMap');
-      vm.$refs.open_layers.removeLayer('nodePoint');
-      //동 레이어 그리기
-      vm.$refs.open_layers.addVectorLayerByUrl('/common/getDongsGeoJson.json','nodeMap','EPSG:5181', baseStyles['MultiPolygon'],'MultiPolygon',vm.address.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);
-        if(vm.address.guGun_dong_cd === null) {
-          vm.$refs.open_layers.setZoom(11);
-        } else if(vm.address.dong_dong_cd === null) {
-          vm.$refs.open_layers.setZoom(12.5);
-        } else {
-          vm.$refs.open_layers.setZoom(16);
-        }
-        vm.$refs.open_layers.setCenterPosition(response.data.dong_lat,response.data.dong_lon,'EPSG:5181');
-        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_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) {
-      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>(No newline at end of file)
 
client/views/pages/SystemManagement/RequestLogView.vue (added)
+++ client/views/pages/SystemManagement/RequestLogView.vue
@@ -0,0 +1,360 @@
+<template>
+  <div class="wrap">   
+    <div class="board-wrap">
+      <div>
+        <h2 class="page-title">데이터 수집로그</h2>
+      </div>
+      <hr class="margin">
+      <div class="search-wrap clear-fix">
+        <div class="float-left">
+          <select v-model="pagenation.option1" @change="search">
+            <option value="false">전체</option>
+            <option value="true"> 오류목록 </option>
+          </select>
+        </div>
+        <div class="float-right flex gap">
+          <div class="flex gap m-b">
+            <label>등록일자</label>
+            <input type="date" value-format="yyyy-MM-dd" v-model="pagenation.startDate"/>
+            <span> ~ </span>
+            <input type="date" value-format="yyyy-MM-dd" v-model="pagenation.endDate"/>
+          </div>
+          <div class="flex gap">
+            <select v-model="pagenation.searchType">
+              <option value="null" disabled>검색조건</option>
+              <option value="user_nm">업체명</option>
+              <option value="api_key">API_KEY</option>
+            </select>
+            <input type="search" placeholder="검색어를 입력 해주세요." v-model="pagenation.searchValue" @keyup.enter="search"/>
+            <button type="button" class="green-btn" @click="search">검색</button>
+          </div>
+        </div>
+      </div>
+      <div style="min-height: 500px;background: #f7f6f6;">
+        <table class="pc">
+          <colgroup>
+            <col style="width: 5%;">
+            <col style="width: 20%;">
+            <col style="width: 10%;">
+            <col style="width: 10%;">
+            <col style="width: 15%;">           
+            <col style="width: 40%;">
+          
+          </colgroup>
+          <thead>
+            <tr>
+              <th>No</th>
+              <th>노드ID(방향)</th>
+              <th>업체명</th>
+              <th>오류발생여부</th>
+              <th>호출시간</th>
+              <th>메세지</th>
+             
+            </tr>
+          </thead>
+          <tbody>            
+            <tr v-for="(item, idx) in apiLogList" :key="idx">
+              <td data-title="NO">{{ pagenation.totalRow -  ((pagenation.currentPage ) * pagenation.perPage) + ( pagenation.perPage - idx) }}</td>
+              <td data-title="ID">{{ item.node_id }}({{change_code(item.crslk_az)}})</td>
+              <td data-title="이름">{{ item.user_nm }}</td>
+              <td data-title="오류발생여부">{{ item.err_yn }}</td>
+              <td data-titel="호출시간">{{ item.call_dt}}</td>
+              <td data-title="메세지">{{ item.msg }}</td>           
+            </tr>
+            <tr v-if="apiLogList.length == 0">
+                 <td data-title="NO" colspan="6">조회된 데이터가 없습니다.</td>
+            </tr>
+          </tbody>
+        </table>       
+      </div>
+      <div class="bottom-wrap">
+        <PaginationButton
+          v-model:currentPage="pagenation.currentPage"
+          :per-page="pagenation.perPage" :total-count="pagenation.totalRow" :max-range="5"
+          :click="search" />        
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from 'axios';
+import PaginationButton from '../../component/pagination/PaginationButton.vue';
+import COMMON_UTIL from '../../../resources/js/commonUtil.ts';
+
+export default {
+  data: () => {
+    return {
+      pagenation: {
+        currentPage: 1,
+        perPage: 10,
+        searchType: null,
+        searchValue: null,
+        startDate : null,
+        endDate : null,
+        option1 : false,
+        totalRow : 0,
+        api_key : '',
+        node_id : '',
+        call_dt : null,
+        reg_dt : '',
+        err_yn : false,
+        msg : '',
+      },      
+      apiLogList: [],
+      userIdx: 0
+    };
+  },
+  methods: {
+    //사용자 목록 조회
+    search: function () {
+      const vm = this;
+      axios({
+        url: '/getApiRequestLog.json',
+        method: 'post',
+        headers:{
+          'Content-Type': "application/json; charset=UTF-8",
+        },
+        data: vm.pagenation
+      }).then(function(response) {
+        console.log("userSelectList - response : ", response.data);
+        vm.apiLogList = response.data.apiLogList;
+        vm.pagenation = response.data.pagenation;
+      }).catch(function (error) {
+        console.log("userSelectList - error : ", error);
+        alert('사용자 목록 조회 오류, 관리자에게 문의해주세요.');
+      })
+    },
+
+    // 전화번호 '-' 추가 후 출력
+    HyphenMinus: function (telno) {
+      return COMMON_UTIL.HyphenMinus(telno);
+    },
+
+    //날짜 시,분,초 자르기
+    yyyymmdd: function (date) {
+      return COMMON_UTIL.yyyymmdd(date);
+    },
+
+    change_code : function(v)
+    {    
+      let result_val = '전체';
+
+      if(v==null) v = 0;
+
+      if(v == 10){
+        result_val = '북';
+      }else if( v == 20){
+        result_val = '동';
+      }else if( v == 30){
+        result_val = '남'; 
+      }else if( v == 40){
+        result_val = '서';
+      }else if( v == 50){
+        result_val = '북동';
+      }else if( v == 60){
+        result_val = '남동';
+      }else if( v == 70){
+        result_val = '남서';
+      }else if( v == 80){
+        result_val = '북서';
+      }
+      return result_val;
+    }  
+  },
+
+  watch: {},
+  filters : {
+    crlsk : function(v){
+
+      console.log(value);
+      let result_val = '전체';
+      if(v == 10){
+        result_val = '북';
+      }else if( v == 20){
+        result_val = '동';
+      }else if( v == 30){
+        result_val = '남'; 
+      }else if( v == 40){
+        result_val = '서';
+      }else if( v == 50){
+        result_val = '북동';
+      }else if( v == 60){
+        result_val = '남동';
+      }else if( v == 70){
+        result_val = '남서';
+      }else if( v == 80){
+        result_val = '북서';
+      }
+      return result_val;
+    } 
+  },
+  computed: {},
+  components: {
+    'PaginationButton':PaginationButton,
+  },
+  mounted() {   
+    this.search();
+  },
+};
+</script>
+
+<style scoped>
+@media all and (max-width: 479px) {
+  
+  .board-wrap{padding:  0 1rem;}
+  .float-right{display: flow-root; margin: 2rem 0 1rem 0}
+  .tab-wrap ul{justify-content: center}
+  .tab{width: 16rem !important;}
+  .wrap{width: -webkit-fill-available !important; margin: 20px auto !important;}
+.mobile{display: block !important;}
+.pc{display: none;}
+}
+.mobile{display: none;}
+.wrap {
+  width: 155rem;
+  margin: 100px auto;
+}
+
+.tab-wrap {
+  margin-bottom: 30px;
+}
+
+.tab-wrap ul {
+  display: flex;
+  gap: 2rem;
+}
+
+.tab {
+  display: inline-block;
+  width: 20rem;
+  height: 3rem;
+  line-height: 3rem;
+  text-align: center;
+  border-radius: 5px;
+  background: #fff;
+  color: #949292;
+  border: 1px solid #949292;
+}
+
+.tab.active {
+  background: #13833b;
+  color: #fff;
+  border-color: #13833b;
+}
+
+.search-wrap {
+  margin-bottom: 15px;
+}
+
+.search-wrap input,
+.search-wrap select {
+  height: 30.5px;
+  padding: 5px; 
+  border-radius: 3px;
+  border: 1px solid #949292;
+}
+
+.float-left {
+  float: left;
+  align-items: flex-start;
+}
+
+.float-right {
+  float: right;
+  align-items: flex-start;
+}
+
+.clear-fix::after {
+  content: "";
+  display: block;
+  clear: both;
+}
+
+.search-wrap .float-right form>*:not(:last-child) {
+  margin-right: 1rem;
+}
+
+h2.page-title {
+  font-size: 24px;
+}
+
+hr.margin {
+  margin: 30px 0;
+}
+
+table {
+  width: 100%;
+  text-align: center;
+  border-collapse: collapse;
+}
+
+th,
+td {
+  border-left: none;
+  border-right: none;
+}
+
+table th {
+  padding: 15px 0;
+  color: #fff;
+  background-color: #13833b;
+}
+
+table td {
+  padding: 15px 0;
+  border-bottom: 1px solid #e5e5dd;
+}
+
+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;
+}
+
+.btn-2 {
+  display: inline-block;
+  padding: 0.3rem 2rem;
+  font-size: 13.333px;
+}
+
+.green-btn {
+    background: #13833b;
+    border: 0;
+    border-radius: 5px;
+    color: #fff;
+    height: 30.5px;
+    padding: 5px;
+    width: 75px;
+}
+
+.btn-wrap {
+  position: absolute;
+  right: 0;
+  top: 1.5em;
+  z-index: 10;
+}
+</style>(No newline at end of file)
 
client/views/pages/SystemManagement/ResponseLogView.vue (added)
+++ client/views/pages/SystemManagement/ResponseLogView.vue
@@ -0,0 +1,359 @@
+<template>
+  <div class="wrap">   
+    <div class="board-wrap">
+      <div>
+        <h2 class="page-title">데이터 발신로그</h2>
+      </div>
+      <hr class="margin">
+      <div class="search-wrap clear-fix">
+        <div class="float-left">
+          <select v-model="pagenation.option1" @change="search">
+            <option value="false">전체</option>
+            <option value="true"> 오류목록 </option>
+          </select>
+        </div>
+        <div class="float-right flex gap">
+          <div class="flex gap m-b">
+            <label>등록일자</label>
+            <input type="date" value-format="yyyy-MM-dd" v-model="pagenation.startDate"/>
+            <span> ~ </span>
+            <input type="date" value-format="yyyy-MM-dd" v-model="pagenation.endDate"/>
+          </div>
+          <div class="flex gap">
+            <select v-model="pagenation.searchType">
+              <option value="null" disabled>검색조건</option>
+              <option value="user_nm">업체명</option>
+              <option value="api_key">API_KEY</option>
+            </select>
+            <input type="search" placeholder="검색어를 입력 해주세요." v-model="pagenation.searchValue" @keyup.enter="search"/>
+            <button type="button" class="green-btn" @click="search">검색</button>
+          </div>
+        </div>
+      </div>
+      <div style="min-height: 500px;background: #f7f6f6;">
+        <table class="pc">
+          <colgroup>
+            <col style="width: 5%;">
+            <col style="width: 20%;">
+            <col style="width: 10%;">
+            <col style="width: 10%;">
+            <col style="width: 15%;">           
+            <col style="width: 40%;">
+          
+          </colgroup>
+          <thead>
+            <tr>
+              <th>No</th>
+              <th>노드ID(방향)</th>
+              <th>업체명</th>
+              <th>오류발생여부</th>
+              <th>호출시간</th>
+              <th>메세지</th>             
+            </tr>
+          </thead>
+          <tbody>            
+            <tr v-for="(item, idx) in apiLogList" :key="idx">
+              <td data-title="NO">{{ pagenation.totalRow -  ((pagenation.currentPage ) * pagenation.perPage) + ( pagenation.perPage - idx) }}</td>
+              <td data-title="ID">{{ item.node_id }}({{change_code(item.crslk_az)}})</td>
+              <td data-title="이름">{{ item.user_nm }}</td>
+              <td data-title="오류발생여부">{{ item.err_yn }}</td> 
+              <td data-titel="호출시간">{{ item.call_dt}}</td>
+              <td data-title="메세지">{{ item.msg }}</td>           
+            </tr>
+            <tr v-if="apiLogList.length == 0">
+                 <td data-title="NO" colspan="6">조회된 데이터가 없습니다.</td>
+            </tr>
+          </tbody>
+        </table>      
+      </div>
+      <div class="bottom-wrap">
+        <PaginationButton
+          v-model:currentPage="pagenation.currentPage"
+          :per-page="pagenation.perPage" :total-count="pagenation.totalRow" :max-range="5"
+          :click="search" />        
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from 'axios';
+import PaginationButton from '../../component/pagination/PaginationButton.vue';
+import COMMON_UTIL from '../../../resources/js/commonUtil.ts';
+
+export default {
+  data: () => {
+    return {
+      pagenation: {
+        currentPage: 1,
+        perPage: 10,
+        searchType: null,
+        searchValue: null,
+        startDate : null,
+        endDate : null,
+        option1 : false,
+        totalRow : 0,
+        api_key : '',
+        node_id : '',
+        call_dt : null,
+        reg_dt : '',
+        err_yn : false,
+        msg : '',
+      },      
+      apiLogList: [],
+      userIdx: 0
+    };
+  },
+  methods: {
+    //사용자 목록 조회
+    search: function () {
+      const vm = this;
+      axios({
+        url: '/getApiResponseLog.json',
+        method: 'post',
+        headers:{
+          'Content-Type': "application/json; charset=UTF-8",
+        },
+        data: vm.pagenation
+      }).then(function(response) {
+        console.log("userSelectList - response : ", response.data);
+        vm.apiLogList = response.data.apiLogList;
+        vm.pagenation = response.data.pagenation;
+      }).catch(function (error) {
+        console.log("userSelectList - error : ", error);
+        alert('사용자 목록 조회 오류, 관리자에게 문의해주세요.');
+      })
+    },
+
+    // 전화번호 '-' 추가 후 출력
+    HyphenMinus: function (telno) {
+      return COMMON_UTIL.HyphenMinus(telno);
+    },
+
+    //날짜 시,분,초 자르기
+    yyyymmdd: function (date) {
+      return COMMON_UTIL.yyyymmdd(date);
+    },
+
+    change_code : function(v)
+    {    
+      let result_val = '전체';
+
+      if(v==null) v = 0;
+
+      if(v == 10){
+        result_val = '북';
+      }else if( v == 20){
+        result_val = '동';
+      }else if( v == 30){
+        result_val = '남'; 
+      }else if( v == 40){
+        result_val = '서';
+      }else if( v == 50){
+        result_val = '북동';
+      }else if( v == 60){
+        result_val = '남동';
+      }else if( v == 70){
+        result_val = '남서';
+      }else if( v == 80){
+        result_val = '북서';
+      }
+      return result_val;
+    }  
+  },
+
+  watch: {},
+  filters : {
+    crlsk : function(v){
+
+      console.log(value);
+      let result_val = '전체';
+      if(v == 10){
+        result_val = '북';
+      }else if( v == 20){
+        result_val = '동';
+      }else if( v == 30){
+        result_val = '남'; 
+      }else if( v == 40){
+        result_val = '서';
+      }else if( v == 50){
+        result_val = '북동';
+      }else if( v == 60){
+        result_val = '남동';
+      }else if( v == 70){
+        result_val = '남서';
+      }else if( v == 80){
+        result_val = '북서';
+      }
+      return result_val;
+    } 
+  },
+  computed: {},
+  components: {
+    'PaginationButton':PaginationButton,
+  },
+  mounted() {   
+    this.search();
+  },
+};
+</script>
+
+<style scoped>
+@media all and (max-width: 479px) {
+  
+  .board-wrap{padding:  0 1rem;}
+  .float-right{display: flow-root; margin: 2rem 0 1rem 0}
+  .tab-wrap ul{justify-content: center}
+  .tab{width: 16rem !important;}
+  .wrap{width: -webkit-fill-available !important; margin: 20px auto !important;}
+.mobile{display: block !important;}
+.pc{display: none;}
+}
+.mobile{display: none;}
+.wrap {
+  width: 155rem;
+  margin: 100px auto;
+}
+
+.tab-wrap {
+  margin-bottom: 30px;
+}
+
+.tab-wrap ul {
+  display: flex;
+  gap: 2rem;
+}
+
+.tab {
+  display: inline-block;
+  width: 20rem;
+  height: 3rem;
+  line-height: 3rem;
+  text-align: center;
+  border-radius: 5px;
+  background: #fff;
+  color: #949292;
+  border: 1px solid #949292;
+}
+
+.tab.active {
+  background: #13833b;
+  color: #fff;
+  border-color: #13833b;
+}
+
+.search-wrap {
+  margin-bottom: 15px;
+}
+
+.search-wrap input,
+.search-wrap select {
+  height: 30.5px;
+  padding: 5px; 
+  border-radius: 3px;
+  border: 1px solid #949292;
+}
+
+.float-left {
+  float: left;
+  align-items: flex-start;
+}
+
+.float-right {
+  float: right;
+  align-items: flex-start;
+}
+
+.clear-fix::after {
+  content: "";
+  display: block;
+  clear: both;
+}
+
+.search-wrap .float-right form>*:not(:last-child) {
+  margin-right: 1rem;
+}
+
+h2.page-title {
+  font-size: 24px;
+}
+
+hr.margin {
+  margin: 30px 0;
+}
+
+table {
+  width: 100%;
+  text-align: center;
+  border-collapse: collapse;
+}
+
+th,
+td {
+  border-left: none;
+  border-right: none;
+}
+
+table th {
+  padding: 15px 0;
+  color: #fff;
+  background-color: #13833b;
+}
+
+table td {
+  padding: 15px 0;
+  border-bottom: 1px solid #e5e5dd;
+}
+
+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;
+}
+
+.btn-2 {
+  display: inline-block;
+  padding: 0.3rem 2rem;
+  font-size: 13.333px;
+}
+
+.green-btn {
+    background: #13833b;
+    border: 0;
+    border-radius: 5px;
+    color: #fff;
+    height: 30.5px;
+    padding: 5px;
+    width: 75px;
+}
+
+.btn-wrap {
+  position: absolute;
+  right: 0;
+  top: 1.5em;
+  z-index: 10;
+}
+</style>(No newline at end of file)
 
client/views/pages/SystemManagement/UserAddForm.vue (deleted)
--- client/views/pages/SystemManagement/UserAddForm.vue
@@ -1,408 +0,0 @@
-<template>
-  <div class="wrap">
-    <div class="tab-wrap">
-      <ul>
-        <li>
-          <button class="tab active">사용자 관리</button>
-        </li>
-        <li>
-          <button @click="accessLogPage()" class="tab">접속기록 조회</button>
-        </li>
-      </ul>
-    </div>
-    <div>
-      <div>
-        <h2 class="page-title">사용자 등록</h2>
-      </div>
-      <hr class="margin">
-      <div class="form-wrap">
-        <div class="flex m-b">
-          <span>아이디 : </span>
-          <input type="text" placeholder="ID" v-model="user.user_id">
-          <button type="button" class="idchk green-btn" @click="idChcek">중복확인</button>
-        </div>
-        <div class="flex m-b">
-          <span>비밀번호 : </span>
-          <input type="password" placeholder="Password" v-model="user.user_pw">
-        </div>
-        <div class="flex m-b">
-          <span>비밀번호 확인 : </span>
-          <input type="password" placeholder="Confirm Password" v-model="passwordCheck">
-        </div>
-        <div class="flex m-b">
-          <span>이름 : </span>
-          <input type="text" placeholder="Name" v-model="user.user_nm">
-        </div>
-        <div class="flex m-b">
-          <span>전화번호 : </span>
-          <input type="text" placeholder=" '-' 을 제외하고 입력해주세요." maxlength="13" v-model="user.user_telno" @change="phoneCheck" @keyup="getPhoneMask(user.user_telno)">
-          <p style="color:red" v-if="telno_boolean === false">&nbsp;전화번호 9~11자리를 입력해주세요.</p>
-        </div>
-        <div class="flex m-b">
-          <span>이메일 : </span>
-          <input type="text" placeholder=" 예) [email protected]" v-model="user.user_eml" @change="emailCheck">
-          <p style="color:red" v-if="email_boolean === false">&nbsp;잘못된 이메일 형식입니다.</p>
-        </div>
-        <div class="flex m-b">
-          <span>관리구역 : </span>
-          <dongSelectList @setDongCd="setDongCd" :nodeHiddenCk="true" :azimuthHiddenCk="true"></dongSelectList>
-        </div>
-        <div class="flex m-b">
-          <span>비고 : </span>
-          <input type="text" placeholder="참고사항을 입력해주세요." v-model="user.rm">
-        </div>
-        <div class="flex m-b">
-          <span>권한 : </span>
-          <label for="radio_1">
-            <input type="radio" name="radio" id="radio_1" value="시청관리자" v-model="user.user_author">
-            시청관리자
-          </label>
-          <label for="radio_2">
-            <input type="radio" name="radio" id="radio_2" value="지자체관리자" v-model="user.user_author">
-            지자체관리자
-          </label>
-        </div>
-
-        <div class="btn-wrap">
-          <button type="button" class="green-btn" @click="userInsertCheck">등록</button>
-            <span class="btn-2 gray-btn" @click="userSelectListPage()">취소</span>
-        </div>
-      </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="userInsert">확인</button>
-        <button type="button" class="gray-btn" @click="modal_insert = false">취소</button>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import axios from 'axios';
-import COMMON_UTIL from '../../../resources/js/commonUtil.ts';
-import dongSelectList from '../../component/dongSelectList.vue';
-
-export default {
-  data: () => {
-    return {
-      user: {
-        user_id: null,
-        user_pw: null,
-        user_nm: null,
-        user_telno: null,
-        user_eml: null,
-        user_author: null,
-        dong_cd: null,
-        rm: null
-      },
-      passwordCheck: null,
-      passwordCheckFlag: null,
-      telno_boolean: true,
-      email_boolean: true,
-      idChcek_boolean: false,
-      telno: null,
-      modal_insert: false,
-
-      //관리구역 행동코드
-      address: {}
-    };
-  },
-  methods: {
-
-    //ID 중복 검사
-    idChcek: function() {
-      const vm = this;
-      axios({
-        url: '/user/userSelectOne.json',
-        method: 'post',
-        herders: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: vm.user
-      }).then( function (response) {
-        console.log("idCheck - response : ", response.data);
-        if(response.data != null) {
-          alert("중복된 ID 입니다.");
-          vm.idChcek_boolean = false;
-          return false;
-        } else {
-          alert("사용가능한 ID 입니다.");
-          vm.idChcek_boolean = true;
-          return true;
-        }
-      }).catch( function (error) {
-        console.log("idCheck - error : ", error);
-        alert("중복검사 오류, 다시 시도해주세요.");
-        vm.idChcek_boolean = false;
-      });
-    },
-
-    //전화번호 입력 시 자동 '-' 삽입
-    getPhoneMask: function(telNumber) {
-      var res = COMMON_UTIL.getMask(telNumber)
-      this.user.user_telno = res
-    },
-    
-    emailCheck: function() {
-      this.email_boolean = true;
-
-      if (COMMON_UTIL.checkEmail(this.user.user_eml) === false) 
-      this.email_boolean = false;
-    },
-
-    phoneCheck: function() {
-      this.telno_boolean = true;
-
-      if (COMMON_UTIL.checkPhone(this.user.user_telno) === false) 
-      this.telno_boolean = false;
-    },
-
-    // 등록버튼 클릭 시 빈칸 검사
-    userInsertCheck: function() {
-      if (COMMON_UTIL.isEmpty(this.user.user_id) === false) {
-        alert('ID를 입력해주세요.');
-        return false;
-      }
-
-      if (this.idChcek_boolean === false) {
-        alert("ID중복검사를 완료해주세요.")
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.user.user_pw) === false) {
-        alert('비밀번호를 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkPassword(this.user.user_pw, this.passwordCheck) === false) {
-        alert('비밀번호가 일치하지 않습니다.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.user.user_nm) === false) {
-        alert('이름을 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.user.user_telno) === false) {
-        alert('전화번호를 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkPhone(this.user.user_telno) === false) {
-        alert('전화번호 형식을 확인해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.user.user_eml) === false) {
-        alert('이메일을 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkEmail(this.user.user_eml) === false) {
-        alert('이메일 형식을 확인해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.address.siDo_dong_cd) === false) {
-        alert('관리구역을 선택해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.user.user_author) === false) {
-        alert('권한을 선택해주세요.');
-        return false;
-      }
-      this.modal_insert = true
-    },
-
-    // 사용자 등록
-    userInsert: function() {
-      const vm = this;
-      //서버 전송 값에는 '-' 를 제외하고 숫자만 저장
-      vm.user.user_telno = vm.user.user_telno.replace(/[^0-9]/g, '');
-      vm.user.dong_cd = vm.address.dong_cd;
-      axios({
-        url: '/user/userInsert.json',
-        method: 'post',
-        herders: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: vm.user
-      }).then(function (response) {
-        console.log("userInsert - response : ", response);
-        let result = response.data;
-        if (result > 0) {
-          alert("사용자 등록을 완료 하였습니다.");
-          vm.userSelectListPage();
-        } else {
-          alert("등록 실패, 관리자에게 문의해주세요.");
-          vm.modal_insert = false;
-        }
-      }).catch(function (error) {
-        console.log("userInsert - error : ", error);
-        alert("사용자 등록 오류, 관리자에게 문의해주세요.");
-        vm.modal_insert = false;
-      })
-    },
-    
-    //사용자 목록 페이지 이동
-    userSelectListPage: function () {
-      this.$router.push({ path: '/UserManagement.page'});
-    },
-
-    //접속기록조회 페이지 이동
-    accessLogPage: function () {
-      this.$router.push({ path: '/AccessRecord.page'});
-    },
-
-    setDongCd(value) {
-      this.address = value;
-    },
-  },
-  watch: {},
-  computed: {},
-  components: {
-    dongSelectList: dongSelectList
-  },
-  mounted() {
-    console.log("Main4 mounted");
-  },
-};
-</script>
-
-<style scoped>
-.wrap {
-  width: 155rem;
-  margin: 100px auto;
-}
-
-.tab-wrap {
-  margin-bottom: 30px;
-}
-
-.tab-wrap ul {
-  display: flex;
-  gap: 2rem;
-}
-
-.tab {
-  display: inline-block;
-  width: 20rem;
-  height: 3rem;
-  line-height: 3rem;
-  text-align: center;
-  border-radius: 5px;
-  background: #fff;
-  color: #949292;
-  border: 1px solid #949292;
-}
-
-.tab.active {
-  background: #13833b;
-  color: #fff;
-  border-color: #13833b;
-}
-
-h2.page-title {
-  font-size: 24px;
-}
-
-hr.margin {
-  margin: 30px 0;
-}
-
-.form-wrap {
-  width: 52rem;
-  margin: 0 auto;
-}
-
-.idchk {
-  margin-left: 1rem;
-}
-
-.btn-wrap {
-  margin-top: 30px;
-  text-align: center;
-}
-
-.btn-2 {
-  display: inline-block;
-  padding: 0.3rem 2rem;
-  font-size: 13.333px;
-  color: #000;
-}
-
-.btn-wrap>*:not(:last-child) {
-  margin-right: 2rem;
-}
-
-.form-wrap .flex span {
-  display: inline-block;
-  width: 10rem;
-  padding: 0 5px;
-}
-
-.form-wrap input:not([type="radio"]) {
-  min-width: 30rem;
-}
-
-.form-wrap select {
-  min-width: 9rem;
-}
-
-.form-wrap select:not(:last-child) {
-  margin-right: 1.5rem;
-}
-
-.form-wrap input[type="radio"] {
-  vertical-align: middle;
-}
-
-.form-wrap label:not(:last-child) {
-  margin-right: 2rem;
-}
-
-.modal-wrap {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-
-.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;
-}
-
-.modal .btn-wrap {
-  margin-top: 15px;
-  text-align: center;
-}
-.txt-point {
-  color: #13833b;
-}
-</style>(No newline at end of file)
client/views/pages/SystemManagement/UserManagement.vue
--- client/views/pages/SystemManagement/UserManagement.vue
+++ client/views/pages/SystemManagement/UserManagement.vue
@@ -1,140 +1,74 @@
 <template>
-  <div class="wrap">
-    <div class="tab-wrap">
-      <ul>
-        <li>
-          <button class="tab active">사용자 관리</button>
-        </li>
-        <li>
-          <button @click="accessLogPage()" class="tab">접속기록 조회</button>
-        </li>
-      </ul>
-    </div>
+  <div class="wrap">   
     <div class="board-wrap">
       <div>
-        <h2 class="page-title">사용자 관리</h2>
+        <h2 class="page-title">데이터 수집로그</h2>
       </div>
       <hr class="margin">
       <div class="search-wrap clear-fix">
         <div class="float-left">
-          <select v-model="userListSearch.authorFilter" @change="userSelectList">
-            <option value="null" disabled>권한필터</option>
-            <option value="시청관리자">시청관리자</option>
-            <option value="지자체관리자">지자체관리자</option>
+          <select v-model="pagenation.option1" @change="search">
+            <option value="false">전체</option>
+            <option value="true"> 오류목록 </option>
           </select>
         </div>
         <div class="float-right flex gap">
           <div class="flex gap m-b">
             <label>등록일자</label>
-            <input type="date" value-format="yyyyMMdd" v-model="userListSearch.startDate"/>
+            <input type="date" value-format="yyyy-MM-dd" v-model="pagenation.startDate"/>
             <span> ~ </span>
-            <input type="date" value-format="yyyyMMdd" v-model="userListSearch.endDate"/>
+            <input type="date" value-format="yyyy-MM-dd" v-model="pagenation.endDate"/>
           </div>
           <div class="flex gap">
-            <select v-model="userListSearch.searchType">
+            <select v-model="pagenation.searchType">
               <option value="null" disabled>검색조건</option>
-              <option value="user_id">ID</option>
-              <option value="user_nm">이름</option>
-              <option value="dong_cd">관리구역</option>
+              <option value="user_nm">업체명</option>
+              <option value="api_key">API_KEY</option>
             </select>
-            <input type="search" placeholder="검색어를 입력 해주세요." v-model="userListSearch.searchText" @keyup.enter="userSelectList"/>
-            <button type="button" class="green-btn" @click="userSelectList">검색</button>
+            <input type="search" placeholder="검색어를 입력 해주세요." v-model="pagenation.searchValue" @keyup.enter="search"/>
+            <button type="button" class="green-btn" @click="search">검색</button>
           </div>
         </div>
       </div>
-      <div>
+      <div style="min-height: 500px;background: #f7f6f6;">
         <table class="pc">
           <colgroup>
             <col style="width: 5%;">
-            <col style="width: 15%;">
-            <col style="width: 15%;">
-            <col style="width: 15%;">
-            <col style="width: 15%;">
+            <col style="width: 20%;">
             <col style="width: 10%;">
-            <col style="width: 15%;">
             <col style="width: 10%;">
+            <col style="width: 15%;">           
+            <col style="width: 40%;">
+          
           </colgroup>
           <thead>
             <tr>
               <th>No</th>
-              <th>ID</th>
-              <th>이름</th>
-              <th>권한</th>
-              <th>전화번호</th>
-              <th>관리구역</th>
-              <th>등록일자</th>
-              <th>비고</th>
+              <th>노드ID(방향)</th>
+              <th>업체명</th>
+              <th>오류발생여부</th>
+              <th>호출시간</th>
+              <th>메세지</th>
+             
             </tr>
           </thead>
           <tbody>            
-            <tr v-for="(item, idx) in userList" :key="idx" @click="userSelectOnePage(item)">
-              <td data-title="NO">{{ userIdx - idx }}</td>
-              <td data-title="ID">{{ item.user_id }}</td>
+            <tr v-for="(item, idx) in apiLogList" :key="idx">
+              <td data-title="NO">{{ idx }}</td>
+              <td data-title="ID">{{ item.node_id }}({{change_code(item.crslk_az)}})</td>
               <td data-title="이름">{{ item.user_nm }}</td>
-              <td data-title="권한">{{ item.user_author }}</td>
-              <td data-title="전화번호">{{ HyphenMinus(item.user_telno) }}</td>
-              <td data-titel="관리구역">{{ item.sido_nm + " " + item.sigungu_nm + " " + item.dong_nm }}</td>
-              <td data-titel="등록일자">{{ yyyymmdd(item.reg_dt) }}</td>
-              <td data-totel="비고">{{ item.rm }}</td>
+              <td data-title="오류발생여부">{{ item.err_yn }}</td>
+              <td data-titel="호출시간">{{ item.call_dt}}</td>
+              <td data-title="메세지">{{ item.msg }}</td>           
             </tr>
           </tbody>
-        </table>
-        <table class="mobile">
-          <colgroup>
-            <col style="width: 10%;">
-            <col style="width: 20%;">
-          </colgroup>
-          <tbody          
-            v-for="(item, idx) in userList"
-            :key="idx"
-            @click="userSelectOnePage(item)"
-          >
-            <tr>
-              <th>No</th>
-              <td data-title="NO">{{ idx + 1 }}</td>
-            </tr>
-            <tr>
-              <th>ID</th>
-              <td data-title="ID">{{ item.user_id }}</td>
-            </tr>
-            <tr>
-              <th>이름</th>
-              <td data-title="이름">{{ item.user_nm }}</td>
-            </tr>
-            <tr>
-              <th>권한</th>
-              <td data-title="권한">{{ item.user_author }}</td>
-            </tr>
-            <tr>
-              <th>전화번호</th>
-              <td data-title="전화번호">
-                {{ HyphenMinus(item.user_telno) }}
-              </td>
-            </tr>
-            <tr>
-              <th>관리구역</th>
-              <td data-titel="관리구역">{{ item.sido_nm + " " + item.sigungu_nm + " " + item.dong_nm }}</td>
-            </tr>
-            <tr>
-              <th>등록일자</th>
-              <td data-titel="등록일자">{{ yyyymmdd(item.reg_dt) }}</td>
-            </tr>
-            <tr>
-              <th>비고</th>
-              <td data-totel="비고">{{ item.rm }}</td>
-            </tr>
-            <hr class="margin2 m-b" />
-          </tbody>
-        </table>
+        </table>        
       </div>
       <div class="bottom-wrap">
         <PaginationButton
-          v-model:currentPage="userListSearch.currentPage"
-          :per-page="userListSearch.perPage" :total-count="userListCount" :max-range="5"
-          :click="userSelectList" />
-        <div class="btn-wrap">
-          <button @click="userInsertPage" class="btn-2 green-btn">등록</button>
-        </div>
+          v-model:currentPage="pagenation.currentPage"
+          :per-page="pagenation.perPage" :total-count="pagenation.totalRow" :max-range="5"
+          :click="search" />        
       </div>
     </div>
   </div>
@@ -148,37 +82,41 @@
 export default {
   data: () => {
     return {
-      userListSearch: {
+      pagenation: {
         currentPage: 1,
         perPage: 10,
-        authorFilter: null,
         searchType: null,
-        searchText: null,
-        startDate: null,
-        endDate: null
-      },
-      dong_fullName: null,
-      userListCount: 0,
-      userList: [],
+        searchValue: null,
+        startDate : null,
+        endDate : null,
+        option1 : false,
+        totalRow : 0,
+        api_key : '',
+        node_id : '',
+        call_dt : null,
+        reg_dt : '',
+        err_yn : false,
+        msg : '',
+      },      
+      apiLogList: [],
       userIdx: 0
     };
   },
   methods: {
     //사용자 목록 조회
-    userSelectList: function () {
+    search: function () {
       const vm = this;
       axios({
-        url: '/user/userSelectList.json',
+        url: '/getApiResponseLog.json',
         method: 'post',
         headers:{
           'Content-Type': "application/json; charset=UTF-8",
         },
-        data: vm.userListSearch
+        data: vm.pagenation
       }).then(function(response) {
         console.log("userSelectList - response : ", response.data);
-        vm.userListCount = response.data.userListCount;
-        vm.userList = response.data.userList;
-        vm.userIdx = vm.userListCount-(vm.userListSearch.currentPage-1)*vm.userList.length;
+        vm.apiLogList = response.data.apiLogList;
+        vm.pagenation = response.data.pagenation;
       }).catch(function (error) {
         console.log("userSelectList - error : ", error);
         alert('사용자 목록 조회 오류, 관리자에게 문의해주세요.');
@@ -195,30 +133,65 @@
       return COMMON_UTIL.yyyymmdd(date);
     },
 
-    //접속기록조회 페이지 이동
-    accessLogPage: function () {
-      this.$router.push({ path: '/AccessRecord.page'});
-    },
+    change_code : function(v)
+    {    
+      let result_val = '전체';
 
-    //사용자 상세조회 페이지 이동
-    userSelectOnePage: function(user) {
-      this.$router.push({ path: '/UserModifyForm.page', query: {'user_id':user.user_id}});
-    },
+      if(v==null) v = 0;
 
-    //사용자 등록 페이지 이동
-    userInsertPage: function() {
-      this.$router.push({path: '/UserAddForm.page'});
-    }
-    },
+      if(v == 10){
+        result_val = '북';
+      }else if( v == 20){
+        result_val = '동';
+      }else if( v == 30){
+        result_val = '남'; 
+      }else if( v == 40){
+        result_val = '서';
+      }else if( v == 50){
+        result_val = '북동';
+      }else if( v == 60){
+        result_val = '남동';
+      }else if( v == 70){
+        result_val = '남서';
+      }else if( v == 80){
+        result_val = '북서';
+      }
+      return result_val;
+    }  
+  },
 
   watch: {},
+  filters : {
+    crlsk : function(v){
+
+      console.log(value);
+      let result_val = '전체';
+      if(v == 10){
+        result_val = '북';
+      }else if( v == 20){
+        result_val = '동';
+      }else if( v == 30){
+        result_val = '남'; 
+      }else if( v == 40){
+        result_val = '서';
+      }else if( v == 50){
+        result_val = '북동';
+      }else if( v == 60){
+        result_val = '남동';
+      }else if( v == 70){
+        result_val = '남서';
+      }else if( v == 80){
+        result_val = '북서';
+      }
+      return result_val;
+    } 
+  },
   computed: {},
   components: {
     'PaginationButton':PaginationButton,
   },
-  mounted() {
-    console.log("UserManageMent Join");
-    this.userSelectList();
+  mounted() {   
+    this.search();
   },
 };
 </script>
@@ -268,22 +241,25 @@
 }
 
 .search-wrap {
-  margin-bottom: 30px;
+  margin-bottom: 15px;
 }
 
 .search-wrap input,
 .search-wrap select {
-  height: 22.5px;
+  height: 30.5px;
+  padding: 5px; 
   border-radius: 3px;
   border: 1px solid #949292;
 }
 
 .float-left {
   float: left;
+  align-items: flex-start;
 }
 
 .float-right {
   float: right;
+  align-items: flex-start;
 }
 
 .clear-fix::after {
@@ -323,7 +299,7 @@
 }
 
 table td {
-  padding: 10px 0;
+  padding: 15px 0;
   border-bottom: 1px solid #e5e5dd;
 }
 
@@ -362,6 +338,16 @@
   font-size: 13.333px;
 }
 
+.green-btn {
+    background: #13833b;
+    border: 0;
+    border-radius: 5px;
+    color: #fff;
+    height: 30.5px;
+    padding: 5px;
+    width: 75px;
+}
+
 .btn-wrap {
   position: absolute;
   right: 0;
 
client/views/pages/SystemManagement/UserModifyForm.vue (deleted)
--- client/views/pages/SystemManagement/UserModifyForm.vue
@@ -1,442 +0,0 @@
-<template>
-  <div class="wrap">
-    <div class="tab-wrap">
-      <ul>
-        <li>
-          <button class="tab active">사용자 관리</button>
-        </li>
-        <li>
-          <button @click="accessLogPage()" class="tab">접속기록 조회</button>
-        </li>
-      </ul>
-    </div>
-    <div>
-      <div>
-        <h2 class="page-title">사용자 정보</h2>
-      </div>
-      <hr class="margin">
-      <div class="form-wrap">
-        <div class="flex m-b">
-          <span>아이디 : </span>
-          <span>{{ user.user_id }} </span>
-        </div>
-        <div class="flex m-b">
-          <span>비밀번호 : </span>
-          <input type="password" placeholder="Password" v-model="user.user_pw">
-        </div>
-        <div class="flex m-b">
-          <span>비밀번호 확인 : </span>
-          <input type="password" placeholder="Confirm Password" v-model="passwordCheck">
-        </div>
-        <div class="flex m-b">
-          <span>이름 : </span>
-          <input type="text" placeholder="Name" v-model="user.user_nm">
-        </div>
-        <div class="flex m-b">
-          <span>전화번호 : </span>
-          <input type="text" placeholder=" '-' 을 제외하고 입력해주세요." maxlength="13" v-model="user.user_telno" @change="phoneCheck" @keyup="getPhoneMask(user.user_telno)">
-          <p style="color:red" v-if="telno_boolean === false">&nbsp;전화번호 9~11자리를 입력해주세요.</p>
-        </div>
-        <div class="flex m-b">
-          <span>이메일 : </span>
-          <input type="text" placeholder=" 예) [email protected]" v-model="user.user_eml" @change="emailCheck">
-          <p style="color:red" v-if="email_boolean === false">&nbsp;잘못된 이메일 형식입니다.</p>
-        </div>
-        <div class="flex m-b">
-          <span>관리구역 : </span>
-          <dongSelectList @setDongCd="setDongCd" :nodeHiddenCk="true" :azimuthHiddenCk="true"></dongSelectList>
-        </div>
-        <div class="flex m-b">
-          <span>비고 : </span>
-          <input type="text" placeholder="참고사항을 입력해주세요." v-model="user.rm">
-        </div>
-        <div class="flex m-b">
-          <span>권한 : </span>
-          <label for="radio_1">
-            <input type="radio" name="radio" id="radio_1" value="시청관리자" v-model="user.user_author">
-            시청관리자
-          </label>
-          <label for="radio_2">
-            <input type="radio" name="radio" id="radio_2" value="지자체관리자" v-model="user.user_author">
-            지자체관리자
-          </label>
-        </div>
-
-        <div class="btn-wrap">
-          <button type="button" class="green-btn" @click="userUpdateCheck">수정</button>
-          <button type="button" class="green-btn" @click="modal_delete = true">삭제</button>
-            <span class="btn-2 gray-btn" @click="userSelectListPage()">취소</span>
-        </div>
-      </div>
-    </div>
-  </div>
-
-  <div class="modal-wrap" v-if="modal_update == 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="userUpdate">확인</button>
-        <button type="button" class="gray-btn" @click="modal_update = false">취소</button>
-      </div>
-    </div>
-  </div>
-
-  <div class="modal-wrap"  v-if="modal_delete == true">
-    <div class="modal-bg">
-    </div>
-    <div class="modal">
-      <p>
-        해당 기능은 데이터 <span class="txt-point-red">삭제</span>기능입니다.<br>
-        데이터 <span class="txt-point-red">삭제</span> 후, 조회에서 해당 데이터를 확인할 수 없습니다.<br>
-        <span class="txt-point-red">삭제</span>를 원하시면 아래 삭제 버튼을 눌러주세요.
-      </p>
-      <div class="btn-wrap">
-        <button type="button" class="green-btn" @click="userDelete">삭제</button>
-        <button type="button" class="gray-btn" @click="modal_delete = false">취소</button>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import axios from 'axios';
-import COMMON_UTIL from '../../../resources/js/commonUtil.ts';
-import { useRoute } from 'vue-router';
-import dongSelectList from '../../component/dongSelectList.vue';
-
-export default {
-  data: () => {
-    return {
-      user: {
-        user_id: null,
-        user_pw: null,
-        user_nm: null,
-        user_telno: null,
-        user_eml: null,
-        user_author: null,
-        rm: null,
-        dong_cd: null
-      },
-      route: useRoute(),
-
-      passwordCheck: null,
-      
-      telno_boolean: true,
-      email_boolean: true,
-      modal_update: false,
-      modal_delete: false,
-
-      //관리구역 행동코드
-      address: {}
-    };
-  },
-  methods: {
-
-    //사용자 상세조회
-    userSelectOne: function() {
-      const vm = this;
-      axios({
-        url: '/user/userSelectOne.json',
-        method: 'post',
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8"
-        },
-        data: vm.route.query
-      }).then(function (response) {
-        console.log("userSelectOne - response : ", response.data);
-        vm.user = response.data;
-        vm.user.user_telno = vm.HyphenMinus(response.data.user_telno);
-      }).catch(function(error) {
-        console.log("userSelectOne - error : ", error)
-      });
-    },
-
-     // 전화번호 '-' 추가 후 출력
-     HyphenMinus: function (telno) {
-      return COMMON_UTIL.HyphenMinus(telno);
-    },
-
-    //전화번호 입력 시 자동 '-' 삽입
-    getPhoneMask: function(telNumber) {
-      var res = COMMON_UTIL.getMask(telNumber)
-      this.user.user_telno = res
-      // this.user.user_telno = this.user_telno.replace(/[^0-9]/g, '')
-    },
-    
-    emailCheck: function() {
-      this.email_boolean = true;
-      if (COMMON_UTIL.checkEmail(this.user.user_eml) === false) this.email_boolean = false;
-    },
-
-    phoneCheck: function() {
-      this.telno_boolean = true;
-      if (COMMON_UTIL.checkPhone(this.user.user_telno) === false) this.telno_boolean = false;
-    },
-
-    // 수정버튼 클릭 시 빈칸 검사
-    userUpdateCheck: function() {
-   
-      if (COMMON_UTIL.isEmpty(this.user.user_pw) === false) {
-        alert('비밀번호를 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkPassword(this.user.user_pw, this.passwordCheck) === false) {
-        alert('비밀번호가 일치하지 않습니다.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.user.user_nm) === false) {
-        alert('이름을 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.user.user_telno) === false) {
-        alert('전화번호를 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkPhone(this.user.user_telno) === false) {
-        alert('전화번호 형식을 확인해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.isEmpty(this.user.user_eml) === false) {
-        alert('이메일을 입력해주세요.');
-        return false;
-      }
-
-      if (COMMON_UTIL.checkEmail(this.user.user_eml) === false) {
-        alert('이메일 형식을 확인해주세요.');
-        return false;
-      }
-
-      // if (COMMON_UTIL.isEmpty(this.user.) === false) {
-      //   alert('관리구역을 선택해주세요.');
-      //   return false;
-      // }
-
-      if (COMMON_UTIL.isEmpty(this.user.user_author) === false) {
-        alert('권한을 선택해주세요.');
-        return false;
-      }
-      this.modal_update = true
-    },
-
-    userUpdate: function() {
-      const vm = this;
-      //서버 전송 값에는 '-' 를 제외하고 숫자만 저장
-      vm.user.user_telno = vm.user.user_telno.replace(/[^0-9]/g, '');
-      vm.user.dong_cd = vm.address.dong_cd
-
-      axios({
-        url: '/user/userUpdate.json',
-        method: 'post',
-        headers: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: vm.user
-      }).then(function(response) {
-        console.log("userUpdate - response : ",response.data);
-        let result = response.data;
-        if(result > 0) {
-          alert("사용자 정보 수정을 완료 하였습니다.");
-          vm.userSelectListPage();
-        } else {
-          alert("수정 실패, 관리자에게 문의해주세요.");
-          vm.modal_update = false;
-        }
-      }).catch(function (error) {
-        console.log("userUpdate - error : ", error);
-        alert("사용자정보 수정 오류, 관리자에게 문의해주세요.");
-        vm.modal_update = false;
-      })
-    },
-
-    //사용자아이디 사용여부 N
-    userDelete: function() {
-      const vm = this;
-      axios({
-        url: '/user/userDelete.json',
-        method: 'post',
-        headers: {
-          'Content-Type': "application/json; charset=UTF-8",
-        },
-        data: vm.user
-      }).then(function(response) {
-        console.log("userUpdate - response : ",response.data);
-        let result = response.data;
-        if(result > 0) {
-          alert("사용자 삭제를 완료 하였습니다.");
-          vm.userSelectListPage();
-        } else {
-          alert("삭제 실패, 관리자에게 문의해주세요.");
-          vm.modal_delete = false;
-        }
-      }).catch(function (error) {
-        console.log("userUpdate - error : ", error);
-        alert("사용자 삭제 오류, 관리자에게 문의해주세요.");
-        vm.modal_delete = false;
-      })
-    },
-
-    setDongCd(value) {
-      this.address = value;
-    },
-
-    //사용자 목록 페이지 이동
-    userSelectListPage: function () {
-      this.$router.push({ path: '/UserManagement.page'});
-    },
-
-    //접속기록조회 페이지 이동
-    accessLogPage: function () {
-      this.$router.push({ path: '/AccessRecord.page'});
-    },
-  },
-  watch: {},
-  computed: {},
-  components: {
-    dongSelectList: dongSelectList
-  },
-  mounted() {
-    console.log("UserModifyForm mounted");
-    this.userSelectOne();
-  },
-};
-</script>
-
-<style scoped>
-.wrap {
-  width: 155rem;
-  margin: 100px auto;
-}
-
-.tab-wrap {
-  margin-bottom: 30px;
-}
-
-.tab-wrap ul {
-  display: flex;
-  gap: 2rem;
-}
-
-.tab {
-  display: inline-block;
-  width: 20rem;
-  height: 3rem;
-  line-height: 3rem;
-  text-align: center;
-  border-radius: 5px;
-  background: #fff;
-  color: #949292;
-  border: 1px solid #949292;
-}
-
-.tab.active {
-  background: #13833b;
-  color: #fff;
-  border-color: #13833b;
-}
-
-h2.page-title {
-  font-size: 24px;
-}
-
-hr.margin {
-  margin: 30px 0;
-}
-
-.form-wrap {
-  width: 52rem;
-  margin: 0 auto;
-}
-
-.idchk {
-  margin-left: 1rem;
-}
-
-.btn-wrap {
-  margin-top: 30px;
-  text-align: center;
-}
-
-.btn-2 {
-  display: inline-block;
-  padding: 0.3rem 2rem;
-  font-size: 13.333px;
-  color: #000;
-}
-
-.btn-wrap>*:not(:last-child) {
-  margin-right: 2rem;
-}
-
-.form-wrap .flex span {
-  display: inline-block;
-  width: 10rem;
-  padding: 0 5px;
-}
-
-.form-wrap input:not([type="radio"]) {
-  min-width: 30rem;
-}
-
-.form-wrap select {
-  min-width: 9rem;
-}
-
-.form-wrap select:not(:last-child) {
-  margin-right: 1.5rem;
-}
-
-.form-wrap input[type="radio"] {
-  vertical-align: middle;
-}
-
-.form-wrap label:not(:last-child) {
-  margin-right: 2rem;
-}
-
-.modal-wrap {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-
-.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;
-}
-
-.modal .btn-wrap {
-  margin-top: 15px;
-  text-align: center;
-}
-.txt-point {
-  color: #13833b;
-}
-
-.txt-point-red {
-  color: red;
-}
-</style>(No newline at end of file)
 
client/views/pages/board/BoardInsert.vue (deleted)
--- client/views/pages/board/BoardInsert.vue
@@ -1,55 +0,0 @@
-<template>
-    <div>test</div>
-
-</template>
-
-<script>
-import axios from 'axios';
-
-export default {
-    data: () => {
-        return {
-            board:{
-                board_id:'1',
-                board_type:'2',
-                board_name:'3',
-                comment_at:'4',
-                write_at:'5',
-            }
-            
-        };
-    },
-    methods: {
-        boardInsert: function () {
-            const vm = this;
-
-            axios({
-                url: '/testDataSelectList.json',
-                method: 'post',
-                headers: {
-                    'Content-Type': "application/json; charset=UTF-8",
-                },
-                data: {}
-            }).then(function (response) {
-                console.log("test - response : ", response.data);
-                // vm.orderMoldListCount = response.data.orderMoldListCount;
-                // vm.orderMoldList = response.data.orderMoldList;
-            }).catch(function (error) {
-                console.log("boardInsert - error : ", error);
-                alert('게시판 생성 오류, 관리자에게 문의해주세요.');
-            });
-        },
-    },
-    watch: {
-        
-    },
-    computed: {},
-    components: {
-    },
-    mounted: function () {
-        console.log("Vue mounted");
-        this.boardInsert();
-    },
-};
-</script>
-
client/views/pages/main/Login.vue
--- client/views/pages/main/Login.vue
+++ client/views/pages/main/Login.vue
@@ -7,19 +7,18 @@
       <hr class="margin">
       <div class="form-wrap">
         <form action="">
-          <div class="flex-center m-b">
+          <div class="flex-center m-b"  style="display: block;">
             <label for="id">아이디</label>
             <input type="text" name="" id="" ref="user_id" placeholder="ID" v-model="userLogin.user_id" @keyup.enter="login">
           </div>
-          <div class="flex-center m-b">
+          <div class="flex-center m-b" style="display: block;">
             <label for="password">비밀번호</label>
             <input type="password" name="" id="" ref="user_pw" placeholder="Password" v-model="userLogin.user_pw" @keyup.enter="login">
-          </div>   
-          <div class="btn-wrap">
-            <button type="button" class="green-btn btn-l loginbtn"  @click="login">로그인</button>
-            <router-link to="/IdFind.page"> <span class="">아이디 찾기</span></router-link>
-          </div>
+          </div>  
         </form>
+         <div class="btn-wrap">
+            <button type="button" class="green-btn btn-l loginbtn"  @click="login">로그인</button>            
+          </div>
       </div>
     </div>
   </div>  
@@ -28,65 +27,54 @@
 <script>
 import axios from 'axios';
 import crypto from "crypto-js";
-import { useStore } from 'vuex';
+import Vue from "vue";
+import Vuex from "vuex";
+
+
+//Vue.use(Vuex);
+
 export default {
   data() {
     return {
       userLogin: {
-          user_id: null,
-          user_pw: null
+          user_id: '',
+          user_pw: ''
       },
-      store: useStore(),
     };
   },
   methods: {
     //로그인
     login: function () {
-            let vm = this;
-            //Encrypt
-            // var iv = this.store.state.key.iv;
-            // var salt = this.store.state.key.salt;
-            // var passPhrase = this.store.state.key.ENC_KEY;
-            var iv = 'e9d3712c4d5c35093d340733b8c26b92';
-            var salt = 'deafa8b6802cebcc0bcceaaa5f3461a9';
-            var passPhrase = 'e534cf179007db7e6360ebf95fa5d51c';
-            var keySize = 128;
-            var iterationCount = 1000;
-            var key128Bits100Iterations = crypto.PBKDF2(passPhrase,
-                crypto.enc.Hex.parse(salt),
-                { keySize: keySize / 32, iterations: iterationCount }
-            );
+            let vm = this;      
 
-            //var encrypted = CryptoJS.AES.encrypt(
-            // this.userLogin.user_pw = crypto.AES.encrypt(this.userLogin.user_pw, key128Bits100Iterations, { iv: crypto.enc.Hex.parse(iv) }).toString();
+            // 빈값 제한 
+            if(this.userLogin.user_id.length < 2){
+                alert('아이디를 입력해 주세요');  
+                return false; 
+            }else if(this.userLogin.user_pw.length < 2){
+                alert('비밀번호를 입력해 주세요');  
+                return false;
+            }
+
             axios({
-                url: '/user/login.json',
+                url: '/userLogin.json',
                 method: 'post',
                 headers: {
                     'Content-Type': 'application/json; charset=UTF-8'
                 },
                 data: vm.userLogin
-            }).then(function (response) {
-                // console.log("login - response : ", response);
-                if (response.data == true) {
-                    vm.$router.push({ path: '/', query: {} });
-                } else {
-                    alert('로그인 정보를 다시 확인해주세요.');
-                    vm.$refs['user_id'].focus();
+            }).then(function (response) {              
+                if(response.data.result == 0){
+                  alert(response.data.message);         
+                  sessionStorage.setItem("login", false);            
+                }else{
+                  sessionStorage.setItem("login", true);   
+                  vm.$router.push({ path: '/ApiTokenManagement.page', query: {} });                
                 }
             }).catch(function (error) {
-                console.log("login - error : ", error);
+                console.log("loginogin - error : ", error);
             });
-        },
-        // // 암호화 메서드
-        // cipher : (password, key) => {
-        //     const encrypt = crypto.createCipher(AES, key) // des알고리즘과 키를 설정
-        //     const encryptResult = encrypt.update(password, 'utf8', 'base64') // 암호화
-        //         + encrypt.final('base64') // 인코딩
-
-        //     console.log(encryptResult)
-        //     return encryptResult
-        // }  
+        },   
   },
   watch: {},
   computed: {},
@@ -176,6 +164,7 @@
 .form-wrap input:not([type="radio"]) {
   min-width: 30rem;
   min-height: 4rem;
+  padding: 5px;
 }
 
 .form-wrap select {
 
client/views/pages/test/TestInsert.jsx (deleted)
--- client/views/pages/test/TestInsert.jsx
@@ -1,20 +0,0 @@
-import React from 'react';
-
-/**
- * @author : 최정우
- * @since : 2022.09.24
- * @dscription : 테스트용 등록 페이지 입니다.
- */
-function TestInsert () {
-    return (
-        <>
-            <div style={{width:'100%', height:'100vh', backgroundColor:'#6799FF', textAlign:'center'}}>
-                <div style={{margin:'0 auto'}}>
-                    <p>Test용 목록 조회 페이지 입니다</p>
-                </div>
-            </div>
-        </>
-    )
-}
-export default TestInsert;
-
 
client/views/pages/test/TestSelectList.jsx (deleted)
--- client/views/pages/test/TestSelectList.jsx
@@ -1,20 +0,0 @@
-import React from 'react';
-
-/**
- * @author : 최정우
- * @since : 2022.09.24
- * @dscription : 테스트용 목록 조회 페이지 입니다.
- */
-function TestSelectList () {
-    return (
-        <>
-            <div style={{width:'100%', height:'100vh', backgroundColor:'#6799FF', textAlign:'center'}}>
-                <div style={{margin:'0 auto'}}>
-                    <p>Test용 목록 조회 페이지 입니다</p>
-                </div>
-            </div>
-        </>
-    )
-}
-export default TestSelectList;
-
 
client/views/pages/test/TestSelectOne.jsx (deleted)
--- client/views/pages/test/TestSelectOne.jsx
@@ -1,20 +0,0 @@
-import React from 'react';
-
-/**
- * @author : 최정우
- * @since : 2022.09.24
- * @dscription : 테스트용 상세 조회 페이지 입니다.
- */
-function TestSelectOne () {
-    return (
-        <>
-            <div style={{width:'100%', height:'100vh', backgroundColor:'#6799FF', textAlign:'center'}}>
-                <div style={{margin:'0 auto'}}>
-                    <p>Test용 상세 조회 페이지 입니다</p>
-                </div>
-            </div>
-        </>
-    )
-}
-export default TestSelectOne;
-
 
client/views/pages/test/TestUpdate.jsx (deleted)
--- client/views/pages/test/TestUpdate.jsx
@@ -1,20 +0,0 @@
-import React from 'react';
-
-/**
- * @author : 최정우
- * @since : 2022.09.24
- * @dscription : 테스트용 수정 페이지 입니다.
- */
-function TestUpdate () {
-    return (
-        <>
-            <div style={{width:'100%', height:'100vh', backgroundColor:'#6799FF', textAlign:'center'}}>
-                <div style={{margin:'0 auto'}}>
-                    <p>Test용 목록 조회 페이지 입니다</p>
-                </div>
-            </div>
-        </>
-    )
-}
-export default TestUpdate;
-
package-lock.json
--- package-lock.json
+++ package-lock.json
@@ -26,12 +26,13 @@
         "vue": "3.2.40",
         "vue-loader": "^17.0.0",
         "vue-router": "4.1.5",
+        "vue-session": "^1.0.0",
         "vue-style-loader": "4.1.3",
         "vue3-leaflet": "^1.0.46",
         "vue3-openlayers": "^0.5.1",
         "vue3-sfc-loader": "^0.8.4",
         "vuex": "^4.1.0",
-        "webpack": "5.74.0",
+        "webpack": "^5.88.1",
         "webpack-cli": "4.10.0"
       },
       "devDependencies": {
@@ -415,9 +416,9 @@
       }
     },
     "node_modules/@jridgewell/source-map": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
-      "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+      "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.0",
         "@jridgewell/trace-mapping": "^0.3.9"
@@ -2075,9 +2076,9 @@
       }
     },
     "node_modules/@types/estree": {
-      "version": "0.0.51",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
-      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
+      "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA=="
     },
     "node_modules/@types/geojson": {
       "version": "7946.0.8",
@@ -2090,9 +2091,9 @@
       "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
     },
     "node_modules/@types/node": {
-      "version": "18.11.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz",
-      "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw=="
+      "version": "20.4.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz",
+      "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw=="
     },
     "node_modules/@types/proj4": {
       "version": "2.5.2",
@@ -2230,133 +2231,133 @@
       "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ=="
     },
     "node_modules/@webassemblyjs/ast": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
-      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+      "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
       "dependencies": {
-        "@webassemblyjs/helper-numbers": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+        "@webassemblyjs/helper-numbers": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
       }
     },
     "node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
-      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+      "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw=="
     },
     "node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
-      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+      "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
     },
     "node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
-      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+      "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA=="
     },
     "node_modules/@webassemblyjs/helper-numbers": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
-      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+      "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
       "dependencies": {
-        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+        "@webassemblyjs/helper-api-error": "1.11.6",
         "@xtuc/long": "4.2.2"
       }
     },
     "node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
-      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+      "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
     },
     "node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
-      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+      "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/wasm-gen": "1.11.6"
       }
     },
     "node_modules/@webassemblyjs/ieee754": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
-      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+      "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
       "dependencies": {
         "@xtuc/ieee754": "^1.2.0"
       }
     },
     "node_modules/@webassemblyjs/leb128": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
-      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+      "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
       "dependencies": {
         "@xtuc/long": "4.2.2"
       }
     },
     "node_modules/@webassemblyjs/utf8": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
-      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+      "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
     },
     "node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
-      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+      "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/helper-wasm-section": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-opt": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "@webassemblyjs/wast-printer": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/helper-wasm-section": "1.11.6",
+        "@webassemblyjs/wasm-gen": "1.11.6",
+        "@webassemblyjs/wasm-opt": "1.11.6",
+        "@webassemblyjs/wasm-parser": "1.11.6",
+        "@webassemblyjs/wast-printer": "1.11.6"
       }
     },
     "node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
-      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+      "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/ieee754": "1.11.6",
+        "@webassemblyjs/leb128": "1.11.6",
+        "@webassemblyjs/utf8": "1.11.6"
       }
     },
     "node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
-      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+      "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/wasm-gen": "1.11.6",
+        "@webassemblyjs/wasm-parser": "1.11.6"
       }
     },
     "node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
-      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+      "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-api-error": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/ieee754": "1.11.6",
+        "@webassemblyjs/leb128": "1.11.6",
+        "@webassemblyjs/utf8": "1.11.6"
       }
     },
     "node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
-      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+      "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
       "dependencies": {
-        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/ast": "1.11.6",
         "@xtuc/long": "4.2.2"
       }
     },
@@ -2416,9 +2417,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.8.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
-      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+      "version": "8.10.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -2427,9 +2428,9 @@
       }
     },
     "node_modules/acorn-import-assertions": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
-      "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
       "peerDependencies": {
         "acorn": "^8"
       }
@@ -3003,9 +3004,9 @@
       }
     },
     "node_modules/css-loader/node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "version": "7.5.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -3170,9 +3171,9 @@
       }
     },
     "node_modules/enhanced-resolve": {
-      "version": "5.10.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
-      "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
+      "version": "5.15.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+      "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
       "dependencies": {
         "graceful-fs": "^4.2.4",
         "tapable": "^2.2.0"
@@ -3193,9 +3194,9 @@
       }
     },
     "node_modules/es-module-lexer": {
-      "version": "0.9.3",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
-      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz",
+      "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA=="
     },
     "node_modules/es6-promise": {
       "version": "4.2.8",
@@ -4150,9 +4151,9 @@
       }
     },
     "node_modules/make-dir/node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
       "bin": {
         "semver": "bin/semver"
       }
@@ -5039,9 +5040,9 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "node_modules/schema-utils": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
       "dependencies": {
         "@types/json-schema": "^7.0.8",
         "ajv": "^6.12.5",
@@ -5056,9 +5057,9 @@
       }
     },
     "node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -5105,9 +5106,9 @@
       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
     },
     "node_modules/serialize-javascript": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
-      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+      "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
       "dependencies": {
         "randombytes": "^2.1.0"
       }
@@ -5318,12 +5319,12 @@
       }
     },
     "node_modules/terser": {
-      "version": "5.15.1",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
-      "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
+      "version": "5.19.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz",
+      "integrity": "sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==",
       "dependencies": {
-        "@jridgewell/source-map": "^0.3.2",
-        "acorn": "^8.5.0",
+        "@jridgewell/source-map": "^0.3.3",
+        "acorn": "^8.8.2",
         "commander": "^2.20.0",
         "source-map-support": "~0.5.20"
       },
@@ -5335,15 +5336,15 @@
       }
     },
     "node_modules/terser-webpack-plugin": {
-      "version": "5.3.6",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz",
-      "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==",
+      "version": "5.3.9",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+      "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
       "dependencies": {
-        "@jridgewell/trace-mapping": "^0.3.14",
+        "@jridgewell/trace-mapping": "^0.3.17",
         "jest-worker": "^27.4.5",
         "schema-utils": "^3.1.1",
-        "serialize-javascript": "^6.0.0",
-        "terser": "^5.14.1"
+        "serialize-javascript": "^6.0.1",
+        "terser": "^5.16.8"
       },
       "engines": {
         "node": ">= 10.13.0"
@@ -5507,9 +5508,9 @@
       "dev": true
     },
     "node_modules/ts-loader/node_modules/semver": {
-      "version": "7.5.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
-      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "version": "7.5.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
       "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
@@ -5755,6 +5756,11 @@
         "vue": "^3.2.0"
       }
     },
+    "node_modules/vue-session": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/vue-session/-/vue-session-1.0.0.tgz",
+      "integrity": "sha512-Ep9lRKGgCZdcGV3In3R3zoSp5Wr+hlcIc8WJ9BG+QKzibwaFZnnvp9HBVdd+dU8d6HGLSi5sWywDmd5MkrkfoQ=="
+    },
     "node_modules/vue-style-loader": {
       "version": "4.1.3",
       "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
@@ -5850,21 +5856,21 @@
       "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
     },
     "node_modules/webpack": {
-      "version": "5.74.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz",
-      "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==",
+      "version": "5.88.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz",
+      "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==",
       "dependencies": {
         "@types/eslint-scope": "^3.7.3",
-        "@types/estree": "^0.0.51",
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/wasm-edit": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
+        "@types/estree": "^1.0.0",
+        "@webassemblyjs/ast": "^1.11.5",
+        "@webassemblyjs/wasm-edit": "^1.11.5",
+        "@webassemblyjs/wasm-parser": "^1.11.5",
         "acorn": "^8.7.1",
-        "acorn-import-assertions": "^1.7.6",
+        "acorn-import-assertions": "^1.9.0",
         "browserslist": "^4.14.5",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.10.0",
-        "es-module-lexer": "^0.9.0",
+        "enhanced-resolve": "^5.15.0",
+        "es-module-lexer": "^1.2.1",
         "eslint-scope": "5.1.1",
         "events": "^3.2.0",
         "glob-to-regexp": "^0.4.1",
@@ -5873,9 +5879,9 @@
         "loader-runner": "^4.2.0",
         "mime-types": "^2.1.27",
         "neo-async": "^2.6.2",
-        "schema-utils": "^3.1.0",
+        "schema-utils": "^3.2.0",
         "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.1.3",
+        "terser-webpack-plugin": "^5.3.7",
         "watchpack": "^2.4.0",
         "webpack-sources": "^3.2.3"
       },
@@ -6289,9 +6295,9 @@
       "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
     },
     "@jridgewell/source-map": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
-      "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+      "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
       "requires": {
         "@jridgewell/gen-mapping": "^0.3.0",
         "@jridgewell/trace-mapping": "^0.3.9"
@@ -7619,9 +7625,9 @@
       }
     },
     "@types/estree": {
-      "version": "0.0.51",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
-      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
+      "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA=="
     },
     "@types/geojson": {
       "version": "7946.0.8",
@@ -7634,9 +7640,9 @@
       "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
     },
     "@types/node": {
-      "version": "18.11.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz",
-      "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw=="
+      "version": "20.4.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz",
+      "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw=="
     },
     "@types/proj4": {
       "version": "2.5.2",
@@ -7761,133 +7767,133 @@
       "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ=="
     },
     "@webassemblyjs/ast": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
-      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+      "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
       "requires": {
-        "@webassemblyjs/helper-numbers": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+        "@webassemblyjs/helper-numbers": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
       }
     },
     "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
-      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+      "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw=="
     },
     "@webassemblyjs/helper-api-error": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
-      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+      "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
     },
     "@webassemblyjs/helper-buffer": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
-      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+      "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA=="
     },
     "@webassemblyjs/helper-numbers": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
-      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+      "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
       "requires": {
-        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+        "@webassemblyjs/helper-api-error": "1.11.6",
         "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
-      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+      "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
     },
     "@webassemblyjs/helper-wasm-section": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
-      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+      "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
       "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/wasm-gen": "1.11.6"
       }
     },
     "@webassemblyjs/ieee754": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
-      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+      "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
       "requires": {
         "@xtuc/ieee754": "^1.2.0"
       }
     },
     "@webassemblyjs/leb128": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
-      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+      "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
       "requires": {
         "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/utf8": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
-      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+      "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
     },
     "@webassemblyjs/wasm-edit": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
-      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+      "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
       "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/helper-wasm-section": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-opt": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "@webassemblyjs/wast-printer": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/helper-wasm-section": "1.11.6",
+        "@webassemblyjs/wasm-gen": "1.11.6",
+        "@webassemblyjs/wasm-opt": "1.11.6",
+        "@webassemblyjs/wasm-parser": "1.11.6",
+        "@webassemblyjs/wast-printer": "1.11.6"
       }
     },
     "@webassemblyjs/wasm-gen": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
-      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+      "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
       "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/ieee754": "1.11.6",
+        "@webassemblyjs/leb128": "1.11.6",
+        "@webassemblyjs/utf8": "1.11.6"
       }
     },
     "@webassemblyjs/wasm-opt": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
-      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+      "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
       "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-buffer": "1.11.1",
-        "@webassemblyjs/wasm-gen": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-buffer": "1.11.6",
+        "@webassemblyjs/wasm-gen": "1.11.6",
+        "@webassemblyjs/wasm-parser": "1.11.6"
       }
     },
     "@webassemblyjs/wasm-parser": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
-      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+      "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
       "requires": {
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/helper-api-error": "1.11.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
-        "@webassemblyjs/ieee754": "1.11.1",
-        "@webassemblyjs/leb128": "1.11.1",
-        "@webassemblyjs/utf8": "1.11.1"
+        "@webassemblyjs/ast": "1.11.6",
+        "@webassemblyjs/helper-api-error": "1.11.6",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+        "@webassemblyjs/ieee754": "1.11.6",
+        "@webassemblyjs/leb128": "1.11.6",
+        "@webassemblyjs/utf8": "1.11.6"
       }
     },
     "@webassemblyjs/wast-printer": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
-      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+      "version": "1.11.6",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+      "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
       "requires": {
-        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/ast": "1.11.6",
         "@xtuc/long": "4.2.2"
       }
     },
@@ -7931,14 +7937,14 @@
       }
     },
     "acorn": {
-      "version": "8.8.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
-      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w=="
+      "version": "8.10.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
     },
     "acorn-import-assertions": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
-      "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
       "requires": {}
     },
     "ajv": {
@@ -8364,9 +8370,9 @@
       },
       "dependencies": {
         "semver": {
-          "version": "7.3.8",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "version": "7.5.4",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+          "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
           "requires": {
             "lru-cache": "^6.0.0"
           }
@@ -8488,9 +8494,9 @@
       "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
     },
     "enhanced-resolve": {
-      "version": "5.10.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
-      "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
+      "version": "5.15.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+      "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
       "requires": {
         "graceful-fs": "^4.2.4",
         "tapable": "^2.2.0"
@@ -8502,9 +8508,9 @@
       "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw=="
     },
     "es-module-lexer": {
-      "version": "0.9.3",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
-      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz",
+      "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA=="
     },
     "es6-promise": {
       "version": "4.2.8",
@@ -9215,9 +9221,9 @@
       },
       "dependencies": {
         "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+          "version": "5.7.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+          "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
         }
       }
     },
@@ -9861,9 +9867,9 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "schema-utils": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
       "requires": {
         "@types/json-schema": "^7.0.8",
         "ajv": "^6.12.5",
@@ -9871,9 +9877,9 @@
       }
     },
     "semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
     },
     "send": {
       "version": "0.18.0",
@@ -9918,9 +9924,9 @@
       }
     },
     "serialize-javascript": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
-      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+      "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
       "requires": {
         "randombytes": "^2.1.0"
       }
@@ -10071,26 +10077,26 @@
       "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
     },
     "terser": {
-      "version": "5.15.1",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
-      "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
+      "version": "5.19.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz",
+      "integrity": "sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==",
       "requires": {
-        "@jridgewell/source-map": "^0.3.2",
-        "acorn": "^8.5.0",
+        "@jridgewell/source-map": "^0.3.3",
+        "acorn": "^8.8.2",
         "commander": "^2.20.0",
         "source-map-support": "~0.5.20"
       }
     },
     "terser-webpack-plugin": {
-      "version": "5.3.6",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz",
-      "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==",
+      "version": "5.3.9",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+      "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
       "requires": {
-        "@jridgewell/trace-mapping": "^0.3.14",
+        "@jridgewell/trace-mapping": "^0.3.17",
         "jest-worker": "^27.4.5",
         "schema-utils": "^3.1.1",
-        "serialize-javascript": "^6.0.0",
-        "terser": "^5.14.1"
+        "serialize-javascript": "^6.0.1",
+        "terser": "^5.16.8"
       }
     },
     "text-segmentation": {
@@ -10194,9 +10200,9 @@
           "dev": true
         },
         "semver": {
-          "version": "7.5.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
-          "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+          "version": "7.5.4",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+          "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
           "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
@@ -10359,6 +10365,11 @@
         "@vue/devtools-api": "^6.1.4"
       }
     },
+    "vue-session": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/vue-session/-/vue-session-1.0.0.tgz",
+      "integrity": "sha512-Ep9lRKGgCZdcGV3In3R3zoSp5Wr+hlcIc8WJ9BG+QKzibwaFZnnvp9HBVdd+dU8d6HGLSi5sWywDmd5MkrkfoQ=="
+    },
     "vue-style-loader": {
       "version": "4.1.3",
       "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
@@ -10444,21 +10455,21 @@
       "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
     },
     "webpack": {
-      "version": "5.74.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz",
-      "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==",
+      "version": "5.88.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz",
+      "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==",
       "requires": {
         "@types/eslint-scope": "^3.7.3",
-        "@types/estree": "^0.0.51",
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/wasm-edit": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
+        "@types/estree": "^1.0.0",
+        "@webassemblyjs/ast": "^1.11.5",
+        "@webassemblyjs/wasm-edit": "^1.11.5",
+        "@webassemblyjs/wasm-parser": "^1.11.5",
         "acorn": "^8.7.1",
-        "acorn-import-assertions": "^1.7.6",
+        "acorn-import-assertions": "^1.9.0",
         "browserslist": "^4.14.5",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.10.0",
-        "es-module-lexer": "^0.9.0",
+        "enhanced-resolve": "^5.15.0",
+        "es-module-lexer": "^1.2.1",
         "eslint-scope": "5.1.1",
         "events": "^3.2.0",
         "glob-to-regexp": "^0.4.1",
@@ -10467,9 +10478,9 @@
         "loader-runner": "^4.2.0",
         "mime-types": "^2.1.27",
         "neo-async": "^2.6.2",
-        "schema-utils": "^3.1.0",
+        "schema-utils": "^3.2.0",
         "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.1.3",
+        "terser-webpack-plugin": "^5.3.7",
         "watchpack": "^2.4.0",
         "webpack-sources": "^3.2.3"
       }
package.json
--- package.json
+++ package.json
@@ -21,12 +21,13 @@
     "vue": "3.2.40",
     "vue-loader": "^17.0.0",
     "vue-router": "4.1.5",
+    "vue-session": "^1.0.0",
     "vue-style-loader": "4.1.3",
     "vue3-leaflet": "^1.0.46",
     "vue3-openlayers": "^0.5.1",
     "vue3-sfc-loader": "^0.8.4",
     "vuex": "^4.1.0",
-    "webpack": "5.74.0",
+    "webpack": "^5.88.1",
     "webpack-cli": "4.10.0"
   },
   "scripts": {
Add a comment
List