H5页面 卡片 分享朋友圈和好友

news2024/10/6 7:50:15

 项目背景:

前后端分离

        后端: C# 开发

        前端: 就是微信中打开的 H5页面  纯 H5

 

业务流程

因为在 h5 中实现 卡片分享 的一个字段, 需要后端 访问 腾讯API  生成,所以整个分享结构和流程就比较长!同时 这样也可以避免这个被滥用

效果展示:

 触发分享的位置就在这里:

 前期准备:

  • 微信公众号/微信小程序的  AppID 和  AppSecret
  • 配置IP白名单 (api 服务器IP,网站托管服务器 IP 我这里有两个)
  • js 接口白名单  (api 服务器域名)
  • 分享功能是否开放 (默认是开放的)

服务端 API 实现:

流程步骤:

  1. 通过 appid 和 appsecret 获取一个访问接口的凭证 access_token 7200秒  时效
    private static string getAccessToken()
    {
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        //string appid = System.Configuration.ConfigurationManager.AppSettings["appid"];
        //string appsecret = System.Configuration.ConfigurationManager.AppSettings["appsecret"];
        string appid = "wx65b113f9********";
        string appsecret = "4e2e8960***********************";
        //请求接口获取
        string _url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret;
        string method = "GET";
        HttpWebRequest request = WebRequest.Create(_url) as HttpWebRequest;
        CookieContainer cookieContainer = new CookieContainer();
        request.CookieContainer = cookieContainer;
        request.AllowAutoRedirect = true;
        request.Method = method;
        request.ContentType = "text/html";
        request.Headers.Add("charset", "utf-8");
        //发送请求并获取响应数据
        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        Stream responseStream = response.GetResponseStream();
        StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
        //获取返回过来的结果
        string content = sr.ReadToEnd();
        dynamic resultContent = JsonConvert.DeserializeObject(content, new { access_token = "", expires_in = "", errcode = "", errmsg = "" }.GetType());
        if (resultContent != null && !string.IsNullOrWhiteSpace(resultContent.access_token)) //注意:请求成功时是不会有errcode=0返回,判断access_token是否有值即可
        {
            return resultContent.access_token;//返回请求唯一凭证
        }
        else
        {
            //请求失败,返回为空
            return "";
        }
    
    }

  2. 通过 access_token 获取一个 jsTicket 用于 前端页面 7200秒 时效
    public static JSTicket getJsApiTicket()
    {
        long timeStamp = DateTimeOffset.Now.ToUnixTimeSeconds(); // 相差秒数
        if (resultStr == null ||   timeStamp - timeMark > 7200-200)
        {
            string accessToken = getAccessToken();
            try
            {
                //TODO:注意api_ticket 是用于调用微信卡券JS API的临时票据,有效期为7200 秒,通过access_token 来获取。
                string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";
                string method = "GET";
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                CookieContainer cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = method;
                request.ContentType = "text/html";
                request.Headers.Add("charset", "utf-8");
                //发送请求并获取响应数据
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream responseStream = response.GetResponseStream();
                StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
                //获取返回过来的结果
                string content = sr.ReadToEnd();
                //dynamic resultStr = JsonConvert.DeserializeObject(content, new { errcode = "", errmsg = "", ticket = "", expires_in = "" }.GetType());
                resultStr = JsonConvert.DeserializeObject<JSTicket>(content);
                timeMark = DateTimeOffset.Now.ToUnixTimeSeconds(); // 相差秒数
    
                //请求成功
                if (resultStr.errcode == "0" && resultStr.errmsg == "ok")
                {
                    return resultStr;
                }
                else
                {
                    return resultStr;
                }
            }
            catch (Exception ex)
            {
                return new JSTicket { errcode = "-11" };
            }
        }
        else
        {
            return resultStr;
        } 
    }

  3. 把 jsTicket 返回给前端
    [HttpGet]
    public MiniToken Get()
    {
        try
        {
            string appid = "wx65b113f*********";
            JSTicket jsapiTicket = GetAccessTokenUtil.getJsApiTicket();
            //string url = HttpContext.Current.Request.Url.ToString();
            long timestamp = GetAccessTokenUtil.ConvertDateTimeInt();
            string nonceStr = GetAccessTokenUtil.createNonceStr();
    
            // 这里参数的顺序要按照 key 值 ASCII 码升序排序 
            //string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";
    
            string signature = GetAccessTokenUtil.GetSignature(jsapiTicket.ticket, nonceStr, timestamp, "http://pt.thingeasy.cn/KEUploads/vr/aolin_webgl_local/index.html");
    
            拼接json串返回前台
            //string rtn = "{\"appid\":\"" + appid + "\",\"jsapi_ticket\":\"" + jsapiTicket + "\",\"noncestr\":\"" + nonceStr + "\",\"timestamp\":\"" + timestamp + "\",\"signature\":\"" + signature + "\"}";
    
            //return rtn;
            MiniToken token = new MiniToken {
                appid = appid,
                jsapi_ticket = jsapiTicket.ticket,
                noncestr = nonceStr,
                timestamp = timestamp,
                signature = signature,
            };
            return token;
        }
        catch (Exception e)
        {
            return new MiniToken { 
                timestamp = -1,
            };
        }
    
    }

