作者存档
20209 月12

NutzWk 5.2.7 发布,Java 国产微服务分布式开发框架

本次 v5.2.7 发布带来三个版本:

  • v5.2.7-nacos Nacos 注册中心及配置中心功能微服务版本
  • v5.2.7-zookeeper Zookeeper 注册中心微服务版本
  • v5.2.7-mini 单应用一个 Jar 或 War 即可启动运行版本

技术体系

后端技术:nutzboot(国产,基于国产nutz) + dubbo + redis + shiro + quartz + logback + beetl 等主流技术
前端技术:jquery + vue.js + elementUI 和 jquery + bootstrap 两个版本可选

演示地址

V6演示地址: https://demo.budwk.com (前后端分离 nuxt+vue+elementUI)

V5演示地址: https://nutzwk.wizzer.cn (beetl+html+vue.js+elementUI)

项目介绍

NutzWk(V6起更名为BudWk)发展自2010年,2012年开始用于商业项目,至今已服务于全国各地公司大大小小上千个项目,行业涉及政务、电商、物联网等,随着经验积累及从事行业的不同分别发布了v1.x至v6.x多个版本,每个版本都是完整运行且完全开源免费的,您可以根据项目规模选择不同版本。本项目案例众多,省厅级项目、市级平台、大数据项目、电商平台、物联网平台等等,详见官网 https://budwk.com

源码地址:

V6源码地址: https://gitee.com/budwk/budwk-nutzboot

V1-V5源码地址: https://gitee.com/wizzer/NutzWk

20208 月21

BudWk 国产开源Java微服务分布式框架在智慧燃气行业的应用

燃气公司现状及痛点

  • 燃气表品牌多、型号多、计费类型多,厂家附送系统各自独立且无法自动对账,导致账目误差时有出现,实际经营情况无法实时掌握。
  • 物联网智能表具原来越多,物联网设备本身的安全监测是当前的核心问题,且因设备厂家、型号多样化,设备的统一接入、监控就尤为重要。
  • 从市场拓展到客户服务无法全流程业务管控、联动和监督,导致物资储备、施工安排、工程监督等无法根据实际情况实时管控,用户开户、移表等服务无法高效响应和调度。

BudWk微服务解决方案

  • IC卡表的统一集成

使用 WPF + CefSharp 技术,C/S客户端 + B/S浏览器的组合,利用客户端实现IC卡读写器的集成开发,实现IC卡表的读写功能,利用B/S浏览器,将营收系统嵌入浏览器,实现WEB营收业务代码热更新、数据统一管理等功能。

  • 物联网表的统一集成

抽象设备接入层,实现电信AEP平台、移动OneNET、厂家物联网平台等平台接入,实现 NB-IOT/MQTT/HTTP 等协议的适配和转换,将各表厂繁杂不一的数据格式转换为本平台统一数据格式,并利用规则引擎技术,实现数据的智能化处理。

  • 计费类型的统一集成

系统内置预付费、后付费、表端计费等计费类型,支持“购气/退气”和“充值/退费”等业务形态,支持阶梯计价、区域计价等价格规则。

  • 工单系统的统一集成

燃气报装、报修、维修、安检等业务流程标准化、制度化,通过流程配置、节点配置、权限配置等,实现业务工单的动态分配和统一管理。

后端技术框架

采用 BudWk 国产微服务分布式架构,基于 nutzboot + dubbo + nacos + druid 技术体系,核心框架为国产开源框架 nutzboot,采用 Sa-Token权限系统及JWT。根据业务划分微服务模块,如:

  • Sys – 系统及权限模块
  • Cms – 内容及资讯模块
  • Wx – 微信服务模块
  • Dev – 物联网表接入模块
  • Gas – 营收业务模块
  • WebAPI – 后端服务API模块
  • OpenAPI – 第三方服务API模块

前端技术框架

采用 Vite + Vue3 + ElementPlus 常用组合,前后端分离开发模式,封装集成多语言、路由、权限控制、文件上传等功能。

BudWk微服务分布式框架介绍

BudWk(原名NutzWk)发展自2010年,2012年开始用于商业项目,至今已服务于全国各地公司大大小小数千个项目,行业涉及政务、电商、物联网等,随着个人经验积累及从事行业的不同分别发布了1.x至8.x多个版本,您可以根据项目规模选择不同版本。本项目案例众多,省厅级项目、市级平台、大数据项目、电商平台、物联网平台等等。

https://demo.budwk.com V8演示地址

https://nutzwk.wizzer.cn V5演示地址

https://budwk.com 官网及开发指南

20201 月17

Debian 9 安装 MariaDB root登陆不需要密码问题

CREATE USER 'budwk'@'localhost' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON budwk_demo.* TO budwk@localhost;
FLUSH PRIVILEGES;
201911 月13

2019双11入手华为全家桶 Mate 30 Pro 5G 、FreeBuds 3 、车载无线充电

谈谈使用体验:

一、手机篇

实体店现货买的翡冷翠(本来预订青山黛,但实在等不了一个月,看有现货就拿了),6899¥什么优惠都没,就送了个透明手机壳,手机壳还是满合身的,满满的安全感。考虑屏幕那么大,还是花了299¥买了碎屏险。手机出厂自带贴膜(据说第一批出厂手机没贴膜),所以这点比较好,不用纠结贴什么膜了,上手即用。

1、系统

对于做IT的来说,上手很快,摸索一圈就知道权限如何设置、通知啊、广告怎么移除等。隔空手势用了,感觉实用性不大,试想下看着抖音,用手悬停半秒,然后隔空滑动屏幕,手抬着很累的手酸了都,还没手动滑屏比较快。

发现一个bug,或也可以说设置不合理的地方,156版本系统,短信的通知关闭后不知道如何打开。设置项不在“通知”里,也不在“应用”一级菜单里,而是需要到“应用”下面的“应用管理”里面,找到“信息”,然后再点“通知管理”,对于新手来说,跟捉迷藏一样,不百度或者问客服,真不知道。

APP的打开及使用,响应速度很快,几乎和iOS系统一样,为什么说几乎呢,是因为一些功能细节上,能感觉出比iOS系统慢那么一丢丢,比如微信支付成功的通知,可能与系统的通知机制不一样造成的,不过不影响使用,几乎察觉不出来。游戏还没安装,暂时略过。

短信拦截/手机拦截等功能太好了,每天收到几十条推销短信/电话,不用单独安装拦截软件,太爽了吧。

NFC功能也很好,8P虽然带NFC但是几乎没有用武之地,华为手机的NFC可以模拟小区门禁卡,真是很方便的。

关于提子,装了v2xxxNG,正好昨天又申请新的G服务器,搭建提子可以上x网,但是没有G套件,只能通过网页访问G的服务,还不是很方便。

壁纸和锁屏界面,可以自动更新一些精美的照片,很好。

情景智能,是自动弹出来的一个功能,开通后可以绑定手机号,通过快递查询平台查询到关联的所有快递物流信息,功能还是比较贴心的。

说几点不爽之处吧:

1)Android系统里的一些官方APP内嵌广告,这个在苹果APP里很少见;

