微信网页授权之使用完整服务解决方案

目录

微信网页授权能力调整造成的问题

能力调整的内容和理由

原有运行方案

is_snapshotuser字段 

改造原有方案

如何复现测试场景

小结


微信网页授权能力调整造成的问题

依附于第三方的开发,做为开发者经常会遇到第三方进行规范和开发的调整,如开发腾讯微信的相关应用。我所经历的如小程序隐私政策调整、信息备案调整、微信授权获取个人信息限制调整等。

最近我们的一些项目因为微信页面授权能力的调整出现了一些问题,对于新用户未经授权前,微信开发团队给出的输出是快照页,该页内所获取的openId等均为虚拟账号数据,并在屏幕下方非常不明显的显示“使用完整服务”,如下图所示:

此图即是微信给出的授权提示,也是我们折中的解决方案,图中所示的提示框源自己于我们通过携带的参数反馈给用户的提示,以引导用户点击下方的“使用完整服务”链接,并进行授权。

能力调整的内容和理由

微信团队给出的解释是当开发者在网页中在不规范使用发起 snsapi_userinfo 网页授权时,微信将默认打开网页快照页模式进行基础浏览。

微信网页授权规范

  1. 授权流程需引导清晰、准确:在申请获取用户信息的弹窗出现前,应该清晰、准确地告知用户获取信息的范围及获取信息的目的;
  2. 必要场景申请:在必须获取用户信息时才申请,而不是用户尚未了解服务前就强制弹窗。如使用医院挂号时才需要获取用户信息;
  3. 不强制登录:提供游客模式,供用户了解网页提供的基础服务,不强制用户允许网页获取用户信息后才能使用网页服务。

常见的微信网页授权不规范使用案例

  1. 强制登录:在用户打开网页时立即要求用户授权,用户拒绝后无法使用网页提供的服务;
  2. 违规收集个人信息:未在网页提前告知使用个人信息的目的、方式和范围;
  3. 非必要收集:非必要获取用户信息的网页,如文章、视频等,要求用户在浏览内容前登录;
  4. 差别对待微信用户:同样的网页在浏览器内可以无需登录直接访问,在微信内却要求用户先登录才可访问。

原有运行方案

