diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
index 76433cf..75f4f18 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -14,8 +14,8 @@
 public class TOperator implements UserDetails {
   private static final long serialVersionUID = 2148742269021236587L;
   @Id
-  @GenericGenerator(name = "idGenerator", strategy = "uuid")
-  @GeneratedValue(generator = "idGenerator")
+  /*@GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")*/
   @Column(name = "OPERID", nullable = false, length = 32)
   private String operid;
 
@@ -53,8 +53,11 @@
   private String regionid;
   @Transient
   private String roleids;
+  @Column(name = "FOPERID",length = 32)
+  private String foperid;
+  @Column(name= "REALNAME",length = 16)
+  private String realname;
 
-  private TOperator father;
 
   @Transient
   private Collection<? extends GrantedAuthority> authorities;  //权限
@@ -67,21 +70,25 @@
     this.opername = opername;
   }
 
-  public TOperator(String opercode, String opertype, String opername, String operpwd, String status, String sex, String mobile, String email, String opendate, String closedate, Collection<? extends GrantedAuthority> authorities) {
-    this.opercode = opercode;
-    this.opertype = opertype;
-    this.opername = opername;
-    this.operpwd = operpwd;
-    this.status = status;
-    this.sex = sex;
-    this.mobile = mobile;
-    this.email = email;
-    this.opendate = opendate;
-    this.closedate = closedate;
-    this.authorities = authorities;
-  }
+    public TOperator(String opercode, String opertype, String opername, String operpwd, String status, String sex, String mobile, String email, String opendate, String closedate, String regionid, String roleids, String foperid, String realname, Collection<? extends GrantedAuthority> authorities) {
+        this.opercode = opercode;
+        this.opertype = opertype;
+        this.opername = opername;
+        this.operpwd = operpwd;
+        this.status = status;
+        this.sex = sex;
+        this.mobile = mobile;
+        this.email = email;
+        this.opendate = opendate;
+        this.closedate = closedate;
+        this.regionid = regionid;
+        this.roleids = roleids;
+        this.foperid = foperid;
+        this.realname = realname;
+        this.authorities = authorities;
+    }
 
-  public String getOperid() {
+    public String getOperid() {
     return operid;
   }
 
@@ -216,14 +223,20 @@
     this.roleids = roleids;
   }
 
