ASF 基于Swoole开发的PHP App Server框架

【前端框架开发 | Vue.js | 第一篇】Vue.js框架简介、安装及打包教程 正式开始学习前 确保你已学过前端三件套 HTML CSS JavaScriptVue.js是一种流行的JavaScript前端框架,用于构建交互式的、响应式的用户界面。它是一种轻量级、灵活和易于学习的框架,广泛应用于现代Web应用程序开发中。前端框架那么多,为什么Vue.js非学不可?Vue.js的简洁语法和易用性使得它成为构建现代Web应用程序的优秀选择,无论是小型项目还是大型复杂的应用都能发挥出色的效果。Vue.js使用双向绑定的数据模型,将数据和视图进行关联。 阅读详情

App Server Framework(ASF)

简介

  • 当前版本0.01试用版。
  • 框架基于PHP-Swoole扩展开发,通过配置文件可以自定义各种应用协议,默认支持http协议。
  • 框架本身是一个完整的tcp_server,不再需要apache,nginx,fpm这些,框架已包含log处理,mysql访问封装。
  • 框架用fast-route库来做http route处理,直接映射到控制器上,使用者只要写具体的控制器方法就可以实现rest风格的API。
  • 至于性能,可以很低调的说:相当高,具体可以参考swoole相关文档:
    http://www.swoole.com/

安装运行

环境:linux2.6+、php5.5+、mysql5.5+、swoole1.7.20+
下载:https://github.com/xtjsxtj/asf

tar zxvf asf.tar.gz  
cd asf  
php ./bin/asf.php test_http start  

也可以直接进入具体server目录直接运行入口脚本文件:  
cd asf/apps/test_http
php ./index.php

查看当前server进程状态:
php asf/bin/asf.php test_http status

查看所有server运行状态:
php asf/bin/asf.php list

目录结构

ASF
 ├── apps                             #示例server或实际应用server(实际应用不限制一定放在该目录)
 │   ├── test_http                    #具体应用server示例,http_server
 │   │   ├── config                   #应用配置文件目录
 │   │   │   ├── server_conf.php      #server控制进程配置文件
 │   │   │   └── worker_conf.php      #worker处理进程配置文件
 │   │   ├── controller               #应用控制器目录
 │   │   │   ├── base_controller.php  #业务相关控制器的基类
 │   │   │   └── index_controller.php #业务相关具体控制器类
 │   │   └── index.php                #应用入口主文件(不限于该名称),可以单独调用,可以通过bin/asf.php说统一调用
 │   │
 │   └── test_tcp                     #具体应用server示例,http_server
 │       ├── config                   #应用配置文件目录
 │       │   ├── server_conf.php      #server控制进程配置文件
 │       │   └── worker_conf.php      #worker处理进程配置文件
 │       ├── controller               #应用控制器目录
 │       │   ├── base_controller.php  #业务相关控制器的基类
 │       │   └── index_controller.php #业务相关具体控制器类
 │       ├── protocol                 #TCP自定义协议目录
 │       │   └── voip_protocol.php    #VOIP协议自定义解析类
 │       └── index.php                #应用入口主文件(不限于该名称),可以单独调用,可以通过bin/asf.php说统一调用 
 ├── bin
 │   ├── asf.php                      #多server起动状态监控shell脚本
 │   └── asf.ini                      #多server列表配置文件
 └── lib                              #ASF底层代码
     ├── fast-route                   #fast-route库目录
     ├── autoload.php                 #自动加载脚本
     ├── config.php                   #route配置脚本
     ├── controller.php               #控制器父类
     ├── protocol.php                 #tcp协议解析interface     
     ├── log.php                      #日志类
     ├── mysql.php                    #mysql访问类
     ├── route.php                    #http route解析类
     └── swoole.php                   #swoole扩展底层类        

http_server开发

当protocol为http(不设置则默认为http),server运行为http_server,这种模式下默认不需要做任何额外的配置,系统会按默认的路由规则分发到具体的控制器中处理,开发者只需要写具体的控制器和方法就可以。

