react 网页/app复制分享链接到剪切板,分享到国外各大社交平台,通过WhatsApp方式分享以及SMS短信方式分享链接内容

news2024/11/17 8:34:57

1.需求 

最近在做一个国际网站app,需要把app中某个页面的图文链接分享到国外各大社交平台上(facebook,whatapp,telegram,twitter等),以及通过WhatApp聊天方式分享,和SMS短信方式分享链接内容,该怎么做呢?图示如下:

分享到国外各大社交平台: 

操作说明:

        当点击COPY URL时,复制分享链接到剪切板,然后点击各个分享平台图标,调用分享apk或者方法,从而调起社交平台app或者对应的web网页 ,进行分享操作

通过WhatApp方式,SMS方式分享: 

 操作说明:

        1.WhatsAPP分享:

                程序生成随机电话号码,默认选中第一个电话号码,点击WhatsAPP后,调取WhatApp相关方法接口,进行分享操作,然后电话号码变灰,当再次点击WhatsAPP时,触发下一个电话号码操作,图示如下:

        2.SMS方式分享

                点击SMS按钮时,触发SMS接口请求,调用SMS相关url进行分享操作

2.实现分享到国外各大社交平台

先上代码,通过点击 COPY URL 复制分享链接到剪切板,然后点击各个平台图标,实现分享操作

COPY URL,点击平台图标相关代码: 

import React, {useState} from "react";
import axios from "axios";
import Scroll from "../../components/Scroll";
import {CountDown, Steps, Tabs, Toast, Popup, Cell, Dialog, Swiper, NoticeBar, Image} from "react-vant";
import {CopyToClipboard} from "react-copy-to-clipboard";
 
