diff --git a/src/main/java/com/supwisdom/dlpay/device/bean/DeviceSearchBean.java b/src/main/java/com/supwisdom/dlpay/device/bean/DeviceSearchBean.java
new file mode 100644
index 0000000..a4e6bfa
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/bean/DeviceSearchBean.java
@@ -0,0 +1,34 @@
+package com.supwisdom.dlpay.device.bean;
+
+import com.supwisdom.dlpay.system.bean.PageBean;
+
+public class DeviceSearchBean extends PageBean {
+    private Integer id;
+    private String devicename;
+    private String factoryid;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getDevicename() {
+        return devicename;
+    }
+
+    public void setDevicename(String devicename) {
+        this.devicename = devicename;
+    }
+
+    public String getFactoryid() {
+        return factoryid;
+    }
+
+    public void setFactoryid(String factoryid) {
+        this.factoryid = factoryid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/device/controller/DeviceController.java b/src/main/java/com/supwisdom/dlpay/device/controller/DeviceController.java
new file mode 100644
index 0000000..1128e8b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/controller/DeviceController.java
@@ -0,0 +1,86 @@
+package com.supwisdom.dlpay.device.controller;
+
+
+import com.google.gson.Gson;
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.area.bean.AreaSearchBean;
+import com.supwisdom.dlpay.area.domain.TArea;
+import com.supwisdom.dlpay.area.service.AreaService;
+import com.supwisdom.dlpay.device.bean.DeviceSearchBean;
+import com.supwisdom.dlpay.device.domain.TDevice;
+import com.supwisdom.dlpay.device.service.DeviceService;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/device")
+public class DeviceController {
+
+    @Autowired
+    private DeviceService deviceService;
+
+    @RequestMapping("/index")
+    public String indexView(ModelMap model) {
+
+        return "device/index";
+    }
+
+    @RequestMapping("/list")
+    @PreAuthorize("hasPermission('/device/index','')")
+    @ResponseBody
+    public PageResult<TDevice> getDataList(@RequestParam("page") Integer pageNo,
+                                         @RequestParam("limit") Integer pageSize,
+                                         @RequestParam(value = "searchkey", required = false) Integer searchKey) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            DeviceSearchBean searchBean = new DeviceSearchBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setId(searchKey);
+            searchBean.setPageSize(pageSize);
+            return deviceService.getDeviceByKey(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+    @GetMapping("/loadadd")
+    @PreAuthorize("hasPermission('/device/loadadd','')")
+    public String loadadd(Model model) {
+        return "device/form";
+    }
+
+    @PostMapping("/add")
+    @PreAuthorize("hasPermission('/device/add','')")
+    @ResponseBody
+    public JsonResult add(@RequestBody TDevice device) {
+        if (device != null) {
+            return deviceService.saveDevice(device);
+        } else {
+            return JsonResult.error("添加失败");
+        }
+    }
+
+    @PostMapping("/updatestate")
+    @PreAuthorize("hasPermission('/device/updatestate','')")
+    @ResponseBody
+    public JsonResult updatestate(@RequestParam("id") Integer id, @RequestParam("state") Integer state) {
+        if (deviceService.updateState(id, state)) {
+            return JsonResult.ok("操作成功");
+        } else {
+            return JsonResult.error("操作失败");
+        }
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/device/controller/DeviceGroupController.java b/src/main/java/com/supwisdom/dlpay/device/controller/DeviceGroupController.java
new file mode 100644
index 0000000..cecb0f7
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/controller/DeviceGroupController.java
@@ -0,0 +1,69 @@
+package com.supwisdom.dlpay.device.controller;
+
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.device.bean.DeviceSearchBean;
+import com.supwisdom.dlpay.device.domain.TDevice;
+import com.supwisdom.dlpay.device.service.DeviceService;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+@Controller
+@RequestMapping("/devicegroup")
+public class DeviceGroupController {
+
+    @Autowired
+    private DeviceService deviceService;
+
+    @RequestMapping("/index")
+    public String indexView(ModelMap model) {
+
+        return "devicegroup/index";
+    }
+
+    @RequestMapping("/list")
+    @PreAuthorize("hasPermission('/devicegroup/index','')")
+    @ResponseBody
+    public PageResult<TDevice> getDataList(@RequestParam("page") Integer pageNo,
+                                         @RequestParam("limit") Integer pageSize,
+                                         @RequestParam(value = "searchkey", required = false) Integer searchKey) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            DeviceSearchBean searchBean = new DeviceSearchBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setId(searchKey);
+            searchBean.setPageSize(pageSize);
+            return deviceService.getDeviceByKey(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+    @GetMapping("/loadadd")
+    @PreAuthorize("hasPermission('/devicegroup/loadadd','')")
+    public String loadadd(Model model) {
+        return "devicegroup/form";
+    }
+
+    @PostMapping("/add")
+    @PreAuthorize("hasPermission('/devicegroup/add','')")
+    @ResponseBody
+    public JsonResult add(@RequestBody TDevice device) {
+        if (device != null) {
+            return deviceService.saveDevice(device);
+        } else {
+            return JsonResult.error("添加失败");
+        }
+    }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/device/dao/DeviceDao.java b/src/main/java/com/supwisdom/dlpay/device/dao/DeviceDao.java
new file mode 100644
index 0000000..4765033
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/dao/DeviceDao.java
@@ -0,0 +1,19 @@
+package com.supwisdom.dlpay.device.dao;
+
+
+import com.supwisdom.dlpay.device.domain.TDevice;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface DeviceDao extends JpaSpecificationExecutor<TDevice>,JpaRepository<TDevice, Integer> {
+
+    Page<TDevice> findAllByIdContaining(Integer id, Pageable pageable);
+
+
+
+    TDevice findByDevicename(String devicename);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/device/dao/DeviceGroupDao.java b/src/main/java/com/supwisdom/dlpay/device/dao/DeviceGroupDao.java
new file mode 100644
index 0000000..2171bbd
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/dao/DeviceGroupDao.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.device.dao;
+
+import com.supwisdom.dlpay.device.domain.TDeviceGroup;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface DeviceGroupDao  extends  JpaRepository<TDeviceGroup, Integer> {
+}
diff --git a/src/main/java/com/supwisdom/dlpay/device/dao/ShopDeviceDao.java b/src/main/java/com/supwisdom/dlpay/device/dao/ShopDeviceDao.java
new file mode 100644
index 0000000..095a1bf
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/dao/ShopDeviceDao.java
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.device.dao;
+
+import com.supwisdom.dlpay.device.domain.TShopDevice;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ShopDeviceDao extends JpaSpecificationExecutor<TShopDevice>, JpaRepository<TShopDevice, Integer> {
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/device/domain/TDevice.java b/src/main/java/com/supwisdom/dlpay/device/domain/TDevice.java
index f07b454..4f74f73 100644
--- a/src/main/java/com/supwisdom/dlpay/device/domain/TDevice.java
+++ b/src/main/java/com/supwisdom/dlpay/device/domain/TDevice.java
@@ -9,14 +9,17 @@
     private Integer id;
     private String devicename;
     private String devphyid;
-    private String termid;
+   // private String termid;
     private Integer shopid;
     private String factoryid;
-    private Integer status;
+    private Integer state;
     private String operid;
+    private String devgroupid;
+    private String lastsaved;
+
     @Id
     @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_DEVICE")
-    @Column(name = "id", unique = true, nullable = false, length = 8)
+    @Column(name = "id", unique = true, nullable = false, length = 9)
     public Integer getId() {
         return id;
     }
@@ -26,7 +29,7 @@
     }
 
 
-    @Column(name = "AREANAME", length = 60)
+    @Column(name = "devicename", length = 60)
     public String getDevicename() {
         return devicename;
     }
@@ -35,7 +38,7 @@
         this.devicename = devicename;
     }
 
-    @Column(name = "devphyid", length = 20)
+    @Column(name = "devphyid",unique = true, length = 20)
     public String getDevphyid() {
         return devphyid;
     }
@@ -44,14 +47,14 @@
         this.devphyid = devphyid;
     }
 
-    @Column(name = "termid", length = 20)
+/*    @Column(name = "termid", length = 20)
     public String getTermid() {
         return termid;
     }
 
     public void setTermid(String termid) {
         this.termid = termid;
-    }
+    }*/
     @Column(name = "shopid", length = 10)
     public Integer getShopid() {
         return shopid;
@@ -68,13 +71,13 @@
     public void setFactoryid(String factoryid) {
         this.factoryid = factoryid;
     }
-    @Column(name = "status", length = 1)
-    public Integer getStatus() {
-        return status;
+    @Column(name = "state", length = 1)
+    public Integer getState() {
+        return state;
     }
 
-    public void setStatus(Integer status) {
-        this.status = status;
+    public void setState(Integer status) {
+        this.state = status;
     }
     @Column(name = "operid", length = 100)
     public String getOperid() {
@@ -84,4 +87,21 @@
     public void setOperid(String operid) {
         this.operid = operid;
     }
+
+    @Column(name = "devgroupid", length = 30)
+    public String getDevgroupid() {
+        return devgroupid;
+    }
+
+    public void setDevgroupid(String devgroupid) {
+        this.devgroupid = devgroupid;
+    }
+    @Column(name = "lastsaved", length = 14)
+    public String getLastsaved() {
+        return lastsaved;
+    }
+
+    public void setLastsaved(String lastsaved) {
+        this.lastsaved = lastsaved;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/device/domain/TDeviceGroup.java b/src/main/java/com/supwisdom/dlpay/device/domain/TDeviceGroup.java
new file mode 100644
index 0000000..172ca1f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/domain/TDeviceGroup.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.device.domain;
+
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_DEVICEGROUP")
+@SequenceGenerator(name="SEQ_DEVGROUP",sequenceName="SEQ_DEVGROUP",allocationSize=1)
+public class TDeviceGroup {
+    private Integer devgroupid;
+    private String groupname;
+
+    @Id
+    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_DEVGROUP")
+    @Column(name = "devgroupid", unique = true, nullable = false, length = 8)
+    public Integer getDevgroupid() {
+        return devgroupid;
+    }
+
+    public void setDevgroupid(Integer devgroupid) {
+        this.devgroupid = devgroupid;
+    }
+    @Column(name = "groupname", length = 60)
+    public String getGroupname() {
+        return groupname;
+    }
+
+    public void setGroupname(String groupname) {
+        this.groupname = groupname;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/device/domain/TShopDevice.java b/src/main/java/com/supwisdom/dlpay/device/domain/TShopDevice.java
new file mode 100644
index 0000000..28980e9
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/domain/TShopDevice.java
@@ -0,0 +1,43 @@
+package com.supwisdom.dlpay.device.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "TB_SHOPDEVICE")
+public class TShopDevice {
+
+    private Integer deviceid;
+    private Integer shopid;
+    private String operid;
+
+    @Id
+    @Column(name = "DEVICEID", unique = true, nullable = false, length = 9)
+    public Integer getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(Integer deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    @Column(name = "SHOPID",  nullable = false, length = 10)
+    public Integer getShopid() {
+        return shopid;
+    }
+
+    public void setShopid(Integer shopid) {
+        this.shopid = shopid;
+    }
+
+    @Column(name = "operid", nullable = false, length = 32)
+    public String getOperid() {
+        return operid;
+    }
+
+    public void setOperid(String operid) {
+        this.operid = operid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/device/service/DeviceService.java b/src/main/java/com/supwisdom/dlpay/device/service/DeviceService.java
new file mode 100644
index 0000000..7673b73
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/service/DeviceService.java
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.device.service;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.area.bean.AreaSearchBean;
+import com.supwisdom.dlpay.device.bean.DeviceSearchBean;
+import com.supwisdom.dlpay.device.domain.TDevice;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface DeviceService {
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    PageResult<TDevice> getDeviceByKey(DeviceSearchBean param);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    List<TDevice> findAll();
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult saveDevice(TDevice device);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    boolean updateState(Integer id,Integer state);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/device/service/impl/DeviceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/device/service/impl/DeviceServiceImpl.java
new file mode 100644
index 0000000..efef7b0
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/device/service/impl/DeviceServiceImpl.java
@@ -0,0 +1,100 @@
+package com.supwisdom.dlpay.device.service.impl;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.device.bean.DeviceSearchBean;
+import com.supwisdom.dlpay.device.dao.DeviceDao;
+import com.supwisdom.dlpay.device.dao.ShopDeviceDao;
+import com.supwisdom.dlpay.device.domain.TDevice;
+import com.supwisdom.dlpay.device.domain.TShopDevice;
+import com.supwisdom.dlpay.device.service.DeviceService;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.security.OperUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class DeviceServiceImpl implements DeviceService {
+    @Autowired
+    private DeviceDao deviceDao;
+    @Autowired
+    private ShopDeviceDao shopDeviceDao;
+
+    /*    @Override
+        public PageResult<TDevice> getDeviceByKey(DeviceSearchBean param) {
+            Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+                    , Sort.by("id"));
+
+            Specification<TDevice> spec = new Specification<TDevice>() {        //查询条件构造
+                @Override
+                public Predicate toPredicate(Root<TDevice> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
+                    List<Predicate> list = new ArrayList<>();
+
+                    if (!StringUtil.isEmpty(param.getDevicename())) {
+                        list.add(cb.like(root.get("devicename").as(String.class), "%" + param.getDevicename() + "%"));
+                    }
+
+                    if (!StringUtil.isEmpty(param.getFactoryid())) {
+                        list.add(cb.equal(root.get("factoryid").as(String.class), param.getFactoryid()));
+                    }
+                    if (!StringUtil.isEmpty(param.getTermid())) {
+                        list.add(cb.like(root.get("termid").as(String.class), param.getTermid()));
+                    }
+                    return cb.and(list.toArray(new Predicate[list.size()]));
+                }
+            };
+
+            return new PageResult<>(deviceDao.findAll(spec, pageable));
+        }*/
+    @Override
+    public PageResult<TDevice> getDeviceByKey(DeviceSearchBean param) {
+        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+                , Sort.by("id"));
+        if (null !=param.getId()) {
+            return new PageResult<>(deviceDao.findAllByIdContaining(param.getId(), pageable));
+        }
+        return new PageResult<>(deviceDao.findAll(pageable));
+    }
+
+
+    @Override
+    public List<TDevice> findAll() {
+        return deviceDao.findAll();
+    }
+
+    @Override
+    public JsonResult saveDevice(TDevice device) {
+        if(null==device.getState()){
+            device.setState(1);
+        }
+        TDevice d=deviceDao.save(device);
+        TShopDevice shopDevice=new TShopDevice();
+        shopDevice.setDeviceid(d.getId());
+        shopDevice.setShopid(d.getShopid());
+        shopDevice.setOperid(OperUtil.getCurrentOperid());
+        shopDeviceDao.save(shopDevice);
+
+        return JsonResult.ok("成功");
+    }
+
+    @Override
+    public boolean updateState(Integer id, Integer state) {
+        Optional<TDevice> temp = deviceDao.findById(id);
+        if (!temp.isPresent()) {
+            return false;
+        }
+        TDevice op = temp.get();
+        op.setState(state);
+        deviceDao.save(op);
+        return true;
+    }
+
+
+}
diff --git a/src/main/resources/templates/device/form.html b/src/main/resources/templates/device/form.html
new file mode 100644
index 0000000..6b5265d
--- /dev/null
+++ b/src/main/resources/templates/device/form.html
@@ -0,0 +1,112 @@
+
+<form id="form" lay-filter="form" class="layui-form model-form">
+    <input name="id" id="id" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label">设备物理ID</label>
+        <div class="layui-input-block">
+            <input name="devphyid" placeholder="不能重复" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|devphyid" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">设备厂商</label>
+        <div class="layui-input-block">
+            <select name="factoryid" id="factoryid" lay-verify="required">
+                <option  value="XKP">新开普</option>
+            </select>
+        </div>
+    </div>
+
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">所属商户ID</label>
+        <div class="layui-input-block">
+            <input name="shopid" placeholder="请输入" type="text" class="layui-input"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="form-submit" lay-submit id="submitbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        form.render('select');
+        form.render('radio');
+        /*form.verify({
+            "areaname": function (e) {
+                var msg = "";
+                $.ajax({
+                    type: "GET",
+                    url: '/area/checkname',
+                    async: false,
+                    data: {
+                        areaname: e,
+                    },
+                    success: function (result) {
+                        if (result.code != 200) {
+                            msg = result.msg;
+                        }
+                    },
+                    error: function (error) {
+                        msg = "请求服务器校验账号失败";
+                    }
+                });
+            }
+        });*/
+
+        var url = '/device/add';
+        // 回显user数据
+        var dev = admin.getTempData('t_dev');
+        if (dev) {
+            $('input[name="id"]').attr('readonly', 'readonly');
+            form.val('form', dev);
+        }
+       /* let fid = admin.getTempData("fid");
+        if (fid) {
+            form.val('form', {"fid": fid});
+        }*/
+        // 表单提交事件
+        form.on('submit(form-submit)', function (data) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            debugger
+            $.ajax({
+                type: "POST",
+                dataType: "json",
+                url: url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN': token,
+                },
+                data: JSON.stringify(data.field),
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error: function () {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/device/index.html b/src/main/resources/templates/device/index.html
new file mode 100644
index 0000000..59fe5f8
--- /dev/null
+++ b/src/main/resources/templates/device/index.html
@@ -0,0 +1,144 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">设备注册</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">设备注册</a>
+          <a><cite>设备注册</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索：
+            <input id="search-value" class="layui-input search-input" type="text" placeholder="输入功能名称"/>&emsp;
+            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加设备</button>
+        </div>
+        <table class="layui-table" id="table" lay-filter="table"></table>
+    </div>
+</div>
+
+<script type="text/html" id="dev-tpl-state">
+    <input type="checkbox" lay-filter="dev-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="正常|注销"
+           {{d.state=='1'?'checked':''}} />
+</script>
+<script>
+
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        let form = layui.form;
+        let table = layui.table;
+        let admin = layui.admin;
+
+        form.render('select');
+
+        // 渲染表格
+        table.render({
+            elem: '#table',
+            url: '/device/list',
+            page: true,
+            cols: [
+                [
+                    {field: 'id', title: '终端编号', sort: true},
+                    {field: 'devphyid', sort: true, width: 300, title: '设备物理id'},
+                    {field: 'shopid', sort: true, width: 300, title: '商户id'},
+                    {field: 'factoryid', sort: true, width: 300, title: '设备厂商'},
+                    {field: 'state', title: '状态', sort: true, width: 100, templet: '#dev-tpl-state'},
+                    {
+                        field: 'id', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+                            return ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ';
+                        }
+                    }
+                ]
+            ]
+        });
+        // 搜索按钮点击事件
+        $('#btn-search').click(function () {
+            let key = $('#search-value').val();
+            table.reload('table', {where: {searchkey: key}, page: {curr: 1}});
+        });
+        $('#btn-add').click(function () {
+            showModel();
+        });
+        let showModel = function (data) {
+            let title = data ? '修改设备' : '添加设备';
+            admin.putTempData('t_dev', data);
+            admin.popupCenter({
+                title: title,
+                path: '/device/loadadd',
+                finish: function () {
+                    table.reload('table', {});
+                }
+            });
+        };
+
+
+        // 工具条点击事件
+        table.on('tool(table)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            console.log(data);
+            if (layEvent === 'edit') {
+                showModel(data);
+            } else if (layEvent === 'del') {
+                showDelete(data);
+            }
+        });
+        let showDelete = function (data) {
+            layer.confirm('确定要删除吗？', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('/device/delete', {
+                    id: data.id,
+                    _csrf: token
+                }, function (data) {
+                    console.log(data.code);
+                    layer.closeAll('loading');
+                    if (data.code == 200) {
+                        layer.msg(data.msg, {icon: 1});
+                    } else if (data.code == 401) {
+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        layer.msg(data.msg, {icon: 2});
+                    }
+                    table.reload('table', {});
+                }, function (ret) {
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    layer.msg('请求失败了，请稍后再试', {icon: 2});
+                });
+            });
+        };
+
+        form.on('switch(dev-tpl-state)', function (obj) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            admin.go('/device/updatestate', {
+                id: obj.elem.value,
+                _csrf: token,
+                state: obj.elem.checked ? 1 : 0
+            }, function (data) {
+                layer.closeAll('loading');
+                if (data.code == 200) {
+                    layer.msg(data.msg, {icon: 1});
+                    //table.reload('table-user', {});
+                } else if (data.code == 401) {
+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                        location.replace('/login');
+                    }, 1000);
+                    return;
+                } else {
+                    layer.msg(data.msg, {icon: 2});
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            },function () {
+                layer.closeAll('loading');
+                layer.msg('请求失败了，请稍后再试', {icon: 2});
+            });
+        });
+    });
+</script>
