uni-app中web-view的使用

news2024/9/21 8:07:35

1. uni-app中web-view的使用

  uni-app中的web-view是一个 web 浏览器组件,可以用来承载网页的容器,uni-app开发的app与web-view实现交互的方式相关简单,应用通过属性@message绑定触发事件,然后在web-view的网页向应用 postMessage 触发并收到消息即可,详细请参考官网:web-view | uni-app官网 (https://uniapp.dcloud.net.cn/component/web-view.html#)主要实现代码参考下图所示。

1.1. uni-app中web-view的使用

1.1.1. app页面

<template>
	<web-view :src="url" @message="handleMessage"></web-view>
</template>

<script>
export default {
	data() {
		return {
			url: null  //要打开的外部链接
		};
	},
	methods: {
		//通过 @message 事件接收外部链接传过来的内容
		handleMessage(event) {
			if (event.detail.data[0].isClose) {
				uni.reLaunch({
					url: '/main/main'
				});
			}
		}
	}
};
</script>

1.1.2.外部链接H5

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>我是在app里打开的页面</title>
		<script src="./jquery-3.4.1.js" type="text/javascript" charset="utf-8"></script>
		<!-- 微信JS-SDK 兼容微信小程序 引入此文件 -->
		<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
		<!-- uni-app SDK -->
		<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
	</head>
	<body>
		<div style="width: 100%;height: 100%;position: absolute;left: 0;top: 0;right: 0;bottom: 0;">
			<button id="btn">按钮</button>
		</div>
	</body>
	<script>
		document.addEventListener('UniAppJSBridgeReady', function() {
			console.log("加载完成,可以使用uni相关接口");
		});

		$("#btn").click(function() {
			uni.postMessage({
				data: {
					isClose: true
				}
			})
			uni.navigateBack();
		})
	</script>
</html>

1.1.3.问题

  但是,以上方法只适合于APP,在H5环境中是不支持的,官方说明如下:
在这里插入图片描述
  那么,在uni-app如何实现在H5环境中与web-view中的网页交互通讯呢,按照官方的说法,使用window.postMessage方式实现!

1.2. window.postMessage

  关于window.postMessage的通讯原理,请参考官方档window.postMessage - Web API 接口参考 | MDN(https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage)

1.2.1. 应用端代码

onLoad: function() {
	window.addEventListener('message', function(e) { // 监听 message 事件
		console.log(e.origin);
		console.log("从" + e.origin + "收到消息: " + e.data);
	});
}

1.2.2. 网页端代码(H5)

//向uniapp发送信息
function sendMsgToUniapp(value) {
	parent.postMessage(value, "*");
}

  说明:uni-app的web-view,在H5环境中其实就是通过iframe来实现的,因此在iframe中的页面可直接通过jquery中的parent来获取父页面对象,并通过parent.postMessage的方式传递消息。

1.3. 完整代码

在这里插入图片描述

1.3.1. pageWeb.vue(uiapp)

<template>
    <view>
        <web-view @message="message"
                  :src="webViewUrl"></web-view>
    </view>
</template>

<script>
    import pageUtil from '../../../utils/pageUtil.js';

    export default {
        data() {
            return {
                webViewUrl: '/hybrid/html/html/pageUniWeb.html?data=您好',
                //webViewUrl: 'http://120.224.9.76:18080/app/news/html/pageUniWeb.html?data=efhejr',
                wv: ''
            }
        },
        onReady() {
            pageUtil.setTitleBar('业务协同')
        },
        onLoad() {
            var that = this;
            // #ifdef APP-PLUS
            //此对象相当于html5plus里的plus.webview.currentWebview()。
            // 在uni-app里vue页面直接使用plus.webview.currentWebview()无效
            let currentWebview = this.$scope.$getAppWebview()
            setTimeout(() => {
                this.wv = currentWebview.children()[0]
            }, 300)
            // #endif
            try {
                //信息交互(H5浏览器使用),监听 message 事件
                window.addEventListener('message',
                    function (e) {
                        console.log("从" + e.origin, "收到消息: ", e);
                        var resData = e.data.data.arg;
                        if (resData.myType) {
                            uni.showToast({
                                icon: 'none',
                                title: "uniap获取H5发送数据:" + JSON.stringify(resData)
                            });
                        }
                    });
            } catch (e) {

            }

        },
        methods: {
            //信息交互(app真机使用)
            message(e) {
                var that = this
                var resData = e.detail.data;
                console.log("uniap获取H5发送数据:", e)
                uni.showToast({
                    icon: 'none',
                    title: "uniap获取H5发送数据:" + JSON.stringify(resData)
                });
                var myObj = {}
                myObj.msg="我是uniapp"
                //这里必须序列化!!!
                myObj = JSON.stringify(myObj)
                this.wv.evalJS(`postJS(${myObj})`);

            },
        }
    }
</script>
<style>
</style>

1.3.2. pageUniWeb.html(H5)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>web-view</title>
    <script type="text/javascript" src="../static/js/init-rem.js"></script>
    <script type="text/javascript" src="../static/js/jquery-3.1.1.min.js"></script>
    <script type="text/javascript" src="../static/helper/init-helper.js"></script>
    <!--    <script src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"-->
    <!--            type="text/javascript" charset="utf-8"></script>-->
    <script type="text/javascript" src="../static/helper/web-view-custom.js"></script>
    <script type="text/javascript" src="../static/js/vconsole.min.js"></script>
    <script type="text/javascript">
        var vc = new VConsole()
    </script>
    <style>
        .btn-layout {
            display: flex;
            flex-direction: column;
            align-items: center;
        }

        .btn-item {
            display: inline;
            font-size: 0.32rem;
            color: white;
            text-align: center;
            padding: 0.2rem 0.5rem;
            border-radius: 0.3rem;
            margin-top: 0.5rem;
            background-color: #1AAD19;
        }
        .content {
            display: inline;
            font-size: 0.32rem;
            color: black;
            text-align: center;
            padding: 0.2rem 0.5rem;
            border-radius: 0.3rem;
            margin-top: 0.5rem;
        }
    </style>
</head>
<body>
<div class="btn-layout">
    <span id="h5ToUniappId" class="btn-item">H5发送数据到uniapp</span>
    <div id="contentId" class="content"></div>
    <div id="content2Id" class="content"></div>
</div>

</body>
<script type="text/javascript">
    var itemData = getParamByKey('data');
    console.log("获取uniapp链接传递数据:", itemData)
    $(function () {
        $('#contentId').html("获取uniapp链接传递数据:"+itemData)
    });
    /**
     * 获取uniapp传递数据方法一
     * 定义全局方法,接收来自应用的信息
     */
    // window.postJS = (msg) => {
    //     console.log('来自应用的消息', msg)
    // }
    /**
     * 获取uniapp传递数据方法二
     */
    function postJS(e) {
        console.log("获取uniapp传递数据:", e)
        $('#content2Id').html("获取uniapp传递数据:"+JSON.stringify(e))
    }
    document.addEventListener('UniAppJSBridgeReady',
        function () {
            webUni.webView.getEnv(function (res) {
                console.log('当前环境:' + JSON.stringify(res));
            });
            document.querySelector('#h5ToUniappId')
                .addEventListener('click', function (evt) {
                    // webUni.webView.navigateBack();
                    //向uniapp传值
                    //方法一
                    //window.parent.postMessage("", '*')
                    //parent.postMessage("sdcec", "*");
                    //方法二
                    webUni.postMessage({
                        data: {
                            action: 'message',
                            msg: '我是H5',
                            myType: 'typeH5',
                        }
                    });
                });
        });
</script>
</html>

1.3.3. web-view-custom.js

!function (e, n) {
    "object" == typeof exports && "undefined" != typeof module ? module.exports = n() : "function" == typeof define && define.amd ? define(n) : (e = e || self).webUni = n()
}(this, (function () {
    "use strict";
    try {
        var e = {};
        Object.defineProperty(e, "passive", {
            get: function () {
                !0
            }
        }), window.addEventListener("test-passive", null, e)
    } catch (e) {
    }
    var n = Object.prototype.hasOwnProperty;

    function t(e, t) {
        return n.call(e, t)
    }

    var i = [], a = function (e, n) {
            var t = {options: {timestamp: +new Date}, name: e, arg: n};
            if (window.__dcloud_weex_postMessage || window.__dcloud_weex_) {
                if ("postMessage" === e) {
                    var a = {data: [n]};
                    return window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessage(a) : window.__dcloud_weex_.postMessage(JSON.stringify(a))
                }
                var o = {type: "WEB_INVOKE_APPSERVICE", args: {data: t, webviewIds: i}};
                window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessageToService(o) : window.__dcloud_weex_.postMessageToService(JSON.stringify(o))
            }
            if (!window.plus) return window.parent.postMessage({type: "WEB_INVOKE_APPSERVICE", data: t, pageId: ""}, "*");
            if (0 === i.length) {
                var r = plus.webview.currentWebview();
                if (!r) throw new Error("plus.webview.currentWebview() is undefined");
                var d = r.parent(), s = "";
                s = d ? d.id : r.id, i.push(s)
            }
            if (plus.webview.getWebviewById("__uniapp__service")) plus.webview.postMessageToUniNView({
                type: "WEB_INVOKE_APPSERVICE",
                args: {data: t, webviewIds: i}
            }, "__uniapp__service"); else {
                var w = JSON.stringify(t);
                plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE", '",').concat(w, ",").concat(JSON.stringify(i), ");"))
            }
        }, o = {
            navigateTo: function () {
                var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, n = e.url;
                a("navigateTo", {url: encodeURI(n)})
            }, navigateBack: function () {
                var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, n = e.delta;
                a("navigateBack", {delta: parseInt(n) || 1})
            }, switchTab: function () {
                var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, n = e.url;
                a("switchTab", {url: encodeURI(n)})
            }, reLaunch: function () {
                var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, n = e.url;
                a("reLaunch", {url: encodeURI(n)})
            }, redirectTo: function () {
                var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, n = e.url;
                a("redirectTo", {url: encodeURI(n)})
            }, getEnv: function (e) {
                window.plus ? e({plus: !0}) : e({h5: !0})
            }, postMessage: function () {
                var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
                a("postMessage", e.data || {})
            }
        }, r = /uni-app/i.test(navigator.userAgent), d = /Html5Plus/i.test(navigator.userAgent),
        s = /complete|loaded|interactive/;
    var w = window.my && navigator.userAgent.indexOf("AlipayClient") > -1;
    var u = window.swan && window.swan.webView && /swan/i.test(navigator.userAgent);
    var c = window.qq && window.qq.miniProgram && /QQ/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent);
    var g = window.tt && window.tt.miniProgram && /toutiaomicroapp/i.test(navigator.userAgent);
    var v = window.wx && window.wx.miniProgram && /micromessenger/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent);
    var p = window.qa && /quickapp/i.test(navigator.userAgent);
    for (var l, _ = function () {
        window.UniAppJSBridge = !0, document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady", {
            bubbles: !0,
            cancelable: !0
        }))
    }, f = [function (e) {
        if (r || d) return window.__dcloud_weex_postMessage || window.__dcloud_weex_ ? document.addEventListener("DOMContentLoaded", e) : window.plus && s.test(document.readyState) ? setTimeout(e, 0) : document.addEventListener("plusready", e), o
    }, function (e) {
        if (v) return window.WeixinJSBridge && window.WeixinJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("WeixinJSBridgeReady", e), window.wx.miniProgram
    }, function (e) {
        if (c) return window.QQJSBridge && window.QQJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("QQJSBridgeReady", e), window.qq.miniProgram
    }, function (e) {
        if (w) {
            document.addEventListener("DOMContentLoaded", e);
            var n = window.my;
            return {
                navigateTo: n.navigateTo,
                navigateBack: n.navigateBack,
                switchTab: n.switchTab,
                reLaunch: n.reLaunch,
                redirectTo: n.redirectTo,
                postMessage: n.postMessage,
                getEnv: n.getEnv
            }
        }
    }, function (e) {
        if (u) return document.addEventListener("DOMContentLoaded", e), window.swan.webView
    }, function (e) {
        if (g) return document.addEventListener("DOMContentLoaded", e), window.tt.miniProgram
    }, function (e) {
        if (p) {
            window.QaJSBridge && window.QaJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("QaJSBridgeReady", e);
            var n = window.qa;
            return {
                navigateTo: n.navigateTo,
                navigateBack: n.navigateBack,
                switchTab: n.switchTab,
                reLaunch: n.reLaunch,
                redirectTo: n.redirectTo,
                postMessage: n.postMessage,
                getEnv: n.getEnv
            }
        }
    }, function (e) {
        return document.addEventListener("DOMContentLoaded", e), o
    }], m = 0; m < f.length && !(l = f[m](_)); m++) ;
    l || (l = {});
    var E = "undefined" != typeof webUni ? webUni : {};
    if (!E.navigateTo) for (var b in l) t(l, b) && (E[b] = l[b]);
    return E.webView = l, E
}));

