diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index d17198f..efb17aa 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -36,3 +36,7 @@
 #apiLogin.refresh.cron=0 0/20 * * * ?
 conference.updatestatus.cron=0 0/1 * * * ? 
 conference.uploaddtl.cron=5/10 * * * * ? 
+
+visitor.appid=wx063b94046a147a77
+visitor.secret=702d663e7685d0adc0a83673701c8878
+
diff --git a/src/main/java/com/supwisdom/dlpay/app/controller/AppController.java b/src/main/java/com/supwisdom/dlpay/app/controller/AppController.java
index 64b952a..e02521b 100644
--- a/src/main/java/com/supwisdom/dlpay/app/controller/AppController.java
+++ b/src/main/java/com/supwisdom/dlpay/app/controller/AppController.java
@@ -1,10 +1,15 @@
 package com.supwisdom.dlpay.app.controller;
 
+import com.supwisdom.dlpay.app.domain.EVisitorDtl;
+import com.supwisdom.dlpay.app.domain.VisitorConfig;
+import com.supwisdom.dlpay.app.domain.WechatResp;
 import com.supwisdom.dlpay.app.service.AppService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
 import com.supwisdom.dlpay.ncmgr.service.NcService;
 import com.supwisdom.dlpay.util.RedisUtil;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,10 +19,15 @@
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import static jxl.biff.FormatRecord.logger;
+
 @Controller
 @RequestMapping("/app")
 public class AppController {
@@ -27,13 +37,87 @@
     private AppService appService;
     @Autowired
     private NcService ncService;
-
+    @Autowired
+    private VisitorConfig visitorConfig;
+    private String wechatURL, redirect, appid, appsecret;
     @RequestMapping("/appindex")
     public String impdevindex(@RequestParam(value = "userid")String userId,Model model){
         model.addAttribute("userId", userId);
         return "apph5/remoteH5";
     }
+    @RequestMapping("/qrcodevisitor")
+    public String qrcodevisitor(@RequestParam(value = "inoutflag")String inoutflag,HttpServletRequest request, HttpServletResponse response,Model model){
+        String code = request.getParameter("code");
+        String state = request.getParameter("state");
+        getWechatConfig();
+        if (StringUtils.isEmpty(redirect)) {
+            //redirect = mainService.getPropValueByKey(WXAPIContants.WECHAT_MP_REDIRECT);
+        }
+        HttpSession session = request.getSession();
+        boolean needinfor = false;
+        if (!StringUtils.isEmpty(state) && state.contains("login")) {
+            needinfor = true;
+        }
+        int issuccess=0;
+        WechatResp resp = appService.doWechatAuth(appid, appsecret, code, needinfor);
+        if (resp != null) {
+            logger.error("openid=" + resp.getOpenid());
+            if(resp.getOpenid()!=null){
+                issuccess=1;
+            }
+            session.setAttribute("wx_openid", resp.getOpenid());
+            if (!StringUtils.isEmpty(resp.getWxid())) {
+                session.setAttribute("wx_id", resp.getWxid());
+            }
+        }
+        session.setAttribute("openmsg",resp);
+        session.setAttribute("inoutflag",inoutflag);
+        model.addAttribute("issuccess", issuccess);
+        return "apph5/appvisitor";
+    }
+    @RequestMapping("/qrcodemanage")
+    public String qrcodemanage(Model model){
+        String qrcode="";
+        String appid = visitorConfig.getAppid();
+        qrcode="1";
+        model.addAttribute("qrcode", qrcode);
+        return "apph5/getinoutflag";
+    }
+    @RequestMapping("/getqrcode")
+    public String getcode(@RequestParam(value = "inoutflag")String inoutflag,Model model){
+        String qrcode="";
+        String appid = visitorConfig.getAppid();
+        qrcode="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appid+"&redirect_uri=192.168.1.117%2Fdoor%2Fapp%2Fqrcodevisitor%3finoutflag%3d"+inoutflag+"&response_type=code&scope=snsapi_userinfo&state=&connect_redirect=1#wechat_redirect";
+        model.addAttribute("qrcode", qrcode);
+        return "apph5/visitorcode";
+    }
+    @ResponseBody
+    @RequestMapping("/getvistor")
+    public Map getvistorin(HttpServletRequest request, Model model){
+        HttpSession session = request.getSession();
+        WechatResp openmsg = (WechatResp) session.getAttribute("openmsg");
+        int inoutflag = (int) session.getAttribute("inoutflag");
+        //WechatResp openmsg = new WechatResp();
+        //openmsg.setCity("上海");
+        boolean b = appService.saveOpenmsg(openmsg, inoutflag);
+        Map map=new HashMap();
 
+        if(b){
+            map.put("retcode",0);
+            map.put("retmsg","成功");
+        }else {
+            map.put("retcode",99);
+            map.put("retmsg","失败");
+        }
+        return map;
+    }
+
+
+    private void getWechatConfig() {
+        //Map<String, String> map = payMethodService.getPaymethodConfigMap("wechat_ykt");
+        appid = visitorConfig.getAppid();
+        appsecret = visitorConfig.getSecret();
+    }
     @RequestMapping("/appMintUIindex")
     public String appMintUIindex(@RequestParam(value = "userid")String userId,Model model){
         model.addAttribute("userId", userId);
diff --git a/src/main/java/com/supwisdom/dlpay/app/dao/AppDao.java b/src/main/java/com/supwisdom/dlpay/app/dao/AppDao.java
index 7d028e7..b82a5ef 100644
--- a/src/main/java/com/supwisdom/dlpay/app/dao/AppDao.java
+++ b/src/main/java/com/supwisdom/dlpay/app/dao/AppDao.java
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.app.dao;
 
 
+import com.supwisdom.dlpay.app.domain.EVisitorDtl;
+import com.supwisdom.dlpay.app.domain.EWechatAccount;
 import com.supwisdom.dlpay.app.domain.TAppDevFre;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
 
@@ -22,4 +24,13 @@
 
     //保存AppDevFre对象
     public boolean saveAppDevFre(TAppDevFre bean);
+
+
+
+    public boolean saveAccount(EWechatAccount bean);
+    public boolean saveVisitor(EVisitorDtl bean);
+    public boolean updateAccount(EWechatAccount bean);
+
+
+    public List<EWechatAccount> getAccountByOpenid(String openid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/app/dao/impl/AppDaoImpl.java b/src/main/java/com/supwisdom/dlpay/app/dao/impl/AppDaoImpl.java
index 307723a..42ac336 100644
--- a/src/main/java/com/supwisdom/dlpay/app/dao/impl/AppDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/app/dao/impl/AppDaoImpl.java
@@ -1,7 +1,10 @@
 package com.supwisdom.dlpay.app.dao.impl;
 
 import com.supwisdom.dlpay.app.dao.AppDao;
+import com.supwisdom.dlpay.app.domain.EVisitorDtl;
+import com.supwisdom.dlpay.app.domain.EWechatAccount;
 import com.supwisdom.dlpay.app.domain.TAppDevFre;
+import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
@@ -103,4 +106,53 @@
         }
         return flag;
     }
+    @Transactional
+    @Override
+    public boolean saveAccount(EWechatAccount bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+    @Transactional
+    @Override
+    public boolean saveVisitor(EVisitorDtl bean) {
+
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+    @Transactional
+    @Override
+    public boolean updateAccount(EWechatAccount bean) {
+        boolean flag = false;
+        try {
+            entityManager.merge(bean);
+            flag = true;
+        } catch (Exception e) {
+            throw  e;
+        }
+        return flag;
+    }
+    @Transactional
+    @Override
+    public List<EWechatAccount> getAccountByOpenid(String openid) {
+        String sql = "select a.* from EWechatAccount a where a.openid =? and a.status='1'";
+        Query query = entityManager.createNativeQuery(sql, EWechatAccount.class);
+        query.setParameter(1, openid);
+        List<EWechatAccount> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list;
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/app/domain/EVisitorDtl.java b/src/main/java/com/supwisdom/dlpay/app/domain/EVisitorDtl.java
new file mode 100644
index 0000000..c805a9b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/app/domain/EVisitorDtl.java
@@ -0,0 +1,162 @@
+package com.supwisdom.dlpay.app.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+/**
+ * Created by shuwei on 17/6/12.
+ */
+@Entity
+@Table(name = "E_VISITOR_DTL")
+public class EVisitorDtl {
+
+    private int id;
+    private String openid;
+    
+    private Integer status;
+    private String binddate;
+    private String nickname;
+    private String sex;
+    private String province;
+    private String city;
+    private String country;
+    private String headimgurl;
+    private String privilege;
+    private String unionid;
+    private Integer inoutflag;
+    private String transdate;
+    private String transtime;
+
+
+
+    @Id
+    @Column(name = "ID", unique = true,  nullable = false, length = 32)
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+
+
+
+    @Column(name = "OPENID",length = 128)
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    @Column(name = "STATUS", length = 1)
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+    @Column(name = "BINDDATE", length = 14)
+    public String getBinddate() {
+        return binddate;
+    }
+
+    public void setBinddate(String binddate) {
+        this.binddate = binddate;
+    }
+    @Column(name = "NICKNAME", length = 100)
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+    @Column(name = "SEX", length = 1)
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+    @Column(name = "PROVINCE", length = 60)
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+    @Column(name = "CITY", length = 60)
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+    @Column(name = "COUNTRY", length = 60)
+    public String getCountry() {
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+    @Column(name = "HEADIMGURL", length = 200)
+    public String getHeadimgurl() {
+        return headimgurl;
+    }
+
+    public void setHeadimgurl(String headimgurl) {
+        this.headimgurl = headimgurl;
+    }
+    @Column(name = "PRIVILEGE", length = 40)
+    public String getPrivilege() {
+        return privilege;
+    }
+
+    public void setPrivilege(String privilege) {
+        this.privilege = privilege;
+    }
+    @Column(name = "UNIONID", length = 128)
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+    @Column(name = "INOUTFLAG", length = 1)
+    public Integer getInoutflag() {
+        return inoutflag;
+    }
+
+    public void setInoutflag(Integer inoutflag) {
+        this.inoutflag = inoutflag;
+    }
+    @Column(name = "TRANSDATE", length = 8)
+
+    public String getTransdate() {
+        return transdate;
+    }
+
+    public void setTransdate(String transdate) {
+        this.transdate = transdate;
+    }
+    @Column(name = "TRANSTIME", length = 6)
+
+    public String getTranstime() {
+        return transtime;
+    }
+
+    public void setTranstime(String transtime) {
+        this.transtime = transtime;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/app/domain/EWechatAccount.java b/src/main/java/com/supwisdom/dlpay/app/domain/EWechatAccount.java
new file mode 100644
index 0000000..eb1947b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/app/domain/EWechatAccount.java
@@ -0,0 +1,161 @@
+package com.supwisdom.dlpay.app.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+/**
+ * Created by shuwei on 17/6/12.
+ */
+@Entity
+@Table(name = "E_WECHAT_ACCOUNT")
+public class EWechatAccount {
+
+    private String wxid;
+    private String userid;
+    private Double appkey;
+    private String openid;
+    private String stuempno;
+    private String status;
+    private String binddate;
+    private String nickname;
+    private String sex;
+    private String province;
+    private String city;
+    private String country;
+    private String headimgurl;
+    private String privilege;
+    private String unionid;
+    private String cardcode;
+
+    @Id
+    @Column(name = "WXID", unique = true,  nullable = false, length = 32)
+    public String getWxid() {
+        return wxid;
+    }
+
+    public void setWxid(String wxid) {
+        this.wxid = wxid;
+    }
+    @Column(name = "USERID", length = 32)
+    public String getUserid() {
+        return userid;
+    }
+
+    public void setUserid(String userid) {
+        this.userid = userid;
+    }
+    @Column(name = "APPKEY",  length = 32)
+    public Double getAppkey() {
+        return appkey;
+    }
+
+    public void setAppkey(Double appkey) {
+        this.appkey = appkey;
+    }
+    @Column(name = "OPENID",length = 128)
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+    @Column(name = "STUEMPNO", length = 40)
+    public String getStuempno() {
+        return stuempno;
+    }
+
+    public void setStuempno(String stuempno) {
+        this.stuempno = stuempno;
+    }
+    @Column(name = "STATUS", length = 1)
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+    @Column(name = "BINDDATE", length = 14)
+    public String getBinddate() {
+        return binddate;
+    }
+
+    public void setBinddate(String binddate) {
+        this.binddate = binddate;
+    }
+    @Column(name = "NICKNAME", length = 100)
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+    @Column(name = "SEX", length = 1)
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+    @Column(name = "PROVINCE", length = 60)
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+    @Column(name = "CITY", length = 60)
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+    @Column(name = "COUNTRY", length = 60)
+    public String getCountry() {
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+    @Column(name = "HEADIMGURL", length = 200)
+    public String getHeadimgurl() {
+        return headimgurl;
+    }
+
+    public void setHeadimgurl(String headimgurl) {
+        this.headimgurl = headimgurl;
+    }
+    @Column(name = "PRIVILEGE", length = 40)
+    public String getPrivilege() {
+        return privilege;
+    }
+
+    public void setPrivilege(String privilege) {
+        this.privilege = privilege;
+    }
+    @Column(name = "UNIONID", length = 128)
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+
+    @Column(name = "CARDCODE", length = 40)
+    public String getCardcode() {
+        return cardcode;
+    }
+
+    public void setCardcode(String cardcode) {
+        this.cardcode = cardcode;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/app/domain/EWechatConfig.java b/src/main/java/com/supwisdom/dlpay/app/domain/EWechatConfig.java
new file mode 100644
index 0000000..bb1262f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/app/domain/EWechatConfig.java
@@ -0,0 +1,106 @@
+package com.supwisdom.dlpay.app.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * Created by shuwei on 17/8/9.
+ */
+@Entity
+@Table(name = "E_WECHAT_CONFIG")
+public class EWechatConfig {
+    private String id;
+    private String appid;
+    private String secret;
+    private String shopid;
+    private String shopkey;
+    private String cardid;
+    private String accesstoken;
+    private String refreshtoken;
+    private Long tokentime;
+    private String domain;
+
+    @Id
+    @Column(name = "ID", unique = true,  nullable = false, length = 40)
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+    @Column(name = "APPID", length = 40)
+    public String getAppid() {
+        return appid;
+    }
+
+    public void setAppid(String appid) {
+        this.appid = appid;
+    }
+    @Column(name = "SECRET", length = 200)
+    public String getSecret() {
+        return secret;
+    }
+
+    public void setSecret(String secret) {
+        this.secret = secret;
+    }
+    @Column(name = "SHOPID", length = 32)
+    public String getShopid() {
+        return shopid;
+    }
+
+    public void setShopid(String shopid) {
+        this.shopid = shopid;
+    }
+    @Column(name = "SHOPKEY", length = 200)
+    public String getShopkey() {
+        return shopkey;
+    }
+
+    public void setShopkey(String shopkey) {
+        this.shopkey = shopkey;
+    }
+    @Column(name = "CARDID", length = 40)
+    public String getCardid() {
+        return cardid;
+    }
+
+    public void setCardid(String cardid) {
+        this.cardid = cardid;
+    }
+    @Column(name = "ACCESSTOKEN", length = 200)
+    public String getAccesstoken() {
+        return accesstoken;
+    }
+
+    public void setAccesstoken(String accesstoken) {
+        this.accesstoken = accesstoken;
+    }
+    @Column(name = "REFRESHTOKEN", length = 200)
+    public String getRefreshtoken() {
+        return refreshtoken;
+    }
+
+    public void setRefreshtoken(String refreshtoken) {
+        this.refreshtoken = refreshtoken;
+    }
+    @Column(name = "TOKENTIME", precision = 15,scale = 0)
+    public Long getTokentime() {
+        return tokentime;
+    }
+
+    public void setTokentime(Long tokentime) {
+        this.tokentime = tokentime;
+    }
+    @Column(name = "DOMAIN", length = 200)
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/app/domain/VisitorConfig.java b/src/main/java/com/supwisdom/dlpay/app/domain/VisitorConfig.java
new file mode 100644
index 0000000..46ea6f1
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/app/domain/VisitorConfig.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.app.domain;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class VisitorConfig {
+  @Value("${visitor.appid}")
+  private String appid;
+  @Value("${visitor.secret}")
+  private String secret;
+
+  public String getAppid() {
+    return appid;
+  }
+
+  public String getSecret() {
+    return secret;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/app/domain/WechatResp.java b/src/main/java/com/supwisdom/dlpay/app/domain/WechatResp.java
new file mode 100644
index 0000000..b592cef
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/app/domain/WechatResp.java
@@ -0,0 +1,200 @@
+package com.supwisdom.dlpay.app.domain;
+
+/**
+ * Created by shuwei on 17/6/12.
+ */
+public class WechatResp {
+    private String wxid;
+    //req
+    private String appid;
+    private String secret;
+    private String code;
+    private String grant_type;
+    //resp
+    private String access_token;
+    private Integer expires_in;
+    private String refresh_token;
+    private String openid;
+    private String scope;
+    private Integer errcode;
+    private String errmsg;
+
+    private String nickname;
+    private String sex;
+    private String province;
+    private String city;
+    private String country;
+    private String headimgurl;
+    private String unionid;
+
+    private String jsondata;
+    private String return_code;
+    private String return_msg;
+    private String err_code;
+
+
+
+    public String getAppid() {
+        return appid;
+    }
+
+    public void setAppid(String appid) {
+        this.appid = appid;
+    }
+
+    public String getSecret() {
+        return secret;
+    }
+
+    public void setSecret(String secret) {
+        this.secret = secret;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getGrant_type() {
+        return grant_type;
+    }
+
+    public void setGrant_type(String grant_type) {
+        this.grant_type = grant_type;
+    }
+
+    public String getAccess_token() {
+        return access_token;
+    }
+
+    public void setAccess_token(String access_token) {
+        this.access_token = access_token;
+    }
+
+    public Integer getExpires_in() {
+        return expires_in;
+    }
+
+    public void setExpires_in(Integer expires_in) {
+        this.expires_in = expires_in;
+    }
+
+    public String getRefresh_token() {
+        return refresh_token;
+    }
+
+    public void setRefresh_token(String refresh_token) {
+        this.refresh_token = refresh_token;
+    }
+
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public Integer getErrcode() {
+        return errcode;
+    }
+
+    public void setErrcode(Integer errcode) {
+        this.errcode = errcode;
+    }
+
+    public String getErrmsg() {
+        return errmsg;
+    }
+
+    public void setErrmsg(String errmsg) {
+        this.errmsg = errmsg;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getCountry() {
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    public String getHeadimgurl() {
+        return headimgurl;
+    }
+
+    public void setHeadimgurl(String headimgurl) {
+        this.headimgurl = headimgurl;
+    }
+
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+
+    public String getWxid() {
+        return wxid;
+    }
+
+    public void setWxid(String wxid) {
+        this.wxid = wxid;
+    }
+
+    public String getJsondata() {
+        return jsondata;
+    }
+
+    public void setJsondata(String jsondata) {
+        this.jsondata = jsondata;
+    }
+
+
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/app/service/AppService.java b/src/main/java/com/supwisdom/dlpay/app/service/AppService.java
index be11399..a2e3f94 100644
--- a/src/main/java/com/supwisdom/dlpay/app/service/AppService.java
+++ b/src/main/java/com/supwisdom/dlpay/app/service/AppService.java
@@ -1,5 +1,8 @@
 package com.supwisdom.dlpay.app.service;
 
+import com.supwisdom.dlpay.app.domain.EWechatAccount;
+import com.supwisdom.dlpay.app.domain.EWechatConfig;
+import com.supwisdom.dlpay.app.domain.WechatResp;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -23,5 +26,12 @@
     //根据用户和设备名称 查询开门设备
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
     public List<TNcDevice> findAllDevByUserIdAndDevName(String userId,String devName);
-
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public WechatResp doWechatAuth(String appid, String appsecret, String code, boolean needinfor);
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public EWechatAccount getAccountByOpenid(String openid);
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    EWechatConfig getWechatConfig();
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean saveOpenmsg(WechatResp openmsg,int inoutflag);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/app/service/impl/AppServiceImpl.java b/src/main/java/com/supwisdom/dlpay/app/service/impl/AppServiceImpl.java
index 4b864b5..597a65c 100644
--- a/src/main/java/com/supwisdom/dlpay/app/service/impl/AppServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/app/service/impl/AppServiceImpl.java
@@ -1,10 +1,12 @@
 package com.supwisdom.dlpay.app.service.impl;
 
 import com.google.gson.Gson;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
 import com.supwisdom.dlpay.app.bean.CustomerInfo;
 import com.supwisdom.dlpay.app.dao.AppDao;
-import com.supwisdom.dlpay.app.domain.TAppDevFre;
-import com.supwisdom.dlpay.app.domain.TAppDevFreId;
+import com.supwisdom.dlpay.app.domain.*;
 import com.supwisdom.dlpay.app.service.AppService;
 import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
 import com.supwisdom.dlpay.framework.util.DateUtil;
@@ -19,9 +21,12 @@
 import com.supwisdom.dlpay.ncmgr.dao.NcDeviceDao;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
 import com.supwisdom.dlpay.util.RedisUtil;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.HttpStatus;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.ws.rs.core.MediaType;
 import java.util.List;
 
 @Service
@@ -186,5 +191,113 @@
     public List<TNcDevice> findAllDevByUserIdAndDevName(String userId, String devName) {
         return appDao.findAllDevByUserIdAndDevName(userId, devName);
     }
+    @Override
+    public EWechatAccount getAccountByOpenid(String openid) {
+        if (!StringUtil.isEmpty(openid)) {
+            List list = appDao.getAccountByOpenid(openid);
+            if (null != list && list.size() > 0) {
+                return (EWechatAccount) list.get(0);
+            }
+        }
+        return null;
+    }
+    @Override
+    public EWechatConfig getWechatConfig() {
+        return new EWechatConfig();
+    }
+
+    @Override
+    public boolean saveOpenmsg(WechatResp openmsg ,int inoutflag ) {
+        EVisitorDtl eVisitorDtl=new EVisitorDtl();
+        eVisitorDtl.setInoutflag(inoutflag);
+        eVisitorDtl.setOpenid(openmsg.getOpenid());
+        eVisitorDtl.setNickname(openmsg.getNickname());
+        eVisitorDtl.setSex(openmsg.getSex());
+        eVisitorDtl.setProvince(openmsg.getProvince());
+        eVisitorDtl.setCity(openmsg.getCity());
+        eVisitorDtl.setCountry(openmsg.getCountry());
+        eVisitorDtl.setHeadimgurl(openmsg.getHeadimgurl());
+        eVisitorDtl.setUnionid(openmsg.getUnionid());
+        eVisitorDtl.setTransdate(DateUtil.getNow().substring(0,8));
+        eVisitorDtl.setTranstime(DateUtil.getNow().substring(8));
+        boolean b = appDao.saveVisitor(eVisitorDtl);
+        return b;
+    }
+
+    public WechatResp doWechatAuth(String appid, String appsecret, String code, boolean needinfor) {
+        EWechatConfig config = getWechatConfig();
+        //TODO 1.判断accesstoken是否可用
+        //TODO 2.判断refreshtoken是否可用
+        if (config == null) {
+            //logger.error("微信公众号相关信息未配置，请在表E_WECHAT_CONFIG中添加记录，其中ID默认为WECHAT");
+
+        }
+        boolean issave=false;
+        Client c = Client.create();
+        c.setConnectTimeout(20000);
+        WebResource r = c.resource("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + code + "&grant_type=authorization_code");
+        ClientResponse respClient = r.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class);
+        if (HttpStatus.SC_OK == respClient.getStatus()) {
+            String s = respClient.getEntity(String.class);
+            Gson gson = new Gson();
+            WechatResp ret = gson.fromJson(s, WechatResp.class);
+            if (ret != null) {
+                if (needinfor) {
+                    String openid = ret.getOpenid();
+                    String acctoken = ret.getAccess_token();
+                    r = c.resource("https://api.weixin.qq.com/sns/userinfo?access_token=" + acctoken + "&openid=" + openid + "&lang=zh_CN");
+                    respClient = r.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class);
+                    if (HttpStatus.SC_OK == respClient.getStatus()) {
+                        s = respClient.getEntity(String.class);
+                        WechatResp infor = gson.fromJson(s, WechatResp.class);
+                        EWechatAccount account = getAccountByOpenid(ret.getOpenid());
+                        if (account == null) {
+                            account = new EWechatAccount();
+                            issave=true;
+                        }
+                        account.setCity(infor.getCity());
+                        String nick = "";
+                        try {
+                            nick = Base64.encodeBase64String(infor.getNickname().getBytes("UTF-8"));
+                            if (nick.length() > 100) {
+                                nick = nick.substring(0, 100);
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                        account.setNickname(nick);
+                        account.setHeadimgurl(infor.getHeadimgurl());
+                        account.setSex(infor.getSex());
+                        account.setProvince(infor.getProvince());
+                        account.setCity(infor.getCity());
+                        account.setCountry(infor.getCountry());
+                        account.setOpenid(openid);
+                        account.setStatus("1");
+                        account.setBinddate(DateUtil.getNow());
+                        if(issave){
+                            boolean b = appDao.saveAccount(account);
+                            if (!b){
+                                return null;
+                            }
+                        }else {
+
+                        }
+                        infor.setJsondata(s);
+                        infor.setWxid(account.getWxid());
+                        return infor;
+                    }
+                }
+                EWechatAccount account = getAccountByOpenid(ret.getOpenid());
+                if (account != null) {
+                    ret.setWxid(account.getWxid());
+                }
+                ret.setJsondata(s);
+                return ret;
+            } else {
+                return null;
+            }
+        }
+        return null;
+    }
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/controller/VisitorManageController.java b/src/main/java/com/supwisdom/dlpay/visitormanage/controller/VisitorManageController.java
new file mode 100644
index 0000000..0d243a5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/controller/VisitorManageController.java
@@ -0,0 +1,105 @@
+package com.supwisdom.dlpay.visitormanage.controller;
+
+
+import com.google.gson.Gson;
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.bean.QueryUserParam;
+import com.supwisdom.dlpay.api.bean.UserInforResponse;
+import com.supwisdom.dlpay.customer.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.doorlist.bean.CustomerListBean;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
+import com.supwisdom.dlpay.system.domain.TCustType;
+import com.supwisdom.dlpay.system.domain.TDept;
+import com.supwisdom.dlpay.system.service.SystemService;
+import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
+import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
+import com.supwisdom.dlpay.visitormanage.domain.VisitorShowBean;
+import com.supwisdom.dlpay.visitormanage.service.VisitormanageService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Controller
+@RequestMapping("/visitor")
+public class VisitorManageController {
+
+
+    @Autowired
+    private UserProxy userProxy;
+    @Autowired
+    private SystemService systemService;
+    @Autowired
+    private VisitormanageService visitormanageService;
+
+    @RequestMapping("/index")
+    public String indexView(ModelMap model) {
+        List<TCustType> lst = systemService.findAllCusttype();
+        List<TDept> dept=systemService.findAllDept();
+        Gson gson = new Gson();
+        String deptString = gson.toJson(dept);
+        model.put("deptlist", deptString);
+        String typeString = gson.toJson(lst);
+        model.put("custtypelist", typeString);
+
+        return "visitormanage/customer/index";
+    }
+
+    @RequestMapping("/list")
+    @ResponseBody
+    public PageResult<EVisitorDtl> getDataList(@RequestParam("page") Integer pageNo,
+                                                   @RequestParam("limit") Integer pageSize,
+                                                   @RequestParam(value = "searchkey", required = false) String searchKey,
+                                                   @RequestParam(value = "inoutflag", required = false) String inoutflag,
+                                                   @RequestParam(value = "startdate", required = false) String startdate,
+                                                   @RequestParam(value = "enddate", required = false) String enddate
+    ) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            VisitorSearchBean searchBean = new VisitorSearchBean();
+            if(startdate!=null){
+                startdate=startdate.replace("-","");
+            }if(enddate!=null){
+                enddate=enddate.replace("-","");
+            }
+            searchBean.setPageNo(pageNo);
+            searchBean.setNickname(searchKey);
+            searchBean.setInoutflag(inoutflag);
+            searchBean.setStartdate(startdate);
+            searchBean.setEnddate(enddate);
+            searchBean.setPageSize(pageSize);
+            PageResult<EVisitorDtl> bean= visitormanageService.getVisitorInfoPage(searchBean);
+
+            return bean;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+    @GetMapping("/loadadd")
+    public String loadadd(Model model) {
+        List<TCustType> list=systemService.findAllCusttype();
+        model.addAttribute("typelist",list);
+        List<TDept> deptlist=systemService.findAllDept();
+        model.addAttribute("deptlist",deptlist);
+
+        return "doorlist/customer/form";
+    }
+
+
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/dao/VisitorDao.java b/src/main/java/com/supwisdom/dlpay/visitormanage/dao/VisitorDao.java
new file mode 100644
index 0000000..c9fbce8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/dao/VisitorDao.java
@@ -0,0 +1,21 @@
+package com.supwisdom.dlpay.visitormanage.dao;
+
+import com.supwisdom.dlpay.customer.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.mainservice.domain.TCustomer;
+import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
+import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
+
+import java.util.List;
+
+public interface VisitorDao {
+
+
+
+
+
+
+    public PageResult<EVisitorDtl> getVisitorInfoPage(VisitorSearchBean param);
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/dao/impl/VisitorDaoImpl.java b/src/main/java/com/supwisdom/dlpay/visitormanage/dao/impl/VisitorDaoImpl.java
new file mode 100644
index 0000000..d89f3ce
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/dao/impl/VisitorDaoImpl.java
@@ -0,0 +1,86 @@
+package com.supwisdom.dlpay.visitormanage.dao.impl;
+
+import com.supwisdom.dlpay.customer.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.mainservice.dao.CustomerDao;
+import com.supwisdom.dlpay.mainservice.domain.TCustomer;
+import com.supwisdom.dlpay.visitormanage.dao.VisitorDao;
+import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
+import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
+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.math.BigInteger;
+import java.util.List;
+
+@Repository
+public class VisitorDaoImpl implements VisitorDao {
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+
+
+    @Transactional
+    @Override
+    public PageResult<EVisitorDtl> getVisitorInfoPage(VisitorSearchBean param) {
+
+        String nickname = param.getNickname();
+        String inoutflag = param.getInoutflag();
+        String startdate = param.getStartdate();
+        String enddate = param.getEnddate();
+        String sql = "select a.id,a.openid,a.status,a.nickname,a.sex,a.province,a.city,a.country,a.inoutflag,a.transdate,a.transtime from E_VISITOR_DTL a  " +
+                " where a.status='1'   ";
+        String countSql = "select count(*) as cnt from E_VISITOR_DTL a  " +
+                " where a.status='1' ";
+
+        if (!StringUtil.isEmpty(nickname)){
+            sql += " and a.nickname like :nickname ";
+            countSql += " and a.nickname like :nickname ";
+        }if (!StringUtil.isEmpty(inoutflag)){
+            sql += " and a.inoutflag = :inoutflag ";
+            countSql += " and a.inoutflag = :inoutflag ";
+        }if (!StringUtil.isEmpty(startdate)){
+            sql += " and a.transdate >= :startdate ";
+            countSql += " and a.transdate >= :startdate ";
+        }if (!StringUtil.isEmpty(enddate)){
+            sql += " and a.transdate <= :enddate ";
+            countSql += " and a.transdate <= :enddate ";
+        }
+        sql +=" order by a.transtime desc ";
+
+
+        Query query = entityManager.createNativeQuery(sql);
+        Query countQuery = entityManager.createNativeQuery(countSql);
+        if (!StringUtil.isEmpty(nickname)){
+            query.setParameter("nickname", "%"+nickname+"%");
+            countQuery.setParameter("nickname", "%"+nickname+"%");
+        }if (!StringUtil.isEmpty(inoutflag)){
+            query.setParameter("inoutflag", Integer.parseInt(inoutflag));
+            countQuery.setParameter("inoutflag", Integer.parseInt(inoutflag));
+        }if (!StringUtil.isEmpty(startdate)){
+            query.setParameter("startdate", startdate);
+            countQuery.setParameter("startdate", startdate);
+        }if (!StringUtil.isEmpty(enddate)){
+            query.setParameter("enddate", enddate);
+            countQuery.setParameter("enddate", enddate);
+        }
+        query.setFirstResult((param.getPageNo() - 1) * param.getPageSize());
+        query.setMaxResults(param.getPageSize()); //分页显示
+
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(EVisitorDtl.class));
+        List<EVisitorDtl> list = query.getResultList();
+        BigInteger count = (BigInteger) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
+    }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorDtl.java b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorDtl.java
new file mode 100644
index 0000000..4c3d67d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorDtl.java
@@ -0,0 +1,160 @@
+package com.supwisdom.dlpay.visitormanage.domain;
+
+import javax.persistence.*;
+
+/**
+ * Created by shuwei on 17/6/12.
+ */
+@Entity
+@Table(name = "E_VISITOR_DTL")
+public class EVisitorDtl {
+
+    private int id;
+    private String openid;
+    
+    private Integer status;
+    private String binddate;
+    private String nickname;
+    private String sex;
+    private String province;
+    private String city;
+    private String country;
+    private String headimgurl;
+    private String privilege;
+    private String unionid;
+    private Integer inoutflag;
+    private String transdate;
+    private String transtime;
+
+
+
+    @Id
+    @Column(name = "ID", unique = true,  nullable = false, length = 32)
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+
+
+
+    @Column(name = "OPENID",length = 128)
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    @Column(name = "STATUS", length = 1)
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+    @Column(name = "BINDDATE", length = 14)
+    public String getBinddate() {
+        return binddate;
+    }
+
+    public void setBinddate(String binddate) {
+        this.binddate = binddate;
+    }
+    @Column(name = "NICKNAME", length = 100)
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+    @Column(name = "SEX", length = 1)
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+    @Column(name = "PROVINCE", length = 60)
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+    @Column(name = "CITY", length = 60)
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+    @Column(name = "COUNTRY", length = 60)
+    public String getCountry() {
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+    @Column(name = "HEADIMGURL", length = 200)
+    public String getHeadimgurl() {
+        return headimgurl;
+    }
+
+    public void setHeadimgurl(String headimgurl) {
+        this.headimgurl = headimgurl;
+    }
+    @Column(name = "PRIVILEGE", length = 40)
+    public String getPrivilege() {
+        return privilege;
+    }
+
+    public void setPrivilege(String privilege) {
+        this.privilege = privilege;
+    }
+    @Column(name = "UNIONID", length = 128)
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+    @Column(name = "INOUTFLAG", length = 1)
+    public Integer getInoutflag() {
+        return inoutflag;
+    }
+
+    public void setInoutflag(Integer inoutflag) {
+        this.inoutflag = inoutflag;
+    }
+    @Column(name = "TRANSDATE", length = 8)
+
+    public String getTransdate() {
+        return transdate;
+    }
+
+    public void setTransdate(String transdate) {
+        this.transdate = transdate;
+    }
+    @Column(name = "TRANSTIME", length = 6)
+
+    public String getTranstime() {
+        return transtime;
+    }
+
+    public void setTranstime(String transtime) {
+        this.transtime = transtime;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorSearchBean.java b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorSearchBean.java
new file mode 100644
index 0000000..76cd3e2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorSearchBean.java
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.visitormanage.domain;
+
+import com.supwisdom.dlpay.system.bean.PageBean;
+
+public class VisitorSearchBean extends PageBean {
+    private String nickname;
+    private String startdate;
+    private String enddate;
+    private String inoutflag;
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getStartdate() {
+        return startdate;
+    }
+
+    public void setStartdate(String startdate) {
+        this.startdate = startdate;
+    }
+
+    public String getEnddate() {
+        return enddate;
+    }
+
+    public void setEnddate(String enddate) {
+        this.enddate = enddate;
+    }
+
+    public String getInoutflag() {
+        return inoutflag;
+    }
+
+    public void setInoutflag(String inoutflag) {
+        this.inoutflag = inoutflag;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorShowBean.java b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorShowBean.java
new file mode 100644
index 0000000..d315796
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorShowBean.java
@@ -0,0 +1,107 @@
+package com.supwisdom.dlpay.visitormanage.domain;
+
+
+public class VisitorShowBean {
+    private String custid;
+    private Integer custtype;
+    private String custname;
+    private String phone;
+    private String cardno;
+    private String cardphyid;
+    private String bankcardno;
+    private String deptcode;
+    private String custtypeid;
+    private String checkstatus;
+    private String status;
+
+
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+
+    public String getCusttypeid() {
+        return custtypeid;
+    }
+
+    public void setCusttypeid(String custtypeid) {
+        this.custtypeid = custtypeid;
+    }
+
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    public Integer getCusttype() {
+        return custtype;
+    }
+
+    public void setCusttype(Integer custtype) {
+        this.custtype = custtype;
+    }
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    public String getCardphyid() {
+        return cardphyid;
+    }
+
+    public void setCardphyid(String cardphyid) {
+        this.cardphyid = cardphyid;
+    }
+
+    public String getBankcardno() {
+        return bankcardno;
+    }
+
+    public void setBankcardno(String bankcardno) {
+
+        this.bankcardno = bankcardno;
+    }
+
+    public String getCheckstatus() {
+        return checkstatus;
+    }
+
+    public void setCheckstatus(String checkstatus) {
+
+        this.checkstatus = checkstatus;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/service/VisitormanageService.java b/src/main/java/com/supwisdom/dlpay/visitormanage/service/VisitormanageService.java
new file mode 100644
index 0000000..1b4ac25
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/service/VisitormanageService.java
@@ -0,0 +1,27 @@
+package com.supwisdom.dlpay.visitormanage.service;
+
+import com.supwisdom.dlpay.api.bean.UserInforResponse;
+import com.supwisdom.dlpay.customer.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.doorlist.bean.CustomerListBean;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
+import com.supwisdom.dlpay.mainservice.bean.TDoordtlInfo;
+import com.supwisdom.dlpay.mainservice.domain.TCard;
+import com.supwisdom.dlpay.mainservice.domain.TCustomer;
+import com.supwisdom.dlpay.mainservice.domain.TKey;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
+import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface VisitormanageService {
+
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    PageResult<EVisitorDtl> getVisitorInfoPage(VisitorSearchBean bean);
+
+    }
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/service/impl/VisitormanageServiceImpl.java b/src/main/java/com/supwisdom/dlpay/visitormanage/service/impl/VisitormanageServiceImpl.java
new file mode 100644
index 0000000..9261017
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/service/impl/VisitormanageServiceImpl.java
@@ -0,0 +1,48 @@
+package com.supwisdom.dlpay.visitormanage.service.impl;
+
+import com.supwisdom.dlpay.api.bean.UserInforResponse;
+import com.supwisdom.dlpay.customer.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.doorlist.bean.CustomerListBean;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
+import com.supwisdom.dlpay.mainservice.bean.TDoordtlInfo;
+import com.supwisdom.dlpay.mainservice.dao.*;
+import com.supwisdom.dlpay.mainservice.domain.TCard;
+import com.supwisdom.dlpay.mainservice.domain.TCustomer;
+import com.supwisdom.dlpay.mainservice.domain.TKey;
+import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
+import com.supwisdom.dlpay.system.domain.TDept;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.system.service.SystemService;
+import com.supwisdom.dlpay.visitormanage.dao.VisitorDao;
+import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
+import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
+import com.supwisdom.dlpay.visitormanage.service.VisitormanageService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class VisitormanageServiceImpl implements VisitormanageService {
+    @Autowired
+    KeyDao keyDao;
+    @Autowired
+    CardListDao cardListDao;
+    @Autowired
+    DoordtlDao doordtlDao;
+    @Autowired
+    VisitorDao visitorDao;
+    @Autowired
+    CardDao cardDao;
+    @Autowired
+    private SystemService systemService;
+
+
+
+    @Override
+    public PageResult<EVisitorDtl> getVisitorInfoPage(VisitorSearchBean bean){
+        return visitorDao.getVisitorInfoPage(bean);
+    }
+}
diff --git a/src/main/resources/static/res/assets/css/wxpage.css b/src/main/resources/static/res/assets/css/wxpage.css
new file mode 100644
index 0000000..a41b9b1
--- /dev/null
+++ b/src/main/resources/static/res/assets/css/wxpage.css
@@ -0,0 +1,87 @@
+body {
+    background: #f6f6f6;
+}
+.wx-logo-img {
+    width: 48px;
+    height: 48px;
+}
+.qrcode-cc{
+    text-align: center;
+}
+.qrcode-cc img{
+    display: inline!important;
+}
+.topbar{
+    display: flex;
+    padding: 10px;
+    background: #4AA6E6;
+}
+.topbar a{
+    color:#fff;
+}
+.topbar p{
+    color:#fff;
+    flex:1;
+    text-align: center;
+}
+.back:before{
+    content: "";
+    background: url(../../images/wxapp/icon_back.png);
+    padding: 5px 15px;
+}
+.refresh{
+    content: "";
+    background: url(../../images/wxapp/icon_refresh.png);
+    padding: 5px 15px;
+}
+.btn-bg{
+    background: #4AA6E6;
+}
+.ui-header {
+    padding: 30px 0;
+}
+
+.ui-title {
+    text-align: center;
+    vertical-align: middle;
+}
+
+.pay-success {
+    width: 60px;
+    height: 60px;
+    vertical-align: middle;
+}
+
+.span-success {
+    vertical-align: middle;
+    color: #1296db;
+}
+
+.span-wait {
+    vertical-align: middle;
+    color: #1296db;
+}
+
+.span-fail {
+    color: #FF3900;
+    vertical-align: middle;
+}
+
+.weui-btn_primary {
+    background-color: #4AA6E6
+}
+
+.weui-btn_primary:not(.weui-btn_disabled):visited {
+    color: #fff
+}
+
+.weui-btn_primary:not(.weui-btn_disabled):active {
+    color: hsla(0, 0%, 100%, .6);
+    background-color: #5fa7db;
+}
+.centerCss{
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-items: center;
+}
\ No newline at end of file
diff --git a/src/main/resources/static/res/assets/js/qrcode.min.js b/src/main/resources/static/res/assets/js/qrcode.min.js
new file mode 100644
index 0000000..993e88f
--- /dev/null
+++ b/src/main/resources/static/res/assets/js/qrcode.min.js
@@ -0,0 +1 @@
+var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function j(a,b){this.totalCount=a,this.dataCount=b}function k(){this.buffer=[],this.length=0}function m(){return"undefined"!=typeof CanvasRenderingContext2D}function n(){var a=!1,b=navigator.userAgent;return/android/i.test(b)&&(a=!0,aMat=b.toString().match(/android ([0-9]\.[0-9])/i),aMat&&aMat[1]&&(a=parseFloat(aMat[1]))),a}function r(a,b){for(var c=1,e=s(a),f=0,g=l.length;g>=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=0==b%2)},setupPositionAdjustPattern:function(){for(var a=f.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var g=-2;2>=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g<a.length&&(j=1==(1&a[g]>>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h<d.length;h++){var i=d[h];g.put(i.mode,4),g.put(i.getLength(),f.getLengthInBits(i.mode,a)),i.write(g)}for(var l=0,h=0;h<e.length;h++)l+=e[h].dataCount;if(g.getLengthInBits()>8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j<b.length;j++){var k=b[j].dataCount,l=b[j].totalCount-k;d=Math.max(d,k),e=Math.max(e,l),g[j]=new Array(k);for(var m=0;m<g[j].length;m++)g[j][m]=255&a.buffer[m+c];c+=k;var n=f.getErrorCorrectPolynomial(l),o=new i(g[j],n.getLength()-1),p=o.mod(n);h[j]=new Array(n.getLength()-1);for(var m=0;m<h[j].length;m++){var q=m+p.getLength()-h[j].length;h[j][m]=q>=0?p.get(q):0}}for(var r=0,m=0;m<b.length;m++)r+=b[m].totalCount;for(var s=new Array(r),t=0,m=0;d>m;m++)for(var j=0;j<b.length;j++)m<g[j].length&&(s[t++]=g[j][m]);for(var m=0;e>m;m++)for(var j=0;j<b.length;j++)m<h[j].length&&(s[t++]=h[j][m]);return s};for(var c={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},d={L:1,M:0,Q:3,H:2},e={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},f={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;f.getBCHDigit(b)-f.getBCHDigit(f.G15)>=0;)b^=f.G15<<f.getBCHDigit(b)-f.getBCHDigit(f.G15);return(a<<10|b)^f.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;f.getBCHDigit(b)-f.getBCHDigit(f.G18)>=0;)b^=f.G18<<f.getBCHDigit(b)-f.getBCHDigit(f.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<<h;for(var h=8;256>h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;c<this.getLength();c++)for(var d=0;d<a.getLength();d++)b[c+d]^=g.gexp(g.glog(this.get(c))+g.glog(a.get(d)));return new i(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=g.glog(this.get(0))-g.glog(a.get(0)),c=new Array(this.getLength()),d=0;d<this.getLength();d++)c[d]=this.get(d);for(var d=0;d<a.getLength();d++)c[d]^=g.gexp(g.glog(a.get(d))+b);return new i(c,0).mod(a)}},j.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],j.getRSBlocks=function(a,b){var c=j.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var d=c.length/3,e=[],f=0;d>f;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=['<table style="border:0;border-collapse:collapse;">'],h=0;d>h;h++){g.push("<tr>");for(var i=0;d>i;i++)g.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:'+e+"px;height:"+f+"px;background-color:"+(a.isDark(h,i)?b.colorDark:b.colorLight)+';"></td>');g.push("</tr>")}g.push("</table>"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}();
\ No newline at end of file
diff --git a/src/main/resources/templates/apph5/appvisitor.html b/src/main/resources/templates/apph5/appvisitor.html
new file mode 100644
index 0000000..94bc82e
--- /dev/null
+++ b/src/main/resources/templates/apph5/appvisitor.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+
+<head>
+    <title>首页</title>
+    <!--<meta name="_csrf_header" th:content="${_csrf.headerName}" />
+    <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}" />-->
+    <meta charset="utf-8"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="/static/libs/layui/css/layui.css" th:href="@{/static/libs/layui/css/layui.css}"/>
+
+    <link rel="stylesheet" href="/static/res/assets/plugins/element-ui/theme-default/index.css" th:href="@{/static/res/assets/plugins/element-ui/theme-default/index.css}"/>
+
+    <!--<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.min.js}"></script>
+    <!--<script type="text/javascript" th:src="@{/static/libs/layui/layui.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.form.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/layer/layer.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/js/vue.min.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/element-ui/index.js}"></script>
+
+
+</head>
+
+<body>
+
+        <div id="app">
+            <div class="block" style="background:#ffffff;">
+                <br>
+                <span class="demonstration" style="text-align: center;display:block; font-size: 20px;color: #9932CC">访客登记</span><br><br>
+                    <!--动态将图片轮播图的容器高度设置成与图片一致-->
+
+                    <el-button type="success" @click="openDoor" style=" display:block;margin:0 auto;width:100px;height:100px;border-radius:50px;border:solid rgb(100,100,100) 0px; font-size: 20px" >登记</el-button>
+            </div>
+
+        </div>
+
+</body>
+
+<script>
+    var app_vue = new Vue({
+        el:'#app',
+        data:{
+            devNameList: [],
+            devIdList:[],
+            selectDevName:'',
+            selectDevId:'',
+            // 图片父容器高度
+            bannerHeight :1000,
+            // 浏览器宽度
+            screenWidth :0,
+            userId:''
+        },
+
+        methods:{
+            indexChange: function (pre, next) {
+                var _self = this;
+                var devIdListTmp = _self.devIdList;
+                _self.selectDevId=devIdListTmp[pre];
+                // console.log(_self.selectDevId)
+
+            },
+            openDoor:function () {
+                var devId = app_vue.selectDevId;
+                app_openDoor(devId);
+            },
+            setSize:function () {
+                // 通过浏览器宽度(图片宽度)计算高度
+                this.bannerHeight =  this.screenWidth;
+            },
+        },
+        created:function(){
+            var _self = this;
+            // 首次加载时,需要调用一次
+            _self.screenWidth =  window.innerWidth;
+            _self.setSize();
+
+            var userId='[[${userId}]]';
+            _self.userId = userId;
+
+
+        }
+
+    })
+
+    function app_openDoor(devId) {
+
+        layer.confirm('你确定要登记吗?',{icon: 3,title: '请确认',offset: '30%'},function (index) {
+            $.ajax({
+                type: "get",
+                dataType: "json",
+                url:encodeURI("[[@{/app/getvistor}]]"),
+                success:function (ret) {
+                    if(ret.retcode==1){
+                        alert(ret.retmsg);
+                    }
+                }
+            })
+        });
+
+    }
+
+    // 窗口大小发生改变时,调用一次
+    window.onresize = function(){
+        app_vue.screenWidth =  window.innerWidth;
+        app_vue.setSize();
+    }
+
+
+
+
+</script>
+
+<style>
+
+    .el-carousel__item h3 {
+        color: #ff3366;
+        font-size: 14px;
+        opacity: 0.75;
+        line-height: 300px;
+        margin: 0;
+        /*background-color:#66cccc;
+        border: 0px solid #e5e5e5;
+        width: 50%;
+        left: 10%;
+        height: 100%;*/
+    }
+
+    .el-carousel__item:nth-child(2n) {
+        background-color: #ffffff;
+    }
+
+    .el-carousel__item:nth-child(2n+1) {
+        background-color: #ffffff;
+    }
+
+    .el-carousel__item .Carousel{
+        border-bottom: 1px solid #f1f4f8;
+    }
+</style>
\ No newline at end of file
diff --git a/src/main/resources/templates/apph5/getinoutflag.html b/src/main/resources/templates/apph5/getinoutflag.html
new file mode 100644
index 0000000..f34d378
--- /dev/null
+++ b/src/main/resources/templates/apph5/getinoutflag.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+
+<head>
+    <title>首页</title>
+    <!--<meta name="_csrf_header" th:content="${_csrf.headerName}" />
+    <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}" />-->
+    <meta charset="utf-8"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="/static/libs/layui/css/layui.css" th:href="@{/static/libs/layui/css/layui.css}"/>
+
+    <link rel="stylesheet" href="/static/res/assets/plugins/element-ui/theme-default/index.css" th:href="@{/static/res/assets/plugins/element-ui/theme-default/index.css}"/>
+
+    <!--<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.min.js}"></script>
+    <!--<script type="text/javascript" th:src="@{/static/libs/layui/layui.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.form.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/layer/layer.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/js/vue.min.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/element-ui/index.js}"></script>
+
+
+</head>
+
+<body>
+
+        <div id="app">
+            <div class="block" style="background:#ffffff;">
+                <br>
+                <span class="demonstration" style="text-align: center;display:block; font-size: 20px;color: #9932CC">生成访客登记二维码</span><br><br>
+                    <!--动态将图片轮播图的容器高度设置成与图片一致-->
+
+                    <el-button type="success" @click="openDoor1" style=" display:block;margin:0 auto;width:100px;height:100px;border-radius:50px;border:solid rgb(100,100,100) 0px; font-size: 20px" >进门登记</el-button>
+                    <el-button type="success" @click="openDoor" style=" display:block;margin:0 auto;width:100px;height:100px;border-radius:50px;border:solid rgb(100,100,100) 0px; font-size: 20px" >出门登记</el-button>
+            </div>
+
+        </div>
+
+</body>
+
+<script>
+    var app_vue = new Vue({
+        el:'#app',
+        data:{
+            devNameList: [],
+            devIdList:[],
+            selectDevName:'',
+            selectDevId:'',
+            // 图片父容器高度
+            bannerHeight :1000,
+            // 浏览器宽度
+            screenWidth :0,
+            userId:''
+        },
+
+        methods:{
+            indexChange: function (pre, next) {
+                var _self = this;
+                var devIdListTmp = _self.devIdList;
+                _self.selectDevId=devIdListTmp[pre];
+                // console.log(_self.selectDevId)
+
+            },
+            openDoor1:function () {
+                app_openDoor(1);
+            },openDoor:function () {
+                app_openDoor(2);
+            },
+            setSize:function () {
+                // 通过浏览器宽度(图片宽度)计算高度
+                this.bannerHeight =  this.screenWidth;
+            },
+        },
+        created:function(){
+            var _self = this;
+            // 首次加载时,需要调用一次
+            _self.screenWidth =  window.innerWidth;
+            _self.setSize();
+
+            var userId='[[${userId}]]';
+            _self.userId = userId;
+
+
+        }
+
+    })
+
+    function app_openDoor(devId) {
+
+        layer.confirm('你确定要生成二维码吗?',{icon: 3,title: '请确认',offset: '30%'},function (index) {
+            window.location = "[[@{/app/getqrcode?inoutflag=}]]"+devId;
+        });
+
+    }
+
+    // 窗口大小发生改变时,调用一次
+    window.onresize = function(){
+        app_vue.screenWidth =  window.innerWidth;
+        app_vue.setSize();
+    }
+
+
+
+
+</script>
+
+<style>
+
+    .el-carousel__item h3 {
+        color: #ff3366;
+        font-size: 14px;
+        opacity: 0.75;
+        line-height: 300px;
+        margin: 0;
+        /*background-color:#66cccc;
+        border: 0px solid #e5e5e5;
+        width: 50%;
+        left: 10%;
+        height: 100%;*/
+    }
+
+    .el-carousel__item:nth-child(2n) {
+        background-color: #ffffff;
+    }
+
+    .el-carousel__item:nth-child(2n+1) {
+        background-color: #ffffff;
+    }
+
+    .el-carousel__item .Carousel{
+        border-bottom: 1px solid #f1f4f8;
+    }
+</style>
\ No newline at end of file
diff --git a/src/main/resources/templates/apph5/visitorcode.html b/src/main/resources/templates/apph5/visitorcode.html
new file mode 100644
index 0000000..60edccd
--- /dev/null
+++ b/src/main/resources/templates/apph5/visitorcode.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+
+<head>
+    <title>首页</title>
+    <!--<meta name="_csrf_header" th:content="${_csrf.headerName}" />
+    <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}" />-->
+    <meta charset="utf-8"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="/static/libs/layui/css/layui.css" th:href="@{/static/libs/layui/css/layui.css}"/>
+
+    <link rel="stylesheet" href="/static/res/assets/plugins/element-ui/theme-default/index.css"
+          th:href="@{/static/res/assets/plugins/element-ui/theme-default/index.css}"/>
+    <link rel="stylesheet" href="/static/res/assets/css/wxpage.css"
+          th:href="@{/static/res/assets/css/wxpage.css}"/>
+
+    <!--<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.min.js}"></script>
+    <!--<script type="text/javascript" th:src="@{/static/libs/layui/layui.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.form.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/layer/layer.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/js/vue.min.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/js/qrcode.min.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/element-ui/index.js}"></script>
+
+
+</head>
+
+<script type="text/javascript">
+    setInterval(function () {
+        window.location.reload();
+    }, 60000);
+
+    $(function () {
+
+
+        var qcode = $("#myText").val();
+        if (undefined != qcode && null != qcode && "" != qcode) {
+            var qrcode = new QRCode(document.getElementById("qrcode"), {
+                render : "canvas",
+                text: qcode,
+                width: 220,
+                height: 220,
+                colorDark: "#000000",
+                colorLight: "#ffffff",
+                correctLevel: QRCode.CorrectLevel.H
+            });
+        }
+        var inoutflag = $("#inoutflag").val();
+
+        if (inoutflag == 1) {
+            $("#title").text("进门登记码")
+        } else {
+            $("#title").text("出门登记码")
+
+        }
+
+    });
+</script>
+<style>
+    body {
+        background-color: #ffffff;
+    }
+
+</style>
+</html>
+<body class="page" style="text-align: center">
+<div class="topbar">
+    <p id="title" class="el-message-box__title" style="text-align: center"></p>
+    <a href="javascript:window.location.reload();"><span class="refresh"></span></a>
+</div>
+
+<div style="text-align: center;padding: 30px;">
+    <input type="hidden" id="myText" th:value="${qrcode}"/>
+    <input type="hidden" id="inoutflag" th:value="${inoutflag}"/>
+</div>
+<div id="qrcode" class="qrcode-cc" ></div>
+<p style="text-align: center;margin-top:40px;color:#999;font-size: 14px">请将二维码对准扫描设备完成登记(如您使用扫一扫功能，请重新扫码)</p>
+<a href="javascript:window.location.reload();" class="weui-btn weui-btn_primary btn-bg"
+   style="align-content: center;margin: 20px">手动刷新二维码</a>
+
+</body>
+</style>
\ No newline at end of file
diff --git a/src/main/resources/templates/apph5/visitorresult.html b/src/main/resources/templates/apph5/visitorresult.html
new file mode 100644
index 0000000..14447fc
--- /dev/null
+++ b/src/main/resources/templates/apph5/visitorresult.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+<head>
+    <title>首页</title>
+    <!--<meta name="_csrf_header" th:content="${_csrf.headerName}" />
+    <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}" />-->
+    <meta charset="utf-8"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <!-- 引入样式 -->
+    <!--<link rel="stylesheet" href="https://unpkg.com/mint-ui/lib/style.css">-->
+    <link rel="stylesheet" href="/static/res/assets/plugins/mintui/style.css" th:href="@{/static/res/assets/plugins/mintui/style.css}">
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.min.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/layer/layer.js}"></script>
+    <!-- 先引入 Vue -->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/nutui/vue.min.js}"></script>
+    <!-- 引入组件库 -->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/mintui/index.js}"></script>
+
+    <!--<script src="https://unpkg.com/vue/dist/vue.js"></script>
+    <script src="https://unpkg.com/mint-ui/lib/index.js"></script>-->
+</head>
+<body>
+<div id="app" >
+    <div class="page-title" style="text-align:center; font-size: 24px;color: #FF8247">登记结果</div><br>
+    <div class="mintui-success" id="msg"></div>
+    <input type="hidden" id="issuccess" th:value="${issuccess}">
+
+</div>
+</body>
+
+<script>
+    $(function () {
+
+        if(inoutflag==1){
+            $("#msg").html("<p class='mintui-success'>登记成功</p>")
+        }else {
+            $("#msg").html("<p class='mintui-success'>登记失败</p>")
+        }
+
+    });
+    var mint_vue = new Vue({
+        el: '#app',
+        data:{
+            devList:[],
+            userId:'',
+            selectDevId:'',
+            devName:'',
+        },
+        methods: {
+            openDoor:function (devId) {
+                mint_openDoor(devId);
+            },
+            loadListData:function (devName) {
+                mint_searchByDevName(devName);
+            },
+
+        },
+        watch:{
+            devName:function(newvs,oldvs){
+
+                if(!newvs){
+                    mint_searchByDevName('');
+                }
+            }
+        },
+        created:function(){
+            var _self = this;
+
+            var userId='[[${userId}]]';
+            _self.userId = userId;
+
+
+            $.ajax({
+                type: "get",
+                dataType: "json",
+                url: "[[@{/app/loadAppDevList?userId=}]]"+userId,
+                success: function (ret) {
+                    var ut = ret.devList;
+                    if (ut == null){
+                        confirm("不具有开门权限");
+                        return;
+                    }
+                    var devs = [];
+                    var names = [];
+                    var ids = [];
+                    for (var i = 0; i < ut.length; i++) {
+                        devs.push({
+                            label:ut[i].devname,
+                            value:ut[i].deviceid,
+                            building:ut[i].buildingname
+                        });
+                        names.push(ut[i].devname);
+                        ids.push(ut[i].deviceid);
+                    }
+                    _self.devList = devs;
+
+
+                }
+            })
+        }
+
+
+    })
+
+
+    function mint_openDoor(devId) {
+        var userId = mint_vue.userId;
+        console.log(userId);
+        layer.confirm('你确定要开启此门吗?',{icon: 3,title: '请确认',offset: '30%'},function (index) {
+            $.ajax({
+                type: "get",
+                dataType: "json",
+                url:encodeURI("[[@{/app/openDoorById?devId=}]]" +devId+"&userId="+userId),
+                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: 2000});
+                    } else {
+                        layer.msg('开门成功', {icon: 1, time: 2000});
+                    }
+                }
+            })
+        });
+
+    }
+
+    function mint_searchByDevName(devName) {
+        var userId = mint_vue.userId;
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: "[[@{/app/searchByDevName?userId=}]]"+userId+"&devName="+devName,
+            success: function (ret) {
+                var ut = ret.devNameList;
+                if (ut == null) {
+                    confirm("没有对应设备！");
+                    return;
+                }
+                var devs = [];
+                var names = [];
+                var ids = [];
+                for (var i = 0; i < ut.length; i++) {
+                    devs.push({
+                        label: ut[i].devname,
+                        value: ut[i].deviceid,
+                        building: ut[i].buildingname
+                    });
+                    names.push(ut[i].devname);
+                    ids.push(ut[i].deviceid);
+                }
+                mint_vue.devList = devs;
+            }
+        })
+    }
+</script>
+<style>
+    .mint-search{
+        height:50px;
+    }
+
+    .mint-searchbar{
+        padding:1px 1px 1px 1px;
+        box-sizing: border-box
+    }
+</style>
+</html>
diff --git a/src/main/resources/templates/visitormanage/customer/index.html b/src/main/resources/templates/visitormanage/customer/index.html
new file mode 100644
index 0000000..298f712
--- /dev/null
+++ b/src/main/resources/templates/visitormanage/customer/index.html
@@ -0,0 +1,200 @@
+<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="visitor-search-value" class="layui-input search-input" type="text" placeholder="输入姓名"/>&emsp;
+            <select id="visitor-search-inoutflag" class="layui-input search-input" type="" >
+                <option value="">出入状况</option>
+                <option value="1">入</option>
+                <option value="2">出</option>
+            </select>&emsp;
+            <input id="visitor-search-startdate" class="layui-input search-input" type="date" />&emsp;
+            <label>~&nbsp;</label>
+            <input id="visitor-search-enddate" class="layui-input search-input" type="date" />&emsp;
+            <button id="customer-btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+           <!-- <button id="customer-btn-import" class="layui-btn icon-btn" ><i class="layui-icon"></i>批量导入</button>-->
+          <!--  <a id="customer-btn-export" href="javascript:void(0);" class="layui-btn layui-btn-primary" >导出</a>-->
+        </div>
+        <table class="layui-table" id="customer-table" lay-filter="customer-table"></table>
+    </div>
+</div>
+<input hidden th:value="${custtypelist}" id="custtypelist">
+<input hidden th:value="${deptlist}" id="deptlist">
+<script>
+
+    var ctlist=$("#custtypelist").val();
+    var custtypelist=JSON.parse(ctlist);
+    var dplist=$("#deptlist").val();
+    var deptlist=JSON.parse(dplist);
+    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: '#customer-table',
+            url: '[[@{/visitor/list}]]',
+            page: true,
+            minWidth: 80,
+            cols: [
+                [
+                    {field: 'nickname',  title: '昵称'},
+
+
+                    /*{
+                        field: 'checkstatus', title: '审核状态', align: 'center', width: 120, sort: true, templet: function (d) {
+                            if ('uncheck' == d.checkstatus) {
+                                return '<span class="layui-badge layui-bg-orange">待审核</span>'
+                            } else if ('normal' == d.checkstatus) {
+                                return '<span class="layui-badge layui-bg-green">成功</span>';
+                            } else if ('fail' == d.checkstatus) {
+                                return '<span class="layui-badge layui-bg-gray">失败</span>';
+                            } else {
+                                return d.checkstatus;
+                            }
+                        }
+                    },*/
+                    {
+                        field: 'sex',
+                        title: '性别',
+                        align: 'center',
+                        templet: function (item) {
+                            if(item.sex==1){
+                                return "男"
+                            }else {
+                                return "女"
+                            }
+                        }
+                    },
+                    {
+                        field: 'transdate', width:200, title: '日期',align: 'center', templet: function (item) {
+                            return item.transdate.substring(0,4)+"-"+item.transdate.substring(4,6)+"-"+item.transdate.substring(6,8);
+                        }
+                    },{
+                        field: 'transtime', width:200, title: '时间', align: 'center',templet: function (item) {
+                            return item.transtime.substring(0,2)+":"+item.transtime.substring(2,4)+":"+item.transtime.substring(4,6);
+                        }
+                    },{
+                        field: 'inoutflag', width:100, title: '出入状况',align: 'center', templet: function (item) {
+                        if(item.inoutflag==1){
+                            return "入"
+                        }else {
+                            return "出"
+                        }                        }
+                    },
+                    {field: 'city', align: 'center',  title: '城市'},
+                    {field: 'province', align: 'center',  title: '省份'},
+                    {field: 'country', align: 'center',  title: '国家'}
+                ]
+            ]
+        });
+        $('#customer-btn-export').click(function () {
+            var url = '[[@{/customer/export}]]';
+            /* $("#form").attr("action",url);
+
+             $("#form").submit();*/
+
+            $("#customer-btn-export").attr("href", url );
+            $("#customer-btn-export")[0].click();
+        });
+        // 搜索按钮点击事件
+        $('#customer-btn-search').click(function () {
+            let key = $('#visitor-search-value').val().trim();
+            let inoutflag = $('#visitor-search-inoutflag').val().trim();
+            let startdate = $('#visitor-search-startdate').val().trim();
+            let enddate = $('#visitor-search-enddate').val().trim();
+            if(enddate!=null&&enddate!=""){
+                if(startdate!=null&&startdate!=""){
+                    if(startdate>enddate){
+                        alert("请输入正确的日期")
+                        return;
+                    }
+                }
+
+            }
+            table.reload('customer-table', {where: {searchkey: key,inoutflag: inoutflag,startdate:startdate,enddate:enddate }, page: {curr: 1}});
+        });
+        $('#customer-btn-add').click(function () {
+            showModel();
+        });
+       /* $('#customer-btn-import').click(function () {
+            showDownload();
+        });
+        let showDownload = function () {
+            let title ='导入';
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/customer/loadimport}]]',
+                finish: function () {
+                    table.reload('customer-table', {});
+                }
+            });
+        };*/
+        let showModel = function (data) {
+            let title = data ? '修改人员信息' : '添加人员信息';
+            admin.putTempData('t_cust', data);
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/customer/loadadd}]]',
+                finish: function () {
+                    table.reload('customer-table', {});
+                }
+            });
+        };
+
+
+        // 工具条点击事件
+        table.on('tool(customer-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('customer-table', {});
+                }, function (ret) {
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    layer.msg('请求失败了，请稍后再试', {icon: 2});
+                });
+            });
+        };
+
+    });
+</script>