应为时效性,腾讯建议不要频繁调用接口。每日有访问上限,可以做个缓存 块超时了再调用腾讯服务器拿新的;

完整脚本:GetAccessTokenUtil.CS

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace miniProgram.Controllers
{
    public class GetAccessTokenUtil
    {
        private static JSTicket resultStr;
        //获取成功的时间
        private static long timeMark;
        private static string getAccessToken()
        {
            // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
            //string appid = System.Configuration.ConfigurationManager.AppSettings["appid"];
            //string appsecret = System.Configuration.ConfigurationManager.AppSettings["appsecret"];
            string appid = "wx65b113**********";
            string appsecret = "4e2e89609ae6********************";
            //请求接口获取
            string _url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret;
            string method = "GET";
            HttpWebRequest request = WebRequest.Create(_url) as HttpWebRequest;
            CookieContainer cookieContainer = new CookieContainer();
            request.CookieContainer = cookieContainer;
            request.AllowAutoRedirect = true;
            request.Method = method;
            request.ContentType = "text/html";
            request.Headers.Add("charset", "utf-8");
            //发送请求并获取响应数据
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            Stream responseStream = response.GetResponseStream();
            StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
            //获取返回过来的结果
            string content = sr.ReadToEnd();
            dynamic resultContent = JsonConvert.DeserializeObject(content, new { access_token = "", expires_in = "", errcode = "", errmsg = "" }.GetType());
            if (resultContent != null && !string.IsNullOrWhiteSpace(resultContent.access_token)) //注意:请求成功时是不会有errcode=0返回,判断access_token是否有值即可
            {
                return resultContent.access_token;//返回请求唯一凭证
            }
            else
            {
                //请求失败,返回为空
                return "";
            }

        }

        public static JSTicket getJsApiTicket()
        {
            long timeStamp = DateTimeOffset.Now.ToUnixTimeSeconds(); // 相差秒数
            if (resultStr == null || timeStamp - timeMark > 7200 - 200)
            {
                string accessToken = getAccessToken();
                try
                {
                    //TODO:注意api_ticket 是用于调用微信卡券JS API的临时票据,有效期为7200 秒,通过access_token 来获取。
                    string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";
                    string method = "GET";
                    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                    CookieContainer cookieContainer = new CookieContainer();
                    request.CookieContainer = cookieContainer;
                    request.AllowAutoRedirect = true;
                    request.Method = method;
                    request.ContentType = "text/html";
                    request.Headers.Add("charset", "utf-8");
                    //发送请求并获取响应数据
                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                    Stream responseStream = response.GetResponseStream();
                    StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
                    //获取返回过来的结果
                    string content = sr.ReadToEnd();
                    //dynamic resultStr = JsonConvert.DeserializeObject(content, new { errcode = "", errmsg = "", ticket = "", expires_in = "" }.GetType());
                    resultStr = JsonConvert.DeserializeObject<JSTicket>(content);
                    timeMark = DateTimeOffset.Now.ToUnixTimeSeconds(); // 相差秒数

                    //请求成功
                    if (resultStr.errcode == "0" && resultStr.errmsg == "ok")
                    {
                        return resultStr;
                    }
                    else
                    {
                        return resultStr;
                    }
                }
                catch (Exception ex)
                {
                    return new JSTicket { errcode = "-11" };
                }
            }
            else
            {
                return resultStr;
            }
        }

        public static long ConvertDateTimeInt()
        {
            DateTime currentDate = DateTime.Now;//当前时间
                                                //转化为时间戳
            DateTime localTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
            return long.Parse((currentDate - localTime).TotalSeconds.ToString().Split('.')[0]);
        }
        /// <summary>
        /// 创建随机字符串 
        /// </summary>
        /// <returns></returns>
        public static string createNonceStr()
        {
            int length = 16;
            string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            string str = "";
            Random rad = new Random();
            for (int i = 0; i < length; i++)
            {
                str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
            }
            return str;
        }

        /// <summary>
        /// 获取签名
        /// </summary>
        /// <param name="jsapi_ticket">微信公众号调用微信JS临时票据</param>
        /// <param name="nonceStr">随机串</param>
        /// <param name="timestamp">时间戳</param>
        /// <param name="url">当前网页URL</param>
        /// <returns></returns>
        public static string GetSignature(string jsapi_ticket, string nonceStr, long timestamp, string url)
        {

            var string1Builder = new StringBuilder();
            //注意这里参数名必须全部小写,且必须有序
            string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
                          .Append("noncestr=").Append(nonceStr).Append("&")
                          .Append("timestamp=").Append(timestamp).Append("&")
                          .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);

            return Sha1(string1Builder.ToString(), Encoding.UTF8);
        }

        /// <summary>
        /// 签名加密,使用SHA加密所得
        /// </summary>
        /// <param name="content">签名加密参数</param>
        /// <param name="encode">编码UTF-8</param>
        /// <returns></returns>
        public static string Sha1(string content, Encoding encode)
        {
            try
            {
                SHA1 sha1 = new SHA1CryptoServiceProvider();
                byte[] bytesIn = encode.GetBytes(content);
                byte[] bytesOut = sha1.ComputeHash(bytesIn);
                sha1.Dispose();
                string result = BitConverter.ToString(bytesOut);
                result = result.Replace("-", "");
                return result;
            }
            catch (Exception ex)
            {
                throw new Exception("SHA1加密出错:" + ex.Message);
            }
        }

    }

}

