最新要闻
- 世界观热点:国人不再迷信日本车 日产2022年累计销量105万:同比暴跌超1/5
- 当前热讯:又见白菜价 梅捷2TB SSD硬盘到手554元(每GB不到3毛)
- HTC Vive XR眼镜发布:双2K屏、配有可拆卸电池
- 最资讯丨四川一地再现土坑酸菜 工人用脚踩 网友无奈:眼不见为净
- 每日视讯:Redmi K60/K60 Pro对比拆解:做工用料良心!性价比刚刚的
- 当前滚动:三亚民宿老板称一个月赚回三年亏损:20万一晚酒店已售罄
- 焦点关注:谁说微星不做AMD显卡了!RX 7900终于亮相 只是有点敷衍
- 天天快播:红魔8 Pro系列即将再次开卖:3999元起 首销曾被抢购一空
- 云南发现2.44亿年前“奇异罗平龙”化石:身长超半米 像蜥蜴
- 马化腾服不服?李彦宏:百度研发强度、投入国内最牛 比腾讯高
- 每日视讯:比亚迪仰望:那年我翻山跨海 横扫车圈无对手
- 信息:联想Yoga Book 9i双屏笔记本发布:两块13寸2.8K触摸屏
- 当前视讯!AMD锐龙7000智酷版上架!6核不过1549元 可能有惊喜
- 天天观焦点:女子吐槽智能电视会员乱象:看什么都收费
- 环球速递!国产秀肌肉!全球首款8K激光电视来了:海信打造、画质细数毛
- 世界观察:《阿凡达2》接招!国产科幻大片走出国门 《流浪地球2》将在澳新上映
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录--微信调用jssdk全流程详解
【资料图】
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
微信调用jssdk全流程详解
系统框架使用的是前后端分离,前端使用vant,后端是springboot
一、网页授权的时序图
二、公众号配置
1. 绑定域名
登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。也就是这样:
点击设置之后,弹出这样一个输入框,输入服务器所在的域名:
2:引入js文件
直接在你的页面里引入js文件就行
<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
三、前端方法
1. 初始化方法,从后台获取基本的参数
前端进入需要扫一扫功能的页面时候,在mounted方法里面,执行微信配置getWxConfig(),此方法主要是获取jssdk所需要的参数,先检查本地缓存的是否过期,过期则请求后台获取
export function getWxConfig() { //判断signature是否过期 if (expireSign()) { let data = {}; data.appId = localStorage.getItem("appId"); data.timestamp = localStorage.getItem("timestamp"); data.nonceStr = localStorage.getItem("nonceStr"); data.signature = localStorage.getItem("signature"); setWxConfig(data); } else { //如果过期了,请求后台获取 let url = location.href.split("#")[0]; //获取锚点之前的链接,防止出现invalid signature错误 wxSign({ url: url }) .then(res => { console.log(res); if (res.code == 200) { localStorage.setItem("appId", res.data.appId); localStorage.setItem("timestamp", res.data.timestamp); localStorage.setItem("nonceStr", res.data.nonceStr); localStorage.setItem("signature", res.data.signature); localStorage.setItem("expireSignTime", res.data.expireTime); setWxConfig(res.data); } else { localStorage.removeItem("expireSignTime"); Toast.fail("网络故障,请退出重新加载页面"); } }) .catch(error => { localStorage.removeItem("expireSignTime"); Toast.fail("网络故障,请退出重新加载页面"); }); }}
2:注入config配置
上面获取到后台的参数后,在页面使用wx.config接口注入权限验证配置
function setWxConfig(data) { console.log(data); wx.config({ debug: false, // true是开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: data.appId, // 必填,公众号的唯一标识 timestamp: data.timestamp, // 必填,签名的时间戳,后台生成的 nonceStr: data.nonceStr, // 必填,签名的随机串,后台生成的 signature: data.signature, // 必填,签名,后台生成的 jsApiList: ["scanQRCode"] // 必填,需要使用的JS接口列表,scanQRCode是调用扫一扫二维码 }); wx.error(function(res) { localStorage.removeItem("expireSignTime"); Toast.fail("网络故障,请退出重新页面"); });}
3. 方法调用
config如果不报错,则在 wx.ready里面调用jssdk的方法
wx.ready(function () { wx.scanQRCode({ needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果 success: function (res) { let data = res.resultStr; // 当needResult 为 1 时,扫码返回的结果 let code = codeFormat(data); that.pointCode = code; that.saveSinglePoint(); }, }); });
四、后端方法
1. 获取access_token和jsapi_Ticket,缓存使用了文件的方式,也支持redis等方式
/** * 获取access_token和jsapi_ticket **/public AppWechatEntity getJsapiTicket() { //logger.debug("--------------开始执行getJsapiTicket方法--------------"); //定义过期时间 AppWechatEntity appWechatEntity = new AppWechatEntity(); String accessTokenString = ""; String jsapiTicketString = ""; String jsapi_ticket = ""; String access_token = ""; jsapiTicketString = readWechatTokenFile(getJsapiTicketFilePath()); if (!StringUtils.isEmpty(jsapiTicketString)) { appWechatEntity = JSONObject.parseObject(jsapiTicketString, AppWechatEntity.class); long expireTime = appWechatEntity.getExpire_time(); long curTime = create_timestamp(); if (expireTime >= curTime && StrUtil.isNotEmpty(appWechatEntity.getJsapi_ticket())) { //logger.debug("已有的jsapi_ticket=" + jsapi_ticket); return appWechatEntity; } } long timestamp = create_timestamp() + 7000;//过期时间是2小时(7200s) access_token = getAccessTokenData("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + configBeanValue.appid + "&secret=" + configBeanValue.secret); Map accessTokenMap = new HashMap(); accessTokenMap.put("expire_time", timestamp); accessTokenMap.put("access_token", access_token); accessTokenString = JSONObject.toJSONString(accessTokenMap); jsapi_ticket = getJsapiTicketData("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi"); Map jsapiTicketMap = new HashMap(); jsapiTicketMap.put("expire_time", timestamp); jsapiTicketMap.put("jsapi_ticket", jsapi_ticket); jsapiTicketString = JSONObject.toJSONString(jsapiTicketMap); // 写文件 try { FileUtils.writeStringToFile(new File(getAccessTokenFilePath()), accessTokenString, CharsetUtil.CHARSET_UTF_8); FileUtils.writeStringToFile(new File(getJsapiTicketFilePath()), jsapiTicketString, CharsetUtil.CHARSET_UTF_8); //logger.debug("写入文件成功"); } catch (IOException e) { log.debug("写文件异常:" + e.getMessage()); e.printStackTrace(); } appWechatEntity.setJsapi_ticket(jsapi_ticket); appWechatEntity.setExpire_time(timestamp); appWechatEntity.setAccess_token(access_token); //logger.debug("--------------结束执行getJsapiTicket方法--------------"); return appWechatEntity;}
2.根据jsapi_ticket获取signature
上面获取了jsapi_ticket之后,使用jsapi_ticket,noncestr,timestamp和前端传入的url组装成签名字符串,使用sha1进行加密,返回到前端
/** * 生成signature **/@Overridepublic AppWechatEntity sign(String url) { Mapret = new HashMap(); String nonceStr = create_nonce_str(); String timestamp = Long.toString(create_timestamp()); String string1; String signature = ""; //获取jsapi_ticket和过期时间 AppWechatEntity appWechatEntity = getJsapiTicket(); String jsapiTicket = appWechatEntity.getJsapi_ticket(); Long expireTime = appWechatEntity.getExpire_time(); //注意这里参数名必须全部小写,且必须有序 string1 = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url; try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(string1.getBytes(StandardCharsets.UTF_8)); signature = byteToHex(crypt.digest()); } catch (Exception e) { e.printStackTrace(); } appWechatEntity.setAppId(configBeanValue.appid); appWechatEntity.setExpire_time(expireTime); appWechatEntity.setNonceStr(nonceStr); appWechatEntity.setTimestamp(timestamp); appWechatEntity.setSignature(signature); return appWechatEntity;}
3. 后端全部的代码
/** * 生成signature **/ @Override public AppWechatEntity sign(String url) { Mapret = new HashMap(); String nonceStr = create_nonce_str(); String timestamp = Long.toString(create_timestamp()); String string1; String signature = ""; //获取jsapi_ticket和过期时间 AppWechatEntity appWechatEntity = getJsapiTicket(); String jsapiTicket = appWechatEntity.getJsapi_ticket(); Long expireTime = appWechatEntity.getExpire_time(); //注意这里参数名必须全部小写,且必须有序 string1 = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url; try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(string1.getBytes(StandardCharsets.UTF_8)); signature = byteToHex(crypt.digest()); } catch (Exception e) { e.printStackTrace(); } appWechatEntity.setAppId(configBeanValue.appid); appWechatEntity.setExpire_time(expireTime); appWechatEntity.setNonceStr(nonceStr); appWechatEntity.setTimestamp(timestamp); appWechatEntity.setSignature(signature); return appWechatEntity; } /** * 获取jsapi_ticket **/ public AppWechatEntity getJsapiTicket() { //logger.debug("--------------开始执行getJsapiTicket方法--------------"); //定义过期时间 AppWechatEntity appWechatEntity = new AppWechatEntity(); String accessTokenString = ""; String jsapiTicketString = ""; String jsapi_ticket = ""; String access_token = ""; jsapiTicketString = readWechatTokenFile(getJsapiTicketFilePath()); if (!StringUtils.isEmpty(jsapiTicketString)) { appWechatEntity = JSONObject.parseObject(jsapiTicketString, AppWechatEntity.class); long expireTime = appWechatEntity.getExpire_time(); long curTime = create_timestamp(); if (expireTime >= curTime && StrUtil.isNotEmpty(appWechatEntity.getJsapi_ticket())) { //logger.debug("已有的jsapi_ticket=" + jsapi_ticket); return appWechatEntity; } } long timestamp = create_timestamp() + 7000;//过期时间是2小时(7200s) access_token = getAccessTokenData("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + configBeanValue.appid + "&secret=" + configBeanValue.secret); Map accessTokenMap = new HashMap(); accessTokenMap.put("expire_time", timestamp); accessTokenMap.put("access_token", access_token); accessTokenString = JSONObject.toJSONString(accessTokenMap); jsapi_ticket = getJsapiTicketData("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi"); Map jsapiTicketMap = new HashMap(); jsapiTicketMap.put("expire_time", timestamp); jsapiTicketMap.put("jsapi_ticket", jsapi_ticket); jsapiTicketString = JSONObject.toJSONString(jsapiTicketMap); // 写文件 try { FileUtils.writeStringToFile(new File(getAccessTokenFilePath()), accessTokenString, CharsetUtil.CHARSET_UTF_8); FileUtils.writeStringToFile(new File(getJsapiTicketFilePath()), jsapiTicketString, CharsetUtil.CHARSET_UTF_8); //logger.debug("写入文件成功"); } catch (IOException e) { log.debug("写文件异常:" + e.getMessage()); e.printStackTrace(); } appWechatEntity.setJsapi_ticket(jsapi_ticket); appWechatEntity.setExpire_time(timestamp); appWechatEntity.setAccess_token(access_token); //logger.debug("--------------结束执行getJsapiTicket方法--------------"); return appWechatEntity; } public String getAccessToken() { //logger.debug("--------------开始执行getAccessToken方法--------------"); String access_token = ""; String accessTokenString = ""; AppWechatEntity appWechatEntity = new AppWechatEntity(); accessTokenString = readWechatTokenFile(getAccessTokenFilePath()); if (StringUtils.isNotEmpty(accessTokenString)) { appWechatEntity = JSONObject.parseObject(accessTokenString, AppWechatEntity.class); access_token = appWechatEntity.getAccess_token(); long expireTime = appWechatEntity.getExpire_time(); long curTime = create_timestamp(); if (expireTime >= curTime) { //logger.debug("已有的access_token=" + access_token); return access_token; } } long timestamp = create_timestamp() + 6000;//过期时间是2小时,但是可以提前进行更新,防止前端正好过期 access_token = getAccessTokenData("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + configBeanValue.appid + "&secret=" + configBeanValue.secret); Map accessTokenMap = new HashMap(); accessTokenMap.put("expire_time", timestamp); accessTokenMap.put("access_token", access_token); accessTokenString = JSONObject.toJSONString(accessTokenMap); // 写文件 try { FileUtils.writeStringToFile(new File(getAccessTokenFilePath()), accessTokenString, CharsetUtil.CHARSET_UTF_8); //logger.debug("写入文件成功"); } catch (IOException e) { log.debug("写文件异常:" + e.getMessage()); e.printStackTrace(); } //logger.debug("新的access_token=" + access_token); //logger.debug("--------------结束执行getAccessToken方法--------------"); return access_token; } private String readWechatTokenFile(String filePath) { String content = ""; try { if (new File(filePath).exists()) { FileReader fileReader = new FileReader(filePath, CharsetUtil.CHARSET_UTF_8); content = fileReader.readString(); } else { new File(filePath).createNewFile(); } } catch (IOException e) { log.error("读文件异常:" + e.getMessage()); e.printStackTrace(); } return content; } private String getAccessTokenData(String url) { String str = ""; String result = HttpUtil.get(url, CharsetUtil.CHARSET_UTF_8); if (StringUtils.isBlank(result)) return str; str = parseData("access_token", "expires_in", result); return str; } private String getJsapiTicketData(String url) { String str = ""; String result = HttpUtil.get(url, CharsetUtil.CHARSET_UTF_8); if (StringUtils.isBlank(result)) return str; str = parseData("ticket", "expires_in", result); return str; } private String parseData(String tokenName, String expiresInName, String data) { String tokenConent = ""; JSONObject jsonObject = JSONObject.parseObject(data); try { tokenConent = jsonObject.get(tokenName).toString(); if (StringUtils.isEmpty(tokenConent)) { log.error("token获取失败,获取结果" + data); return tokenConent; } } catch (Exception e) { log.error("token 结果解析失败,token参数名称: " + tokenName + "有效期参数名称:" + expiresInName + "token请求结果:" + data); e.printStackTrace(); return tokenConent; } return tokenConent; } private String byteToHex(final byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; } private String create_nonce_str() { return IdUtil.simpleUUID(); } private Long create_timestamp() { return System.currentTimeMillis() / 1000; } private String getJsapiTicketFilePath() { return configBeanValue.tokenpath + "/" + configBeanValue.appid + "_jsapiTicket.txt"; } private String getAccessTokenFilePath() { return configBeanValue.tokenpath + "/" + configBeanValue.appid + "_accessToken.txt"; }
五.vue weixin-js-sdk进行微信分享
第一步:安装weixin-js-sdk
npm install weixin-js-sdk
第二步:
在assets文件下新建个common文件夹,然后再新建个utils.js文件
import wx from "weixin-js-sdk"; /** 微信分享* 获取微信加签信息* @param{data}:获取的微信加签* @param{shareData}:分享配置参数*/export const wexinShare = (data, shareData) => {let appId = data.appId;let timestamp = data.timestamp;let nonceStr = data.nonceStr;let signature = data.signature;wx.config({debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: appId, // 必填,公众号的唯一标识timestamp: timestamp, // 必填,生成签名的时间戳nonceStr: nonceStr, // 必填,生成签名的随机串signature: signature, // 必填,签名,见附录1jsApiList: ["updateAppMessageShareData", "updateTimelineShareData"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2});wx.ready(function () {//分享到朋友圈”及“分享到QQ空间”wx.updateTimelineShareData({title: shareData.title, // 分享标题link: shareData.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: shareData.imgUrl, // 分享图标success: function (res) {// 设置成功// console.log("分享成功返回的信息为:", res);}}) //“分享给朋友”及“分享到QQ”wx.updateAppMessageShareData({title: shareData.title, // 分享标题desc: shareData.desc, // 分享描述link: shareData.link, // 分享链接imgUrl: shareData.imgUrl, // 分享图标success: function (res) {// console.log("分享成功返回的信息为:", res);;}}) });wx.error(function (res) {// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。console.log("验证失败返回的信息:", res);});}
第三步:调用
import {wexinShare} from "@/common/utils.js";
//请求微信配置参数接口(获取签名),由后台给接口给get_share(){ var that = this; var urls = that.$qs.stringify(window.location.href.split("#")[0]); //看后台请求接口是get/post that.$axios.post("/xxx",urls).then((res) => { if (res.data) { //微信加签 var obj = { appId: res.data.appId, nonceStr: res.data.nonceStr, signature: res.data.signature, timestamp: res.data.timestamp } //分享数据,这段主要是为了在hash模式下分享出去的链接不被浏览器截取,保证完全把链接分享出去 var shareWxLink = window.location.href.split("#")[0] + "static/redirect.html?redirect=" + encodeURIComponent(window.location.href) + "&pid_uid=" + userinfo.uid; // console.log("shareWxLink", shareWxLink) let shareData = { title: "标题", // 分享标题 link: shareWxLink, imgUrl: "http://xxx.jpg", // 分享图标 desc: "这里填写简介文字" } //引用 wexinShare(obj, that, shareData); } else { that.$toast("获取sdk参数失败!"); } }) }
本文转载于:
https://blog.csdn.net/m0_56961433/article/details/116135543
https://blog.csdn.net/u014678583/article/details/106024611
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
记录--微信调用jssdk全流程详解
最新:LaTeX 进阶语法
世界观热点:国人不再迷信日本车 日产2022年累计销量105万:同比暴跌超1/5
当前热讯:又见白菜价 梅捷2TB SSD硬盘到手554元(每GB不到3毛)
HTC Vive XR眼镜发布:双2K屏、配有可拆卸电池
最资讯丨四川一地再现土坑酸菜 工人用脚踩 网友无奈:眼不见为净
每日视讯:Redmi K60/K60 Pro对比拆解:做工用料良心!性价比刚刚的
【吐槽贴】项目经理的进阶日常:项目要收尾了,我却慌了
当前滚动:三亚民宿老板称一个月赚回三年亏损:20万一晚酒店已售罄
焦点关注:谁说微星不做AMD显卡了!RX 7900终于亮相 只是有点敷衍
天天快播:红魔8 Pro系列即将再次开卖:3999元起 首销曾被抢购一空
云南发现2.44亿年前“奇异罗平龙”化石:身长超半米 像蜥蜴
马化腾服不服?李彦宏:百度研发强度、投入国内最牛 比腾讯高
通讯!Git管理版本详细教程
世界快播:手工实现一个ORM小框架
【天天播资讯】AIRIOT答疑第5期|如何使用低代码业务流引擎?
亲测有效! Bypass V1.15.5 12306分流抢票助手 for Windows
每日视讯:比亚迪仰望:那年我翻山跨海 横扫车圈无对手
信息:联想Yoga Book 9i双屏笔记本发布:两块13寸2.8K触摸屏
当前视讯!AMD锐龙7000智酷版上架!6核不过1549元 可能有惊喜
天天观焦点:女子吐槽智能电视会员乱象:看什么都收费
环球速递!国产秀肌肉!全球首款8K激光电视来了:海信打造、画质细数毛
【世界快播报】保存用户登录状态之Session和JWT
【世界热闻】three.js场景地形导出到物理引擎
网站变更检测、监控、警报丨WebSite-Watcher功能简介
基于Python的K-Means遥感影像聚类
苹果iOS app上架流程
世界观察:《阿凡达2》接招!国产科幻大片走出国门 《流浪地球2》将在澳新上映
消息!特斯拉国产车型大幅降价 副总裁陶琳回应:坚持以成本定价
Win11 2023开年更新Build 25272发布:干掉中文版大BUG!更加流畅稳定
特斯拉降价 网友翻出蔚来李斌2年前视频:价格稳定是对用户负责
天天新消息丨智能电视视频会员一充再充!体验太差了
全球即时:gget: 一款强大的基因组参考数据库的高效查询工具
学习笔记——过滤器链;监听器;Servlet、Filter、Listener的注解方式开发
Model 3要破20万节奏!特斯拉国产车型大幅降价 老车主晒图被割韭菜
redhat 9.1 安装docker
天天通讯!nginx: [error] CreateFile() “D:\nginx1.20.1/logs/nginx.pid“ failed (2: The
学习笔记——过滤器的匹配规则
国产特斯拉大幅降价被业内看好 带火供应链:大批概念股飞涨
【天天播资讯】特斯拉 2023第一个交易日:市值缩水一个推特
天天播报:CDPR赔偿1267万!《赛博朋克2077》集体诉讼案终于告一段落
当前热点-汽车博主为小米汽车打抱不平:部分媒体只会道听途说
北斗授时产品(GPS北斗授时设备)加NTP时间服务器设计思路
世界最资讯丨学习笔记——过滤器、过滤器的HelloWord、过滤器生命周期
【全球新要闻】A. Greatest Convex【Codeforces Round #842 (Div. 2)】
【天天速看料】如何安全的保存用户密码
焦点热讯:灵雀云入选2022 EDGE AWARDS「创新场景50」年度最佳场景实践榜单
全球播报:联想ThinkPhone真机亮相:经典ThinkPad涂装抢眼
【世界独家】恒驰5首次OTA升级来了!低温续航性能提升
当前消息!超越日本!印度成全球第三大汽车市场 平均千人36辆
吴京参演 《中国乒乓之绝地反击》定档大年初一:春节档已有7部新片
男子和白骆驼合影被攻击!专家提醒:骆驼战斗力惊人
环球热文:使用python编写端口扫描工具
QFramework v1.0 使用指南 工具篇:15. 补充内容:GridKit 二维格子数据结构
速读:【从零开始学爬虫】采集食品行业最新报价数据
Redmi 12C支持内存扩展:4GB内存手机瞬间变6GB 699元性价比更高了
全球消息!RTX 4050加持!联想发布Yoga AIO 9i一体机:设计惊艳
国产车型大降价 新款特斯拉Model X/S售价公布:超100万
【焦点热闻】小米13被低估了!网友没想到小米13相机能有这么大惊喜
天天日报丨三件套抄底:李锦记锦珍大桶生抽+金蚝油+黄豆酱 19.6元
每日热闻!数据结构:ST表 学习笔记
快资讯:ESP32 I2C 总线主模式通信程序
天天观点:创新的概念、设计和生产鞋类和鞋类软件丨Jevero及Botcha 3D功能简介
学习笔记——书城项目第五阶段之购物车数量的修改、精度问题的处理
世界观速讯丨《人民日报》炮轰手机预装应用不能删:占内存、鸡肋、广告满天飞
【当前热闻】240W闪充卷王!真我GT Neo5即将登场:有两种版本
全球动态:TCL华星宣布品牌形象升级:全新Logo正式上线
12月汽车投诉榜:丰田包揽前三甲 踩的同一个“坑”
世界快资讯:PS5主机千万别再长期竖向放置了!维修人士:会导致APU液金泄露 造成永久损坏
当前关注:阿汤哥驾F14爽片《壮志凌云2》惜败!《阿凡达2》成2022年票房冠军 赢麻
快资讯丨回顾2022
全球简讯:春节放假7天要调休!除夕火车票明日开抢
骁龙8 Gen2首发!高通正式推出卫星通信:3秒发出信息、可实现双向收发
每日视讯:Intel怕吗!AMD锐龙7000史上最强核显 这性能不得了
好用的工具
世界最资讯丨Python中的注释和input函数的使用
世界视讯!被骗好久!宰相刘罗锅真的是一个罗锅吗?1.9米帅男一枚
环球视讯!5位退役也未曾飞天的航天员首次公开!他们也是英雄
天天精选!在我电脑里 这是唯一的一个360产品
存款贬值快一半!土耳其人把游戏当成了救命稻草
顺序结构及if选择结构
环球今亮点!左偏树 学习笔记
亲测有效! Scrutiny 网站SEO检测及优化工具 V12.6.1 for mac
全球聚焦:创建型模式——前言
continue跳過循環(skippaart程序),接受設定的合法分數來進行平均分求值,并展現最高分,最低分
AMD锐龙7000 3D版暴力堆料144MB缓存 微软神助攻:Win11专属优化
【环球新视野】大疆2022年之最:有人每天飞5小时 有人一年飞了3万公里
正点原子FSMC控制TFT-LCD的地址偏移解读
【全球新视野】linux 下 mongodb 安装
PG中级证书到手,PostgreSQL(PG)认证
每日看点!RX 7900 XT悄然降价:国行回归7399元
【环球播资讯】AMD锐龙7000送上史上最强核显!频率3GHz 超越所有独显
世界播报:上海一家网吧春节促销:300元包20天 玩家签“生死状”
头条:风靡全国后 老头乐要席卷世界了
【天天报资讯】AcWing.1175 最大半连通子图
如何给所有的 await async 函数添加try/catch?
世界微资讯!mybatis使用postgresql中的jsonb数据类型
世界报道:2022年新能源车销量出炉:每卖出3辆车就有1辆新能源
全球动态:高分国漫《中国奇谭》B站播放量破1800万 网友:碾压《三体》动画
今年上映!国产航空大片《长空之王》新海报:尖端战机亮眼