百度开放平台第三方代小程序开发,授权事件、消息与事件通知总结

news2024/11/26 12:47:48

大家好,我是小悟

关于百度开放平台第三方代小程序开发的两个事件接收推送通知,是开放平台代小程序实现业务的重要功能。

授权事件推送和消息与事件推送类型都以event的值判断。

授权事件推送通知

图片

授权事件推送包括:推送票据、授权成功、取消授权、授权更新、手机号权限取消。百度服务器会向第三方平台方的授权事件接收 URL 以 POST 的方式推送相关通知。

推送票据:在第三方平台创建审核通过后,百度服务器会向其“授权事件接收URL” 每隔10分钟以 POST 的方式推送票据。

event的值为push

{
    "Ticket" : "8c0da4968b0d1e28acbc1d738a56607d",
    "FromUserName" : "SmartAPP",
    "CreateTime" : 1413192605,
    "MsgType" : "ticket",
    "Event" : "push"
}

授权成功:event的值为AUTHORIZED

{
    "appId": 小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "AUTHORIZED",
    "authorizationCode":"授权码",
    "authorizationCodeExpiresIn":60
}

取消授权: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":60
}

手机号权限取消:当主体账号信息发生变更时.会取消当前账号下所有小程序的获取手机号权限。若想要恢复权限,需重新调用申请手机号权限API重新审核。
event的值为
APPLY_APP_MOBILE_AUTH_PASS

{
    "appId":15263713,
    "tpAppId": 14242323,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APPLY_APP_MOBILE_AUTH_PASS",
    "reason":"主体信息变更"
}

接收post请求后,只需直接返回字符串success。为了加强安全性,post data中的数据将使用服务申请时的加解密key来进行加密,在收到推送后需进行解密。


@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("授权推送消息,开始");
      String msgSignature = MsgSignatureUtil.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());
      if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {
        AesDecryptUtil aesDecryptUtil = new AesDecryptUtil(thirdPlatConfig.getMsgEncodingAesKey());
        String decrypt = aesDecryptUtil.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.UPDATE_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.APP_MOBILE_AUTH_CANCEL.getCode(), event)) {
            logger.warn("获取手机号权限取消---->通知,{}", JSON.toJSONString(authPushAuthorized));
          }
        }
      }
    } catch (Exception e) {
      logger.error("系统异常", e);
    } finally {
      // 响应消息
      PrintWriter out = response.getWriter();
      out.print("success");
    }
}

消息与事件推送通知

在这里插入图片描述
消息与事件推送包括:设置小程序名称、设置小程序头像、设置小程序描述、设置小程序行业类目、小程序强制下线、小程序暂停服务、小程序服务启用、小程序限时整改通知、小程序流量下线通知、申请手机号权限、获取手机号权限、代码包审核、真实性认证状态变更、创建支付账号、配置开发者设置、开通支付服务、创建单卡子链。审核结果会向消息与事件接收 URL 进行事件推送。

小程序名称审核通过:
event的值为APP_NAME_AUDIT_PASS

{
    "appId": 小程序appid,
    "appName": "小程序名称",
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_NAME_AUDIT_PASS"
}

小程序名称审核不通过:
event的值为APP_NAME_AUDIT_FAIL

{
    "appId": 小程序appid,
    "appName": "TP名称拒审改名0503_审核失败_1589544087240",
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_NAME_AUDIT_FAIL",
    "reason": "名称过长(名称控制在10个字以内)。"
}

小程序头像审核通过:
event的值为APP_ICON_AUDIT_PASS

{
    "appId": 小程序appid,
    "appName": "小程序名称",
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_ICON_AUDIT_PASS"
}

小程序头像审核不通过:
event的值为APP_ICON_AUDIT_FAIL

{
    "appId": 小程序appid,
    "appName": "小程序名称",
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_ICON_AUDIT_FAIL",
    "reason": "不通过原因。"
}

小程序描述审核通过:
event的值为APP_DESC_AUDIT_PASS

{
    "appId": 小程序appid,
    "appName": "小程序名称",
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_DESC_AUDIT_PASS"
}

小程序描述审核不通过:
event的值为APP_DESC_AUDIT_FAIL

{
    "appId": 小程序appid,
    "appName": "小程序名称",
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_DESC_AUDIT_FAIL",
    "reason": "不通过原因。"
}

小程序行业审核通过:
event的值为APP_CATEGORY_AUDIT_PASS