API 控制器MiniProgramController.CS

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace miniProgram.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class MiniProgramController
    {
        [HttpGet]
        public MiniToken Get()
        {
            try
            {
                string appid = "wx65b11***********";
                JSTicket jsapiTicket = GetAccessTokenUtil.getJsApiTicket();
                //string url = HttpContext.Current.Request.Url.ToString();
                long timestamp = GetAccessTokenUtil.ConvertDateTimeInt();
                string nonceStr = GetAccessTokenUtil.createNonceStr();

                // 这里参数的顺序要按照 key 值 ASCII 码升序排序 
                //string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";

                string signature = GetAccessTokenUtil.GetSignature(jsapiTicket.ticket, nonceStr, timestamp, "http://pt.thingeasy.cn/KEUploads/vr/aolin_webgl_local/index.html");

                拼接json串返回前台
                //string rtn = "{\"appid\":\"" + appid + "\",\"jsapi_ticket\":\"" + jsapiTicket + "\",\"noncestr\":\"" + nonceStr + "\",\"timestamp\":\"" + timestamp + "\",\"signature\":\"" + signature + "\"}";

                //return rtn;
                MiniToken token = new MiniToken
                {
                    appid = appid,
                    jsapi_ticket = jsapiTicket.ticket,
                    noncestr = nonceStr,
                    timestamp = timestamp,
                    signature = signature,
                };
                return token;
            }
            catch (Exception e)
            {
                return new MiniToken
                {
                    timestamp = -1,
                };
            }

        }
    }


}

