作者存档
20177 月4

分享:微信电子导航DEMO

后台JAVA代码:

 

package cn.wizzer.app.web.modules.controllers.front.wx;

import cn.wizzer.app.web.commons.base.Globals;
import cn.wizzer.app.wx.modules.services.WxAddressService;
import cn.wizzer.app.wx.modules.services.WxConfigService;
import org.nutz.dao.Cnd;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.weixin.at.impl.MemoryJsapiTicketStore;
import org.nutz.weixin.spi.WxApi2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Created by wizzer on 2017/6/27.
 */
@IocBean
@At("/public/wx/add")
public class AddController {
    private static final Log log = Logs.get();
    @Inject
    private WxConfigService wxConfigService;
    @Inject
    private WxAddressService wxAddressService;

    @At("/index/?")
    @Ok("beetl:/public/add/index.html")
    public void index(String wxid,HttpServletRequest req, HttpSession session) {
        WxApi2 wxApi2 = wxConfigService.getWxApi2(wxid);
        if (Lang.isEmpty(Globals.memoryJsapiTicketStore.get(wxid))) {
            Globals.memoryJsapiTicketStore.put(wxid, new MemoryJsapiTicketStore());
        }
        MemoryJsapiTicketStore memoryJsapiTicketStore = Globals.memoryJsapiTicketStore.get(wxid);
        wxApi2.setJsapiTicketStore(memoryJsapiTicketStore);
        String url = "http://" + Globals.AppDomain + Globals.AppBase + "/public/wx/add/index/"+wxid;
        NutMap jsConfig = wxApi2.genJsSDKConfig(url, "getLocation");

        req.setAttribute("list", wxAddressService.query(Cnd.orderBy().asc("opAt")));
        req.setAttribute("jsConfig", Json.toJson(jsConfig));
    }
}

前台代码:



    
    电子导航

    
    
    
    
    
    
    
    
    
    
        var base = '${base!}';
    
    
    
    



公司检索

公司名称:
当前位置:
  • ${oLP.index}、${o.name}
    lng:${o.lng}, lat:${o.lat}
  • 没有检索到结果