const Index = () => {
        
    //分享url:拼接要分享的页面url,以及带上参数
    //注意:这里参数有的分享平台不支持?格式,可以使用简化格式,eg:http:www.test.com/target_page/100/param
   const GetUrl = (tagId) => {
          return `${window.location.origin}/target_page?param=${tagId}`;
   };
    
    //各个分享平台对应的url
    const GetWhatsAppUrl = (tagId) => {
      //也可以用这个`https://api.whatsapp.com/send?text=` + encodeURIComponent("test") + encodeURIComponent("\n\n" + GetInviteWheelUrl(tagId));
      return encodeURI(
      `whatsapp://send?text=test\n${GetUrl(tagId)}`
  );
};

    const GetTelegramUrl = (tagId, text) => {
      return encodeURI(
      "https://t.me/share/url?url=" + encodeURIComponent(GetInviteWheelUrl(tagId)) + "&text=" + encodeURIComponent(text)
      );
    };

    const GetTwitterUrl = (tagId, text) => {
      return encodeURI(
      "https://twitter.com/intent/tweet?text=" + encodeURIComponent(text) + "&url=" + encodeURIComponent(GetInviteWheelUrl(tagId))
      );
    };

    const GetFacebookUrl = (tagId, text) => {
      return "https://www.facebook.com/sharer/sharer.php?u=" + encodeURIComponent(GetUrl(tagId)) + "&t=" + encodeURIComponent(text)
    };


    //分享到社交软件
    const shareFriend = (type) => {
        let shareText = "分享说明" ;
        switch (type) {
            case "facebook":
                if (window.document) {
                    if (window.document.getElementById("og_url")) {
                        window.document.getElementById("og_url").content=GetUrl(rid);
                    }
                    if (window.document.getElementById("og_description")) {
                        window.document.getElementById("og_description").content=shareText;
                    }
                    if (window.document.getElementById("og_title")) {
                        window.document.getElementById("og_title").content=shareText;
                    }
                    if (window.document.getElementById("og_image")) {
                        window.document.getElementById("og_image").content=window.location.origin + "../images/banner_x2.png";
                    }
                }

                window.location.href = GetFacebookUrl(tagId, shareText);
                return;
            case "whatApp":
                if (window.document) {
                    if (window.document.getElementById("og_url")) {
                        window.document.getElementById("og_url").content=GetUrl(tagId);
                    }
                    if (window.document.getElementById("og_description")) {
                        window.document.getElementById("og_description").content=shareText;
                    }
                    if (window.document.getElementById("og_title")) {
                        window.document.getElementById("og_title").content=shareText;
                    }
                    if (window.document.getElementById("og_image")) {
                        window.document.getElementById("og_image").content=window.location.origin + "../images/banner_x2.png";
                    }
                }

                window.location.href = GetWhatsAppUrl(tagId, shareText);
                return;
            case "telegram":
                window.location.href = GetTelegramUrl(tagId, shareText);
                return;
            case "twitter":
                if (window.document) {
                    if (window.document.getElementById("tw_description")) {
                        window.document.getElementById("tw_description").content=shareText;
                    }
                    if (window.document.getElementById("tw_title")) {
                        window.document.getElementById("tw_title").content=shareText;
                    }
                    if (window.document.getElementById("tw_card")) {
                        window.document.getElementById("tw_card").content=window.location.origin + "../images/banner_x2.png";
                    }
                    if (window.document.getElementById("tw_card")) {
                        window.document.getElementById("tw_card").content=window.location.origin + "../images/banner_x2.png";
                    }
                    if (window.document.getElementById("tw_image")) {
                        window.document.getElementById("tw_image").content=window.location.origin + "../images/banner_x2.png";
                    }
                    if (window.document.getElementById("tw_url")) {
                        window.document.getElementById("tw_url").content=GetUrl(rid);
                    }
                }

                window.location.href = GetTwitterUrl(tagId, shareText);
                return;
        }
    }

 return (
        <div class={style.main}>
                 <ul class={style.share_1_link}>
                            <li class={style.share_1_link_intro} onClick={() => shareFriend("facebook")}>
                                <div class={style.share_1_link_img}>
                                    <a href="javascript:;"  rel="noreferrer">
                                        <img src={"../images/share3.svg"} />
                                    </a>
                                </div>
                                <div class={style.share_1_link_text}>
                                    Facebook
                                </div>
                            </li>
                            <li class={style.share_1_link_intro}  onClick={() => shareFriend("whatApp")}>
                                <div class={style.share_1_link_img}>
                                    <a href="javascript:;" rel="noreferrer">
                                        <img src={"../images/share2.svg"} />
                                    </a>
                                </div>
                                <div class={style.bottom_share_1_link_text}>
                                    WhatApp
                                </div>
                            </li>
                            <li class={style.share_1_link_intro}  onClick={() => shareFriend("telegram")}>
                                <div class={style.share_1_link_img}>
                                    <a href="javascript:;" rel="noreferrer">
                                        <img src={"../images/share3.png"} />
                                    </a>
                                </div>
                                <div class={style.share_1_link_text}>
                                    Telegram
                                </div>
                            </li>
                            <li class={style.share_1_link_intro}  onClick={() => shareFriend("twitter")}>
                                <div class={style.share_1_link_img}>
                                    <a href="javascript:;"  rel="noreferrer">
                                        <img src={"../images/share4.svg"}/>
                                    </a>
                                </div>
                                <div class={style.share_1_link_text}>
                                    Twitter
                                </div>
                            </li>
                            <li class={style.share_1_link_intro}>
                                <div class={style.share_1_link_img}>
                                    <a href={"mailto:test@test.com?body" + GetUrl(tagId)} rel="noreferrer">
                                        <img src={"../images/share5.svg"}/>
                                    </a>
                                </div>
                                <div class={style.share_1_link_text}>
                                    Email
                                </div>
                            </li>
                        </ul>
        </div>

<div class={style.copy_url_area}>
                            <div class={style.copy_url_input}>
                            <span id="share_url">
                                {GetUrl(tagId)}
                            </span>
                            </div>
                            <CopyToClipboard
                                text={GetUrl(tagId)}
                                onCopy={() => {
                                    Toast.success({
                                        message: "Copy Successfully",
                                    });
                                }}
                            >
                                <div class={style.action_btn} style={{ flexShrink: 0 }}>
                                    COPY URL
                                </div>
                            </CopyToClipboard>
                        </div>
    )
}
 
