Debian 9 安装 MariaDB root登陆不需要密码问题
CREATE USER 'budwk'@'localhost' IDENTIFIED BY '123'; GRANT ALL PRIVILEGES ON budwk_demo.* TO budwk@localhost; FLUSH PRIVILEGES;
CREATE USER 'budwk'@'localhost' IDENTIFIED BY '123'; GRANT ALL PRIVILEGES ON budwk_demo.* TO budwk@localhost; FLUSH PRIVILEGES;
谈谈使用体验:
实体店现货买的翡冷翠(本来预订青山黛,但实在等不了一个月,看有现货就拿了),6899¥什么优惠都没,就送了个透明手机壳,手机壳还是满合身的,满满的安全感。考虑屏幕那么大,还是花了299¥买了碎屏险。手机出厂自带贴膜(据说第一批出厂手机没贴膜),所以这点比较好,不用纠结贴什么膜了,上手即用。
对于做IT的来说,上手很快,摸索一圈就知道权限如何设置、通知啊、广告怎么移除等。隔空手势用了,感觉实用性不大,试想下看着抖音,用手悬停半秒,然后隔空滑动屏幕,手抬着很累的手酸了都,还没手动滑屏比较快。
发现一个bug,或也可以说设置不合理的地方,156版本系统,短信的通知关闭后不知道如何打开。设置项不在“通知”里,也不在“应用”一级菜单里,而是需要到“应用”下面的“应用管理”里面,找到“信息”,然后再点“通知管理”,对于新手来说,跟捉迷藏一样,不百度或者问客服,真不知道。
APP的打开及使用,响应速度很快,几乎和iOS系统一样,为什么说几乎呢,是因为一些功能细节上,能感觉出比iOS系统慢那么一丢丢,比如微信支付成功的通知,可能与系统的通知机制不一样造成的,不过不影响使用,几乎察觉不出来。游戏还没安装,暂时略过。
短信拦截/手机拦截等功能太好了,每天收到几十条推销短信/电话,不用单独安装拦截软件,太爽了吧。
NFC功能也很好,8P虽然带NFC但是几乎没有用武之地,华为手机的NFC可以模拟小区门禁卡,真是很方便的。
关于提子,装了v2xxxNG,正好昨天又申请新的G服务器,搭建提子可以上x网,但是没有G套件,只能通过网页访问G的服务,还不是很方便。
壁纸和锁屏界面,可以自动更新一些精美的照片,很好。
情景智能,是自动弹出来的一个功能,开通后可以绑定手机号,通过快递查询平台查询到关联的所有快递物流信息,功能还是比较贴心的。
说几点不爽之处吧:
1)Android系统里的一些官方APP内嵌广告,这个在苹果APP里很少见;
2)各种APP各种请求权限,什么存储、位置、读取设备信息等等,一般很难判断该不该禁用,有的权限禁用了APP就启动不了了,如果都赋权,那么感觉手机像裸奔。
屏幕很亮眼,逛商城的时候四五个小姐姐围着手机看,有一定的误操作的几率,可能用习惯就好了吧,毕竟拿到手还没有48小时。
屏幕分辨率,刚从8p LCD切换过来的时候还不习惯,看多了也就习惯了,给眼睛一个适应过程。
额,怎么说呢,广角拍出来效果很好,但AI有点过度,色彩失真。近距拍摄,不是那么清晰的感觉,可能每个人体验不一样吧,个人感觉摄像头数量很多,但效果不是说的那么神(不知道为啥群里的网友拍的都那么好看?我是买到了假的么……23333)。平时拍照少,也就无所谓了。
这个要吐槽一下了,后置摄像头有AI美化,前置摄像头一点AI和美化都没有,当镜子照啊,可以非常清晰的看到脸上的斑点/粉刺/黑头,额……
比较给力的,比之前用的ip8p持久的多了。
今早上班开车20来分钟,60%电量充到80%,目测一天不用手动充电,上班下班通过车载充电就够用了啊哈哈哈。买的27W功率的那款。
Freebuds 3 双11刚买,EMS 12号中午就送到了。耳机支持蓝牙5.1协议版本,Mate 30 Pro 5G 也是5.1协议,搭配起来很爽哦,正好坐在靠路边的窗口位置,试用了下降噪功能,开启主动降噪功能,路上的车水马龙声音真的消失了,,不过办公室里的说话声音是过滤不掉的。耳机不带调节音量功能 – -。
还有个买蓝牙耳机的重要原因,那就是Mate 30 系列打电话是屏幕发声,不开免提都能听到声音,所以为了隐私,打电话还是用蓝牙耳机比较好。
项目介绍:
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 更新内容:
NutzWk v5.2.6-mini 版本发布:
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包、编辑配置文件、关闭实例进程、启动新实例进程、动态修改日志等级、查看服务器资源占用情况等功能,支持分布式部署。详见:发行注记。
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 更新内容:
NutzWk 是 Java 微服务分布式开发框架,5.x 是采用nutzboot、nutz、dubbo、sentinel、redis、zookeeper、shiro、quartz、beetl、logback等开源技术的微服务分布式版本,自带系统管理、简易CMS、微信模块、定时任务、服务API等功能,目前已全面应用于各类商业项目中。
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
基于 nutzboot + t-io + redis + kafka 实现的MQTT服务broker
本项目代码主要来源于 netty/t-io/iot-mqtt-server 等众多项目,开源免费,欢迎交流学习
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通信测试示例
mqtt-zoo
\keystore\server.cermqttwk.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
mqtt-auth
模块下的相应方法即可mqtt-broker
的resources/keystore/server.jks
keepalived+nginx+mqtt-broker
方式NutzWk 5.x 已发布一段时间,这段时间基于此版本开发了智慧水务系统(NB-IOT)、某物联网平台、某设备租赁平台、某智慧睡眠平台、某智慧园区项目等,开发和部署过程中遇到一些小问题,开这个帖子把一些经验分享出来省的大家走弯路。
项目地址1: https://github.com/Wizzercn/NutzWk
项目地址2: https://gitee.com/wizzer/NutzWk
1、运行环境
其实项目readme和wk-wiki 已经写的很清楚了,在此强调一下,不是说非这些版本不可,但对于新手来说最好版本号保持一致,能跑起来了您再折腾玩~~
JDK 8 162 +
Maven 3.5.3 +
Redis 4.0.8 +
MySql 5.7 +
Zookeeper 3.4.11 +
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
1、编辑文件 /usr/java/jdk1.8.0_162/jre/lib/security/java.security
在9下面添加 security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
2、拷贝 bcprov-jdk16-143.jar 和 bcprov-jdk15-135.jar 到 /usr/java/jdk1.8.0_162/jre/lib/ext 目录下
3、别问我上面两个文件怎么找……
(如果您是https的话可以把RSA加密方式改掉弃用哦)
2)服务器注意事项:服务器时间同步做没做、hosts里配没配主机名hostname和127.0.0.1的映射关系、内存够不够用(有没有给jar指定内存大小)等
5、其他
1)请关注 NutzWk 的动态,有新的版本发布建议及时更新,往往会修复问题或新增功能
2)如果 NutzWk 给了您帮助,或已用于生产, https://wizzer.cn/donation 欢迎打赏一定金额以资鼓励,创造国内良好的开源环境
3)最后感谢兽兽及nutz社区广大网友的帮助和鼓励,没有您们的支持,这个项目不会历经6年多还在更新前进
//设置代理 System.setProperty("http.proxySet", "true"); System.setProperty("http.proxyHost", "127.0.0.1"); System.setProperty("http.proxyPort", "1080");
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 命令包的下发
后台代码,自定义tag:
package cn.wizzer.app.web.modules.tags;
import cn.wizzer.app.web.commons.ex.elasticsearch.EsService;
import cn.wizzer.app.web.commons.utils.YcDateUtil;
import cn.wizzer.app.ycold.modules.services.YcoldInquiryService;
import cn.wizzer.framework.page.Pagination;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.beetl.core.GeneralVarTagBinding;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.nutz.ioc.impl.PropertiesProxy;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.Times;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* Created by wizzer on 2018/1/20.
*/
@IocBean
public class YcoldInquiryListTag extends GeneralVarTagBinding {
private final static Log log = Logs.get();
@Inject
private EsService esService;
@Inject
private YcoldInquiryService ycoldInquiryService;
@Inject
private PropertiesProxy cfg;
@Override
public void render() {
String startDate = Strings.sNull(this.getAttributeValue("startDate"));
String endDate = Strings.sNull(this.getAttributeValue("endDate"));
String keyword = Strings.sNull(this.getAttributeValue("keyword"));
int pageNumber = NumberUtils.toInt(Strings.sNull(this.getAttributeValue("pageNumber")), 1);
int pageSize = NumberUtils.toInt(Strings.sNull(this.getAttributeValue("pageSize")), 10);
boolean highlight = BooleanUtils.toBoolean(Strings.sNull(this.getAttributeValue("highlight")));
boolean explain = BooleanUtils.toBoolean(Strings.sNull(this.getAttributeValue("explain")));
String sortName = Strings.sNull(this.getAttributeValue("sortName"));
String sortOrder = Strings.sNull(this.getAttributeValue("sortOrder"));
Pagination page = new Pagination();
page.setPageNo(pageNumber);
page.setPageSize(pageSize);
try {
BoolQueryBuilder query = QueryBuilders.boolQuery();
//根据名称查询
if (Strings.isNotBlank(keyword)) {
query.must(QueryBuilders.wildcardQuery("CASNM", "*" + keyword + "*"));
}
//截止时间大于等于现在
query.must(QueryBuilders.rangeQuery("IQDAT").gte(Times.format("yyyyMMddHHmmss", new Date())));
//公共日期起
if (Strings.isNotBlank(startDate)) {
query.must(QueryBuilders.rangeQuery("ANNODAT").gte(startDate.replaceAll("-","")));
}
//公共日期至
if (Strings.isNotBlank(endDate)) {
query.must(QueryBuilders.rangeQuery("ANNODAT").lte(endDate.replaceAll("-","")));
}
//几个状态条件
query.must(QueryBuilders.matchQuery("BUYER_STS", "N"));//采购商状态
query.must(QueryBuilders.matchQuery("STS", "A"));//状态
query.must(QueryBuilders.matchQuery("ANNOMK", "Y"));//公告註記
SearchRequestBuilder srb = esService.getClient().prepareSearch(cfg.get("es.index.name"))
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setTypes("inquiry")
.setQuery(query)
//分页
.setFrom((pageNumber - 1) * pageSize).setSize(pageSize)
//是否按匹配度排序
.setExplain(explain);
if (highlight) {
HighlightBuilder highlightBuilder = new HighlightBuilder().field("*").requireFieldMatch(false);
highlightBuilder.preTags("<span style=\"color:red\">");
highlightBuilder.postTags("</span>");
srb.highlighter(highlightBuilder);
}
if (Strings.isNotBlank(sortName)) {
String[] sortNames = StringUtils.split(sortName, ",");
if ("asc".equalsIgnoreCase(sortOrder)) {
for (String s : sortNames) {
srb.addSort(s, SortOrder.ASC);
}
} else {
for (String s : sortNames) {
srb.addSort(s, SortOrder.DESC);
}
}
}
log.debug("srb:::\r\n" + srb.toString());
SearchResponse response = srb.execute().actionGet();
SearchHits hits = response.getHits();
page.setTotalCount((int) hits.getTotalHits());
List<Map<String, Object>> list = new ArrayList<>();
hits.forEach(searchHit -> {
Map<String, Object> source = searchHit.getSourceAsMap();
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
//name高亮
HighlightField nameField = highlightFields.get("CASNM");
if (nameField != null) {
Text[] fragments = nameField.fragments();
String tmp = "";
for (Text text : fragments) {
tmp += text;
}
source.put("CASNM", tmp);
}
source.put("IQDAT", YcDateUtil.get_yyyyMMdd_HHmm(Strings.sNull(source.get("IQDAT"))));
source.put("ANNODAT", YcDateUtil.get_yyyyMMdd(Strings.sNull(source.get("ANNODAT"))));
list.add(source);
});
page.setList(list);
} catch (Exception e) {
e.printStackTrace();
}
this.binds(page);
this.doBodyRender();
}
}
前台beetl页面:
<#ycold_inquiry_list pageNumber="${pageNumber}" pageSize="${pageSize}" startDate="${startDate}" endDate="${endDate}" keyword="${keyword}" sortName="ANNODAT" sortOrder="desc" highlight="false" var="p">
<table class="list_table_blue even_table">
<thead>
<tr>
<th>公告日期</th>
<th>案件名称</th>
<th>交货地点</th>
<th>报价截止日期</th>
<th width="110">查看详细</th>
</tr>
</thead>
<tbody>
<%for(o in p.list){%>
<tr>
<td>${o.ANNODAT!}</td>
<td class="l_text"><a href="${base!}/purchase/info/${o.XUID!}" target="_blank" class="td_a hide1">${o.CASNM!}</a>
</td>
<td class="l_text">${o.DLSITE!}</td>
<td>${o.IQDAT!}</td>
<td><a href="${base!}/purchase/info/${o.XUID!}" target="_blank" class="more_a png"></a></td>
</tr>
<%}%>
</tbody>
</table>
<%if(p.totalCount>1){%>
<div class="page round_s_a"></div>
<script type="text/javascript">
$(function () {
$(".page").createPage({
pageCount: ${p.totalPage},
totalCount: ${p.totalCount},
current: ${p.pageNo},
backFn: function (p) {
window.location.href = "?page=" + p + "&size=${p.pageSize}";
}
});
});
</script>
<%}%>
if (!esService.isExistsType(cfg.get("es.index.name"), type)) {
//初始化索引表
XContentBuilder mapping = jsonBuilder().startObject()
.startObject(type)
.startObject("_all")//设置IK分词
.field("analyzer", "ik_max_word")
.field("search_analyzer", "ik_max_word")
.field("term_vector", "no")
.field("store", "false")
.endObject()
.startObject("properties")
.startObject("CASNM").field("type", "text").field("analyzer", "ik_max_word").endObject()
.startObject("IQDAT").field("type", "text").field("index", "true").field("fielddata","true").endObject()
.startObject("ANNODAT").field("type", "text").field("index", "true").field("fielddata","true").endObject()
.endObject()
.endObject()
.endObject();
esService.putMapping(cfg.get("es.index.name"), "inquiry", mapping);
}
/**
* @param indexName 索引名
* @param type 数据类型(表名)
* @param mapping mapping对象
*/
public boolean putMapping(String indexName, String type, XContentBuilder mapping) {
PutMappingRequest mappingRequest = Requests.putMappingRequest(indexName).type(type).source(mapping);
PutMappingResponse response = getClient().admin().indices().putMapping(mappingRequest).actionGet();
return response.isAcknowledged();
}
.field(“fielddata”,”true”) //text字段默认不允许排序,是单独设置数据格式
后台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)); } }
前台代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>电子导航</title> <link rel="stylesheet" type="text/css" href="${base!}/assets/public/wx/add/css/css.css"/> <link rel="stylesheet" href="${base!}/assets/public/wx/add/css/zepto.mdatetimer.css"> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/> <meta content="yes" name="apple-mobile-web-app-capable"/> <meta content="black" name="apple-mobile-web-app-status-bar-style"/> <meta name="format-detection" content="telephone=no"/> <meta name="format-detection" content="email=no"/> <meta name="msapplication-tap-highlight" content="no"> <meta charset="utf-8"> <script type="text/javascript"> var base = '${base!}'; </script> <script type="text/javascript" src="${base!}/assets/public/wx/add/js/zepto.js"></script> <script type="text/javascript" src="${base!}/assets/public/wx/add/js/zepto.mdatetimer.js"></script> <script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> </head> <body> <header class="ds-head"> <h1>公司检索</h1> </header> <div class="time"> <div class="time-li round-a"><span>公司名称:</span><input id="name" type="text" value=""/></div> <div class="btn"><input id="btn" type="button" value="立即查询" class="round-a"/></div> <div class="time-li round-a"><span>当前位置:</span><input id="longitude" type="text" value="" readonly/><input id="latitude" type="text" value="" readonly/></div> </div> <ul class="earn"> <%for(o in list){%> <li class="earn-li"> <dl> <dt class="cf2"><span class="earn-lil">${oLP.index}、${o.name} </span></dt> <dd class="cf2"><span class="earn-lil">lng:${o.lng}, lat:${o.lat}</span></dd> <dd class="cf2"> <span><button onclick="goTo('walk','${o.name}','${o.lng}','${o.lat}');">步行</button></span> <span><button onclick="goTo('drive','${o.name}','${o.lng}','${o.lat}');">驾车</button></span> </dd> </dl> </li> <%}elsefor{%> 没有检索到结果 <%}%> </ul> <script language="JavaScript"> 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®ion=合肥&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); } }); }); </script> </body> </html>
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 <dependency> <groupId>org.nutz</groupId> <artifactId>nutzwx</artifactId> <version>1.r.61-SNAPSHOT</version> </dependency> 3、nutz版本升级为1.r.60 <dependency> <groupId>org.nutz</groupId> <artifactId>nutz</artifactId> <version>1.r.60</version> </dependency> 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<String, Object> 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; }
pom.xml
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.logback-extensions</groupId> <artifactId>logback-ext-spring</artifactId> <version>0.1.4</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.25</version> </dependency>
排除其他包的log4j引用,特别是dubbo的、shiro的
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.8.4</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.3.2</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.3.2</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <!-- For assistance related to logback-translator or configuration --> <!-- files in general, please contact the logback user mailing list --> <!-- at http://www.qos.ch/mailman/listinfo/logback-user --> <!-- --> <!-- For professional support please see --> <!-- http://www.qos.ch/shop/products/professionalSupport --> <!-- --> <configuration> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <file>/monitor.log</file> <!-- Policy定义如何滚动,按文件大小滚动生成日志 --> <!-- 如果是按文件大小滚动生成日志,前面的file标签可省略,而使用fileNamePattern标签定义的名字 --> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>/monitor.%i.log.gz </fileNamePattern> <!-- 归档日志的下标,替换fileNamePattern的%i,最多3个归档文件 --> <minIndex>1</minIndex> <maxIndex>5</maxIndex> </rollingPolicy> <!-- triggeringPolicy定义什么时候滚动,下面是定义了文件大小超过100M的时候产生归档文件 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>300MB</maxFileSize> </triggeringPolicy> <!-- append是否接着上次写文件结尾继续写,默认为true --> <append>true</append> <encoding>GBK</encoding> <!-- layout,定义格式 --> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger %caller{2} - %msg%n</pattern> </layout> </appender> <logger name="org.springframework" level="info"/> <logger name="org.nutz.dao" level="debug"/> <logger name="net.sf.ehcache" level="info"/> <logger name="druid.sql" level="info"/> <logger name="com.alibaba.druid" level="info"/> <logger name="org.apache.shiro" level="info"/> <logger name="org.quartz" level="info"/> <root level="debug"> <appender-ref ref="Console"/> </root> </configuration>
“医生,你得救救我们啊,我们在一起三年了都没有怀孕,父母还等着抱孙子呢!”医生:“这我也没办法啊,这都是你们自己的问题。”“不行啊,医生你帮帮我们吧。”医生:“首先,你们得各自找个女朋友。”
记得初入公司时,写的代码乱七八糟,错误百出,bug连连,不仅项目经理骂我,其他同事也对我怨声载道。后来听朋友介绍,就报了一个培训班。经过1个月的刻苦学习,终于功夫不负有心人啊—他们都骂不过我了。
我们单位来了个女上司,长的还算过的去,很凶,在单位经常欺负我们。。同事们就怂恿单身的我追求她,然后报复她,欺负她,在同事们的多方帮助下,不出一个月,我把女上司就追到手了。。。从此,我不但在单位受她欺负,到了家还受她欺负。 ……
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));
你认为大禹三过家门而不入真的什么都没干吗?不要忘了,他媳妇后来变成望夫石了,而孙悟空是石头里蹦出来的,关键是,大禹的定海神针还听孙悟空的话,你认为孙悟空当年定住了七仙女,什么都没有干吗?想想葫芦娃,正好七个,合在一起能变成石头…石头….