2)各种APP各种请求权限,什么存储、位置、读取设备信息等等,一般很难判断该不该禁用,有的权限禁用了APP就启动不了了,如果都赋权,那么感觉手机像裸奔。

2、屏幕

屏幕很亮眼,逛商城的时候四五个小姐姐围着手机看,有一定的误操作的几率,可能用习惯就好了吧,毕竟拿到手还没有48小时。

屏幕分辨率,刚从8p LCD切换过来的时候还不习惯,看多了也就习惯了,给眼睛一个适应过程。

3、后置摄像头

额,怎么说呢,广角拍出来效果很好,但AI有点过度,色彩失真。近距拍摄,不是那么清晰的感觉,可能每个人体验不一样吧,个人感觉摄像头数量很多,但效果不是说的那么神(不知道为啥群里的网友拍的都那么好看?我是买到了假的么……23333)。平时拍照少,也就无所谓了。

3、前置摄像头

这个要吐槽一下了,后置摄像头有AI美化,前置摄像头一点AI和美化都没有,当镜子照啊,可以非常清晰的看到脸上的斑点/粉刺/黑头,额……

4、电量

比较给力的,比之前用的ip8p持久的多了。

二、车载无线快充电

今早上班开车20来分钟,60%电量充到80%,目测一天不用手动充电,上班下班通过车载充电就够用了啊哈哈哈。买的27W功率的那款。

三、蓝牙耳机

Freebuds 3 双11刚买,EMS 12号中午就送到了。耳机支持蓝牙5.1协议版本,Mate 30 Pro 5G 也是5.1协议,搭配起来很爽哦,正好坐在靠路边的窗口位置,试用了下降噪功能,开启主动降噪功能,路上的车水马龙声音真的消失了,,不过办公室里的说话声音是过滤不掉的。耳机不带调节音量功能 – -。

还有个买蓝牙耳机的重要原因,那就是Mate 30 系列打电话是屏幕发声,不开免提都能听到声音,所以为了隐私,打电话还是用蓝牙耳机比较好。

20198 月2

NutzWk 5.2.6 及 5.2.6-mini 发布,Java 微服务分布式开发框架

项目介绍:

NutzWk 是有五年多历史的Java Web开源开发框架,其5.x 是Java 微服务分布式版本,采用nutzboot(nutz核心)、dubbo、redis、zookeeper、shiro、quartz、beetl、logback、vue、sentinel(流控框架,可选)、seata(分布式事务,可选) 等开源技术的微服务分布式版本,自带系统管理、简易CMS、微信模块、定时任务、服务API等功能,目前已应用于全国各地上千个各类商业项目中。

演示地址(Vue版本): https://nutzwk.wizzer.cn

后端技术架构:nutzboot(国产,基于国产nutz) + dubbo(国产) + redis + zookeeper + shiro + quartz + logback 等主流技术 前端技术架构:vue+ element

NutzWk v5.2.6 更新内容:

  • 修改错误页机制,将前后台404/403/505 错误页严格区分;
  • 修改POJO类,引入 @PrevInsert 注解,在执行fastInsert数据快速入库时有效;
  • 修改web项目,Globals类 Map 对象改为 NutMap 方便开发;
  • 修改vue后台,系统管理中的页面弹出框,改为手动关闭;
  • 修复vue后台,数据字典管理的排序问题;
  • 其他功能的完善,vue页面优化等;
  • 相关jar包及第三方依赖的版本升级;

NutzWk v5.2.6-mini 版本发布:

  • 具有v5.2.6 全部功能的微服务mini版本(系统管理/CMS管理/微信管理/API接口等功能齐全);
  • 管理后台 vue + element;
  • 非分布式,一个jar包即可运行(无dubbo依赖、无需zookepper,只需安装数据库+redis);
  • 非常适合小型项目快速开发;
20193 月19

NutzWk 5.2.0(一周年版) 微服务开发框架,运维中心重磅发布

NutzWk 5.2.0 版本已发布,演示地址: https://nutzwk.wizzer.cn

源码Github:https://github.com/Wizzercn/NutzWk 码云Gitee:https://gitee.com/wizzer/NutzWk

后端技术架构:nutzboot + dubbo + sentinel + redis + zookeeper 前端技术架构:vue.js + element.js

简述: 自 2018.03.20 发布 v5.0.1 第一个微服务分布式版本、2018.11.13 发布 v5.1.0 第一个Vue版本,一年来 NutzWk 根据项目实践及业务需要,逐步完善功能、修复bug、添加新特性,朝着“快速开发、功能丰富、扩展性强、性能优越”,在力所能及的情况下,最大限度的提高Web开发人员的生产力的目标继续前进。

随着项目越做越多,运维成了繁重的工作,本次 v5.2.0 周年版本主要带来了可在线上传jar包、编辑配置文件、关闭实例进程、启动新实例进程、动态修改日志等级、查看服务器资源占用情况等功能,支持分布式部署。详见:发行注记

01 02 03 04
20191 月24

NutzWk 5.1.4 发布,Java 微服务分布式开发框架

NutzWk 5.1.4 Vue版本已发布,演示地址: https://nutzwk.wizzer.cn

源码Github:https://github.com/Wizzercn/NutzWk 码云Gitee:https://gitee.com/wizzer/NutzWk

 

NutzWk 5.1.4 更新内容:

  • * 集成 Sentinel 流控框架,支持流量控制、熔断降级、系统负载保护等(默认不启用);
  • * 日志系统从 log4j 改为 logback,编写starter-logback-exts 方便微服务模块调用(默认启用);
  • * 新增系统监控功能,后台可查看运行实例的进程ID、运行时间、JVM内存情况等,并可在不重启的情况下动态修改各微服务模块的日志等级;
  • * 系统微服务模块原 daocache 数据库缓存改为 wkcache 方法缓存,支持分布式部署;
  • * 为每个微服务模块瘦身,去掉多余的依赖包;
  • * 一些第三方依赖包的版本升级;
  • * 一些功能的修复及完善;

 

NutzWk 是 Java 微服务分布式开发框架,5.x 是采用nutzboot、nutz、dubbo、sentinel、redis、zookeeper、shiro、quartz、beetl、logback等开源技术的微服务分布式版本,自带系统管理、简易CMS、微信模块、定时任务、服务API等功能,目前已全面应用于各类商业项目中。

201811 月12

NutzWk 5.1.0 微服务开发框架,Vue版本已发布

NutzWk 5.1.0 Vue版本已发布,演示地址: https://nutzwk.wizzer.cn

源码Github:https://github.com/Wizzercn/NutzWk 码云Gitee:https://gitee.com/wizzer/NutzWk

本次更新内容:

  • wk-nb-web-vue 新增全新的Vue后台管理界面,基于Vue.js + Element.js 等,增强交互体验;
  • 基础服务类 BaseService 新增一些常用的查询方法;
  • 微信模块增加图片自动回复、群发图片、微信菜单可配小程序等功能;
  • CMS模块增加前台模板标签示例代码;
  • 增强Oracle及MySQL兼容性;
  • 支持Openjdk 11;

后端技术架构:java nutzboot + dubbo + zookeeper 前端技术架构:vue.js + element.js + bootstrap

