diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSearchBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSearchBean.java
new file mode 100644
index 0000000..fbc88d8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSearchBean.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+import com.supwisdom.dlpay.system.bean.PageBean;
+
+public class CustomerSearchBean extends PageBean {
+    private String custname;
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
new file mode 100644
index 0000000..2663282
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
@@ -0,0 +1,119 @@
+package com.supwisdom.dlpay.restaurant.controller;
+
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.util.ExportExcel;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.restaurant.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.restaurant.domain.TCustomer;
+import com.supwisdom.dlpay.restaurant.service.CustomerService;
+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 org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Controller
+@RequestMapping("/customer")
+public class CustomerController {
+
+    @Autowired
+    private CustomerService customerService;
+
+    @RequestMapping("/index")
+    public String indexView(ModelMap model) {
+
+        return "restaurant/customer/index";
+    }
+
+    @RequestMapping("/list")
+    @PreAuthorize("hasPermission('/customer/list','')")
+    @ResponseBody
+    public PageResult<TCustomer> getDataList(@RequestParam("page") Integer pageNo,
+                                             @RequestParam("limit") Integer pageSize,
+                                             @RequestParam(value = "searchkey", required = false) String searchKey) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            CustomerSearchBean searchBean = new CustomerSearchBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setCustname(searchKey);
+            searchBean.setPageSize(pageSize);
+            return customerService.getCustomerByCustname(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+    @GetMapping("/loadadd")
+    @PreAuthorize("hasPermission('/customer/loadadd','')")
+    public String loadadd(Model model) {
+        return "restaurant/customer/form";
+    }
+
+    @PostMapping("/add")
+    @PreAuthorize("hasPermission('/customer/add','')")
+    @ResponseBody
+    public JsonResult add(@RequestBody TCustomer customer) {
+        if (customer != null) {
+            return customerService.saveCustomer(customer);
+        } else {
+            return JsonResult.error("添加失败");
+        }
+    }
+
+    @PostMapping("/delete")
+    @PreAuthorize("hasPermission('/customer/delete','')")
+    @ResponseBody
+    public JsonResult delete(@RequestParam Integer  custid) {
+        return customerService.deleteCustomer(custid);
+    }
+
+
+    @GetMapping("/loadimport")
+
+    @PreAuthorize("hasPermission('/customer/loadimport','')")
+
+    public String loadimport(Model model) {
+        return "restaurant/customer/import";
+    }
+
+
+    @RequestMapping("/download")
+    @PreAuthorize("hasPermission('/customer/download','')")
+    @ResponseBody
+    public JsonResult downloadfile(HttpServletRequest request, HttpServletResponse response) throws Exception{
+        String[] titles0 = {"姓名",	"市名卡号",	"市名卡银行卡号","手机（选填）"
+        }; //表头
+        String[][] info0 = {{"张三",	"123456",	"3000000","12341234123"
+        }}; // 示例内容
+        String fileName0 = "客户导入模板";// 保存数据
+
+        try {
+            ExportExcel.queryexcel(fileName0, titles0,info0,request, response);
+            return JsonResult.ok("操作成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return JsonResult.error("操作失败");
+    }
+
+    @PostMapping("/import")
+    @PreAuthorize("hasPermission('/customer/import','')")
+    @ResponseBody
+    public JsonResult importFile(@RequestParam(value = "file",required = false) MultipartFile file, HttpServletRequest request) throws Exception{
+//    System.out.println("---------under the upload file:"+file);
+        return customerService.importFile(file,request);
+    }
+
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerDao.java
new file mode 100644
index 0000000..b18d3ff
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerDao.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.restaurant.dao;
+
+
+import com.supwisdom.dlpay.restaurant.domain.TCustomer;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CustomerDao extends JpaRepository<TCustomer, Integer> {
+
+
+    Page<TCustomer> findAllByCustnameContaining(String custname, Pageable pageable);
+
+
+    Integer countByCardno(String cardno);
+
+    Integer countByBankcardno(String bankcardno);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
new file mode 100644
index 0000000..4113575
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
@@ -0,0 +1,100 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_CUSTOMER")
+@SequenceGenerator(name="SEQ_CUSTOMER",sequenceName="SEQ_CUSTOMER",allocationSize=1,initialValue = 100000)
+public class TCustomer {
+    private Integer custid;
+    private String custname;
+    private String operid;
+    private String cardno;
+    private String idno;
+    private String bankcardno;
+    private String phone;
+    private String batchno;
+
+
+    @Id
+    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_CUSTOMER")
+    @Column(name = "custid", unique = true, nullable = false, length = 9)
+    public Integer getCustid() {
+        return custid;
+    }
+
+    public void setCustid(Integer custid) {
+        this.custid = custid;
+    }
+
+
+    @Column(name = "OPERID", length = 100)
+    public String getOperid() {
+        return operid;
+    }
+
+    public void setOperid(String operid) {
+        this.operid = operid;
+    }
+
+
+    @Column(name = "CARDNO", length = 30)
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+
+    @Column(name = "IDNO", length = 20)
+    public String getIdno() {
+        return idno;
+    }
+
+    public void setIdno(String idno) {
+        this.idno = idno;
+    }
+
+
+    @Column(name = "BANKCARDNO", length = 30)
+    public String getBankcardno() {
+        return bankcardno;
+    }
+
+    public void setBankcardno(String bankcardno) {
+        this.bankcardno = bankcardno;
+    }
+
+
+    @Column(name = "BATCHNO", length = 14)
+    public String getBatchno() {
+        return batchno;
+    }
+
+    public void setBatchno(String batchno) {
+        this.batchno = batchno;
+    }
+
+
+    @Column(name = "CUSTNAME", length = 30)
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+
+    @Column(name = "PHONE", length = 11)
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
new file mode 100644
index 0000000..661b328
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.restaurant.service;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.restaurant.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
+import com.supwisdom.dlpay.restaurant.domain.TCustomer;
+import com.supwisdom.dlpay.restaurant.domain.TDevice;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+public interface CustomerService {
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    PageResult<TCustomer> getCustomerByCustname(CustomerSearchBean param);
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult saveCustomer(TCustomer customer);
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult deleteCustomer(Integer custid);
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult importFile(MultipartFile file, HttpServletRequest request) throws Exception;
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
new file mode 100644
index 0000000..67b05ad
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
@@ -0,0 +1,114 @@
+package com.supwisdom.dlpay.restaurant.service.impl;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.util.ImportExcelUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.restaurant.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.restaurant.dao.CustomerDao;
+import com.supwisdom.dlpay.restaurant.domain.TCustomer;
+import com.supwisdom.dlpay.restaurant.service.CustomerService;
+import org.springframework.beans.factory.annotation.Autowired;
+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.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+
+@Service
+public class CustomerServiceImpl implements CustomerService {
+
+    @Autowired
+    private CustomerDao customerDao;
+
+
+
+    @Override
+    public PageResult<TCustomer> getCustomerByCustname(CustomerSearchBean param) {
+        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+                , Sort.by("custid"));
+        if (null != param.getCustname()) {
+            return new PageResult<>(customerDao.findAllByCustnameContaining(param.getCustname(), pageable));
+        }
+        return new PageResult<>(customerDao.findAll(pageable));
+    }
+    @Override
+    public JsonResult saveCustomer(TCustomer customer) {
+
+        customerDao.save(customer);
+        return JsonResult.ok("成功");
+    }
+
+    @Override
+    public JsonResult deleteCustomer(Integer custid) {
+
+        customerDao.deleteById(custid);
+        return JsonResult.ok("成功");
+    }
+
+
+
+
+    @Override
+    public JsonResult importFile(MultipartFile file, HttpServletRequest request) throws Exception {
+        String fname = file.getOriginalFilename();
+        if (!fname.endsWith(".xls") && !fname.endsWith(".xlsx")) {
+
+            return JsonResult.error("文件格式错误,请选择excel文件格式(.xls/.xlsx)");
+        }
+
+        List<TCustomer> sList = new ArrayList<>();
+//    InputStream excelstream = new FileInputStream(savePath+"/"+fname);
+        InputStream excelstream = file.getInputStream();
+        List<Object[][]> oList = null;
+        if (fname.endsWith(".xls")) {
+            oList = ImportExcelUtil.getIntegralData(excelstream);//2003版本
+        } else {
+            oList = ImportExcelUtil.getIntegralData07(excelstream);//2007版本以上
+        }
+
+        String msg = "";
+        for (Object[][] data : oList) {
+            for (int i = 1; i < data.length; i++) {
+
+                if (StringUtil.isEmpty((String) data[i][0]) || StringUtil.isEmpty((String) data[i][1]) || StringUtil.isEmpty((String) data[i][2])) {
+                    msg = msg + "第" + i + "行，关键字段缺失。<br/>";
+                } else if (customerDao.countByCardno((String) data[i][1]) >0) {
+                    msg = msg + "第" + i + "行，改市名卡已存在。<br/>";
+                }
+                else{
+                    TCustomer d=new TCustomer();
+                    d.setCustname((String) data[i][0]);
+                    d.setCardno((String) data[i][1]);
+                    d.setBankcardno((String) data[i][2]);
+                    if(null!=data[i][3]){
+                        Long p=(Long) data[i][3];
+                        d.setPhone(p.toString());
+                    }
+                    sList.add(d);
+                }
+            }
+        }
+        /*resp.setCode(Code.SUCCESS);
+        // resp.setMsg("成功导入了"+sList.size()+"条信息");
+        resp.setMsg(String.format(Locale.CHINESE, msg));
+        return resp;*/
+        if(StringUtil.isEmpty(msg)){
+            for(TCustomer d:sList){
+                saveCustomer(d);
+            }
+
+            return JsonResult.ok("成功导入"+sList.size()+"条信息");
+        }
+        return JsonResult.error(String.format(Locale.CHINESE, msg));
+    }
+
+
+}
diff --git a/src/main/resources/templates/restaurant/customer/form.html b/src/main/resources/templates/restaurant/customer/form.html
new file mode 100644
index 0000000..81e569e
--- /dev/null
+++ b/src/main/resources/templates/restaurant/customer/form.html
@@ -0,0 +1,98 @@
+
+<form id="form" lay-filter="form" class="layui-form model-form">
+    <input name="custid" id="custid" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label">姓名</label>
+        <div class="layui-input-block">
+            <input name="custname" placeholder="请输入" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|custname" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">市名卡号</label>
+        <div class="layui-input-block">
+            <input name="cardno" placeholder="请输入" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|number" required/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">银行卡号</label>
+        <div class="layui-input-block">
+            <input name="bankcardno" placeholder="请输入" type="text" class="layui-input" maxlength="30"
+                   lay-verify="required|number" required/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">手机号</label>
+        <div class="layui-input-block">
+            <input name="phone"  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');
+
+
+        var url = '[[@{/customer/add}]]';
+        // 回显user数据
+        var dev = admin.getTempData('t_cus');
+        if (dev) {
+            $('input[name="custid"]').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) {
+            console.log(data);
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            $.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/restaurant/customer/import.html b/src/main/resources/templates/restaurant/customer/import.html
new file mode 100644
index 0000000..72e6663
--- /dev/null
+++ b/src/main/resources/templates/restaurant/customer/import.html
@@ -0,0 +1,88 @@
+<div style="color: #0c91e5" align="right">
+    <a th:href="@{/customer/download}" class="layui-btn layui-btn-primary" style="margin: 5px">点击此处下载导入模板</a>
+</div>
+<form lay-filter="form" class="layui-form model-form" >
+    <!-- row -->
+    <div class="layui-form-item">
+        <label class="control-label">请选择导入文件<span style="color: red"> * </span></label>
+        <input type="file" name="file" id="file" placeholder="请选择xls格式文件">
+    </div>
+
+    <!-- /row -->
+    <!-- row -->
+    <div class="layui-form-item" align="center">
+        <div id="importError" style="color:red">
+        </div>
+        <div id="importInfo" >
+        </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-import" lay-submit id="importbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+
+        var url = '[[@{/customer/import}]]';
+        // 回显user数据
+
+        /* let fid = admin.getTempData("fid");
+         if (fid) {
+             form.val('form', {"fid": fid});
+         }*/
+        // 表单提交事件
+        form.on('submit(form-import)', function (data) {
+            $("#importError").html("");
+            var files = $('#file').prop('files');
+            var formData = new FormData();
+            $.each(files, function (i, file) {
+
+                formData.append('file', file);
+            });
+            console.log(formData);
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            debugger
+            $.ajax({
+                type: "POST",
+                url: url,
+                dataType: 'json',
+                processData:false,
+                contentType: false,
+                data: formData,
+                headers: {
+                    'Accept': 'application/json',
+                    'X-CSRF-TOKEN': token,
+                },
+                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 {
+                        $("#importError").html("导入结束，导入失败信息:<br/>" + result.msg);
+
+                        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/restaurant/customer/index.html b/src/main/resources/templates/restaurant/customer/index.html
new file mode 100644
index 0000000..5d0a890
--- /dev/null
+++ b/src/main/resources/templates/restaurant/customer/index.html
@@ -0,0 +1,131 @@
+<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>
+            <button id="btn-import" class="layui-btn icon-btn" ><i class="layui-icon"></i>批量导入</button>
+
+        </div>
+        <table class="layui-table" id="table" lay-filter="table"></table>
+    </div>
+</div>
+
+
+<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: '[[@{/customer/list}]]',
+            page: true,
+            cols: [
+                [
+                    {field: 'custid', title: '客户号',width: 140, sort: true},
+                    {field: 'custname', sort: true, width: 150, title: '客户姓名'},
+                    {field: 'cardno', sort: true, width: 150, title: '市名卡号'},
+                    {field: 'phone', sort: true, width: 200, title: '联系电话'},
+                    {field: 'bankcardno', sort: true, width: 200, title: '银行卡号'},
+                    {
+                        field: 'custid', 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> '+
+                                ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></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();
+        });
+        $('#btn-import').click(function () {
+            showDownload();
+        });
+        let showDownload = function () {
+            let title ='导入';
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/customer/loadimport}]]',
+                finish: function () {
+                    table.reload('table', {});
+                }
+            });
+        };
+        let showModel = function (data) {
+            let title = data ? '修改人员信息' : '添加人员信息';
+            admin.putTempData('t_cus', data);
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/customer/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) {
+            console.log(data);
+            layer.confirm('确定要删除吗？', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('[[@{/customer/delete}]]', {
+                    custid: data.custid,
+                    _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});
+                });
+            });
+        };
+
+    });
+</script>
diff --git a/src/main/resources/templates/restaurant/device/import.html b/src/main/resources/templates/restaurant/device/import.html
index 9552061..56b8eac 100644
--- a/src/main/resources/templates/restaurant/device/import.html
+++ b/src/main/resources/templates/restaurant/device/import.html
@@ -1,5 +1,5 @@
 <div style="color: #0c91e5" align="right">
-    <a th:href="@{/device/download}">点击此处下载导入模板</a>
+    <a th:href="@{/device/download}" class="layui-btn layui-btn-primary" style="margin: 5px">点击此处下载导入模板</a>
 </div>
 <form lay-filter="form" class="layui-form model-form" >
     <!-- row -->
diff --git a/src/main/resources/templates/restaurant/device/index.html b/src/main/resources/templates/restaurant/device/index.html
index 2d5b42e..1cc4d60 100644
--- a/src/main/resources/templates/restaurant/device/index.html
+++ b/src/main/resources/templates/restaurant/device/index.html
@@ -68,8 +68,9 @@
             let title ='导入';
             admin.popupCenter({
                 title: title,
-                path: '/device/loadimport',
+                path: '[[@{/device/loadimport}]]',
                 finish: function () {
+                    table.reload('table', {});
                 }
             });
         };