-  @ManyToOne(fetch = FetchType.EAGER)
-  @JoinColumn(name = "foperid")
-  public TOperator getFather() {
-    return father;
+  public String getFoperid() {
+    return foperid;
   }
 
-  public void setFather(TOperator father) {
-    this.father = father;
+  public void setFoperid(String foperid) {
+    this.foperid = foperid;
+  }
+
+  public String getRealname() {
+    return realname;
+  }
+
+  public void setRealname(String realname) {
+    this.realname = realname;
   }
 
   public String getRegionid() {
@@ -233,4 +246,5 @@
   public void setRegionid(String regionid) {
     this.regionid = regionid;
   }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/OperatorBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/OperatorBean.java
new file mode 100644
index 0000000..a3e7b84
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/OperatorBean.java
@@ -0,0 +1,85 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class OperatorBean {
+    private String operid;
+    private String opername;
+    private String opercode;
+    private String opertype;
+    private String roleid;
+    private String mobile;
+    private String email;
+    private String realname;
+    private String regionid;
+
+    public String getOperid() {
+        return operid;
+    }
+
+    public void setOperid(String operid) {
+        this.operid = operid;
+    }
+
+    public String getOpername() {
+        return opername;
+    }
+
+    public void setOpername(String opername) {
+        this.opername = opername;
+    }
+
+    public String getOpercode() {
+        return opercode;
+    }
+
+    public void setOpercode(String opercode) {
+        this.opercode = opercode;
+    }
+
+    public String getOpertype() {
+        return opertype;
+    }
+
+    public void setOpertype(String opertype) {
+        this.opertype = opertype;
+    }
+
+    public String getRoleid() {
+        return roleid;
+    }
+
+    public void setRoleid(String roleid) {
+        this.roleid = roleid;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getRealname() {
+        return realname;
+    }
+
+    public void setRealname(String realname) {
+        this.realname = realname;
+    }
+
+    public String getRegionid() {
+        return regionid;
+    }
+
+    public void setRegionid(String regionid) {
+        this.regionid = regionid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/OperatorListBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/OperatorListBean.java
new file mode 100644
index 0000000..9417cb4
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/OperatorListBean.java
@@ -0,0 +1,99 @@
+package com.supwisdom.dlpay.system.bean;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class OperatorListBean {
+    @Id
+    private String operid;
+    private String realname;
+    private String opername;
+    private String opertype;
+    private String roleid;
+    private String rolename;
+    private String regionid;
+    private String regionname;
+    private String mobile;
+    private String foperid;
+
+    public String getOperid() {
+        return operid;
+    }
+
+    public void setOperid(String operid) {
+        this.operid = operid;
+    }
+
+    public String getRealname() {
+        return realname;
+    }
+
+    public void setRealname(String realname) {
+        this.realname = realname;
+    }
+
+    public String getOpername() {
+        return opername;
+    }
+
+    public void setOpername(String opername) {
+        this.opername = opername;
+    }
+
+    public String getOpertype() {
+        return opertype;
+    }
+
+    public void setOpertype(String opertype) {
+        this.opertype = opertype;
+    }
+
+    public String getRoleid() {
+        return roleid;
+    }
+
+    public void setRoleid(String roleid) {
+        this.roleid = roleid;
+    }
+
+    public String getRolename() {
+        return rolename;
+    }
+
+    public void setRolename(String rolename) {
+        this.rolename = rolename;
+    }
+
+    public String getRegionid() {
+        return regionid;
+    }
+
+    public void setRegionid(String regionid) {
+        this.regionid = regionid;
+    }
+
+    public String getRegionname() {
+        return regionname;
+    }
+
+    public void setRegionname(String regionname) {
+        this.regionname = regionname;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getFoperid() {
+        return foperid;
+    }
+
+    public void setFoperid(String foperid) {
+        this.foperid = foperid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
index b1599d1..3d063fb 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
@@ -3,23 +3,32 @@
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.domain.*;
 import com.supwisdom.dlpay.framework.security.OperUtil;
-import com.supwisdom.dlpay.framework.util.PageResult;
-import com.supwisdom.dlpay.framework.util.StringUtil;
-import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.framework.util.*;
 import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
 import com.supwisdom.dlpay.system.bean.LogBean;
+import com.supwisdom.dlpay.system.bean.OperatorBean;
 import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
+import com.supwisdom.dlpay.system.domain.TDictionaryId;
+import com.supwisdom.dlpay.system.domain.TRegion;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.system.service.ManagerService;
 import com.supwisdom.dlpay.system.service.OperatorService;
 import com.supwisdom.dlpay.system.service.RoleService;
+import com.supwisdom.dlpay.system.service.SystemService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 
 @Controller
@@ -218,4 +227,190 @@
         operatorService.saveOperator(operator);
         return JsonResult.ok("密码修改成功，请重新登录");
     }
+
+    @Autowired
+    ManagerService managerService;
+    @Autowired
+    SystemService systemService;
+
+
+    @RequestMapping("/operatorindex")
+    public String operatorindex(){
+        return "system/operator";
+    }
+
+    /**
+     * 根据查询条件分页获取管理员列表
+     * @param request
+     * @param response
+     * @param pageNo
+     * @param pageSize
+     * @param operid
+     * @param realname
+     * @param operUser
+     * @return
+     */
+    @RequestMapping("/loadOperatorList")
+    @ResponseBody
+    public Map loadRegionList(HttpServletRequest request,
+                              HttpServletResponse response,
+                              @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                              @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                              @RequestParam(value = "operid", required = false, defaultValue = "") String operid,
+                              @RequestParam(value = "realname", required = false, defaultValue = "") String realname,
+                              @AuthenticationPrincipal TOperator operUser){
+        Map map = new HashMap();
+        try{
+            Pagination page = managerService.getOperatorList(operid, realname, pageNo, pageSize);
+            map.put("PageResult", page);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 删除注销管理员
+     * @param operid
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping("/deleteOperator")
+    @ResponseBody
+    public Map deleteOperator(@RequestParam(value = "operid") String operid,
+                            HttpServletRequest request, HttpServletResponse response){
+        Map map = new HashMap();
+        String message="";
+        try{
+            boolean flag = managerService.deleteOperatorById(operid);
+            if (flag==false){
+                message="删除区域失败!";
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            message="删除区域出错!";
+        }
+        map.put("message", message);
+        return map;
+    }
+
+    /**
+     * 获取管理员填充数据
+     * @param operid
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/loadOperatorForUpdate")
+    public Map loadOperatorForUpdate(@RequestParam(value = "operid") String operid,
+                                   @AuthenticationPrincipal TOperator operUser){
+        Map map = new HashMap();
+        try {
+            TOperator operator = managerService.getOperatorById(operid);
+            map.put("operator",operator);
+            if (operator!=null){
+                TRole operRole = managerService.getOperRoleById(operid);
+                map.put("operatorroleid", operRole.getRoleId());
+            }
+            List<TDictionaryId> opertypes = systemService.findOpertypes(operUser.getOpertype());
+            map.put("opertypes", opertypes);
+
+            List<TRole> roles = roleService.findAllRoles();
+            map.put("roles", roles);
+
+            List<TRegion> regions = systemService.getAllRegions();
+            map.put("regions", regions);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 保存操作员
+     * @param postData
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/addOperator", method = {RequestMethod.POST})
+    public Map addOperator (@RequestBody OperatorBean postData,@AuthenticationPrincipal TOperator operUser){
+        Map map = new HashMap();
+        try{
+            TOperator operatorById = managerService.getOperatorById(postData.getOperid());
+            if (operatorById!=null){
+                map.put("errStr", "操作员编号已经存在，请修改！");
+                return map;
+            }
+            TOperator operator = new TOperator();
+            operator.setOperid(postData.getOperid());
+            operator.setOpername(postData.getOpername());
+            operator.setOpercode(postData.getOpercode());
+            operator.setOpertype(postData.getOpertype());
+            BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+            operator.setOperpwd(encoder.encode(WebConstant.OPERPWD_DEFAULT));
+            operator.setStatus(TradeDict.STATUS_NORMAL);
+            operator.setEmail(postData.getEmail());
+            operator.setMobile(postData.getMobile());
+            operator.setOpendate(DateUtil.getNow("yyyyMMdd"));
+            operator.setRealname(postData.getRealname());
+            operator.setFoperid(operUser.getOperid());
+            operator.setRegionid(postData.getRegionid());
+
+            managerService.saveOperator(operator);
+
+            TOperRole operRole = new TOperRole();
+            operRole.setOperid(postData.getOperid());
+            operRole.setRoleId(postData.getRoleid());
+            managerService.saveOperRole(operRole);
+            map.put("errStr", "");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("errStr", "保存操作员失败!");
+        }
+        return map;
+    }
+
+    /**
+     * 修改操作员
+     * @param postData
+     * @param operUser
+     * @return
+     */
+    @RequestMapping(value = "/updateOperator", method = {RequestMethod.POST})
+    @ResponseBody
+    public Map updateOperator(@RequestBody OperatorBean postData,@AuthenticationPrincipal TOperator operUser){
+        Map map = new HashMap();
+        try {
+            if (postData == null) {
+                map.put("errStr", "请先选择操作员，然后再修改！");
+                return map;
+            }
+
+            TOperator operator = managerService.getOperatorById(postData.getOperid());
+            operator.setOpername(postData.getOpername());
+            operator.setOpercode(postData.getOpercode());
+            operator.setOpertype(postData.getOpertype());
+            operator.setEmail(postData.getEmail());
+            operator.setMobile(postData.getMobile());
+            operator.setOpendate(DateUtil.getNow("yyyyMMdd"));
+            operator.setRealname(postData.getRealname());
+            operator.setFoperid(operUser.getOperid());
+            operator.setRegionid(postData.getRegionid());
+
+            TOperRole operRole = managerService.getTOperRoleByOperid(postData.getOperid());
+            operRole.setRoleId(postData.getRoleid());
+
+            managerService.updateOperator(operator);
+            managerService.updateTOperRole(operRole);
+            map.put("errStr", "");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("errStr", "操作员修改失败!");
+        }
+        return map;
+    }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java b/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
index a978e81..8b932fd 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
@@ -137,7 +137,7 @@
         } catch (Exception e) {
             e.printStackTrace();
             map.put("errStr", "保存字典失败");
-            logger.error("保存字典失败：" + e.getMessage());
+            logger.error("保存字典失败：");
         }
         return map;
     }
@@ -193,7 +193,7 @@
         } catch (Exception e) {
             e.printStackTrace();
             map.put("errStr", "修改字典失败");
-            logger.error("修改字典失败：" + e.getMessage());
+            logger.error("修改字典失败：");
         }
         return map;
     }
@@ -332,7 +332,7 @@
             map.put("errStr", "");
         }catch (Exception e){
             e.printStackTrace();
-            map.put("errStr", "保存区域失败!"+e.getMessage());
+            map.put("errStr", "保存区域失败!");
         }
         return map;
     }
@@ -370,7 +370,7 @@
             map.put("errStr", "");
         }catch (Exception e){
             e.printStackTrace();
-            map.put("errStr", "区域修改失败!"+e.getMessage());
+            map.put("errStr", "区域修改失败!");
         }
         return map;
     }
@@ -537,7 +537,7 @@
             map.put("errStr", "");
         }catch (Exception e){
             e.printStackTrace();
-            map.put("errStr", "楼栋修改失败"+e.getMessage());
+            map.put("errStr", "楼栋修改失败");
         }
         return map;
     }
@@ -566,7 +566,7 @@
 
         }catch (Exception e){
             e.printStackTrace();
-            message="删除楼栋错误"+e.getMessage();
+            message="删除楼栋错误";
         }
         map.put("message", message);
         return map;
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/DictionaryDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/DictionaryDao.java
index 5c805df..e2cc53e 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/DictionaryDao.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/DictionaryDao.java
@@ -19,6 +19,8 @@
 
     public List<TDictionaryId> findTDictionaryByType(int type);
 