20187 月19

MqttWk: 基于nutzboot + t-io + redis + kafka 实现的MQTT服务端开源项目

项目首页:https://github.com/Wizzercn/MqttWk

MqttWk

基于 nutzboot + t-io + redis + kafka 实现的MQTT服务broker

本项目代码主要来源于 netty/t-io/iot-mqtt-server 等众多项目,开源免费,欢迎交流学习

参考项目

使用说明

软件架构说明

  1. 使用t-io实现通信及协议解析
  2. 使用nutzboot提供依赖注入及属性配置
  3. 使用redis实现消息缓存,集群
  4. 使用kafka实现消息代理

项目结构

MqttWk
  ├── mqtt-codec -- MQTT协议解析的t-io实现
  ├── mqtt-auth -- MQTT服务连接时用户名和密码认证
  ├── mqtt-broker -- MQTT服务器功能的核心实现
  ├── mqtt-common -- 公共类及其他模块使用的服务接口及对象
  ├── mqtt-store -- MQTT服务器会话信息(redis缓存及kafka加载)
  ├── mqtt-zoo -- 教程文档或文件
    ├── mqtt-test-kafka -- kafka消费者接收消息
    ├── mqtt-test-websocket -- websocket通信测试示例

功能说明

  1. 参考MQTT3.1.1规范实现
  2. 完整的QoS服务质量等级实现
  3. 遗嘱消息, 保留消息及消息分发重试
  4. 心跳机制
  5. MQTT连接认证(可选择是否开启)
  6. SSL方式连接(可选择是否开启)
  7. 主题过滤(支持单主题订阅如 /mqtt/test –不可以/结尾, 通配符订阅 /mqtt/# –以/#结尾)
  8. Websocket支持(可选择是否开启)
  9. 集群功能

快速开始

  • 下载已打包好的可运行的jar文件
  • 运行jar文件(如果需要修改配置项,可以在application.properties修改)
  • 打开mqtt-spy客户端, 填写相应配置下载
  • 连接端口:8885, websocket 端口: 9995 websocket path: /mqtt
  • 连接使用的用户名: demo
  • 连接使用的密码: 8F3B8DE2FDC8BD3D792BE77EAC412010971765E5BDD6C499ADCEE840CE441BDEF17E30684BD95CA708F55022222CC6161D0D23C2DFCB12F8AC998F59E7213393
  • 连接使用的证书在 mqtt-zoo\keystore\server.cer

集群使用

  • 多机环境集群:
    • mqttwk.broker.kafka.bootstrap.servers=192.168.1.101:9092,192.168.1.102:9093
    • redis.mode=cluster
    • redis.nodes=192.168.1.103:16379,192.168.1.104:26379
  • 单机环境集群:
    • mqttwk.broker.kafka.bootstrap.servers=127.0.0.1:9092,127.0.0.1:9093
    • redis.mode=normal
    • redis.host=127.0.0.1

自定义 – 连接认证

  • 默认只是简单使用对用户名进行RSA密钥对加密生成密码, 连接认证时对密码进行解密和相应用户名进行匹配认证
  • 使用中如果需要实现连接数据库或其他方式进行连接认证, 只需要重写mqtt-auth模块下的相应方法即可

自定义 – 服务端证书

  • 服务端证书存储在mqtt-brokerresources/keystore/server.jks
  • 用户可以制作自己的证书, 但存储位置和文件名必须使用上述描述的位置及文件名

生成环境部署

  • 生成环境部署建议使用keepalived+nginx+mqtt-broker方式
  • 使用nginx的tcp和websocket反向代理mqtt-broker集群实现负载均衡
  • 使用keepalived实现nginx的高可用
20186 月9

NutzWk 5.0.x 微服务分布式版本开发及部署说明

NutzWk 5.x 已发布一段时间,这段时间基于此版本开发了智慧水务系统(NB-IOT)、某物联网平台、某设备租赁平台、某智慧睡眠平台、某智慧园区项目等,开发和部署过程中遇到一些小问题,开这个帖子把一些经验分享出来省的大家走弯路。

项目地址1: https://github.com/Wizzercn/NutzWk 项目地址2: https://gitee.com/wizzer/NutzWk

1、运行环境 其实项目readme和wk-wiki 已经写的很清楚了,在此强调一下,不是说非这些版本不可,但对于新手来说最好版本号保持一致,能跑起来了您再折腾玩~~

<span class="pln">JDK </span>
<span class="lit">8</span> <span class="lit">162</span> <span class="pun">+</span>
<span class="typ">Maven</span> <span class="lit">3.5</span>
<span class="pun">.</span>
<span class="lit">3</span> <span class="pun">+</span>
<span class="typ">Redis</span> <span class="lit">4.0</span>
<span class="pun">.</span>
<span class="lit">8</span> <span class="pun">+</span>
<span class="typ">MySql</span> <span class="lit">5.7</span> <span class="pun">+</span>
<span class="typ">Zookeeper</span> <span class="lit">3.4</span>
<span class="pun">.</span>
<span class="lit">11</span> <span class="pun">+</span>

2、开发环境 一般建议使用IDEA进行开发,因为是maven多模块的项目,直接用IDEA打开项目根目录,它会通过maven下载jar包,自动构建项目 然后如何启动项目呢,有很多种方式,简单说几个: 1)打开每个NB项目(nutzboot简称)项目里的main类,右击运行,例如 cn.wizzer.sys.commons.core.***MainLauncher 2)通过IDEA 的Run 配置 Application 运行,详见 https://github.com/Wizzercn/NutzWk/blob/nutzboot-dubbo/wk-wiki/01.QuickStart/01.02.Start.md 3)命令行在NB项目根目录运行mvn compile nutzboot:run 或者IDEA右侧Maven管理界面里通过插件运行,,详见 https://github.com/nutzam/nutzboot-maven-plugin

3、启动顺序 保证MySQL、Redis、Zookeeper 都正常启动且为默认端口及默认配置(当然这些配置项可以在application.properties 修改的) 1)MySQL创建一个空白数据库,编码格式为UTF-8,数据库名称 nutzwk_nb 2)NB项目的模块启动顺序是 sys –> cms[可选] –> wx[可选] –> task[可选] –> web-platform –> web-api[可选] 3)如上所述,如果想运行访问后台,只需要启动 sys 和 web-platform即可,注意是有启动顺序的,其他模块需要用就启 4)task 定时任务是依赖于sys的,而web-platform系统管理对定时任务管理是依赖于 task模块的,如果你想让task独立运行并且不需要通过页面进行管理,自己少做改动即可,不是不可以哦

4、部署注意事项 1)因为登录页面对密码进行了RSA加密,有时候部署会遇到怎么也登录不了,而后台抛异常 java.lang.SecurityException: JCE cannot authenticate the provider BC 的情况,解决方法在代码注释里已写明了,不过很少有人去看 https://github.com/Wizzercn/NutzWk/blob/nutzboot-dubbo/wk-app/wk-nb-web-platform/src/main/java/cn/wizzer/app/web/commons/shiro/filter/PlatformAuthenticationFilter.java

