当前位置: 首页 > news >正文

PHP之hyperf学习笔记

Hyperf

Model,Dao,Service,Contronller

路由

  • 使用文件来配置路由,就是和laravel一样的
Router::addGroup(["middleware" => ["web", "auth"],"namespace" => "Hyperf\HttpServer\Controller","prefix" => "hyperf",
],function (Router $router){Router::get("/", "Hyperf\Hyperf\Controller\IndexController@index");
});
  • 使用注解去配置路由
    #[Controller(“prefix”)]
    #[AutoController(“prefix”)]
    #[RequestMapping(path:‘index’,method:“get,post”)]
    #[GetMapping(path:“index”)]

依赖注入

  • DI依赖注入
  • IOC控制反转
  • #[Inject]
  • private UserService $user;
  • 所有的DI都是单列模式的
  • /config/dependencies.php 就是可以配置接口类和工厂类的关系
  • //接口::class => 实体类::class 这样就可以注入接口的时候就是自动转化为实体类进行注入 会去调用实体类的public function __invoke 方法
  • DI创建出来的都是单例,都是唯一的,会被所有的协程去使用

AOP

  • 被切入的类必须要是DI管理的,要使用AOP必须要切入,直接new是不行的
  • 定义一个切面 文件夹Aspect创建一个切面类 继承AbstractAspect
  • 这个是切面的函数
<?php
namespace App\Aspect;use App\Service\SomeClass;
use App\Annotation\SomeAnnotation;
use Hyperf\Di\Annotation\Aspect;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;#[Aspect]
class FooAspect extends AbstractAspect
{// 要切入的类或 Trait,可以多个,亦可通过 :: 标识到具体的某个方法,通过 * 可以模糊匹配//定义要切入的类 public array $classes = [SomeClass::class,'App\Service\SomeClass::someMethod','App\Service\SomeClass::*Method',];// 要切入的注解,具体切入的还是使用了这些注解的类,仅可切入类注解和类方法注解public array $annotations = [SomeAnnotation::class,];public function process(ProceedingJoinPoint $proceedingJoinPoint){// 切面切入后,执行对应的方法会由此来负责// $proceedingJoinPoint 为连接点,通过该类的 process() 方法调用原方法并获得结果// 在调用前进行某些处理$result = $proceedingJoinPoint->process();// 在调用后进行某些处理return $result;}
}
  • 直接使用注解配置来达到和上面一样的目的
<?php
namespace App\Aspect;use App\Service\SomeClass;
use App\Annotation\SomeAnnotation;
use Hyperf\Di\Annotation\Aspect;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;#[Aspect(classes: [SomeClass::class,"App\Service\SomeClass::someMethod","App\Service\SomeClass::*Method"],annotations: [SomeAnnotation::class])
]
class FooAspect extends AbstractAspect
{public function process(ProceedingJoinPoint $proceedingJoinPoint){// 切面切入后,执行对应的方法会由此来负责// $proceedingJoinPoint 为连接点,通过该类的 process() 方法调用原方法并获得结果// 在调用前进行某些处理$result = $proceedingJoinPoint->process();// 在调用后进行某些处理return $result;}
}
  • 在aspect中获取一些需要的参数 以更灵活的实现aspect
<?php
namespace App\Aspect;use App\Service\SomeClass;
use App\Annotation\SomeAnnotation;
use Hyperf\Di\Annotation\Aspect;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;#[Aspect]
class FooAspect extends AbstractAspect
{public array $classes = [SomeClass::class,'App\Service\SomeClass::someMethod','App\Service\SomeClass::*Method',];public array $annotations = [SomeAnnotation::class,];public function process(ProceedingJoinPoint $proceedingJoinPoint){// 获取当前方法反射原型/** @var \ReflectionMethod **/$reflect = $proceedingJoinPoint->getReflectMethod();// 获取调用方法时提交的参数$arguments = $proceedingJoinPoint->getArguments(); // array// 获取原类的实例并调用原类的其他方法$originalInstance = $proceedingJoinPoint->getInstance();$originalInstance->yourFunction();// 获取注解元数据/** @var \Hyperf\Di\Aop\AnnotationMetadata **/$metadata = $proceedingJoinPoint->getAnnotationMetadata();// 调用不受代理类影响的原方法$proceedingJoinPoint->processOriginalMethod();// 不执行原方法,做其他操作$result = date('YmdHis', time() - 86400);return $result;}
}
  • 代理类缓存 config/config.php scan_cacheable

注解