{
    "appId": 小程序appid,
    "appName": "小程序名称",
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_CATEGORY_AUDIT_PASS"
}

小程序行业审核不通过:
event的值为APP_CATEGORY_AUDIT_FAIL

{
    "appId": 小程序appid,
    "appName": "小程序名称",
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_CATEGORY_AUDIT_FAIL",
    "reason": "不通过原因。"
}

小程序强制下线:
event的值为APP_FORCE_OFFLINE

{
    "appId":小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_FORCE_OFFLINE",
    "reason":"强制下线原因",
    "offlineReason":3,
    "illegalFields":"appName,photoAddr,appDesc"
}

小程序暂停服务:
event的值为APP_SERVER_PAUSE

{
    "appId":小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_SERVER_PAUSE",
    "reason":"强制下线原因",
    "offlineReason":3,
    "illegalFields":"appName,photoAddr,appDesc"
}

小程序服务启用:
event的值为APP_SERVER_RESUME

{
    "appId":小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_SERVER_RESUME"
}

小程序限时整改通知:
event的值为TIME_LIMIT_RECTIFY_NOTIFY

{
    "appId":小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "TIME_LIMIT_RECTIFY_NOTIFY"
}

小程序流量下线通知:
event的值为FLOW_CLOSE_NOTIFY

{
    "appId":小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "FLOW_CLOSE_NOTIFY"
}

小程序手机号权限审核通过:event的值为
APPLY_APP_MOBILE_AUTH_PASS

{
    "appId":15263713,
    "tpAppId": 14242323,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APPLY_APP_MOBILE_AUTH_PASS"
}

小程序手机号权限审核不通过:event的值为
APPLY_APP_MOBILE_AUTH_REJECT

{
    "appId":15263713,
    "tpAppId": 14242323,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APPLY_APP_MOBILE_AUTH_REJECT",
    "reason":"审核失败原因"
}

代码包审核通过:
event的值为PACKAGE_AUDIT_PASS

{
    "appId": 1452365,
    "tpAppId": 17328232,
    "eventTime": "2019-01-14 12:45:10",
    "event": "PACKAGE_AUDIT_PASS",
    "packageId":529394,
    "packageVersion":"0.2.2"
}

代码包审核不通过:
event的值为PACKAGE_AUDIT_FAIL

{
    "appId": 1452365,
    "tpAppId": 17328232,
    "eventTime": "2019-01-14 12:45:10",
    "event": "PACKAGE_AUDIT_FAIL",
    "reason":"名称过长(名称控制在10个字以内)。名称与实际打开后的名称不符。",
    "packageId":745815,
    "packageVersion":"1.3.46"
}

真实性认证结果推送:当客户的真实性认证状态发生变化后,第三方平台将可以通过开放平台上填写的消息与事件接受URL,获得变更内容。若客户账号下有多个小程序,会收到数量与客户小程序数量相等的推送。
event的值为ADVANCED_AUDIT_CHANGED

{
    "appId":1452365,
    "tpAppId": 17328232,
    "eventTime": "2019-01-14 12:45:10",
    "event": "ADVANCED_AUDIT_CHANGED",
    "adType":2,
    "adStatus":1
}

创建支付账号通过:event的值为
APP_PAYMENT_CREATE_ACCOUNT_PASS

{
    "appId": 小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_PAYMENT_CREATE_ACCOUNT_PASS"
}

创建支付账号不通过:event的值为
APP_PAYMENT_CREATE_ACCOUNT_FAIL

{
    "appId": 小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_PAYMENT_CREATE_ACCOUNT_FAIL",
    "reason": "失败原因"
}

配置开发者设置通过:event的值为
APP_PAYMENT_UPDATE_DEVELOP_CONFIG_PASS

{
    "appId": 小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_PAYMENT_UPDATE_DEVELOP_CONFIG_PASS"
}

配置开发者设置不通过:event的值为
APP_PAYMENT_UPDATE_DEVELOP_CONFIG_FAIL

{
    "appId": 小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_PAYMENT_UPDATE_DEVELOP_CONFIG_FAIL",
    "reason": "失败原因"
}

开通支付服务通过:event的值为
APP_PAYMENT_CREATE_PAYMENT_PASS

{
    "appId": 小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_PAYMENT_CREATE_PAYMENT_PASS"
}