<span class="lit">1</span>
<span class="pun">、编辑文件</span> <span class="pun">/</span>
<span class="pln">usr</span>
<span class="pun">/</span>
<span class="pln">java</span>
<span class="pun">/</span>
<span class="pln">jdk1</span>
<span class="pun">.</span>
<span class="lit">8.0</span>
<span class="pln">_162</span>
<span class="pun">/</span>
<span class="pln">jre</span>
<span class="pun">/</span>
<span class="pln">lib</span>
<span class="pun">/</span>
<span class="pln">security</span>
<span class="pun">/</span>
<span class="pln">java</span>
<span class="pun">.</span>
<span class="pln">security
     </span>
<span class="pun">在</span>
<span class="lit">9</span>
<span class="pun">下面添加</span>
<span class="pln"> security</span>
<span class="pun">.</span>
<span class="pln">provider</span>
<span class="pun">.</span>
<span class="lit">10</span>
<span class="pun">=</span>
<span class="pln">org</span>
<span class="pun">.</span>
<span class="pln">bouncycastle</span>
<span class="pun">.</span>
<span class="pln">jce</span>
<span class="pun">.</span>
<span class="pln">provider</span>
<span class="pun">.</span>
<span class="typ">BouncyCastleProvider</span>
<span class="lit">2</span>
<span class="pun">、拷贝</span>
<span class="pln"> bcprov</span>
<span class="pun">-</span>
<span class="pln">jdk16</span>
<span class="pun">-</span>
<span class="lit">143.jar</span> <span class="pun">和</span>
<span class="pln"> bcprov</span>
<span class="pun">-</span>
<span class="pln">jdk15</span>
<span class="pun">-</span>
<span class="lit">135.jar</span> <span class="pun">到</span> <span class="pun">/</span>
<span class="pln">usr</span>
<span class="pun">/</span>
<span class="pln">java</span>
<span class="pun">/</span>
<span class="pln">jdk1</span>
<span class="pun">.</span>
<span class="lit">8.0</span>
<span class="pln">_162</span>
<span class="pun">/</span>
<span class="pln">jre</span>
<span class="pun">/</span>
<span class="pln">lib</span>
<span class="pun">/</span>
<span class="pln">ext </span>
<span class="pun">目录下</span>
<span class="lit">3</span>
<span class="pun">、别问我上面两个文件怎么找……</span>

(如果您是https的话可以把RSA加密方式改掉弃用哦) 2)服务器注意事项:服务器时间同步做没做、hosts里配没配主机名hostname和127.0.0.1的映射关系、内存够不够用(有没有给jar指定内存大小)等

5、其他 1)请关注 NutzWk 的动态,有新的版本发布建议及时更新,往往会修复问题或新增功能 2)如果 NutzWk 给了您帮助,或已用于生产, https://wizzer.cn/donation 欢迎打赏一定金额以资鼓励,创造国内良好的开源环境 3)最后感谢兽兽及nutz社区广大网友的帮助和鼓励,没有您们的支持,这个项目不会历经6年多还在更新前进

20184 月24

Java代码中使用代理

//设置代理  
System.setProperty("http.proxySet", "true");  
System.setProperty("http.proxyHost", "127.0.0.1");  
System.setProperty("http.proxyPort", "1080");
20182 月26

利用nutz+t-io实现硬件设备的socket通信

 

1、MainServer 启动类

/**
 * Created by Wizzer on 2018/2/26.
 */
@IocBean
public class MainServer {
    private static final Log log = Logs.get();

    public static void main(String[] args) {
        try {
            ComboIocLoader loader = new ComboIocLoader(
                    new String[]{"*json", "config/ioc/", "*anno", "cn.wizzer","*rabbitmq"}
            );
            NutIoc ioc = new NutIoc(loader);
            //socket
            ioc.get(SocketServer.class).init();
            //http
            ioc.get(HttpServer.class).init();
            //mq
            String topicQueue = "sweeper-tioTopicQueue";
            ConnectionFactory factory = ioc.get(ConnectionFactory.class, "rabbitmq_cf");
            Connection rabbitmq_conn = factory.newConnection();
            Channel rabbitmq_channel = rabbitmq_conn.createChannel();
            rabbitmq_channel.queueDeclare(topicQueue, true, false, false, null);
            rabbitmq_channel.exchangeDeclare("sweeper-tioTopicExchange", BuiltinExchangeType.TOPIC, true);
            rabbitmq_channel.queueBind(topicQueue, "sweeper-tioTopicExchange", "tio.#");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

2、SocketServer 数据接收

 

/**
 * Created by Wizzer on 2018/2/26.
 */
@IocBean
public class SocketServer {
    private static final Log log = Logs.get();
    //handler, 包括编码、解码、消息处理
    @Inject
    private MyServerAioHandler myServerAioHandler;
    //事件监听器,可以为null,但建议自己实现该接口,可以参考showcase了解些接口
    private ServerAioListener aioListener;
    //一组连接共用的上下文对象
    private ServerGroupContext serverGroupContext;
    //aioServer对象
    private AioServer aioServer;
    //有时候需要绑定ip,不需要则null
    private String serverIp;
    @Inject
    private PropertiesProxy conf;

    public void init() throws Exception {
        int port = conf.getInt("server.socket.port", 8600);
        log.debug("socket port::" + port);
        serverGroupContext = new ServerGroupContext("tio", myServerAioHandler, aioListener);
        serverGroupContext.setHeartbeatTimeout(30000);
        aioServer = new AioServer(serverGroupContext);
        aioServer.start(serverIp, port);
    }
}

3、socket 数据包的解析

4、RabbitMQ 队列+消费者 实现数据入库

5、HttpServer 提供HTTP API用于对设备发送命令

6、socket 命令包的下发

 

源码:https://gitee.com/wizzer/demo



20181 月21

Elasticsearch 6.1.2 (二)分页查询、排序、关键词查询,集合beetl实现前台展示

后台代码,自定义tag:

<span class="kwd">package</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">web</span>
<span class="pun">.</span>
<span class="pln">modules</span>
<span class="pun">.</span>
<span class="pln">tags</span>
<span class="pun">;</span>

<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">web</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">ex</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="typ">EsService</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">web</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">utils</span>
<span class="pun">.</span>
<span class="typ">YcDateUtil</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">ycold</span>
<span class="pun">.</span>
<span class="pln">modules</span>
<span class="pun">.</span>
<span class="pln">services</span>
<span class="pun">.</span>
<span class="typ">YcoldInquiryService</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">framework</span>
<span class="pun">.</span>
<span class="pln">page</span>
<span class="pun">.</span>
<span class="typ">Pagination</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">apache</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">lang3</span>
<span class="pun">.</span>
<span class="typ">BooleanUtils</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">apache</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">lang3</span>
<span class="pun">.</span>
<span class="typ">StringUtils</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">apache</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">lang3</span>
<span class="pun">.</span>
<span class="pln">math</span>
<span class="pun">.</span>
<span class="typ">NumberUtils</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">beetl</span>
<span class="pun">.</span>
<span class="pln">core</span>
<span class="pun">.</span>
<span class="typ">GeneralVarTagBinding</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">action</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchRequestBuilder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">action</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchResponse</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">action</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchType</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">common</span>
<span class="pun">.</span>
<span class="pln">text</span>
<span class="pun">.</span>
<span class="typ">Text</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">index</span>
<span class="pun">.</span>
<span class="pln">query</span>
<span class="pun">.</span>
<span class="typ">BoolQueryBuilder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">index</span>
<span class="pun">.</span>
<span class="pln">query</span>
<span class="pun">.</span>
<span class="typ">QueryBuilders</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchHits</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="pln">fetch</span>
<span class="pun">.</span>
<span class="pln">subphase</span>
<span class="pun">.</span>
<span class="pln">highlight</span>
<span class="pun">.</span>
<span class="typ">HighlightBuilder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="pln">fetch</span>
<span class="pun">.</span>
<span class="pln">subphase</span>
<span class="pun">.</span>
<span class="pln">highlight</span>
<span class="pun">.</span>
<span class="typ">HighlightField</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="pln">sort</span>
<span class="pun">.</span>
<span class="typ">SortOrder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">ioc</span>
<span class="pun">.</span>
<span class="pln">impl</span>
<span class="pun">.</span>
<span class="typ">PropertiesProxy</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">ioc</span>
<span class="pun">.</span>
<span class="pln">loader</span>
<span class="pun">.</span>
<span class="pln">annotation</span>
<span class="pun">.</span>
<span class="typ">Inject</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">ioc</span>
<span class="pun">.</span>
<span class="pln">loader</span>
<span class="pun">.</span>
<span class="pln">annotation</span>
<span class="pun">.</span>
<span class="typ">IocBean</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">lang</span>
<span class="pun">.</span>
<span class="typ">Strings</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">lang</span>
<span class="pun">.</span>
<span class="typ">Times</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">log</span>
<span class="pun">.</span>
<span class="typ">Log</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">log</span>
<span class="pun">.</span>
<span class="typ">Logs</span>
<span class="pun">;</span>

<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">ArrayList</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">Date</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">List</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">Map</span>
<span class="pun">;</span>

<span class="com">/**
 * Created by wizzer on 2018/1/20.
 */</span>
<span class="lit">@IocBean</span>
<span class="kwd">public</span> <span class="kwd">class</span> <span class="typ">YcoldInquiryListTag</span> <span class="kwd">extends</span> <span class="typ">GeneralVarTagBinding</span> <span class="pun">{</span>
    <span class="kwd">private</span> <span class="kwd">final</span> <span class="kwd">static</span> <span class="typ">Log</span>
<span class="pln"> log </span>
<span class="pun">=</span> <span class="typ">Logs</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">();</span>
    <span class="lit">@Inject</span>
    <span class="kwd">private</span> <span class="typ">EsService</span>
<span class="pln"> esService</span>
<span class="pun">;</span>
    <span class="lit">@Inject</span>
    <span class="kwd">private</span> <span class="typ">YcoldInquiryService</span>
<span class="pln"> ycoldInquiryService</span>
<span class="pun">;</span>
    <span class="lit">@Inject</span>
    <span class="kwd">private</span> <span class="typ">PropertiesProxy</span>
<span class="pln"> cfg</span>
<span class="pun">;</span>

    <span class="lit">@Override</span>
    <span class="kwd">public</span> <span class="kwd">void</span>
<span class="pln"> render</span>
<span class="pun">()</span> <span class="pun">{</span>
        <span class="typ">String</span>
<span class="pln"> startDate </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"startDate"</span>
<span class="pun">));</span>
        <span class="typ">String</span>
<span class="pln"> endDate </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"endDate"</span>
<span class="pun">));</span>
        <span class="typ">String</span>
<span class="pln"> keyword </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"keyword"</span>
<span class="pun">));</span>
        <span class="kwd">int</span>
