大理访客登记微信扫码及管理端界面
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>