export default Index;

对上面代码的说明:

        当点击CPOY URL 按钮时,调用react-copy-to-clipboard组件复制分享链接到剪切板,点击平台分享图片时,调用shareFriend()方法,进行分享配置操作,获取分享的url,以及调用各个平台分享的api,然后配置head中分享的meta(如下代码,为什么需要配置meta,因为国外很多平台在分享图文链接时,是通过爬虫来抓取meta数据进行分享数据展示的),操作后,app会调起对应平台的app或者打开对应的web页面进行分享操作

html代码:

<head>
<meta id="og_url" property="og:url" content="" />
    <!-- facebook,whatApp分享-->
	<meta id="og_description"  property="og:description" content="" />
	<meta id="og_image"  property="og:image" content="" />
	<meta id="og_title"  property="og:title" content="" />
    
    <!-- twitter分享-->
	<meta  id="tw_card"  name="twitter:card" content="">
	<meta  id="tw_title" name="twitter:title" content="">
	<meta  id="tw_description" name="twitter:description" content="">
	<meta  id="tw_image" name="twitter:image" content="">
	<meta id="tw_url" property="twitter:url" content="" />
</head>

 对上面代码说明:

        meta中的数据,就是各个平台爬虫要抓取的分享数据,根据不同平台,meta的name不一样,具体情况可看各个平台官方文档

3.实现通过WhatsAPP以及SMS分享操作

  • 程序生成随机电话号码,默认选中第一个电话号码,点击WhatsAPP后,调取WhatApp相关方法接口,进行分享操作,然后电话号码变灰,当再次点击WhatsAPP时,触发下一个电话号码操作
  • 点击SMS按钮时,触发SMS接口请求,调用SMS相关url进行分享操作

代码如下: 

import React, {useState} from "react";
import axios from "axios";
import Scroll from "../../components/Scroll";
import {CountDown, Steps, Tabs, Toast, Popup, Cell, Dialog, Swiper, NoticeBar, Image} from "react-vant";
import {CopyToClipboard} from "react-copy-to-clipboard";
 
const SinNumberGenerator = (x, offset) => {
  return (Math.sin(x + offset) + 1) / 2;
};

//生成随机的分享电话号码:count 电话号码个数
const SharePhoneList = (count) => {
    let list = [];
    for (let i = 0; i < count; i++) {
        let phone = (
            SinNumberGenerator(((NowTimestamp / 100000) % 100000) / 50000 / Math.PI, i) * (99999 - 1000) +
            1000
        ).toFixed(0);
        if (phone.length < 5) {
            phone = "0" + phone;
        }
        list.push({
            phone: phone, //电话号码
            state: Math.floor(Math.random()*2),  //发送状态
        });
    }

    return list;
};

