钉钉企业微应用开发C#-HTTP回调接口

官方的STREAM回调推送的方式,试了几次都认证不过,就放弃了还是用HTTP的模式吧。

        /// <summary>/// 应用回调/// </summary>/// <param name="model"></param>/// <returns></returns>public static Dictionary<string, string> CallBack(DingCallBackModel model){WriteLogHelper.WriteLogsAsync(JsonHelper.SerializeObject(model), "实例回调日志");var timeStamp = GetTimestamp(DateTime.Now).ToString();// 2. 使用加解密类型DingTalkEncryptor callbackCrypto = new DingTalkEncryptor(AppsettingsConfig.DingDingConfig.Token, AppsettingsConfig.DingDingConfig.AesKey, AppsettingsConfig.DingDingConfig.AppKey);string decryptMsg = callbackCrypto.getDecryptMsg(model.Msg_signature, model.TimeStamp, model.Nonce, model.Encrypt);string msg = "success";// 3. 反序列化回调事件json数据var approveModel = JsonHelper.DeserializeObject<ApprovalInstanceModel>(decryptMsg);WriteLogHelper.WriteLogsAsync(JsonHelper.SerializeObject(approveModel), "实例回调日志-解密");var type = approveModel.EventType;switch (type){case "check_url":WriteLogHelper.WriteLogsAsync("审批回调:" + JsonHelper.SerializeObject(model), "实例回调日志");// 测试回调break;case "bpms_instance_change":// 实例改变break;}var rspMsg = callbackCrypto.getEncryptedMap(msg);return rspMsg;}

check_url就是钉应用后台设置回调URL时传入数据的类型。拿到数据

     public string Msg_signature { set; get; } = "";
        public string TimeStamp { set; get; }
        public string Nonce { set; get; } = "123456";
        /// <summary>
        /// 加密后的结果
        /// </summary>
        public string Encrypt { set; get; }

分为几部分,前面几项用来解密Encrypt密文的参数。

通过提供的DingTalkEncryptor 的  getDecryptMsg方法来进行解密