1.3.4. init-helper.js

var u = navigator.userAgent;
// 是否为ios设备
var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
// 是否为PC端
var isPC = typeof window.orientation === 'undefined';
// 是否为android端
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1;
// 是否为微信端,此处不能为===,因为match的结果可能是null或数组
var isWx = u.toLowerCase().match(/MicroMessenger/i) == 'micromessenger';
var strConstant = {
    /**
     * 业务协同
     */
    //待办
    eventWaitDeal: '我的待办',
    //已办
    eventHasDeal: '我的已办',
    //考勤打卡
    workCheckSign: '考勤打卡',
    //添加
    pageTypeAdd: 'add',
    //编辑
    pageTypeEdit: 'edit',
    /**
     * 跳转类型
     */
    jumpTypeMapLoc: 'jumpTypeMapLoc',
}

/**
 * @desc 返回上一页
 */
function backPage() {
    //单击Android左上角返回键执行该方法
    history.pushState(null, null, location.href);
    window.addEventListener('popstate',
        function (event) {
            if (isAndroid) {
                if (window.androidJsHook) {
                    history.pushState(null, null, location.href);
                    window.androidJsHook.htmlFinish();
                } else {
                    history.go(-1)
                }
            } else if (isiOS) {
                if (window.webkit) {
                    history.pushState(null, null, location.href);
                    window.webkit.postMessage(null);
                } else {
                    history.go(-1)
                }
            } else {
                history.go(-1)
            }
        });
};