下面是http_server,test_http的开发流程:

  • server配置文件:apps/test_http/config/server_conf.php

    <?php
    
    class server_conf {
        public static $config=array(
            'server_name' => 'test_http',  //server名称    
            'log_level' => NOTICE,         //跟踪级别
            'listen' => 9501,              //listen监听端口
            'log_file' => '/asf/apps/test_http/index.log',  //log文件
        );   
    }
  • worker配置文件:apps/test_http/config/worker_conf.php

    <?php
    
    class worker_conf{
        public static $config=array(
            'log_level' => DEBUG,
            'mysql' => array(
                'socket' => '/tmp/mysql.sock',
                'host' => 'localhost',
                'port' => 3306,            
                'user' => 'user',
                'password' => 'password',
                'database' => 'test',
                'charset' => 'utf8',
            ),
    }
  • 唯一主入口脚本:apps/test_http/index.php

    <?php>
    define('BASE_PATH', __DIR__);
    require_once BASE_PATH.'/../../lib/autoload.php';
    require_once BASE_PATH.'/config/server_conf.php';
    
    $server = new swoole();
    $server->start();
  • 控制器:apps/test_http/controller/index_controller.php

    <?php
    
    class index_controller extends base_controller {       
        public function index() {
            log::prn_log(DEBUG, json_encode($this->content));
            log::prn_log(DEBUG, json_encode($this->param));         
    
            return 'ok';
        }
    }
    

    index_controller基于父类base_controller实现,而base_controller必须基于lib/controller.php的controller实现。

  • 在这种默认的配置下:访问
    http://localhost:9501/index/index 路由将会执行上面index_controller控制器中的index方法,http调用返回的结果是:ok

tcp_server开发

当protocol不为http,server就运行为tcp_server,这种模式下需要开发者自行处理TCP协议包的解析。
开发者可以自定义protocol名称,同时必须自行实现该协议的解析类。

下面是tcp_server,test_tcp的开发流程:

  • server配置文件:apps/test_tcp/config/server_conf.php

    <?php
    
    class server_conf {
        public static $config=array(
            'server_name' => 'test_tcp',   //server名称 
            'protocol' => 'voip',          //自定义协议名称
            'log_level' => NOTICE,         //跟踪级别
            'listen' => 9511,              //listen监听端口
            'log_file' => '/asf/apps/test_tcp/index.log',  //log文件
        );   
    }
  • worker配置文件:apps/test_tcp/config/worker_conf.php

    <?php
    
    class worker_conf{
        public static $config=array(
            'log_level' => DEBUG,
            'mysql' => array(
                'socket' => '/tmp/mysql.sock',
                'host' => 'localhost',
                'port' => 3306,            
                'user' => 'user',
                'password' => 'password',
                'database' => 'test',
                'charset' => 'utf8',
            ),
    }
  • 唯一主入口文件:apps/test_tcp/index.php

    <?php>
    
    define('BASE_PATH', __DIR__);
    
    require_once BASE_PATH.'/../../lib/autoload.php';
    require_once BASE_PATH.'/config/server_conf.php';
    
    $server = new swoole(server_conf::$config);
    $server->start();
  • 自定义voip协议解析类
    apps/test_tcp/protocol/voip_protocol.php

    <?php
    
    class voip_protocol implements protocol{
        public static function input($serv, $fd, $data){
            return strlen($data);
        }
    
        public static function decode($serv, $fd, $data){
            return $data;
        }
    
        public static function request($serv, $fd, $data){
            $db = $serv->mysql;
            $obj = new index_controller($serv, $data);
            return $obj->index();
        }
    
        public static function encode($serv, $fd, $data){
            return $data;
        }
    }

    类名和文件名为server_conf中的{protocol}_protocol,并且必须基于lib/protocol.php的interface实现。

配置文件详解

  • ASF框架程序配置分为两部分,一个是系统进程的配置server_conf,不能动态修改。
  • 另一个是工作进程的配置worker_conf,可以动态修改,修改后通过asf.php server_name reload生效。
  • 下面分开详细介绍。

server_conf.php配置文件详解

  • 示例

    $config=array(
        'server_name' => 'test_http',  
        'protocol' => 'http',       
        'log_level' => NOTICE,         
        'is_sington' => true,          
        'listen' => ['0.0.0.0:9501', '172.16.18.116:9502'],  
        'worker_num' => 1,             
        'daemonize' => true,           
        'log_file' => '/asf/apps/test_http/index.log',  
    ); 
  • server_name
    sever名称,必须配置,当起动多个server时,保证每个server_name的唯一。

  • protocol
    tcp_server协议类型,必须配置,支持http和各种其它自定义协议,如:voip。
    如果是http以外的协议名称,则开发必须基于lib/protocol.php interface实现自定义协议解析类。

  • log_level
    跟踪级别,必须配置,TRACE,DEBUG,INFO,NOTICE,WARNING,ERROR。

  • is_sington
    是否单例运行,可选配置,默认为true,即单实例运行。
    假如server_name为test_http,那么server启动后默认会在/var/local目录下生成一个唯一的pid文件:swoole_test_http.pid。

  • listen
    监听端口,必须配置,可以是如下几种配置方式:

'listen' => 9501
'listen' => [9501,9502]
'listen' => ['0.0.0.0:9501', '172.16.18.116:9502']
  • worker_num
    工作进程数量,可选配置,默认为6个工作进程

  • daemonize
    是否以守护进程方式运行,可选配置,默认为true,即以后台方式运行。

  • log_file
    跟踪文件,必须配置。

  • 最简配置

    $config=array(
        'server_name' => 'test_http',  //server_name
        'log_level' => NOTICE,         //log_level
        'listen' => 9501,              //listen port
        'log_file' => '/asf/apps/test_http/index.log',  //logfile
    );

worker_conf.php配置文件详解

  • 示例
$config=array(
    'log_level' => DEBUG,
    'mysql' => array(
        'socket' => '/tmp/mysql.sock',
        'host' => 'localhost',
        'port' => 3306,            
        'user' => 'user',
        'password' => 'password',
        'database' => 'test',
        'charset' => 'utf8',
    ),
    'route' => [
        ['PUT', '/user/{number}/{id:\d+}',              'index.index'],
        ['GET', '/{controller}/{number}/{id:\d+}',    '_handler.controller_param'],
        ['GET', '/{controller}/{number}',             '_handler.controller_param'],
        ['POST', '/{controller}/{number}/{id:\d+}',   '_handler.controller_param'],
        ['DELETE', '/{controller}/{number}/{id:\d+}', '_handler.controller_param'],
    ],
);

该配置文件分成三个部分。
* log_level
工作进程的跟踪级别,取值同server_conf中相同,reload后重新生效。

  • myql
    数据库连接属性配置
'socket'     => '/tmp/mysql.sock',//sock连接 
'host'       => 'localhost',      //mysql主机 
'port'       => 3306,             //mysql端口
'user'       => 'user',           //mysql用户,必须参数
'password'   => 'password',       //mysql密码,必须参数
'database'   => 'database',       //数据库名称,必须参数
'charset'    => 'utf8',           //连接数据库字符集
'sqls'       => 'set wait_timeout=24*60*60*31;set wait_timeout=24*60*60*31'  
//连接数据库后需要执行的SQL语句,以';'分隔的多条语句
  • route
    该配置项只在protocol=http时生效,其它自定义协议名称该配置项无效。
    底层根据这里配置的跌幅规则,将http不同的uri请求分配给相应的控制器处理。
    具体规则在下面http_server节中详细说明。

  • 最简配置

    $config=array(
        'log_level' => DEBUG,
        'mysql' => array(
            'socket' => '/tmp/mysql.sock',
            'host' => 'localhost',
            'port' => 3306,            
            'user' => 'user',
            'password' => 'password',
            'database' => 'test',
            'charset' => 'utf8',
        ),
    );

http_server的route规则配置

  • 上面的http_server开发流程中,uri请求是按系统默认的路由分发到控制器去执行的。
  • 其实ASF在http_server模式下,还可以按开发者的具体业务要求自定义路由规则到具体的控制器中处理。
  • 自定义路由规则在worker_conf的route段下设置,下面我们详细介绍下http_server的route规则配置。
  • 路由配置示例
$config=array(
    'route' => [
        ['PUT', '/user/{number}/{id:\d+}',              'index.index'],
        ['GET', '/{controller}/{number}/{id:\d+}',    '_handler.controller_param'],
        ['GET', '/{controller}/{number}',             '_handler.controller_param'],
        ['POST', '/{controller}/{number}/{id:\d+}',   '_handler.controller_param'],
        ['DELETE', '/{controller}/{number}/{id:\d+}', '_handler.controller_param'],
    ],
);
  • 配置格式
    每一条配置规则为一数组类型:

    ['Method', 'Route_reg', 'Controller.Action']  
    
    Method            POST,GET,PUT,DELETE等,支持['POST','GET']方式  
    Route_reg         路由规则的正则表达式,用以匹配uri路径  
    Controller.Action 分配到的处理请求的控制器.方法
  • 控制器.方法
    底层提供一个默认的控制器_handler,该控制器提供四个方法:

    • controller_action 解析’/index/index’ uri到相应的控制器的相应方法
    • controller 解析’/index’ uri到相应的控制器的默认index方法
    • controller_param 解析’/index/name/id’ uri到相应的控制器的默认index方法,同时附加param参数
    • controller_action_param 解析’/index/index/name/id’ uri到相应的控制器的相应方法,同时附加param参数
  • 用户自定义规则示例

['PUT', '/user/number/{id:\d+}',              'index.index'],
['PUT', '/user/{number}/{id:\d+}',            'index.index'],
第1条规则可以匹配以下规则:
PUT http://localhost/user/number,分配到index控制器的index方法,同时控制器的$this->param参数中保存着:{"id":"123"}

第2条规则可以匹配以下规则:
PUT http://localhost/user/number,分配到index控制器的index方法,同时控制器的$this->param参数中保存着:{"number":"number","id":"123"}
  • 默认规则
    底层会在用户自定义的路由规则后面增加三条默认的规则:
    lib/config.php
<?php

/**
 * ASF http默认路由配置类
 * @author jiaofuyou@qq.com
 * @date   2015-10-25
 */

class Route_config{
    public static $default_route = [
        //以下这条为系统底层自动填加的路由规则

        // POST http://localhost/index/index
        ['POST', '/{controller}/{action}[/]',        '_handler.controller_action'],

        // POST http://localhost/index
        ['POST', '/{controller}[/]',                 '_handler.controller'],         

        // POST http://localhost/index/index/prm/id
        [['GET','POST'], '/{controller}/{param:.+}', '_handler.controller_param'],
    ]; 
}

第1条规则可以匹配以下规则:
POST http://localhost/index/test,分配到index控制器的test方法。

第2条规则可以匹配以下规则:
POST http://localhost/index,分配到index控制器的默认index方法。

第3条规则可以匹配以下规则:
POST http://localhost/index/test/name/id,分配到index控制器的默认index方法,同时控制器的$this->param参数中保存着:[‘test’, ‘name’, ‘id’]

  • 规则匹配顺序
    系统按照先自定义规则,再默认规则的顺序执行,从上往下依次匹配,匹配到了就返回。
    因此,定义规则时应该保证,具体的匹配规则在上面,通用的在下面。

tcp server 协议解析interface

  • lib/protocol.php
<?php

/**
 * Protocol interface
 */
interface protocol
{
    /**
     * 用于分包,即在接收的buffer中返回当前请求的长度(字节)
     * 如果可以在$recv_buffer中得到请求包的长度则返回长度
     * 否则返回0,表示需要更多的数据才能得到当前请求包的长度
     * 如果返回false或者负数,则代表请求不符合协议,则连接会断开
     * @param swoole_srver $serv swoole_server对象
     * @param int $fd TCP客户端连接的文件描述符
     * @param string $data 收到的数据内容,可能是文本或者二进制内容
     * @return int|false
     */
    public static function input($serv, $fd, $data);

    /**
     * 用于请求解包
     * input返回值大于0,并且收到了足够的数据,则自动调用decode
     * 然后触发on_request回调,并将decode解码后的数据传递给on_request回调的第三个参数
     * 也就是说当收到完整的客户端请求时,会自动调用decode解码,无需业务代码中手动调用
     * @param swoole_srver $serv swoole_server对象
     * @param int $fd TCP客户端连接的文件描述符
     * @param string $data 收到的完整的请求包,可能是文本或者二进制内容
     * @return mixed
     */
    public static function decode($serv, $fd, $data);

    /**
     * 用于请求分发处理,返回的结果传递给encode编码后返回给客户端
     * @param swoole $serv server实例  
     * @param int $fd 客户端连接fd   
     * @param mixed $data decode返回的数据包
     * @return mixed
     */
    public static function request($serv, $fd, $data);

    /**
     * 用于请求打包
     * 底层会自动把on_request返回的结果用encode打包一次,变成符合协议的数据格式
     * 也就是说发送给客户端的数据会自动encode打包,无需业务代码中手动调用
     * @param swoole_srver $serv swoole_server对象
     * @param int $fd TCP客户端连接的文件描述符
     * @param mixed $data
     * @return string
     */
    public static function encode($serv, $fd, $data);
}
  • 自定义协议的tcp_server,必须基于interface protocol实现自定义协议的解析类。

http_server 底层控制器父类属性方法

  • lib/controller.php
<?php

/**
 * http请求处理控制器底层父类
 * @author jiaofuyou@qq.com
 * @date   2015-10-25
 */

class controller { 
    protected $server;    //swoole_server对象
    protected $mysql;     //数据访问对象
    protected $request;   //解析后的数据包
    protected $param;     //附加参数

    /**
     * @param swoole $serv swoole实例
     * @param mixed request
     * @param array $param 附加参数
     */    
    public function __construct($server, $request, $param=[]) {
        $this->server = $server;
        $this->mysql = $server->mysql;
        $this->request = $request;        
        $this->param = $param;

        if (method_exists($this, '_init')) $this->_init();
    }

    public function __destruct() {
        if (method_exists($this, '_deinit')) $this->_deinit ();
    }
}
  • 应用server目录结构中的controller下的控制均继承自该底层父类。

系统起动脚本使用

  • asf.ini 文件说明

    [servers]
    test_http = /home/jfy/testprog/asf/apps/test_http/index.php
    test_tcp = /home/jfy/testprog/asf/apps/test_tcp/index.php

    每一行格式为: server_name = path/index.php
    这里的server_name必须与每个应用中的server_conf配置文件中的server_name相同。

  • asf.php 脚本使用

    php asf.php list

    列出asf.ini文件中配置的所有的server_name对应的服务的运行状态

    php asf.php server_name start|stop|reload|restart|status|init

    reload: 平时重启工作进程,并重新加载worker_conf配置文件内容
    restart: 重启整个server
    status: 显示server进程状态
    init: 根据test_http框架复制一份进应用目录框架

    server_name必须是asf.ini文件中已经定义好的。

log类使用方法

  • log类以静态类方式使用。

  • 设置跟踪级别:
    log::log_level = NOTICE;
    支持:TRACE,DEBUG,INFO,NOTICE,WARNING,ERROR

  • 打印跟踪
    log::prn_log(NOTICE, “message”);
    支持:TRACE,DEBUG,INFO,NOTICE,WARNING,ERROR

mysql类使用方法

  • 直接在控制器用$this->mysql来操作mysql数据库。
  • select_one( sqlstr, flag=true)

    /**
     * 查询唯一记录
     * @param string $sql 执行的SQL语句
     * @flag bool 查询不到或查询到多条是否打印ERROR log
     * @return row(array) | false
     */
  • select_more($sqlstr)

    /**
     * 查询多条记录
     * @param string $sql 执行的SQL语句
     * @return result(array) | false
     */
  • insert( data, flag=true)

    /**
     * 插入单条记录
     * @param array $data 插入数据字段数组['id' => 123, 'name' => 'jfy']
     * @param bool $flag 是否打印成功跟踪,默认为true
     * @return id | false 成功返回自增字段ID,失败返回false
     * @see mysql->tabname->insert(['id' => 123, 'name' => 'jfy']);
     */
  • insert_one( sqlstr, flag=true)

    /**
     * 插入单条记录
     * @param string $sql 执行的SQL语句
     * @return true | false
     * $this->insert_id 为自增字段ID
     */
  • update( data, cond)

    /**
     * 更新单条记录
     * @param array $data 更新数据字段数组['name' => 'jfy']
     * @param array $cond 更新条件字段数组['id' => 123],顺序与索引顺序相同
     * @return true | false
     * @see $this->affected_rows 为更新记录数
     * @see mysql->tabname->update(['name' => 'jfy'],['id' => 123]);
     */
  • update_one($sqlstr)

    /**
     * 更新单条记录
     * @param string $sql 执行的SQL语句
     * @return true | false
     * @see $this->affected_rows 为更新记录数
     */
  • update_more($sqlstr)

    /**
     * 更新多条记录
     * @param string $sql 执行的SQL语句
     * @return true | false
     * @see $this->affected_rows 为更新记录数
     */
  • delete($cond)

    /**
     * 删除单条记录
     * @param array $cond更新条件字段数组['id' => 123],顺序与索引顺序相同
     * @return true | false
     * @see $this->affected_rows 为删除记录数
     * @see mysql->tabname->delete(['id' => 123]);
     */
  • delete_one($sqlstr)

    /**
     * 删除单条记录
     * @param string $sql 执行的SQL语句
     * @return true | false
     * @see $this->affected_rows 为删除记录数
     */

控制器操作mysql

apps/test_http/controller/index_controller.php

<?php

class index_controller extends base_controller {       
    public function index() {
        log::prn_log(DEBUG, json_encode($this->content));
        log::prn_log(DEBUG, json_encode($this->param));

        $db = $this->mysql;

        $result = $db->gearman_queue->insert([
            'unique_key' => 'd847233c-1ef2-11e5-9130-2c44fd7aee72',
            'function_name' => 'test',
            'priority' => 1,
            'data' => 'test',
            'when_to_run' => 0,
        ]);
        if ( $result === false ) return 'error';

        $result = $db->select_one("select * from gearman_queue where unique_key='d847233c-1ef2-11e5-9130-2c44fd7aee72'");
        if ( $result === false ) return 'error';
        var_dump($result);

        $result = $db->gearman_queue->update([
            'function_name' => 'testtest',
            'priority' => 100,
            'data' => 'testtesttesttest',
            'when_to_run' => 100,
        ],[
            'unique_key' => 'd847233c-1ef2-11e5-9130-2c44fd7aee72',
        ]);
        if ( $result === false ) return 'error';        
        var_dump($db->select_one("select * from gearman_queue where unique_key='d847233c-1ef2-11e5-9130-2c44fd7aee72'"));

        $result = $db->gearman_queue->delete([
            'unique_key' => 'd847233c-1ef2-11e5-9130-2c44fd7aee72',
        ]);         
        if ( $result === false ) return 'error';

        $result = $db->select_more("select * from gearman_queue limti 3");
        if ( $result === false ) return 'error';
        var_dump($result);

        return 'ok';
    }
}
Vue.js:Vue.js基础概念 组件化开发和生命周期是Vue.js中非常重要的概念。组件化开发允许我们构建可复用的UI片段,而生命周期钩子则提供了在特定阶段执行代码的机会,这对于处理组件的初始化、挂载、更新和销毁等操作非常有用。通过理解和应用这些概念,我们可以更高效地开发Vue.js应用,同时保持代码的清晰和可维护性。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。State:存储应用的所有状态。Getters。 阅读详情

相关推荐

LIGGGHTS颗粒模拟入门:从DEM原理到工程实践

离散元法(DEM)是一种用于模拟颗粒物质行为的数值方法,其核心原理是通过计算每个颗粒的运动和相互作用来预测颗粒系统的宏观行为。该方法基于牛顿第二定律和接触力学模型,能够精确描述颗粒间的碰撞、摩擦和粘结等微观机制。在工程实践中,DEM技术为优化工业设备设计、预测材料流动和减少实验成本提供了重要价值。它广泛应用于制药造粒、矿石破碎、粉体输送和农业加工等领域,帮助工程师和研究人员深入理解颗粒系统的复杂动力学。LIGGGHTS作为一款基于LAMMPS的开源DEM软件,继承了其高效的并行计算架构,并针对颗粒模拟进行了

weixin_33979203的博客 417

车载基础软件——国产基础软件开发平台架构ASF的架构设计及关键技术

整车级系统基础服务是将各控制器节点的能力,通过跨域、跨核组合成整车级别的业务功能,以对应用层提供整车级统一的调用。整车级系统基础服务包含整车电源管理服务、整车健康管理服务、整车时钟服务、整车诊断 Master、整车版本管理服务、整车数据采集服务、整车日志管理服务

Soly_kun的博客 1376

CentOS8静默安装Oracle11.2.0.1

背景 新安装oracle,用静默安装方式就不需要安装图形界面了,省时省力。 前期准备工作与图形化安装一样,如创建用户|用户组、环境变量、内核参数、创建目录等. 可参考图形化安装,链接:https://blog.youkuaiyun.com/heroicpoem/article/details/104229369 环境 平台 版本 操作系统 centOS 8 Oracle 11gR2 1.响应文件 响应文件的内容就是图形化安装时手工设置的选项内容。 解压后,database/response/db

heroicpoem的专栏 4518

Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

ranran0306的博客 9684

CMU动作捕捉数据集实战:从AMC文件到Python可视化的完整流程

本文提供了CMU动作捕捉数据集的完整实战指南,详细解析了AMC文件格式,并对比了MATLAB转换、Python原生解析及转换为BVH格式三种数据解析策略。重点介绍了如何构建Python数据处理与可视化管道,包括将数据转换为Pandas DataFrame、绘制时间序列与相关性热力图,以及实现3D骨架动画,帮助开发者高效利用这一经典动作捕获数据集进行运动分析与模型训练。

android的专栏 716

cutlass2.x源码解读之PitchLinearStripminedThreadMap

TensorCoord:使用layout::PitchLinearCoord作为张量坐标。Shape:使用模板参数Shape_作为tile的形状,kThreads:线程总数,定义为模板参数Threads。kElementsPerAccess:每次访问的元素数,定义为模板参数ElementsPerAccess。ThreadAccessShape:线程访问的形状,使用layout::PitchLinearShape定义。内部实现细节:ShapeVec。

jiangjkd的专栏 786

Vue.js介绍

一、基本概述:由尤雨溪在2014年作为其个人项目创建, 是前端的一个框架,核心只关注视图层,便于与第三方库或即有项目整合。二、Vue安装三、Vue程序指令,v-show,v-bind,v-for......四、Vue 实例生命周期

weixin_63541561的博客 3103

从 Open SQL JOIN 走向 ABAP CDS Association:把查询写成可复用的数据模型

摘要: 本文通过飞行模型示例,对比了ABAP中三种表关联实现方式:Open SQL JOIN、CDS显式JOIN和CDS Association。重点解析了Association的本质是将表关系声明为数据模型语言,使用时通过路径表达式按需展开为JOIN。文章指出路径表达式在不同位置会默认展开为不同JOIN类型(如SELECT列表默认为LEFT OUTER),并演示了如何用[inner]强制指定INNER JOIN。最后结合S/4HANA实际案例,说明Association通过中心化关系定义和路径复用,能有效

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 377

VUE.js

Vue.js框架基础

sixudhjj的博客 5758

OpenClaw小白安装全攻略:5000字详解,3分钟上手

为什么值得装 OpenClaw?最近科技圈爆火的 OpenClaw(昵称 “小龙虾”),不是普通 AI 聊天工具 —— 它是能本地部署、直接操控电脑的 AI 智能体,相当于给电脑配了个 “全能助手”:整理文件、自动搜资料、写文档、控制浏览器,甚至对接微信 / 飞书发消息,全程不用手动操作。更关键的是:它免费开源、支持全平台,新手不用懂代码,复制粘贴命令就能装,数据存在本地不泄露隐私。截至 2026 年 3 月,GitHub 星标已破 25 万,券商都出研报推荐,上班族、学生党用它提升效率超香!

通俗易懂学IT 1211

Autosar诊断实战系列23-NRC优先级解析

NRC分类,优先级判断逻辑及测试注意事项介绍。

initiallizer的博客 2617

appserver php的版本,App Server Framework (PHP Swoole)

软件简介App Server Framework (ASF)简介:当前版本0.01试用版。框架基于PHP-Swoole扩展开发,通过配置文件可以自定义各种应用协议,默认支持http协议。框架本身是一个完整的tcp_server,不再需要apache,nginx,fpm这些,框架已包含log处理,mysql访问封装。框架用fast-route库来做http route处理,直接映射到控制器上,使用者...

weixin_36322704的博客 250

震惊!用刚发布的GPT-5写研究现状,文献综述写作一整个大逆袭(附步骤+10条AI提示词)

每类分别给出:国内重点(3 条)、国外重点(3 条)、代表性方法(2–3 条)、代表成果(各 1–2 条)、主要问题(2 条)。每个场景给出:技术方案(2–3 种)、研究目标、实际成效/案例、当前挑战(3 点)。指令:基于国内外现状,系统列出当前学界的研究空白、关键未解问题与争议焦点(每项配简要证据/示例),并针对每个空白提出 1–2 条可行的研究方向或方法路径。三、差异与研究空白分析(≥300 字)。对每个小节提供:小标题、中心论点(1 句)、拟写要点(3–5 条)、建议引用类型(理论/方法/案例)。

qq_64378896的博客 114

【掌握 Vue.js:从入门到实践的全面指南】

本文将深入探讨 Vue.js 的核心概念、组件系统以及生态系统,并通过实际代码示例,指导你如何使用 Vue.js 构建一个功能完备的待办事项列表应用。Vue.js 是一个强大而灵活的框架,它提供了丰富的特性和工具,可以帮助开发者构建现代的 web 应用。当数据变化时,Vue.js 会计算出最小的 DOM 操作量,然后才更新到真实 DOM,这样可以避免不必要的性能损耗。Vue.js 的设计哲学是将复杂的问题分解为简单的组件,然后通过组合这些组件来构建复杂的界面。组件是 Vue.js 最强大的功能之一。

m0_71941456的博客 2369

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

vue.js基础01--基础用法及内部指令

一、vue的概述及vue的入门小实例 vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的。相比于Angular.js,Vue.js提供了更加简洁、更易于理解的API,使得我们能够快速地上手并使用Vue.js。 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作D... v-if和v-for为什么不建议同时使用 v-on绑定多个事件 v-if、v-show使用methods

muzidigbig的博客 5809

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Vue.js语法详解:从入门到精通

本文介绍了Vue.js的一些核心概念和语法,包括组件、模板、数据绑定、计算属性、生命周期钩子和指令。指令以`v-`开头,后面跟着指令的名称,例如`v-if`、`v-for`和`v-bind`。在本文中,我们将深入探讨Vue.js的语法,帮助读者更好地理解和应用Vue.js。如果你想深入学习Vue.js,可以查看官方文档或者其他相关资料,这些资源可以帮助你更好地掌握Vue.js的知识。在上述示例中,我们定义了一个简单的Vue.js组件,并在该组件中使用了常见的生命周期钩子。关注我,持续分享更多优质好文!

m0_55416028的博客 2012

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

vuejs快速入门

vuejs简单入门 1.VueJS 概述与快速入门 1.1 VueJS介绍 Vue.js是一个构建数据驱动的 web 界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑 定和组合的视图组件。它不仅易于上手,还便于与第三方库或既有项目整合。 官网:https://cn.vuejs.org/ 1.2 MVVM模式 MVVM是 Model-View-ViewModel 的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和

qq_22075913的博客 2584

Vue.js 简介和基础知识

介绍一些vue.js的基础知识,希望可以帮助到您。

l_1733484690的博客 2844

十二--vue.js基础

一:vue.js简介 vue是一个响应式的前段视图层框架。 响应式:我们在编写模版代码时,仅需关注数据变化即可,数据变化,ui即会变化 视图层:类似我们接触的其他前端模版,仅仅是ui层面的内容 框架:库提供由其父代码调用的功能,而框架定义整个应用程序的设计。开发人员不调用框架,而是调用库,相反,框架以某种特定方式调用和使用代码。 1、vue.js的简单demo 例子1: <div id='app'> <p>Message is: {{ message }}</p> &lt

chujinmaolu的博客 721

xampp 安装swoole

这个东东折腾了我两天天(包括今天),真的是心累。 写个博客记录下吧。 本篇博客纯水文一篇,巴拉巴拉巴拉巴拉~~~~~~小魔仙?+_+ 一切源于我这台macos Sierra 10.12.6. 它真的是一台老爷设备,17年的,到现在macOS已经更新了2大版本。在它上面跑不了brew,也不支持ipad分屏,OMG!!!!!! php版本也是5.x的,mysql也无法更新到5.7版本,。。 前几天更新了php到了7.3,但是7.3存在bug,又被我搞回来到了7.2。这个过程非常顺利,ph..

小漠007的专栏 1221

WEB:Vue.js 安装与入门指南

Vue.js 安装与入门指南

木头 1729

深入Vue.js:从基础到进阶的全面学习指南

Vue.js是一个用于构建用户界面的渐进式JavaScript框架。与其他重量级框架不同,Vue.js采用自底向上增量开发的设计。Vue.js的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。在现代前端开发中,Vue.js与React、Angular并列,成为三大主流框架之一。el.focus();});在模板中使用自定义指令:Vuex是一个专为Vue.js应用设计的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