中间用到的几个类型:

public class MiniToken
{
    public String appid { get; set; }
    public String jsapi_ticket { get; set; }
    public String noncestr { get; set; }
    public long timestamp { get; set; }

    public String signature { get; set; }
}

public class JSTicket {
    public String errcode { get; set; }
    public String errmsg { get; set; }
    public String ticket { get; set; }
    public long expires_in { get; set; }
}

API接了

前端 H5 实现:

html 引入

<script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

步骤:调用 API 拿到需要的凭证,然后设置 分享内容:

 

核心代码:

<script>
    let xhr = new XMLHttpRequest()
    let wxDate = null
    xhr.open("GET", "http://172.61.10.17/api/MiniProgram", true);
    xhr.send(null)
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            console.log(xhr.responseText);
            wxDate = JSON.parse(xhr.responseText)
            console.log(wxDate);
            wx.config({
                debug: false,
                appId: wxDate.appid,
                timestamp: wxDate.timestamp,
                nonceStr: wxDate.noncestr,
                signature: wxDate.signature,
                jsApiList: [
                    'checkJsApi',
                    'updateAppMessageShareData',
                    'updateTimelineShareData'
                ]
            });

            wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
                // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
                // 设置分享朋友内容
                wx.updateAppMessageShareData({
                    title: '奥铃Pro', // 分享标题
                    desc: '全新一代三冠王轻卡', // 分享描述
                    link: location.href,
                    imgUrl: 'http://pt.thingeasy.cn/KEUploads/vr/aolin_webgl_local/share_icon.png', // 分享图标
                    success: function () {
                        // 设置成功
                        alert('设置成功');
                    }
                })
                // 设置分享朋友权内容
                wx.updateTimelineShareData({
                    title: '奥铃Pro', // 分享标题
                    desc: '全新一代三冠王轻卡', // 分享描述
                    link: location.href,
                    imgUrl: 'http://pt.thingeasy.cn/KEUploads/vr/aolin_webgl_local/share_icon.png', // 分享图标
                    success: function () {
                        // 设置成功
                        alert('设置成功');
                    }
                })
                alert('ready 成功');
            });


            wx.error(function (res) {
                alert('ready 失败:', res);
                // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
            });
        }
    }
</script>

完整 index.html

<!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">
    <script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
    <title>Document</title>
</head>
<script>
    let xhr = new XMLHttpRequest()
    let wxDate = null
    xhr.open("GET", "http://172.61.10.17/api/MiniProgram", true);
    xhr.send(null)
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            console.log(xhr.responseText);
            wxDate = JSON.parse(xhr.responseText)
            console.log(wxDate);
            wx.config({
                debug: false,
                appId: wxDate.appid,
                timestamp: wxDate.timestamp,
                nonceStr: wxDate.noncestr,
                signature: wxDate.signature,
                jsApiList: [
                    'checkJsApi',
                    'updateAppMessageShareData',
                    'updateTimelineShareData'
                ]
            });

            wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
                // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
                // 设置分享朋友内容
                wx.updateAppMessageShareData({
                    title: '奥铃Pro', // 分享标题
                    desc: '全新一代三冠王轻卡', // 分享描述
                    link: location.href,
                    imgUrl: 'http://pt.thingeasy.cn/KEUploads/vr/aolin_webgl_local/share_icon.png', // 分享图标
                    success: function () {
                        // 设置成功
                        alert('设置成功');
                    }
                })
                // 设置分享朋友权内容
                wx.updateTimelineShareData({
                    title: '奥铃Pro', // 分享标题
                    desc: '全新一代三冠王轻卡', // 分享描述
                    link: location.href,
                    imgUrl: 'http://pt.thingeasy.cn/KEUploads/vr/aolin_webgl_local/share_icon.png', // 分享图标
                    success: function () {
                        // 设置成功
                        alert('设置成功');
                    }
                })
                alert('ready 成功');
            });


            wx.error(function (res) {
                alert('ready 失败:', res);
                // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
            });
        }
    }
