1. 设置 el-input 的 type='number'后,只能输入数字,输入中文后会自动清空,但是会出现一个问题:【光标会上移,如下图】
解决方法:修改样式
/** * 解决el-input设置类型为number时,中文输入法光标上移问题 **/ .el-input__inner{ line-height: 1px !important; } 2. 设置 el-input 的 type='number'后,输入框后面会出现上下箭头:【如下图】
解决办法:修改样式
/** * 解决el-input设置类型为number时,去掉输入框后面上下箭头 **/ input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
如何对vue模块进行功能封装,vue组件封装技巧
当业务不断累加,导致原本干净整洁的代码越来越冗余,各种变量和注释已经让他人望而却步,往往又苦于重构带来的成本,导致诞生很多巨石应用。与其让自己或他人面临这种问题,不如我们一起来学习下,如何将代码更优雅的组织起来,前人栽树,后人乘凉。
我经常和别人强调,一定要做好设计,设计的目标是什么?个人理解是,增加代码的可塑空间,降低维护成本。
文档设计是必要的吗?
答案是肯定的,在做业务之前一定要做好设计,但究竟哪些是需要我们设计的呢?做好以下几点,轻松搞定前端文档设计:
需求目标是什么?你是怎么理解需求的实现方案是什么关键节点的数据解构设计是什么模块的作用如何CRUD新人拿到这个文档是否可以理解你的设计思路 很多时候大家是没有时间做设计的,但在开发之前这些是你必须要确认清楚的,尤其是对于新手来说,建议大家不要立刻开始开发任务,一定是要想清楚才动手。理想情况下70%设计(输出伪代码),30%的业务填充。好的领导一定会重视员工的成长和项目的未来的,如果有条件,就用文档把想法输出吧。
有了思路和方案,我们来看看怎么去把代码组织的更优雅吧,首先我们需要思考几个问题:
目录结构如何建设,理由是什么。模块功能划分,是否遵循高内聚,低耦合的思想?函数怎么设计,是否可移植可复用。是否有清晰的注释说明 以上4点,我们在开发过程中,新建文件和函数时,要时刻注意,目标是让我们建设的工程,结构清晰,模块作用明确,各施其职,就像一排排整齐的水管。
vue组件封装技巧
提取公共常量提取公共工具类提取类型声明文件单个vue组件封装 单个vue组件封装
组件拆分
将独立的功能拆成一个个组件,就像你看到一个网页设计稿,很容易把它拆成不同的div模块,相互协作拼装出来一个完整的网页一样,稍加练习,这对大家来说很容易做到。
例如:
数据模型
按照功能模块将数据封装成对象或数组
反面例子:
private pprMenuTemporary = []; // 正在拼装中的pprMenu,这个是为了解决处理过程中更新数组不刷新的问题 private entityName: Array<string> = []; // 试题和问题的中文名称,仅供显示用 private pprItem: any = {}; // 当前页面的核心数据,ppr对象 private hasError: boolean = false; // 是否包含错误,如果有错误,切换头部显示内容 private errorList: ErrorPprType = null; // 检错之后的列表(包含引擎和生词库的聚合) private errorFormat: any = null; // 格式错误列表 private currentErrorNode: string = ''; // 当前聚焦的错误节点 正面例子(伪代码):
private pprInfo = { MenuTemporary = [], // 正在拼装中的pprMenu,这个是为了解决处理过程中更新数组不刷新的问题 pprItem: any = {} // 当前页面的核心数据,ppr对象 } private entityName: Array<string> = []; // 试题和问题的中文名称,仅供显示用 private errorInfo = { hasError: boolean = false, // 是否包含错误,如果有错误,切换头部显示内容 errorList: ErrorPprType = null, // 检错之后的列表(包含引擎和生词库的聚合) errorFormat: any = null, // 格式错误列表 currentErrorNode: string = '' // 当前聚焦的错误节点 } 初始化组件
作为开发1-5年的Android开发者该如何系统的提升自己? 如今,国内移动互联网的红利期已过,Android 开发工程师也从最初的一人难求,到现在的一个岗位百人竞争,僧多粥少的情况直接导致整个行业对求职者的要求越来越高。另外,Android 开发越来越规范,间接导致项目对质量要求的提升。内存优化、UI 卡顿优化、App 崩溃监控等性能调优也逐渐成了人手必备的技能。
只有不断提升自己的技术实力,让自己进阶为「高级/资深工程师」,你才有机会爬上 Android 的峰顶。然而今天,我看到这个腾讯T9级 Android技术图谱之后,感觉这里面的内容真是为进击大厂的小伙伴量身打造的!所以,今天特地拿出来分享一下,这个非常值得每一个Android开发者去学习和收藏!
图谱亮点 为什么说这个图谱值得推荐呢?主要有这几点:内容采用视频+文档的形式,比我们的文字教程更容易上手提供实操的体验场景,通过动手练习,让你更直观地理解所学内容配合最全的Android架构师进阶内容,让学习更贴近未来实战 Android性能分析与优化实战方案 作为一名Android程序员,说实话要做好性能这一块,真心不容易。为什么这么说? 是因为需要接触的知识实在是太多了, Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以做好。这份《Android性能分析与优化实战进阶手册》,让每一个想进入 Android 系统开发和优化这个领域的人,能通过这份笔记手册快速入门,同时也算是对知识的一个梳理,查漏补缺,终身学习。
内存优化布局优化启动优化卡顿优化稳定性优化电量优化线程优化瘦身优化
Android架构师必备源码框架精讲解析模块 Kotlin入门到精通模块 Flutter2.0混合式开发模块
Dart语法Flutter2.0之UIFlutter2.0进阶Flutter2.0优化实战
结语 堪称Android架构师进阶的保姆级学习资料!距离从入门到入坑大概就差掉发了,关于如何不脱发就留给大家自己努力一下吧,毕竟不是自己努力到的,不会珍惜 _需要完整版的朋友,可点击这里查看获取方式!
import json from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities capabilities = DesiredCapabilities.CHROME capabilities["goog:loggingPrefs"] = { "performance": "ALL" } driver = webdriver.Chrome( r"./chromedriver_93", desired_capabilities=capabilities, ) driver.get("https://www.rkengler.com") logs = driver.get_log("performance") for log in logs: """ log内容 {'method': 'Network.responseReceived', 'params': {'loaderId': '', 'requestId': '94BA56CDA0DE3EBBD05F45534AC7903E', 'response': {'connectionId': 122, 'connectionReused': True, 'encodedDataLength': 478, 'fromDiskCache': False, 'fromPrefetchCache': False, 'fromServiceWorker': False, 'headers': {'access-control-allow-credentials': 'true', 'access-control-allow-headers': 'X-Requested-With,Content-Type,Cache-Control,Pragma,Date,X-Timestamp,Content-Encoding,api-version,Authorization,authorizationv2,Access-Control-Allow-Origin,lang,token,X-Common-Message,X-B3-TraceId,X-B3-SpanId,X-B3-Sampled,version,platform,uuid,x-matchpath,X-B3-SessionId,shuidi-app-code,auth-app-code', 'access-control-allow-methods': 'HEAD, POST, GET, OPTIONS, DELETE, PUT', 'access-control-allow-origin': 'https://xxx.com', 'access-control-expose-headers': 'Content-Disposition,Etag', 'access-control-max-age': '86400', 'date': 'Mon, 27 Sep 2021 06:48:48 GMT', 'server': 'openresty'}, 'mimeType': '', 'protocol': 'h2', 'remoteIPAddress': '140.
前言:
Vue.js现在创建项目,主要有两种版本。一个是2.9.6的版本,一个是2.9.6之后的版本。熟悉Vue的都知道,这两个版本是有区别的。因此解决的办法也不一样,下面针对不同的版本有不同的解决方案。
问题:
解决方案:
2.9.6:
在项目里面找到config这个文件夹里面的index.js这个文件,按照下面的图,来修改。
上面这个值,默认创建项目的时候,是为true,把它改为false就能现在在控制台上看不到源码的问题了。
2.9.6之后的版本:
在项目根目录中找到vue.config.js这个文件,之后在里面加入productionSourceMap: false;如果没有这个文件的话,就手动创建一个,在里面贴入下面的代码:
module.exports = { productionSourceMap: false }
剑指 Offer 32 - II. 从上到下打印二叉树 II
和上道题目剑指 Offer 32 – I. 从上到下打印二叉树相似,都是需要层次遍历二叉树,不同的是,需要将同一层的元素放在一个数组中。
为了将同一层的元素放到一个数组汇总,需要记录每一层的元素个数,可以直接通过队列的长度来获取。
// 登录 AlgoMooc 官网获取更多算法图解 // https://www.algomooc.com class Solution { public List<List<Integer>> levelOrder(TreeNode root) { // 设置 res 用来保存输出结果 List<List<Integer>> res = new ArrayList<>(); // 边界情况处理 if(root == null) return res; // 设置一个队列,用来存储二叉树中的元素 Queue<TreeNode> queue = new LinkedList<>(); // 队列添加二叉树的根节点 queue.add(root); // 遍历队列,直到队列为空,说明访问了二叉树中所有的节点 while(!queue.isEmpty()){ // 用来记录 queue 的长度,即每层节点的个数 int size = queue.size(); // 用来保存每一层节点,保存成功后添加到 res 中 List<Integer> temp = new ArrayList<>(); // 使用 for 循环,将 queue 中的元素添加的 temp 中 for(int i = 0 ; i < size ; i++ ){ // 从 queue 中取出一个节点 TreeNode node = queue.
解决 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable警告问题 先翻译:警告util.NativeCodeLoader:无法为您的平台加载本机Hadoop库…在适用的情况下使用内置的java类
这个警告实在是虽然可能没有什么阻挡使用Hadoop的
/但是它会在你启动Hadoop时候出现,还会在你输入每一个命令enter之后出现/
/在我配置完Hadoop的环境之后就出现了这个警告,/希望我自己只是个例,大家能够没有这个问题,如果有,那就跟着我一起解决吧
首先== 判断好自己的警告是否和我的一样==这个很重要,有的教程通过升级glib库达到消除警告的目的,但是我们并不清楚当前我们的Hadoop的期望是哪个版本的glib,所以需要保守起见还是不要升级,先判断自己的问题,如果不符合我的问题那么可以看大佬博客先进入这个目录 /usr/local/hadoop/lib/native 看这个目录下都存了什么
可以看出,libhadoop.so 存放在这个目录下
接下来我们回到/usr/local/hadoop目录
紧接着输入以下代码 grep -R 'java.library.path' * 可以看到:
bin/hadoop: hadoop_add_subcommand "jnipath" client "prints the java.library.path" bin/hadoop.cmd: @echo jnipath prints the java.library.path bin/yarn.cmd: set YARN_OPTS=%YARN_OPTS% -Djava.library.path=%JAVA_LIBRARY_PATH% etc/hadoop/yarn-env.cmd: set YARN_OPTS=%YARN_OPTS% -Djava.library.path=%JAVA_LIBRARY_PATH% etc/hadoop/shellprofile.d/example.sh:# and into the java.library.path system property. In the majority libexec/hadoop-functions.sh: hadoop_add_param HADOOP_OPTS java.library.path \ libexec/hadoop-functions.
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录 一、什么是SpringMVC1、MVC2、SpringMVC 二、SpringMVC执行流程图三、组件说明四、核心架构具体流程 一、什么是SpringMVC 1、MVC MVC: MVC是一种设计模式
MVC设计原理图:
具体含义:
M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity)
V-View 视图(做界面的展示 jsp,html……)
C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面)
2、SpringMVC SpringMVC是一个MVC的开源框架,springMVC=struts2+spring,springMVC就相当于是Struts2加上sring的整合,但是这里有一个疑惑就是,springMVC和spring是什么样的关系呢?这个在百度百科上有一个很好的解释:意思是说,springMVC是spring的一个后续产品,其实就是spring在原有基础上,又提供了web应用的MVC模块,可以简单的把springMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说springMVC和spring无缝集成,其实springMVC就是spring的一个子模块,所以根本不需要同spring进行整合。
二、SpringMVC执行流程图 从这张图可以大致看出SpringMVC的执行过程:
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。
三、组件说明 在执行过程中会用到很多的组件,那么这些组件的具体含义是什么呢?
DispatcherServlet: 前端控制器。用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性,系统扩展性提高。由框架实现HandlerMapping: 处理器映射器。HandlerMapping负责根据用户请求的url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,根据一定的规则去查找,例如:xml配置方式,实现接口方式,注解方式等。由框架实现Handler: 处理器。Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。HandlAdapter: 处理器适配器。通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。由框架实现。ModelAndView: 是springmvc的封装对象,将model和view封装在一起。ViewResolver: 视图解析器。ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。View: 是springmvc的封装对象,是一个接口, springmvc框架提供了很多的View视图类型,包括:jspview,pdfview,jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。 四、核心架构具体流程 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。 下边两个组件通常情况下需要开发:
Handler: 处理器,即后端控制器用controller表示。
View: 视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。
记录mac运行Vue项目安装npm install时node-gyp的错误
mac运行Vue项目出现node-gyp错误 前端小白,最近换了新电脑macBook Pro在运行项目的时候安装依赖的时候出现node-gyp错误,经过了一两天的捣鼓总算高清楚了。
出现错误截图如下: 出现问题截图我忘记截图了,网上找了个差不多的
尝试解决的方法: 百度看到说要关闭mac的SIP: ,尝试了好几次也百度查看关闭的方法,说是先关机然后按开机的时候按住command+R键进入recover模式,尝试了好几次macOS11.6版本好像进入不了恢复模式;**尝试采用 sodu npm i**不行**安装node-gyp: npm install node-gyp -g**没解决 最终决解成功的办法: 最后发现我安装的node版本是16.0版本
查看node版本在终端输入 node -v
发现我安装的版本可能不太稳定,最后我卸载了node版本,重新安装了14.17.6 稳定版本
终于npm i成功了,可以正常的启动下项目了
下载地址https://yy123.ink/frontDetail/10713很酷的CSS登录页面,画风超炫有很强的科技感,使用纯CSS3实现的科技感动画。
dd:
有源滤波器指的是由运放及一些无源器件R、L、C等组成的滤波器器。
滤波器一般分为低通、高通、带通、带阻等几种基本模式;另外还有全通滤波器,只改变信号的相位。滤波器最重要的特性是幅频响应,即幅度倍数在频率坐标轴上表现出的图形。
本篇我们先来看一阶有源滤波电路。
1)一阶有源低通滤波器
仿真电路图如下:左边为电路图,右边为波特图(频率响应)
图中,R1和C1构成了无源的RC低通滤波器,运放只起到跟随或放大的作用。
通过选择R2和R3的值可以将输出信号放大,这里仿真时将R2设为0只是为了不放大,便于观察波特图。
RC低通滤波器的计算过程如下:
变换后得到:
所以,其传递函数为:
其中s即为jω角频率,不难发现,频率越高时,H(s)值越小,即电路阻碍高频信号通过。
令H(s)=1/2,(即-3dB倍数),则可以计算出 s = jω = 1/(RC),即为该RC电路的截止频率。
图中的参数可以算出截止频率为:ω = 1/(1k*10uF)= 100,注意这里的ω为角频率,换算为频率应为 ω/2π ≈ 15.9Hz。
这与图中仿真的到的-3dB点,约16Hz是相符的。
2)一阶有源高通滤波器
电路图如下:左边为电路图,右边为波特图(频率响应)
图中,R1和C1构成了无源的RC高通滤波器,运放只起到跟随或放大的作用。
RC高通滤波器和RC低通滤波器的构成只需将R和C的位置互换。
RC高通滤波器的计算过程如下:
不难得出其传递函数为:
其中s即为jω角频率,不难发现,频率越低时,H(s)值越小,即电路阻碍低频信号通过。
令H(s)=1/2,可计算出 ω = 1/(1k*10uF)= 100,即 ω/2π ≈ 15.9Hz时为高通滤波器的截止频率。
3)有源滤波器的特点
这一节分析了简单的一阶有源滤波器,虽然,它们一般只是由无源器件R、C在起作用,运放只是跟随或者放大信号,但是它具有不少优点。
由于运放的接入,运放的输入阻抗极高,使得RC滤波电路的输出端不会受到负载的影响(等同于RC电路后端不接负载的情况);另外运放的可以起到信号放大,增强驱动能力的作用。
但是由于运放的带宽有限,会使得有源滤波器的有效带宽范围只能在运放的带宽范围内,不能做到极高的频段。
好了,本节就到这里了,下一节继续讲二阶的有源滤波器。
欢迎关注我的公众号:
(打工人小小记录)根据给定词和词频绘制
1)日常倒库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from wordcloud import WordCloud import re 2)防止乱码 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 3)绘图函数 font_path需要设置字体路径,可能会导致乱码,字体在c盘fonts文件夹。WordCloud()有很多参数,供更改图片样式。
def draw_wordcloud(fre,font,seed): wc=WordCloud(font_path=font,background_color='white',scale=25) wc.generate_from_frequencies(fre.to_dict(),max_font_size=None) wc.recolor(random_state=seed,color_func=None,colormap=None) plt.figure(figsize=(16,14)) plt.imshow(wc) plt.axis("off") plt.show() file_path='fre.index.name+fre.name+'词云图.png' wc.to_file(file_path) 4)数据规范 数据来自平台可视化数据,从开发者模式可以将文本数字复制下来,保存为txt文件。ps:WS模式
with open('品牌.txt','r',encoding='utf-8') as f: content = f.read() 从字符串中提取需要的数据
ex1=r': {showName: "(.*?)",' p1=re.findall(ex1,content) #名称 ex2=r'\d: "(\d\.\d+)"' p2=re.findall(ex2,content) #占比 ex3=r'\d: "(\d+,\d+)"' p3=re.findall(ex3,content) #TGI ex4=r'\d: "(\d+\.\d)"' p4=re.findall(ex4,content) #推荐指数 将列表合并为Dataframe格式
df = pd.
本文介绍搭建两个集成dubbo的springboot项目并相互调用的过程
springboot集成dubbo 一、创建生产者项目1、创建项目2、引入依赖(写pom)3、写配置文件4、写service5、执行maven的install命令6、启动服务 二、创建消费者项目1、创建项目2、引入依赖(须额外引入生产者项目的jar)3、写配置文件4、写controller5、启动服务 三、在浏览器访问消费者项目接口 一、创建生产者项目 1、创建项目 然后直接next、Finish
2、引入依赖(写pom) <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.aloudata</groupId> <artifactId>dubbo-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <name>dubbo-provider</name> <description>dubbo-provider</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.
使用html2canvas将我们要转成图片的DOM元素转成canvas对象.
将canvas对象写入剪切板时两个思路:
1.document.execCommand('Copy');
// 安装后导入 import html2canvas from 'html2canvas'; // 传入要截图的DOM节点 html2canvas(this.$refs.paramInfoRef).then((canvas) => { // 得到的是一个canvas对象,将其转成一个uri给img对象 const img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img); img.onload = () => { // 获取选中对象 const selection = window.getSelection(); // 如果已有选种则清除选中 if (selection.rangeCount > 0) selection.removeAllRanges(); // 创建选中区域 const range = document.createRange(); // 添加图片到选种区域 range.selectNode(img); // 添加到选种区域到选中对象 selection.addRange(range); // 调用系统剪切板复制命令 document.execCommand('Copy'); // 清空选中区域 selection.removeAllRanges(); }; }); 结果: 网上很多帖子写了但是我测试后发现无效,放弃
2.navigator.clipboard.write()
import html2canvas from 'html2canvas'; html2canvas(this.
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录 一、关于multipart请求二、配置multipart resolver三、Controller四、写一个jsp测试 一、关于multipart请求 我们一般使用的表单提交的数据都是文本类型的数据,比如我们的用户信息表单,在表单提交时,表单中的“属性-值”会被拼成字符串提交上去:
"name="+ uname +"&sex="+ sex +"&phoneNum="+uphone 这种方式对于提交文本数据来说非常简单,但是对于图片,视频这种二进制文件就不行了。那么如何提交文件呢?
这里就用到了一个叫做multipart表单的东西,multipart表单和上面介绍的普通表单不同,它会把表单分割成块,表单中的每个字段对应一个块,每个块都有自己的数据类型。
二、配置multipart resolver 实现文件上传,其实就是解析一个Mutipart请求。DispatchServlet自己并不负责去解析mutipart 请求,而是委托一个实现了MultipartResolver接口的类来解析mutipart请求。在Spring3.1之后Spring提供了两个现成的MultipartResolver接口的实现类:
CommonMutipartResolver: 通过利用Jakarta Commons FileUpload来解析mutipart 请求StandardServletMutipartResolver: 依赖Servlet3.0来解析mutipart请求 要想实现文件上传功能,我们只需要在项目中配置这两个bean中的任何一个就行了。
方式一: 通过StandardServletMutipartResolver解析mutipart 请求:
1.在xml文件中配置multipartResolver的bean
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/> 2.在web.xml文件中配置MutipartResolver相关属性
<servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <multipart-config> <location>G:\input</location> </multipart-config> </servlet> mutipart-config里面有三个配置项,我这里图方便就配置了一个:
location: 上传文件用到的临时文件夹,是一个绝对路径,需要注意,这个属性是必填的max-file-size: 上传文件的最大值,单位是byte,默认没有限制max-request-size: 整个mutipart请求的最大值,单位是byte,默认没有限制 方式二: 通过CommonMutipartResolver 解析mutipart 请求
1.这个配置方式需要加第三方的类库,配置依赖
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> 2.
适用背景:
1、谷歌安装Axure RP Extension插件不成功或者搜索不到
2、不想网上搜索下载插件进行安装
3、使用Axure画原型需要发布成html格式进行预览
使用方法:
在原型文件中就可以找到Axure RP Extension for Chrome插件。
打开原型文件->resources->chrome->axure-chrome-extension.crx 找到.crx文件后如果直接拖入安装的话,会出现“此扩展程序可能已损坏”。这时,我们可以换一种方式安装。
把.crx文件修改扩展名.rar,解压,然后选择“加载已解压的扩展程序”,选择文件就可以安装了。接下来就可以正常查看原型文件了。
在您的APP、公众号等应用中,如果有产品详情,无疑会大幅提升用户体验!但基本所有开发者都会被没有京东商品详情页接口而困扰
接口地址:http://interface.mkstone.club/#/
一、接口接入步骤:
1、注册共京荣开放平台并获取APPKEY
2、接口调用
基本信息
实例响应
JAVA 异常分类及处理 异常分类 Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Error 和 Exception Error 1. Error 类是指 java 运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果 出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。 Exception ( RuntimeException、CheckedException ) 2. Exception 又有两个分支,一个是运行时异常 RuntimeException ,一个是 CheckedException。 RuntimeException 如 : NullPointerException 、 ClassCastException ;一个是检查异常 CheckedException,如 I/O 错误导致的 IOException、SQLException。 RuntimeException 是 那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 如果出现 RuntimeException,那么一 定是程序员的错误. 13/04/2018 Page 102 of 283 检查异常 CheckedException :一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强 制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行 try catch,该类异常一 般包括几个方面: 1. 试图在文件尾部读取数据 2. 试图打开一个错误格式的 URL 3. 试图根据给定的字符串查找 class 对象,而这个字符串表示的类并不存在 异常的处理方式 遇到问题不进行具体处理,而是继续抛给调用者 ( throw,throws ) 抛出异常有三种形式,一是 throw,一个 throws,还有一种系统自动抛异常 。 public static void main(String[] args) { String s = "
存在问题:
mysql 6.0 安装中报错:start service失败,如图所示。
解决方案:
需要把相关注册表删除干净后重新安装。
1)卸载安装失败的mysql,控制面板→程序和功能中卸载mysql,并删除安装路径下的相关文件夹和文件;
2)删除c盘ProgramData目录下的mysql相关目录,找不到的话需要进行“显示隐藏文件夹”操作;
3)删除相关注册表
(1)开始→运行→cmd→regedit,进入注册表列表;
(2)依次删除以下三处:
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications下的MySQL目录; HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications下的MySQL目录; HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications下的MySQL目录。
4)重启电脑,重新安装mysql6.0即可。
两数求和思路
例题:两个二进制字符串求和,a=11,b=1 s=100.
由于两个都是字符串类型,不能直接求和。可进行按位求和,逢二进一。
1,对于给定的字符串,由于两串长度不等,需要在短的字符串前面补0
2,从后往前遍历两个字符串,按位想加,加完后要判断是否大于等于2,若是,则给上一位+1
3.循环后判断首位,若首位想加大于2则给字符串前面+1位,
由于整体是字符想加,所以需要用到ASCII码
’1’+’0’=’1