<span class="pln"> pageNumber </span>
<span class="pun">=</span> <span class="typ">NumberUtils</span>
<span class="pun">.</span>
<span class="pln">toInt</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"pageNumber"</span>
<span class="pun">)),</span> <span class="lit">1</span>
<span class="pun">);</span>
        <span class="kwd">int</span>
<span class="pln"> pageSize </span>
<span class="pun">=</span> <span class="typ">NumberUtils</span>
<span class="pun">.</span>
<span class="pln">toInt</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"pageSize"</span>
<span class="pun">)),</span> <span class="lit">10</span>
<span class="pun">);</span>
        <span class="kwd">boolean</span>
<span class="pln"> highlight </span>
<span class="pun">=</span> <span class="typ">BooleanUtils</span>
<span class="pun">.</span>
<span class="pln">toBoolean</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"highlight"</span>
<span class="pun">)));</span>
        <span class="kwd">boolean</span>
<span class="pln"> explain </span>
<span class="pun">=</span> <span class="typ">BooleanUtils</span>
<span class="pun">.</span>
<span class="pln">toBoolean</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"explain"</span>
<span class="pun">)));</span>
        <span class="typ">String</span>
<span class="pln"> sortName </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"sortName"</span>
<span class="pun">));</span>
        <span class="typ">String</span>
<span class="pln"> sortOrder </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"sortOrder"</span>
<span class="pun">));</span>
        <span class="typ">Pagination</span>
<span class="pln"> page </span>
<span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Pagination</span>
<span class="pun">();</span>
<span class="pln">
        page</span>
<span class="pun">.</span>
<span class="pln">setPageNo</span>
<span class="pun">(</span>
<span class="pln">pageNumber</span>
<span class="pun">);</span>
<span class="pln">
        page</span>
<span class="pun">.</span>
<span class="pln">setPageSize</span>
<span class="pun">(</span>
<span class="pln">pageSize</span>
<span class="pun">);</span>
        <span class="kwd">try</span> <span class="pun">{</span>
            <span class="typ">BoolQueryBuilder</span>
<span class="pln"> query </span>
<span class="pun">=</span> <span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">boolQuery</span>
<span class="pun">();</span>
            <span class="com">//根据名称查询</span>
            <span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">keyword</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="pln">
                query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">wildcardQuery</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">,</span> <span class="str">"*"</span> <span class="pun">+</span>
<span class="pln"> keyword </span>
<span class="pun">+</span> <span class="str">"*"</span>
<span class="pun">));</span>
            <span class="pun">}</span>
            <span class="com">//截止时间大于等于现在</span>
<span class="pln">
            query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">rangeQuery</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">).</span>
<span class="pln">gte</span>
<span class="pun">(</span>
<span class="typ">Times</span>
<span class="pun">.</span>
<span class="pln">format</span>
<span class="pun">(</span>
<span class="str">"yyyyMMddHHmmss"</span>
<span class="pun">,</span> <span class="kwd">new</span> <span class="typ">Date</span>
<span class="pun">())));</span>
            <span class="com">//公共日期起</span>
            <span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">startDate</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="pln">
                query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">rangeQuery</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">).</span>
<span class="pln">gte</span>
<span class="pun">(</span>
<span class="pln">startDate</span>
<span class="pun">.</span>
<span class="pln">replaceAll</span>
<span class="pun">(</span>
<span class="str">"-"</span>
<span class="pun">,</span>
<span class="str">""</span>
<span class="pun">)));</span>
            <span class="pun">}</span>
            <span class="com">//公共日期至</span>
            <span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">endDate</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="pln">
                query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">rangeQuery</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">).</span>