const Index = () => {
    
    //分享电话号码初始化
    const [sharePhoneList, setSharePhoneList] = useState([]);
    //当前选中电话号码索引
    const [checkedPhoneIndex, setCheckedPhoneIndex] = useState(0);
    //设置电话号码列表
    setSharePhoneList(SharePhoneList(20));
    setCheckedPhoneIndex(0);

    //分享url:拼接要分享的页面url,以及带上参数
    //注意:这里参数有的分享平台不支持?格式,可以使用简化格式,eg:http:www.test.com/target_page/100/param
   const GetUrl = (tagId) => {
          return `${window.location.origin}/target_page?param=${tagId}`;
   };
    
   const GetSeedWhatsAppUrl = (phone, tagId, text) => {
  return `https://api.whatsapp.com/send?phone=${phone}&text=` + encodeURIComponent(text) + encodeURIComponent("\n\n" + GetUrl(tagId));
};

  const GetSmsUrl = (phone, tagId, text) => {
  return "sms:/open?addresses=" + phone + "&body=" + encodeURIComponent(text + GetUrl(tagId));
};


  //发送whatsApp,sms
  const SendMessage = (type= "whatsApp") => {
        if (checkedPhoneIndex >= 20) {
            return;
        }

        let phoneList = [];
        let checkedPhone = "";
        sharePhoneList.map((value, index) => {  //设置发送的号码状态
            if (index === checkedPhoneIndex) {  //如果当前电话号码索引和遍历的索引相同,则设置电话号码状态为已完成
                phoneList.push({
                    phone:value.phone,
                    state: 1,
                });
                checkedPhone = value.phone;
            } else {
                phoneList.push({
                    phone:value.phone,
                    state: value.state,
                });
            }
        });


        setCheckedPhoneIndex(checkedPhoneIndex + 1);
        //更新电话号码列表状态
        setSharePhoneList(phoneList); 
       

        let link = GetSeedWhatsAppUrl(checkedPhone, tarId);
        //发送短信
        if (type === "sms") {
            link = GetSmsUrl(checkedPhone, tarId);
        }
        window.location.href = link;
    }

 return (
        <div class={style.main}>
                 <div class={style.bottom_share}>
                        <div class={style.bottom_share_title}>
                            Share 
                        </div>
                        <div class={style.bottom_share_phones}>
                            {sharePhoneList.map((value, index) => (
                                    <div class={`${style.bottom_share_phone_info} ${(value.state ? style.bottom_share_phone_ok : "")}`} id={value.state}>
                                            {value.phone}
                                    </div>
                            ))}
                        </div>
                        <div class={style.phone_send}>
                            <div class={style.phone_send_info} onClick={() => SendMessage()}>
                                <div class={style.phone_send_text}>
                                    <div class={style.phone_send_text1}>
                                        Send message
                                    </div>
                                    <div class={style.phone_send_text2}>
                                        <span>on </span>
                                        <span class={style.phone_send_text2_font}>WhatsAPP</span>
                                    </div>
                                </div>
                                <div class={style.phone_send_img}>
                                    <img src={"../images/whatsApp.png"} style={{width: "80%"}}/>
                                </div>
                            </div>
                            <div class={style.phone_send_info} onClick={() => SendMessage("sms")}>
                                <div class={style.phone_send_img}>
                                    <img src={"../images/sms.png"} style={{width: "80%"}}/>
                                </div>
                                <div class={style.phone_send_text} style={{marginLeft: "-1rem"}}>
                                    <div class={style.phone_send_text1}>
                                        Send message
                                    </div>
                                    <div class={style.phone_send_text2}>
                                        <span class={style.phone_send_text2_font}>SMS</span>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
        </div>
    )
}
 
export default Index;

css: 

.bottom_share {
  width: 100%;
  margin-top: 1.3rem;
}
.bottom_share_title {
  font-size: 0.9rem;
}

.bottom_share_phones {
  background-color: rgba(0, 0, 0);
  color: #e6e3e3;
  display: -ms-flexbox;
  display: flex;
  width: 96%;
  font-size: 0.9rem;
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
  -ms-flex-align: center;
  align-items: center;
  -ms-flex-pack: distribute;
  -ms-flex-direction: row;
  margin-top: 0.7rem;
  padding-top: 0.5rem;
  justify-content: flex-start;
  flex-direction: row;
}

.bottom_share_phone_info {
  margin: 0.2rem 1.1rem;
}

.bottom_share_phone_ok {
  color: #555353;
}

.phone_send {
  width: 92%;
  background-color: rgba(0,0,0);
  display: flex;
  margin-bottom: 1rem;
  padding-left: 0.5rem;
  padding-right: 0.5rem;
}

.phone_send_info {
  margin: 0.6rem 0.2rem 1rem 0.2rem;
  display: flex;
  background-color:  #e6e3e3;
  flex-direction: row;
  align-items: center;
  justify-content: space-around;
  padding-top: 0.35rem;
  padding-bottom: 0.35rem;
}

.phone_send_text {
  display: flex;
  color: #191717;
  font-weight: 500;
  font-size: 0.9rem;
  flex-direction: column;
  justify-content: center;
}

