diff --git a/src/assets/poi.png b/src/assets/poi.png
new file mode 100644
index 0000000..0b0d823
Binary files /dev/null and b/src/assets/poi.png differ
diff --git a/src/assets/water.png b/src/assets/water.png
new file mode 100644
index 0000000..10e7af5
Binary files /dev/null and b/src/assets/water.png differ
diff --git a/src/components/Login.vue b/src/components/Login.vue
index 41ed719..26a0432 100644
--- a/src/components/Login.vue
+++ b/src/components/Login.vue
@@ -78,7 +78,7 @@
diff --git a/src/components/admin/forms/PasswordChange.vue b/src/components/admin/forms/PasswordChange.vue
index 17bbf79..9ccb8f8 100644
--- a/src/components/admin/forms/PasswordChange.vue
+++ b/src/components/admin/forms/PasswordChange.vue
@@ -1,7 +1,7 @@
-
+
diff --git a/src/components/admin/forms/PositionSelect.vue b/src/components/admin/forms/PositionSelect.vue
new file mode 100644
index 0000000..6504961
--- /dev/null
+++ b/src/components/admin/forms/PositionSelect.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+ 确认
+
+
+ 取消
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/admin/forms/ProjectDetail.vue b/src/components/admin/forms/ProjectDetail.vue
index dad3b57..636b217 100644
--- a/src/components/admin/forms/ProjectDetail.vue
+++ b/src/components/admin/forms/ProjectDetail.vue
@@ -1,6 +1,6 @@
-
+
diff --git a/src/components/admin/forms/SensorDetai.vue b/src/components/admin/forms/SensorDetai.vue
index f62873e..91eef8b 100644
--- a/src/components/admin/forms/SensorDetai.vue
+++ b/src/components/admin/forms/SensorDetai.vue
@@ -1,6 +1,6 @@
-
+
diff --git a/src/components/admin/forms/UserDetail.vue b/src/components/admin/forms/UserDetail.vue
index 2fa554a..a6a5ce2 100644
--- a/src/components/admin/forms/UserDetail.vue
+++ b/src/components/admin/forms/UserDetail.vue
@@ -1,6 +1,6 @@
-
+
diff --git a/src/components/map/Index.vue b/src/components/map/Index.vue
index 1a212aa..fc5c0a5 100644
--- a/src/components/map/Index.vue
+++ b/src/components/map/Index.vue
@@ -1,41 +1,114 @@
diff --git a/src/components/utils/olInteraction.js b/src/components/utils/olInteraction.js
new file mode 100644
index 0000000..cf36175
--- /dev/null
+++ b/src/components/utils/olInteraction.js
@@ -0,0 +1,109 @@
+import {
+ Pointer as PointerInteraction,
+ defaults as defaultInteractions,
+ } from 'ol/interaction';
+
+export const Drag = /*@__PURE__*/(function (PointerInteraction) {
+ function Drag() {
+ PointerInteraction.call(this, {
+ handleDownEvent: handleDownEvent,
+ handleDragEvent: handleDragEvent,
+ handleMoveEvent: handleMoveEvent,
+ handleUpEvent: handleUpEvent,
+ });
+
+ /**
+ * @type {import("../src/ol/coordinate.js").Coordinate}
+ * @private
+ */
+ this.coordinate_ = null;
+
+ /**
+ * @type {string|undefined}
+ * @private
+ */
+ this.cursor_ = 'pointer';
+
+ /**
+ * @type {Feature}
+ * @private
+ */
+ this.feature_ = null;
+
+ /**
+ * @type {string|undefined}
+ * @private
+ */
+ this.previousCursor_ = undefined;
+ }
+
+ if ( PointerInteraction ) Drag.__proto__ = PointerInteraction;
+ Drag.prototype = Object.create( PointerInteraction && PointerInteraction.prototype );
+ Drag.prototype.constructor = Drag;
+
+ return Drag;
+ }(PointerInteraction));
+
+ /**
+ * @param {import("../src/ol/MapBrowserEvent.js").default} evt Map browser event.
+ * @return {boolean} `true` to start the drag sequence.
+ */
+ function handleDownEvent(evt) {
+ var map = evt.map;
+
+ var feature = map.forEachFeatureAtPixel(evt.pixel, function (feature) {
+ return feature;
+ });
+
+ if (feature) {
+ this.coordinate_ = evt.coordinate;
+ this.feature_ = feature;
+ }
+
+ return !!feature;
+ }
+
+ /**
+ * @param {import("../src/ol/MapBrowserEvent.js").default} evt Map browser event.
+ */
+ function handleDragEvent(evt) {
+ var deltaX = evt.coordinate[0] - this.coordinate_[0];
+ var deltaY = evt.coordinate[1] - this.coordinate_[1];
+
+ var geometry = this.feature_.getGeometry();
+ geometry.translate(deltaX, deltaY);
+
+ this.coordinate_[0] = evt.coordinate[0];
+ this.coordinate_[1] = evt.coordinate[1];
+ }
+
+ /**
+ * @param {import("../src/ol/MapBrowserEvent.js").default} evt Event.
+ */
+ function handleMoveEvent(evt) {
+ if (this.cursor_) {
+ var map = evt.map;
+ var feature = map.forEachFeatureAtPixel(evt.pixel, function (feature) {
+ return feature;
+ });
+ var element = evt.map.getTargetElement();
+ if (feature) {
+ if (element.style.cursor != this.cursor_) {
+ this.previousCursor_ = element.style.cursor;
+ element.style.cursor = this.cursor_;
+ }
+ } else if (this.previousCursor_ !== undefined) {
+ element.style.cursor = this.previousCursor_;
+ this.previousCursor_ = undefined;
+ }
+ }
+ }
+
+ /**
+ * @return {boolean} `false` to stop the drag sequence.
+ */
+ function handleUpEvent() {
+ this.coordinate_ = null;
+ this.feature_ = null;
+ return false;
+ }
\ No newline at end of file
diff --git a/src/utils/http.js b/src/utils/http.js
index ef384ce..6071b63 100644
--- a/src/utils/http.js
+++ b/src/utils/http.js
@@ -18,7 +18,9 @@ export const URL_MAP = {
USER_LIST: 'user/',
USER_DETAIL: 'user/detail/',
CHANGE_PASSWD: 'current/chpass/',
- RESET_PASSWD: 'passwd/reset/'
+ RESET_PASSWD: 'passwd/reset/',
+ POSITION_LIST: 'position/',
+ POSITION_DETAIL: 'position/detail/'
}