中宣部防沉迷系统PHP版本(管局防沉迷验证-PHP-全版本-接口测试样例)

现在对接游戏,无论是登录还是支付都是要去对接防沉迷实名认证接口,但前期的话你要登录网络游戏防沉迷实名认证系统进行接口测试,$appid ,$bizId,$key去接口测试页面找(正式上线在密钥管理)接下来跟大家说说调试步骤:

第一步:配置白名单

 第二步:点击接口测试,配置好你要测试的IP白名单(api服务器IP),接下来操作那一列有一个【开始测试】按钮,点击获取测试码(最好一个个接口测试)。

第三步: 添加测试代码(thinkphp框架,Wlc类请看文章最后)

1、testcase01-实名认证接口(认证成功),testcase02-实名认证接口(认证中),testcase03-实名认证接口(认证失败)

测试地址:https://wlc.nppa.gov.cn/test/authentication/check/测试码

// 测试防成谜(接口测试)public function checkTest(){$appid = '';$bizId = ;$key = "";$wlc = new Wlc($appid, $key, $bizId);//认证成功$body = ["ai" => '1000023000000007',"name" => '某一七',"idNum" => '110000190101030010',];$res = $wlc->setBody($body)->check();print_r($res);}

 说明:参数按照传就行说明文档,testcase03的参数随便改错一个即可

2、testcase04-实名认证结果查询接口(认证成功),testcase05-实名认证结果查询接口(认证中),testcase06-实名认证结果查询接口(认证失败)

测试地址:https://wlc.nppa.gov.cn/test/authentication/query/测试码?

// 测试防成谜(接口测试)public function queryTest(){$appid = '';$bizId = ;$key = "";$wlc = new Wlc($appid, $key, $bizId);//认证成功$body = ["ai" => '300000000000000002',];$res = $wlc->setParams($body)->query();print_r($res);}

说明:参数按照传就行说明文档,testcase06的参数随便改错一个即可

3、 testcase07-游戏用户行为数据上报接口(游客模式),testcase08-游戏用户行为数据上报接口(已认证)

测试地址:https://wlc.nppa.gov.cn/test/collection/loginout/测试码

游客模式:

   // 测试防成谜(接口测试)public function loginoutTest(){$appid = '';$bizId = ;$key = "";$wlc = new Wlc($appid, $key, $bizId);//认证成功 (游客模式)$body =['collections'=>[['no'=>1,'si'=>'95edkzei5exh47pk0z2twm6zpielesrd','bt'=>0,'ot'=>time(),'ct'=>2,'di'=>'ecvndx6r6xfwofmufs3lbimcr639r33t',]],];$res = $wlc->setBody($body)->loginout();print_r($res);}

已认证模式:

// 测试防成谜(接口测试)public function loginoutTest(){$appid = '';$bizId = ;$key = "";$wlc = new Wlc($appid, $key, $bizId);//认证用户测试上报$presetlist = [['pi'=>'1fffbjzos82bs9cnyj1dna7d6d29zg4esnh99u'],['pi'=>'1fffbkmd9ebtwi7u7f4oswm9li6twjydqs7qjv'],];$preset = $presetlist[mt_rand(0,count($presetlist)-1)];$pi = $preset['pi'];$body =['collections'=>[['no'=>1,'si'=>'95edkzei5exh47pk0z2twm6zpielesrd','bt'=>0,'ot'=>time(),'ct'=>0,'di'=>'ecvndx6r6xfwofmufs3lbimcr639r33t','pi'=>$pi]],];$res = $wlc->setBody($body)->loginout();print_r($res);}
第四步:调试系统返回错误码

附录:  响应参数 

字段                  类型       名称             字段说明 

errcode               Int       状态码             状态码 

errmsg                String    状态描述           状态描述 

data                  Object    响应对象          响应结果 

data.result           Object    响应结果对象      响应结果内容 

data.result.status    Int       实名认证结果      认证结果 0:认证成功 1:认证中  2:认证失败 

data.result.pi       String     用户唯一标识      已通过实名认证用户的唯一标识

    

接口返回状态码

状态码               状态描述           状态说明 

0                     OK                请求成功

1001                SYS ERROR           系统错误 

1002      SYS REQ RESOURCE NOT EXIST    接口请求的资源不存在 