.phone_send_text2_font {
  font-weight: 900;
}

.phone_send_img {
  width: 30%;
}

 好了,网页/app复制分享链接到剪切板,分享到国外各大社交平台,通过WhatsApp方式分享以及SMS短信方式分享链接内容操作基本完成

4.拓展知识

(1).Facebook

        Facebook的分享原理: 告诉Facebook你想要分享的url,Facebook爬虫机器人会主动向这个url发起爬虫操作,对这个url进行html解析,分别拿到相对于的html元素图谱,然后获取图谱中的内容并跳转到Facebook的分享页面并把获取到的内容渲染出来,后面只要点击提交分享的按钮就可以实现分享网页的功能了;对于国外第三方的分享元素图谱,一般是写在html的head部分,官方文档:https://developers.facebook.com/docs/sharing/webmasters/images/

Facebook所对应的如下面所示:

<html>
<head>
<meta property="og:type" content="website" />
<meta property="og:url" content="要分享的链接" />
<meta property="og:title" content="标题" />
<meta property="og:description" content="简介" />
<meta property="og:image" content="图片" />
</head>
</html>

分享网页固定内容到Facebook

  • 使用浏览器自带分享功能 (只能分享到Facebook动态)
  • 使用js进行Facebook分享 (可分享到Facebook动态和好友)
const url = "http://www.test.cn"
const text = "share text"
widnow.open("http:/www.facebook.com/share.php?u="+ encodeURIComponent(u) + "&t="+ encodeURIComponent(t), "sharer","toolbar=0,status=0,width=626,height=436")
  • 分享到Facebook好友(messenger) PC端:需要登录Facebook获取appid
const url = "http://www.test.cn"
widnow.open("https:/www.facebook.com/dialog/send?app_id=1 xxxx11&link="+url+"&redirect_uri="+url+"","_blank")
  • 移动端
const url = "http://www.test.cn"
widnow.open("fb-messenger://share/?link="+url)

注意:

        如果meta已经写好了Facebook的分享内容,那么使用js改变mate分享内容是无效的,因为Facebook抓取meta是在js加载之前获取的,尽管通过js更改mate信息也无法改变Facebook已抓取到的信息,所以如果已经在head头部写好了meta的facebook分享内容,就无法通过js动态分享自定义文案

分享网页自定义内容到Facebook

        前端编辑参数,调用第三方的分享地址,第三方回调你传的参数,解析里面meta信息,然后返回html页面,再执行js动态分享内容

  • 分析到Facebook动态(PC端和移动端都适用)
let mateArr = [
    'og:url','http://www.test.cn',
    'og:title','title',
    'og:description','description',
    'og:image','http:/xxx/static/image/test.jpg',
    'og:type','website'
    ]
let mataParams = mateArr.toString()
window.open('http://www.facebook.com/sharer.php?u='+ encodeURIComponent(`http://xxx/share/detail?meta=${metaParams}`))
  •  分享到Facebook好友(messenger) PC端
let mateArr = [
    'og:url','http://www.test.cn',
    'og:title','title',
    'og:description','description',
    'og:image','http://xxx/static/image/test.jpg',
    'og:type','website'
    ]
let mataParams = mateArr.toString()
window.open('https:/www.facebook.com/dialog/send?app_id=1xxx12&link='+ encodeURIComponent(`http://xxx/share/detail?meta=${metaParams}`)+'redirect_uri='+encodeURIComponent(`http://xxx/share/detail?meta=${metaParams}`)+'','_blank')
  • 移动端
let mateArr = [
    'og:url','http://www.test.cn',
    'og:title','title',
    'og:description','description',
    'og:image','http://zzz/static/image/test.jpg',
    'og:type','website'
    ]
let mataParams = mateArr.toString()
widnow.open("fb-messenger://share/?link="+encodeURIComponent(`http://xxx/share/detail?meta=${metaParams}`)+"")