<span class="pln">lte</span>
<span class="pun">(</span>
<span class="pln">endDate</span>
<span class="pun">.</span>
<span class="pln">replaceAll</span>
<span class="pun">(</span>
<span class="str">"-"</span>
<span class="pun">,</span>
<span class="str">""</span>
<span class="pun">)));</span>
            <span class="pun">}</span>
            <span class="com">//几个状态条件</span>
<span class="pln">
            query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">matchQuery</span>
<span class="pun">(</span>
<span class="str">"BUYER_STS"</span>
<span class="pun">,</span> <span class="str">"N"</span>
<span class="pun">));</span>
<span class="com">//采购商状态</span>
<span class="pln">
            query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">matchQuery</span>
<span class="pun">(</span>
<span class="str">"STS"</span>
<span class="pun">,</span> <span class="str">"A"</span>
<span class="pun">));</span>
<span class="com">//状态</span>
<span class="pln">
            query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">matchQuery</span>
<span class="pun">(</span>
<span class="str">"ANNOMK"</span>
<span class="pun">,</span> <span class="str">"Y"</span>
<span class="pun">));</span>
<span class="com">//公告註記</span>
            <span class="typ">SearchRequestBuilder</span>
<span class="pln"> srb </span>
<span class="pun">=</span>
<span class="pln"> esService</span>
<span class="pun">.</span>
<span class="pln">getClient</span>
<span class="pun">().</span>
<span class="pln">prepareSearch</span>
<span class="pun">(</span>
<span class="pln">cfg</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"es.index.name"</span>
<span class="pun">))</span>
                    <span class="pun">.</span>
<span class="pln">setSearchType</span>
<span class="pun">(</span>
<span class="typ">SearchType</span>
<span class="pun">.</span>
<span class="pln">DFS_QUERY_THEN_FETCH</span>
<span class="pun">)</span>
                    <span class="pun">.</span>
<span class="pln">setTypes</span>
<span class="pun">(</span>
<span class="str">"inquiry"</span>
<span class="pun">)</span>
                    <span class="pun">.</span>
<span class="pln">setQuery</span>
<span class="pun">(</span>
<span class="pln">query</span>
<span class="pun">)</span>
                    <span class="com">//分页</span>
                    <span class="pun">.</span>
<span class="pln">setFrom</span>
<span class="pun">((</span>
<span class="pln">pageNumber </span>
<span class="pun">-</span> <span class="lit">1</span>
<span class="pun">)</span> <span class="pun">*</span>
<span class="pln"> pageSize</span>
<span class="pun">).</span>
<span class="pln">setSize</span>
<span class="pun">(</span>
<span class="pln">pageSize</span>
<span class="pun">)</span>
                    <span class="com">//是否按匹配度排序</span>
                    <span class="pun">.</span>
<span class="pln">setExplain</span>
<span class="pun">(</span>
<span class="pln">explain</span>
<span class="pun">);</span>

            <span class="kwd">if</span> <span class="pun">(</span>
<span class="pln">highlight</span>
<span class="pun">)</span> <span class="pun">{</span>
                <span class="typ">HighlightBuilder</span>
<span class="pln"> highlightBuilder </span>
<span class="pun">=</span> <span class="kwd">new</span> <span class="typ">HighlightBuilder</span>
<span class="pun">().</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"*"</span>
<span class="pun">).</span>
<span class="pln">requireFieldMatch</span>
<span class="pun">(</span>
<span class="kwd">false</span>
<span class="pun">);</span>
<span class="pln">
                highlightBuilder</span>
<span class="pun">.</span>
<span class="pln">preTags</span>
<span class="pun">(</span>
<span class="str">"<span style=\"color:red\">"</span>
<span class="pun">);</span>
<span class="pln">
                highlightBuilder</span>
<span class="pun">.</span>
<span class="pln">postTags</span>
<span class="pun">(</span>
<span class="str">"</span>"</span>
<span class="pun">);</span>
<span class="pln">
                srb</span>
<span class="pun">.</span>
<span class="pln">highlighter</span>
<span class="pun">(</span>
<span class="pln">highlightBuilder</span>
<span class="pun">);</span>
            <span class="pun">}</span>
            <span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">sortName</span>
<span class="pun">))</span> <span class="pun">{</span>
                <span class="typ">String</span>
<span class="pun">[]</span>
<span class="pln"> sortNames </span>
<span class="pun">=</span> <span class="typ">StringUtils</span>
<span class="pun">.</span>
<span class="pln">split</span>
<span class="pun">(</span>
<span class="pln">sortName</span>
<span class="pun">,</span> <span class="str">","</span>
<span class="pun">);</span>
                <span class="kwd">if</span> <span class="pun">(</span>
<span class="str">"asc"</span>
<span class="pun">.</span>
<span class="pln">equalsIgnoreCase</span>
<span class="pun">(</span>
<span class="pln">sortOrder</span>
<span class="pun">))</span> <span class="pun">{</span>
                    <span class="kwd">for</span> <span class="pun">(</span>
<span class="typ">String</span>
<span class="pln"> s </span>
<span class="pun">:</span>
<span class="pln"> sortNames</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
                        srb</span>
<span class="pun">.</span>
<span class="pln">addSort</span>
<span class="pun">(</span>
<span class="pln">s</span>
<span class="pun">,</span> <span class="typ">SortOrder</span>
<span class="pun">.</span>
<span class="pln">ASC</span>
<span class="pun">);</span>
                    <span class="pun">}</span>
                <span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span>
                    <span class="kwd">for</span> <span class="pun">(</span>
<span class="typ">String</span>
<span class="pln"> s </span>
<span class="pun">:</span>
<span class="pln"> sortNames</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
                        srb</span>
<span class="pun">.</span>
<span class="pln">addSort</span>
<span class="pun">(</span>
<span class="pln">s</span>
<span class="pun">,</span> <span class="typ">SortOrder</span>
<span class="pun">.</span>
<span class="pln">DESC</span>
<span class="pun">);</span>
                    <span class="pun">}</span>
                <span class="pun">}</span>
            <span class="pun">}</span>
<span class="pln">
            log</span>
<span class="pun">.</span>
<span class="pln">debug</span>
<span class="pun">(</span>
<span class="str">"srb:::\r\n"</span> <span class="pun">+</span>
<span class="pln"> srb</span>
<span class="pun">.</span>
<span class="pln">toString</span>
<span class="pun">());</span>

            <span class="typ">SearchResponse</span>
<span class="pln"> response </span>
<span class="pun">=</span>
<span class="pln"> srb</span>
<span class="pun">.</span>
<span class="pln">execute</span>
<span class="pun">().</span>
<span class="pln">actionGet</span>
<span class="pun">();</span>
            <span class="typ">SearchHits</span>
<span class="pln"> hits </span>
<span class="pun">=</span>
<span class="pln"> response</span>
<span class="pun">.</span>
<span class="pln">getHits</span>
<span class="pun">();</span>
<span class="pln">
            page</span>