1003        SYS REQ METHOD ERROR        接口请求方式错误 

1004      SYS REQ HEADER MISS ERROR     接口请求核心参数缺失 

1005      SYS REQ IP ERROR              接口请求IP地址非法 

1006      SYS REQ BUSY ERROR            接口请求超出流量限制 

1007      SYS REQ EXPIRE ERROR          接口请求过期 

1008      SYS REQ PARTNER ERROR         接口请求方身份非法 

1009      SYS REQ PARTNER AUTH DISABLE  接口请求方权限未启用 

1010        SYS REQ AUTH ERROR          接口请求方无该接口权限 

1011      SYS REQ PARTNER AUTH ERROR    接口请求方身份核验错误 

1012      SYS REQ PARAM CHECK ERROR     接口请求报文核验失败

实名认证业务异常

2001      BUS AUTH IDNUM ILLEGAL        身份证号格式校验失败 

2002      BUS AUTH RESOURCE LIMIT       实名认证条目已达上限 

2003      BUS AUTH CODE NO AUTH RECODE  无该编码提交的实名认证记录 

2004      BUS AUTH CODE ALREADY IN USE  编码已经被占用

游戏用户行为数据上报业务异常 

3001     BUS COLL PARTIAL ERROR         行为数据部分上报失败 

3002     BUS COLL BEHAVIOR NULL ERROR   行为数据为空 

3003     BUS COLL OVER LIMIT COUNT      行为数据超出条目数量限制 

3004     BUS COLL NO INVALID            行为数据编码错误 

3005     BUS COLL BEHAVIOR TIME ERROR   行为发生时间错误 

3006     BUS COLL PLAYER MODE INVALID   用户类型无效 

3007     BUS COLL BEHAVIOR MODE INVALID 行为类型无效 

3008     BUS COLL PLAYERID MISS         缺失PI(用户唯一标识)值 

3009     BUS COLL DEVICEID MISS         缺失DI(设备标识)值 3

010      BUS COLL PLAYERID INVALID PI (用户唯一标识)值无效

Wlc类:(里面的地址都是正式地址)

