From 0fdd42e318f51f9e3c6581473416af1cca69877f Mon Sep 17 00:00:00 2001
From: chenhuan <czj123456>
Date: 星期四, 16 五月 2024 15:44:13 +0800
Subject: [PATCH] Merge branch 'master' of http://117.78.1.188:8089/r/dkyChenJiang

---
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/ProjectPersonServiceImpl.java |  101 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/DeviceLogMapper.java                |   61 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IDeviceService.java                |   61 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/ProjectDataController.java      |  120 ++
 javaweb-plus/javaweb-admin/src/main/resources/application.yml                                     |    2 
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/ProjectPersonController.java    |  120 ++
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/edit.html                        |   87 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/ProjectPerson.java                  |  164 ++
 javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/DeviceLogMapper.xml                        |  108 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/DeviceMapper.java                   |   61 +
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/add.html                         |   86 +
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/edit.html                   |   54 
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/DeviceController.java           |  119 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/ProjectDataServiceImpl.java   |  102 +
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/add.html                    |   53 
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/deviceLog.html                |  145 ++
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/Device.java                         |  150 ++
 javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/ProjectDataMapper.xml                      |  106 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IDeviceLogService.java             |   61 +
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/device.html                      |  139 ++
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/add.html                  |   57 
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/edit.html                     |   76 +
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/project/navigate.html                   |   43 
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/projectData.html            |  128 ++
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/DeviceLogServiceImpl.java     |   96 +
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/edit.html                 |   58 
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/ProjectData.java                    |  137 ++
 javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/ProjectPersonMapper.xml                    |  114 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/ProjectDataMapper.java              |   61 +
 javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/DeviceMapper.xml                           |   91 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/ProjectPersonMapper.java            |   61 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/DeviceLog.java                      |  190 +++
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/projectPerson.html        |  122 ++
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/DeviceLogController.java        |  118 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IProjectPersonService.java         |   61 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/DeviceServiceImpl.java        |  102 +
 javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/add.html                      |   75 +
 javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IProjectDataService.java           |   61 +
 38 files changed, 3,530 insertions(+), 21 deletions(-)

diff --git a/javaweb-plus/javaweb-admin/src/main/resources/application.yml b/javaweb-plus/javaweb-admin/src/main/resources/application.yml
index 5ff8137..aea707c 100644
--- a/javaweb-plus/javaweb-admin/src/main/resources/application.yml
+++ b/javaweb-plus/javaweb-admin/src/main/resources/application.yml
@@ -9,7 +9,7 @@
   # 瀹炰緥婕旂ず寮�鍏�
   demoEnabled: true
   # 鏂囦欢璺緞 绀轰緥