在分享到Facebook上时,需要注意一下几点

  • 1.og:url 中的 url地址禁止携带参数,即 https://test.com/index.htm?key=search错误,若确实需要,请将参数放到目录层级中,如https://testcom/search/index.htm
  • 2.og:image 中的url地址只要能满足让爬虫爬取即可,是否携带参数都可以
  • 3.分享到Facebook上的图片的最佳比例是1.91:1(矩形图)或1:1(正方形图),最小尺寸是200200,低于此尺寸图片将不显示,推荐尺寸是1200630或600*315
  • 4.分享图片无法自己定义显示尺寸,使用og:image:width与og:image:height也不行
  • 5.og:title 标签不存在时,则默认读取title标签里的内容作为分享的title
  • 6.因为分享的内容采用的是爬虫的形式获取,所以在html页面一开始就要存在og:标签,供爬虫,而不可以动态的通过js脚本追加
  • 7.对于动态生成html的情况,当采用的是前后端一体的方式,如.jsp、.asp、haml等形式时,在后端动态生成参数,然后传递给前端页面即可
  • 8.对于前后端分离的情况,需要后端配合动态生成html页面
  • 9.对于分享的链接能否正常显示,可以通过Facebook分享调试器进行调试,并查看结果

(2).WhatsApp

原理与Facebook一样,通过爬虫获取html头部head部分的mate:og信息,有一点需要注意:WhatsApp分享到好友PC端和移动端都可以使用同一套代码,

分享到网页版平台:https://web.whatsapp.com/send?text={内容}&url={链接}

通用链接:https://wa.me/?text={内容},会重定向到API网关然后通过url schema的方式唤起App

<html>
<head>
<meta property="og:type" content="website" />
<meta property="og:url" content="要分享的链接" />
<meta property="og:title" content="标题" />
<meta property="og:description" content="简介" />
<meta property="og:image" content="图片" />
</head>
</html>
const url = "http://www.test.cn"
const text = "share"
window.open("https://api.whatsapp.com/send?text="+encodeURIComponent(url)+encodeURIComponent(text)+"&via=lopscoop")

(3).twitter 

推特是比较简单的,可以在网页中通过链接,推特推荐在网页版打开,所以在一些浏览器可能会隐藏到App的入口(比如Chrome)。它的链接是一个universal link,格式如下: https://twitter.com/intent/tweet?text={内容}&url={链接},注意内容链接需要用encodeURIComponent加密一下,官方文档:https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/summary

代码如下:

  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:title" content="Parade of Fans for Houston’s Funeral">
  <meta name="twitter:description" content="分享的description">
  <meta name="twitter:image" content="分享图片的url">
//调用下面的js打开分享弹窗 
window.open(`https://twitter.com/share?url=${分享链接的url}`, `_blank`, `width=600, height=450, toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, top=100,left=350`)

注意: 

  • twitter:url 标签可有可无,因为默认采用的是 https://twitter.com/share?url=${分享链接的url} 中的url,url地址禁止携带参数,即 https://test.com/index.htm?key=search错误,若确实需要,请将参数放到目录层级中,如https://testcom/search/index.htm
  • twitter:title 标签必须有,否则无法显示分享的内容
  • twitter:image 中的url地址只要能满足让爬虫爬取即可,是否携带参数都可以
  • twitter:card 标签必须有,常用的summary_large_image表示以大图的排版展示,summary以小图的形式排版展示。其他的分享如视频等,请参考官方文档
  • 因为分享的内容采用的是爬虫的形式获取,所以在html页面一开始就要存在twitter:标签,供爬虫,而不可以动态的通过js脚本追加
  • 对于动态生成html的情况,当采用的是前后端一体的方式,如.jsp、.asp、haml等形式时,在后端动态生成参数,然后传递给前端页面即可
  • 对于前后端分离的情况,需要后端配合动态生成html页面
  • 对于分享的链接能否正常显示,可以通过Twitter分享调试器进行调试,并查看结果

(4).Telegram

仅支持分享到App端和桌面端:https://t.me/share?url={链接}&text={内容},也是url schema的方式

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

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