微信OA2授权访问地址如下(示例url为C#字符串):

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx7964497eb8bad783&redirect_uri=https%3A//www.leadihr.com/weixin/oa2.aspx%3F&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect&connect_redirect = 1

重定向接收地址 OA2.ASPX程序 (C#版本)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using System.Collections;
using System.Net;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using LitJson;
using System.Data;
using System.Data.SqlClient;
using CosysJaneCommonAPI;
using System.Web.Script.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;public partial class oa2 : System.Web.UI.Page
{string Appid = "";string appsecret = "";string domain = "";public class OAuth_Token{public OAuth_Token(){}//access_token  网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同  //expires_in    access_token接口调用凭证超时时间,单位(秒)  //refresh_token 用户刷新access_token  //openid    用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID  //scope 用户授权的作用域,使用逗号(,)分隔  public string access_token { get; set; }public string expires_in { get; set; }public string refresh_token { get; set; }public string openid { get; set; }public string scope { get; set; }}public class OAuthUser{public OAuthUser(){ }#region 数据库字段private string _openID;private string _searchText;private string _unionid;private string _nickname;private string _sex;private string _province;private string _city;private string _country;private string _headimgUrl;
//        private string _privilege;#endregion#region 字段属性/// <summary>  /// 用户的唯一标识  /// </summary>  public string openid{set { _openID = value; }get { return _openID; }}public string SearchText{set { _searchText = value; }get { return _searchText; }}/// <summary>  /// 用户昵称   /// </summary>  public string nickname{set { _nickname = value; }get { return _nickname; }}public string unionid{set { _unionid = value; }get { return _unionid; }}/// <summary>  /// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知   /// </summary>  public string sex{set { _sex = value; }get { return _sex; }}/// <summary>  /// 用户个人资料填写的省份  /// </summary>  public string province{set { _province = value; }get { return _province; }}/// <summary>  /// 普通用户个人资料填写的城市   /// </summary>  public string city{set { _city = value; }get { return _city; }}/// <summary>  /// 国家,如中国为CN   /// </summary>  public string country{set { _country = value; }get { return _country; }}/// <summary>  /// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空  /// </summary>  public string headimgurl{set { _headimgUrl = value; }get { return _headimgUrl; }}/// <summary>  /// 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)其实这个格式称不上JSON,只是个单纯数组  /// </summary>  //public string privilege//{//    set { _privilege = value; }//    get { return _privilege; }//}#endregion}      protected void Page_Load(object sender, EventArgs e)  {if (!IsPostBack)  {if (!string.IsNullOrEmpty(Request.QueryString["code"]))  {  string Code = Request.QueryString["code"].ToString();string State = Request.QueryString["state"].ToString();//获得Token  OAuth_Token Model = Get_token(Code);OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);string content=Model.access_token+ "用户OPENID:" + OAuthUser_Model.openid + "<br>用户昵称:" + OAuthUser_Model.nickname + "<br>性别:" + OAuthUser_Model.sex + "<br>所在省:" + OAuthUser_Model.province + "<br>所在市:" + OAuthUser_Model.city + "<br>所在国家:" + OAuthUser_Model.country + "<br>头像地址:" + OAuthUser_Model.headimgurl + "<br>用户特权信息:";Response.Redirect("https://x.x.com/index.aspx?&oid=" + OAuthUser_Model.openid);}  }  }
public class JsonHelper
{/// <summary>/// 生成Json格式/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static string GetJson<T>(T obj){DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());using (MemoryStream stream = new MemoryStream()){json.WriteObject(stream, obj);string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;}}/// <summary>/// 获取Json的Model/// </summary>/// <typeparam name="T"></typeparam>/// <param name="szJson"></param>/// <returns></returns>public static T ParseFromJson<T>(string szJson){T obj = Activator.CreateInstance<T>();using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson))){DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());return (T)serializer.ReadObject(ms);}}
}  //获得Token  protected OAuth_Token Get_token(string Code)  {  string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code");OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);  return Oauth_Token_Model;  }  //刷新Token  protected OAuth_Token refresh_token(string REFRESH_TOKEN)  {  string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + Appid + "&grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN);  OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);  return Oauth_Token_Model;  }  //获得用户信息  protected OAuthUser Get_UserInfo(string REFRESH_TOKEN, string OPENID)  {  // Response.Write("获得用户信息REFRESH_TOKEN:" + REFRESH_TOKEN + "||OPENID:" + OPENID);  string Str = GetJson("https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID + "&lang=zh_CN");  OAuthUser OAuthUser_Model = JsonHelper.ParseFromJson<OAuthUser>(Str);return OAuthUser_Model;  }  protected string GetJson(string url)  {  WebClient wc = new WebClient();  wc.Credentials = CredentialCache.DefaultCredentials;  wc.Encoding = Encoding.UTF8;string returnText = "";try{returnText = wc.DownloadString(url);}catch (Exception e){Response.Write(e.Message);Response.End();}if (returnText.Contains("errcode"))  {  //可能发生错误  }  //Response.Write(returnText);  return returnText;  }  }

is_snapshotuser字段 

通过code换取网页授权access_token
请求方法是获取code后,请求以下链接获取access_token:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

正确时会返回具有如下图所示的JSON数据包:

因此可能通过判断 is_snapshotuser 字段是否为1,判断是否快照页模式

改造原有方案

主要是增加 string is_snapshotuser = "0" 和后续对JSON返回值的判断,并返回回调的url并携带此参数。示例代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using System.Collections;
using System.Net;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using LitJson;
using System.Data;
using System.Data.SqlClient;
using CosysJaneCommonAPI;
using System.Web.Script.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;public partial class oa2 : System.Web.UI.Page
{string Appid = "";string appsecret = "";string domain = "";string is_snapshotuser = "0";public class OAuth_Token{public OAuth_Token(){}//access_token  网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同  //expires_in    access_token接口调用凭证超时时间,单位(秒)  //refresh_token 用户刷新access_token  //openid    用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID  //scope 用户授权的作用域,使用逗号(,)分隔  public string access_token { get; set; }public string expires_in { get; set; }public string refresh_token { get; set; }public string openid { get; set; }public string scope { get; set; }}public class OAuthUser{public OAuthUser(){ }#region 数据库字段private string _openID;private string _searchText;private string _unionid;private string _nickname;private string _sex;private string _province;private string _city;private string _country;private string _headimgUrl;
//        private string _privilege;#endregion#region 字段属性/// <summary>  /// 用户的唯一标识  /// </summary>  public string openid{set { _openID = value; }get { return _openID; }}public string SearchText{set { _searchText = value; }get { return _searchText; }}/// <summary>  /// 用户昵称   /// </summary>  public string nickname{set { _nickname = value; }get { return _nickname; }}public string unionid{set { _unionid = value; }get { return _unionid; }}/// <summary>  /// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知   /// </summary>  public string sex{set { _sex = value; }get { return _sex; }}/// <summary>  /// 用户个人资料填写的省份  /// </summary>  public string province{set { _province = value; }get { return _province; }}/// <summary>  /// 普通用户个人资料填写的城市   /// </summary>  public string city{set { _city = value; }get { return _city; }}/// <summary>  /// 国家,如中国为CN   /// </summary>  public string country{set { _country = value; }get { return _country; }}/// <summary>  /// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空  /// </summary>  public string headimgurl{set { _headimgUrl = value; }get { return _headimgUrl; }}/// <summary>  /// 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)其实这个格式称不上JSON,只是个单纯数组  /// </summary>  //public string privilege//{//    set { _privilege = value; }//    get { return _privilege; }//}#endregion}      protected void Page_Load(object sender, EventArgs e)  {if (!IsPostBack)  {if (!string.IsNullOrEmpty(Request.QueryString["code"]))  {  string Code = Request.QueryString["code"].ToString();string State = Request.QueryString["state"].ToString();//获得Token  OAuth_Token Model = Get_token(Code);OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);string content=Model.access_token+ "用户OPENID:" + OAuthUser_Model.openid + "<br>用户昵称:" + OAuthUser_Model.nickname + "<br>性别:" + OAuthUser_Model.sex + "<br>所在省:" + OAuthUser_Model.province + "<br>所在市:" + OAuthUser_Model.city + "<br>所在国家:" + OAuthUser_Model.country + "<br>头像地址:" + OAuthUser_Model.headimgurl + "<br>用户特权信息:";Response.Redirect("https://x.x.com/index.aspx?&oid=" + OAuthUser_Model.openid+"&is_snapshotuser="+is_snapshotuser);}  }  }
public class JsonHelper
{/// <summary>/// 生成Json格式/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static string GetJson<T>(T obj){DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());using (MemoryStream stream = new MemoryStream()){json.WriteObject(stream, obj);string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;}}/// <summary>/// 获取Json的Model/// </summary>/// <typeparam name="T"></typeparam>/// <param name="szJson"></param>/// <returns></returns>public static T ParseFromJson<T>(string szJson){T obj = Activator.CreateInstance<T>();using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson))){DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());return (T)serializer.ReadObject(ms);}}
}  //获得Token  protected OAuth_Token Get_token(string Code)  {  string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code");if (Str.IndexOf("\"is_snapshotuser\":1") != -1||Str.IndexOf("\"is_snapshotuser\": 1")!=-1){is_snapshotuser = "1";}OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);  return Oauth_Token_Model;  }  //刷新Token  protected OAuth_Token refresh_token(string REFRESH_TOKEN)  {  string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + Appid + "&grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN);  OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);  return Oauth_Token_Model;  }  //获得用户信息  protected OAuthUser Get_UserInfo(string REFRESH_TOKEN, string OPENID)  {  // Response.Write("获得用户信息REFRESH_TOKEN:" + REFRESH_TOKEN + "||OPENID:" + OPENID);  string Str = GetJson("https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID + "&lang=zh_CN");  OAuthUser OAuthUser_Model = JsonHelper.ParseFromJson<OAuthUser>(Str);return OAuthUser_Model;  }  protected string GetJson(string url)  {  WebClient wc = new WebClient();  wc.Credentials = CredentialCache.DefaultCredentials;  wc.Encoding = Encoding.UTF8;string returnText = "";try{returnText = wc.DownloadString(url);}catch (Exception e){Response.Write(e.Message);Response.End();}if (returnText.Contains("errcode"))  {  //可能发生错误  }  //Response.Write(returnText);  return returnText;  }  }

这样可以在业务页面,如上述代码中的index.aspx进行如下判断:

if (Request.QueryString["is_snapshotuser"] == "1")
{Layer.open("使用前微信要求您的授权,请点击下方使用完整服务后继续...", "'确定'", "info");return;
}

如何复现测试场景

已经授权的用户,如果想测试重新授权的场景,请打开微信,依如下步骤进行设置:

 

 

 

 

小结

以上示例是一种较小改动的解决方案,个人比较习惯于应用程序稳定性第一的思路。如果已经使用新规则设计方案则可仅供参考。

另外在此介绍一下关于网页授权的两种scope的区别:
1、以snsapi_base为scope发起的网页授权,可以直接获取进入页面的用户的openid,且是静默授权并自动跳转到业务页面。
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。需要用户手动同意,无须关注,就可在授权后获取该用户的基本信息。

以上是个人的一些观点和解决方案,感谢阅读,并提出指正。

 

 

 

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

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

相关文章

【EI会议征稿通知】2024年材料物理与复合材料国际学术会议

2024年材料物理与复合材料国际学术会议 2024 International Conference on Materials Physics and Composites(ICMPC 2024) 2024年材料物理与复合材料国际学术会&#xff08;ICMPC 2024&#xff09;将于2024年5月24-26日在中国成都举行。ICMPC 2024将吸引顶尖的研究人员和从业…

Python flask 模板详解

文章目录 1 概述1.1 模板简介1.2 templates 文件1.3 简单应用 2 模板语法2.1 for 循环2.2 if 判断 3 模板的继承3.1 格式要求3.2 实现示例3.3 复用父模板的内容&#xff1a;super 1 概述 1.1 模板简介 定义&#xff1a;定义好的 html 文件&#xff0c;用于快速开发 web 页面J…

android tv开发-1,leanback 2

目录 presenter太多,如何理清关系 动画与点击 tv的登录与设置 搜索功能 带二级菜单的页面 presenter太多,如何理清关系 leanback里面已经定义好了adapter与presenter,直接继承它就可以了 private DefaultObjectAdapter mVideoAdapter; private VideoCardPresenter mCardP…

【不单调的代码】还在嫌弃Ubuntu终端?快来试试做些Ubuntu终端的花式玩法。

&#x1f38a;专栏【不单调的代码】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Love Story】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 注意&#xff1a; 本文是在Ubuntu环境下进…

Unity中blendtree和state间的过渡

混合树状态之间的过渡 如果属于此过渡的当前状态或下一状态是混合树状态&#xff0c;则混合树参数将出现在 Inspector 中。通过调整这些值可预览在混合树值设置为不同配置时的过渡表现情况。 如果混合树包含不同长度的剪辑&#xff0c;您应该测试在显示短剪辑和长剪辑时的过渡表…

明道云入选亿欧智库《AIGC入局与低代码产品市场的发展研究》

2023年12月27日&#xff0c;亿欧智库正式发布**《AIGC入局与低代码产品市场的发展研究》**。该报告剖析了低代码/零代码市场的现状和发展趋势&#xff0c;深入探讨了大模型技术对此领域的影响和发展洞察。其中&#xff0c;亿欧智库将明道云作为标杆产品进行了研究和分析。 明…

指针的学习2

目录 数组名的理解 使用指针访问数组 一维数组传参的本质 冒泡排序 二级指针 指针数组 指针数组模拟二维数组 数组名的理解 数组名是数组首元素的地址 例外&#xff1a; sizeof(数组名),sizeof中单独放数组名&#xff0c;这里的数组名表示整个数组&#xff0c;计算的…

Day11代码随想录

Day11 20. 有效的括号 力扣题目链接(opens new window) 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右…

mac如何实现升级node版本、切换node版本

一、 查看node所有版本&#xff08;前提:安装了nodejs&#xff09; npm view node versions二、安装指定node版本 sudo n 版本号三、检查目前安装了哪些版本的node&#xff0c;会出现已安装的node版本 n四、切换已安装的node版本 sudo n 版本号其他命令 1、sudo npm cache…

PyTorch 2.2 中文官方教程(十六)

介绍 torch.compile 原文&#xff1a;pytorch.org/tutorials/intermediate/torch_compile_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整的示例代码 作者: William Wen torch.compile是加速 PyTorch 代码的最新方法&#xff0…

Git快速入门+常用指令+提交规范

目录 Git创建本地仓库 IDEA集成Git Git和IDEA连接使用2 忽略文件 本地仓库常用命令 远程仓库常用命令 分支常用命令 标签操作 提交规范 Git创建本地仓库 1、创建一个文件夹&#xff0c;右键选择Git Bash Here 2、选择下列其中一个方法 方法一&#xff1a;创建初始化…

结构化/非结构化数据的介绍常用的结构化对象存储服务

一. MinIO的简介&#xff1a; 1.1 Minlo 介绍&#xff1a; Minlo 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等…

详解为什么现在的 LLMs 大都是 Decoder-only 的架构

首先概述几种主要的架构: Encoder-only:以谷歌的 BERT 为代表。 Encoder-Decoder:以谷歌的 T5、Meta 的 BART 为代表。 基于自回归空白填充的通用语言模型:清华大学的 GLM。 XLNet:XLNet 在那时是一种通用的自回归预训练方法。通过最大化所有可能的因式分解排列的对数似然…

鸡数题! - 组合数学 + 第二类斯特林数

题面 分析 第二类斯特林数 将每一位1看作球&#xff0c;元素看作盒子&#xff0c;直接计算。 代码 #include <bits/stdc.h>using namespace std; using ll long long;const int N 1e5 10; const int mod 1e9 7;int fact[N], infact[N];int qmi(int a, int b, in…

一篇文章了解区分指针数组,数组指针,函数指针,链表。

最近在学习指针&#xff0c;发现指针有这许多的知识&#xff0c;其中的奥妙还很多&#xff0c;需要学习的也很多&#xff0c;今天那我就将标题中的有关指针知识&#xff0c;即指针数组&#xff0c;数组指针&#xff0c;函数指针&#xff0c;给捋清楚这些知识点&#xff0c;区分…

深度解析Go字符串

Go语言中的字符串是一种不可变的字节序列&#xff0c;它在编程中扮演着重要的角色。接下来将深入探讨Go字符串的基本概念、常见操作、性能优化&#xff0c;以及最佳实践&#xff0c;旨在帮助大家更好地理解和利用Go语言中的字符串。 1. 字符串的基本概念 1.1 字符串的表示 在…

react native错误记录

第一次运行到安卓失败 Could not find implementation class com.facebook.react.ReactRootProjectPlugin for plugin com.facebook.react.rootproject specified in jar:file:/D:/Android_Studio_Data/.gradle/caches/jars-9/o_3a1fd35320f05989063e7069031b710f/react-nativ…

[碎碎念]全篇都是碎碎念,就不要点进来了~

去年九月份入职了新公司,本准备大干一场,结果没想到十一月公司被收购,随之而来的就是裁员 被裁之后索性就不打算找工作了,给自己一年的时间,去做点自己喜欢的事情 至于做什么还没想好,至于一年之后能不能做出来什么也不知道,一切都是不确定,一切都是未知 不过也正是如此,生活才…

综合布线技术(复习)

一、 我国在20世纪80年代末期开始引入综合布线系统&#xff0c;90年代中后期得到迅速发展 综合布线系统是建筑群或建筑物内的传输网络系统&#xff0c;他能使语音和数据通信设备、交换设备和其他信息管理系统彼此相连接 综合布线系统国家标准主要有&#xff1a;GB 5031-2016…

LabVIEW智能温度直流模件自动测试系统

LabVIEW智能温度直流模件自动测试系统 自动化测试系统在提高测试效率和准确性方面发挥着越来越重要的作用。介绍了一种基于LabVIEW的智能温度直流模件&#xff08;TDCA&#xff09;自动测试系统的设计与实施&#xff0c;旨在提高测控装置的产品质量。 系统的硬件平台主要由PS…