服务调用 注册服务内部调用 方法之一 RestTemplate

文章目录 1.准备工作1.1 在eureka上注册order和goods服务1.2 在goods服务上开发个接口 2.order服务使用RestTemplate2.1 调用方式一2.2 调用方式二2.3 调用方式三 3 问题汇总3.1 ClassCastException: org.springframework.boot.context.event.ApplicationFailedEvent cannot be cast to3.2 RestTemplate 方式二调用报错java.net.UnknownHostException: goodsService 1.准备工作 1.1 在eureka上注册order和goods服务 1.2 在goods服务上开发个接口 @RestController @RequestMapping("/size") public class SizeController { @GetMapping(value = "getSizes") public ResponseVO getSizes() { List<Size> sizes = new ArrayList<Size>(); Size size1 = new Size(); size1.setId(1); size1.setName("L"); Size size2 = new Size(); size2.setId(1); size2.setName("XL"); Size size3 = new Size(); size3.setId(1); size3.setName("XXL"); sizes.add(size1); sizes.add(size2); sizes.add(size3); return ResponseVO.success(sizes); } } 直接浏览器访问接口 http://localhost:8081/size/getSizes

微信小程序完成简单的模仿抖音点赞效果动画wx.createAnimation

先看看效果图吧 很明显主要有两个重点 (1)是点击任意地方赞的按钮就在哪里出现 (2)是放大缩小 先看wxml吧 <view wx:if="{{swiperappear}}" data-time="{{lastTime}}" bindtap="dbclick" style="height:{{swipers[current].height}}" hover-class="none" hover-stop-propagation="false"> <image style='width:100%; height:100%;' mode="aspectFill" src="{{swipers[0].url}}" lazy-load="false" binderror="" bindload=""></image> <view wx:if="{{praise}}" class="praisetop" style="position:absolute; left:{{row-50}}px; top:{{top-50}}px;width:210rpx;height:210rpx;"> <image class="praisein" animation='{{animationMiddleHeaderItem}}' style="width:100%;height:100%;" src="../../images/praise.png" mode="aspectFit|aspectFill|widthFix" lazy-load="false" binderror="" bindload=""> </image> </view> </view> 在这里我们把点击事件叫bindtap被点击的图片放在下面加入animation这个逻辑很简单点击然后praise变成true出现!!!但是有一个值得特别注意的地方就是praise一定要先出现给animation的动画执行时间 praise一定要在animation先出现在文档流这样才能完成动画效果 点在哪里点赞按钮就在哪里出现这个东西很简单一定要想清楚这个逻辑 (1)将x轴位置设为position飞出文档流然后将x轴绑上{{row}}row在dbclick事件的回参e.detail.x (2)讲y轴位置设为position飞出文档流然后将x轴绑上{{top}}top在dbclick事件的回参e.detail.y 接下来我们看看js dbclick:function(e){ var that = this var curTime = e.timeStamp var lastTime = e.currentTarget.dataset.time if(curTime-lastTime>0){ if(curTime-lastTime<600){ console.log('asdhfkjasdk') that.setData({ praise:true, top:e.detail.y, //y轴位置 row:e.detail.x //x轴位置 }) //接下来声明动画添加1秒,又快到慢 var animationMiddleHeaderItem = wx.

面对不同维度大小矩阵乘法操作的处理(Tensorflow)

遇到的问题: 面对矩阵的大小不同的两个矩阵,其中一个矩阵如何根据另一个矩阵的要求实现相应的行或列缩放。目标效果如下所示: x:(2,2,3) [[[ 1. 2. 3.], [ 4. 5. 6.]], [[ 7. 8. 9.], [10. 11. 12.]]] w:(2,2) [[0.5, 0.4], [0.1, 0.2]] x*w:(2,2,3) [[[0.5 1. 1.5] [1.6 2. 2.4]] [[0.7 0.8 0.9] [2. 2.2 2.4]]] 上面的效果,如果只利用点乘(w * x)和乘法(tf.matmul(w, x))操作是无法完成的,需要利用到矩阵的维度变换。具体处理流程为: 对w进行维度扩张 w(2,2) --> w(2,1,2)将x的第二维和第三维变换 x(2,2,3) -->x(2,3,2)这时候再进行矩阵点乘操作,才能得到上面的效果。 具体代码为: # tensorflow的点乘 def test2(): # a = tf.constant([[1, 2, 3, 4], [5, 6, 7, 8]]) # [2, 2, 3] [2, 2] a1 = np.

result.next()、while(result.next)、if(result.next)的区别

result.next() 进行读取结果集的下一条数据; while(result.next) 将rs全部进行读取;(ResultSet rs=.....) if(result.next) 进行读取一次,判断是否有数据。 next()方法返回的是boolean型,用来确认有没有数据,执行一次游标后移一位,用来遍历用的; if(rs.next()只遍历一次,即第一条数据,或者说是确认是否存在数据; while(rs.next()遍历每一条数据。 都是数据库的操作,一般是在jsp中的问题

腾讯云 ( 四 ): https 443请求

1 : 下载 证书, 2 : 解压后我用的是 tovily.com 的证书 3 : 将上面 tovily.com/nginx/ 下的2个证书,上传到linux, /usr/local/nginx/conf/ssl 目录下(ssl文件夹自创) 4 : 去 nginx/conf/nginx.conf 配置443 5 : 重启nginx , 如果以下错误 6 : https://www.cnblogs.com/ghjbk/p/6744131.html 1):./auto/configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module 2) make 3) make install 7 : 重启 nginx

使用vagrant导入导出virtualbox虚拟机

使用vagrant导入导出virtualbox虚拟机 参考:https://blog.csdn.net/glatchen/article/details/83187484 环境:virtualbox + vagrant 需要先安装 virtualbox 和 vagrant 软件,并注册到环境变量。 由此可见,一个完整的项目需要一个 virtualbox虚拟机 和 一个vagrant项目(管理机操作虚拟机), 比如 laravel项目的环境:laravel/homestead Box + Homestead Homestead 项目可以从git下载 laravel/homestead Box 下载就是比较慢的 具体操作详见:<<windows+Laravel 5.5+Homestead>> 每次下载就会很耗时间,于是就需要备份box(也叫导入导出) vagrant的box默认存放在 C:\Users\Administrator\.vagrant.d\boxes 一、导入导出: 1、列出所有的虚拟机 两种方式: 方法1: vagrant box list C:\Program Files\Oracle\VirtualBox>vagrant box list centos7.2 (virtualbox, 0) laravel/homestead (virtualbox, 6.4.0) 方法2: 进入virtualbox软件的安装目录 C:\Program Files\Oracle\VirtualBox,使用命令 vboxmanage list vms C:\Program Files\Oracle\VirtualBox>vboxmanage list vms "default" {81434ecc-a423-44b7-93b1-aff8ede9792c} "centos72-1_default_1533621465445_39239" {b3af62dc-de05-4455-a5d5-9da3c0ebbed1} "homestead-7" {8511e1c7-d767-4fd0-861b-7a7e3822d35e} 为什么两种输出不一样呢?因为,第一种显示的是在vagrant下管理的虚拟机;第二种显示的 virtualbox 下全部的虚拟机,且名称还不一样,当时两者是有联系的;但是最终还是由vagrant映射到virtualbox的虚拟机上。 在此使用 vboxmanage list vms 2、导出 1、关闭虚拟机 2、新建vagrant项目目录,比如:C:\Users\Administrator\HomesteadNew\ 3、进入目录 cd C:\Users\Administrator\HomesteadNew 4、vagrant package --base homestead-7 --output homestead-new.

pc 端 前端对接支付宝支付-前端获取支付宝返回的form 表单以及submit提交表单,自动跳转支付页面扫码支付

项目中用到了微信扫码,支付宝扫码支付。前端调取支付宝接口(后台进行了封装,没有直接调取支付宝接口)。 调用接口返回数据中,会有一串form表单字符串返回,前端需要做的就是把这串form 表单字符串通过appendchild 方法添加到当前页面中,并且执行这个表单的submit() 方法,表单提交以后,会自动跳转到支付宝扫码支付页面 返回的form数据大概如下,(可能会有差别) <form name="punchout_form" method="post" action="https://openapi.alipay.com/gateway.do?charset=GBK&method=alipay.trade.page.pay&sign=tXR6yxB9Uowu7tfbXVPHBoQXeyOqP2JXvo%2Fzmz%2BIA08aWin63h1%2FF7gHNN7I2K%2FnTV3ZYtvPkILu%2FS8uPmzpsAv1SJev0UNN2AbLDIGvbd%2BWn5neyIUqKcu5ySP1S8Bt4fbnvkMgnlijR25obVi5aFbj99JBZDrpeJ5cB9uq7Ccx7nX54%2F7coNv26PFD%2FPirlIKVVr2avD2w%3D%3D&return_url=http%3A%2F%2Fwww.shanshiwangluo.com%2F%23%2FpayNotify&notify_url=http%3A%2F%2Fwww.shanshiwangluo.com%2Fssmall%2Fportal%2Forder%2Fpay%2FaliCallback&version=1.0&app_id=2018062260383877&sign_type=RSA2&timestamp=2018-12-15+17%3A13%3A32&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json"> <input type="hidden" name="biz_content" value="{ &quot;out_trade_no&quot;:&quot;1812141933252566&quot;, &quot;product_code&quot;:&quot;FAST_INSTANT_TRADE_PAY&quot;, &quot;total_amount&quot;:0.02, &quot;subject&quot;:&quot; 订单:1812141933252566&quot;, &quot;extend_params&quot;:{ &quot;sys_service_provider_id&quot;:&quot;2018062211454921&quot; } }"> <input type="submit" value="立即支付" style="display:none" > </form> <script>document.forms[0].submit();</script> 前端实例代码: //支付宝支付 if(resp.code=="200"){ // 添加之前先删除一下,如果单页面,页面不刷新,添加进去的内容会一直保留在页面中,二次调用form表单会出错 let divForm = document.getElementsByTagName('divform') if (divForm.length) { document.body.removeChild(divForm[0]) } const div=document.createElement('divform'); div.innerHTML=resp.data; // data就是接口返回的form 表单字符串 document.body.appendChild(div); document.forms[0].setAttribute('target', '_blank') // 新开窗口跳转 document.forms[0].submit(); }else{ this.$alert("错误:"+resp.data,"提示",{ confirmButtonText:'确定' }); }

emmc启动分区设置

下图是emmc寄存器设置。 不使能引导,将BOOT_PARTITION_ENABLE设置为0, 使能boot1,将BOOT_PARTITION_ENABLE设置为1, 使能boot2,将BOOT_PARTITION_ENABLE设置为2, 使能UDA,将BOOT_PARTITION_ENABLE设置为7. eg: U-Boot provides access to eMMC devices through the mmc command and interface but adds an additional argument to the mmc interface to describe the hardware partition. The interface is therefore described as 'mmc ’ where ‘dev’ is the mmc device (some boards have more than one) and ‘part’ is the hardware partition: 0=user, 1=boot0, 2=boot1. Use the mmc dev command to specify the device and partition:

recycleview item宽度不能充满

设置recycleview的layoutmanager LinearLayoutManager layoutManager = new LinearLayoutManager(context) { @Override public RecyclerView.LayoutParams generateDefaultLayoutParams() { return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } }; recyclerView.setLayoutManager(layoutManager);即可

Linux touch命令

一、命令 touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。 1.1 语法 touch(选项)(参数) 1.2 选项 选项描述-a或–time=atime或–time=access或–time=use 只更改存取时间;-c或–no-create 不建立任何文件;-d<时间日期> 使用指定的日期时间,而非现在的时间;-f此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题;-m或–time=mtime或–time=modify 只更该变动时间;-r<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;-t<日期时间> 使用指定的日期时间,而非现在的时间;–help在线帮助;–version显示版本信息。 1.3 参数 文件:指定要设置时间属性的文件列表。 二、示列 # 在当前目录下创建一个pwx文件 touch pwx

端口无法访问的排查

今天部署了easyswoole项目到服务器,监听9501端口,但是却无法访问,以下是排查流程 使用cmd尝试连接 telnet 118.89.64.98 80 成功 telnet 118.89.64.98 9501 失败 可以确定是端口未开放 查看防火墙状态 firewall-cmd --state not running 查看SELinux状态 getenforce diabled 开放端口 service iptables status 发现iptables服务没有开启,那就奇怪了,为什么80可以而9501不可以,后来才知道用的是阿里云服务器,他在上层还有一层策略, 在阿里云控制台去开放这个端口就好了。

SQL语句修改表字段及属性

– 修改表名 – ALTER TABLE tableName RENAME TO test; – 增加主键 – alter table test add f int(5) unsigned default 0 not null auto_increment ,add primary key (f); – 修改ID为自增,并设置为主键 – alter table test modify id int auto_increment primary key; – 增加字段 – ALTER TABLE test ADD h INT default 0; – 修改字段:after – ALTER TABLE test ADD COLUMN d INT DEFAULT ‘0’ COMMENT ’ ’ AFTER a; – ALTER TABLE test ADD COLUMN d INT DEFAULT ‘0’ COMMENT ’ ’ AFTER a;

Java 对Bean里面的所有String属性去除前后空格

Java 对Bean里面的所有String属性去除前后空格 最近项目有个需求,要对所有的查询条件去除前后空格。有些对象里面有很多的查询条件,所有不想一个个trim,太麻烦了,所有找到了一个工具类,完美解决这个问题。 import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 去掉bean中所有属性为字符串的前后空格 * @param bean * @throws Exception */ public static void beanAttributeValueTrim(Object bean) throws Exception { if(bean!=null){ //获取所有的字段包括public,private,protected,private Field[] fields = bean.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field f = fields[i]; if (f.getType().getName().equals("java.lang.String")) { String key = f.getName();//获取字段名 Object value = getFieldValue(bean, key); if (value == null) continue; setFieldValue(bean, key, value.toString().trim()); } } } } /** * 利用反射通过get方法获取bean中字段fieldName的值 * @param bean * @param fieldName * @return * @throws Exception */ private static Object getFieldValue(Object bean, String fieldName) throws Exception { StringBuffer result = new StringBuffer(); String methodName = result.

latex slide的block应用和公式自动加编号

\begin{block}{我们寻找的$G(h,h^t)$,$G$决定了我们的迭代公式} \begin{equation} G(h,h^t)=F(h^t)+(h-h^t)^T\nabla F(h^t)+\frac{1}{2}(h-h^t)^T K(h^t)(h-h^t) \end{equation} 可是$K(h^t)$是什么东西呢?其实$K(h^t)$就是个对角阵,对角元素依次是列向量$W^TWh^t$除以$h^t$对应元素. \end{block} 展示的如下:

lead to 和 result in区别

lead to 有“引起, 导致, 造成”等意思。其中to为介词, 后接名词或动词ing. 例如: Too much work and too little rest often leads to illness. 过度的劳累加上太少的休息常使人得病。 Different opinions among young people can sometimes lead to arguments. 有时, 年轻人往往因不同观点引起争论。 The accident led to many deaths. 那次事故使许多人死亡。 His carelessness led to his failure. 他的粗枝大叶导致他的失败。 Too much work and too little rest leads to illness. 工作太多, 休息太少, 常会引起疾病。 This kind of test is bad because it leads to incorrect learning.

Gatewaywork + laravel5.5 + Layim实现聊天系统

概述 基于workerman的GatewayWorker框架开发的一款高性能支持分布式部署的聊天接口。 基于laravel的TLS版本5.5实现http请求 基于layim实现前端数据渲染 GatewayWorker框架文档:http://www.workerman.net/gatewaydoc/ laravel5.5框架文档:https://laravelacademy.org/laravel-docs-5_5 Layim框架文档:https://www.layui.com/doc/modules/layim.html 演示地址:http://love.1314zyh.cn github地址:https://github.com/cuigeg/workman 测试账号: 账号:admin01 密码:123456 账号:admin02 密码:123456 账号:admin03 密码:123456 账号:admin04 密码:123456 账号:admin05 密码:123456 账号:admin06 密码:123456 账号:admin07 密码:123456 账号:admin08 密码:123456 版本支持 PHP >=7.1 GatewayWorker 3.0.12 layui 2.4.5 功能列表 功能描述登录用户登陆注册注册过程中为用户分配了一个默认分组,并将用户添加到所有人都在的一个群(用于日后推送公告信息)查找-好友可以根据用户名、昵称、id来查找,不输入内容不允许查找数据,点击发起好友申请,每页6人查找-群聊可根据群昵称、群id查找群聊,点击加入,每页6人创建群聊创建一个新群聊修改群聊名称修改指定群聊名称解散群聊解散指定群聊分组面板内快速查找查找已加的好友(好友列)、群聊(群聊列)消息盒子用来接受好友请求和同意或拒绝好友请求的系统消息个性签名如果客服系统可显示客户访问商品ID和商品,如果聊天可以显示发表心情一对一聊天可发送文字、表情、图片、文件、音乐链接、视频链接、代码等群聊新成员加入群聊时,如果此刻你正开启着该群对话框,将收到新人入群通知查看群成员查看群聊中所有成员临时会话在群成员中,点击群成员头像即可发起临时会话历史记录聊天面板只显示20条记录,更多记录点击聊天记录查看离线消息对方不在线的时候,向对方发起好友请求或者消息,将在对方上线后第一时间推送换肤这个是layim自带的东西删除好友好友列表右击删除好友查看聊天记录好友列表右击查看聊天记录或者打开聊天窗口点击聊天记录删除好友分组右击好友分组可将好友分组删除新增好友分组右击好友分组可新增好友分组重命名好友分组右击好友分组可重命名改分组 安装 下载项目 git clone https://github.com/cuigeg/workman.git 2.运行sql文件 项目根目录im.sql文件为本项目所需数据库字段与数据 3.项目根目录复制.env文件 cp .env.example .env 4.composer安装依赖 composer insatll 5.生成独立的Key php artisan key:generate 6.配置数据库 6.1 .env文件 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=im DB_USERNAME=homestead DB_PASSWORD=secret DB_PREFIX=im_ 6.2 /Applications/YourApp/Config/Db.php <?php namespace Config; /** * mysql配置 * @author walkor */ class Db { /** * 数据库配置 */ public static $homestead = array( 'host' => '192.

__import__详解

当使用import导入Python模块的时候,默认调用的是__import__()函数。直接使用该函数的情况很少见,一般用于动态加载模块。 __import__(name, globals, locals, fromlist, level)只有name是必选参数,其他都是可选参数,一般情况下直接使用name参数即可。 fromlist指明需要导入的子模块名,level指定导入方式(相对导入或者绝对导入, 默认两者都支持)。 当模块名为package.module时,而且fromlist参数为空时,函数返回顶层的模块,也就是package模块。如果fromlist=[module],则返回module。 所以,下面语句返回的结果是一样的: spam = __import__('spam', globals(), locals(), [], -1) spam = __import__('spam.ham', globals(), locals(), [], -1) 而下面指定了fromlist,就可以获取到子模块。 _temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], -1) eggs = _temp.eggs saus = _temp.sausage 如果像直接通过名字导入模块,也可以使用importlib模块的import_module函数。 可以使用__import__函数实现模块的延迟导入: class LazyImport: def __init__(self, module_name): self.module_name = module_name self.module = None def __getattr__(self, name): if self.module is None: self.module = __import__(self.module_name) return getattr(self.module, name) string = LazyImport("string") print string.

使用 VisualStudio 诊断工具 解决 c++ 项目的内存泄漏

今天了解了一下 VisualStudio “诊断工具”,感觉非常好用,甚至强过xcode 的 instrument 的泄漏检查工具。趁热记录一下经验感受。 应用场景 今天同事反应,我们的游戏每一局新开一把,内存都会飙升几十兆。反复开几把,内存会飙到1.5G然后挂掉。光听现象很明显是发生了内存泄漏。 本来打算找一些 windows 平台的工具来检查。由于我们项目使用的是 Vistual Studio 2015,自带了 "诊断工具"功能。之前也没有用过,打算用这个诊断工具,来检查一下项目里 c++ 代码的内存泄漏。 功能简介 在Debug模式下运行游戏工程,打开"诊断工具"的"内存使用率"标签页,可以开启内存检测。点击了"堆分析"按钮后,游戏会奇卡无比。针对我们项目上面所说的情况,我打算在每局游戏截取内存快照,退出一局游戏在同样的时机再截取一次内存快照。比较两次快照的结果,来定位泄漏的代码。 截取快照 游戏运行以断时间之后,点击“截取快照”按钮,可以新增一条一个时刻的内存使用情况的数据。 快照比较 截取多个内存使用数据之后,点击某一个,可以与之前的数据比较。 快照分析 互相比较之后,可以看到哪些类型的对象有所增加,能增加了多少字节。 也可以用堆栈的形式,来看哪行代码在申请内存没有释放,有导致泄漏的嫌疑。 堆栈里面的每一行都能点击,能够清楚的看到哪些对象是由哪行代码构造出来造成泄漏的。 经验总结 最终我们游戏的泄漏是发生在最近的一个脚本底层的C++ 代码的改动,在某一处 new [] 了一些对象,而没有 delete[] 干掉导致的。 VisualStudio2015 自带的内存使用率分析工具非常好用,可以完全不去用 VLD 等等之类的第三方软件了。 个人的直观感受比 xcode 的 instrument 的 leak 工具还要方便。 新版的 VS2017, VS2019 的诊断工具又有了什么变化不得而知,有机会要去了解一下。

Python中格式化format()方法详解

Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参数使用{NUM}进行表示,0, 表示第一个参数,1, 表示第二个参数, 以后顺次递加; 使用":", 指定代表元素需要的操作, 如":.3"小数点三位, ":8"占8个字符空间等; 还可以添加特定的字母, 如: ‘b’ - 二进制. 将数字以2为基数进行输出. ‘c’ - 字符. 在打印之前将整数转换成对应的Unicode字符串. ‘d’ - 十进制整数. 将数字以10为基数进行输出. ‘o’ - 八进制. 将数字以8为基数进行输出. ‘x’ - 十六进制. 将数字以16为基数进行输出, 9以上的位数用小写字母. ‘e’ - 幂符号. 用科学计数法打印数字, 用’e’表示幂. ‘g’ - 一般格式. 将数值以fixed-point格式输出. 当数值特别大的时候, 用幂形式打印. ‘n’ - 数字. 当值为整数时和’d’相同, 值为浮点数时和’g’相同. 不同的是它会根据区域设置插入数字分隔符. ‘%’ - 百分数. 将数值乘以100然后以fixed-point(‘f’)格式打印, 值后面会有一个百分号. 数字(0, 1, …)即代表format()里面的元素, 所以可以使用"."调用元素的方法; 复制代码 -- coding: utf-8 -- #====================