相关文章

详解Avast Driver Updater:电脑驱动更新工具的利器还是多余的软件?

亲爱的读者朋友们&#xff0c;你是不是经常为电脑的驱动问题而烦恼&#xff1f;如果是的话&#xff0c;你可能会对这款软件——Avast Driver Updater 电脑驱动更新工具感兴趣。但在你决定尝试之前&#xff0c;不妨先和我一起深入探讨一下它的优点、缺点以及它适用的使用场景。 …

移动机器人建模两轮驱动与四轮驱动

本文章仅记录小编再学习过程中的知识总结&#xff0c;若有不对之处请批评指正&#xff0c;互相学习&#xff0c;共同进步。 一、两轮驱动运动学模型 示例最后得出&#xff0c;该机器人会沿全局参考系的Y轴以速度1的旋转的同时&#xff0c;以速度3瞬时的移动。 二、四轮驱动运动…

Ps:抓手工具

抓手工具 Hand Tool常用于在文档窗口中平移图像&#xff0c;方便观察大尺寸图像&#xff08;或者被放大的图像&#xff09;的局部细节&#xff0c;是操作 Ps 最常用的辅助工具之一。 快捷键&#xff1a;H ◆ ◆ ◆ 常用操作方法与技巧 1、快捷键 H 是一个弹簧键。即&#xff…

【Linux】 df命令使用

df命令 df 命令&#xff0c;用于显示 Linux 系统中各文件系统的硬盘使用情况&#xff0c;包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等 执行命令结果 各列信息的含义分别是&#xff1a; Filesystem&#xff1a;表示该文件系统位于哪个分区&#xff0c;因此该…

算法与数据结构-AC自动机

文章目录 什么是多模式串匹配算法基于单模式串和 Trie 树实现的敏感词过滤经典的多模式串匹配算法&#xff1a;AC 自动机 什么是多模式串匹配算法 单模式串匹配算法&#xff0c;是在一个模式串和一个主串之间进行匹配&#xff0c;也就是说&#xff0c;在一个主串中查找一个模式…

精准纠错音错节奏 钢琴老师都在推荐小叶子智能陪练

如今市面上帮助孩子练琴的软件越来越多&#xff0c;有线上陪练的&#xff0c;还有AI陪练。产品琳琅满目&#xff0c;家长也挑花了眼。如何挑选一款真正能帮助孩子练琴的App呢&#xff1f;作为从业十余年的钢琴老师&#xff0c;可以分享三点建议给大家。 看品牌实力是否过硬 现…

二维平面扭曲的python实现及思路

二维平面扭曲的python实现及思路 缘起原理实现代码 缘起 工作需要&#xff0c;需要一个尝试改变设备布点的方法&#xff0c;在csdn闲逛时&#xff0c;偶然间发现这样的一篇文章 二维扭曲&#xff0c;参考这位博主的文章&#xff0c;我对其内容进行复现和进一步挖掘。若有侵权或…

基于STM32+OneNet设计的GPS定位器(ESP8266)

一、 设计说明 随着移动互联网和物联网技术的快速发展,越来越多的智能设备被广泛应用于各个领域。其中,GPS定位器是一种常见的智能设备,可以用于车辆、家庭、宠物等物品的实时定位。在实际使用中,GPS定位器需要具有实时上传位置数据、低功耗、精度高等特点。 当前提出了一…

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全

CTFshow 代码审计 web301 下载的附件的目录结构如下&#xff1a; 开题后界面&#xff0c;看见输入框&#xff0c;感觉是sql。 大概浏览一遍源码&#xff0c;我们可以发现在checklogin.php文件中有无过滤的SQL语句&#xff0c;SQL注入没得跑了。 这题SQL注入有三种做法。 方法一…

java进阶-Netty

Netty 在此非常感谢尚硅谷学院以及韩顺平老师在B站公开课 Netty视频教程 Netty demo代码文件 I/O 说NIO之前先说一下BIO&#xff08;Blocking IO&#xff09;,如何理解这个Blocking呢&#xff1f;客户端监听&#xff08;Listen&#xff09;时&#xff0c;Accept是阻塞的&…