  • 没搞清楚使用在哪里 下次在来

事件机制

  • 这个有点像是队列的意思
  • 其实就是为了解耦
  • 定义一个事件 这个事件来了就是要做一些其他的操作 用户注册事件,用户注册完之后可能要做一些其他的事情,比如发送邮箱什么的
  • 定义一个事件
<?php
namespace App\Event;class UserRegistered
{// 建议这里定义成 public 属性,以便监听器对该属性的直接使用,或者你提供该属性的 Getterpublic $user;public function __construct($user){$this->user = $user;    }
}
  • 定义一个监听器
<?php
namespace App\Listener;use App\Event\UserRegistered;
use Hyperf\Event\Contract\ListenerInterface;class UserRegisteredListener implements ListenerInterface
{public function listen(): array{// 返回一个该监听器要监听的事件数组,可以同时监听多个事件return [UserRegistered::class,];}/*** @param UserRegistered $event*/public function process(object $event): void{// 事件触发后该监听器要执行的代码写在这里,比如该示例下的发送用户注册成功短信等// 直接访问 $event 的 user 属性获得事件触发时传递的参数值// $event->user;}
}
  • 去配置监听器 让这个监听器在监听
  • config/autoload/listeners.php
<?php
return [\App\Listener\UserRegisteredListener::class,
];
  • 通过注解去实现监听器
<?php
namespace App\Listener;use App\Event\UserRegistered;
use Hyperf\Event\Annotation\Listener;
use Hyperf\Event\Contract\ListenerInterface;#[Listener]
class UserRegisteredListener implements ListenerInterface
{public function listen(): array{// 返回一个该监听器要监听的事件数组,可以同时监听多个事件return [UserRegistered::class,];}/*** @param UserRegistered $event*/public function process(object $event): void{// 事件触发后该监听器要执行的代码写在这里,比如该示例下的发送用户注册成功短信等// 直接访问 $event 的 user 属性获得事件触发时传递的参数值// $event->user;}
}
在通过注解注册监听器时,我们可以通过设置 priority 属性定义当前监听器的顺序,如 #[Listener(priority=1)] ,底层使用 SplPriorityQueue 结构储存,priority 数字越大优先级越高
  • 对监听器的一个使用
<?php
namespace App\Service;use Hyperf\Di\Annotation\Inject;
use Psr\EventDispatcher\EventDispatcherInterface;
use App\Event\UserRegistered; class UserService
{#[Inject]private EventDispatcherInterface $eventDispatcher;public function register(){// 我们假设存在 User 这个实体$user = new User();$result = $user->save();// 完成账号注册的逻辑// 这里 dispatch(object $event) 会逐个运行监听该事件的监听器$this->eventDispatcher->dispatch(new UserRegistered($user));return $result;}
}

中间件

  • config/autoload/middlewares.php 全局中间件
<?php
return [// http 对应 config/autoload/server.php 内每个 server 的 name 属性对应的值,该配置仅应用在该 Server 中'http' => [// 数组内配置您的全局中间件,顺序根据该数组的顺序YourMiddleware::class],
];
  • 使用注解的方式 #[Middleware(FooMiddleware::class)]
  • 多个中间件 #[Middleware([FooMiddleware::class,barMiddleware::class])]
  • 生成中间件 php ./bin/hyperf.php gen:middleware Auth/FooMiddleware
<?phpdeclare(strict_types=1);namespace App\Middleware\Auth;use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;class FooMiddleware implements MiddlewareInterface
{protected ContainerInterface $container;protected RequestInterface $request;protected HttpResponse $response;public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request){$this->container = $container;$this->response = $response;$this->request = $request;}public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface{// 根据具体业务判断逻辑走向,这里假设用户携带的token有效$isValidToken = true;if ($isValidToken) {return $handler->handle($request);}return $this->response->json(['code' => -1,'data' => ['error' => '中间件验证token无效,阻止继续向下执行',],]);}
}
  • 中间件的执行顺序
// 全局中间件配置文件 middleware.php
return ['http' => [YourMiddleware::class,YourMiddlewareB::class => 3,],
];
  • 中间件的注解方式
// 注解中间件配置
#[AutoController]
#[Middleware(FooMiddleware::class)]
#[Middleware(FooMiddlewareB::class, 3)]
#[Middlewares([FooMiddlewareC::class => 1, BarMiddlewareD::class => 4])]
class IndexController
{}
  • 如果要在中间件中修改$request那么需要使用功能Context去改变
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;// $request 和 $response 为修改后的对象
$request = \Hyperf\Context\Context::set(ServerRequestInterface::class, $request);
$response = \Hyperf\Context\Context::set(ResponseInterface::class, $response);
  • 默认情况下在处理路由的时候,找不到或者什么都是执行CoreMiddleware 可以重写这个方法
  • 跨域中间件 hyperf官网有

请求Request

  • 在hyperf中一般注入的都是RequestInterface
  • 常用方法的集合
$request->path();
$request->url();
$request->fullUrl();
$request->getMethod();
$request->all();
$request->input("name",'most');
// 存在则返回,不存在则返回 null
$name = $request->query('name');
// 存在则返回,不存在则返回默认值 Hyperf
$name = $request->query('name', 'Hyperf');
// 不传递参数则以关联数组的形式返回所有 Query 参数
$name = $request->query();
$request->has('name');
$request->cookie('name');
// 存在则返回一个 Hyperf\HttpMessage\Upload\UploadedFile 对象,不存在则返回 null
$file = $request->file('photo');
if ($request->hasFile('photo')) {// ...
}
if ($request->file('photo')->isValid()) {// ...
}
// 该路径为上传文件的临时路径
$path = $request->file('photo')->getPath();// 由于 Swoole 上传文件的 tmp_name 并没有保持文件原名,所以这个方法已重写为获取原文件名的后缀名
$extension = $request->file('photo')->getExtension();
$file = $request->file('photo');
$file->moveTo('/foo/bar.jpg');// 通过 isMoved(): bool 方法判断方法是否已移动
if ($file->isMoved()) {// ...
}

响应Responce

  • r e s p o n s e − > j s o n ( response->json( response>json(data);
  • r e s p o n s e − > x m l ( response->xml( response>xml(data);
  • $response->raw(‘Hello Hyperf.’);
  • 还有问价下载的方法具体看文档

控制器

  • 实现interface接口类

异常

<?php
namespace App\Exception\Handler;use Hyperf\ExceptionHandler\ExceptionHandler;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Psr\Http\Message\ResponseInterface;
use App\Exception\FooException;
use Throwable;
class FooExceptionHandler extends  ExceptionHandler
{public function handle(Throwable $throwable, ResponseInterface $response){// 判断被捕获到的异常是希望被捕获的异常if ($throwable instanceof FooException) {// 格式化输出$data = json_encode(['code' => $throwable->getCode(),'message' => $throwable->getMessage(),], JSON_UNESCAPED_UNICODE);// 阻止异常冒泡$this->stopPropagation();return $response->withStatus(500)->withBody(new SwooleStream($data));}// 交给下一个异常处理器return $response;// 或者不做处理直接屏蔽异常}/*** 判断该异常处理器是否要对该异常进行处理*/public function isValid(Throwable $throwable): bool{return true;}
}

缓存

  • SimpleCache
$cache = $container->get(\Psr\SimpleCache\CacheInterface::class);
  • 这文档缓存讲的不太行

日志

  • 就这样的吧 讲的也不太行

分页器

  • 没啥好讲的 默认是自动读取page的
  • UserModel::paginate(10)

自动化测试

  • 模拟http请求
<?php
use Hyperf\Testing\Client;
$client = make(Client::class);
$result = $client->get('/');

验证器

  • 全局验证器 在server.php 中配置
<?php
return [// 下面的 http 字符串对应 config/autoload/server.php 内每个 server 的 name 属性对应的值,意味着对应的中间件配置仅应用在该 Server 中'http' => [// 数组内配置您的全局中间件,顺序根据该数组的顺序\Hyperf\Validation\Middleware\ValidationMiddleware::class// 这里隐藏了其它中间件],
];
  • 使用方式
  • 1.创建一个验证器
php bin/hyperf.php gen:request FooRequest
  • 2.编写规则
/*** 获取应用到请求的验证规则*/
public function rules(): array
{return ['foo' => 'required|max:255','bar' => 'required',];
}

-3. 使用

<?php
namespace App\Controller;use App\Request\FooRequest;class IndexController
{public function index(FooRequest $request){// 传入的请求通过验证...// 获取通过验证的数据...$validated = $request->validated();}
}
  • 可以添加一个自定义的异常类来处理这个文件
  • 验证规则要去看

数据库模型

  • 执行原生sql
<?php
use Hyperf\DbConnection\Db;
$users = Db::select('SELECT * FROM `user` WHERE gender = ?',[1]);  //  返回array 
foreach($users as $user){echo $user->name;
}
//执行类
<?phpuse Hyperf\DbConnection\Db;$inserted = Db::insert('INSERT INTO user (id, name) VALUES (?, ?)', [1, 'Hyperf']); // 返回是否成功 bool$affected = Db::update('UPDATE user set name = ? WHERE id = ?', ['John', 1]); // 返回受影响的行数 int$affected = Db::delete('DELETE FROM user WHERE id = ?', [1]); // 返回受影响的行数 int$result = Db::statement("CALL pro_test(?, '?')", [1, 'your words']);  // 返回 bool  CALL pro_test(?,?) 为存储过程,属性为 MODIFIES SQL DATA
  • 事务
use Hyperf\DbConnection\Db;Db::beginTransaction();
try{// Do something...Db::commit();
} catch(\Throwable $ex){Db::rollBack();
}
  • 打印最后一条sql
// 打印最后一条 SQL 相关数据
var_dump(Arr::last(Db::getQueryLog()));
  • 获取的多个值是Collection 获取的单个值是stdClass
  • 获取第一条 ->first()
  • 获取第一列值 ->pluck(‘name’) 也可以多个 ->p
  • 获取单个值 ->value(“id”)
  • 查询指定字段 ->select(‘id’,‘name’,‘gender’)
  • Or
$users = Db::table('user')->where('gender', 1)->orWhere('name', 'John')->get();
  • whereBetween
$users = Db::table('users')->whereBetween('votes', [1, 100])->get();

模型

  • 创建模型 php ./bin/hyper.php gen:model table_name
  • 时间戳
<?php
declare(strict_types=1);
namespace App\Model;
use Hyperf\DbConnection\Model\Model;
class User extends Model
{public bool $timestamps = false;
}
  • 保护属性 f i l l a b l e 可填充, fillable 可填充, fillable可填充,guarded 保护属性
  • 配置软删除
<?php
namespace App\Model;
use Hyperf\Database\Model\Model;
use Hyperf\Database\Model\SoftDeletes;
class User extends Model
{use SoftDeletes;
}

模型关系

  • 一对一 User有一个Role
<?php
declare(strict_types=1);
namespace App\Models;
use Hyperf\DbConnection\Model\Model;
class User extends Model
{public function role(){第一个参数 one的类,User表中的外键 主键 一对一是主表需要有外键 当然谁都可以成为主表return $this->hasOne(Role::class, 'user_id', 'id');}
}
  • 一对多 User有多个Book
<?phpdeclare(strict_types=1);namespace App\Models;use Hyperf\DbConnection\Model\Model;class User extends Model
{public function books(){return $this->hasMany(Book::class, 'user_id', 'id');}
}
  • 一对多反向 属于关系
<?phpdeclare(strict_types=1);namespace App\Models;use Hyperf\DbConnection\Model\Model;class Book extends Model
{public function author(){//参数永远都是外键 然后主键return $this->belongsTo(User::class, 'user_id', 'id');}
}
  • 多对多
  • 假设User表和Role
  • 前置条件 role_id user_id 中间表 role_user
<?phpnamespace App;use Hyperf\DbConnection\Model\Model;class User extends Model
{public function roles(){外表,中间表,自己的的外键,外键  记住这个顺序 基本都是按这个顺序来的return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');//return $this->belongsToMany(Role::class);}
}
  • 获取中间表字段
$user = User::find(1);foreach ($user->roles as $role) {echo $role->pivot->created_at;
}
  • 如果需要其他字段需要在关联的时候指出
return $this->belongsToMany(Role::class)->withPivot('column1', 'column2');

访问器&修改器

  • 访问器
<?phpnamespace App;use Hyperf\DbConnection\Model\Model;class User extends Model
{/*** 获取用户的姓名.** @param  string  $value* @return string*/public function getFirstNameAttribute($value){return ucfirst($value);}
}
  • 修改器
<?phpnamespace App;use Hyperf\DbConnection\Model\Model;class User extends Model
{/*** 设置用户的姓名.** @param  string  $value* @return void*/public function setFirstNameAttribute($value){$this->attributes['first_name'] = strtolower($value);}
}

相关文章:

PHP之hyperf学习笔记

Hyperf Model,Dao&#xff0c;Service&#xff0c;Contronller 路由 使用文件来配置路由&#xff0c;就是和laravel一样的 Router::addGroup(["middleware" > ["web", "auth"],"namespace" > "Hyperf\HttpServer\Contr…...

C++STL(六)——list模拟

目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…...

Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?

1、两者概述 拦截器&#xff08;Interceptor&#xff09;&#xff1a; 只会拦截那些被 Controller 或 RestController 标注的类中的方法处理的请求&#xff0c;也就是那些由 Spring MVC 调度的请求。过滤器&#xff08;Filter&#xff09;&#xff1a; 会拦截所有类型的 HTTP …...

MySQL查询主从同步状态

在MySQL中&#xff0c;监控和检查主从复制&#xff08;Master-Slave replication&#xff09;的状态是非常重要的&#xff0c;这有助于确保数据的一致性和完整性。以下是一些常用的方法&#xff0c;可以帮助你查询MySQL的主从数据同步状态&#xff1a; 1. 查看主服务器状态 首…...

docker 安装 --在线方式

第一步&#xff1a; #!/bin/bash sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo sudo sed -i -e /mirrors.cloud.aliyuncs.com/d -e /mirrors.aliyuncs.com/d /etc/yum.repos.d/CentOS-Base.repo sudo curl -o /etc/yum.repo…...

Linux系统-centos防火墙firewalld详解

Linux系统-centos7.6 防火墙firewalld详解 1 firewalld了解 CentOS 7.6默认的防火墙管理工具是firewalld&#xff0c;它取代了之前的iptables防火墙。firewalld属于典型的包过滤防火墙或称之为网络层防火墙&#xff0c;与iptables一样&#xff0c;都是用来管理防火墙的工具&a…...

物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统

随着物联网技术的飞速发展&#xff0c;物联网软件开发与应用方向成为了众多开发者关注的焦点。那么&#xff0c;如何在这个领域中脱颖而出呢&#xff1f;本文将为你提供一份详细的学习指南&#xff0c;帮助你从零开始&#xff0c;逐步掌握物联网软件开发与应用的核心技能。 一…...

【大模型】DeepSeek与chatGPT的区别以及自身的优势

目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…...

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…...

qt widget和qml界面集成到一起

将 Qt Widgets 和 QML 界面集成在一起可以利用 QQuickWidget 或 QQuickView。以下是基本步骤: 使用 QQuickWidget 创建 Qt Widgets 项目: 创建一个基于 Widgets 的应用程序。添加 QQuickWidget: 在你的窗口或布局中添加 QQuickWidget。 例如,可以在 QMainWindow 中使用: …...

mybatis 是否支持延迟加载?延迟加载的原理是什么?

1. MyBatis 是否支持延迟加载&#xff1f; 是的&#xff0c;MyBatis 支持延迟加载。延迟加载的主要功能是推迟数据加载的时机&#xff0c;直到真正需要时再去加载。这种方式能提高性能&#xff0c;尤其是在处理关系型数据时&#xff0c;可以避免不必要的数据库查询。 具体来说…...

MariaDB MaxScale实现mysql8主从同步读写分离

一、MaxScale基本介绍 MaxScale是maridb开发的一个mysql数据中间件&#xff0c;其配置简单&#xff0c;能够实现读写分离&#xff0c;并且可以根据主从状态实现写库的自动切换&#xff0c;对多个从服务器能实现负载均衡。 二、MaxScale实验环境 中间件192.168.121.51MaxScale…...

【图片转换PDF】多个文件夹里图片逐个批量转换成多个pdf软件,子文件夹单独合并转换,子文件夹单独批量转换,基于Py的解决方案

建筑设计公司在项目执行过程中&#xff0c;会产生大量的设计图纸、效果图、实景照片等图片资料。这些资料按照项目名称、阶段、专业等维度存放在多个文件夹和子文件夹中。 操作需求&#xff1a;为了方便内部管理和向客户交付完整的设计方案&#xff0c;公司需要将每个项目文件…...

基于logback+fastjson实现日志脱敏

一、需求背景 日常工作中&#xff0c;必不可免的会将一些敏感信息&#xff0c;如用户名、密码、手机号、身份证号、银行账号等等打印出来&#xff0c;但往往为了安全&#xff0c;这些信息都需要进行脱敏。脱敏实际就是用一些特殊字符来替换部分值。 JSON 和 JSONObject Fastj…...

13.10 统一配置管理中心:TranslationChain 架构的简洁配置管理方案

统一配置管理中心:TranslationChain 架构的简洁配置管理方案 1. 集中式配置文件设计 config/settings.yaml: # 多环境配置开关 env: production # development|test|production# 模型管理中心 models:openai:class: langchain_openai.ChatOpenAIparams...

deepseek大模型集成到idea

1 下载插件 安装CodeGPT打开 IntelliJ IDEA&#xff0c;鼠标点击左上角导航栏&#xff0c;File --> Setting 2 申请API key 3 配置deepseek 在 Settings 界面中的搜索框中&#xff0c;搜索 CodeGPT&#xff0c;路径 Tools --> CodeGPT --> Providers --> 如下一…...

Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡

Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒&#xff0c;如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡 实战操作 去除权限 要在 Cocos2d-x 开发的游戏中去掉 APK 自带权限&#xff0c;可以按照以下步骤操作&#xff1a; 编辑 AndroidMa…...

gitlab多项目流水线

背景是我有多个项目&#xff0c;希望其中一个项目被触发的时候&#xff0c;联动另外一个项目自动打包。然后我就看文档尝试操作了一下&#xff0c;所以有本文。 官方文档参考&#xff1a;https://gitlab.cn/docs/14.5/jh/ci/pipelines/multi_project_pipelines.html 不知道是不…...

GWO优化决策树回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;是一种群智能优化算法&#xff0c;由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;核心思想是模仿灰狼社会的结构与行为模式。 在本…...

2025影视泛目录站群程序设计_源码二次开发新版本无缓存刷新不变实现原理

1. 引言 本设站群程序计书旨在详细阐述苹果CMS泛目录的创新设计与实现&#xff0c;介绍无缓存刷新技术、数据统一化、局部URL控制及性能优化等核心功能&#xff0c;以提升网站访问速度和用户体验。 2. 技术概述 2.1 无缓存刷新技术 功能特点&#xff1a; 内容不变性&#x…...

在Linux上创建虚拟网卡

在 Linux 上创建虚拟网卡可以通过多种方式进行&#xff0c;常见的方式是使用 ip 命令来配置虚拟网卡。以下是一个简单的步骤指南&#xff0c;用于创建虚拟网卡&#xff1a; 步骤 1: 查看现有的网络接口 首先&#xff0c;查看当前网络接口的状态&#xff0c;可以使用以下命令&…...

JVM 类加载子系统在干什么?

JVM 类加载子系统是什么&#xff1f; 类加载子系统&#xff08;Class Loader Subsystem&#xff09;是 JVM 负责 加载、链接和初始化 .class 文件的组件。它的主要作用是将字节码文件加载进 JVM 并准备执行。 类加载器&#xff08;ClassLoader&#xff09;是 字节码的搬运工&…...

STM32的HAL库开发---高级定时器---互补输出带死区实验

一、互补输出简介 互补输出&#xff1a;OCx输出高电平&#xff0c;则互补通道OCxN输出低电平。OCx输出低电平&#xff0c;则互补通道OCxN输出高电平。 带死区控制的互补输出&#xff1a;OCx输出高电平时&#xff0c;则互补通道OCxN过一会再输出输出低电平。这个时间里输出的电…...

AntDesign X 报错:Cannot read properties of undefined (reading ‘_context‘)

解决&#xff1a; Cannot read properties of undefined (reading _context) 报错问题 我是基于umi的前端工程&#xff0c;react版本18.2&#xff0c; package.json,全部安装完之后的 "react": "^18.2.0", "ant-design/x": "^1…...

Day62_补20250210_图论part6_108冗余连接|109.冗余连接II

Day62_20250210_图论part6_108冗余连接|109.冗余连接II 108冗余连接 【把题意转化为并查集问题】 题目 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&am…...

06排序 + 查找(D2_查找(D1_基础学习))

目录 温故而知新 -------------------------------- 讲解一&#xff1a;基础理论 一、什么是查找 二、为什么需要查找 -------------------------------- 讲解二&#xff1a;代码学习 一、顺序查找 1. 算法原理 2. 算法步骤 3. Java代码实现 4. 适用场景 5. 知识小…...

SystemVerilog基础:disable fork语句

相关阅读 SystemVerilog基础https://blog.csdn.net/weixin_45791458/category_12517449.html?spm1001.2014.3001.5482 一、进程的概念 在学习disable fork语句之前&#xff0c;首先的了解SystemVerilog中的进程概念&#xff1a;进程是一系列可以独立执行的一个或多个表达式。…...

基于钉钉API的连接器实现:企业数据集成与自动化管理

文章目录 概要背景与需求钉钉API概述连接器实现小结 概要 在当今数字化时代&#xff0c;企业面临着海量数据的管理与整合挑战。钉钉作为国内广泛使用的办公协作平台&#xff0c;提供了丰富的API接口&#xff0c;支持企业进行数据集成与自动化管理。本文将介绍如何通过钉钉API实…...

windows server独立部署Qwen2.5-vl-7B

服务器配置信息 CPU&#xff1a;64G GPU&#xff1a;48G&#xff08;RTX 4090&#xff09; 一、使用conda下载模型 Qwen2.5-VL-7B-Instruct conda下载 conda create --name qwen python3.11 conda activate qwen 魔塔社区下载模型 pip install modelscope modelscope downl…...

nginx安装并部署前端项目【包括Linux与Windows系统】

nginx安装并部署前端项目 一、 nginx下载与安装二、 前端项目部署三、 常用命令&注意事项四、 常见问题【持续更新】 一、 nginx下载与安装 ① 下载地址&#xff1a;https://nginx.org/en/download.html ② 下载教程&#xff1a;根据不同操作系统&#xff08;Linux或者Wi…...

pytest生成报告no tests ran in 0.01s

除了基本的环境配置、用例名要以test_开头&#xff0c;有个地方是我自己忽略了&#xff0c;在执行时没有指定用例文件&#xff0c;所以没有找到。 if __name__ __main__:pytest.main(["testcases/test_demo.py","-svq", __file__, --alluredir./allure-r…...

前后端服务配置

1、安装虚拟机&#xff08;VirtualBox或者vmware&#xff09;&#xff0c;在虚拟机上配置centos(选择你需要的Linux版本)&#xff0c;配置如nginx服务器等 1.1 VMware 下载路径Sign In注册下载 1.2 VirtualBox 下载路径https://www.virtualbox.org/wiki/Downloads 2、配置服…...

一文学会:用DeepSeek R1/V3 + AnythingLLM + Ollama 打造本地化部署的个人/企业知识库,无须担心数据上传云端的泄露问题

文章目录 前言一、AnythingLLM 简介&基础应用1.主要特性2.下载与安装3.配置 LLM 提供商4.AnythingLLM 工作区&对话 二、AnythingLLM 进阶应用&#xff1a;知识增强使用三、AnythingLLM 的 API 访问四、小结1.聊天模式2.本地存储&向量数据库 前言 如果你不知道Olla…...

[学习笔记] Kotlin Compose-Multiplatform

Compose-Multiplatform 原文&#xff1a;https://github.com/zimoyin/StudyNotes-master/blob/master/compose-multiplatform/compose.md Compose Multiplatform 是 JetBrains 为桌面平台&#xff08;macOS&#xff0c;Linux&#xff0c;Windows&#xff09;和Web编写Kotlin UI…...

202406 青少年软件编程等级考试C/C++ 三级真题答案及解析(电子学会)

第 1 题 谷歌的招聘 2004年7月,谷歌在硅谷的101号公路边竖立了一块巨大的广告牌用于招聘。内容超级简单,就是一个以.com 结尾的网址,而前面的网址是一个 10位素数,这个素数是自然常数e中最早出现的 10 位连续数字。能找出这个素数的人,就可以通过访问谷歌的这个网站进入…...

如何在Vue中实现事件处理

在Vue中&#xff0c;事件处理是一个核心概念&#xff0c;它让我们能够响应用户的操作&#xff0c;比如点击按钮、输入文本等。Vue提供了一个简洁而强大的方式来绑定事件和处理事件。本文将介绍如何在Vue中实现事件处理&#xff0c;覆盖事件绑定、事件修饰符以及事件处理函数等内…...

从零到一:基于Rook构建云原生Ceph存储的全面指南(下)

接上篇&#xff1a;《从零到一&#xff1a;基于Rook构建云原生Ceph存储的全面指南&#xff08;上&#xff09;》 链接: link 六.Rook部署云原生CephFS文件系统 6.1 部署cephfs storageclass cephfs文件系统与RBD服务类似&#xff0c;要想在kubernetes pod里使用cephfs&#…...

结合实际讲NR系列2—— SIB1

这是在基站抓取的sib1的一条信令 L3MessageContent BCCH-DL-SCH-Messagemessagec1systemInformationBlockType1cellSelectionInfoq-RxLevMin: -64q-QualMin: -19cellAccessRelatedInfoplmn-IdentityListPLMN-IdentityInfoplmn-IdentityListPLMN-IdentitymccMCC-MNC-Digit: 4MC…...

git rebase 和 git merge的区别

Rebase 可使提交树变得很干净, 所有的提交都在一条线上。 Merge 则是包含所有的调试记录&#xff0c;合并之后&#xff0c;父级的所有信息都会合并在一起 Rebase 修改了提交树的历史 比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的&#xf…...

JavaScript字符串类型详解

目录 一、创建字符串 1. 字面量方式 2. 使用 String 构造函数 二、字符串的不可变性 三、字符串的长度与索引 四、字符串的拼接 1. 使用加号 () 2. 使用模板字符串&#xff08;ES6&#xff09; 五、字符串的常用方法 1. 获取子串 substring(start, end) slice(start…...

Hdoop之MapReduce的原理

简单版本 AppMaster: 整个Job任务的核心协调工具 MapTask: 主要用于Map任务的执行 ReduceTask: 主要用于Reduce任务的执行 一个任务提交Job --> AppMaster(项目经理)--> 根据切片的数量统计出需要多少个MapTask任务 --> 向ResourceManager(Yarn平台的老大)索要资源 --…...

数据仓库和商务智能:洞察数据,驱动决策

在数据管理的众多领域中&#xff0c;数据仓库和商务智能&#xff08;BI&#xff09;是将数据转化为洞察力、支持决策制定的关键环节。它们通过整合、存储和分析数据&#xff0c;帮助组织更好地理解业务运营&#xff0c;预测市场趋势&#xff0c;从而制定出更明智的战略。今天&a…...

可视化工作流编排参数配置完整方案设计文档

​​​一、背景及需求分析 1. 背景 在复杂的工作流程中&#xff0c;后续程序需要动态构造输入参数&#xff0c;这些参数源自多个前序程序的 JSON 数据输出。为了增强系统的灵活性和可扩展性&#xff0c;配置文件需要支持以下功能&#xff1a; 灵活映射前序程序的 JSON 数据。…...

Linux sysfs虚拟文件系统

文章目录 简介sysfs接口sysfs和procfs参考 本文拟对Linux sysfs虚拟文件系统进行简单的介绍和原理分析 简介 测试环境&#xff1a;Linux dev-PC 5.18.17-amd64-desktop-hwe #20.01.00.10 SMP PREEMPT_DYNAMIC Thu Jun 15 16:17:50 CST 2023 x86_64 GNU/Linux sysfs虚拟文件系统…...

C++ 设计模式 - 访问者模式

一&#xff1a;概述 访问者模式将作用于对象层次结构的操作封装为一个对象&#xff0c;并使其能够在不修改对象层次结构的情况下定义新的操作。 《设计模式&#xff1a;可复用面向对象软件的基础》一书中的访问者模式因两个原因而具有传奇色彩&#xff1a;一是因为它的复杂性&a…...

微软编程之C#如何学习,C#学习路线:从入门到精通

引言 C# 是一种由微软开发的面向对象编程语言&#xff0c;广泛应用于 Windows 应用程序开发、游戏开发&#xff08;Unity&#xff09;、Web 开发&#xff08;ASP.NET&#xff09;等领域。对于初学者来说&#xff0c;掌握 C# 不仅能够打开编程世界的大门&#xff0c;还能为未来…...

PromptSource官方文档翻译

目录 核心概念解析 提示模板&#xff08;Prompt Template&#xff09; P3数据集 安装指南 基础安装&#xff08;仅使用提示&#xff09; 开发环境安装&#xff08;需创建提示&#xff09; API使用详解 基本用法 子数据集处理 批量操作 提示创建流程 Web界面操作 手…...

深入理解QT的View-Model-Delegate机制和用法

文章目录 Model-View-Delegate机制Model(数据模型)设置模型属性访问元素操作元素数据排序封装好的模型View(视图)显示数据数据选择Delegate(代理)数据选择易用封装类QListWidgetQTreeWidgetQTableWidget元素拖拽代理模型参考示例Model-View-Delegate机制 Qt的View/Model/Deleg…...

【JavaScript】JavaScript 运行原理

执行上下文 JavaScript引擎会在执行代码之前&#xff0c;会在堆内存中创建一个全局对像&#xff1a;Global Object(GO) 该对象所有的作用域(scope)都可以访问&#xff0c;在浏览器中这个对象就是window&#xff1b;里面会包含Date、Array、StringNumber、setTimeout、setInte…...

力扣hot100刷题第一天

哈希 1. 两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。你可以按任意…...