<span class="pun">.</span>
<span class="pln">setTotalCount</span>
<span class="pun">((</span>
<span class="kwd">int</span>
<span class="pun">)</span>
<span class="pln"> hits</span>
<span class="pun">.</span>
<span class="pln">getTotalHits</span>
<span class="pun">());</span>
            <span class="typ">List</span>
<span class="pun"><</span>
<span class="typ">Map</span>
<span class="pun"><</span>
<span class="typ">String</span>
<span class="pun">,</span> <span class="typ">Object</span>
<span class="pun">>></span>
<span class="pln"> list </span>
<span class="pun">=</span> <span class="kwd">new</span> <span class="typ">ArrayList</span>
<span class="pun"><>();</span>
<span class="pln">
            hits</span>
<span class="pun">.</span>
<span class="pln">forEach</span>
<span class="pun">(</span>
<span class="pln">searchHit </span>
<span class="pun">-></span> <span class="pun">{</span>
                <span class="typ">Map</span>
<span class="pun"><</span>
<span class="typ">String</span>
<span class="pun">,</span> <span class="typ">Object</span>
<span class="pun">></span>
<span class="pln"> source </span>
<span class="pun">=</span>
<span class="pln"> searchHit</span>
<span class="pun">.</span>
<span class="pln">getSourceAsMap</span>
<span class="pun">();</span>
                <span class="typ">Map</span>
<span class="pun"><</span>
<span class="typ">String</span>
<span class="pun">,</span> <span class="typ">HighlightField</span>
<span class="pun">></span>
<span class="pln"> highlightFields </span>
<span class="pun">=</span>
<span class="pln"> searchHit</span>
<span class="pun">.</span>
<span class="pln">getHighlightFields</span>
<span class="pun">();</span>
                <span class="com">//name高亮</span>
                <span class="typ">HighlightField</span>
<span class="pln"> nameField </span>
<span class="pun">=</span>
<span class="pln"> highlightFields</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">);</span>
                <span class="kwd">if</span> <span class="pun">(</span>
<span class="pln">nameField </span>
<span class="pun">!=</span> <span class="kwd">null</span>
<span class="pun">)</span> <span class="pun">{</span>
                    <span class="typ">Text</span>
<span class="pun">[]</span>
<span class="pln"> fragments </span>
<span class="pun">=</span>
<span class="pln"> nameField</span>
<span class="pun">.</span>
<span class="pln">fragments</span>
<span class="pun">();</span>
                    <span class="typ">String</span>
<span class="pln"> tmp </span>
<span class="pun">=</span> <span class="str">""</span>
<span class="pun">;</span>
                    <span class="kwd">for</span> <span class="pun">(</span>
<span class="typ">Text</span>
<span class="pln"> text </span>
<span class="pun">:</span>
<span class="pln"> fragments</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
                        tmp </span>
<span class="pun">+=</span>
<span class="pln"> text</span>
<span class="pun">;</span>
                    <span class="pun">}</span>
<span class="pln">
                    source</span>
<span class="pun">.</span>
<span class="pln">put</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">,</span>
<span class="pln"> tmp</span>
<span class="pun">);</span>
                <span class="pun">}</span>
<span class="pln">
                source</span>
<span class="pun">.</span>
<span class="pln">put</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">,</span> <span class="typ">YcDateUtil</span>
<span class="pun">.</span>
<span class="pln">get_yyyyMMdd_HHmm</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="pln">source</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">))));</span>
<span class="pln">
                source</span>
<span class="pun">.</span>
<span class="pln">put</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">,</span> <span class="typ">YcDateUtil</span>
<span class="pun">.</span>
<span class="pln">get_yyyyMMdd</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="pln">source</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">))));</span>
<span class="pln">
                list</span>
<span class="pun">.</span>
<span class="pln">add</span>
<span class="pun">(</span>
<span class="pln">source</span>
<span class="pun">);</span>
            <span class="pun">});</span>
<span class="pln">
            page</span>
<span class="pun">.</span>
<span class="pln">setList</span>
<span class="pun">(</span>
<span class="pln">list</span>
<span class="pun">);</span>
        <span class="pun">}</span> <span class="kwd">catch</span> <span class="pun">(</span>
<span class="typ">Exception</span>
<span class="pln"> e</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
            e</span>
<span class="pun">.</span>
<span class="pln">printStackTrace</span>
<span class="pun">();</span>
        <span class="pun">}</span>
        <span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">binds</span>
<span class="pun">(</span>
<span class="pln">page</span>
<span class="pun">);</span>
        <span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">doBodyRender</span>
<span class="pun">();</span>
    <span class="pun">}</span>
<span class="pun">}</span>

前台beetl页面:

<span class="pln">  <#ycold_inquiry_list pageNumber="${pageNumber}" pageSize="${pageSize}" startDate="${startDate}" endDate="${endDate}" keyword="${keyword}" sortName="ANNODAT" sortOrder="desc" highlight="false" var="p">

    </span>
<span class="tag"><table</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"list_table_blue even_table"</span>
<span class="tag">></span>
        <span class="tag"><thead></span>
        <span class="tag"><tr></span>
            <span class="tag"><th></span>
<span class="pln">公告日期</span>
<span class="tag"></th></span>
            <span class="tag"><th></span>
<span class="pln">案件名称</span>
<span class="tag"></th></span>
            <span class="tag"><th></span>
<span class="pln">交货地点</span>
<span class="tag"></th></span>
            <span class="tag"><th></span>
<span class="pln">报价截止日期</span>
<span class="tag"></th></span>
            <span class="tag"><th</span> <span class="atn">width</span>
<span class="pun">=</span>
<span class="atv">"110"</span>
<span class="tag">></span>
<span class="pln">查看详细</span>
<span class="tag"></th></span>
        <span class="tag"></tr></span>
        <span class="tag"></thead></span>
        <span class="tag"><tbody></span>
        <span class="pun"><%</span>
<span class="kwd">for</span>
<span class="pun">(</span>
<span class="pln">o </span>
<span class="kwd">in</span>
<span class="pln"> p</span>
<span class="pun">.</span>
<span class="pln">list</span>
<span class="pun">){</span>
<span class="pln">%>
        </span>
<span class="tag"><tr></span>
            <span class="tag"><td></span>
<span class="pln">${o.ANNODAT!}</span>
<span class="tag"></td></span>
            <span class="tag"><td</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"l_text"</span>
<span class="tag">><a</span> <span class="atn">href</span>
<span class="pun">=</span>
<span class="atv">"${base!}/purchase/info/${o.XUID!}"</span> <span class="atn">target</span>
<span class="pun">=</span>
<span class="atv">"_blank"</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"td_a hide1"</span>
<span class="tag">></span>
<span class="pln">${o.CASNM!}</span>
<span class="tag"></a></span>
            <span class="tag"></td></span>
            <span class="tag"><td</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"l_text"</span>
<span class="tag">></span>
<span class="pln">${o.DLSITE!}</span>
<span class="tag"></td></span>
            <span class="tag"><td></span>
<span class="pln">${o.IQDAT!}</span>
<span class="tag"></td></span>
            <span class="tag"><td><a</span> <span class="atn">href</span>
<span class="pun">=</span>
<span class="atv">"${base!}/purchase/info/${o.XUID!}"</span> <span class="atn">target</span>
<span class="pun">=</span>
<span class="atv">"_blank"</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"more_a png"</span>
<span class="tag">></a></td></span>
        <span class="tag"></tr></span>
        <span class="pun"><%}</span>