+    public List<TDictionaryId> findOpertypes(String opertype);
+
     public List<TDictionaryId> findByType(int type, String dicVal);
 
     public TDictionary updateDictionary(String dicttype, String dicttypename, String dictval, String dictcaption, String oriengaltype, String oriengalval);
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/ManagerDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/ManagerDao.java
new file mode 100644
index 0000000..a594e37
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/ManagerDao.java
@@ -0,0 +1,27 @@
+package com.supwisdom.dlpay.system.dao;
+
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.domain.TRole;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+public interface ManagerDao {
+
+    Pagination getOperatorList(String operid, String realname, int pageNo, int pageSize);
+
+    boolean updateOperatorStatusById(String operid);
+
+    TOperator getOperatorById(String operid);
+
+    TRole getOperRoleById(String operid);
+
+    boolean saveOperator(TOperator bean);
+
+    boolean updateOperator(TOperator bean);
+
+    boolean saveOperRole(TOperRole bean);
+
+    TOperRole getTOperRoleByOperid(String operid);
+
+    boolean updateTOperRole(TOperRole bean);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java
index 5887a6a..ca8e547 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java
@@ -13,6 +13,7 @@
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.persistence.Query;
+import javax.persistence.TypedQuery;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -128,6 +129,24 @@
 
     @Transactional
     @Override
+    public List<TDictionaryId> findOpertypes(String opertype) {
+        String sql = "select bean.id from TDictionary bean where bean.id.dicttype=1";
+        if (opertype.equals("P")){
+            sql +=" and bean.id.dictval<>'P'";
+        }else if (opertype.equals("S")){
+            sql +=" and bean.id.dictval<>'P' and bean.id.dictval<>'S'";
+        }else if (opertype.equals("H")){
+            sql +=" and bean.id.dictval<>'P' and bean.id.dictval<>'S' and bean.id.dictval<>'H'";
+        }else {
+            return null;
+        }
+        TypedQuery<TDictionaryId> query = entityManager.createQuery(sql, TDictionaryId.class);
+        List<TDictionaryId> list = query.getResultList();
+        return list;
+    }
+
+    @Transactional
+    @Override
     public List<TDictionaryId> findByType(int type, String dicVal) {
         String sql = "select bean.id from TDictionary bean where bean.id.dicttype=?1 and bean.id.dictval = ?2";
         Query query = entityManager.createQuery(sql,TDictionaryId.class);
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/ManagerDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/ManagerDaoImpl.java
new file mode 100644
index 0000000..5c2b501
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/ManagerDaoImpl.java
@@ -0,0 +1,203 @@
+package com.supwisdom.dlpay.system.dao.impl;
+
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.domain.TRole;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.OperatorListBean;
+import com.supwisdom.dlpay.system.dao.ManagerDao;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.util.List;
+
+@Repository
+public class ManagerDaoImpl implements ManagerDao {
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getOperatorList(String operid, String realname, int pageNo, int pageSize) {
+        String sql = "select a.operid,a.opername,a.opertype,a.realname,a.regionid,a.mobile,a.foperid,c.roleid,c.rolename,d.regionname " +
+                " from Tb_Operator a " +
+                " left join tb_oper_role b on a.operid = b.operid " +
+                " left join tb_role c on b.roleid = c.roleid " +
+                " left join tb_region d on a.regionid = d.regionid " +
+                " where 1>0 and a.status='normal' ";
+        if (!StringUtil.isEmpty(operid)){
+            sql += " and a.operid = :operid ";
+        }
+
+        if (!StringUtil.isEmpty(realname)){
+            sql += " and a.realname like :realname ";
+        }
+
+        sql += " order by a.operid";
+        Query query = entityManager.createNativeQuery(sql, OperatorListBean.class);
+
+        if (!StringUtil.isEmpty(operid)){
+            query.setParameter("operid", operid);
+        }
+
+        if (!StringUtil.isEmpty(realname)){
+            query.setParameter("realname", "%"+realname+"%");
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<OperatorListBean> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getOperatorListCount(operid, realname);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getOperatorListCount(String operid, String realname){
+        String sql = "select count(*) from tb_operator a " +
+                " left join tb_oper_role b on a.operid = b.operid " +
+                " left join tb_role c on b.roleid = c.roleid " +
+                " left join tb_region d on a.regionid = d.regionid " +
+                "where a.status='normal' ";
+
+        if (!StringUtil.isEmpty(operid)){
+            sql += " and a.operid = :operid ";
+        }
+
+        if (!StringUtil.isEmpty(realname)){
+            sql += " and a.realname like :realname ";
+        }
+
+        Query query = entityManager.createNativeQuery(sql);
+        if (!StringUtil.isEmpty(operid)){
+            query.setParameter("operid", operid);
+        }
+
+        if (!StringUtil.isEmpty(realname)){
+            query.setParameter("realname", "%"+realname+"%");
+        }
+        int cnt=0;
+        List list = query.getResultList();
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+
+    @Transactional
+    @Override
+    public boolean updateOperatorStatusById(String operid) {
+        boolean flag = false;
+        try {
+            String sql = "update tb_operator set status = 'closed' where operid = :operid";
+            Query query = entityManager.createNativeQuery(sql);
+            query.executeUpdate();
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    @Transactional
+    @Override
+    public TOperator getOperatorById(String operid) {
+        String sql = "select bean from TOperator bean where bean.status='normal' and bean.operid=:operid ";
+        TypedQuery<TOperator> query = entityManager.createQuery(sql, TOperator.class);
+        query.setParameter("operid", operid);
+        List<TOperator> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public TRole getOperRoleById(String operid) {
+        String sql = "select a.roleid,a.createtime,a.editflag,a.lastsaved,a.rolecode,a.roledesc,a.rolename " +
+                " from Tb_Role a left join tb_oper_role b on a.roleid = b.roleid where b.operid=?1 ";
+        Query query = entityManager.createNativeQuery(sql, TRole.class);
+        query.setParameter(1, operid);
+        List<TRole> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveOperator(TOperator bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateOperator(TOperator bean) {
+        boolean flag=false;
+        try {
+            entityManager.merge(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveOperRole(TOperRole bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TOperRole getTOperRoleByOperid(String operid) {
+        String sql = "select bean from TOperRole bean where bean.operid=:operid";
+        TypedQuery<TOperRole> query = entityManager.createQuery(sql, TOperRole.class);
+        query.setParameter("operid", operid);
+        List<TOperRole> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateTOperRole(TOperRole bean) {
+        boolean flag=false;
+        try {
+            entityManager.merge(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/ManagerService.java b/src/main/java/com/supwisdom/dlpay/system/service/ManagerService.java
new file mode 100644
index 0000000..c7a013e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/ManagerService.java
@@ -0,0 +1,36 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.domain.TRole;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+public interface ManagerService {
+
+    //分页获取所有操作员列表
+    Pagination getOperatorList(String operid, String realname, int pageNo, int pageSize);
+
+    //根据id删除操作员 -- 实际修改状态status为close
+    boolean deleteOperatorById(String operid);
+
+    //根据id获取对应管理员
+    TOperator getOperatorById(String operid);
+
+    //根据管理员id获取其对应角色
+    TRole getOperRoleById(String operid);
+
+    //保存管理员
+    boolean saveOperator(TOperator bean);
+
+    //修改操作员
+    boolean updateOperator(TOperator bean);
+
+    //保存管理员角色
+    boolean saveOperRole(TOperRole bean);
+
+    //根据操作员id获取TOperRole
+    TOperRole getTOperRoleByOperid(String operid);
+
+    //修改ToperRole
+    boolean updateTOperRole(TOperRole bean);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java b/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
index 1bd453e..22d43c4 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
@@ -24,6 +24,9 @@
     //根据类型获取字典值
     public List<TDictionaryId> findTDictionaryByType(int type);
 
+    //根据管理员属性获取其能分配的管理员属性 sql中字典type固定为1
+    public List<TDictionaryId> findOpertypes(String opertype);
+
     //根据类型和值获取字典值
     public List<TDictionaryId> findByType(int type, String dicVal);
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/ManagerServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/ManagerServiceImpl.java
new file mode 100644
index 0000000..793769d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/ManagerServiceImpl.java
@@ -0,0 +1,61 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.domain.TRole;
+import com.supwisdom.dlpay.system.dao.ManagerDao;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.system.service.ManagerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ManagerServiceImpl implements ManagerService {
+    @Autowired
+    ManagerDao managerDao;
+
+    @Override
+    public Pagination getOperatorList(String operid, String realname, int pageNo, int pageSize) {
+        return managerDao.getOperatorList(operid, realname, pageNo, pageSize);
+    }
+
+    @Override
+    public boolean deleteOperatorById(String operid) {
+        return managerDao.updateOperatorStatusById(operid);
+    }
+
+    @Override
+    public TOperator getOperatorById(String operid) {
+        return managerDao.getOperatorById(operid);
+    }
+
+    @Override
+    public TRole getOperRoleById(String operid) {
+        return managerDao.getOperRoleById(operid);
+    }
+
+    @Override
+    public boolean saveOperator(TOperator bean) {
+        return managerDao.saveOperator(bean);
+    }
+
+    @Override
+    public boolean updateOperator(TOperator bean) {
+        return managerDao.updateOperator(bean);
+    }
+
+    @Override
+    public boolean saveOperRole(TOperRole bean) {
+        return managerDao.saveOperRole(bean);
+    }
+
+    @Override
+    public TOperRole getTOperRoleByOperid(String operid) {
+        return managerDao.getTOperRoleByOperid(operid);
+    }
+
+    @Override
+    public boolean updateTOperRole(TOperRole bean) {
+        return managerDao.updateTOperRole(bean);
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
index f729371..a571bc6 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
@@ -56,6 +56,11 @@
     }
 
     @Override
+    public List<TDictionaryId> findOpertypes(String opertype) {
+        return dictionaryDao.findOpertypes(opertype);
+    }
+
+    @Override
     public List<TDictionaryId> findByType(int type, String dicVal) {
         return dictionaryDao.findByType(type, dicVal);
     }
diff --git a/src/main/resources/templates/system/operator.html b/src/main/resources/templates/system/operator.html
new file mode 100644
index 0000000..2279473
--- /dev/null
+++ b/src/main/resources/templates/system/operator.html
@@ -0,0 +1,523 @@
+<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 id="operatorapp">
+            <el-form :inline="true" ref="operatorform" :model="operatorform" data-parsley-validate class="form-horizontal form-label-left">
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">操作员编号:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="operatorform.operid"></el-input>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">姓名:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="operatorform.realname"></el-input>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-3">
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button class="btn btn-primary" type="button" @click="addOperator">添加操作员</button>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singletable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        max-height="2000"
+                        border
+                        style="width: 100%">
+                    <el-table-column
+                            prop="operid"
+                            label="操作员号"
+                            width="140">
+                    </el-table-column>
+                    <el-table-column
+                            prop="realname"
+                            label="姓名"
+                            width="140">
+                    </el-table-column>
+                    <el-table-column
+                            prop="opertype"
+                            label="操作员类别"
+                            width="140"
+                            :formatter="typeform">
+                    </el-table-column>
+                    <el-table-column
+                            prop="rolename"
+                            label="角色"
+                            width="140">
+                    </el-table-column>
+                    <el-table-column
+                            prop="mobile"
+                            label="联系电话"
+                            width="180">
+                    </el-table-column>
+                    <el-table-column
+                            prop="regionname"
+                            label="管辖区域"
+                            width="180">
+                    </el-table-column>
+                    <el-table-column
+                            fixed="right"
+                            label="操作"
+                            width="179">
+                        <template scope="scope">
+                            <button type="button" class="btn btn-info btn-xs" title="编辑操作员" @click="editOperator(scope.row.operid)">编辑</button>
+                            <button type="button" class="btn btn-success btn-xs" title="重置密码" @click="resetPwd(scope.row.operid)">重置</button>
+                            <button type="button" class="btn btn-danger btn-xs" title="删除操作员" @click="delOperator(scope.row.operid)">删除</button>
+                            <button type="button" class="btn btn-info btn-xs" title="分配楼栋"
+                                    @click="allocationBulding(scope.row.deviceid)" v-if="scope.row.opertype=='L'">分配楼栋
+                            </button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <div class="clearfix"></div>
+                <el-pagination
+                        @size-change="handleSizeChange"
+                        @current-change="currPageChange"
+                        :current-page="currPage"
+                        :page-sizes="[10, 20, 50, 100]"
+                        :page-size="pageSize"
+                        layout="prev, pager, next,sizes, jumper,total"
+                        :total="totSize">
+                </el-pagination>
+            </template>
+
+            <el-dialog :title="operatortitile" :visible.sync="dialogFormVisible"  >
+                <el-form ref="operatorDiaForm" :model="operatorDiaForm" :rules="rules" label-width="36%" >
+                    <el-form-item label="操作员编号:" prop="operid">
+                        <div class="el-col el-col-15">
+                            <div class="el-input" style="width: 187px;">
+                                <el-input v-model="operatorDiaForm.operid">
+                                    <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                                </el-input>
+                            </div>
+                        </div>
+                    </el-form-item>
+
+                    <el-form-item label="登录名:" prop="opercode">
+                        <div class="el-col el-col-18">
+                            <div class="el-input" style="width: 187px;">
+                                <el-input v-model="operatorDiaForm.opercode">
+                                    <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                                </el-input>
+                            </div>
+                        </div>
+                    </el-form-item>
+
+                    <el-form-item label="操作员名称:" prop="opername">
+                        <div class="el-col el-col-18">
+                            <div class="el-input" style="width: 187px;">
+                                <el-input v-model="operatorDiaForm.opername">
+                                    <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                                </el-input>
+                            </div>
+                        </div>
+                    </el-form-item>
+
+                    <el-form-item label="操作员类别:" prop="opertype">
+                        <el-col :span="18">
+                            <el-select v-model="operatorDiaForm.opertype" style="width: 187px;"
+                                       filterable
+                                       @Change="opertypeChange"
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="opertype in opertypes"
+                                        :key="opertype.value"
+                                        :label="opertype.label"
+                                        :value="opertype.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="角色:" prop="roleid">
+                        <el-col :span="18">
+                            <el-select v-model="operatorDiaForm.roleid"
+                                       style="width: 187px;" clearable
+                                       filterable
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="roleid in roles"
+                                        :key="roleid.value"
+                                        :label="roleid.label"
+                                        :value="roleid.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="管辖区域:" prop="regionid">
+                        <el-col :span="18">
+                            <el-select v-model="operatorDiaForm.regionid"
+                                       style="width: 187px;" clearable
+                                       filterable
+                                       :disabled="regionDis"
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="regionid in regions"
+                                        :key="regionid.value"
+                                        :label="regionid.label"
+                                        :value="regionid.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="联系方式:" prop="mobile">
+                        <el-col :span="18">
+                            <el-input v-model.number="operatorDiaForm.mobile"  style="width: 187px;">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="邮箱:" prop="email">
+                        <el-col :span="18">
+                            <el-input v-model.number="operatorDiaForm.email"  style="width: 187px;">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="姓名:" prop="realname">
+                        <el-col :span="18">
+                            <el-input v-model.number="operatorDiaForm.realname"  style="width: 187px;">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button @click="resetForm('operatorDiaForm') ">取 消</el-button>
+                    <el-button type="primary" @click="saveOperator('operatorDiaForm')">确 定</el-button>
+                </div>
+            </el-dialog>
+        </div>
+    </div>
+</div>
+
+<script>
+    var vue = new Vue({
+        el:'#operatorapp',
+        data:{
+            tableData:[],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            currentRow: null,
+            regionDis:true,
+            operatorform:{
+                operid:'',
+                realname:''
+            },
+            roles:[],
+            dialogFormVisible: false,
+            regions:[],
+            opertypes:[],
+            operatorDiaForm:{
+                operid:'',
+                opercode:'',
+                opername:'',
+                opertype:'',
+                roleid:'',
+                regionid:'',
+                mobile:'',
+                email:'',
+                realname:''
+            },
+            rules:{
+                operid:[
+                    {required:true,message:'请输入操作员编号',trigger:'blur'},
+                ],
+                opercode:[
+                    {required:true,message:'请输入登陆名',trigger:'blur'},
+                ],
+                opername:[
+                    {required:true,message:'请输入操作员名称',trigger:'blur'},
+                ],
+                opertype: [
+                    {required: true, message: '请选择操作员类别', trigger: 'blur'}
+                ],
+                roleid: [
+                    {required: true, message: '请选择角色', trigger: 'blur'}
+                ]
+            },
+            operatortitile:'添加操作员(默认密码为123456)',
+        },
+        methods:{
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                commonQuery(this,this.operatorform.operid,this.operatorform.realname,this.currPage,val);
+                //console.log('每页条'+val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                commonQuery(this,this.operatorform.operid,this.operatorform.realname,this.currPage,this.pageSize);
+                //console.log('当前页:'+val);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            query:function(){
+                this.pagesize=10;
+                this.currPage=1;
+                commonQuery(this,this.operatorform.operid,this.operatorform.realname,this.currPage,this.pageSize);
+            },
+            addOperator:function () {
+                getFillData(this,"-1");
+                this.dialogFormVisible = true;
+                this.operatortitile="添加操作员(默认密码为123456)"
+            },
+            delOperator:function(operid){
+                deletedata(operid);
+            },
+            editOperator:function(operid){
+                getFillData(this,operid);
+                this.dialogFormVisible = true;
+                this.operatortitile="修改操作员(默认密码为123456)"
+            },
+            resetForm: function (formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false;
+            },
+            saveOperator:function (formName) {
+                var _that=this;
+                var vali = false;
+                this.$refs[formName].validate(
+                    function(valid){
+                        if (valid){
+                            vali = true;
+                        }else{
+                            vali=false;
+                        }
+                    });
+                if (vali==true){
+                    saveData(_that,_that.operatorDiaForm,formName);
+                }
+            },
+            opertypeChange: function (value) {
+                if (value == 'H') {
+                    this.regionDis = false;
+                } else  {
+                    this.regionDis = true;
+                }
+            },
+            typeform: function (row) {
+                if (row.opertype == 'P') {
+                    return '超级管理员';
+                }
+                else if (row.opertype == 'S') {
+                    return '系统管理员';
+                }
+                else if (row.opertype == 'H') {
+                    return '区域管理员';
+                }
+                else if (row.opertype == 'L') {
+                    return '物业管理员';
+                }
+                else {
+                    return row.opertype;
+                }
+            },
+            resetPwd:function (operid) {
+                resetpwd(operid);
+            }
+        },
+        created:function(){
+            var _self=this;
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:encodeURI("/operator/loadOperatorList"),
+                success:function(ret){
+                    //console.log(ret);
+                    _self.totSize=ret.PageResult.totalCount;
+                    _self.tableData=ret.PageResult.list;
+                }
+            })
+        }
+    })
+
+    function refreshThisTable(){
+        $("#qrybtn").click();
+    };
+
+    function commonQuery(_self,operid,realname,pageno,pagesize){
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("/operator/loadOperatorList?operid="+operid+"&realname=" + realname + "&pageNo=" + pageno + "&pageSize=" + pagesize),
+            success: function (ret) {
+                _self.totSize = ret.PageResult.totalCount;
+                _self.tableData = ret.PageResult.list;
+                if (_self.totSize == 0) {
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+            }
+        })
+    }
+
+    function deletedata(operid){
+        layer.confirm('是否删除该操作员', {icon: 3, title:'请确认',offset:'30%'},function(index){
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"/operator/deleteOperator?operid="+operid,
+                success:function(ret){
+                    if(ret.message == undefined){
+                        layer.msg('用户认证已过期，请重新登录', {icon:2,time:1000});
+                        window.location="login";
+                        return;
+                    }
+                    if (ret.message != "") {
+                        layer.msg(ret.message, {icon: 2, time: 1000});
+                    } else {
+                        layer.msg('删除成功', {icon: 1, time: 1000});
+                        refreshThisTable();
+                    }
+                }
+            })
+        })
+    }
+
+
+    function getFillData(_self, id) {
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("/operator/loadOperatorForUpdate?operid=" + id),
+            success: function (ret) {
+                var opertypelist = [];
+                var opertypes = ret.opertypes;
+                for (var i = 0; i < opertypes.length; i++) {
+                    opertypelist.push({
+                        value: opertypes[i]["dictval"],
+                        label: opertypes[i]["dictcaption"]
+                    });
+                }
+                _self.opertypes = opertypelist;
+
+                if (ret.operator != null) {
+                    _self.operatorDiaForm.operid = ret.operator.operid;
+                    _self.operatorDiaForm.opercode = ret.operator.opercode;
+                    _self.operatorDiaForm.opername = ret.operator.opername;
+                    _self.operatorDiaForm.opertype = ret.operator.opertype;
+                    _self.operatorDiaForm.roleid = ret.operatorroleid;
+                    _self.operatorDiaForm.mobile = ret.operator.mobile;
+                    _self.operatorDiaForm.email = ret.operator.email;
+                    _self.operatorDiaForm.realname = ret.operator.realname;
+                    _self.operatorDiaForm.regionid = ret.operator.regionid;
+                    if (ret.operator.opertype == 'H') {
+                        _self.regionDis = false;
+                    }
+                }
+
+                var rolelist = [];
+                var roles = ret.roles;
+                for (var j=0;j<roles.length;j++){
+                    rolelist.push({
+                        value:roles[j]["roleId"],
+                        label:roles[j]["roleName"]
+                    });
+                }
+                _self.roles = rolelist;
+
+                var regionlist = [];
+                var regions = ret.regions;
+                for (var z=0;z<regions.length;z++){
+                    regionlist.push({
+                        value:regions[z]["regionid"],
+                        label:regions[z]["regionname"]
+                    });
+                }
+                _self.regions = regionlist;
+            }
+        })
+    }
+
+
+
+    function saveData(_that,formdata,formName){
+        var url = null;
+        if(vue.operatortitile == "添加操作员(默认密码为123456)"){
+            url = encodeURI("/operator/addOperator");
+        }
+        if(vue.operatortitile == "修改操作员(默认密码为123456)"){
+            url = encodeURI("/operator/updateOperator")
+        }
+        var token=$("meta[name='_csrf_token']").attr("value");
+        $.ajax({
+            type: "POST",
+            url: url,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data: JSON.stringify(formdata),
+            success: function (data) {
+                if (data.errStr != "") {
+                    layer.msg(data.errStr, {icon: 2,time:1000});
+                } else {
+                    layer.msg('保存信息成功!', {icon: 1,time:1000});
+                    refreshThisTable();
+                    _that.$refs[formName].resetFields();
+                    _that.dialogFormVisible = false;
+                }
+            }
+        });
+    }
+
+
+    function resetpwd(operid){
+        layer.confirm('是否重置该操作员密码?', {icon: 3, title:'请确认'}, function(index){
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"/operator/resetpwd?operid="+operid,
+                success:function(ret){
+                    //console.log(ret);
+                    if(ret.code == undefined){
+                        layer.msg('用户认证已过期，请重新登录', {icon:2,time:1000});
+                        window.location="login";
+                        return;
+                    }
+                    if (ret.code != 200) {
+                        layer.msg(ret.message, {icon:2,time:1000});
+                    }else{
+                        layer.msg(ret.message, {icon: 1,time:1000});
+
+                    }
+                }
+            })
+        });
+    };
+
+
+
+</script>
\ No newline at end of file