游戏模板:MFPS 2.0: Multiplayer FPS

MFPS 2.0: Multiplayer FPS Most complete multiplayer first-person shooter kit. 可编程渲染管线&#xff08;SRP&#xff09;兼容性 Unity可编程渲染管线&#xff08;SRP&#xff09;是让您能够通过C#脚本控制渲染的一个功能。SRP是支撑通用渲染管线&#xff08;URP&#…

紫光同创FPGA图像视频采集系统,基于OV7725实现,提供工程源码和技术支持

目录 1、前言免责声明 2、设计思路框架视频源选择OV7725摄像头配置及采集动态彩条HDMA图像缓存输入输出视频HDMA缓冲FIFOHDMA控制模块HDMI输出 3、PDS工程详解4、上板调试验证并演示准备工作静态演示动态演示 5、福利&#xff1a;工程源码获取 紫光同创FPGA图像视频采集系统&am…

全球性区块链服务网络(BSN)机制体系、关键技术和应用项目科技成果鉴定会在北京举行

原标题&#xff1a;《全球性区块链服务网络&#xff08;BSN&#xff09;机制体系、关键技术和应用项目科技成果鉴定会在北京举行》 2023年9月17日&#xff0c;“全球性区块链服务网络&#xff08;BSN&#xff09;机制体系、关键技术和应用”科技成果鉴定会在北京举行。鉴定委员…

[FineReport]安装与使用(连接Hive3.1.2)

一、安装(对应hive3.1.2) 注&#xff1a;服务器的和本地的要同时安装。本地是测试环境&#xff0c;服务器的是生产环境 1、服务器安装 1、下载 免费下载FineReport - FineReport报表官网 向下滑找到 2、解压 [rootck1 /home/data_warehouse/software]# tar -zxvf tomcat…

十四,间接漫反射用到球体中

间接光照分为间接漫反射和间接镜面反射。 辐照度图是用来适用于间接漫反射的。 直射光也有漫反射&#xff0c;对比下两者。 直接光kD * albedo / PI * radiance * NdotL&#xff1b;其中radiance * NdotL是光照, 间接光&#xff1a; kD * texture(irradianceMap, N).rgb* al…

Linux -- 进程间通信之匿名管道

博客中涉及代码已全部上传至Gitee&#xff0c;有需要请自行下载 目录 前言通信基础管道 匿名管道第一步&#xff1a;创建管道第二步&#xff1a;创建子进程第三步&#xff1a;开始通信第四步&#xff1a;结束通信 匿名管道通信代码实现四种特殊情景 基于匿名管道的多进程控制对…

【Linux】Linux进程控制

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

Latex写论文时图的设置

我们在写论文&#xff0c;使用官方Latex模板可能经常遇到这种情况&#xff1a; 图和文字间距太大&#xff0c;这是因为排版时图片插入到了一个段的中间导致的。 解决方法是&#xff08;注意控制字符\vspace一定要放在引用图的代码块里面&#xff09;&#xff1a; \begin{figu…

浅谈电气防火保护器在地下商场的应用

摘 要&#xff1a;近年来&#xff0c;我国城市发展速度加速。很多城市大力建造地下建筑设施&#xff0c;比如地铁、地下停车场和地下商场等。地下商场属于人员密集型建筑&#xff0c;其防火设计一直令相关的专家头疼。由于人员密集&#xff0c;防火处理不好将酿成灾难性的后果。…

【数据结构与算法】 - 时间复杂度和空间复杂度、二分查找、线性查找

数据结构与算法 1. 数据结构的定义2. 二分查找2.1 二分查找的定义2.2 二分查找分析2.3 二分查找实现2.4 二分查找算法图解2.5 二分算法引发的问题2.6 二分算法改良版2.7 二分算法改良版解析2.8 二分算法改良版图解2.9 二分算法改良版注意事项 3. 时间复杂度3.1 时间复杂度的概念…