<span class="pln">%>
        </span>
<span class="tag"></tbody></span>
    <span class="tag"></table></span>
    <span class="pun"><%</span>
<span class="kwd">if</span>
<span class="pun">(</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">totalCount</span>
<span class="pun">></span>
<span class="lit">1</span>
<span class="pun">){</span>
<span class="pln">%>
    </span>
<span class="tag"><div</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"page round_s_a"</span>
<span class="tag">></div></span>
    <span class="tag"><script</span> <span class="atn">type</span>
<span class="pun">=</span>
<span class="atv">"text/javascript"</span>
<span class="tag">></span>
<span class="pln">
        $</span>
<span class="pun">(</span>
<span class="kwd">function</span> <span class="pun">()</span> <span class="pun">{</span>
<span class="pln">
            $</span>
<span class="pun">(</span>
<span class="str">".page"</span>
<span class="pun">).</span>
<span class="pln">createPage</span>
<span class="pun">({</span>
<span class="pln">
                pageCount</span>
<span class="pun">:</span>
<span class="pln"> $</span>
<span class="pun">{</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">totalPage</span>
<span class="pun">},</span>
<span class="pln">
                totalCount</span>
<span class="pun">:</span>
<span class="pln"> $</span>
<span class="pun">{</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">totalCount</span>
<span class="pun">},</span>
<span class="pln">
                current</span>
<span class="pun">:</span>
<span class="pln"> $</span>
<span class="pun">{</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">pageNo</span>
<span class="pun">},</span>
<span class="pln">
                backFn</span>
<span class="pun">:</span> <span class="kwd">function</span> <span class="pun">(</span>
<span class="pln">p</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
                    window</span>
<span class="pun">.</span>
<span class="pln">location</span>
<span class="pun">.</span>
<span class="pln">href </span>
<span class="pun">=</span> <span class="str">"?page="</span> <span class="pun">+</span>
<span class="pln"> p </span>
<span class="pun">+</span> <span class="str">"&size=${p.pageSize}"</span>
<span class="pun">;</span>
                <span class="pun">}</span>
            <span class="pun">});</span>
        <span class="pun">});</span>
    <span class="tag"></script></span>
    <span class="pun"><%}</span>
<span class="pln">%></span>
20181 月21

Elasticsearch 6.1.2 (一)中文分词设置、字符串字段排序设置

<span class="kwd">if</span> <span class="pun">(!</span>
<span class="pln">esService</span>
<span class="pun">.</span>
<span class="pln">isExistsType</span>
<span class="pun">(</span>
<span class="pln">cfg</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"es.index.name"</span>
<span class="pun">),</span>
<span class="pln"> type</span>
<span class="pun">))</span> <span class="pun">{</span>
                <span class="com">//初始化索引表</span>
                <span class="typ">XContentBuilder</span>
<span class="pln"> mapping </span>
<span class="pun">=</span>
<span class="pln"> jsonBuilder</span>
<span class="pun">().</span>
<span class="pln">startObject</span>
<span class="pun">()</span>
                        <span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="pln">type</span>
<span class="pun">)</span>
                        <span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"_all"</span>
<span class="pun">)</span>
<span class="com">//设置IK分词</span>
                        <span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"analyzer"</span>
<span class="pun">,</span> <span class="str">"ik_max_word"</span>
<span class="pun">)</span>
                        <span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"search_analyzer"</span>
<span class="pun">,</span> <span class="str">"ik_max_word"</span>
<span class="pun">)</span>
                        <span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"term_vector"</span>
<span class="pun">,</span> <span class="str">"no"</span>
<span class="pun">)</span>
                        <span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"store"</span>
<span class="pun">,</span> <span class="str">"false"</span>
<span class="pun">)</span>
                        <span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
                        <span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"properties"</span>
<span class="pun">)</span>
                        <span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"type"</span>
<span class="pun">,</span> <span class="str">"text"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"analyzer"</span>
<span class="pun">,</span> <span class="str">"ik_max_word"</span>
<span class="pun">).</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
                        <span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"type"</span>
<span class="pun">,</span> <span class="str">"text"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"index"</span>
<span class="pun">,</span> <span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"fielddata"</span>
<span class="pun">,</span>
<span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
                        <span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"type"</span>
<span class="pun">,</span> <span class="str">"text"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"index"</span>
<span class="pun">,</span> <span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"fielddata"</span>
<span class="pun">,</span>
<span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
                        <span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
                        <span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
                        <span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">();</span>
<span class="pln">
                esService</span>
<span class="pun">.</span>
<span class="pln">putMapping</span>
<span class="pun">(</span>
<span class="pln">cfg</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"es.index.name"</span>
<span class="pun">),</span> <span class="str">"inquiry"</span>
<span class="pun">,</span>
<span class="pln"> mapping</span>
<span class="pun">);</span>
            <span class="pun">}</span>

    <span class="com">/**
     * @param indexName 索引名
     * @param type      数据类型(表名)
     * @param mapping   mapping对象
     */</span>
    <span class="kwd">public</span> <span class="kwd">boolean</span>
<span class="pln"> putMapping</span>
<span class="pun">(</span>
<span class="typ">String</span>
<span class="pln"> indexName</span>
<span class="pun">,</span> <span class="typ">String</span>
<span class="pln"> type</span>
<span class="pun">,</span> <span class="typ">XContentBuilder</span>
<span class="pln"> mapping</span>
<span class="pun">)</span> <span class="pun">{</span>
        <span class="typ">PutMappingRequest</span>
<span class="pln"> mappingRequest </span>
<span class="pun">=</span> <span class="typ">Requests</span>
<span class="pun">.</span>
<span class="pln">putMappingRequest</span>
<span class="pun">(</span>
<span class="pln">indexName</span>
<span class="pun">).</span>
<span class="pln">type</span>
<span class="pun">(</span>
<span class="pln">type</span>
<span class="pun">).</span>
<span class="pln">source</span>
<span class="pun">(</span>
<span class="pln">mapping</span>
<span class="pun">);</span>
        <span class="typ">PutMappingResponse</span>
<span class="pln"> response </span>
<span class="pun">=</span>
<span class="pln"> getClient</span>
<span class="pun">().</span>
<span class="pln">admin</span>
<span class="pun">().</span>
<span class="pln">indices</span>
<span class="pun">().</span>
<span class="pln">putMapping</span>
<span class="pun">(</span>
<span class="pln">mappingRequest</span>
<span class="pun">).</span>
<span class="pln">actionGet</span>
<span class="pun">();</span>
        <span class="kwd">return</span>
<span class="pln"> response</span>
<span class="pun">.</span>
<span class="pln">isAcknowledged</span>
<span class="pun">();</span>
    <span class="pun">}</span>

.field(“fielddata”,”true”) //text字段默认不允许排序,是单独设置数据格式

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

女上司

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