Java领域优秀创作者 1959

Vue.js 详细介绍

Vue.js(简称 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。它由前 Google 高级软件工程师尤雨溪(Evan You)于 2014 年创建。Vue 以数据驱动视图、轻量级、易学易用、灵活性高等特点受到广泛欢迎,适用于从简单的单页面应用到复杂的大型企业级应用。Vue.js 是一个现代化的前端框架,以其简洁、灵活和高效的特点,成为了许多开发者构建用户界面的首选。通过掌握 Vue 的核心概念和最佳实践,你可以快速构建高性能、可维护的前端应用。

Dis_rupt的博客 3484

Vue.js从入门到精通

.stop 阻止冒泡 .prevent 阻止默认事件 .capture 添加事件监听器使用事件捕获模式 .self 只当事件在该元素本身(比如不是子元素)触发时回调 .once 事件只触发一次

weixin_56580267的博客 2296

Vue.js知识归纳与总结

Vue.js 是一款流行的前端 JavaScript 框架,它被设计用于构建单页面应用程序 (SPA)。Vue.js 提供了数据绑定、组件化、路由管理、状态管理等一系列功能,使得开发人员可以使用简单的 API 快速构建高效、可维护、易扩展的 Web 应用程序。通过课程的学习,我深入了解了Vue.js 的核心概念、特性和应用。我了解了何使用Vue.js构建单额应用,以及如何使用Vue Router和Vuex等工具进行开发。这些知识使我Vue.js有了更深入的理解和掌握。我学习了许多实用的开发技巧和最佳实践。

jh15005767557的博客 2531
上一篇: 用logstash发邮件告警
下一篇: ESP Elasticsearch代理 (PHP Swoole)
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值