得到解密后的内容序列化成对象。

 /*** 钉钉开放平台加解密方法*/public class DingTalkEncryptor{//private static readonly Charset CHARSET = Charset.forName("utf-8");//private static readonly Base64         base64  = new Base64();private byte[] aesKey;private String token;private String corpId;/**ask getPaddingBytes key固定长度**/private static readonly int AES_ENCODE_KEY_LENGTH = 43;/**加密随机字符串字节长度**/private static readonly int RANDOM_LENGTH = 16;/*** 构造函数* @param token            钉钉开放平台上,开发者设置的token* @param encodingAesKey   钉钉开放台上,开发者设置的EncodingAESKey* @param corpId           企业自建应用-事件订阅, 使用appKey*                         企业自建应用-注册回调地址, 使用corpId*                         第三方企业应用, 使用suiteKey** @throws DingTalkEncryptException 执行失败,请查看该异常的错误码和具体的错误信息*/public DingTalkEncryptor(String token, String encodingAesKey, String corpId){if (null == encodingAesKey || encodingAesKey.Length != AES_ENCODE_KEY_LENGTH){throw new DingTalkEncryptException(DingTalkEncryptException.AES_KEY_ILLEGAL);}this.token = token;this.corpId = corpId;aesKey = Convert.FromBase64String(encodingAesKey + "=");}/*** 将和钉钉开放平台同步的消息体加密,返回加密Map*/public Dictionary<String, String> getEncryptedMap(String plaintext){var time = DateTime.Now.Millisecond;return getEncryptedMap(plaintext, time);}/*** 将和钉钉开放平台同步的消息体加密,返回加密Map* @param plaintext     传递的消息体明文* @param timeStamp      时间戳* @param nonce           随机字符串* @return* @throws DingTalkEncryptException*/public Dictionary<String, String> getEncryptedMap(String plaintext, long timeStamp){if (null == plaintext){throw new DingTalkEncryptException(DingTalkEncryptException.ENCRYPTION_PLAINTEXT_ILLEGAL);}var nonce = Utils.getRandomStr(RANDOM_LENGTH);if (null == nonce){throw new DingTalkEncryptException(DingTalkEncryptException.ENCRYPTION_NONCE_ILLEGAL);}String encrypt = this.encrypt(nonce, plaintext);String signature = getSignature(token, timeStamp.ToString(), nonce, encrypt);Dictionary<String, String> resultMap = new Dictionary<String, String>();resultMap["msg_signature"] = signature;resultMap["encrypt"] = encrypt;resultMap["timeStamp"] = timeStamp.ToString();resultMap["nonce"] = nonce;return resultMap;}/*** 密文解密* @param msgSignature     签名串* @param timeStamp        时间戳* @param nonce             随机串* @param encryptMsg       密文* @return                  解密后的原文* @throws DingTalkEncryptException*/public String getDecryptMsg(String msgSignature, String timeStamp, String nonce, String encryptMsg){//校验签名String signature = getSignature(token, timeStamp, nonce, encryptMsg);if (!signature.Equals(msgSignature)){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_SIGNATURE_ERROR);}// 解密String result = decrypt(encryptMsg);return result;}/** 对明文加密.* @param text 需要加密的明文* @return 加密后base64编码的字符串*/private String encrypt(String random, String plaintext){try{byte[] randomBytes = System.Text.Encoding.UTF8.GetBytes(random);// random.getBytes(CHARSET);byte[] plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plaintext);// plaintext.getBytes(CHARSET);byte[] lengthByte = Utils.int2Bytes(plainTextBytes.Length);byte[] corpidBytes = System.Text.Encoding.UTF8.GetBytes(corpId);// corpId.getBytes(CHARSET);//MemoryStream byteStream = new MemoryStream();var bytestmp = new List<byte>();bytestmp.AddRange(randomBytes);bytestmp.AddRange(lengthByte);bytestmp.AddRange(plainTextBytes);bytestmp.AddRange(corpidBytes);byte[] padBytes = PKCS7Padding.getPaddingBytes(bytestmp.Count);bytestmp.AddRange(padBytes);byte[] unencrypted = bytestmp.ToArray();RijndaelManaged rDel = new RijndaelManaged();rDel.Mode = CipherMode.CBC;rDel.Padding = PaddingMode.Zeros;rDel.Key = aesKey;rDel.IV = aesKey.ToList().Take(16).ToArray();ICryptoTransform cTransform = rDel.CreateEncryptor();byte[] resultArray = cTransform.TransformFinalBlock(unencrypted, 0, unencrypted.Length);return Convert.ToBase64String(resultArray, 0, resultArray.Length);//Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");//IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);//cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);//byte[] encrypted = cipher.doFinal(unencrypted);//String result = base64.encodeToString(encrypted);//return result;}catch (Exception e){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_ENCRYPT_TEXT_ERROR);}}/** 对密文进行解密.* @param text 需要解密的密文* @return 解密得到的明文*/private String decrypt(String text){byte[] originalArr;try{byte[] toEncryptArray = Convert.FromBase64String(text);RijndaelManaged rDel = new RijndaelManaged();rDel.Mode = CipherMode.CBC;rDel.Padding = PaddingMode.Zeros;rDel.Key = aesKey;rDel.IV = aesKey.ToList().Take(16).ToArray();ICryptoTransform cTransform = rDel.CreateDecryptor();originalArr = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);//return System.Text.UTF8Encoding.UTF8.GetString(resultArray);设置解密模式为AES的CBC模式//Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");//IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));//cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);使用BASE64对密文进行解码//byte[] encrypted = Base64.decodeBase64(text);解密//originalArr = cipher.doFinal(encrypted);}catch (Exception e){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_DECRYPT_TEXT_ERROR);}String plainText;String fromCorpid;try{// 去除补位字符byte[] bytes = PKCS7Padding.removePaddingBytes(originalArr);Console.Out.WriteLine("bytes size:" + bytes.Length);// 分离16位随机字符串,网络字节序和corpIdbyte[] networkOrder = bytes.Skip(16).Take(4).ToArray();// Arrays.copyOfRange(bytes, 16, 20);for (int i = 0; i < 4; i++){Console.Out.WriteLine("networkOrder size:" + (int)networkOrder[i]);}Console.Out.WriteLine("bytes plainText:" + networkOrder.Length + " " + JsonSerializer.Serialize(networkOrder));int plainTextLegth = Utils.bytes2int(networkOrder);Console.Out.WriteLine("bytes size:" + plainTextLegth);plainText = System.Text.UTF8Encoding.UTF8.GetString(bytes.Skip(20).Take(plainTextLegth).ToArray()); // new String(Arrays.copyOfRange(bytes, 20, 20 + plainTextLegth), CHARSET);fromCorpid = System.Text.UTF8Encoding.UTF8.GetString(bytes.Skip(20 + plainTextLegth).ToArray()); //new String(Arrays.copyOfRange(bytes, 20 + plainTextLegth, bytes.length), CHARSET);Console.Out.WriteLine("bytes plainText:" + plainText);}catch (Exception e){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_DECRYPT_TEXT_LENGTH_ERROR);}Console.Out.WriteLine(fromCorpid + "=====" + corpId);// corpid不相同的情况if (!fromCorpid.Equals(corpId)){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_DECRYPT_TEXT_CORPID_ERROR);}return plainText;}/*** 数字签名* @param token         isv token* @param timestamp     时间戳* @param nonce          随机串* @param encrypt       加密文本* @return* @throws DingTalkEncryptException*/public String getSignature(String token, String timestamp, String nonce, String encrypt){try{Console.Out.WriteLine(encrypt);String[] array = new String[] { token, timestamp, nonce, encrypt };Array.Sort(array, StringComparer.Ordinal);//var tmparray = array.ToList();//tmparray.Sort(new JavaStringComper());//array = tmparray.ToArray();Console.Out.WriteLine("array:" + JsonSerializer.Serialize(array));StringBuilder sb = new StringBuilder();for (int i = 0; i < 4; i++){sb.Append(array[i]);}String str = sb.ToString();Console.Out.WriteLine(str);//MessageDigest md = MessageDigest.getInstance("SHA-1");//md.update(str.getBytes());//byte[] digest = md.digest();System.Security.Cryptography.SHA1 hash = System.Security.Cryptography.SHA1.Create();System.Text.Encoding encoder = System.Text.Encoding.ASCII;byte[] combined = encoder.GetBytes(str);byte 转换//sbyte[] myByte = new sbyte[]//byte[] mySByte = new byte[myByte.Length];//for (int i = 0; i < myByte.Length; i++)//{//    if (myByte[i] > 127)//        mySByte[i] = (sbyte)(myByte[i] - 256);//    else//        mySByte[i] = (sbyte)myByte[i];//}byte[] digest = hash.ComputeHash(combined);StringBuilder hexstr = new StringBuilder();String shaHex = "";for (int i = 0; i < digest.Length; i++){shaHex = ((int)digest[i]).ToString("x");// Integer.toHexString(digest[i] & 0xFF);if (shaHex.Length < 2){hexstr.Append(0);}hexstr.Append(shaHex);}return hexstr.ToString();}catch (Exception e){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_SIGNATURE_ERROR);}}}/*** 钉钉开放平台加解密异常类*/public class DingTalkEncryptException : Exception{/**成功**/public static readonly int SUCCESS = 0;/**加密明文文本非法**/public readonly static int ENCRYPTION_PLAINTEXT_ILLEGAL = 900001;/**加密时间戳参数非法**/public readonly static int ENCRYPTION_TIMESTAMP_ILLEGAL = 900002;/**加密随机字符串参数非法**/public readonly static int ENCRYPTION_NONCE_ILLEGAL = 900003;/**不合法的aeskey**/public readonly static int AES_KEY_ILLEGAL = 900004;/**签名不匹配**/public readonly static int SIGNATURE_NOT_MATCH = 900005;/**计算签名错误**/public readonly static int COMPUTE_SIGNATURE_ERROR = 900006;/**计算加密文字错误**/public readonly static int COMPUTE_ENCRYPT_TEXT_ERROR = 900007;/**计算解密文字错误**/public readonly static int COMPUTE_DECRYPT_TEXT_ERROR = 900008;/**计算解密文字长度不匹配**/public readonly static int COMPUTE_DECRYPT_TEXT_LENGTH_ERROR = 900009;/**计算解密文字corpid不匹配**/public readonly static int COMPUTE_DECRYPT_TEXT_CORPID_ERROR = 900010;private static Dictionary<int, String> msgMap = new Dictionary<int, String>();static DingTalkEncryptException(){msgMap[SUCCESS] = "成功";msgMap[ENCRYPTION_PLAINTEXT_ILLEGAL] = "加密明文文本非法";msgMap[ENCRYPTION_TIMESTAMP_ILLEGAL] = "加密时间戳参数非法";msgMap[ENCRYPTION_NONCE_ILLEGAL] = "加密随机字符串参数非法";msgMap[SIGNATURE_NOT_MATCH] = "签名不匹配";msgMap[COMPUTE_SIGNATURE_ERROR] = "签名计算失败";msgMap[AES_KEY_ILLEGAL] = "不合法的aes key";msgMap[COMPUTE_ENCRYPT_TEXT_ERROR] = "计算加密文字错误";msgMap[COMPUTE_DECRYPT_TEXT_ERROR] = "计算解密文字错误";msgMap[COMPUTE_DECRYPT_TEXT_LENGTH_ERROR] = "计算解密文字长度不匹配";msgMap[COMPUTE_DECRYPT_TEXT_CORPID_ERROR] = "计算解密文字corpid不匹配";}private int code;public DingTalkEncryptException(int exceptionCode) : base(msgMap[exceptionCode]){this.code = exceptionCode;}}/** PKCS7算法的加密填充*/public class PKCS7Padding{//private readonly static Charset CHARSET = Charset.forName("utf-8");private readonly static int BLOCK_SIZE = 32;/*** 填充mode字节* @param count* @return*/public static byte[] getPaddingBytes(int count){int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);if (amountToPad == 0){amountToPad = BLOCK_SIZE;}char padChr = chr(amountToPad);String tmp = string.Empty; ;for (int index = 0; index < amountToPad; index++){tmp += padChr;}return System.Text.Encoding.UTF8.GetBytes(tmp);}/*** 移除mode填充字节* @param decrypted* @return*/public static byte[] removePaddingBytes(byte[] decrypted){int pad = (int)decrypted[decrypted.Length - 1];if (pad < 1 || pad > BLOCK_SIZE){pad = 0;}//Array.Copy()var output = new byte[decrypted.Length - pad];Array.Copy(decrypted, output, decrypted.Length - pad);return output;}private static char chr(int a){byte target = (byte)(a & 0xFF);return (char)target;}}/*** 加解密工具类*/public class Utils{/**** @return*/public static String getRandomStr(int count){String baset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";Random random = new Random();StringBuilder sb = new StringBuilder();for (int i = 0; i < count; i++){int number = random.Next(baset.Length);sb.Append(baset[number]);}return sb.ToString();}/** int转byte数组,高位在前*/public static byte[] int2Bytes(int count){byte[] byteArr = new byte[4];byteArr[3] = (byte)(count & 0xFF);byteArr[2] = (byte)(count >> 8 & 0xFF);byteArr[1] = (byte)(count >> 16 & 0xFF);byteArr[0] = (byte)(count >> 24 & 0xFF);return byteArr;}/*** 高位在前bytes数组转int* @param byteArr* @return*/public static int bytes2int(byte[] byteArr){int count = 0;for (int i = 0; i < 4; ++i){count <<= 8;count |= byteArr[i] & 255;}return count;}}public class JavaStringComper : IComparer<string>{public int Compare(string x, string y){return String.Compare(x, y);}}// 测试加解密的正确性public class Program{public static void Main(string[] args){String[] a = new String[] { "1", "W", "t" };var ding = new DingTalkEncryptor("tokenxxxx", "o1w0aum42yaptlz8alnhwikjd3jenzt9cb9wmzptgus", "dingxxxxxx");var msg = ding.getEncryptedMap("success");Console.Out.WriteLine(msg);//msg_signature, $data->timeStamp, $data->nonce, $data->encryptvar text = ding.getDecryptMsg(msg["msg_signature"], msg["timeStamp"], msg["nonce"], msg["encrypt"]);Console.Out.WriteLine(text);// "msg_signature":"c01beb7b06384cf416e04930aed794684aae98c1","encrypt":"","timeStamp":,"nonce":""//{"timeStamp":"1605695694141","msg_signature":"702c953056613f5c7568b79ed134a27bd2dcd8d0",//"encrypt":"","nonce":"WelUQl6bCqcBa2fMc6eI"}text = ding.getDecryptMsg("f36f4ba5337d426c7d4bca0dbcb06b3ddc1388fc", "1605695694141", "WelUQl6bCqcBa2fM", "X1VSe9cTJUMZu60d3kyLYTrBq5578ZRJtteU94wG0Q4Uk6E/wQYeJRIC0/UFW5Wkya1Ihz9oXAdLlyC9TRaqsQ==");Console.Out.WriteLine(text);}}

 public class ApprovalInstanceModel
    {

        //public long Id { set; get; } = 0;
        public string EventType { set; get; }
        public string ProcessInstanceId { set; get; }
        /// <summary>
        /// 企业ID
        /// </summary>
        public string CorpId { set; get; }

        public string Title { set; get; }
        /// <summary>
        /// 审批状态类型
        /// </summary>
        public string Type { set; get; }

        /// <summary>
        /// 审批详情URL
        /// </summary>
        public string Url { set; get; }
        /// <summary>
        /// 审批结果 agree refuse 或为空
        /// </summary>
        public string Result { set; get; }
        /// <summary>
        /// 员工ID
        /// </summary>
        public string StaffId { set; get; }

        /// <summary>
        /// 审批模板code
        /// </summary>
        public string ProcessCode { set; get; }
        public long FinishTime { set; get; } = 0;
        public long CreateTime { set; get; } = 0;

        public DateTime CreateTimeNormal { set; get; }
        public DateTime FinishTimeNormal { set; get; }

  
    }

bpms_instance_change 类型是审批发起与结束时会触发的用来更新我们的微应用单据数据的状态,以及更新时有审批进度的URL,可以关联起来。

好了以上就是审批回调URL的接口内容了。

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

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

相关文章

关于打包css找不到报错

背景&#xff1a;最近公司产品升级为v3项目&#xff0c;打包总是报css缺失 问题&#xff1a;报错提示如下&#xff0c;找不到css 出现原因分析&#xff1a;由于项目比较老&#xff0c;很多人写的&#xff0c;代码风格不统一导致的&#xff0c;比如父组件A使用<style><…

unity【动画】脚本_角色动画控制器 c#

首先创建一个代码文件夹Scripts 从人物角色Player的基类开始 创建IPlayer类 首先我们考虑到如果不挂载MonoBehaviour需要将角色设置成预制体实例化到场景上十分麻烦&#xff0c; 所以我们采用继承MonoBehaviour类的角色基类方法写代码 也就是说这个脚本直接绑定在角色物体…

CSS 背景、文本、字体

CSS背景&#xff1a; CSS背景属性用于定义HTML元素的背景。CSS属性定义背景效果&#xff1a;background-color&#xff1b;background-image&#xff1b;background-repeat&#xff1b;background-attachment&#xff1b;background-position。 background-color属性定义元素…

【验证码系列】Google验证码从数据训练到机器自动识别算法构建

文章目录 1. 写在前面2. CSCI级设计决策2.1. Google验证码突防关联2.2. Google验证码突防行为设计决策 3. Google验证码突防体系结构设计3.1. Google验证码突防部件3.1.2. Google验证码突防组成 3.2. Google验证码突防软件3.2.1. Google验证码突防软件体系结构3.2.2. Google验证…

OpenGauss3.0.0轻量级安装

OpenGauss轻量级安装 官网 # OpenGauss官网 https://opengauss.org/zh/安装网址 mkdir -p opengauss && cd opengauss wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.1.1/x86/openGauss-Lite-3.1.1-CentOS-x86_64.tar.gz tar -zxvf openGauss-Lite-3.…

视频集中存储/云存储EasyCVR启动后查询端口是否被占用出错,该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Java面试题02

1.抽象类必须要有抽象方法吗&#xff1f; 不一定。抽象类可以包含抽象方法&#xff0c;也可以不包含。抽象方法是没有实际实现的方法&#xff0c;需要 在子类中被具体实现。如果一个类中包含了至少一个抽象方法&#xff0c;那么这个类必须声明为抽象类。 2.普通类和抽象类有哪…

2023年亚太杯APMCM数学建模大赛ABC题辅导及组队

2023年亚太杯APMCM数学建模大赛 ABC题 一元线性回归分析类 回归分析&#xff08;Regression Analysis)是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。   – 按涉及变量个数划分   • 一元回归分析   • 多元回归分析   – 按自变量和因变量之间关…

一种单总线串口通信的调试方法

单总线的优点&#xff1a; 节省IO口&#xff0c;发送时可以将单片机的RXD设置为普通IO进行软件模拟发送&#xff0c;发送完设置为串口接收。避免通信干扰&#xff0c;由于是通过IO口对三极管/MOS管进行拉高拉低&#xff0c;外部信号不易对IO口进行干扰&#xff0c;EMI&#xf…

Ubuntu20.0工作区(workspace)介绍,切换工作区方式和快捷键

Ubuntu20.0工作区&#xff08;workspace&#xff09;介绍&#xff0c;切换工作区方式和快捷键 先修改一下ubuntu截屏的快捷键查看工作区新建工作区工作区切换 先修改一下ubuntu截屏的快捷键 修改为 查看工作区 按下Super键&#xff08;即Windows键&#xff09;&#xff0c;可…

解决logstash插件logstash-outputs-mongodb一条数据失败后一直重复尝试

描述 从日志中读取数据时&#xff0c;有一条数据不符合规范&#xff0c;导致logstash读取数据插入时出错&#xff0c;而插件又无限尝试插入&#xff0c;导致堵塞。 解决方案 找到logstash文件夹目录&#xff0c;例如是&#xff1a;/data/logstash-7.3.2 cd /data/logstash-…

新手用mac电脑,对文件的疑问和gpt回应

macOs系统安装软件的疑问 所有问题mac系统文件结构我用mac安装软件&#xff0c;不用像windows一样创建文件夹吗只能安装到Applications文件夹吗安装程序的指南和提供的安装选项是什么软件安装在Applications下的/appName文件夹&#xff0c;它的所有数据都会在该文件夹吗如果卸载…

如何在搜索引擎中应用AI大语言模型,提高企业生产力?

人工智能尤其是大型语言模型的应用&#xff0c;重塑了我们与信息交互的方式&#xff0c;也为企业带来了重大的变革。将基于大模型的检索增强生成&#xff08;RAG&#xff09;集成到业务实践中&#xff0c;不仅是一种趋势&#xff0c;更是一种必要。它有助于实现数据驱动型决策&…

1.性能优化

概述 今日目标&#xff1a; 性能优化的终极目标是什么压力测试压力测试的指标 性能优化的终极目标是什么 用户体验 产品设计(非技术) 系统性能(快&#xff0c;3秒不能更久了) 后端&#xff1a;RT,TPS,并发数 影响因素01&#xff1a;数据库读写&#xff0c;RPC&#xff…

✔ ★【备战实习(面经+项目+算法)】 11.6 学习

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

前端工程化(vue2)

一、环境准备 1.依赖环境&#xff1a;NodeJS 官网&#xff1a;Node.js 2.脚手架&#xff1a;Vue-cli 参考网址&#xff1a;安装 | Vue CLI 介绍&#xff1a;Vue-cli用于快速的生成一个Vue的项目模板。主要功能有&#xff1a;统一的目录结构&#xff0c;本地调试&#xff0…

【一、http】go的http基本请求方法

1、http的基本请求 package mainimport ("bytes""fmt""io""net/http""net/url" )func post(){r, err : http.Post("http://httpbin.org/post", "", nil)if err ! nil {fmt.Println("ss")}de…

嵌入式系统设计与应用---ARM指令集(学习笔记)

目录 本文图片截取自书本和老师的ppt 概述 指令格式 指令的条件码 ARM的寻址方式 立即寻址 寄存器寻址 寄存器间接寻址 寄存器移位寻址 变址寻址 多寄存器寻址 相对寻址 堆栈寻址 块复制寻址 ARM指令集简介 跳转指令 1.B指令 2.BL指令 数据处理指令 1.数据传…

大华同轴电缆低时延监控方案300ms

1.具体的方案如下&#xff1a; 同轴电缆可以最长支持500米&#xff0c;8路视频流&#xff0c;原始视频流 产品型号&#xff1a;DH-HAC-HFW2401M-I1 和 DH/HCVR7104HS-V6 京东的上宣称实时&#xff1a; 2.时延具体参数 找技术厂家咨询了具体的时延参数&#xff0c;厂家说无法…

SQL审计是什么意思?目的是什么?有什么好处?

很多刚入行的运维小伙伴对于SQL审计不是很了解&#xff0c;不知道其是什么意思&#xff1f;使用SQL审计的目的是什么&#xff1f;使用SQL审计的好处有哪些&#xff1f;这里我们大家就来一起聊聊&#xff0c;仅供参考哈&#xff01; SQL审计是什么意思&#xff1f; 【回答】&…