开通支付服务不通过:event的值为
APP_PAYMENT_CREATE_PAYMENT_FAIL

{
    "appId": 小程序appid,
    "tpAppId": 第三方平台appid,
    "eventTime": "2019-01-14 12:45:10",
    "event": "APP_PAYMENT_CREATE_PAYMENT_FAIL",
    "reason": "失败原因"
}

创建单卡子链审核通过:小程序单卡是面向开发者的流量权益,是符合准入要求的小程序开发者向百度用户提供相关产品及服务的搜索特型卡片。第三方平台(TP)可代替小程序开发者提交2-15个小程序的核心功能或子频道,作为小程序单卡的外露子链,被用户直接访问触达。
event的值为AUDIT_SUB_CHAIN_PASS

{
    "appId":小程序appid,
    "tpAppId":第三方平台appid,
    "eventTime":"2019-01-14 12:45:10",
    "event":"AUDIT_SUB_CHAIN_PASS",
    "subchainId":13234
}

创建单卡子链审核不通过:
event的值为AUDIT_SUB_CHAIN_FAILED

{
    "appId":小程序appid,
    "tpAppId":第三方平台appid,
    "eventTime":"2019-01-14 12:45:10",
    "event":"AUDIT_SUB_CHAIN_FAILED",
    "subchainId":13234,
    "reason":"失败原因"
}

接收post请求后,只需直接返回字符串success。为了加强安全性,post data中的数据将使用服务申请时的加解密key来进行加密,在收到推送后需进行解密。