/**
 * 跳换页面
 */
function openPage(webUrl, webTitle, webParams) {
    if (window.androidJsHook) {
        window.androidJsHook
            .startForResult(webUrl, webTitle, webParams);
    } else {
        mui.openWindow({
            url: webUrl + webParams,
            id: webUrl,
            styles: {
                top: '0px',
                bottom: '0px'
            },
            waiting: {
                autoShow: false, //自动显示等待框,默认为true
            }
        });
    }
}

/**
 * @description 通过传入key值,得到页面key的初始化传值
 * plus情况为plus.webview.currentWebview.***
 * h5情况为 window.location.href 中的参数的值
 * @param {String} key
 */
function getParamByKey(key) {
    if (!key) {
        return null;
    }
    return GetQueryString(key) || getExtraDataByKey(key);
};

function GetQueryString(name) {
    //  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    //  var r = window.location.search.substr(1).match(reg);
    //  if (r != null) return unescape(r[2]); return null;
    /*中文不乱码*/
    return decodeURIComponent((new RegExp('[?|&]' + name
        + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [, ""])[1]
        .replace(/\+/g, '%20')) || null;
}

/**
 * @description 通过传入key值,得到页面key的初始化传值
 * plus情况为plus.webview.currentWebview.***
 * h5情况为 window.location.href 中的参数的值
 * @param {String} key
 */
function getExtraDataByKey(key) {
    if (!key) {
        return null;
    }
    var value = null;
    //h5
    value = getUrlParamsValue(window.location.href, key);
    if (value === 'undefined') {
        value = null;
    }
    return value;
};

/**
 * 删掉遮罩
 */
function removeDrop() {
    $('.mui-popup-backdrop').remove();
}

/**
 * 合并json对象
 * @param {Object} target 第一个json对象,同时也是合并后的json对象
 * @param {Object} source 第二个json对象
 */
function extend(target, source) {
    for (var obj in source) {
        target[obj] = source[obj];
    }
    return target;
}

/**
 * 转为json数据格式
 * @param {Object} idStr form表单的id
 */
function transformToJson(idStr) {
    var formData = $("#" + idStr).serializeArray();
    var obj = {};
    var j = 1;
    for (var i in formData) {
        obj[formData[i].name] = formData[i]['value'];
        //伪数组length字段,用于遍历改造json对象
        obj['length'] = j;
        j++
    }
    return obj;
}

/**
 * 通用方法封装处理
 * commonUtils.isEmpty(jsonParam.countyLabel
 */
var commonUtils = {
    // 判断字符串是否为空
    isEmpty: function (value) {
        if (value == null || this.trim(value) == "" || value == undefined) {
            return true;
        }
        return false;
    },
    // 判断一个字符串是否为非空串
    isNotEmpty: function (value) {
        return !commonUtils.isEmpty(value);
    },
    // 空格截取
    trim: function (value) {
        if (value == null) {
            return "";
        }
        return value.toString().replace(/(^\s*)|(\s*$)|\r|\n/g, "");
    },
    // 判断字符串是否是以start开头
    startWith: function (value, start) {
        var reg = new RegExp("^" + start);
        return reg.test(value)
    }
};

/**
 * 重置form表单
 */
function resetForm(resetArr) {
    var textInputArr = $("input[type='text']")
    var numberInput = $("input[type='number']")
    var domId = null
    for (var i = 0; i < textInputArr.length; i++) {
        domId = $(textInputArr[i]).attr('id')
        var isContain = false
        resetArr.forEach(function (item, index) {
            if (domId == item) {
                isContain = true
            }
        })
        if (!isContain) {
            $(textInputArr[i]).val("")
        }
    }
    for (var i = 0; i < numberInput.length; i++) {
        domId = $(numberInput[i]).attr('id')
        var isContain = false
        resetArr.forEach(function (item, index) {
            if (domId == item) {
                isContain = true
            }
        })
        if (!isContain) {
            $(numberInput[i]).val("")
        }
    }
}

/**
 * 更新三级联动字典
 * @param {Object} name
 * @param {Object} nameMS
 * @author zzs
 */
function updateDictLevel3(name, nameMsArr, urlStr) {
    var queryParam = {};
    if (isNotNull(name)) {
        queryParam.name = name;
    }
    getNetData(urlStr, queryParam, function (result) {
        if (result.code == '200') {
            var nameA = [];
            if (result.data && result.data.length == 0) {
                nameA = [{
                    "id": "",
                    "value": "请选择"
                }];
            } else {
                $.each(result.data, function (i, item) {
                    var flag = {};
                    flag.id = item.value;
                    flag.value = item.label;
                    //二级
                    var childsA = [];
                    if (item.children && item.children.length > 0) {
                        $.each(item.children, function (j, childsItem) {
                            var childsFlag = {};
                            childsFlag.id = childsItem.value;
                            childsFlag.value = childsItem.label;
                            //三级
                            var childsB = [];
                            if (childsItem.children && childsItem.children.length > 0) {
                                $.each(childsItem.children, function (k, grandsonItem) {
                                    var grandsonFlag = {};
                                    grandsonFlag.id = grandsonItem.value;
                                    grandsonFlag.value = grandsonItem.label;
                                    childsB.push(grandsonFlag);
                                });
                            }
                            childsFlag.childs = childsB;
                            childsA.push(childsFlag);
                        });
                    }
                    flag.childs = childsA;
                    nameA.push(flag);
                });
            }
            if (nameMsArr != null && nameMsArr.length > 0) {
                nameMsArr.forEach(function (nameMs, index) {
                    nameMs.updateWheels(nameA);
                })
            }
        }
    })
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1546098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博途PLC 系统时间读取写入功能块

系统时间数据类型属于DTL数据类型,DTL本身是结构变量,有时、分、秒、纳秒。利用纳秒寄存器可以实现伪随机数发生器,伪随机数发生器详细代码介绍请参考下面文章链接: 1、伪随机数 https://rxxw-control.blog.csdn.net/article/details/122157365https://rxxw-control.blog…

电脑桌面记事本便签软件,记事本软件哪个好

在这个快节奏的生活中&#xff0c;我们每个人都需要一个得力的助手来帮助我们管理琐碎的事务。作为一名忙碌的职场人士&#xff0c;你是否经常因为忘记重要事项而感到焦虑&#xff1f;是否因为繁杂的待办事项而感到无从下手&#xff1f;今天&#xff0c;我要向你推荐的这款电脑…

Git相关命令(一)

一、简介 Git 是一个开源的分布式版本控制系统。 当然&#xff0c; git 不会傻傻的把你的每一个版本完整的存储下来&#xff0c;他仅仅会存储每次修改的位置和内容&#xff08;可持久化&#xff09;&#xff0c;每一次 commit 可以理解为产生一个版本&#xff0c;接下来的版本…

第二十章 javascript使用

文章目录 1. JS基中基1. 注释2. 弹窗3. 引入JS代码4. JS的基本数据类型5. 变量6. 字符串的操作 2. 条件分支3. 循环4. JS中的函数1. 闭包函数(自运行函数) 5. 定时器 1. JS基中基 1. 注释 HTML的注释 <!– –>JS的注释 // 单行注释 /* */多行注释 2. 弹窗 alert(“我…

C语言例4-18:从键盘输入平面上一个点的坐标值,判断其所在的象限。

代码如下&#xff1a; //从键盘输入平面上一个点的坐标值&#xff0c;判断其所在的象限。 #include<stdio.h> int main(void) {float x,y;printf("输入平面上一个点的坐标值\n");printf("x");scanf("%f",&x); //从键盘输入平面上一个…

使用npm i进行admin依赖安装的时候出现问题

提示&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/string-width failed, reason: certificate has expired 切换淘宝源到http或者更换其他国内镜像 npm config set registry http:/…

第十三届蓝桥杯省赛真题 Java 研究生 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 排列字母试题 B: 灭鼠先锋试题 C: 质因数个数试题 D: 数位排序试题 E: 蜂巢试题 F : \mathrm{F}: F: 爬树的甲壳虫试题 G: 重新排序试题 H \mathrm{H} H : 技能升级试题 I: 最优清零方案试题 J : \mathrm{J}: J: 推导部分和 发现宝藏 …

赵本山:这眼睛不好他也嫉妒,潘长江:上看台是好事不过我这腿上不去!

赵本山&#xff1a;这眼睛不好他也嫉妒&#xff0c;潘长江&#xff1a;上看台是好事不过我这腿上不去&#xff01; ——小品《大观灯》&#xff08;中4&#xff09;的台词 &#xff08;接上&#xff09; 赵本山&#xff08;瞎子&#xff09;&#xff1a;你说这咋又挪这来了你说…

Linux课程____shell脚本应用

一、认识shell 常用解释器 Bash , ksh , csh 登陆后默认使用shell&#xff0c;一般为/bin/bash&#xff0c;不同的指令&#xff0c;运行的环境也不同 二、 编写简单脚本并使用 # vim /frist.sh //编写脚本文件&#xff0c;简单内容 #&#xff01;/bin/bash …

日常刷题之77-组合

题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案 提示&#xff1a;假设 n5,k3 就是需要组合出来&#xff0c;长度3且内容数据是在[1,n]这个区间内的所有可能得组合 同时一个组合里面内个数字只能出现一次&#…

买卖股票的最佳时机1,2,3

买卖股票的最佳时机 力扣题目链接 dp[i][0] 表示第i天持有股票所得最多现金 定义二维数组 两列 &#xff1a;0代表持有股票 1代表不持有股票 行代表第几天 dp[i][0] max(dp[i - 1][0], -prices[i]); 第i天持有股票&#xff1a;两种情况 第一种是昨天就已经持有股票了 所…

电脑桌面记事本便签软件,好用的桌面记事本

在快节奏的生活中&#xff0c;我们常常需要记录一些重要事项&#xff0c;以便随时查看和提醒自己。然而&#xff0c;传统的便签容易丢失、难以管理&#xff0c;让我们感到困扰。在这种情况下&#xff0c;一款好用的电脑桌面便签软件就显得尤为重要。今天&#xff0c;小编为大家…

BIOS中英文对照表

Main菜单&#xff1a;这里记录着电脑的主要信息&#xff0c;比如时间和日期&#xff0c;软盘现在已经不再使用&#xff0c;下面的驱动器中会记录电脑连接的硬盘信息&#xff0c;扩展内存就是电脑的物理内存大小&#xff0c;1024KB1MB&#xff0c;1024MB1GB。 Advanced高级设置&…

【PCL】mac下安装PCL的安装与配置

【PCL】mac下安装PCL的安装与配置 PCL PCL官方文档 PCL&#xff08;Point Cloud Library&#xff09;是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C编程库&#xff0c;它实现了大量点云相关的通用算法和高效数据结构&#xff0c;涉及到点云获取、滤波、分割、配…

git-怎样把连续的多个commit合并成一个?

Git怎样把连续的多个commit合并成一个&#xff1f; Git怎样把连续的多个commit合并成一个&#xff1f; 参考URL: https://www.jianshu.com/p/5b4054b5b29e 查看git日志 git log --graph比如下图的commit 历史&#xff0c;想要把bai “Second change” 和 “Third change” 这…

Android 系统应用 pk8签名文件转jks或keystore教程

一、介绍 签名文件对于我们在做应用开发中&#xff0c;经常遇到&#xff0c;且签名文件不仅仅是保护应用安全&#xff0c;还会涉及到应用与底层之间的数据共享和API文件等问题。 在Android中&#xff0c;签名文件同样也存在这个问题。但是android中又区分系统应用和普通应用。系…

关于hook ntdll 代码详解

UNHOOK ntdll DWORD unhook() {//创建该结构体用于获取该dll的信息 将所有成员变量初始化为零MODULEINFO mi {};//获取当前内存的ntdll的句柄HMODULE ntdllModule GetModuleHandleA("ntdll.dll");//HANDLE(-1)表示获取当前进程的句柄 该函数用于获取该进程的信息G…

大数据开发扩展shell--尚硅谷shell笔记

大数据开发扩展shell 学习目标 1 熟悉shell脚本的原理和使用 2 熟悉shell的编程语法 第一节 Shell概述 1&#xff09;Linux提供的Shell解析器有&#xff1a; 查看系统中可用的 shell [atguiguhadoop101 ~]$ cat /etc/shells /bin/sh/bin/bash/sbin/nologin/bin/dash/bin/t…

约数个数(数论,蓝桥杯)

题目描述&#xff1a; 给定一个数n&#xff0c;再给出n个数&#xff0c;现在要求你求出这些数的乘积的约数个数总和&#xff0c;结果对1e97取模。 取值范围&#xff1a;1<n<100; 1<ni<2e9; 分析步骤&#xff1a; 第一&#xff1a;要求约数的个数&#xff0c;我们有…

Web举例:防火墙二层,上下行连接交换机的主备备份组网

Web举例&#xff1a;防火墙二层&#xff0c;上下行连接交换机的主备备份组网 介绍了业务接口工作在二层&#xff0c;上下行连接交换机的主备备份组网的Web举例。 组网需求 如图1所示&#xff0c;两台FW的业务接口都工作在二层&#xff0c;上下行分别连接交换机。FW的上下行业…