function goTo(type,name,lng,lat) { var longitude=$("#longitude").val(); var latitude=$("#latitude").val(); window.location.href="http://apis.map.qq.com/uri/v1/routeplan?type="+type+"&from=我的位置&fromcoord="+latitude+","+longitude+"&to="+name+"&tocoord="+lat+","+lng+"&policy=1&referer=电子导航"; //window.location.href="http://api.map.baidu.com/direction?origin=latlng:"+latitude+","+longitude+"|name:我的位置&destination=latlng:"+lat+","+lng+"|name:"+name+"&mode=driving&region=合肥&output=html&src=电子导航"; } wx.config(${jsConfig}); wx.ready(function(){ wx.getLocation({ type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02' success: function (res) { var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90 var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。 var speed = res.speed; // 速度,以米/每秒计 var accuracy = res.accuracy; // 位置精度 $("#latitude").val(latitude); $("#longitude").val(longitude); } }); });
20173 月23

NutzWk: 微信AccessToken没有持久化造成超出调用限制的问题解决

1、wx_config 实体类添加三个字段,对应的表结构也要手动修改:

    @Column
    @Comment("access_token")
    @ColDefine(type = ColType.VARCHAR, width = 255)
    private String access_token;

    @Column
    @Comment("access_token_expires")
    @ColDefine(type = ColType.INT)
    private Integer access_token_expires;

    @Column
    @Comment("access_token_lastat")
    @ColDefine(type = ColType.VARCHAR, width = 50)
    private String access_token_lastat;

    get  set ...方法生成出来

2、nutzwx版本升级为1.r.61-SNAPSHOT

        
            org.nutz
            nutzwx
            1.r.61-SNAPSHOT
        

3、nutz版本升级为1.r.60

        
            org.nutz
            nutz
            1.r.60
        

4、WxConfigService 类getWxApi2替换为如下代码(主要是DaoAccessTokenStore从数据库取access_token)

    public WxApi2 getWxApi2(String wxid) {
        Wx_config appInfo = this.fetch(Cnd.where("id", "=", wxid));
        DaoAccessTokenStore myDaoAccessTokenStore = new DaoAccessTokenStore(dao());
        Map params = new HashMap();
        params.put("id", appInfo.getId());
        myDaoAccessTokenStore.setTableAccessToken("access_token");
        myDaoAccessTokenStore.setTableAccessTokenExpires("access_token_expires");
        myDaoAccessTokenStore.setTableAccessTokenLastat("access_token_lastat");
        myDaoAccessTokenStore.setFetch("select access_token,access_token_expires,access_token_lastat from wx_config where id=@id");
        myDaoAccessTokenStore.setUpdate("update wx_config set access_token=@access_token, access_token_expires=@access_token_expires, access_token_lastat=@access_token_lastat where id=@id");
        myDaoAccessTokenStore.setParams(params);
        WxApi2Impl wxApi2 = new WxApi2Impl();
        wxApi2.setAppid(appInfo.getAppid());
        wxApi2.setAppsecret(appInfo.getAppsecret());
        wxApi2.setEncodingAesKey(appInfo.getEncodingAESKey());
        wxApi2.setToken(appInfo.getToken());
        wxApi2.setAccessTokenStore(myDaoAccessTokenStore);
        return wxApi2;
    }
20173 月17

log4j 换成 logback 注意事项

pom.xml

 

  
    ch.qos.logback  
    logback-classic  
    1.2.2  
  
  
    org.logback-extensions  
    logback-ext-spring  
    0.1.4  
  
  
    org.slf4j  
    jcl-over-slf4j  
    1.7.25  

  
    org.slf4j  
    log4j-over-slf4j  
    1.7.25  

 

排除其他包的log4j引用,特别是dubbo的、shiro的

 

        
            com.alibaba
            dubbo
            2.8.4
            
                
                    log4j
                    log4j
                
            
        
        
            javax.ws.rs
            javax.ws.rs-api
            2.0
            
                
                    log4j
                    log4j
                
            
        
        
            org.apache.shiro
            shiro-ehcache
            1.3.2
            
                
                    log4j
                    log4j
                
            
        
        
            org.apache.shiro
            shiro-web
            1.3.2
            
                
                    log4j
                    log4j
                
            
        

配置文件:










    
        /monitor.log

        
        
        
            /monitor.%i.log.gz
            
            
            1
            5
        

        
        
            300MB
        

        
        true
        GBK

        
        
            [%-5level] %d{HH:mm:ss.SSS} [%thread] %logger %caller{2} - %msg%n
        
    
    
    
    
    
    
    
    
    
        
    
20173 月8

怀孕

“医生,你得救救我们啊,我们在一起三年了都没有怀孕,父母还等着抱孙子呢!”医生:“这我也没办法啊,这都是你们自己的问题。”“不行啊,医生你帮帮我们吧。”医生:“首先,你们得各自找个女朋友。”

20171 月12

培训班

记得初入公司时,写的代码乱七八糟,错误百出,bug连连,不仅项目经理骂我,其他同事也对我怨声载道。后来听朋友介绍,就报了一个培训班。经过1个月的刻苦学习,终于功夫不负有心人啊—他们都骂不过我了。

201612 月17

女上司

我们单位来了个女上司,长的还算过的去,很凶,在单位经常欺负我们。。同事们就怂恿单身的我追求她,然后报复她,欺负她,在同事们的多方帮助下,不出一个月,我把女上司就追到手了。。。从此,我不但在单位受她欺负,到了家还受她欺负。 ……

201612 月8

Nutz:组合查询、子查询示例代码

        Cnd cnd = Cnd.NEW();
        if (!Strings.isBlank(src)) {
            cnd.and("srcFrom", "=", src);
        }
        if (!Strings.isBlank(name)) {
            String[] n = StringUtils.split(name, " ");
            SqlExpressionGroup group = new SqlExpressionGroup();
            for (String s : n) {
                SqlExpression sqlExpression = Cnd.exp("srcName", "like", "%" + s + "%");
                group.or(sqlExpression);
            }
            cnd.and(group);
        }
        cnd.and(Cnd.exps("productSku", "=", "").or("productSku", "is", null));
201612 月8

石头

你认为大禹三过家门而不入真的什么都没干吗?不要忘了,他媳妇后来变成望夫石了,而孙悟空是石头里蹦出来的,关键是,大禹的定海神针还听孙悟空的话,你认为孙悟空当年定住了七仙女,什么都没有干吗?想想葫芦娃,正好七个,合在一起能变成石头…石头….

201611 月28

Elasticsearch 5.0 以上 elasticsearch-head 安装教程

elasticsearch 5.0/5.0.1以上版本的elasticsearch-head插件,使用node单独运行,会出现跨站访问的问题:

http://localhost:9200/_nodes. No 'Access-Control-Allow-Origin' 
header is present on the requested resource. 
Origin 'http://localhost:9100' is therefore not allowed access.

elasticsearch-head 安装教程如下:

1、安装node; 2、下载elasticsearch-head,安装node组件:

>git clone git://github.com/mobz/elasticsearch-head.git
>cd elasticsearch-head
>npm i
>npm i grunt-cli -g
>grunt server

3、elasticsearch.yml 增加配置项

http.cors.enabled: true
http.cors.allow-origin: /http?:\/\/127.0.0.1(:[0-9]+)?/

4、Gruntfile.js 增加hostname配置项

connect: {
         server: {
            options: {
               port: 9100,
               hostname: '*',
               base: '.',
               keepalive: true
            }
         }
      }

5、修改配置文件后各自重启

http://127.0.0.1:9100/ 访问即可(http.cors.allow-origin 里配的是127.0.0.1哦)

201611 月26

吃小龙虾

吃小龙虾旁边一小朋友问老爸:“小龙虾回不了家会不会着急啊。”老爸一下愣住了。老板过来解围:“不会的,他们全家都在这。”

201611 月26

练车

闺蜜最近练车,可把教练急死了,油门往死里踩,又不记得踩刹车,这天教练特别冷静,没骂她,也没帮她踩刹车,闺蜜战战兢兢开着,一个急刹车后,闺蜜惊恐地看着旁边的教练,教练您是不是有什么心事?教练淡定道,没什么,就是不想活了。

201611 月11

你能尿到这里么?

厕所有个水龙头漏电,本来贴了一张纸: “带电,禁止触摸!” 我拿验电笔一试,果然带电。 回到办公室,打印了一张: “你能尿到这里么?我能!” 下午开始听见惨叫,第二天惨叫依旧。

201610 月20

Nutz:fetchLinks 三级关联表的应用

        Shop_goods_type obj = shopGoodsTypeService.fetch(id);
        shopGoodsTypeService.fetchLinks(obj, null, Cnd.orderBy().asc("location"));
        for (Shop_goods_type_props o : obj.getPropsList()) {
            shopGoodsTypeService.dao().fetchLinks(o, null, Cnd.orderBy().asc("location"));
        }
201610 月20

你骂了隔壁

今天有两个同事打起来了。起先他们聊得挺开心的,后来,A同事愤愤的说:“昨天到半夜隔壁还在鬼叫,我过去臭骂了他们一顿!”   “哦”B同事正忙,停顿了一会问:“你骂了隔壁?”   A同事没回答,B同事又追问:“我说你骂隔壁啊?”   A同事听完拍案而起:“你妈个逼!”然后他们就扭打在了一起。

20169 月13

反弹无效

刚刚一女的在人行道那滋我一身水,我气愤的说:你瞎了啊?结果她听到了反而把我骂懵了,我都忘记了该怎么骂人,只说了一句:反弹…… 然后她懵了

20169 月12

VUE: htmlWebpackPlugin is not defined 解决办法

webpack.base.conf.js

vue-html 注释掉

// {
//   test: /\.html$/,
//   loader: 'vue-html'
// },

20168 月19

Nginx:绑定域名代理tomcat

server {
    listen 80;
    listen 443 ssl;
    if ( $scheme = "http" ) {
            rewrite ^(.*) https://$host$1;
    }
    server_name nutzwk.wizzer.cn;
    root "/java/work/nutzwk";   
    ssl_certificate /java/work/1_nutzwk.wizzer.cn_bundle.crt;
    ssl_certificate_key /java/work/2_nutzwk.wizzer.cn.key;
    add_header "X-UA-Compatible" "IE=Edge, chrome=1";
    location / {
        proxy_pass http://127.0.0.1:9091;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
20168 月16

备份:HttpClient 4.x POST请求

            List formParams = new ArrayList();
            formParams.add(new BasicNameValuePair("urlpp", ""));
            formParams.add(new BasicNameValuePair("urlkm", ""));
            formParams.add(new BasicNameValuePair("khjb", "2"));
            HttpEntity httpEntity = new UrlEncodedFormEntity(formParams, "UTF-8");
            HttpPost httpPost = new HttpPost(tesseract.njwztx_baseUrl + "fetchNextList.action");
            httpPost.setEntity(httpEntity);
            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
            httpPost.setHeader("X-Requested-With", "XMLHttpRequest");
            httpPost.setHeader("Cookie", "rememberPhone=1; phoneNumber=" + tesseract.getNjwztx_dhhm() + "; friendlyReminder=true;JSESSIONID=" + JSESSIONID + ";");
            HttpClient httpclient = HttpClients.createDefault();
            HttpResponse response = httpclient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            Header[] headers = response.getAllHeaders();
            for (int i = 0; i < headers.length; i++) {
                log.debug("header" + i + ":::" + headers[i]);
            }
            if (entity != null) {
                log.debug("getContentEncoding:::" + entity.getContentEncoding());
                log.debug("getContentType:::" + entity.getContentType());
                String str = EntityUtils.toString(response.getEntity());
                log.debug(str);
                Files.write("2.html", str);
            }
20167 月25

Maven:下载慢的解决办法

C:\Windows\System32\drivers\etc\hosts

151.101.24.215 repo.maven.apache.org

20167 月6

吃饭的家伙

今儿可丢人丢大发了!领导微信群里通知:带上你们吃饭的家伙,火速到办公室集合!结果去了一看,大家都拿的笔记本,就我拿了个碗……