@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("事件推送消息,开始");
        String msgSignature = MsgSignatureUtil.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());
        if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {
            AesDecryptUtil aesDecryptUtil = new AesDecryptUtil(thirdPlatConfig.getMsgEncodingAesKey());
            String decrypt = aesDecryptUtil.decrypt(postData.getEncrypt());
            logger.warn("事件推送消息,解密结果={}", decrypt);
            EventPushMsg eventPushMsg = JSON.parseObject(decrypt, EventPushMsg.class);
            String event = eventPushMsg.getEvent();
            if (StringUtils.equals(EventEnum.APP_NAME_AUDIT_PASS.getCode(), event)) {
                logger.warn("小程序名称审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_NAME_AUDIT_FAIL.getCode(), event)) {
                logger.warn("小程序名称审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_ICON_AUDIT_PASS.getCode(), event)) {
                logger.warn("小程序头像审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_ICON_AUDIT_FAIL.getCode(), event)) {
                logger.warn("小程序头像审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_DESC_AUDIT_PASS.getCode(), event)) {
                logger.warn("小程序描述审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_DESC_AUDIT_FAIL.getCode(), event)) {
                logger.warn("小程序描述审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_CATEGORY_AUDIT_PASS.getCode(), event)) {
                logger.warn("小程序行业类目审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_CATEGORY_AUDIT_FAIL.getCode(), event)) {
                logger.warn("小程序行业类目审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_FORCE_OFFLINE.getCode(), event)) {
                logger.warn("小程序强制下线---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_SERVER_PAUSE.getCode(), event)) {
                logger.warn("小程序暂停服务---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_SERVER_RESUME.getCode(), event)) {
                logger.warn("小程序服务启用---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.TIME_LIMIT_RECTIFY_NOTIFY.getCode(), event)) {
                logger.warn("小程序限时整改通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.FLOW_CLOSE_NOTIFY.getCode(), event)) {
                logger.warn("小程序流量下线通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_APP_MOBILE_AUTH_PASS.getCode(), event)) {
                logger.warn("申请手机号权限审核通过---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_APP_MOBILE_AUTH_REJECT.getCode(), event)) {
                logger.warn("申请手机号权限审核拒绝---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.PACKAGE_AUDIT_PASS.getCode(), event)) {
                logger.warn("代码包审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.PACKAGE_AUDIT_FAIL.getCode(), event)) {
                logger.warn("代码包审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.ADVANCED_AUDIT_CHANGED.getCode(), event)) {
                logger.warn("真实性认证状态变更---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_PAYMENT_CREATE_ACCOUNT_PASS.getCode(), event)) {
                logger.warn("创建支付账号通过---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_PAYMENT_CREATE_ACCOUNT_FAIL.getCode(), event)) {
                logger.warn("创建支付账号失败---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_PAYMENT_UPDATE_DEVELOP_CONFIG_PASS.getCode(), event)) {
                logger.warn("配置开发者设置通过---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_PAYMENT_UPDATE_DEVELOP_CONFIG_FAIL.getCode(), event)) {
                logger.warn("配置开发者设置失败---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_PAYMENT_CREATE_PAYMENT_PASS.getCode(), event)) {
                logger.warn("开通支付服务通过---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_PAYMENT_CREATE_PAYMENT_FAIL.getCode(), event)) {
                logger.warn("开发支付服务失败---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.AUDIT_SUB_CHAIN_PASS.getCode(), event)) {
                logger.warn("创建单卡子链审核通过---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.AUDIT_SUB_CHAIN_FAILED.getCode(), event)) {
                logger.warn("创建单卡子链审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
            }
        }
      }
    } catch (Exception e) {
      logger.error("系统异常", e);
    } finally {
      // 响应消息
      PrintWriter out = response.getWriter();
      out.print("success");
    }
}

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

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

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

相关文章

【C++进阶】:特殊类的设计

特殊类的设计 一.设计一个类不能被拷贝二.设计一个类只能在堆上创建对象三.设计一个类只能在栈上创建4.设计一个类不能被继承五.设计一个类只能有一个对象(单例模式) 一.设计一个类不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c…

蓝桥杯(跳跃 C++)

思路&#xff1a; 1、根据题目很容易知道可以用深度搜索、广度搜索、动态规划的思想解题。 2、这里利用深度搜素&#xff0c;由题目可知&#xff0c;可以往九个方向走。 3、这里的判断边界就是走到终点。 #include<iostream> using namespace std; int max1 0; int …

Vue3中ref创建的引用为什么一定要用.value来获取值

Vue3中ref创建的引用为什么一定要用.value来获取值 回顾jsjs中修改复制变量,改变原始变量vue3中使用ref 回顾js js中一个变量赋值给另一个变量,改变另一个变量,原始变量不变 let a 0; let b a; b 2 console.log("a: "a);js中修改复制变量,改变原始变量 let obj…

【Java 进阶篇】JavaScript 中的全局对象和变量

JavaScript 是一门非常强大的编程语言&#xff0c;它提供了许多全局对象和变量&#xff0c;以便于在整个应用程序中共享数据和功能。本文将详细介绍 JavaScript 中的全局对象和变量&#xff0c;包括全局对象、全局变量、全局函数以及它们的用途和示例。 全局对象 JavaScript …

15.项目讲解之前端页面的实现

项目讲解之前端页面的实现 本项目前端使用HBuilerX软件编写HBuilderX下载安装配置一键直达&#xff0c; uniapp框架uniapp官网&#xff0c; 使用Element-ui组件Element-ui组件网址进行前端页面的完成。 前端项目下载地址 前端项目 前端项目展示 首页 首页展示 echarts实现…

9.Linear Maps

线性映射 线性映射是将向量作为输入并产生一些新向量作为输出的转换。 从坐标定义开始(数组)&#xff0c;再到2&#xff0c;3&#xff0c;并展示它们是如何关联的 线性映射的坐标表示最终是矩阵&#xff0c; 1.坐标定义&#xff08;数组&#xff09; 列向量是向量的坐标表示…

iOS- flutter flavor 多环境Configurations配置

一、点击PROJECT的Runner&#xff0c;选择Info选项&#xff0c;在Configurations下方的号添加不同环境的配置&#xff0c;如下图&#xff1a; 二、选择TAGETS的Runner项目&#xff0c;选择Build Settings选项&#xff0c;在输入框输入package&#xff0c;为不同环境配置相应的…

结构体对齐规则

1.第一个成员在结构体变量偏移量为0的地址处。 2.其他成员变量对齐到某个数字(对齐数)的整数倍的地址处。(对齐数编译器默认的一个对齐数与该成员大小的较小值&#xff09;注意&#xff1a;目前有且只有VS编译器有默认为8. 3.结构体总大小为最大对齐数的整数倍。 4.如果嵌套…

快速修复“找不到xinput1_3.dll无法继续执行此代码的”问题的5个方法

在计算机系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;是一个重要的组件&#xff0c;它负责在程序和操作系统之间进行有效的通信。然而&#xff0c;有时候我们可能会遇到“xinput1_3.dll”文件出现问题的情况&#xff0c;这可能会导致系统不稳定甚至无法正常运行。…

回归预测 | MATLAB实现IBES-ELM基于改进的秃鹰搜索优化算法优化极限学习机的数据回归预测(多指标,多图)

回归预测 | MATLAB实现IBES-ELM 基于改进的秃鹰搜索优化算法优化极限学习机的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBES-ELM 基于改进的秃鹰搜索优化算法优化极限学习机的数据回归预测&#xff08;多指标&#xff0c;多图&a…

DL Homework 3

给定训练集,将每个样本输入给前馈神经网络&#xff0c;得到网络输出为,其在数据集上的结构化风险为 首先简单解释一下这堆话&#xff0c;结构化风险经验风险正则化项,经验风险为&#xff0c;对于函数我们大多数采取的为交叉熵函数&#xff0c;,正则化项为&#xff0c;首先神经网…

【软考-中级】系统集成项目管理工程师-配置管理历年案例

持续更新。。。。。。。。。。。。。。。 目录 2023 上 试题三(20分) 2023 上 试题三(20分) 某公司有自己的质量管理体系&#xff0c;其中配置管理程序已运行多年&#xff0c;由项目经理牵头组建变更控制委员会(CCB)&#xff0c;在创建配置管理环境后&#xff0c;并经过变更申请…

微信小程序入门级

目录 一.什么是小程序&#xff1f; 二.小程序可以干什么&#xff1f; 三.入门使用 3.1. 注册 3.2. 安装 3.3.创建项目 3.4.项目结构 3.5.应用 好啦今天就到这里了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&#xff01; 一.什么是小程序&#xff1f; 微信小程…

【全网最细】谷歌小恐龙无敌代码它来了!

谷歌小恐龙是什么&#xff1f; 每次断网的时候&#xff0c;大家是不是都会玩一会&#xff0c;小恐龙快跑的游戏&#xff0c;或者在信息课上玩一玩&#xff0c;对不对&#xff1f; 还没玩过的小伙伴也不用担心&#xff0c;打开谷歌&#xff0c;输入这段网址&#xff1a;chrome…

【计算机组成体系结构】电路基本原理与加法器设计

一、算术逻辑单元—ALU 1.基本的逻辑运算&#xff08;1bit的运算&#xff09; 基本逻辑运算分为&#xff0c;与、或、非。大家应该很熟悉了&#xff0c;与&#xff1a;全1为1&#xff0c;否则为0。或&#xff1a;全0为0&#xff0c;否则为1。非&#xff1a;取反。三个基本的逻…

一种更具破坏力的DDoS放大攻击新模式

近日&#xff0c;内容分发网络&#xff08;CDN&#xff09;运营商Akamai表示&#xff0c;一种使网站快速瘫痪的DDoS放大攻击新方法正在被不法分子所利用。这种方法是通过控制数量巨大的中间设备&#xff08;middlebox&#xff0c;主要是指配置不当的服务器&#xff09;&#xf…

thinkphp6 入门(8)-- Session

开启Session Session功能默认是没有开启的&#xff08;API应用通常不需要使用Session&#xff09; think\middleware\SessionInit// 添加引用 use think\facade\Session; 赋值 Session::set(name, thinkphp);取值 // 如果值不存在&#xff0c;返回null Session::get(name)…

【Java学习之道】JavaFx 框架与组件介绍

引言 如果你曾经尝试过使用Java编写一个漂亮的窗口应用程序&#xff0c;那么你一定知道JavaFX这个强大的工具。JavaFX是Java 8中引入的一个GUI开发框架&#xff0c;它提供了丰富的组件和功能&#xff0c;使得我们可以轻松地创建出功能强大、界面美观的桌面应用程序。无论你是想…

linux命令执行的结果如何快速传递给下一个管道?xargs完虐

xargs xargs是给命令传递参数的过滤器&#xff0c;他的作用就是将上一步的输出传递到下一命令的输入上。类似于shell脚本中$? 。这样使用的好处是什么呢&#xff1f;你想想每次想关闭一个进程&#xff0c;你是否需要先查找&#xff0c;然后拿着结果再去执行第二条命令&#x…

【09】基础知识:React组件的生命周期

组件从创建到死亡它会经历一些特定的阶段。 React 组件中包含一系列勾子函数&#xff08;生命周期回调函数 <> 生命周期钩子函数 <> 生命周期函数 <> 生命周期钩子&#xff09;&#xff0c;会在特定的时刻调用。 我们在定义组件时&#xff0c;会在特定的生…