抖音开放平台第三方代小程序开发,授权事件、消息与事件通知总结
大家好,我是小悟
关于抖音开放平台第三方代小程序开发的两个事件接收推送通知,是开放平台代小程序实现业务的重要功能。
授权事件推送和消息与事件推送类型都以Event的值判断。
授权事件推送通知
授权事件推送包括:推送票据、授权成功、授权解除、授权码找回。抖音服务器会向第三方平台方的授权事件接收 URL 以 POST 的方式推送相关通知。
推送票据:在第三方平台创建审核通过后,抖音服务器会向其“授权事件接收URL” 每隔10分钟以 POST 的方式推送票据。
Event的值为PUSH
{"Ticket": "8c0da4968b0d1e28acbc1d738a56607d","FromUserName": "ByteDanceMicroApp","CreateTime": "2019-01-14 12:45:10","MsgType": "Ticket","Event": "PUSH"
}
授权成功:Event的值为AUTHORIZED
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "AUTHORIZED","AuthorizationCode": "授权码","AuthorizationCodeExpiresIn": 3600,"AppName": "代创建的小程序名称","AppIcon": "代创建的小程序图标","CompanyName": "代创建的小程序公司主体名称","AppSuperAdminEmail": "代创建的小程序超管掩码邮箱","AppSuperAdminMobile": "代创建的小程序超管掩码手机号"
}
授权解除:Event的值为UNAUTHORIZED
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "UNAUTHORIZED"
}
授权码找回:
Event的值为UPDATE_AUTHORIZED
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "UPDATE_AUTHORIZED","AuthorizationCode": "授权码","AuthorizationCodeExpiresIn": 3600
}
出于安全考虑,开放平台服务端会向第三方小程序后端服务推送加密后的消息,因此,服务商需要用key解密后才能查看具体信息。另外推送消息格式均为 json,并且第三方小程序后端服务接收到后需要响应并返回字符串 success。
@PostMapping(value = "authPushMsg")
public void authPushMsg(PostDataModel postData) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));StringBuffer sb = new StringBuffer();String line;while ((line = br.readLine()) != null) {sb = sb.append(line);}String postStr = sb.toString();logger.warn("授权推送消息---->获得数据为postData={}", postStr);PostDataModel postData = JSON.parseObject(postStr, PostDataModel.class);try {logger.warn("授权推送消息,开始");ServerVerification serverVerification = new ServerVerification();String msgSignature = serverVerification.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {MsgDecrypt msgDecrypt = new MsgDecrypt(thirdPlatConfig.getMsgEncodingAesKey());String decrypt = msgDecrypt.decrypt(postData.getEncrypt());logger.warn("授权推送消息,解密结果={}", decrypt);if (decrypt.contains("Ticket") && decrypt.contains("PUSH")) {logger.warn("推送ticket协议---->开始");// 推送ticket通知ComponentVerifyTicket componentVerifyTicket = JSON.parseObject(decrypt, ComponentVerifyTicket.class);componentVerifyTicket.setComponentVerifyTicket(componentVerifyTicket.getTicket());RedisService<ComponentVerifyTicket> redisService = RedisService.load();redisService.save(componentVerifyTicket, ComponentVerifyTicket.class);logger.warn("推送ticket协议---->成功,保存到缓存中的值为:{}", JSON.toJSONString(componentVerifyTicket));} else {// 授权成功、授权解除、授权码找回AuthPushAuthorized authPushAuthorized = JSON.parseObject(decrypt, AuthPushAuthorized.class);String event = authPushAuthorized.getEvent();if (StringUtils.equals(EventEnum.AUTHORIZED.getCode(), event)) {logger.warn("推送授权成功通知---->成功,{}", JSON.toJSONString(authPushAuthorized));} else if (StringUtils.equals(EventEnum.UNAUTHORIZED.getCode(), event)) {logger.warn("推送授权解除通知---->成功,{}", JSON.toJSONString(authPushAuthorized));} else if (StringUtils.equals(EventEnum.UPDATE_AUTHORIZED.getCode(), event)) {logger.warn("推送授权码找回通知---->成功,{}", JSON.toJSONString(authPushAuthorized));}}}} catch (Exception e) {logger.error("系统异常", e);} finally {// 响应消息PrintWriter out = response.getWriter();out.print("success");}
}
消息与事件推送通知
消息与事件推送包括:修改小程序名称、小程序名称重置、修改服务类目、修改小程序简介、修改小程序图标、版本审核结果、短视频挂载能力申请审核结果、抖音直播组件能力申请审核结果、获取用户手机号能力申请审核结果、分享模板审核结果、短视频/直播自主挂载能力审核结果通知、短视频/直播自主挂载能力抖音号绑定结果通知、短视频达人推广挂载能力审核结果通知、直播达人推广挂载能力审核结果通知。审核结果会向消息与事件接收 URL 进行事件推送。
修改小程序名称:
Event的值为MODIFY_APP_NAME
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "MODIFY_APP_NAME","ModifyAppNameResults": {"advice": "","reason": "小程序名称格式不符合规范","status": 0}
}
小程序名称重置:Event的值为
APP_NAME_RESET_NOTIFICATION
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "APP_NAME_RESET_NOTIFICATION","AppNameResetNotification": "您好,您管理的小程序「%s」由于长时间未提交版本审核,名称已经被重置为「名称过期%s」。如需修改,请前往配置页面重新填写名称。"
}
修改服务类目:Event的值为
MODIFY_APP_CATEGORY
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "MODIFY_APP_CATEGORY","ModifyAppCategoryResults": [{"category": "158,159,259","categoryName": "社交类-社交-直播","status": 1,"reason": ""}]
}
修改小程序简介:
Event的值为MODIFY_APP_INTRO
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "MODIFY_APP_INTRO","ModifyAppIntroResults": {"reason": "小程序简介格式不符合规范","status": 0}
}
修改小程序图标:
Event的值为MODIFY_APP_ICON
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "MODIFY_APP_ICON","ModifyAppIconResults": {"reason": "小程序名称格式不符合规范","status": 0}
}
版本审核结果:Event的值为PACKAGE_AUDIT
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "PACKAGE_AUDIT","AuditResults": [{"hostName": "toutiao","reason": ["", ""],"status": 1,"auditDetail": [{"reason":"xxx","modifyGuide": {"name":"xxx","link":"xxx"},"detailFile":"xxx"}]}]
}
短视频挂载能力申请审核结果:Event的值为APPLY_VIDEO_CAPABILITY
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "APPLY_VIDEO_CAPABILITY","ApplyVideoCapabilityResults": {"status": 0,"reason": "xxx"}
}
抖音直播组件能力申请审核结果:Event的值为APPLY_LIVE_CAPABILITY
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "APPLY_LIVE_CAPABILITY","ApplyLiveCapabilityResults": {"status": 0,"reason": "xxx"}
}
获取用户手机号能力申请审核结果:Event的值为
APPLY_PHONE_NUMBER_CAPABILITY
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "APPLY_PHONE_NUMBER_CAPABILITY","ApplyPhoneNumberCapabilityResults": {"status": 0,"reason": "xxx"}
}
分享模板审核结果:
Event的值为APPLY_SHARE_TEMPLATE
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "APPLY_SHARE_TEMPLATE","ApplyShareTemplateResults": {"templateId": "xxx","status": 0,"reason": "[\"xxx\",\"xxx\"]"}
}
短视频/直播自主挂载能力审核结果通知:
Event的值为APPLY_CAPACITY,需要结合
EventContent.capacity_key的值判断
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "APPLY_CAPACITY","EventContent": {
// 能力key,video_self_mount-短视频自主挂载;live_self_mount-直播自主挂载。"capacity_key": "能力key","status": 1,"reason": "xxx"}
}
短视频/直播自主挂载能力抖音号绑定结果通知:
Event的值为SELT_MOUNT_BIND,需要结合
EventContent.capacity_key的值判断
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "SELT_MOUNT_BIND","EventContent": {
// 能力key,video_self_mount-短视频自主挂载;live_self_mount-直播自主挂载。"capacity_key": "能力key","aweme_id": "抖音号","user_name": "抖音用户昵称","bind_status": 1}
}
短视频达人推广挂载能力审核结果通知:
Event的值为APPLY_CAPACITY,需要结合
EventContent.capacity_key的值判断
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "APPLY_CAPACITY","EventContent": {
// 能力key,video_talent_mount-短视频达人推广挂载能力。"capacity_key": "能力key","status": 1,"reason": "xxx"}
}
直播达人推广挂载能力审核结果通知:
Event的值为APPLY_CAPACITY,需要结合
EventContent.capacity_key的值判断
{"AppId": "授权小程序的appid","TpAppId": "第三方小程序应用appid","EventTime": "2019-01-14 12:45:10","Event": "APPLY_CAPACITY","EventContent": {
// 能力key,ma.mount.live_talent_mountt-直播达人推广挂载能力。"capacity_key": "能力key","status": 1,"reason": "xxx"}
}
出于安全考虑,开放平台服务端会向第三方小程序后端服务推送加密后的消息,因此,服务商需要用key解密后才能查看具体信息。另外推送消息格式均为 json,并且第三方小程序后端服务接收到后需要响应并返回字符串 success。
@PostMapping(value = "eventPushMsg")
public void eventPushMsg(PostDataModel postData) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));StringBuffer sb = new StringBuffer();String line;while ((line = br.readLine()) != null) {sb = sb.append(line);}String postStr = sb.toString();logger.warn("事件推送消息---->获得数据为postData={}", postStr);PostDataModel postData = JSON.parseObject(postStr, PostDataModel.class);try {logger.warn("事件推送消息,开始");ServerVerification serverVerification = new ServerVerification();String msgSignature = serverVerification.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {MsgDecrypt msgDecrypt = new MsgDecrypt(thirdPlatConfig.getMsgEncodingAesKey());String decrypt = msgDecrypt.decrypt(postData.getEncrypt());logger.warn("事件推送消息,解密结果={}", decrypt);EventPushMsg eventPushMsg = JSON.parseObject(decrypt, EventPushMsg.class);String event = eventPushMsg.getEvent();if (StringUtils.equals(EventEnum.MODIFY_APP_NAME.getCode(), event)) {logger.warn("修改名称审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.APP_NAME_RESET_NOTIFICATION.getCode(), event)) {logger.warn("名称重置通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.MODIFY_APP_INTRO.getCode(), event)) {logger.warn("修改简介审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.MODIFY_APP_ICON.getCode(), event)) {logger.warn("修改图标审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.MODIFY_APP_CATEGORY.getCode(), event)) {logger.warn("修改服务类目审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.PACKAGE_AUDIT.getCode(), event)) {logger.warn("版本审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.APPLY_VIDEO_CAPABILITY.getCode(), event)) {logger.warn("「短视频挂载」能力申请审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.APPLY_LIVE_CAPABILITY.getCode(), event)) {logger.warn("「抖音直播组件」能力申请审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.APPLY_PHONE_NUMBER_CAPABILITY.getCode(), event)) {logger.warn("「获取用户手机号」能力申请审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.APPLY_CAPACITY.getCode(), event)) {logger.warn("短视频/直播自主挂载能力审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));logger.warn("短视频达人推广挂载能力审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));logger.warn("直播达人推广挂载能力审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));} else if (StringUtils.equals(EventEnum.SELT_MOUNT_BIND.getCode(), event)) {logger.warn("短视频/直播自主挂载能力抖音号绑定结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));}}}} catch (Exception e) {logger.error("系统异常", e);} finally {// 响应消息PrintWriter out = response.getWriter();out.print("success");}
}
您的一键三连,是我更新的最大动力,谢谢
山水有相逢,来日皆可期,谢谢阅读,我们再会
我手中的金箍棒,上能通天,下能探海
相关文章:

抖音开放平台第三方代小程序开发,授权事件、消息与事件通知总结
大家好,我是小悟 关于抖音开放平台第三方代小程序开发的两个事件接收推送通知,是开放平台代小程序实现业务的重要功能。 授权事件推送和消息与事件推送类型都以Event的值判断。 授权事件推送通知 授权事件推送包括:推送票据、授权成功、授…...

华为9.20笔试 复现
第一题 丢失报文的位置 思路:从数组最小索引开始遍历 #include <iostream> #include <vector> using namespace std; // 求最小索引值 int getMinIdx(vector<int> &arr) {int minidx 0;for (int i 0; i < arr.size(); i){if (arr[i] …...

二十五、【色调调整基础】
文章目录 1、亮度/对比度a、亮度b、对比度 2、曝光度3、阈值4、色阶5、反相6、黑白7、渐变映射 1、亮度/对比度 a、亮度 亮度是指画面的明亮程度 b、对比度 对比度指的是一幅图像中,明暗区域最亮和最暗之间不同亮度层级的测量,如下图所示࿰…...

Android Studio SDK manager加载packages不全
打开Android Studio里的SDK manager,发现除了已安装的,其他的都不显示。 解决方法: 设置代理: 方便复制> http://mirrors.neusoft.edu.cn/ 重启Android Studio...
[esp32-wroom]基础开发
1、点亮LED灯 int led_pin2; void setup() {// put your setup code here, to run once:pinMode(led_pin,OUTPUT);}void loop() {// put your main code here, to run repeatedly:digitalWrite(led_pin,HIGH);delay(1000);digitalWrite(led_pin,LOW);delay(1000); } 2、LED流…...
利用Docker 实现 MiniOB环境搭建
官方文档有,但是感觉写的跟shift一样(或者是我的阅读理解跟shift一样 下面是自己的理解 一.下载docker 这个去官网下载安装,没什么说的 Docker: Accelerated Container Application Development 二.用docker下载MiniOB环境 1.打开powershell ( win r ,然后输入powershell…...
【DB2】—— 数据库表查询一直查不出来数据
问题描述 近日,数据库的测试环境中有一个打印日志表,一共有将近50w的数据,Java程序在查询的时候一直超时。 在DBvisualizer中查询数据无论是使用select * 还是 select count(*)查询的时候都是一直在执行,就是查询不到结果。 排查…...

【教程】使用vuepress构建静态文档网站,并部署到github上
官网 快速上手 | VuePress (vuejs.org) 构建项目 我们跟着官网的教程先构建一个demo 这里我把 vuepress-starter 这个项目名称换成了 howtolive 创建并进入一个新目录 mkdir howtolive && cd howtolive使用你喜欢的包管理器进行初始化 yarn init 这里的问题可以一…...

python 机器视觉 车牌识别 - opencv 深度学习 机器学习 计算机竞赛
1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于python 机器视觉 的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:3分 🧿 更多资…...

Hadoop3教程(十二):MapReduce中Shuffle机制的概述
文章目录 (95) Shuffle机制什么是shuffle?Map阶段Reduce阶段 参考文献 (95) Shuffle机制 面试的重点 什么是shuffle? Map方法之后,Reduce方法之前的这段数据处理过程,就叫做shuff…...

MySQL为什么用b+树
索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在[1,2,3,4]中找到4这个数据,直接对全数据检索也很快&am…...
浅谈机器学习中的概率模型
浅谈机器学习中的概率模型 其实,当牵扯到概率的时候,一切问题都会变的及其复杂,比如我们监督学习任务中,对于一个分类任务,我们经常是在解决这样一个问题,比如对于一个n维的样本 X [ x 1 , x 2 , . . . .…...

MySQL 函数 索引 事务 管理
目录 一. 字符串相关的函数 二.数学相关函数 编辑 三.时间日期相关函数 date.sql 四.流程控制函数 centrol.sql 分页查询 使用分组函数和分组字句 group by 数据分组的总结 多表查询 自连接 子查询 subquery.sql 五.表的复制 六.合并查询 七.表的外连接 …...
Flink如何基于事件时间消费分区数比算子并行度大的kafka主题
背景 使用flink消费kafka的主题的情况我们经常遇到,通常我们都是不需要感知数据源算子的并行度和kafka主题的并行度之间的关系的,但是其实在kafka的主题分区数大于数据源算子的并行度时,是有一些注意事项的,本文就来讲解下这些注…...

总结:JavaEE的Servlet中HttpServletRequest请求对象调用各种API方法结果示例
总结:JavaEE的Servlet中HttpServletRequest请求对象调用各种API方法结果示例 一方法调用顺序是按照英文字母顺序从A-Z二该示例可以用作servlet中request的API参考,从而知道该如何获取哪些路径参数等等三Servlet的API版本5.0.0、JSP的API版本:…...

ChatGPT AIGC 完成Excel跨多表查找操作vlookup+indirect
VLOOKUP和INDIRECT的组合在Excel中用于跨表查询,其中VLOOKUP函数用于在另一张表中查找数据,INDIRECT函数则用于根据文本字符串引用不同的工作表。具体操作如下: 1.假设在工作表1中,A列有你要查找的值,B列是你希望查询的工作表名称。 2.在工作表1的C列输入以下公式:=VLO…...
Linux系统conda虚拟环境离线迁移移植
本人创建的conda虚拟环境名为yys(每个人的虚拟环境名不一样,替换下就行) 以下为迁移步骤: 1.安装打包工具将虚拟环境打包: conda install conda-pack conda pack -n yys -o yys.tar.gz 2.将yys.tar.gz上传到服务器&…...
Vue16 绑定css样式 style样式
绑定样式: 1. class样式写法:class"xxx" xxx可以是字符串、对象、数组。字符串写法适用于:类名不确定,要动态获取。对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。数组写法适用于&…...

[Spring] SpringMVC 简介(三)
目录 九、SpringMVC 中的 AJAX 请求 1、简单示例 2、RequestBody(重点关注“赋值形式”) 3、ResponseBody(经常用) 4、为什么不用手动接收 JSON 字符串、转换 JSON 字符串 5、RestController 十、文件上传与下载 1、Respo…...

kettle应用-从数据库抽取数据到excel
本文介绍使用kettle从postgresql数据库中抽取数据到excel中。 首先,启动kettle 如果kettle部署在windows系统,双击运行spoon.bat或者在命令行运行spoon.bat 如果kettle部署在linux系统,需要执行如下命令启动 chmod x spoon.sh nohup ./sp…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...