</script>

<body>

</body>

</html>

 wx.config 里面配置 调试模式 true 的时候:显示下面这个就说明 设置 分享类容 成功了!

注意事项:

       updateAppMessageShareData:ok  设置成功之后,你发现 你点击这里分享出去的还是 链接,并不是卡片你先要收藏一下,然后在分享 或者转发;就能看到卡片

       

 因为刚开始 服务器是按照 dotnet core 写的,谁知 目标服务器ii7,所有只能用  dotnet framework 重构了一遍!

 

源码下载地址:https://download.csdn.net/download/nicepainkiller/88093865https://download.csdn.net/download/nicepainkiller/88093865

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

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

相关文章

Stable diffusion 和 Midjourney 怎么选?

通过这段时间的摸索&#xff0c;我将和你探讨&#xff0c;对普通人来说&#xff0c;Stable diffusion 和 Midjourney 怎么选&#xff1f;最重要的是&#xff0c;学好影视后期制作对 AI 绘画创作有哪些帮助&#xff1f;反过来&#xff0c;AI 绘画对影视后期又有哪些帮助&#xf…

Python案例变量实践

编程&#xff1a;非常需要实践&#xff0c;不要光看&#xff0c;一定要动动手 什么是程序&#xff1f; 数据结构算法 数据结构&#xff1a;存储和使用数据的方式 算法&#xff1a;解决问题的步骤 解决一个问题的时候&#xff0c;分析问题&#xff0c;设计算法&#xff0c;编…

网约车服务端线上流量巡检与测试验收技术

摘要 滴滴网约车致力于让出行更美好&#xff0c;平台为司乘提供良好体验的同时承载了广大群众的出行服务&#xff0c;致使我们对服务可用性的要求较高。更快地发现系统bug&#xff0c;可以让更少的司乘用户受影响。发现bug的能力更精细&#xff0c;可以让一些不易被用户感知但…

2D坐标系下的点的转换矩阵(平移、缩放、旋转、错切)

文章目录 1. 平移 &#xff08;Translation&#xff09;2. 缩放 &#xff08;Scaling&#xff09;3. 旋转 &#xff08;Rotation&#xff09;4. 错切 &#xff08;Shearing&#xff09;5. 镜像 &#xff08;Reflection&#xff09; 1. 平移 &#xff08;Translation&#xff09…

Nautilus Chain:主权模块化区块链的早期实践

“Nautilus Chain 是目前行业内首个以模块化的方式构建的主权 Layer3 区块链系统&#xff0c;其也是 Celestia 模块化 Layer0 体系下最早的印证者&#xff0c;现在 Nautilus Chain 主网正式上线&#xff0c;揭示着模块化区块链正在从早期的理论阶段走向实践。” Celestia &…

Godot 4 源码分析 - 获取属性信息

在管道通信基础上&#xff0c;可进行宿主程序与Godot的双向通信。 先拿属性信息试试手。 DrGraph端 static UnicodeString command "Book.position"; if (InputQuery("输入窗口", "请输入待获取的属性信息", command)) {TDrStream_Get drGet…

5.10 Bootstrap 按钮(Button)插件

文章目录 Bootstrap 按钮&#xff08;Button&#xff09;插件加载状态单个切换复选框&#xff08;Checkbox&#xff09;单选按钮&#xff08;Radio&#xff09;用法选项方法 Bootstrap 按钮&#xff08;Button&#xff09;插件 按钮&#xff08;Button&#xff09;在 Bootstrap…

forEach遍历访问set造成的无限循环问题

