当前位置: 首页 > news >正文

【Android WebView】WebView基础

在这里插入图片描述

一、简介

WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。

二、重要类

以WebView类为基础,WebSettings、WebViewClient、WebChromeClient为辅助共同完成安卓段加载网页的操作。

1、WebView
        //1、加载网页相关//直接加载服务器网页my_web_view.loadUrl("https://www.baidu.com")//直接加载本地网页file:///android_asset/为固定写法)my_web_view.loadUrl("file:///android_asset/1.html")        // 缓存历史清理//Clears the resource cache. Note that the cache is per-application,// so this will clear the cache for all WebViews used.my_web_view.clearCache(true)// 清空历史(本webView浏览的)my_web_view.clearHistory()// 结合工具类my_web_view.webViewClient = object : WebViewClient() // 设置webViewClientmy_web_view.webChromeClient = object : WebChromeClient()// 设置WebChromeClient/*** 返回键处理,网页中可返回上一页,不处理返回键直接退出App* */override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {//when user press back code and canGoBackif (keyCode == KeyEvent.KEYCODE_BACK && my_web_view.canGoBack()) {my_web_view.goBack()return true}return super.onKeyDown(keyCode, event)}
2、WebSettings
   /*** WebSettings类:对webView 进行配置管理* */@SuppressLint("SetJavaScriptEnabled", "ObsoleteSdkInt")private fun webViewSettings() {val webSettings = my_web_view.settings// js交互控制//支持js交互,动画等操作会造成cpu、电量消耗可在activity、 fragment的onResume、onStop进行开关控制webSettings.javaScriptEnabled = true         // 适配webSettings.useWideViewPort = true//自适应屏幕->自动将图片调整到自适应webView 大小webSettings.loadWithOverviewMode = true//自适应屏幕->缩放到屏幕大小//缩放webSettings.setSupportZoom(true)//支持缩放,默认为true。webSettings.builtInZoomControls = true//设置是否展示内置的缩放控件,默认为falsewebSettings.displayZoomControls = true//显示原生的缩放控件//其他webSettings.allowFileAccess = true // 可访问文件webSettings.javaScriptCanOpenWindowsAutomatically = true // 支持js 自动打开新窗口webSettings.loadsImagesAutomatically = true // 支持自动加载图片webSettings.defaultTextEncodingName = "UTF-8" // 默认值也是UTF-8//缓存控制webSettings.domStorageEnabled = true // 开启dom缓存功能webSettings.databaseEnabled = true // 开启数据库缓存功能webSettings.setAppCacheEnabled(true)// 开启application 缓存功能webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK //设置缓存模式                           (LOAD_CACHE_ELSE_NETWORK,有缓存时加载缓存,即使缓存过期,没有时从网络加载)webSettings.setAppCachePath("") // 设置app缓存目录,api已弃用。// 5.1以上默认禁止了https和http混用,开启如下if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW}}
3、WebViewClient

协助WebView工作,有一些列回调方法,用于处理各种通知 & 请求事件等。

    my_web_view.webViewClient = object : WebViewClient() {//加载url、返回false 代表使用webView 加载url 不使用系统浏览器。override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {// 如下loadUrl,return true 这种也代表不使用系统浏览器。但是官方建议直接 return false//  view?.loadUrl("https://www.baidu.com")//  return truereturn false// 直接return false即可}// 页面加载时回调override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {super.onPageStarted(view, url, favicon)}// 页面加载完成时回调override fun onPageFinished(view: WebView?, url: String?) {super.onPageFinished(view, url)}// 加载页面资源时调用(如页面上有好多图片,没加载一张就会回调一次)override fun onLoadResource(view: WebView?, url: String?) {super.onLoadResource(view, url)}// 加载页面时服务器出现错误(例如404)override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) {super.onReceivedError(view, request, error)// todo 展示自定义html页面,提示错误。}// 处理https请求override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {// 不要使用super,否则有些手机访问不了,因为包含了一条 handler.cancel()// super.onReceivedSslError(view, handler, error);// 接受所有网站的证书,忽略SSL错误,执行访问网页。这种方式在发生ssl不会影响网页加载。// 但是google play 认为这是不安全的操作。会给你警告。handler?.proceed() // handler?.cancel() // 发生ssl时挂起连接表现为白屏,默认方式。}}
4、WebChromeClient
    /*** WebChromeClient类:辅助webView 处理js dialog、网站icon、网站title。* js的各种dialog事件触发时可由webChromeClient的响应方法回调到。* */private fun webChromeClient() {my_web_view.webChromeClient = object : WebChromeClient() {// 获得网页进度时回调override fun onProgressChanged(view: WebView?, newProgress: Int) {super.onProgressChanged(view, newProgress)}// 获取网页的标题时回调override fun onReceivedTitle(view: WebView?, title: String?) {super.onReceivedTitle(view, title)}// 是否由客户端处理js Alert 事件,true 代表客户端处理,false 代表客户端不处理。// 一般客户端处理时客户端 展示对话框让用户进行选择override fun onJsAlert(view: WebView?, url: String?, message: String?, result: JsResult?): Boolean {AlertDialog.Builder(mContext).setTitle("Title").setMessage(message).setPositiveButton("确定") { dialog, which ->result?.confirm()}.setCancelable(false).show()return true}// js Confirm 对话框拦截,true代表点击确定,false 代表点击取消。override fun onJsConfirm(view: WebView?, url: String?, message: String?, result: JsResult?): Boolean {return super.onJsConfirm(view, url, message, result)}// 输入框拦截,true 代表返回输入框的值,false 代表返回nulloverride fun onJsPrompt(view: WebView?,url: String?,message: String?,defaultValue: String?,result: JsPromptResult?): Boolean {return super.onJsPrompt(view, url, message, defaultValue, result)}}}

三、Android 调用 JS 代码

方式
  • webView的loadUrl(" javascript:js方法()")
  • webView的evaluateJavascript()
<html>
<head><meta charset="UTF-8"><title>SunnyDay</title><!--内部引入法--><script>function showAlertDialog(result){alert("i am js alert dialog,i am js method!"+result)return "i am js method!"}</script>
</head>
<body><h3>i am a simple html page</h3>
</body>
</html>>

如上准备个1.html文件

1、webView#loadUrl 加载原理及其代码

借助webChromeClient 的各种回调处理。一般为js的各种dialog 方法触发时被安卓webViewClient的各种回调监听方法拦截消费。

        webSettings = web_view.settingswebSettings.javaScriptEnabled = true//允许启用js功能webSettings.javaScriptCanOpenWindowsAutomatically = true // 允许js弹窗// 加载Assets下html文件(这时js代码也就载入了)//加载assets文件夹下的html文件时使用固定格式语法即可:file:///android_asset/文件名.htmlweb_view.loadUrl("file:///android_asset/1.html")       web_view.webViewClient = object : WebViewClient(){}callByLoadUrl()//webView只是载体,内容的渲染需要使用webViewChromeClient类去实现,所以在这里写回调处理。web_view.webChromeClient = object : WebChromeClient() {// 此方法可回调到alert警告框的信息。override fun onJsAlert(view: WebView?, url: String?, message: String?, result: JsResult?): Boolean {val build = AlertDialog.Builder(mContext).setTitle("Js showAlertDialog Method").setMessage(message).setPositiveButton("确定") { dialog, which ->result?.confirm()}.setCancelable(false)build.create().show()return true}}/*** 方式1:webView的loadUrl()* */private fun callByLoadUrl() {// 点击安卓按钮加载js方法btn_call_js_method.setOnClickListener {// 调用js时要保证网页加载完成,否则js代码调用失败。因为html中也是页面加载完成才响应的js。web_view.loadUrl("javascript:showAlertDialog(\"result\")")}}

(2)webView#evaluateJavascript

        webSettings = web_view.settingswebSettings.javaScriptEnabled = true//允许启用js功能webSettings.javaScriptCanOpenWindowsAutomatically = true // 允许js弹窗// 加载Assets下html文件(这时js代码也就载入了)web_view.loadUrl("file:///android_asset/1.html")//加载assets文件夹下的html文件时使用固定格式语          法即可:file:///android_asset/文件名.htmlweb_view.webViewClient = object : WebViewClient(){}callByEvaluateJavascript()/***方式2:webView的evaluateJavascript* js 方法无返回值时it为 null*/private fun callByEvaluateJavascript() {btn_call_js_method.setOnClickListener {web_view.evaluateJavascript("javascript:showAlertDialog()") {Log.d("AndroidCallJsActivity", "" + it)//AndroidCallJsActivity"i am js method!"}}}

(3)总结

/*** Android call js method practice* 两种方式:* 1、webView的loadUri(" javascript:js方法()")*    这种方式一般调用的为js的dialog方法,使用安卓的WebChromeClient 对应回调方法进行拦截处理。* 2、webView的evaluateJavascript*     直接调用js的方法,还可以获得js方法返回值回调*     js方法结果回调为String 类型值*     js方法无返回值,这里回调为null**     建议以这种方式,既可快捷获得返回值,又可通过1中的dialog回调处理。**     小结:Android call js method*          安卓调用js方法后可以在安卓端获得结果回调处理。* */
调用方式优点缺点适用场景
loadUrl方便简洁效率低,获取返回值麻烦不需要获取返回值时
evaluateJavascript效率高安卓4.4以上才能使用安卓4.4以上

四、Js调用安卓代码

方式
  • 通过webView的addJavascriptInterface方法
  • 通过重写webViewClient的shouldOverrideUrlLoading方法筛选url调用
  • 通过 WebChromeClient 的dialog 回调判断筛选url调用
<html>
<head><meta charset="UTF-8"><title>SunnyDay</title><!--内部引入法--><script>//方式1:对象映射方式function callAndroid(){// 调用安卓的hello方法,由于安卓中添加了对象映射,test.hello()就相当于安卓的      //JsInterface().hello()test.hello(" i am js code! ");}//方式2:重写shouldOverrideUrlLoading 进行拦截function callAndroid2(){document.location = "js://webview?arg1=111&arg2=222";}//方式3:WebChromeClient 的 onJsAlert、onJsConfirm、onJsPrompt 方法回调拦截 JS 对话框function callAndroid3(){//1、首先搞个输入框,触发时安卓可获得回调//2、收到回调后安卓处理,点击确定返回输入框值,点击取消返回nullvar result=prompt("js://demo?arg1=111&arg2=222");alert("demo " + result);}</script>
</head>
<body>
<h3>i am a simple html page</h3>
//方式1
<button type="button" id="btn" onclick="callAndroid()">点我即可调用Android的hello方法</button>
//方式2
<button type="button" id="btn2" onclick="callAndroid2()">方式2</button>
//方式3
<button type="button" id="button3" onclick="callAndroid3()">方式3</button></body>
</html>>
1、addJavascriptInterface

(1)定义对象映射方法


/*** 1、自定义对象用于对象映射* 2、自定义方法,映射后供js对象使用* 3、方法必须加JavascriptInterface注解*/
class JsInterface {@JavascriptInterfacefun hello(msg: String) {Log.d("JsCallAndroidActivity", "android method hello is called:$msg")}
}

(2)映射

        //js调用安卓方法方式1:webSettings = web_view_th.settingswebSettings.javaScriptEnabled = true//允许启用js功能webSettings.javaScriptCanOpenWindowsAutomatically = true // 允许js弹窗web_view_th.loadUrl("file:///android_asset/2.html")// 定义对象映射,把自定义的JsInterface映射给"test",供js对象使用。web_view_th.addJavascriptInterface(JsInterface(), "test")// 一行代码十分简单
2、重写webViewClient的shouldOverrideUrlLoading方法
        webSettings = web_view_th.settingswebSettings.javaScriptEnabled = true//允许启用js功能webSettings.javaScriptCanOpenWindowsAutomatically = true // 允许js弹窗web_view_th.loadUrl("file:///android_asset/2.html")web_view_th.webViewClient = object : WebViewClient() {override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {//view?.url //file:///android_asset/2.html ,//注意这里的两个url不相同 get的url为   webViewLoad的,request的为动态定义的val requestUrl = request?.urlLog.i("JsCallAndroidActivity", "" + requestUrl) //js://webview?arg1=111&arg2=222return if (requestUrl.toString() == "js://webview?arg1=111&arg2=222") {// 符合筛选,调用安卓方法。printLog()true} else {super.shouldOverrideUrlLoading(view, request)}}}private fun printLog() {Log.i("JsCallAndroidActivity", "android method:print log !")}
3、通过 WebChromeClient 的dialog 回调判断筛选url调用

webSettings = web_view_th.settingswebSettings.javaScriptEnabled = true//允许启用js功能webSettings.javaScriptCanOpenWindowsAutomatically = true // 允许js弹窗web_view_th.loadUrl("file:///android_asset/2.html")web_view_th.webChromeClient = object : WebChromeClient() {override fun onJsPrompt(view: WebView?,url: String?,message: String?,defaultValue: String?,result: JsPromptResult?): Boolean {val uri = Uri.parse(message)if ("js" == uri.scheme) {if ("demo" == uri.authority) {result?.confirm("JS 调用了 Android 的方法")// 符合筛选,调用安卓方法。printLog()}return true}return super.onJsPrompt(view, url, message, defaultValue, result)}}
4、小结
/*** js call android method practise* 1、webView的addJavascriptInterface(自定义对象,“映射给的自定义字符串对象”)* 这种方式最简单,自定义对象,内部定义一系列方法供js调用。js拿到映射对象即可调用安卓自定义的对象方法** 2、重写webViewClient的shouldOverrideUrlLoading方法,筛选请求的url是否为js规定的url,是规定的则调用安卓的相应方法。** 3、通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt(),原理与2一致。* */
调用方式优点缺点适用场景
WebView.addJavascriptInterface 对象映射方便简洁Android 4.2 一下存在漏洞Android 4.2 以上相对简单的应用场景
WebViewClient.shouldOverrideUrlLoading 回调拦截不存在漏洞使用复杂,需要协议约束不需要返回值情况下
WebChormeClient.onJsAlert / onJsConfirm / onJsPrompt 方法回调拦截不存在漏洞使用复杂,需要协议约束能满足大多数场景

五、Android 内嵌网页时登录状态同步方案

1、使用 WebView 和 Cookie 同步

Android 的 WebView 是一种能在应用中显示网页的组件。WebView 会自动处理 Cookies,但为了确保登录状态的同步,可能需要手动同步应用和 WebView 的 Cookies。

(1) 获取应用中的 Cookie

如果你的应用在登录后保存了 Cookie,可以通过 CookieManager 来获取这些 Cookie。

(2) 将 Cookie 注入 WebView:

在加载网页前,将这些 Cookie 注入 WebView 的 CookieManager。

CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);// 获取应用的 Cookie,假设名为 "appCookie"
String appCookie = "key=value; domain=yourdomain.com";
cookieManager.setCookie("yourdomain.com", appCookie);// 加载网页
webView.loadUrl("https://yourdomain.com");

(3) 确保同步:
在 WebView 加载新页面时,确保 Cookie 同步。

webView.setWebViewClient(new WebViewClient() {@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);CookieManager.getInstance().flush();}
});
2、使用 Shared Preferences 和 JavaScript Bridge

这种方法可以通过 JavaScript 与 Android 应用交互,保持登录状态同步。

(1)保存登录状态:
登录后,将登录状态(例如 token)保存到 Shared Preferences。

SharedPreferences sharedPref = getSharedPreferences("MyApp", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("token", "your_token");
editor.apply();

(2)设置 JavaScript 接口:
在 WebView 中设置 JavaScript 接口,用于获取登录状态。

webView.addJavascriptInterface(new Object() {@JavascriptInterfacepublic String getToken() {SharedPreferences sharedPref = getSharedPreferences("MyApp", Context.MODE_PRIVATE);return sharedPref.getString("token", "");}
}, "Android");

(3)在网页中使用:
在网页的 JavaScript 中调用这个接口,获取登录状态。

function getToken() {return Android.getToken();
}// 在需要时调用 getToken(),例如页面加载完成后
document.addEventListener("DOMContentLoaded", function() {var token = getToken();if (token) {// 使用 token 做进一步处理}
});
3、使用 OAuth 进行单点登录(SSO)

如果你的应用和网页都支持 OAuth,可以使用 OAuth 进行单点登录。

(1)在应用中获取 OAuth Token:
用户在应用中登录后,获取 OAuth Token 并保存。

(2)WebView 加载网页时附加 Token:
在加载网页时,将 Token 附加在 URL 或请求头中。

String url = "https://yourdomain.com?token=" + oauthToken;
webView.loadUrl(url);// 或者设置请求头
webView.setWebViewClient(new WebViewClient() {@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {Map<String, String> headers = new HashMap<>();headers.put("Authorization", "Bearer " + oauthToken);request.setRequestHeaders(headers);return super.shouldInterceptRequest(view, request);}
});
4、使用统一的身份认证系统

如果你的应用和网页都使用统一的身份认证系统(如 Firebase Authentication),可以通过相同的身份认证机制同步登录状态。

(1)应用中登录:
使用统一的身份认证系统登录,并获取认证信息。

(2)WebView 中共享认证信息:
通过与身份认证系统的集成,在 WebView 中实现自动登录。

FirebaseAuth mAuth = FirebaseAuth.getInstance();
FirebaseUser currentUser = mAuth.getCurrentUser();if (currentUser != null) {String idToken = currentUser.getIdToken(false).getResult().getToken();String url = "https://yourdomain.com?token=" + idToken;webView.loadUrl(url);
}

六、WebView相关优化建议

1、给 WebView 加一个加载进度条

为了友好展示,重写 WebChromeClient 的 onProgressChanged 方法。未加载完成时展示loading进度条

2、提高 HTML 网页加载速度,等页面 finsh 在加载图片
public void load () {if(Build.VERSION.SDK_INT >= 19) {webView.getSettings().setLoadsImagesAutomatically(true);} else {webView.getSettings().setLoadsImagesAutomatically(false);}
}
3、onReceivedError 时加载自定义界面

web的error 页面比较丑,我们可以在加载失败时,展示安卓自定义的错误展示页。

4、动画、银屏、视频 合适加载释放

动画、银屏、视频 加载会造成cpu、电量消耗可在activity、 fragment的onResume、onStop进行开关控制。

七、收获

1、明文传输控制

Android P 阻止加载任何 http 的请求,在清单文件application节点 添加android:usesCleartextTraffic=“true”

2、Android 5.0 之后 WebView 禁止加载 http 与 https 混合内容 。这样会造成某些资源加载失败。
if (Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP){webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);}/*例如:https://www.aaa.com.cn/a/b/c/d/e/index.html?uid=0011&URL=http://www.bbb.com.cn/1.png 这个url1、实际页面为:https://www.aaa.com.cn/a/b/c/d/e/index.html 后面追加了一些参数2、h5页面上src标签加载http://www.bbb.com.cn/1.png此时你使用webview.loadUrl("https://www.aaa.com.cn/a/b/c/d/e/index.html?uid=0011&URL=http://www.bbb.com.cn/1.png") 就会出现h5 图片显示失败。解决方案开启MixedContentMode*/
3、硬件加速开启导致问题

比如不能打开 PDF,播放视频花屏等等。关闭硬件加速。

4、重写webViewClient的shouldOverrideUrlLoading

否则系统不知道你是想用webview打开url 还是使用系统浏览器。

5、WebView白屏问题

原因:页面进度不到100%时显示的就是白屏,进度到100时开始加载网页资源。

解决:网上方案较多这里提示一种:进度不到100时展示加载提示。

The end

官方文档

练习

相关文章:

【Android WebView】WebView基础

一、简介 WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核&#xff0c;4.4后直接使用了Chrome。 二、重要类 以WebView类为基础&#xff0c;WebSettings、WebViewClient、WebChromeClient为辅助共同完成安卓段加…...

Python酷库之旅-第三方库openpyxl(03)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…...

电脑丢失dll文件一键修复的方法有哪些?分析dll文件修复的多种策略

我们经常会遇到各种各样的问题&#xff0c;其中之一就是DLL文件的丢失。DLL文件&#xff08;动态链接库&#xff09;是操作系统和应用程序正常运行所必需的文件&#xff0c;当这些文件丢失或损坏时&#xff0c;可能会导致软件无法正常启动&#xff0c;甚至影响系统的稳定性。对…...

小程序项目业务逻辑回忆4

用户查询积分 积分获取规则如下: 邀请其他用户购票参会,将获取该用户花费金额的10%获取积分。 邀请用户注册参观展览&#xff0c;需注册并现场签到&#xff0c;将获取10分的奖励积分。 邀请企业用户参展&#xff0c;将获取企业参展金额的5%获取到积分。 上述3条积分获取规…...

LeetCode 16.最接近的三数之和(C++)

链接 https://leetcode.cn/problems/3sum-closest/description/ 题目 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例1 输入&a…...

JSON.parse 解析NaN, Infinity, -Infinity失败

背景 JSON.parse() 方法解析字符串时&#xff0c; 如果字符串包含NaN, Infinity, -Infinity会报错。因为我们需要先将NaN, Infinity, -Infinity替换成字符类型&#xff0c;再做转换 解决方法 function convert(str) {str str.replace(/NaN/g, "NaN");str str.re…...

【计算机】我不允许还有人不知道数据库是什么

数据库是计算机科学中的一个核心概念,它是用于存储、检索、管理和处理数据的系统。在现代的软件开发和信息技术中,数据库扮演着至关重要的角色。以下是关于数据库的一些基本要点: 数据存储: 数据库提供了一个结构化的方式来存储数据,使得数据可以高效地组织和访问。它通过…...

制作WIFI二维码,实现一键扫描连接WIFI

在现代社会&#xff0c;Wi-Fi已成为我们日常生活中不可或缺的一部分。无论是在家庭、办公室还是公共场所&#xff0c;我们都希望能够快速方便地连接到Wi-Fi网络。下面小编就来和大家分享通过制作WIFI二维码&#xff0c;来实现一键扫描就可以连接WIFI的方法。连接WIFI不用在告诉…...

数据结构-图的基本概念

图的定义 图时由非空的顶点集合和一个描述顶点之间关系的集合组成。可以定义为&#xff1a; ​​​​​​​ ​​​​​​​ ​​​​​​​ G表示一个图&#xff0c;V表示点集&#xff0c;E表示边集。集合E的每一个二元组都包含两个值和&#xff0c;表示…...

【HarmonyOS NEXT 】鸿蒙generateBarcode (码图生成)

本模块支持将字符串转换为二维码或条形码&#xff0c;目前已支持的码制式为EAN-8、EAN-13、UPC-A、UPC-E、Codabar、Code 39、Code 93、Code 128、ITF-14、QR Code、Data Matrix、PDF417、Aztec。暂时不支持多功能码生成。 起始版本&#xff1a;4.1.0(11) 导入模块 import {…...

python测试工程师 之 unittest框架总结

unittest 学习目标unittest 框架的基本使⽤⽅法(组成)断⾔的使⽤ (让程序⾃动的判断预期结果和实际结果是否相符)参数化(多个测试数据, 测试代码写⼀份 传参)⽣成测试报告 复习pythonunittest 框架的介绍核⼼要素(组成)1. TestCase 测试⽤例, 这个测试⽤例是 unittest 的组成部…...

微服务中的相关概念

Eureka Eureka 是由 Netflix 开发的一个服务发现和注册中心&#xff0c;广泛应用于微服务架构中。Eureka 主要用于管理和协调分布式服务的注册和发现&#xff0c;确保各个服务之间能够方便地找到并通信。它是 Netflix OSS&#xff08;Netflix Open Source Software&#xff09…...

常见的设计模式

设计模式是一套被反复使用的、代码设计经验的总结。它们被用来解决软件开发中的某些常见问题&#xff0c;提高代码的可维护性、可扩展性和重用性。设计模式主要分为三大类&#xff1a;创建型模式、结构型模式和行为型模式。以下是一些常见的设计模式及其简要说明&#xff1a; …...

Camtasia2024中文版最新电脑录屏剪辑神器!

大家好&#xff0c;今天我要安利一个我最近超级喜欢的工具——Camtasia2024中文版&#xff01;这款软件真的太棒了&#xff0c;它让我的视频编辑工作变得更加轻松和高效。如果你也对视频制作感兴趣&#xff0c;那么一定要尝试一下这款神器哦&#xff01; Camtasia2024win-正式…...

【性能优化】表分区实践最佳案例

背景 随着数字化建设的持续深入&#xff0c;企业的业务规模迎来了高速发展&#xff0c;其数据规模也呈现爆炸式增长&#xff0c;如果继续使用传统解决方案&#xff0c;将所有数据存储在一个表中&#xff0c;对数据的查询和维护效率将是一个巨大的挑战&#xff0c;在这个背景下…...

力扣SQL50 项目员工 I ROUND AVG

Problem: 1075. 项目员工 I &#x1f468;‍&#x1f3eb; 参考题解 Code select project_id,ROUND(AVG(e.experience_years),2) as average_years FROMproject as p LEFT JOINemployee as e ONp.employee_id e.employee_id GROUP BYp.project_id;...

nuscenes 数据集学习笔记

目录 数据信息类型: 数据信息类型: Map & Camera(png), Lidar(激光雷达) & Radar(雷达)(pcd), Json 文件结构(以v1.0-mini为例): maps: 存放Map的png文件samples: 存放Camera, Lidar, Radar关键非结构化数据信息, 带标注sweeps: 存放Camera, Lidar, Radar 次要非结构…...

在Windows上用MinGW编译OpenCV项目运行全流程

一、准备软件 OpenCV源码CMake工具MinGW工具链&#xff08;需要选用 posix 线程版本&#xff1a;原因见此&#xff09; 二、操作步骤 官网提供了VC16构建版本的二进制包&#xff0c;但是没有给出GCC编译的版本。所以如果使用MinGW进行构建&#xff0c;那就只能从源码开始构建…...

用Vite基于Vue3+ts+DataV+ECharts开发数据可视化大屏,即能快速开发又能保证屏幕适配

数据可视化大屏 基于 Vue3、Typescript、DataV、ECharts5 框架的大数据可视化&#xff08;大屏展示&#xff09;开发。此项目vue3实现界面&#xff0c;采用新版动态屏幕适配方案&#xff0c;全局渲染组件封装&#xff0c;支持数据动态刷新渲染、内部DataV、ECharts图表都支持自…...

大二学生眼中的Netty?基于Netty实现内网穿透!

爷的开场白 掘金的朋友们大家好&#xff01;我是新来的Java练习生 CodeCodeBond&#xff01; 这段时间呢&#xff0c;博主在学习Netty&#xff0c;想做一个自己感兴趣好玩的东西&#xff0c;那就是内网穿透&#xff01;&#xff01;&#xff08;已经实现主要代理功能但有待优化…...

JavaStringBuffer与StringBuilder

StringBuffer、StringBuilder 文章目录 StringBuffer、StringBuilderStringBuffer和StringBuilder的理解可变性分析对于String对于StringBuilder 常用方法执行效率对比 StringBuffer和StringBuilder的理解 String 不可变的字符序列 StringBuffer 可变的字符序列 JDK1.0声明&…...

云徙科技助力竹叶青实现用户精细化运营,拉动全渠道销售额增长

竹叶青茶以其别具一格的风味与深厚的历史底蕴&#xff0c;一直被誉为茶中瑰宝。历经千年的传承与创新&#xff0c;竹叶青不仅坚守着茶叶品质的极致追求&#xff0c;更在数字化的浪潮中&#xff0c;率先打破传统&#xff0c;以科技力量赋能品牌&#xff0c;成为茶行业的领军者。…...

深度揭秘:深度学习框架下的神经网络架构进化

深度学习框架下的神经网络架构经历了从基础到复杂的显著进化&#xff0c;这一进程不仅推动了人工智能领域的突破性进展&#xff0c;还极大地影响了诸多行业应用。本文旨在深入浅出地揭示这一进化历程&#xff0c;探讨关键架构的创新点及其对现实世界的影响。 引言&#xff1a;…...

MySQL的DML语句

文章目录 ☃️概述☃️DML☃️添加数据☃️更新和删除数据☃️DML的重要性 ☃️概述 MySQL 通用语法分类 ● DDL: 数据定义语言&#xff0c;用来 定义数据库对象&#xff08;数据库、表、字段&#xff09; ● DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改 …...

Wireshark的基本用法以及注意事项

Wireshark 是一个流行的网络协议分析工具&#xff0c;可以捕获和分析网络数据包。以下是一些常见的 Wireshark 的用法&#xff1a; 安装和启动&#xff1a;首先需要下载和安装 Wireshark。安装完成后&#xff0c;可以通过启动 Wireshark 应用程序来打开它。 选择网络接口&…...

集团门户网站的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;集团文化管理&#xff0c;基础数据管理&#xff0c;公告通知管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xff0…...

Tomcat基础详解

第一篇&#xff1a;Tomcat基础篇 lecture&#xff1a;邓澎波 一、构建Tomcat源码环境 工欲善其事必先利其器&#xff0c;为了学好Tomcat源码&#xff0c;我们需要先在本地构建一个Tomcat的运行环境。 1.源码环境下载 源码有两种下载方式&#xff1a; 1.1 官网下载 https://…...

【Python爬虫】爬取名人名言页面并进行简单的数据清洗(入门级)

目录 资源链接 一、网站选择 二、数据爬取要求 三、数据清洗要求 四、实现代码 1.数据采集 2.数据清洗 资源链接 下面有笔者所放的源码下载链接&#xff0c;读者可自行下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1YmTdlnbSJLvLrrx92zz6Qg 提取码&…...

Microsoft Visual C++ Redistributable 【安装包】【高速下载】

方法1、可以从官方下载&#xff0c;如下图 Visual C Redistributable for Visual Studio 2015 但是此链接只有一个版本 方法2 已经下载好并且已经整理好了2008--2022的所有版本点击下方链接即可高速下载 如果是win7-win8-win10-win11直接可以下载2015--2022版本&#xff0c…...

MFC绘制哆啦A梦

文章目录 OnPaint绘制代码完整Visual Studio工程下载其他卡通人物绘制 OnPaint绘制代码 CPaintDC dc(this); // 用于绘画的设备上下文CRect rc;GetWindowRect(rc);int cxClient rc.Width();int cyClient rc.Height();// 辅助线HPEN hPen CreatePen(PS_DOT, 1, RGB(192, 192,…...

网络编程(TCP协议,UDP协议)

目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据&#xff0c;并打印 2、客户端…...

读取Jar包下文件资源的问题及解决方案

问题 项目A代码调用到Resouces下的文件a.sh&#xff0c;打包成Jar包后&#xff0c;项目B调用对应方法时&#xff0c;出现报错&#xff0c;找不到a.sh文件路径&#xff0c;原来的代码可能是&#xff1a; URL resource getClass().getClassLoader().getResource("a.sh&qu…...

C++ 反转一个二进制串

描述 一个32位有符号整数&#xff0c;用二进制编码来表示。现需要将该二进制编码按位反转&#xff0c;计算出反转后的值。 示例1 输入&#xff1a; 1 返回值&#xff1a; -2147483648 说明&#xff1a; 00000000 00000000 00000000 00000001 翻转后为 10000000 000000…...

黑神话悟空-吉吉国王版本【抢先版】

在中国的游戏市场中&#xff0c;一款名为“黑神话悟空”的游戏引起了广泛的关注。这款游戏以中国传统的神话故事“西游记”为背景&#xff0c;创造了一个令人震撼的虚拟世界。今天&#xff0c;我们要来介绍的是这款游戏的一种特殊版本&#xff0c;那就是吉吉国王版本。 在吉吉国…...

【尚庭公寓SpringBoot + Vue 项目实战】预约看房与租约管理(完结)

【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理&#xff08;完结&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理&#xff08;完结&#xff09;1、业务说明2、接口开发2.1、预约看房管理2.1.1.保存或更新看房预约2.1.2. 查询个人预约…...

java拼图小游戏项目

创建一个Java拼图小游戏是一个有趣且富有教育意义的项目&#xff0c;可以锻炼你的编程技能。以下是开发一个基本拼图游戏可能需要考虑的几个步骤&#xff1a; 项目规划&#xff1a; 确定游戏的基本规则和玩法。设计游戏的界面和用户交互。 环境搭建&#xff1a; 确保你的开发环…...

[C++][数据结构][跳表]详细讲解

目录 0.什么是跳表&#xff1f;1.SkipList的优化思路2.SkipList的效率如何保证&#xff1f;3.SkipList实现4.SkipList VS 平衡搜索树 && Hash 0.什么是跳表&#xff1f; SkipList本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树…...

tinyxml

github下载相关的软件包&#xff0c;其中有四个文件需要主要需要关注就是分别是tinyxml12.cpp&#xff0c;tinyxml12.h&#xff0c;rss网页xml文件&#xff0c;还有就是官方给的test文件tinyxmltest.cpp。 example1就是提供一个打开文件的方式 int example_1() {XMLDocument …...

Docker(三)-Docker常用命令

1.run run命令执行流程:2.帮助启动类命令 2.1 启动docker systemctl start docker2.2 停止docker systemctl stop docker2.3 重启docker systemctl restart docker2.4查看docker状态 systemctl status docker2.5开机启动 systemctl enable docker2.6查看docker概要信息 …...

[MRCTF2020]PixelShooter

一个apk文件 jeb打开发现是apk文件 apk游戏逆向必须知道的知识: 一般关键数据在 Assets/bin/data/managed/assembly-csharp.dll这个文件里面 我不知道jeb为什么这里我没有 apk是个压缩包 直接解压 这个文件解压也可以发现flag {Unity_1S_Fun_233}...

vue实现的商品列表网页

一、商品列表效果如下 二、代码&#xff1b; vue实现的商品列表网页 &#xff0c; 图片在vue项目的Public文件夹里的 imgs中 <template><div class"common-layout"><!-- el-container:外层容器。 当子元素中包含 <el-header> 或 <el-foo…...

【泛微系统】e-cology非标配功能概览

关于泛微非标功能的功能编号、功能名称及支持版本 编号名称支持版本001考勤功能4.500.0124-9.00+KB900190206002短信通用接口5.000.0327+KB50001003 及以上版本004计划任务接口5.0+KB50001003及以上版本005集成登录接口6.0及以上版本006流程中自定义浏览框5.0+KB50001003及以上…...

Python基础教程(二十八):pip模块

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

通信系统概述

1.定义 通信系统&#xff08;也称为通信网络&#xff09;是利用各种通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来&#xff0c;依靠网络软件及通信协议实现资源共享和信息传递的系统。 2.概述 随着通信技术和网络技术的不断发展&#xff…...

http发展史(http0.9、http1.0、http1.1、http/2、http/3)详解

文章目录 HTTP/0.9HTTP/1.0HTTP/1.1队头阻塞&#xff08;Head-of-Line Blocking&#xff09;1. TCP 层的队头阻塞2. HTTP/1.1 的队头阻塞 HTTP/2HTTP/3 HTTP/0.9 发布时间&#xff1a;1991年 特点&#xff1a; 只支持 GET 方法没有 HTTP 头部响应中只有 HTML 内容&#xff0…...

Hadoop 面试题(四)

1. 简述Hadoop节点的动态上线下线的大概操作 &#xff1f; 在Hadoop集群中&#xff0c;节点的动态上下线指的是在不停止整个集群服务的情况下&#xff0c;添加或移除节点。这种能力对于维护和扩展集群非常重要。以下是Hadoop节点动态上线下线的大概操作步骤&#xff1a; 动态…...

绽放光彩的小程序 UI 风格

绽放光彩的小程序 UI 风格...

电脑文件夹怎么加密?文件夹加密的5种方法

在数字化时代&#xff0c;信息安全显得尤为重要。对于个人电脑用户来说&#xff0c;文件夹加密是一种有效保护隐私和数据安全的方法。本文将介绍五种文件夹加密的方法&#xff0c;帮助您更好地保护自己的重要文件。 如何设置文件夹密码方法一&#xff1a;利用Windows系统自带的…...

异步复位同步释放

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 题目描述&#xff1a; 请使用异步复位同步释放来将输入数据a存储到寄存器中&#xff0c;并画图说明异步复位同步释放的机制原理 信号示意图&#xff1a; clk为时钟 rst_n为低电平复位 d信号输入…...

JupyterLab使用指南(七):JupyterLab使用 LaTeX 生成数学公式

在 JupyterLab 中&#xff0c;可以使用 LaTeX 语法生成复杂的数学公式。JupyterLab 内置对 LaTeX 的支持&#xff0c;使得我们可以方便地在 notebook 中编写和展示数学公式。以下是详细的步骤和示例。 1. 使用 LaTeX 生成数学公式 LaTeX 是一种专门用于排版数学公式的语言。J…...