-  profile: D:\dkyWeb\uploads
+  profile: D:\ChenjiangWeb\uploads
   # 鑾峰彇ip鍦板潃寮�鍏�
   addressEnabled: false
   #铏氭嫙鏂囦欢涓婁紶璺緞
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/DeviceController.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/DeviceController.java
new file mode 100644
index 0000000..aa87dc1
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/DeviceController.java
@@ -0,0 +1,119 @@
+package com.javaweb.geo.controller;
+
+import java.util.List;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.javaweb.common.annotation.Log;
+import com.javaweb.common.enums.BusinessType;
+import com.javaweb.geo.domain.Device;
+import com.javaweb.geo.service.IDeviceService;
+import com.javaweb.common.core.controller.BaseController;
+import com.javaweb.common.core.domain.AjaxResult;
+import com.javaweb.common.utils.poi.ExcelUtil;
+import com.javaweb.common.core.page.TableDataInfo;
+
+/**
+ * 璁惧搴揅ontroller
+ *
+ * @author cxy
+ * @date 2024-05-16
+ */
+@Controller
+@RequestMapping("/geo/device")
+public class DeviceController extends BaseController {
+    private String prefix = "geo/device";
+
+    @Autowired
+    private IDeviceService deviceService;
+
+    @RequiresPermissions("geo:device:view")
+    @GetMapping()
+    public String device(String id, ModelMap mmap) {
+        mmap.put("projectId", id);
+        return prefix + "/device";
+    }
+
+    /**
+     * 鏌ヨ璁惧搴撳垪琛�
+     */
+    @RequiresPermissions("geo:device:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(Device device) {
+        startPage();
+        List<Device> list = deviceService.selectDeviceList(device);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁惧搴撳垪琛�
+     */
+    @RequiresPermissions("geo:device:export")
+    @Log(title = "璁惧搴�", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(Device device) {
+        List<Device> list = deviceService.selectDeviceList(device);
+        ExcelUtil<Device> util = new ExcelUtil<Device>(Device.class);
+        return util.exportExcel(list, "device");
+    }
+
+    /**
+     * 鏂板璁惧搴�
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 鏂板淇濆瓨璁惧搴�
+     */
+    @RequiresPermissions("geo:device:add")
+    @Log(title = "璁惧搴�", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(Device device) {
+        return toAjax(deviceService.insertDevice(device));
+    }
+
+    /**
+     * 淇敼璁惧搴�
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") String id, ModelMap mmap) {
+        Device device = deviceService.selectDeviceById(id);
+        mmap.put("device", device);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 淇敼淇濆瓨璁惧搴�
+     */
+    @RequiresPermissions("geo:device:edit")
+    @Log(title = "璁惧搴�", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(Device device) {
+        return toAjax(deviceService.updateDevice(device));
+    }
+
+    /**
+     * 鍒犻櫎璁惧搴�
+     */
+    @RequiresPermissions("geo:device:remove")
+    @Log(title = "璁惧搴�", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        return toAjax(deviceService.deleteDeviceByIds(ids));
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/DeviceLogController.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/DeviceLogController.java
new file mode 100644
index 0000000..8e1a447
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/DeviceLogController.java
@@ -0,0 +1,118 @@
+package com.javaweb.geo.controller;
+
+import java.util.List;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.javaweb.common.annotation.Log;
+import com.javaweb.common.enums.BusinessType;
+import com.javaweb.geo.domain.DeviceLog;
+import com.javaweb.geo.service.IDeviceLogService;
+import com.javaweb.common.core.controller.BaseController;
+import com.javaweb.common.core.domain.AjaxResult;
+import com.javaweb.common.utils.poi.ExcelUtil;
+import com.javaweb.common.core.page.TableDataInfo;
+
+/**
+ * 璁惧鍑哄叆搴撹褰旵ontroller
+ *
+ * @author cxy
+ * @date 2024-05-16
+ */
+@Controller
+@RequestMapping("/geo/deviceLog")
+public class DeviceLogController extends BaseController {
+    private String prefix = "geo/deviceLog";
+
+    @Autowired
+    private IDeviceLogService deviceLogService;
+
+    @RequiresPermissions("geo:deviceLog:view")
+    @GetMapping()
+    public String deviceLog() {
+        return prefix + "/deviceLog";
+    }
+
+    /**
+     * 鏌ヨ璁惧鍑哄叆搴撹褰曞垪琛�
+     */
+    @RequiresPermissions("geo:deviceLog:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(DeviceLog deviceLog) {
+        startPage();
+        List<DeviceLog> list = deviceLogService.selectDeviceLogList(deviceLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁惧鍑哄叆搴撹褰曞垪琛�
+     */
+    @RequiresPermissions("geo:deviceLog:export")
+    @Log(title = "璁惧鍑哄叆搴撹褰�", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(DeviceLog deviceLog) {
+        List<DeviceLog> list = deviceLogService.selectDeviceLogList(deviceLog);
+        ExcelUtil<DeviceLog> util = new ExcelUtil<DeviceLog>(DeviceLog.class);
+        return util.exportExcel(list, "deviceLog");
+    }
+
+    /**
+     * 鏂板璁惧鍑哄叆搴撹褰�
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 鏂板淇濆瓨璁惧鍑哄叆搴撹褰�
+     */
+    @RequiresPermissions("geo:deviceLog:add")
+    @Log(title = "璁惧鍑哄叆搴撹褰�", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(DeviceLog deviceLog) {
+        return toAjax(deviceLogService.insertDeviceLog(deviceLog));
+    }
+
+    /**
+     * 淇敼璁惧鍑哄叆搴撹褰�
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") String id, ModelMap mmap) {
+        DeviceLog deviceLog = deviceLogService.selectDeviceLogById(id);
+        mmap.put("deviceLog", deviceLog);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 淇敼淇濆瓨璁惧鍑哄叆搴撹褰�
+     */
+    @RequiresPermissions("geo:deviceLog:edit")
+    @Log(title = "璁惧鍑哄叆搴撹褰�", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(DeviceLog deviceLog) {
+        return toAjax(deviceLogService.updateDeviceLog(deviceLog));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鍑哄叆搴撹褰�
+     */
+    @RequiresPermissions("geo:deviceLog:remove")
+    @Log(title = "璁惧鍑哄叆搴撹褰�", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        return toAjax(deviceLogService.deleteDeviceLogByIds(ids));
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/ProjectDataController.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/ProjectDataController.java
new file mode 100644
index 0000000..c7f6597
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/ProjectDataController.java
@@ -0,0 +1,120 @@
+package com.javaweb.geo.controller;
+
+import java.util.List;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.javaweb.common.annotation.Log;
+import com.javaweb.common.enums.BusinessType;
+import com.javaweb.geo.domain.ProjectData;
+import com.javaweb.geo.service.IProjectDataService;
+import com.javaweb.common.core.controller.BaseController;
+import com.javaweb.common.core.domain.AjaxResult;
+import com.javaweb.common.utils.poi.ExcelUtil;
+import com.javaweb.common.core.page.TableDataInfo;
+
+/**
+ * 椤圭洰璧勬枡Controller
+ *
+ * @author cxy
+ * @date 2024-05-16
+ */
+@Controller
+@RequestMapping("/geo/projectData")
+public class ProjectDataController extends BaseController {
+    private String prefix = "geo/projectData";
+
+    @Autowired
+    private IProjectDataService projectDataService;
+
+    @RequiresPermissions("geo:projectData:view")
+    @GetMapping()
+    public String projectData(String id, String type, ModelMap mmap) {
+        mmap.put("projectId", id);
+        mmap.put("type", type);
+        return prefix + "/projectData";
+    }
+
+    /**
+     * 鏌ヨ椤圭洰璧勬枡鍒楄〃
+     */
+    @RequiresPermissions("geo:projectData:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(ProjectData projectData) {
+        startPage();
+        List<ProjectData> list = projectDataService.selectProjectDataList(projectData);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭椤圭洰璧勬枡鍒楄〃
+     */
+    @RequiresPermissions("geo:projectData:export")
+    @Log(title = "椤圭洰璧勬枡", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(ProjectData projectData) {
+        List<ProjectData> list = projectDataService.selectProjectDataList(projectData);
+        ExcelUtil<ProjectData> util = new ExcelUtil<ProjectData>(ProjectData.class);
+        return util.exportExcel(list, "projectData");
+    }
+
+    /**
+     * 鏂板椤圭洰璧勬枡
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 鏂板淇濆瓨椤圭洰璧勬枡
+     */
+    @RequiresPermissions("geo:projectData:add")
+    @Log(title = "椤圭洰璧勬枡", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(ProjectData projectData) {
+        return toAjax(projectDataService.insertProjectData(projectData));
+    }
+
+    /**
+     * 淇敼椤圭洰璧勬枡
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") String id, ModelMap mmap) {
+        ProjectData projectData = projectDataService.selectProjectDataById(id);
+        mmap.put("projectData", projectData);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 淇敼淇濆瓨椤圭洰璧勬枡
+     */
+    @RequiresPermissions("geo:projectData:edit")
+    @Log(title = "椤圭洰璧勬枡", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(ProjectData projectData) {
+        return toAjax(projectDataService.updateProjectData(projectData));
+    }
+
+    /**
+     * 鍒犻櫎椤圭洰璧勬枡
+     */
+    @RequiresPermissions("geo:projectData:remove")
+    @Log(title = "椤圭洰璧勬枡", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        return toAjax(projectDataService.deleteProjectDataByIds(ids));
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/ProjectPersonController.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/ProjectPersonController.java
new file mode 100644
index 0000000..cee23fd
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/controller/ProjectPersonController.java
@@ -0,0 +1,120 @@
+package com.javaweb.geo.controller;
+
+import java.util.List;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.javaweb.common.annotation.Log;
+import com.javaweb.common.enums.BusinessType;
+import com.javaweb.geo.domain.ProjectPerson;
+import com.javaweb.geo.service.IProjectPersonService;
+import com.javaweb.common.core.controller.BaseController;
+import com.javaweb.common.core.domain.AjaxResult;
+import com.javaweb.common.utils.poi.ExcelUtil;
+import com.javaweb.common.core.page.TableDataInfo;
+
+/**
+ * 椤圭洰浜哄憳Controller
+ *
+ * @author cxy
+ * @date 2024-05-16
+ */
+@Controller
+@RequestMapping("/geo/projectPerson")
+public class ProjectPersonController extends BaseController {
+
+    private String prefix = "geo/projectPerson";
+
+    @Autowired
+    private IProjectPersonService projectPersonService;
+
+    @RequiresPermissions("geo:projectPerson:view")
+    @GetMapping()
+    public String projectPerson(String id, ModelMap mmap) {
+        mmap.put("projectId", id);
+        return prefix + "/projectPerson";
+    }
+
+    /**
+     * 鏌ヨ椤圭洰浜哄憳鍒楄〃
+     */
+    @RequiresPermissions("geo:projectPerson:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(ProjectPerson projectPerson) {
+        startPage();
+        List<ProjectPerson> list = projectPersonService.selectProjectPersonList(projectPerson);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭椤圭洰浜哄憳鍒楄〃
+     */
+    @RequiresPermissions("geo:projectPerson:export")
+    @Log(title = "椤圭洰浜哄憳", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(ProjectPerson projectPerson) {
+        List<ProjectPerson> list = projectPersonService.selectProjectPersonList(projectPerson);
+        ExcelUtil<ProjectPerson> util = new ExcelUtil<ProjectPerson>(ProjectPerson.class);
+        return util.exportExcel(list, "projectPerson");
+    }
+
+    /**
+     * 鏂板椤圭洰浜哄憳
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 鏂板淇濆瓨椤圭洰浜哄憳
+     */
+    @RequiresPermissions("geo:projectPerson:add")
+    @Log(title = "椤圭洰浜哄憳", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(ProjectPerson projectPerson) {
+        return toAjax(projectPersonService.insertProjectPerson(projectPerson));
+    }
+
+    /**
+     * 淇敼椤圭洰浜哄憳
+     */
+    @GetMapping("/edit/{ids}")
+    public String edit(@PathVariable("ids") String ids, ModelMap mmap) {
+        ProjectPerson projectPerson = projectPersonService.selectProjectPersonById(ids);
+        mmap.put("projectPerson", projectPerson);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 淇敼淇濆瓨椤圭洰浜哄憳
+     */
+    @RequiresPermissions("geo:projectPerson:edit")
+    @Log(title = "椤圭洰浜哄憳", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(ProjectPerson projectPerson) {
+        return toAjax(projectPersonService.updateProjectPerson(projectPerson));
+    }
+
+    /**
+     * 鍒犻櫎椤圭洰浜哄憳
+     */
+    @RequiresPermissions("geo:projectPerson:remove")
+    @Log(title = "椤圭洰浜哄憳", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        return toAjax(projectPersonService.deleteProjectPersonByIds(ids));
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/Device.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/Device.java
new file mode 100644
index 0000000..a72aa2e
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/Device.java
@@ -0,0 +1,150 @@
+package com.javaweb.geo.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.javaweb.common.annotation.Excel;
+import com.javaweb.common.core.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 璁惧搴撳璞� js_device
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public class Device extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 璁惧缂栧彿 */
+    @Excel(name = "璁惧缂栧彿")
+    private String code;
+
+    /** 鍚嶅瓧 */
+    @Excel(name = "鍚嶅瓧")
+    private String name;
+
+    /** 鍨嬪彿 */
+    @Excel(name = "鍨嬪彿")
+    private String type;
+
+    /** 鐢熶骇鍟� */
+    @Excel(name = "鐢熶骇鍟�")
+    private String manufacturer;
+
+    /** 璐拱鏃ユ湡 */
+    @Excel(name = "璐拱鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date buyDate;
+
+    /** 浠锋牸 */
+    @Excel(name = "浠锋牸")
+    private Double price;
+
+    /** 璁惧鐘舵�� */
+    @Excel(name = "璁惧鐘舵��")
+    private String status;
+
+    /** 瀛樻斁浣嶇疆 */
+    @Excel(name = "瀛樻斁浣嶇疆")
+    private String storageAddress;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+
+    public String getCode() 
+    {
+        return code;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+    public void setManufacturer(String manufacturer) 
+    {
+        this.manufacturer = manufacturer;
+    }
+
+    public String getManufacturer() 
+    {
+        return manufacturer;
+    }
+    public void setBuyDate(Date buyDate) 
+    {
+        this.buyDate = buyDate;
+    }
+
+    public Date getBuyDate() 
+    {
+        return buyDate;
+    }
+    public void setPrice(Double price) 
+    {
+        this.price = price;
+    }
+
+    public Double getPrice() 
+    {
+        return price;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setStorageAddress(String storageAddress) 
+    {
+        this.storageAddress = storageAddress;
+    }
+
+    public String getStorageAddress() 
+    {
+        return storageAddress;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("name", getName())
+            .append("type", getType())
+            .append("manufacturer", getManufacturer())
+            .append("buyDate", getBuyDate())
+            .append("price", getPrice())
+            .append("status", getStatus())
+            .append("storageAddress", getStorageAddress())
+            .toString();
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/DeviceLog.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/DeviceLog.java
new file mode 100644
index 0000000..fa47aca
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/DeviceLog.java
@@ -0,0 +1,190 @@
+package com.javaweb.geo.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.javaweb.common.annotation.Excel;
+import com.javaweb.common.core.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 璁惧鍑哄叆搴撹褰曞璞� js_device_log
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public class DeviceLog extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 鍑哄叆搴撳崟瀛愬彿 */
+    @Excel(name = "鍑哄叆搴撳崟瀛愬彿")
+    private String code;
+
+    /** 椤圭洰id */
+    private String projectId;
+
+    /** 椤圭洰鍚嶇О */
+    @Excel(name = "椤圭洰鍚嶇О")
+    private String projectName;
+
+    /** 璁惧id */
+    private String deviceId;
+
+    /** 璁惧鍚嶇О */
+    @Excel(name = "璁惧鍚嶇О")
+    private String deviceName;
+
+    /** 鍑哄叆搴撶被鍨嬶紙in /out锛� */
+    @Excel(name = "鍑哄叆搴撶被鍨�", readConverterExp = "i=n,/=out")
+    private String type;
+
+    /** 鍑哄叆搴撴椂闂� */
+    @Excel(name = "鍑哄叆搴撴椂闂�")
+    private String transactionDate;
+
+    /** 缁忓姙浜� */
+    @Excel(name = "缁忓姙浜�")
+    private String optUser;
+
+    /** 浣跨敤浜� */
+    @Excel(name = "浣跨敤浜�")
+    private String applyUser;
+
+    /** 鍑哄叆搴撴暟閲� */
+    @Excel(name = "鍑哄叆搴撴暟閲�")
+    private String number;
+
+    /** 鏃堕棿 */
+    private Date createDate;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+
+    public String getCode() 
+    {
+        return code;
+    }
+    public void setProjectId(String projectId) 
+    {
+        this.projectId = projectId;
+    }
+
+    public String getProjectId() 
+    {
+        return projectId;
+    }
+    public void setProjectName(String projectName) 
+    {
+        this.projectName = projectName;
+    }
+
+    public String getProjectName() 
+    {
+        return projectName;
+    }
+    public void setDeviceId(String deviceId) 
+    {
+        this.deviceId = deviceId;
+    }
+
+    public String getDeviceId() 
+    {
+        return deviceId;
+    }
+    public void setDeviceName(String deviceName) 
+    {
+        this.deviceName = deviceName;
+    }
+
+    public String getDeviceName() 
+    {
+        return deviceName;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+    public void setTransactionDate(String transactionDate) 
+    {
+        this.transactionDate = transactionDate;
+    }
+
+    public String getTransactionDate() 
+    {
+        return transactionDate;
+    }
+    public void setOptUser(String optUser) 
+    {
+        this.optUser = optUser;
+    }
+
+    public String getOptUser() 
+    {
+        return optUser;
+    }
+    public void setApplyUser(String applyUser) 
+    {
+        this.applyUser = applyUser;
+    }
+
+    public String getApplyUser() 
+    {
+        return applyUser;
+    }
+    public void setNumber(String number) 
+    {
+        this.number = number;
+    }
+
+    public String getNumber() 
+    {
+        return number;
+    }
+    public void setCreateDate(Date createDate) 
+    {
+        this.createDate = createDate;
+    }
+
+    public Date getCreateDate() 
+    {
+        return createDate;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("projectId", getProjectId())
+            .append("projectName", getProjectName())
+            .append("deviceId", getDeviceId())
+            .append("deviceName", getDeviceName())
+            .append("type", getType())
+            .append("transactionDate", getTransactionDate())
+            .append("optUser", getOptUser())
+            .append("applyUser", getApplyUser())
+            .append("number", getNumber())
+            .append("createDate", getCreateDate())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/ProjectData.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/ProjectData.java
new file mode 100644
index 0000000..399fd5e
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/ProjectData.java
@@ -0,0 +1,137 @@
+package com.javaweb.geo.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.javaweb.common.annotation.Excel;
+import com.javaweb.common.core.domain.BaseEntity;
+
+/**
+ * 椤圭洰璧勬枡瀵硅薄 js_project_data
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public class ProjectData extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 椤圭洰id */
+    private String projectId;
+
+    /** 閽诲瓟id */
+    private String holeId;
+
+    /** 璧勬枡鍚嶇О */
+    @Excel(name = "璧勬枡鍚嶇О")
+    private String name;
+
+    /** 璧勬枡绫诲瀷 */
+    @Excel(name = "璧勬枡绫诲瀷")
+    private String dataType;
+
+    /** 璧勬枡璺緞 */
+    private String dataUrl;
+
+    /** 鏂囦欢绫诲瀷 */
+    @Excel(name = "鏂囦欢绫诲瀷")
+    private String fileType;
+
+    /** 鏍囩 */
+    @Excel(name = "鏍囩")
+    private String labels;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setProjectId(String projectId) 
+    {
+        this.projectId = projectId;
+    }
+
+    public String getProjectId() 
+    {
+        return projectId;
+    }
+    public void setHoleId(String holeId) 
+    {
+        this.holeId = holeId;
+    }
+
+    public String getHoleId() 
+    {
+        return holeId;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setDataType(String dataType) 
+    {
+        this.dataType = dataType;
+    }
+
+    public String getDataType() 
+    {
+        return dataType;
+    }
+    public void setDataUrl(String dataUrl) 
+    {
+        this.dataUrl = dataUrl;
+    }
+
+    public String getDataUrl() 
+    {
+        return dataUrl;
+    }
+    public void setFileType(String fileType) 
+    {
+        this.fileType = fileType;
+    }
+
+    public String getFileType() 
+    {
+        return fileType;
+    }
+    public void setLabels(String labels) 
+    {
+        this.labels = labels;
+    }
+
+    public String getLabels() 
+    {
+        return labels;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("projectId", getProjectId())
+            .append("holeId", getHoleId())
+            .append("name", getName())
+            .append("dataType", getDataType())
+            .append("dataUrl", getDataUrl())
+            .append("fileType", getFileType())
+            .append("labels", getLabels())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/ProjectPerson.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/ProjectPerson.java
new file mode 100644
index 0000000..2d694c7
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/domain/ProjectPerson.java
@@ -0,0 +1,164 @@
+package com.javaweb.geo.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.javaweb.common.annotation.Excel;
+import com.javaweb.common.core.domain.BaseEntity;
+
+/**
+ * 椤圭洰浜哄憳瀵硅薄 js_project_person
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public class ProjectPerson extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private String ids;
+
+    /** 椤圭洰id */
+    private String projectId;
+
+    /** 閽诲瓟id */
+    private String holeId;
+
+    /** 浜哄憳鍚嶇О */
+    @Excel(name = "浜哄憳鍚嶇О")
+    private String name;
+
+    /** 绫诲瀷 */
+    @Excel(name = "绫诲瀷")
+    private String type;
+
+    /** 鎵嬫満鍙� */
+    @Excel(name = "鎵嬫満鍙�")
+    private String phone;
+
+    /** 鍦板潃 */
+    @Excel(name = "鍦板潃")
+    private String address;
+
+    /** 鑱岃矗 */
+    @Excel(name = "鑱岃矗")
+    private String responsibility;
+
+    /** 鐘舵�� */
+    private String status;
+
+    /** 鏄惁鍒犻櫎锛�0 鏈垹闄� 1鍒犻櫎锛� */
+    private String isDeleted;
+
+    public void setIds(String ids) 
+    {
+        this.ids = ids;
+    }
+
+    public String getIds() 
+    {
+        return ids;
+    }
+    public void setProjectId(String projectId) 
+    {
+        this.projectId = projectId;
+    }
+
+    public String getProjectId() 
+    {
+        return projectId;
+    }
+    public void setHoleId(String holeId) 
+    {
+        this.holeId = holeId;
+    }
+
+    public String getHoleId() 
+    {
+        return holeId;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+    public void setPhone(String phone) 
+    {
+        this.phone = phone;
+    }
+
+    public String getPhone() 
+    {
+        return phone;
+    }
+    public void setAddress(String address) 
+    {
+        this.address = address;
+    }
+
+    public String getAddress() 
+    {
+        return address;
+    }
+    public void setResponsibility(String responsibility) 
+    {
+        this.responsibility = responsibility;
+    }
+
+    public String getResponsibility() 
+    {
+        return responsibility;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setIsDeleted(String isDeleted) 
+    {
+        this.isDeleted = isDeleted;
+    }
+
+    public String getIsDeleted() 
+    {
+        return isDeleted;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("ids", getIds())
+            .append("projectId", getProjectId())
+            .append("holeId", getHoleId())
+            .append("name", getName())
+            .append("type", getType())
+            .append("phone", getPhone())
+            .append("address", getAddress())
+            .append("responsibility", getResponsibility())
+            .append("status", getStatus())
+            .append("isDeleted", getIsDeleted())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/DeviceLogMapper.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/DeviceLogMapper.java
new file mode 100644
index 0000000..b8d3475
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/DeviceLogMapper.java
@@ -0,0 +1,61 @@
+package com.javaweb.geo.mapper;
+
+import com.javaweb.geo.domain.DeviceLog;
+import java.util.List;
+
+/**
+ * 璁惧鍑哄叆搴撹褰昅apper鎺ュ彛
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public interface DeviceLogMapper 
+{
+    /**
+     * 鏌ヨ璁惧鍑哄叆搴撹褰�
+     * 
+     * @param id 璁惧鍑哄叆搴撹褰旾D
+     * @return 璁惧鍑哄叆搴撹褰�
+     */
+    public DeviceLog selectDeviceLogById(String id);
+
+    /**
+     * 鏌ヨ璁惧鍑哄叆搴撹褰曞垪琛�
+     * 
+     * @param deviceLog 璁惧鍑哄叆搴撹褰�
+     * @return 璁惧鍑哄叆搴撹褰曢泦鍚�
+     */
+    public List<DeviceLog> selectDeviceLogList(DeviceLog deviceLog);
+
+    /**
+     * 鏂板璁惧鍑哄叆搴撹褰�
+     * 
+     * @param deviceLog 璁惧鍑哄叆搴撹褰�
+     * @return 缁撴灉
+     */
+    public int insertDeviceLog(DeviceLog deviceLog);
+
+    /**
+     * 淇敼璁惧鍑哄叆搴撹褰�
+     * 
+     * @param deviceLog 璁惧鍑哄叆搴撹褰�
+     * @return 缁撴灉
+     */
+    public int updateDeviceLog(DeviceLog deviceLog);
+
+    /**
+     * 鍒犻櫎璁惧鍑哄叆搴撹褰�
+     * 
+     * @param id 璁惧鍑哄叆搴撹褰旾D
+     * @return 缁撴灉
+     */
+    public int deleteDeviceLogById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧鍑哄叆搴撹褰�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteDeviceLogByIds(String[] ids);
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/DeviceMapper.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/DeviceMapper.java
new file mode 100644
index 0000000..af55222
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/DeviceMapper.java
@@ -0,0 +1,61 @@
+package com.javaweb.geo.mapper;
+
+import com.javaweb.geo.domain.Device;
+import java.util.List;
+
+/**
+ * 璁惧搴揗apper鎺ュ彛
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public interface DeviceMapper 
+{
+    /**
+     * 鏌ヨ璁惧搴�
+     * 
+     * @param id 璁惧搴揑D
+     * @return 璁惧搴�
+     */
+    public Device selectDeviceById(String id);
+
+    /**
+     * 鏌ヨ璁惧搴撳垪琛�
+     * 
+     * @param device 璁惧搴�
+     * @return 璁惧搴撻泦鍚�
+     */
+    public List<Device> selectDeviceList(Device device);
+
+    /**
+     * 鏂板璁惧搴�
+     * 
+     * @param device 璁惧搴�
+     * @return 缁撴灉
+     */
+    public int insertDevice(Device device);
+
+    /**
+     * 淇敼璁惧搴�
+     * 
+     * @param device 璁惧搴�
+     * @return 缁撴灉
+     */
+    public int updateDevice(Device device);
+
+    /**
+     * 鍒犻櫎璁惧搴�
+     * 
+     * @param id 璁惧搴揑D
+     * @return 缁撴灉
+     */
+    public int deleteDeviceById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧搴�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteDeviceByIds(String[] ids);
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/ProjectDataMapper.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/ProjectDataMapper.java
new file mode 100644
index 0000000..01923a0
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/ProjectDataMapper.java
@@ -0,0 +1,61 @@
+package com.javaweb.geo.mapper;
+
+import com.javaweb.geo.domain.ProjectData;
+import java.util.List;
+
+/**
+ * 椤圭洰璧勬枡Mapper鎺ュ彛
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public interface ProjectDataMapper 
+{
+    /**
+     * 鏌ヨ椤圭洰璧勬枡
+     * 
+     * @param id 椤圭洰璧勬枡ID
+     * @return 椤圭洰璧勬枡
+     */
+    public ProjectData selectProjectDataById(String id);
+
+    /**
+     * 鏌ヨ椤圭洰璧勬枡鍒楄〃
+     * 
+     * @param projectData 椤圭洰璧勬枡
+     * @return 椤圭洰璧勬枡闆嗗悎
+     */
+    public List<ProjectData> selectProjectDataList(ProjectData projectData);
+
+    /**
+     * 鏂板椤圭洰璧勬枡
+     * 
+     * @param projectData 椤圭洰璧勬枡
+     * @return 缁撴灉
+     */
+    public int insertProjectData(ProjectData projectData);
+
+    /**
+     * 淇敼椤圭洰璧勬枡
+     * 
+     * @param projectData 椤圭洰璧勬枡
+     * @return 缁撴灉
+     */
+    public int updateProjectData(ProjectData projectData);
+
+    /**
+     * 鍒犻櫎椤圭洰璧勬枡
+     * 
+     * @param id 椤圭洰璧勬枡ID
+     * @return 缁撴灉
+     */
+    public int deleteProjectDataById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎椤圭洰璧勬枡
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteProjectDataByIds(String[] ids);
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/ProjectPersonMapper.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/ProjectPersonMapper.java
new file mode 100644
index 0000000..59496d0
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/mapper/ProjectPersonMapper.java
@@ -0,0 +1,61 @@
+package com.javaweb.geo.mapper;
+
+import com.javaweb.geo.domain.ProjectPerson;
+import java.util.List;
+
+/**
+ * 椤圭洰浜哄憳Mapper鎺ュ彛
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public interface ProjectPersonMapper 
+{
+    /**
+     * 鏌ヨ椤圭洰浜哄憳
+     * 
+     * @param ids 椤圭洰浜哄憳ID
+     * @return 椤圭洰浜哄憳
+     */
+    public ProjectPerson selectProjectPersonById(String ids);
+
+    /**
+     * 鏌ヨ椤圭洰浜哄憳鍒楄〃
+     * 
+     * @param projectPerson 椤圭洰浜哄憳
+     * @return 椤圭洰浜哄憳闆嗗悎
+     */
+    public List<ProjectPerson> selectProjectPersonList(ProjectPerson projectPerson);
+
+    /**
+     * 鏂板椤圭洰浜哄憳
+     * 
+     * @param projectPerson 椤圭洰浜哄憳
+     * @return 缁撴灉
+     */
+    public int insertProjectPerson(ProjectPerson projectPerson);
+
+    /**
+     * 淇敼椤圭洰浜哄憳
+     * 
+     * @param projectPerson 椤圭洰浜哄憳
+     * @return 缁撴灉
+     */
+    public int updateProjectPerson(ProjectPerson projectPerson);
+
+    /**
+     * 鍒犻櫎椤圭洰浜哄憳
+     * 
+     * @param ids 椤圭洰浜哄憳ID
+     * @return 缁撴灉
+     */
+    public int deleteProjectPersonById(String ids);
+
+    /**
+     * 鎵归噺鍒犻櫎椤圭洰浜哄憳
+     * 
+     * @param idss 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteProjectPersonByIds(String[] idss);
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IDeviceLogService.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IDeviceLogService.java
new file mode 100644
index 0000000..1d28b72
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IDeviceLogService.java
@@ -0,0 +1,61 @@
+package com.javaweb.geo.service;
+
+import com.javaweb.geo.domain.DeviceLog;
+import java.util.List;
+
+/**
+ * 璁惧鍑哄叆搴撹褰昐ervice鎺ュ彛
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public interface IDeviceLogService 
+{
+    /**
+     * 鏌ヨ璁惧鍑哄叆搴撹褰�
+     * 
+     * @param id 璁惧鍑哄叆搴撹褰旾D
+     * @return 璁惧鍑哄叆搴撹褰�
+     */
+    public DeviceLog selectDeviceLogById(String id);
+
+    /**
+     * 鏌ヨ璁惧鍑哄叆搴撹褰曞垪琛�
+     * 
+     * @param deviceLog 璁惧鍑哄叆搴撹褰�
+     * @return 璁惧鍑哄叆搴撹褰曢泦鍚�
+     */
+    public List<DeviceLog> selectDeviceLogList(DeviceLog deviceLog);
+
+    /**
+     * 鏂板璁惧鍑哄叆搴撹褰�
+     * 
+     * @param deviceLog 璁惧鍑哄叆搴撹褰�
+     * @return 缁撴灉
+     */
+    public int insertDeviceLog(DeviceLog deviceLog);
+
+    /**
+     * 淇敼璁惧鍑哄叆搴撹褰�
+     * 
+     * @param deviceLog 璁惧鍑哄叆搴撹褰�
+     * @return 缁撴灉
+     */
+    public int updateDeviceLog(DeviceLog deviceLog);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧鍑哄叆搴撹褰�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteDeviceLogByIds(String ids);
+
+    /**
+     * 鍒犻櫎璁惧鍑哄叆搴撹褰曚俊鎭�
+     * 
+     * @param id 璁惧鍑哄叆搴撹褰旾D
+     * @return 缁撴灉
+     */
+    public int deleteDeviceLogById(String id);
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IDeviceService.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IDeviceService.java
new file mode 100644
index 0000000..b38bee2
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IDeviceService.java
@@ -0,0 +1,61 @@
+package com.javaweb.geo.service;
+
+import com.javaweb.geo.domain.Device;
+import java.util.List;
+
+/**
+ * 璁惧搴揝ervice鎺ュ彛
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public interface IDeviceService 
+{
+    /**
+     * 鏌ヨ璁惧搴�
+     * 
+     * @param id 璁惧搴揑D
+     * @return 璁惧搴�
+     */
+    public Device selectDeviceById(String id);
+
+    /**
+     * 鏌ヨ璁惧搴撳垪琛�
+     * 
+     * @param device 璁惧搴�
+     * @return 璁惧搴撻泦鍚�
+     */
+    public List<Device> selectDeviceList(Device device);
+
+    /**
+     * 鏂板璁惧搴�
+     * 
+     * @param device 璁惧搴�
+     * @return 缁撴灉
+     */
+    public int insertDevice(Device device);
+
+    /**
+     * 淇敼璁惧搴�
+     * 
+     * @param device 璁惧搴�
+     * @return 缁撴灉
+     */
+    public int updateDevice(Device device);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧搴�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteDeviceByIds(String ids);
+
+    /**
+     * 鍒犻櫎璁惧搴撲俊鎭�
+     * 
+     * @param id 璁惧搴揑D
+     * @return 缁撴灉
+     */
+    public int deleteDeviceById(String id);
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IProjectDataService.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IProjectDataService.java
new file mode 100644
index 0000000..47afa98
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IProjectDataService.java
@@ -0,0 +1,61 @@
+package com.javaweb.geo.service;
+
+import com.javaweb.geo.domain.ProjectData;
+import java.util.List;
+
+/**
+ * 椤圭洰璧勬枡Service鎺ュ彛
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public interface IProjectDataService 
+{
+    /**
+     * 鏌ヨ椤圭洰璧勬枡
+     * 
+     * @param id 椤圭洰璧勬枡ID
+     * @return 椤圭洰璧勬枡
+     */
+    public ProjectData selectProjectDataById(String id);
+
+    /**
+     * 鏌ヨ椤圭洰璧勬枡鍒楄〃
+     * 
+     * @param projectData 椤圭洰璧勬枡
+     * @return 椤圭洰璧勬枡闆嗗悎
+     */
+    public List<ProjectData> selectProjectDataList(ProjectData projectData);
+
+    /**
+     * 鏂板椤圭洰璧勬枡
+     * 
+     * @param projectData 椤圭洰璧勬枡
+     * @return 缁撴灉
+     */
+    public int insertProjectData(ProjectData projectData);
+
+    /**
+     * 淇敼椤圭洰璧勬枡
+     * 
+     * @param projectData 椤圭洰璧勬枡
+     * @return 缁撴灉
+     */
+    public int updateProjectData(ProjectData projectData);
+
+    /**
+     * 鎵归噺鍒犻櫎椤圭洰璧勬枡
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteProjectDataByIds(String ids);
+
+    /**
+     * 鍒犻櫎椤圭洰璧勬枡淇℃伅
+     * 
+     * @param id 椤圭洰璧勬枡ID
+     * @return 缁撴灉
+     */
+    public int deleteProjectDataById(String id);
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IProjectPersonService.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IProjectPersonService.java
new file mode 100644
index 0000000..f635523
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/IProjectPersonService.java
@@ -0,0 +1,61 @@
+package com.javaweb.geo.service;
+
+import com.javaweb.geo.domain.ProjectPerson;
+import java.util.List;
+
+/**
+ * 椤圭洰浜哄憳Service鎺ュ彛
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+public interface IProjectPersonService 
+{
+    /**
+     * 鏌ヨ椤圭洰浜哄憳
+     * 
+     * @param ids 椤圭洰浜哄憳ID
+     * @return 椤圭洰浜哄憳
+     */
+    public ProjectPerson selectProjectPersonById(String ids);
+
+    /**
+     * 鏌ヨ椤圭洰浜哄憳鍒楄〃
+     * 
+     * @param projectPerson 椤圭洰浜哄憳
+     * @return 椤圭洰浜哄憳闆嗗悎
+     */
+    public List<ProjectPerson> selectProjectPersonList(ProjectPerson projectPerson);
+
+    /**
+     * 鏂板椤圭洰浜哄憳
+     * 
+     * @param projectPerson 椤圭洰浜哄憳
+     * @return 缁撴灉
+     */
+    public int insertProjectPerson(ProjectPerson projectPerson);
+
+    /**
+     * 淇敼椤圭洰浜哄憳
+     * 
+     * @param projectPerson 椤圭洰浜哄憳
+     * @return 缁撴灉
+     */
+    public int updateProjectPerson(ProjectPerson projectPerson);
+
+    /**
+     * 鎵归噺鍒犻櫎椤圭洰浜哄憳
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteProjectPersonByIds(String ids);
+
+    /**
+     * 鍒犻櫎椤圭洰浜哄憳淇℃伅
+     * 
+     * @param ids 椤圭洰浜哄憳ID
+     * @return 缁撴灉
+     */
+    public int deleteProjectPersonById(String ids);
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/DeviceLogServiceImpl.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/DeviceLogServiceImpl.java
new file mode 100644
index 0000000..ee49ede
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/DeviceLogServiceImpl.java
@@ -0,0 +1,96 @@
+package com.javaweb.geo.service.impl;
+
+import java.util.List;
+
+import com.javaweb.common.utils.DateUtils;
+import com.javaweb.common.utils.IdGenerate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.javaweb.geo.mapper.DeviceLogMapper;
+import com.javaweb.geo.domain.DeviceLog;
+import com.javaweb.geo.service.IDeviceLogService;
+import com.javaweb.common.core.text.Convert;
+import org.springframework.util.ObjectUtils;
+import tk.mybatis.mapper.genid.GenIdUtil;
+
+/**
+ * 璁惧鍑哄叆搴撹褰昐ervice涓氬姟灞傚鐞�
+ *
+ * @author cxy
+ * @date 2024-05-16
+ */
+@Service
+public class DeviceLogServiceImpl implements IDeviceLogService {
+    @Autowired
+    private DeviceLogMapper deviceLogMapper;
+
+    /**
+     * 鏌ヨ璁惧鍑哄叆搴撹褰�
+     *
+     * @param id 璁惧鍑哄叆搴撹褰旾D
+     * @return 璁惧鍑哄叆搴撹褰�
+     */
+    @Override
+    public DeviceLog selectDeviceLogById(String id) {
+        return deviceLogMapper.selectDeviceLogById(id);
+    }
+
+    /**
+     * 鏌ヨ璁惧鍑哄叆搴撹褰曞垪琛�
+     *
+     * @param deviceLog 璁惧鍑哄叆搴撹褰�
+     * @return 璁惧鍑哄叆搴撹褰�
+     */
+    @Override
+    public List<DeviceLog> selectDeviceLogList(DeviceLog deviceLog) {
+        return deviceLogMapper.selectDeviceLogList(deviceLog);
+    }
+
+    /**
+     * 鏂板璁惧鍑哄叆搴撹褰�
+     *
+     * @param deviceLog 璁惧鍑哄叆搴撹褰�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertDeviceLog(DeviceLog deviceLog) {
+        if(ObjectUtils.isEmpty(deviceLog.getId())){
+            deviceLog.setId(IdGenerate.nextId());
+        }
+        deviceLog.setCreateTime(DateUtils.getNowDate());
+        return deviceLogMapper.insertDeviceLog(deviceLog);
+    }
+
+    /**
+     * 淇敼璁惧鍑哄叆搴撹褰�
+     *
+     * @param deviceLog 璁惧鍑哄叆搴撹褰�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateDeviceLog(DeviceLog deviceLog) {
+        return deviceLogMapper.updateDeviceLog(deviceLog);
+    }
+
+    /**
+     * 鍒犻櫎璁惧鍑哄叆搴撹褰曞璞�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDeviceLogByIds(String ids) {
+        return deviceLogMapper.deleteDeviceLogByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鍑哄叆搴撹褰曚俊鎭�
+     *
+     * @param id 璁惧鍑哄叆搴撹褰旾D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDeviceLogById(String id) {
+        return deviceLogMapper.deleteDeviceLogById(id);
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/DeviceServiceImpl.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/DeviceServiceImpl.java
new file mode 100644
index 0000000..1ea9309
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/DeviceServiceImpl.java
@@ -0,0 +1,102 @@
+package com.javaweb.geo.service.impl;
+
+import java.util.List;
+
+import com.javaweb.common.utils.DateUtils;
+import com.javaweb.common.utils.IdGenerate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.javaweb.geo.mapper.DeviceMapper;
+import com.javaweb.geo.domain.Device;
+import com.javaweb.geo.service.IDeviceService;
+import com.javaweb.common.core.text.Convert;
+import org.springframework.util.ObjectUtils;
+
+/**
+ * 璁惧搴揝ervice涓氬姟灞傚鐞�
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+@Service
+public class DeviceServiceImpl implements IDeviceService 
+{
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    /**
+     * 鏌ヨ璁惧搴�
+     * 
+     * @param id 璁惧搴揑D
+     * @return 璁惧搴�
+     */
+    @Override
+    public Device selectDeviceById(String id)
+    {
+        return deviceMapper.selectDeviceById(id);
+    }
+
+    /**
+     * 鏌ヨ璁惧搴撳垪琛�
+     * 
+     * @param device 璁惧搴�
+     * @return 璁惧搴�
+     */
+    @Override
+    public List<Device> selectDeviceList(Device device)
+    {
+        return deviceMapper.selectDeviceList(device);
+    }
+
+    /**
+     * 鏂板璁惧搴�
+     * 
+     * @param device 璁惧搴�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertDevice(Device device)
+    {
+        if(ObjectUtils.isEmpty(device.getId())){
+            device.setId(IdGenerate.nextId());
+        }
+        device.setCreateTime(DateUtils.getNowDate());
+        return deviceMapper.insertDevice(device);
+    }
+
+    /**
+     * 淇敼璁惧搴�
+     * 
+     * @param device 璁惧搴�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateDevice(Device device)
+    {
+        return deviceMapper.updateDevice(device);
+    }
+
+    /**
+     * 鍒犻櫎璁惧搴撳璞�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDeviceByIds(String ids)
+    {
+        return deviceMapper.deleteDeviceByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎璁惧搴撲俊鎭�
+     * 
+     * @param id 璁惧搴揑D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDeviceById(String id)
+    {
+        return deviceMapper.deleteDeviceById(id);
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/ProjectDataServiceImpl.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/ProjectDataServiceImpl.java
new file mode 100644
index 0000000..732af07
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/ProjectDataServiceImpl.java
@@ -0,0 +1,102 @@
+package com.javaweb.geo.service.impl;
+
+import java.util.List;
+import com.javaweb.common.utils.DateUtils;
+import com.javaweb.common.utils.IdGenerate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.javaweb.geo.mapper.ProjectDataMapper;
+import com.javaweb.geo.domain.ProjectData;
+import com.javaweb.geo.service.IProjectDataService;
+import com.javaweb.common.core.text.Convert;
+import org.springframework.util.ObjectUtils;
+
+/**
+ * 椤圭洰璧勬枡Service涓氬姟灞傚鐞�
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+@Service
+public class ProjectDataServiceImpl implements IProjectDataService 
+{
+    @Autowired
+    private ProjectDataMapper projectDataMapper;
+
+    /**
+     * 鏌ヨ椤圭洰璧勬枡
+     * 
+     * @param id 椤圭洰璧勬枡ID
+     * @return 椤圭洰璧勬枡
+     */
+    @Override
+    public ProjectData selectProjectDataById(String id)
+    {
+        return projectDataMapper.selectProjectDataById(id);
+    }
+
+    /**
+     * 鏌ヨ椤圭洰璧勬枡鍒楄〃
+     * 
+     * @param projectData 椤圭洰璧勬枡
+     * @return 椤圭洰璧勬枡
+     */
+    @Override
+    public List<ProjectData> selectProjectDataList(ProjectData projectData)
+    {
+        return projectDataMapper.selectProjectDataList(projectData);
+    }
+
+    /**
+     * 鏂板椤圭洰璧勬枡
+     * 
+     * @param projectData 椤圭洰璧勬枡
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertProjectData(ProjectData projectData)
+    {
+        if(ObjectUtils.isEmpty(projectData.getId())){
+            projectData.setId(IdGenerate.nextId());
+        }
+        projectData.setCreateTime(DateUtils.getNowDate());
+        return projectDataMapper.insertProjectData(projectData);
+    }
+
+    /**
+     * 淇敼椤圭洰璧勬枡
+     * 
+     * @param projectData 椤圭洰璧勬枡
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateProjectData(ProjectData projectData)
+    {
+        projectData.setUpdateTime(DateUtils.getNowDate());
+        return projectDataMapper.updateProjectData(projectData);
+    }
+
+    /**
+     * 鍒犻櫎椤圭洰璧勬枡瀵硅薄
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteProjectDataByIds(String ids)
+    {
+        return projectDataMapper.deleteProjectDataByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎椤圭洰璧勬枡淇℃伅
+     * 
+     * @param id 椤圭洰璧勬枡ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteProjectDataById(String id)
+    {
+        return projectDataMapper.deleteProjectDataById(id);
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/ProjectPersonServiceImpl.java b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/ProjectPersonServiceImpl.java
new file mode 100644
index 0000000..2736c43
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/java/com/javaweb/geo/service/impl/ProjectPersonServiceImpl.java
@@ -0,0 +1,101 @@
+package com.javaweb.geo.service.impl;
+
+import java.util.List;
+import com.javaweb.common.utils.DateUtils;
+import com.javaweb.common.utils.IdGenerate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.javaweb.geo.mapper.ProjectPersonMapper;
+import com.javaweb.geo.domain.ProjectPerson;
+import com.javaweb.geo.service.IProjectPersonService;
+import com.javaweb.common.core.text.Convert;
+import org.springframework.util.ObjectUtils;
+
+/**
+ * 椤圭洰浜哄憳Service涓氬姟灞傚鐞�
+ * 
+ * @author cxy
+ * @date 2024-05-16
+ */
+@Service
+public class ProjectPersonServiceImpl implements IProjectPersonService 
+{
+    @Autowired
+    private ProjectPersonMapper projectPersonMapper;
+
+    /**
+     * 鏌ヨ椤圭洰浜哄憳
+     * 
+     * @param ids 椤圭洰浜哄憳ID
+     * @return 椤圭洰浜哄憳
+     */
+    @Override
+    public ProjectPerson selectProjectPersonById(String ids)
+    {
+        return projectPersonMapper.selectProjectPersonById(ids);
+    }
+
+    /**
+     * 鏌ヨ椤圭洰浜哄憳鍒楄〃
+     * 
+     * @param projectPerson 椤圭洰浜哄憳
+     * @return 椤圭洰浜哄憳
+     */
+    @Override
+    public List<ProjectPerson> selectProjectPersonList(ProjectPerson projectPerson)
+    {
+        return projectPersonMapper.selectProjectPersonList(projectPerson);
+    }
+
+    /**
+     * 鏂板椤圭洰浜哄憳
+     * 
+     * @param projectPerson 椤圭洰浜哄憳fg
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertProjectPerson(ProjectPerson projectPerson) {
+        if(ObjectUtils.isEmpty(projectPerson.getIds())){
+            projectPerson.setIds(IdGenerate.nextId());
+        }
+        projectPerson.setCreateTime(DateUtils.getNowDate());
+        return projectPersonMapper.insertProjectPerson(projectPerson);
+    }
+
+    /**
+     * 淇敼椤圭洰浜哄憳
+     * 
+     * @param projectPerson 椤圭洰浜哄憳
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateProjectPerson(ProjectPerson projectPerson)
+    {
+        projectPerson.setUpdateTime(DateUtils.getNowDate());
+        return projectPersonMapper.updateProjectPerson(projectPerson);
+    }
+
+    /**
+     * 鍒犻櫎椤圭洰浜哄憳瀵硅薄
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteProjectPersonByIds(String ids)
+    {
+        return projectPersonMapper.deleteProjectPersonByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎椤圭洰浜哄憳淇℃伅
+     * 
+     * @param ids 椤圭洰浜哄憳ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteProjectPersonById(String ids)
+    {
+        return projectPersonMapper.deleteProjectPersonById(ids);
+    }
+}
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/DeviceLogMapper.xml b/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/DeviceLogMapper.xml
new file mode 100644
index 0000000..16ec34c
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/DeviceLogMapper.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.javaweb.geo.mapper.DeviceLogMapper">
+    
+    <resultMap type="DeviceLog" id="DeviceLogResult">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="projectId"    column="project_id"    />
+        <result property="projectName"    column="project_name"    />
+        <result property="deviceId"    column="device_id"    />
+        <result property="deviceName"    column="device_name"    />
+        <result property="type"    column="type"    />
+        <result property="transactionDate"    column="transaction_date"    />
+        <result property="optUser"    column="opt_user"    />
+        <result property="applyUser"    column="apply_user"    />
+        <result property="number"    column="number"    />
+        <result property="createDate"    column="create_date"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectDeviceLogVo">
+        select id, code, project_id, project_name, device_id, device_name, type, transaction_date, opt_user, apply_user, number, create_date, remark from js_device_log
+    </sql>
+
+    <select id="selectDeviceLogList" parameterType="DeviceLog" resultMap="DeviceLogResult">
+        <include refid="selectDeviceLogVo"/>
+        <where>  
+            <if test="code != null  and code != ''"> and code = #{code}</if>
+            <if test="projectName != null  and projectName != ''"> and project_name like concat('%', #{projectName}, '%')</if>
+            <if test="deviceName != null  and deviceName != ''"> and device_name like concat('%', #{deviceName}, '%')</if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+            <if test="optUser != null  and optUser != ''"> and opt_user = #{optUser}</if>
+            <if test="applyUser != null  and applyUser != ''"> and apply_user = #{applyUser}</if>
+        </where>
+    </select>
+    
+    <select id="selectDeviceLogById" parameterType="String" resultMap="DeviceLogResult">
+        <include refid="selectDeviceLogVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertDeviceLog" parameterType="DeviceLog">
+        insert into js_device_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="projectId != null  and projectId != ''">project_id,</if>
+            <if test="projectName != null  and projectName != ''">project_name,</if>
+            <if test="deviceId != null  and deviceId != ''">device_id,</if>
+            <if test="deviceName != null  and deviceName != ''">device_name,</if>
+            <if test="type != null  and type != ''">type,</if>
+            <if test="transactionDate != null  and transactionDate != ''">transaction_date,</if>
+            <if test="optUser != null  and optUser != ''">opt_user,</if>
+            <if test="applyUser != null  and applyUser != ''">apply_user,</if>
+            <if test="number != null  and number != ''">number,</if>
+            <if test="createDate != null ">create_date,</if>
+            <if test="remark != null  and remark != ''">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="projectId != null  and projectId != ''">#{projectId},</if>
+            <if test="projectName != null  and projectName != ''">#{projectName},</if>
+            <if test="deviceId != null  and deviceId != ''">#{deviceId},</if>
+            <if test="deviceName != null  and deviceName != ''">#{deviceName},</if>
+            <if test="type != null  and type != ''">#{type},</if>
+            <if test="transactionDate != null  and transactionDate != ''">#{transactionDate},</if>
+            <if test="optUser != null  and optUser != ''">#{optUser},</if>
+            <if test="applyUser != null  and applyUser != ''">#{applyUser},</if>
+            <if test="number != null  and number != ''">#{number},</if>
+            <if test="createDate != null ">#{createDate},</if>
+            <if test="remark != null  and remark != ''">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateDeviceLog" parameterType="DeviceLog">
+        update js_device_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="projectId != null  and projectId != ''">project_id = #{projectId},</if>
+            <if test="projectName != null  and projectName != ''">project_name = #{projectName},</if>
+            <if test="deviceId != null  and deviceId != ''">device_id = #{deviceId},</if>
+            <if test="deviceName != null  and deviceName != ''">device_name = #{deviceName},</if>
+            <if test="type != null  and type != ''">type = #{type},</if>
+            <if test="transactionDate != null  and transactionDate != ''">transaction_date = #{transactionDate},</if>
+            <if test="optUser != null  and optUser != ''">opt_user = #{optUser},</if>
+            <if test="applyUser != null  and applyUser != ''">apply_user = #{applyUser},</if>
+            <if test="number != null  and number != ''">number = #{number},</if>
+            <if test="createDate != null ">create_date = #{createDate},</if>
+            <if test="remark != null  and remark != ''">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteDeviceLogById" parameterType="String">
+        delete from js_device_log where id = #{id}
+    </delete>
+
+    <delete id="deleteDeviceLogByIds" parameterType="String">
+        delete from js_device_log where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/DeviceMapper.xml b/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/DeviceMapper.xml
new file mode 100644
index 0000000..1311038
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/DeviceMapper.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.javaweb.geo.mapper.DeviceMapper">
+    
+    <resultMap type="Device" id="DeviceResult">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="name"    column="name"    />
+        <result property="type"    column="type"    />
+        <result property="manufacturer"    column="manufacturer"    />
+        <result property="buyDate"    column="buy_date"    />
+        <result property="price"    column="price"    />
+        <result property="status"    column="status"    />
+        <result property="storageAddress"    column="storage_address"    />
+    </resultMap>
+
+    <sql id="selectDeviceVo">
+        select id, code, name, type, manufacturer, buy_date, price, status, storage_address from js_device
+    </sql>
+
+    <select id="selectDeviceList" parameterType="Device" resultMap="DeviceResult">
+        <include refid="selectDeviceVo"/>
+        <where>  
+            <if test="code != null  and code != ''"> and code like concat('%', #{code}, '%')</if>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="type != null  and type != ''"> and type like concat('%', #{type}, '%')</if>
+            <if test="buyDate != null "> and buy_date = #{buyDate}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectDeviceById" parameterType="String" resultMap="DeviceResult">
+        <include refid="selectDeviceVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertDevice" parameterType="Device">
+        insert into js_device
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="type != null  and type != ''">type,</if>
+            <if test="manufacturer != null  and manufacturer != ''">manufacturer,</if>
+            <if test="buyDate != null ">buy_date,</if>
+            <if test="price != null ">price,</if>
+            <if test="status != null  and status != ''">status,</if>
+            <if test="storageAddress != null  and storageAddress != ''">storage_address,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="type != null  and type != ''">#{type},</if>
+            <if test="manufacturer != null  and manufacturer != ''">#{manufacturer},</if>
+            <if test="buyDate != null ">#{buyDate},</if>
+            <if test="price != null ">#{price},</if>
+            <if test="status != null  and status != ''">#{status},</if>
+            <if test="storageAddress != null  and storageAddress != ''">#{storageAddress},</if>
+         </trim>
+    </insert>
+
+    <update id="updateDevice" parameterType="Device">
+        update js_device
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="type != null  and type != ''">type = #{type},</if>
+            <if test="manufacturer != null  and manufacturer != ''">manufacturer = #{manufacturer},</if>
+            <if test="buyDate != null ">buy_date = #{buyDate},</if>
+            <if test="price != null ">price = #{price},</if>
+            <if test="status != null  and status != ''">status = #{status},</if>
+            <if test="storageAddress != null  and storageAddress != ''">storage_address = #{storageAddress},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteDeviceById" parameterType="String">
+        delete from js_device where id = #{id}
+    </delete>
+
+    <delete id="deleteDeviceByIds" parameterType="String">
+        delete from js_device where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/ProjectDataMapper.xml b/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/ProjectDataMapper.xml
new file mode 100644
index 0000000..070168f
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/ProjectDataMapper.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.javaweb.geo.mapper.ProjectDataMapper">
+    
+    <resultMap type="ProjectData" id="ProjectDataResult">
+        <result property="id"    column="id"    />
+        <result property="projectId"    column="project_id"    />
+        <result property="holeId"    column="hole_id"    />
+        <result property="name"    column="name"    />
+        <result property="dataType"    column="data_type"    />
+        <result property="dataUrl"    column="data_url"    />
+        <result property="fileType"    column="file_type"    />
+        <result property="labels"    column="labels"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectProjectDataVo">
+        select id, project_id, hole_id, name, data_type, data_url, file_type, labels, create_by, create_time, update_by, update_time, remark from js_project_data
+    </sql>
+
+    <select id="selectProjectDataList" parameterType="ProjectData" resultMap="ProjectDataResult">
+        <include refid="selectProjectDataVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="dataType != null  and dataType != ''"> and data_type = #{dataType}</if>
+            <if test="fileType != null  and fileType != ''"> and file_type = #{fileType}</if>
+            <if test="labels != null  and labels != ''"> and labels = #{labels}</if>
+        </where>
+    </select>
+    
+    <select id="selectProjectDataById" parameterType="String" resultMap="ProjectDataResult">
+        <include refid="selectProjectDataVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertProjectData" parameterType="ProjectData">
+        insert into js_project_data
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="projectId != null  and projectId != ''">project_id,</if>
+            <if test="holeId != null  and holeId != ''">hole_id,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="dataType != null  and dataType != ''">data_type,</if>
+            <if test="dataUrl != null  and dataUrl != ''">data_url,</if>
+            <if test="fileType != null  and fileType != ''">file_type,</if>
+            <if test="labels != null  and labels != ''">labels,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="remark != null  and remark != ''">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="projectId != null  and projectId != ''">#{projectId},</if>
+            <if test="holeId != null  and holeId != ''">#{holeId},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="dataType != null  and dataType != ''">#{dataType},</if>
+            <if test="dataUrl != null  and dataUrl != ''">#{dataUrl},</if>
+            <if test="fileType != null  and fileType != ''">#{fileType},</if>
+            <if test="labels != null  and labels != ''">#{labels},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="remark != null  and remark != ''">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateProjectData" parameterType="ProjectData">
+        update js_project_data
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="projectId != null  and projectId != ''">project_id = #{projectId},</if>
+            <if test="holeId != null  and holeId != ''">hole_id = #{holeId},</if>
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="dataType != null  and dataType != ''">data_type = #{dataType},</if>
+            <if test="dataUrl != null  and dataUrl != ''">data_url = #{dataUrl},</if>
+            <if test="fileType != null  and fileType != ''">file_type = #{fileType},</if>
+            <if test="labels != null  and labels != ''">labels = #{labels},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="remark != null  and remark != ''">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteProjectDataById" parameterType="String">
+        delete from js_project_data where id = #{id}
+    </delete>
+
+    <delete id="deleteProjectDataByIds" parameterType="String">
+        delete from js_project_data where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/ProjectPersonMapper.xml b/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/ProjectPersonMapper.xml
new file mode 100644
index 0000000..3044abd
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/mapper/geo/ProjectPersonMapper.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.javaweb.geo.mapper.ProjectPersonMapper">
+    
+    <resultMap type="ProjectPerson" id="ProjectPersonResult">
+        <result property="ids"    column="ids"    />
+        <result property="projectId"    column="project_id"    />
+        <result property="holeId"    column="hole_id"    />
+        <result property="name"    column="name"    />
+        <result property="type"    column="type"    />
+        <result property="phone"    column="phone"    />
+        <result property="address"    column="address"    />
+        <result property="responsibility"    column="responsibility"    />
+        <result property="status"    column="status"    />
+        <result property="isDeleted"    column="is_deleted"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectProjectPersonVo">
+        select ids, project_id, hole_id, name, type, phone, address, responsibility, status, is_deleted, create_by, create_time, update_by, update_time, remark from js_project_person
+    </sql>
+
+    <select id="selectProjectPersonList" parameterType="ProjectPerson" resultMap="ProjectPersonResult">
+        <include refid="selectProjectPersonVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+            <if test="phone != null  and phone != ''"> and phone = #{phone}</if>
+            <if test="remark != null  and remark != ''"> and remark = #{remark}</if>
+        </where>
+    </select>
+    
+    <select id="selectProjectPersonById" parameterType="String" resultMap="ProjectPersonResult">
+        <include refid="selectProjectPersonVo"/>
+        where ids = #{ids}
+    </select>
+        
+    <insert id="insertProjectPerson" parameterType="ProjectPerson">
+        insert into js_project_person
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="ids != null  and ids != ''">ids,</if>
+            <if test="projectId != null  and projectId != ''">project_id,</if>
+            <if test="holeId != null  and holeId != ''">hole_id,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="type != null  and type != ''">type,</if>
+            <if test="phone != null  and phone != ''">phone,</if>
+            <if test="address != null  and address != ''">address,</if>
+            <if test="responsibility != null  and responsibility != ''">responsibility,</if>
+            <if test="status != null  and status != ''">status,</if>
+            <if test="isDeleted != null  and isDeleted != ''">is_deleted,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="remark != null  and remark != ''">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="ids != null  and ids != ''">#{ids},</if>
+            <if test="projectId != null  and projectId != ''">#{projectId},</if>
+            <if test="holeId != null  and holeId != ''">#{holeId},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="type != null  and type != ''">#{type},</if>
+            <if test="phone != null  and phone != ''">#{phone},</if>
+            <if test="address != null  and address != ''">#{address},</if>
+            <if test="responsibility != null  and responsibility != ''">#{responsibility},</if>
+            <if test="status != null  and status != ''">#{status},</if>
+            <if test="isDeleted != null  and isDeleted != ''">#{isDeleted},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="remark != null  and remark != ''">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateProjectPerson" parameterType="ProjectPerson">
+        update js_project_person
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="projectId != null  and projectId != ''">project_id = #{projectId},</if>
+            <if test="holeId != null  and holeId != ''">hole_id = #{holeId},</if>
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="type != null  and type != ''">type = #{type},</if>
+            <if test="phone != null  and phone != ''">phone = #{phone},</if>
+            <if test="address != null  and address != ''">address = #{address},</if>
+            <if test="responsibility != null  and responsibility != ''">responsibility = #{responsibility},</if>
+            <if test="status != null  and status != ''">status = #{status},</if>
+            <if test="isDeleted != null  and isDeleted != ''">is_deleted = #{isDeleted},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="remark != null  and remark != ''">remark = #{remark},</if>
+        </trim>
+        where ids = #{ids}
+    </update>
+
+    <delete id="deleteProjectPersonById" parameterType="String">
+        delete from js_project_person where ids = #{ids}
+    </delete>
+
+    <delete id="deleteProjectPersonByIds" parameterType="String">
+        delete from js_project_person where ids in 
+        <foreach item="ids" collection="array" open="(" separator="," close=")">
+            #{ids}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/add.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/add.html
new file mode 100644
index 0000000..0a8fb12
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/add.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('鏂板璁惧搴�')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-device-add">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璁惧缂栧彿锛�</label>
+                <div class="col-sm-8">
+                    <input name="code" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍚嶅瓧锛�</label>
+                <div class="col-sm-8">
+                    <input name="name" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍨嬪彿锛�</label>
+                <div class="col-sm-8">
+                    <input name="type" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鐢熶骇鍟嗭細</label>
+                <div class="col-sm-8">
+                    <input name="manufacturer" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璐拱鏃ユ湡锛�</label>
+                <div class="col-sm-8">
+                    <div class="input-group date">
+                        <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        <input name="buyDate" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">浠锋牸锛�</label>
+                <div class="col-sm-8">
+                    <input name="price" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璁惧鐘舵�侊細</label>
+                <div class="col-sm-8">
+                    <select name="status" class="form-control m-b" th:with="type=${@dict.getType('device_status')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">瀛樻斁浣嶇疆锛�</label>
+                <div class="col-sm-8">
+                    <input name="storageAddress" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script type="text/javascript">
+        var prefix = ctx + "geo/device"
+        $("#form-device-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-device-add').serialize());
+            }
+        }
+
+        $("input[name='buyDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/device.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/device.html
new file mode 100644
index 0000000..2dd10eb
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/device.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('璁惧搴撳垪琛�')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <p>璁惧缂栧彿锛�</p>
+                                <input type="text" name="code"/>
+                            </li>
+                            <li>
+                                <p>鍚嶅瓧锛�</p>
+                                <input type="text" name="name"/>
+                            </li>
+                            <li>
+                                <p>鍨嬪彿锛�</p>
+                                <input type="text" name="type"/>
+                            </li>
+                            <li class="select-time">
+                                <p>璐拱鏃ユ湡锛�</p>
+                                <input type="text" class="time-input" id="startTime" placeholder="寮�濮嬫椂闂�" name="params[beginBuyDate]"/>
+                                <span>-</span>
+                                <input type="text" class="time-input" id="endTime" placeholder="缁撴潫鏃堕棿" name="params[endBuyDate]"/>
+                            </li>
+                            <li>
+                                <p>璁惧鐘舵�侊細</p>
+                                <select name="status" th:with="type=${@dict.getType('device_status')}">
+                                    <option value="">鎵�鏈�</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;鎼滅储</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;閲嶇疆</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="geo:device:add">
+                    <i class="fa fa-plus"></i> 娣诲姞
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="geo:device:edit">
+                    <i class="fa fa-edit"></i> 淇敼
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="geo:device:remove">
+                    <i class="fa fa-remove"></i> 鍒犻櫎
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="geo:device:export">
+                    <i class="fa fa-download"></i> 瀵煎嚭
+                 </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('geo:device:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('geo:device:remove')}]];
+        var statusDatas = [[${@dict.getType('device_status')}]];
+        var prefix = ctx + "geo/device";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "璁惧搴�",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field : 'id', 
+                    title : '涓婚敭',
+                    visible: false
+                },
+                {
+                    field : 'code', 
+                    title : '璁惧缂栧彿'
+                },
+                {
+                    field : 'name', 
+                    title : '鍚嶅瓧'
+                },
+                {
+                    field : 'type', 
+                    title : '鍨嬪彿'
+                },
+                {
+                    field : 'manufacturer', 
+                    title : '鐢熶骇鍟�'
+                },
+                {
+                    field : 'buyDate', 
+                    title : '璐拱鏃ユ湡'
+                },
+                {
+                    field : 'price', 
+                    title : '浠锋牸'
+                },
+                {
+                    field : 'status', 
+                    title : '璁惧鐘舵��',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(statusDatas, value);
+                    }
+                },
+                {
+                    field : 'storageAddress', 
+                    title : '瀛樻斁浣嶇疆'
+                },
+                {
+                    title: '鎿嶄綔',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>缂栬緫</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>鍒犻櫎</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/edit.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/edit.html
new file mode 100644
index 0000000..dab5007
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/device/edit.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('淇敼璁惧搴�')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-device-edit" th:object="${device}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璁惧缂栧彿锛�</label>
+                <div class="col-sm-8">
+                    <input name="code" th:field="*{code}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍚嶅瓧锛�</label>
+                <div class="col-sm-8">
+                    <input name="name" th:field="*{name}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍨嬪彿锛�</label>
+                <div class="col-sm-8">
+                    <input name="type" th:field="*{type}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鐢熶骇鍟嗭細</label>
+                <div class="col-sm-8">
+                    <input name="manufacturer" th:field="*{manufacturer}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璐拱鏃ユ湡锛�</label>
+                <div class="col-sm-8">
+                    <div class="input-group date">
+                        <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                        <input name="buyDate" th:value="${#dates.format(device.buyDate, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">浠锋牸锛�</label>
+                <div class="col-sm-8">
+                    <input name="price" th:field="*{price}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璁惧鐘舵�侊細</label>
+                <div class="col-sm-8">
+                    <select name="status" class="form-control m-b" th:with="type=${@dict.getType('device_status')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{status}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">瀛樻斁浣嶇疆锛�</label>
+                <div class="col-sm-8">
+                    <input name="storageAddress" th:field="*{storageAddress}" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script type="text/javascript">
+        var prefix = ctx + "geo/device";
+        $("#form-device-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-device-edit').serialize());
+            }
+        }
+
+        $("input[name='buyDate']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/add.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/add.html
new file mode 100644
index 0000000..d02353d
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/add.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('鏂板璁惧鍑哄叆搴撹褰�')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-deviceLog-add">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍑哄叆搴撳崟瀛愬彿锛�</label>
+                <div class="col-sm-8">
+                    <input name="code" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">椤圭洰鍚嶇О锛�</label>
+                <div class="col-sm-8">
+                    <input name="projectName" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璁惧鍚嶇О锛�</label>
+                <div class="col-sm-8">
+                    <input name="deviceName" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍑哄叆搴撶被鍨嬶細</label>
+                <div class="col-sm-8">
+                    <select name="type" class="form-control m-b" th:with="type=${@dict.getType('device_log_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍑哄叆搴撴椂闂达細</label>
+                <div class="col-sm-8">
+                    <input name="transactionDate" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">缁忓姙浜猴細</label>
+                <div class="col-sm-8">
+                    <input name="optUser" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">浣跨敤浜猴細</label>
+                <div class="col-sm-8">
+                    <input name="applyUser" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍑哄叆搴撴暟閲忥細</label>
+                <div class="col-sm-8">
+                    <input name="number" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script type="text/javascript">
+        var prefix = ctx + "geo/deviceLog"
+        $("#form-deviceLog-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-deviceLog-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/deviceLog.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/deviceLog.html
new file mode 100644
index 0000000..f8f04dc
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/deviceLog.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('璁惧鍑哄叆搴撹褰曞垪琛�')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <p>鍑哄叆搴撳崟瀛愬彿锛�</p>
+                                <input type="text" name="code"/>
+                            </li>
+                            <li>
+                                <p>椤圭洰鍚嶇О锛�</p>
+                                <input type="text" name="projectName"/>
+                            </li>
+                            <li>
+                                <p>璁惧鍚嶇О锛�</p>
+                                <input type="text" name="deviceName"/>
+                            </li>
+                            <li>
+                                <p>鍑哄叆搴撶被鍨嬶細</p>
+                                <select name="type" th:with="type=${@dict.getType('device_log_type')}">
+                                    <option value="">鎵�鏈�</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <p>缁忓姙浜猴細</p>
+                                <input type="text" name="optUser"/>
+                            </li>
+                            <li>
+                                <p>浣跨敤浜猴細</p>
+                                <input type="text" name="applyUser"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;鎼滅储</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;閲嶇疆</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="geo:deviceLog:add">
+                    <i class="fa fa-plus"></i> 娣诲姞
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="geo:deviceLog:edit">
+                    <i class="fa fa-edit"></i> 淇敼
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="geo:deviceLog:remove">
+                    <i class="fa fa-remove"></i> 鍒犻櫎
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="geo:deviceLog:export">
+                    <i class="fa fa-download"></i> 瀵煎嚭
+                 </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('geo:deviceLog:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('geo:deviceLog:remove')}]];
+        var typeDatas = [[${@dict.getType('device_log_type')}]];
+        var prefix = ctx + "geo/deviceLog";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "璁惧鍑哄叆搴撹褰�",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field : 'id', 
+                    title : '涓婚敭',
+                    visible: false
+                },
+                {
+                    field : 'code', 
+                    title : '鍑哄叆搴撳崟瀛愬彿'
+                },
+                {
+                    field : 'projectName', 
+                    title : '椤圭洰鍚嶇О'
+                },
+                {
+                    field : 'deviceName', 
+                    title : '璁惧鍚嶇О'
+                },
+                {
+                    field : 'type', 
+                    title : '鍑哄叆搴撶被鍨�',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(typeDatas, value);
+                    }
+                },
+                {
+                    field : 'transactionDate', 
+                    title : '鍑哄叆搴撴椂闂�'
+                },
+                {
+                    field : 'optUser', 
+                    title : '缁忓姙浜�'
+                },
+                {
+                    field : 'applyUser', 
+                    title : '浣跨敤浜�'
+                },
+                {
+                    field : 'number', 
+                    title : '鍑哄叆搴撴暟閲�'
+                },
+                {
+                    field : 'remark', 
+                    title : '澶囨敞'
+                },
+                {
+                    title: '鎿嶄綔',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>缂栬緫</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>鍒犻櫎</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/edit.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/edit.html
new file mode 100644
index 0000000..0dc7b9c
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/deviceLog/edit.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('淇敼璁惧鍑哄叆搴撹褰�')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-deviceLog-edit" th:object="${deviceLog}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍑哄叆搴撳崟瀛愬彿锛�</label>
+                <div class="col-sm-8">
+                    <input name="code" th:field="*{code}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">椤圭洰鍚嶇О锛�</label>
+                <div class="col-sm-8">
+                    <input name="projectName" th:field="*{projectName}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璁惧鍚嶇О锛�</label>
+                <div class="col-sm-8">
+                    <input name="deviceName" th:field="*{deviceName}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍑哄叆搴撶被鍨嬶細</label>
+                <div class="col-sm-8">
+                    <select name="type" class="form-control m-b" th:with="type=${@dict.getType('device_log_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{type}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍑哄叆搴撴椂闂达細</label>
+                <div class="col-sm-8">
+                    <input name="transactionDate" th:field="*{transactionDate}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">缁忓姙浜猴細</label>
+                <div class="col-sm-8">
+                    <input name="optUser" th:field="*{optUser}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">浣跨敤浜猴細</label>
+                <div class="col-sm-8">
+                    <input name="applyUser" th:field="*{applyUser}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍑哄叆搴撴暟閲忥細</label>
+                <div class="col-sm-8">
+                    <input name="number" th:field="*{number}" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script type="text/javascript">
+        var prefix = ctx + "geo/deviceLog";
+        $("#form-deviceLog-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-deviceLog-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/project/navigate.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/project/navigate.html
index 7618956..59fd409 100644
--- a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/project/navigate.html
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/project/navigate.html
@@ -28,49 +28,52 @@
                 <div class="box-title">
                     <i class="glyphicon glyphicon-map-marker"></i> <a class="afont" th:href="@{/geo/hole(id=${project.ids})}" target="mainFrame" onclick="selected(this)">鍕樻帰鐐�</a>                    
                 </div> 
-            </div>     
-            <div class="box-header ">
-                <div class="box-title">
-                    <i class="glyphicon glyphicon-user"></i> <a class="afont" th:href="@{/geo/person(id=${project.ids})}" target="mainFrame" onclick="selected(this)">鍙備笌浜�</a>                    
-                </div> 
             </div>
-
             <div class="box-header ">
                 <div class="box-title">
-                    <i class="glyphicon glyphicon-adjust"></i> <a class="afont" th:href="@{/geo/yantu(id=${project.ids})}" target="mainFrame" onclick="selected(this)">宀╁湡</a>
+                    <i class="glyphicon glyphicon-user"></i> <a class="afont" th:href="@{/geo/projectPerson(id=${project.ids})}" target="mainFrame" onclick="selected(this)">浜哄憳绠$悊</a>
                 </div>
             </div>
-
             <div class="box-header ">
                 <div class="box-title">
-                    <i class="glyphicon glyphicon-ban-circle"></i> <a class="afont" th:href="@{/geo/qutu(id=${project.ids})}" target="mainFrame" onclick="selected(this)">鍙栧湡</a>
+                    <i class="glyphicon glyphicon-modal-window"></i> <a class="afont" th:href="@{/geo/deviceLog(id=${project.ids})}" target="mainFrame" onclick="selected(this)">杩涘嚭搴撶鐞�</a>
                 </div>
             </div>
-
             <div class="box-header ">
                 <div class="box-title">
-                    <i class="glyphicon glyphicon-screenshot"></i> <a class="afont" th:href="@{/geo/huici(id=${project.ids})}" target="mainFrame" onclick="selected(this)">鍥炴</a>
+                    <i class="glyphicon glyphicon-modal-window"></i> <a class="afont" th:href="@{/geo/projectData(id=${project.ids},type='1')}" target="mainFrame" onclick="selected(this)">璐ㄩ噺绠$悊</a>
                 </div>
             </div>
-
             <div class="box-header ">
                 <div class="box-title">
-                    <i class="glyphicon glyphicon-tint"></i> <a class="afont" th:href="@{/geo/shuiwei(id=${project.ids})}" target="mainFrame" onclick="selected(this)">姘翠綅</a>
+                    <i class="glyphicon glyphicon-modal-window"></i> <a class="afont" th:href="@{/geo/projectData(id=${project.ids},type='2')}" target="mainFrame" onclick="selected(this)">瀹夊叏绠$悊</a>
                 </div>
             </div>
-
             <div class="box-header ">
                 <div class="box-title">
-                    <i class="glyphicon glyphicon-tower"></i> <a class="afont" th:href="@{/geo/biaoguan(id=${project.ids})}" target="mainFrame" onclick="selected(this)">鏍囪疮/鍔ㄦ帰</a>
+                    <i class="glyphicon glyphicon-modal-window"></i> <a class="afont" th:href="@{/geo/projectData(id=${project.ids},type='3')}" target="mainFrame" onclick="selected(this)">娴嬩簳</a>
                 </div>
             </div>
-
             <div class="box-header ">
                 <div class="box-title">
-                    <i class="glyphicon glyphicon-blackboard"></i> <a class="afont" th:href="@{/geo/projectwork/work(id=${project.ids})}" target="mainFrame" onclick="selected(this)">宸ヤ綔閲�</a>
-                </div> 
-            </div>         
-            
+                    <i class="glyphicon glyphicon-modal-window"></i> <a class="afont" th:href="@{/geo/projectData(id=${project.ids},type='4')}" target="mainFrame" onclick="selected(this)">鏂滄祴</a>
+                </div>
+            </div>
+            <div class="box-header ">
+                <div class="box-title">
+                    <i class="glyphicon glyphicon-modal-window"></i> <a class="afont" th:href="@{/geo/projectData(id=${project.ids},type='5')}" target="mainFrame" onclick="selected(this)">瀹ゅ唴璇曢獙</a>
+                </div>
+            </div>
+            <div class="box-header ">
+                <div class="box-title">
+                    <i class="glyphicon glyphicon-modal-window"></i> <a class="afont" th:href="@{/geo/projectData(id=${project.ids},type='6')}" target="mainFrame" onclick="selected(this)">宸ョ▼娴嬬粯</a>
+                </div>
+            </div>
+            <div class="box-header ">
+                <div class="box-title">
+                    <i class="glyphicon glyphicon-modal-window"></i> <a class="afont" th:href="@{/geo/projectData(id=${project.ids},type='7')}" target="mainFrame" onclick="selected(this)">姘磋川鍒嗘瀽</a>
+                </div>
+            </div>
         </div>
     </div>
     
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/add.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/add.html
new file mode 100644
index 0000000..7f34c23
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/add.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('鏂板椤圭洰璧勬枡')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-projectData-add">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璧勬枡鍚嶇О锛�</label>
+                <div class="col-sm-8">
+                    <input name="name" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璧勬枡绫诲瀷锛�</label>
+                <div class="col-sm-8">
+                    <select name="dataType" class="form-control m-b" th:with="type=${@dict.getType('project_data_type')}" required>
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鏂囦欢绫诲瀷锛�</label>
+                <div class="col-sm-8">
+                    <select name="fileType" class="form-control m-b" th:with="type=${@dict.getType('project_data_file_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鏍囩锛�</label>
+                <div class="col-sm-8">
+                    <input name="labels" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script type="text/javascript">
+        var prefix = ctx + "geo/projectData"
+        $("#form-projectData-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-projectData-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/edit.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/edit.html
new file mode 100644
index 0000000..804b13c
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/edit.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('淇敼椤圭洰璧勬枡')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-projectData-edit" th:object="${projectData}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璧勬枡鍚嶇О锛�</label>
+                <div class="col-sm-8">
+                    <input name="name" th:field="*{name}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">璧勬枡绫诲瀷锛�</label>
+                <div class="col-sm-8">
+                    <select name="dataType" class="form-control m-b" th:with="type=${@dict.getType('project_data_type')}" required>
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{dataType}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鏂囦欢绫诲瀷锛�</label>
+                <div class="col-sm-8">
+                    <select name="fileType" class="form-control m-b" th:with="type=${@dict.getType('project_data_file_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{fileType}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鏍囩锛�</label>
+                <div class="col-sm-8">
+                    <input name="labels" th:field="*{labels}" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script type="text/javascript">
+        var prefix = ctx + "geo/projectData";
+        $("#form-projectData-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-projectData-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/projectData.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/projectData.html
new file mode 100644
index 0000000..ec854eb
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectData/projectData.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('椤圭洰璧勬枡鍒楄〃')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <p>璧勬枡鍚嶇О锛�</p>
+                                <input type="text" name="name"/>
+                            </li>
+                            <li>
+                                <p>璧勬枡绫诲瀷锛�</p>
+                                <select name="dataType" th:with="type=${@dict.getType('project_data_type')}">
+                                    <option value="">鎵�鏈�</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <p>鏂囦欢绫诲瀷锛�</p>
+                                <select name="fileType" th:with="type=${@dict.getType('project_data_file_type')}">
+                                    <option value="">鎵�鏈�</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <p>鏍囩锛�</p>
+                                <input type="text" name="labels"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;鎼滅储</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;閲嶇疆</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="geo:projectData:add">
+                    <i class="fa fa-plus"></i> 娣诲姞
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="geo:projectData:edit">
+                    <i class="fa fa-edit"></i> 淇敼
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="geo:projectData:remove">
+                    <i class="fa fa-remove"></i> 鍒犻櫎
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="geo:projectData:export">
+                    <i class="fa fa-download"></i> 瀵煎嚭
+                 </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('geo:projectData:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('geo:projectData:remove')}]];
+        var dataTypeDatas = [[${@dict.getType('project_data_type')}]];
+        var fileTypeDatas = [[${@dict.getType('project_data_file_type')}]];
+        var prefix = ctx + "geo/projectData";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "椤圭洰璧勬枡",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field : 'id', 
+                    title : '涓婚敭',
+                    visible: false
+                },
+                {
+                    field : 'name', 
+                    title : '璧勬枡鍚嶇О'
+                },
+                {
+                    field : 'dataType', 
+                    title : '璧勬枡绫诲瀷',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(dataTypeDatas, value);
+                    }
+                },
+                {
+                    field : 'fileType', 
+                    title : '鏂囦欢绫诲瀷',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(fileTypeDatas, value);
+                    }
+                },
+                {
+                    field : 'labels', 
+                    title : '鏍囩'
+                },
+                {
+                    field : 'remark', 
+                    title : '澶囨敞'
+                },
+                {
+                    title: '鎿嶄綔',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>缂栬緫</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>鍒犻櫎</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/add.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/add.html
new file mode 100644
index 0000000..bd90031
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/add.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('鏂板椤圭洰浜哄憳')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-projectPerson-add">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">浜哄憳鍚嶇О锛�</label>
+                <div class="col-sm-8">
+                    <input name="name" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">绫诲瀷锛�</label>
+                <div class="col-sm-8">
+                    <select name="type" class="form-control m-b" th:with="type=${@dict.getType('project_person_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鎵嬫満鍙凤細</label>
+                <div class="col-sm-8">
+                    <input name="phone" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍦板潃锛�</label>
+                <div class="col-sm-8">
+                    <input name="address" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鑱岃矗锛�</label>
+                <div class="col-sm-8">
+                    <input name="responsibility" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script type="text/javascript">
+        var prefix = ctx + "geo/projectPerson"
+        $("#form-projectPerson-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-projectPerson-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/edit.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/edit.html
new file mode 100644
index 0000000..438156c
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/edit.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('淇敼椤圭洰浜哄憳')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-projectPerson-edit" th:object="${projectPerson}">
+            <input name="ids" th:field="*{ids}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">浜哄憳鍚嶇О锛�</label>
+                <div class="col-sm-8">
+                    <input name="name" th:field="*{name}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">绫诲瀷锛�</label>
+                <div class="col-sm-8">
+                    <select name="type" class="form-control m-b" th:with="type=${@dict.getType('project_person_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{type}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鎵嬫満鍙凤細</label>
+                <div class="col-sm-8">
+                    <input name="phone" th:field="*{phone}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鍦板潃锛�</label>
+                <div class="col-sm-8">
+                    <input name="address" th:field="*{address}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">鑱岃矗锛�</label>
+                <div class="col-sm-8">
+                    <input name="responsibility" th:field="*{responsibility}" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script type="text/javascript">
+        var prefix = ctx + "geo/projectPerson";
+        $("#form-projectPerson-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-projectPerson-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/projectPerson.html b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/projectPerson.html
new file mode 100644
index 0000000..4bcc484
--- /dev/null
+++ b/javaweb-plus/javaweb-cms/src/main/resources/templates/geo/projectPerson/projectPerson.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('椤圭洰浜哄憳鍒楄〃')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <p>浜哄憳鍚嶇О锛�</p>
+                                <input type="text" name="name"/>
+                            </li>
+                            <li>
+                                <p>绫诲瀷锛�</p>
+                                <select name="type" th:with="type=${@dict.getType('project_person_type')}">
+                                    <option value="">鎵�鏈�</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <p>鎵嬫満鍙凤細</p>
+                                <input type="text" name="phone"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;鎼滅储</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;閲嶇疆</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="geo:projectPerson:add">
+                    <i class="fa fa-plus"></i> 娣诲姞
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="geo:projectPerson:edit">
+                    <i class="fa fa-edit"></i> 淇敼
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="geo:projectPerson:remove">
+                    <i class="fa fa-remove"></i> 鍒犻櫎
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="geo:projectPerson:export">
+                    <i class="fa fa-download"></i> 瀵煎嚭
+                 </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('geo:projectPerson:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('geo:projectPerson:remove')}]];
+        var typeDatas = [[${@dict.getType('project_person_type')}]];
+        var projectId=[[${projectId}]];
+        var prefix = ctx + "geo/projectPerson";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list?projectId="+projectId,
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "椤圭洰浜哄憳",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field : 'ids', 
+                    title : 'id',
+                    visible: false
+                },
+                {
+                    field : 'name', 
+                    title : '浜哄憳鍚嶇О'
+                },
+                {
+                    field : 'type', 
+                    title : '绫诲瀷',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(typeDatas, value);
+                    }
+                },
+                {
+                    field : 'phone', 
+                    title : '鎵嬫満鍙�'
+                },
+                {
+                    field : 'address', 
+                    title : '鍦板潃'
+                },
+                {
+                    field : 'responsibility', 
+                    title : '鑱岃矗'
+                },
+                {
+                    field : 'remark', 
+                    title : '澶囨敞'
+                },
+                {
+                    title: '鎿嶄綔',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.ids + '\')"><i class="fa fa-edit"></i>缂栬緫</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.ids + '\')"><i class="fa fa-remove"></i>鍒犻櫎</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>
\ No newline at end of file

--
Gitblit v1.9.1