抛出问题 先给出一段代码&#xff0c;我们创建了一个集合set&#xff0c;它里面有一个元素数字1和2&#xff0c;接着我们调用forEach方法来遍历该集合。在遍历函数中&#xff0c;首先调用delete方法删除数字1&#xff0c;再执行了某些业务操作后紧接着调用add方法将数字1加回&…

Linux系统root用户切换及密码修改

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B:美国纽约公共自行车使用量预测分析 问题二Python代码分析

2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B&#xff1a;美国纽约公共自行车使用量预测分析 问题二 相关链接 【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B&#xff1a;美国纽约公共自行车使用量预测分析 问题一Python代码分析 【2023 年第二届钉钉杯大学生大数据挑…

面试—Redis相关

文章目录 一、概述二、缓存1、缓存穿透2、缓存击穿3、缓存雪崩4、双写一致性5、持久化6、数据过期策略7、数据淘汰策略 三、分布式锁四、其它面试题1、主从复制2、哨兵3、分片集群结构4、I/O多路复用 一、概述 使用场景&#xff1a; Redis的数据持久化策略有哪些什么是缓存穿透…

[PyTorch][chapter 44][RNN]

简介 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类以序列&#xff08;sequence&#xff09;数据为输入&#xff0c;在序列的演进方向进行递归&#xff08;recursion&#xff09;且所有节点&#xff08;循环单元&#xff09;按链式连接的递归神经网…

leetcode 面试题 判定是否互为字符重排

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;判定是否互为字符重排 思路&#xff1a; 两个字符串的每个字母和数量都相等。那么 s2 一定可以排成 s1 字符串。 代码&#xff1a; bool CheckPermutation(char* s1, char* s2){char hash1[26] {0};char hash2[26] {…

Python深度学习“四大名著”之一【赠书活动|第二期《Python机器学习:基于PyTorch和Scikit-Learn》】

近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来&#xff0c;机器学习和深度学习迅猛发展&#xff0c;取…

不知道零基础小白拥有一个黑客梦有没有机会能够实现

01.简单了解一下网络安全 说白了&#xff0c;网络安全就是指网络系统中的数据受到保护不被破坏。而我们从事网络信息安全工作的安全工程师&#xff0c;主要工作当然是设计程序来维护网络安全了。 网络安全工程师是一个统称&#xff0c;还包含很多职位&#xff0c;像安全产品工…

【代码随想录day19】从前序与中序遍历序列构造二叉树

题目 思路 使用递归建树&#xff0c;流程如下&#xff1a; 取出后序节点创建新树的节点 找到新树的节点在中序中的索引 分割中序序列 分割后序序列 继续递归建立整颗新树 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftN…

spring-cloud-alibaba——nacos-server搭建

前言&#xff1a;组件版本关系&#xff0c;官方:组件版本关系 1,nacos-server搭建&#xff08;windows环境&#xff09;&#xff0c;下载地址nacos 选择对应的版本&#xff0c;这里以目前最新版2.2.3为例子,下载后解压 单机模式 修改\nacos-server-2.2.3\nacos\bin\startup.c…

【ribbon】Ribbon的使用与原理

负载均衡介绍 负载均衡&#xff08;Load Balance&#xff09;&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行&#xff0c;例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等&#xff0c;从而协同…

【全方位解析】如何获取客户端/服务端真实 IP

一、应用场景 1.比如在投票系统开发中&#xff0c;为了防止刷票&#xff0c;我们需要限制每个 IP 地址只能投票一次 2.当网站受到诸如 DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务攻击&#xff09;等攻击时&#xff0c;我们需要快速定位攻击者…

星火汇聚丨高效行动,决胜2023!

7月6日至10日&#xff0c;数字韧性领域标杆企业同创永益营销体系大会在长沙召开&#xff0c;闪耀在全国各地的销售之星集结汇聚。本次大会历时四天&#xff0c;包含营销全员大会、各行业业委会专场会议、销售大比武等业务实践议程&#xff0c;以及飞盘竞技、走进毛泽东故居韶山…