<?php
namespace app\extend\wlc;
use app\extend\wlc\AESGCM;class Wlc
{public $app_id;public $secret_key;public $biz_id;public $headers;public $body;public $params = [];public function __construct($app_id, $secret_key, $biz_id){$this->app_id = $app_id;$this->secret_key = $secret_key;$this->biz_id = $biz_id;$time = $this->mtime();$this->headers = ["appId" => $this->app_id,"bizId" => $this->biz_id,"timestamps" => "$time",];return $this;}/*** 获取毫秒* @return float*/protected function mtime(){list($msec, $sec) = explode(' ', microtime());$mtime = round(round($sec . substr($msec, 2, 3)));return $mtime;}/*** 加密请求体* @param $text* @return string*/protected function encrypt($text){$key = hex2bin($this->secret_key);$cipher = "aes-128-gcm";$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher));//php7.1以上可直接使用以下代码if (version_compare(PHP_VERSION, '7.1.0') >= 0) {$encrypt = openssl_encrypt($text, $cipher, $key, OPENSSL_RAW_DATA, $iv, $tag);return base64_encode($iv . $encrypt . $tag);}//php5.6-7.0使用以下代码list($encrypt, $tag) = AESGCM::encrypt($key, $iv, $text);$str = bin2hex($iv) . bin2hex($encrypt) . bin2hex($tag);return base64_encode(hex2bin($str));}/*** 签名* @param $body* @return string*/protected function sign($body){$data = array_merge($this->headers, $this->params);ksort($data);$sign_str = '';foreach ($data as $k => $v) {$sign_str .= "{$k}{$v}";}$sign_str = $this->secret_key . $sign_str . $body;$sign = hash("sha256", $sign_str);return $sign;}/*** 发送请求* @param $url* @param $method* @param $headers* @param $body* @return mixed*/protected function request($url, $method, $headers, $body){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));curl_setopt($ch, CURLOPT_POSTFIELDS, $body);curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_HEADER, false);curl_setopt($ch, CURLOPT_TIMEOUT, 5);$response = curl_exec($ch);curl_close($ch);unset($ch);return json_decode($response, true);}/*** 设置url 请求参数* @param $params* @return $this*/public function setParams($params){$this->params = $params;return $this;}/*** 设置请求体* @param $body* @return $this*/public function setBody($body){$this->body = $body;return $this;}public function check(){$url = "https://api.wlc.nppa.gov.cn/idcard/authentication/check";//加密请求体$body = json_encode(["data" => $this->encrypt(json_encode($this->body, JSON_UNESCAPED_UNICODE)),]);//签名$sign = $this->sign($body);$headers[] = "sign:$sign";$headers[] = "Content-Type:application/json; charset=utf-8";foreach ($this->headers as $k => $v) {$headers[] = "{$k}:{$v}";}return $this->request($url, "POST", $headers, $body);}public function query(){$url = "http://api2.wlc.nppa.gov.cn/idcard/authentication/query";//设置url参数$params = '';if (!empty($this->params)) {$params = http_build_query($this->params);$url .= "?$params";}$body = '';$sign = $this->sign($body);$headers[] = "sign:$sign";foreach ($this->headers as $k => $v) {$headers[] = "{$k}:{$v}";}return $this->request($url, "GET", $headers, $body);}public function loginout(){$url = "http://api2.wlc.nppa.gov.cn/behavior/collection/loginout";//加密请求体$body = json_encode(["data" => $this->encrypt(json_encode($this->body, JSON_UNESCAPED_UNICODE)),]);//签名$sign = $this->sign($body);$headers[] = "sign:$sign";$headers[] = "Content-Type:application/json; charset=utf-8";foreach ($this->headers as $k => $v) {$headers[] = "{$k}:{$v}";}return $this->request($url, "POST", $headers, $body);}}
AESGCM类:
<?php
/** https://github.com/Spomky-Labs/php-aes-gcm* 从以上gitub项目提取的单文件*/
namespace app\extend\wlc;class AESGCM
{/*** @param string      $K          Key encryption key* @param string      $IV         Initialization vector* @param null|string $P          Data to encrypt (null for authentication)* @param null|string $A          Additional Authentication Data* @param int         $tag_length Tag length** @return array*/public static function encrypt($K, $IV, $P = null, $A = null, $tag_length = 128){$key_length = mb_strlen($K, '8bit') * 8;if (version_compare(PHP_VERSION, '7.1.0RC5') >= 0 && null !== $P) {return self::encryptWithPHP71($K, $key_length, $IV, $P, $A, $tag_length);} elseif (class_exists('\Crypto\Cipher')) {return self::encryptWithCryptoExtension($K, $key_length, $IV, $P, $A, $tag_length);}return self::encryptWithPHP($K, $key_length, $IV, $P, $A, $tag_length);}/*** This method will append the tag at the end of the ciphertext.** @param string      $K          Key encryption key* @param string      $IV         Initialization vector* @param null|string $P          Data to encrypt (null for authentication)* @param null|string $A          Additional Authentication Data* @param int         $tag_length Tag length** @return string*/public static function encryptAndAppendTag($K, $IV, $P = null, $A = null, $tag_length = 128){return implode(self::encrypt($K, $IV, $P, $A, $tag_length));}/*** @param string      $K          Key encryption key* @param string      $key_length Key length* @param string      $IV         Initialization vector* @param null|string $P          Data to encrypt (null for authentication)* @param null|string $A          Additional Authentication Data* @param int         $tag_length Tag length** @return array*/private static function encryptWithPHP71($K, $key_length, $IV, $P = null, $A = null, $tag_length = 128){$mode = 'aes-'.($key_length).'-gcm';$T = null;$C = openssl_encrypt($P, $mode, $K, OPENSSL_RAW_DATA, $IV, $T, $A, $tag_length / 8);return [$C, $T];}/*** @param string      $K          Key encryption key* @param string      $key_length Key length* @param string      $IV         Initialization vector* @param null|string $P          Data to encrypt (null for authentication)* @param null|string $A          Additional Authentication Data* @param int         $tag_length Tag length** @return array*/private static function encryptWithPHP($K, $key_length, $IV, $P = null, $A = null, $tag_length = 128){list($J0, $v, $a_len_padding, $H) = self::common($K, $key_length, $IV, $A);$C = self::getGCTR($K, $key_length, self::getInc(32, $J0), $P);$u = self::calcVector($C);$c_len_padding = self::addPadding($C);$S = self::getHash($H, $A.str_pad('', $v / 8, "\0").$C.str_pad('', $u / 8, "\0").$a_len_padding.$c_len_padding);$T = self::getMSB($tag_length, self::getGCTR($K, $key_length, $J0, $S));return [$C, $T];}/*** @param string      $K          Key encryption key* @param string      $key_length Key length* @param string      $IV         Initialization vector* @param null|string $P          Data to encrypt (null for authentication)* @param null|string $A          Additional Authentication Data* @param int         $tag_length Tag length** @return array*/private static function encryptWithCryptoExtension($K, $key_length, $IV, $P = null, $A = null, $tag_length = 128){$cipher = \Crypto\Cipher::aes(\Crypto\Cipher::MODE_GCM, $key_length);$cipher->setAAD($A);$cipher->setTagLength($tag_length / 8);$C = $cipher->encrypt($P, $K, $IV);$T = $cipher->getTag();return [$C, $T];}/*** @param string      $K  Key encryption key* @param string      $IV Initialization vector* @param string|null $C  Data to encrypt (null for authentication)* @param string|null $A  Additional Authentication Data* @param string      $T  Tag** @return string*/public static function decrypt($K, $IV, $C, $A, $T){$key_length = mb_strlen($K, '8bit') * 8;$tag_length = self::getLength($T);if (version_compare(PHP_VERSION, '7.1.0RC5') >= 0 && null !== $C) {return self::decryptWithPHP71($K, $key_length, $IV, $C, $A, $T);} elseif (class_exists('\Crypto\Cipher')) {return self::decryptWithCryptoExtension($K, $key_length, $IV, $C, $A, $T, $tag_length);}return self::decryptWithPHP($K, $key_length, $IV, $C, $A, $T, $tag_length);}/*** This method should be used if the tag is appended at the end of the ciphertext.* It is used by some AES GCM implementations such as the Java one.** @param string      $K          Key encryption key* @param string      $IV         Initialization vector* @param string|null $Ciphertext Data to encrypt (null for authentication)* @param string|null $A          Additional Authentication Data* @param int         $tag_length Tag length** @return string** @see self::encryptAndAppendTag*/public static function decryptWithAppendedTag($K, $IV, $Ciphertext = null, $A = null, $tag_length = 128){$tag_length_in_bits = $tag_length / 8;$C = mb_substr($Ciphertext, 0, -$tag_length_in_bits, '8bit');$T = mb_substr($Ciphertext, -$tag_length_in_bits, null, '8bit');return self::decrypt($K, $IV, $C, $A, $T);}/*** @param string      $K          Key encryption key* @param string      $key_length Key length* @param string      $IV         Initialization vector* @param string|null $C          Data to encrypt (null for authentication)* @param string|null $A          Additional Authentication Data* @param string      $T          Tag** @return string*/private static function decryptWithPHP71($K, $key_length, $IV, $C, $A, $T){$mode = 'aes-'.($key_length).'-gcm';$P = openssl_decrypt(null === $C ? '' : $C, $mode, $K, OPENSSL_RAW_DATA, $IV, $T, null === $A ? '' : $A);return $P;}/*** @param string      $K          Key encryption key* @param string      $key_length Key length* @param string      $IV         Initialization vector* @param string|null $C          Data to encrypt (null for authentication)* @param string|null $A          Additional Authentication Data* @param string      $T          Tag* @param int         $tag_length Tag length** @return string*/private static function decryptWithPHP($K, $key_length, $IV, $C, $A, $T, $tag_length = 128){list($J0, $v, $a_len_padding, $H) = self::common($K, $key_length, $IV, $A);$P = self::getGCTR($K, $key_length, self::getInc(32, $J0), $C);$u = self::calcVector($C);$c_len_padding = self::addPadding($C);$S = self::getHash($H, $A.str_pad('', $v / 8, "\0").$C.str_pad('', $u / 8, "\0").$a_len_padding.$c_len_padding);$T1 = self::getMSB($tag_length, self::getGCTR($K, $key_length, $J0, $S));return $P;}/*** @param string      $K          Key encryption key* @param string      $key_length Key length* @param string      $IV         Initialization vector* @param string|null $C          Data to encrypt (null for authentication)* @param string|null $A          Additional Authentication Data* @param string      $T          Tag* @param int         $tag_length Tag length** @return string*/private static function decryptWithCryptoExtension($K, $key_length, $IV, $C, $A, $T, $tag_length = 128){$cipher = \Crypto\Cipher::aes(\Crypto\Cipher::MODE_GCM, $key_length);$cipher->setTag($T);$cipher->setAAD($A);$cipher->setTagLength($tag_length / 8);return $cipher->decrypt($C, $K, $IV);}/*** @param $K* @param $key_length* @param $IV* @param $A** @return array*/private static function common($K, $key_length, $IV, $A){$H = openssl_encrypt(str_repeat("\0", 16), 'aes-'.($key_length).'-ecb', $K, OPENSSL_NO_PADDING | OPENSSL_RAW_DATA); //---$iv_len = self::getLength($IV);if (96 === $iv_len) {$J0 = $IV.pack('H*', '00000001');} else {$s = self::calcVector($IV);$packed_iv_len = pack('N', $iv_len);$iv_len_padding = str_pad($packed_iv_len, 8, "\0", STR_PAD_LEFT);$hash_X = $IV.str_pad('', ($s + 64) / 8, "\0").$iv_len_padding;$J0 = self::getHash($H, $hash_X);}$v = self::calcVector($A);$a_len_padding = self::addPadding($A);return [$J0, $v, $a_len_padding, $H];}/*** @param string $value** @return int*/private static function calcVector($value){return (128 * ceil(self::getLength($value) / 128)) - self::getLength($value);}/*** @param string $value** @return string*/private static function addPadding($value){return str_pad(pack('N', self::getLength($value)), 8, "\0", STR_PAD_LEFT);}/*** @param string $x** @return int*/private static function getLength($x){return mb_strlen($x, '8bit') * 8;}/*** @param int $num_bits* @param int $x** @return string*/private static function getMSB($num_bits, $x){$num_bytes = $num_bits / 8;return mb_substr($x, 0, $num_bytes, '8bit');}/*** @param int $num_bits* @param int $x** @return string*/private static function getLSB($num_bits, $x){$num_bytes = ($num_bits / 8);return mb_substr($x, -$num_bytes, null, '8bit');}/*** @param int $s_bits* @param int $x** @return string*/private static function getInc($s_bits, $x){$lsb = self::getLSB($s_bits, $x);$X = self::toUInt32Bits($lsb) + 1;$res = self::getMSB(self::getLength($x) - $s_bits, $x).pack('N', $X);return $res;}/*** @param string $bin** @return mixed*/private static function toUInt32Bits($bin){list(, $h, $l) = unpack('n*', $bin);return $l + ($h * 0x010000);}/*** @param $X* @param $Y** @return string*/private static function getProduct($X, $Y){$R = pack('H*', 'E1').str_pad('', 15, "\0");$Z = str_pad('', 16, "\0");$V = $Y;$parts = str_split($X, 4);$x = sprintf('%032b%032b%032b%032b', self::toUInt32Bits($parts[0]), self::toUInt32Bits($parts[1]), self::toUInt32Bits($parts[2]), self::toUInt32Bits($parts[3]));$lsb_mask = "\1";for ($i = 0; $i < 128; $i++) {if ($x[$i]) {$Z = self::getBitXor($Z, $V);}$lsb_8 = mb_substr($V, -1, null, '8bit');if (ord($lsb_8 & $lsb_mask)) {$V = self::getBitXor(self::shiftStringToRight($V), $R);} else {$V = self::shiftStringToRight($V);}}return $Z;}/*** @param string $input** @return string*/private static function shiftStringToRight($input){$width = 4;$parts = array_map('self::toUInt32Bits', str_split($input, $width));$runs = count($parts);for ($i = $runs - 1; $i >= 0; $i--) {if ($i) {$lsb1 = $parts[$i - 1] & 0x00000001;if ($lsb1) {$parts[$i] = ($parts[$i] >> 1) | 0x80000000;$parts[$i] = pack('N', $parts[$i]);continue;}}$parts[$i] = ($parts[$i] >> 1) & 0x7FFFFFFF;$parts[$i] = pack('N', $parts[$i]);}$res = implode('', $parts);return $res;}/*** @param string $H* @param string $X** @return mixed*/private static function getHash($H, $X){$Y = [];$Y[0] = str_pad('', 16, "\0");$num_blocks = (int) (mb_strlen($X, '8bit') / 16);for ($i = 1; $i <= $num_blocks; $i++) {$Y[$i] = self::getProduct(self::getBitXor($Y[$i - 1], mb_substr($X, ($i - 1) * 16, 16, '8bit')), $H);}return $Y[$num_blocks];}/*** @param string $K* @param int    $key_length* @param string $ICB* @param string $X** @return string*/private static function getGCTR($K, $key_length, $ICB, $X){if (empty($X)) {return '';}$n = (int) ceil(self::getLength($X) / 128);$CB = [];$Y = [];$CB[1] = $ICB;for ($i = 2; $i <= $n; $i++) {$CB[$i] = self::getInc(32, $CB[$i - 1]);}$mode = 'aes-'.($key_length).'-ecb';for ($i = 1; $i < $n; $i++) {$C = openssl_encrypt($CB[$i], $mode, $K, OPENSSL_NO_PADDING | OPENSSL_RAW_DATA);$Y[$i] = self::getBitXor(mb_substr($X, ($i - 1) * 16, 16, '8bit'), $C);}$Xn = mb_substr($X, ($n - 1) * 16, null, '8bit');$C = openssl_encrypt($CB[$n], $mode, $K, OPENSSL_NO_PADDING | OPENSSL_RAW_DATA);$Y[$n] = self::getBitXor($Xn, self::getMSB(self::getLength($Xn), $C));return implode('', $Y);}/*** @param string $o1* @param string $o2** @return string*/private static function getBitXor($o1, $o2){$xorWidth = PHP_INT_SIZE;$o1 = str_split($o1, $xorWidth);$o2 = str_split($o2, $xorWidth);$res = '';$runs = count($o1);for ($i = 0; $i < $runs; $i++) {$res .= $o1[$i] ^ $o2[$i];}return $res;}
}

特别说明:如果你复制过去调试不行,请下载样例自己再去封装一下就行了

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

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

相关文章

基于jsp+mysql+Spring+mybatis的SSM汽车保险理赔管理系统设计和实现

基于jspmysqlSpringmybatis的SSM汽车保险理赔管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…

vue3速查笔记

文章目录 一、创建Vue3.0工程1.使用 vue-cli 创建2.使用 vite 创建 二、常用 Composition API1.拉开序幕的setup2.ref函数3.reactive函数4.Vue3.0中的响应式原理vue2.x的响应式Vue3.0的响应式 5.reactive对比ref6.setup的两个注意点7.计算属性与监视1.computed函数2.watch函数3…

find_package 总结

本文参考&#xff1a;“轻松搞定CMake”系列之find_package用法详解 原理 find_package 即在指定目录CMAKE_MODULE_PATH 或 CMAKE_PREFIX_PATH查找对应的cmake文件。 find 模式 Module模式(默认)&#xff1a;查询Findxxx.cmake配置文件, 在CMAKE_MODULE_PATH 目录Config模式…

[SaaS] 家作->装修设计师

淘宝设计AI&#xff0c;人人都能成为装修设计师构建用户对未来家的想象&#xff0c;是家装家居多年来持续探索的方向&#xff0c;如今我们用AI帮助用户“更快、更好、更简单”看到自己未来的家。https://mp.weixin.qq.com/s/Pk1xztEd17JefXp79FHKNA其实就是个商品白底图inpaint…

SQLiteC/C++接口详细介绍-sqlite3类(一)

快速跳转文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口简介 下一篇&#xff1a;SQLiteC/C接口详细介绍&#xff08;二&#xff09; 引言&#xff1a; SQLite C/C 数据库接口是一个流行的SQLite库使用形式&#xff0c;它允许开发者在C和C代码中嵌…

WPF布局、控件与样式

视频来源&#xff1a;https://www.bilibili.com/video/BV1HC4y1b76v/ 布局 常用布局属性 HorizontalAlignment&#xff1a;用于设置元素的水平位置VerticalAlignment&#xff1a;用于设置元素的垂直位置Margin&#xff1a;指定元素与容器的边距Height&#xff1a;指定元素的…

解决驱动开发中<stdlib.h> no such file 的问题

前言 在进行驱动开发时&#xff0c;需要使用malloc等函数&#xff0c;导入C库<stdlib.h>出现bug。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论…

深度学习十大算法-快速掌握!

自2006年深度学习概念被提出以来&#xff0c;20年快过去了&#xff0c;深度学习作为人工智能领域的一场革命&#xff0c;已经催生了许多具有影响力的算法。那么&#xff0c;你所认为深度学习的top10算法有哪些呢&#xff1f; 以下是大力哥我心目中的深度学习top10算法&#xff…

案例分析篇09:Web架构设计相关20个考点(7~11)(2024年软考高级系统架构设计师冲刺知识点总结)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

github 中的java前后端项目整合到本地运行

前言: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

ES6:箭头函数中的this指向问题

普通函数中的this指向函数的调用者 例子&#xff1a; 黑马程序员的说法&#xff1a;箭头函数不会创建自己的this&#xff0c;它只会从自己的作用域链的上一层沿用this 尚硅谷的说法&#xff1a;this始终指向函数声明时所在作用域下的this的值 通俗理解就是箭头函数中找this&…

Linux搭建我的世界(MC)整合包服务器,All the Mods 9(ATM9)整合包开服教程

Linux使用MCSM面板搭建我的世界(Minecraft)整合包服务器&#xff0c;MC开服教程&#xff0c;All the Mods 9(ATM9)整合包搭建服务器的教程。 本教程使用Docker来运行mc服&#xff0c;可以方便切换不同Java版本&#xff0c;方便安装多个mc服版本。 视频教程&#xff1a;https:…

vue3+ts+element-plus实际开发之统一掉用弹窗封装

vue3tselement-plus实际开发之统一掉用弹窗封装 插槽1. 官网介绍先理解 插槽、具名插槽、 作用域插槽、动态插槽名、具名作用域插槽属性和使用方法 2. 统一调用弹窗封装dome实战- 使用场景&#xff1a;- 对el-dialog进行数据动态设置- 新建一个ts文件用于统一存放组件&#xff…

设备维修带来的无限价值——易点易动设备管理系统的优势

在化工工厂中&#xff0c;设备的正常运行是保障生产顺利进行的关键。然而&#xff0c;设备难免会出现故障和损坏&#xff0c;而及时有效的设备维修对于提高生产效率和降低成本至关重要。为了解决这一问题&#xff0c;易点易动设备管理系统应运而生&#xff0c;以其卓越的功能和…

【微服务学习笔记(一)】Nacos、Feign、Gateway基础使用

【微服务学习笔记&#xff08;一&#xff09;】Nacos、Feign、Gateway基础使用 总览Nacos安装配置Nacos注册中心服务多级存储模型负载均衡规则环境隔离 配置管理配置拉取配置热更新多服务共享配置 Feign远程调用配置性能优化Fegin使用 统一网关Gateway搭建网关路由断言工厂&…

【漏洞复现】畅捷通T+ GetStoreWarehouseByStore接口处存在反序列化RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

扫雷小游戏制作教程:用HTML5和JavaScript打造经典游戏

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

网络流量监控软件AnaTraf:优化性能、排除故障的最佳选择

目录 导言 网络流量监控的重要性 AnaTraf网络万用表的功能与优势 网络故障排除与优化网络性能 结论 导言 在当今数字化时代&#xff0c;计算机网络已经成为企业和组织的核心基础设施。然而&#xff0c;网络流量的管理和监控对于确保网络性能的稳定和优化至关重要。本文将介…

数码管动态扫描显示

摸鱼记录 Day_16 (&#xff9f;O&#xff9f;) review 前边已经学习了&#xff1a; 串口接收&#xff1a;Vivado 串口接收优化-CSDN博客 1. 今日摸鱼任务 串口接收数据 并用数码管显示 (&#xff9f;O&#xff9f;) 小梅哥视频&#xff1a; 17A 数码管段码显示与动态扫…

使用点链云管家创建瑜伽约课小程序

点链云管家 点链云管家是由上海点链科技开发的门店管理系统&#xff0c;为线下门店商家提供一站式门店运营服务平台解决方案&#xff0c;适用于瑜伽健身、美业、新零售会员制电商、母婴店、宠物店、按摩养生、服装、美容、美甲、汽车服务、商超零售、餐饮、KTV娱乐、干洗等18个…