【php】yii2框架基础-程序员宅基地

技术标签: php随笔  php  

目录

—#

1 安装yii2

composer create-project --prefer-dist yiisoft/yii2-app-basic yii

1.1 yii2目录结构

2 配置文件

2.1 使用restful风格url #urlManager #重定向

        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],

2.2 #catchAll 把所有请求都重定向到指定页面 #重定向

3 控制器 #Controller

3.1 #defaultAction 默认处理action

url

3.2 创建Controller


3.3 转发到指定php页面进行渲染

3.3.1 渲染函数 #render #renderPartial

如果使用渲染函数转发到指定页面渲染,此时则无法在actionView()方法内输出echo ,只能在指定页面进行输出

3.3.2 使用自定义的父模板 #content #layouts

3.3.3 模板内调用其他模板的内容 #render

还可以使用render传递参数

3.3.4 数据块 #blocks #beginBlock

3.4 Controller内置函数

3.4.1 #refresh

3.4.2 重定向到指定页面 #重定向 #redirect

3.4.3 例子: #goHome

3.5 参数传递到视图 #参数 #视图 #view

3.5.1 方式一:关联数组传参,推荐 #关联数组

3.5.1.1 例子

3.5.2 方式二:#compact

3.6 处理传参时的xss注入问题 #xss

3.6.1 xss注入问题

输出包含html代码的变量,存在xss注入问题

3.6.2 过滤参数内的html代码 #encode #HtmlPurifier

3.7 全局引入文件内容 #require

3.8 #request 组件,获取请求参数

3.8.1 get请求 #get #todo

注意:这里传参用&id=2而不是?id=2

3.8.2 post请求 #post

3.8.2.1 判断请求的方式 #isGet #isPost

3.8.3 获取用户的ip #userIP

3.9 #cookie

3.9.1 增加cookie

3.9.2 读取cookie

3.9.3 删除cookie

读取cookie使用request,增删改cookie使用reponse

3.9.4 配置cookie值加密

3.10 #session

3.11 #缓存

3.11.1 配置缓存组件 #Redis #FileCache

3.11.2 操作缓存

3.12 在view中获取当前的Controller变量 #context #this

view中的this的字段context,即$this->context,指的是controller中的$this

<?php  
  
var_dump($this->context->id);   //输出Controller  
var_dump($this->context->action->id );  // 输出action  
var_dump($this->context->enc);  // 输出Controller的成员变量

3.13 使用ajax发送请求 #ajax

3.13.1 例子

  • view
<?php

$this->registerJsFile('@web/js/test.js');
?>

<button id="ajaxtest" onclick="submitAjax()">test</button>

  • controller
    public function actionAjax()
    {
    
        $id = $_GET['id'];
        $uid = $_POST['uid'];
        return json_encode(["id" => $id]);
    }

  • js
function submitAjax(){
    
    $.post({
    
        url:"http://localhost/site/ajax?id=234324",
        data:{
    "uid":111111},
        dataType: "json",
        success:function(data){
    
            console.log(data);
             alert(data.id);
        }
    })
}

3.14 使用axios发送请求 #axios

3.14.1 配置request组件能处理json格式的参数

使用ajax时,只需要加上dataType: "json"即可

使用axios时,发送json数据,需要配置web.php,这样才能接受到json格式的数据

axios 发送的数据都是json格式的数据,而Yii2默认的配置是不能识别这种格式的,官方文档上已经做了说明,需要在web.php下进行配置才能识别json数据。

为了使 API 接收 JSON 格式的输入数据,配置 request 应用程序组件的 parsers 属性使用 yii\web\JsonParser 用于JSON输入

            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
                'text/json' => 'yii\web\JsonParser',
            ]

3.14.2 使用request组件接收json参数 #request

其他方式无法获取的参数,必须使用request组价接收参数,即\Yii::$app->request

axiostest() {
    
  axios.post("http://localhost/site/ajax",{
    
		  id:23432,
		  uid:1111,
	  }
  )
	  .then(res=>{
    
		  console.log(res.data.id);
		  alert(res.data.id);
	  })
}
    public function actionAjax()
    {
    
        $req = \Yii::$app->request;
        $id = $reqaxio定时器->post('id');
        $uid = $req->post('uid');
        return json_encode(["id" => $id,'uid'=>$uid]);
    }

3.14.3 例子:post请求

  • view
<?php

$this->registerJsFile('@web/js/test.js');
?>


<div id="app">
    <button @click="axiostest()">test</button>
</div>

  • controller
    public function actionAjax()
    {
    
        $a = \Yii::$app->request;
        $id = $a->post('id');
        $uid = $a->post('uid');
        return json_encode(["id" => $id,'uid'=>$uid]);
    }
  • js

new Vue({
    
    el:'#app',
    data: {
    
        param:{
    
            'id':23432,
            'uid':1111,
        }

    },
    methods: {
    
        axiostest() {
    
          axios.post("http://localhost/site/ajax",{
    
                  'id':23432,
                  'uid':1111,
              }
          )
              .then(res=>{
    
                  console.log(res.data.id);
                  alert(res.data.id);
              })
        }
    }
})

4 #Model 数据模型

Model对象放在models目录下

4.1 给model对象的字段批量赋值 #load

4.2 字段值校验 #rules

使用load()函数给model对象字段赋值,如果不符合字段值约束rules,也能赋值,但调用字段值校验函数validate()时会返回false

如果用表单控件ActiveForm给model赋值,如果不符合字段值约束规则rules,则无法提交表单,无法提交请求给后台处理

4.2.1 常见校验规则

4.2.1.1 #safe 不验证字段值

4.2.1.1.1 例子:不检查字段值,可以随意赋值 #safe

如果没有设置safe,则字段值必须要通过校验后,才能给字段赋值,否则无法给model赋值

4.2.1.2 #required 字段值非空

4.2.1.2.1 例子:字段值非空 #required

4.2.1.3 字段取值范围校验 #double #Integer #in

4.2.1.4 格式校验 #email #match

4.2.1.5 字串长度校验 #string

4.2.1.6 唯一值校验 #unique

4.2.1.7 判断字段值是否出现在指定表的字段内 #exist

4.2.1.8 处理两端空格 #trim

trim不是校验规则

4.2.1.9 设置字段默认值 #default

default不是校验规则

4.2.2 自定义字段值校验规则

4.2.3 校验字段值 #validate

4.2.4 例子:表单控件给model对象赋值 #ActiveForm

表单控件给model对象赋值,会自动触发字段校验validate()
表单如果没有写提交地址action,会默认提交给当前的action处理请求
ActiveForm提交默认使用post请求

model层

<?php
namespace app\models;
use yii\base\Model;

class UserForm extends Model{
    public $name;
    public $email;

    public function rules(){
        return [
            ['name','compare',compareValue =>'tom',message=>'不为tom'],
            [['name','email'],required,message=>'必选字段'],
            [['email'],'email',message=>'不是邮箱'],
        ];

    }
}

controller层

<?php

namespace app\controllers;

use app\models\UserForm;
use Yii;
use yii\web\Controller;


class TestController extends Controller
{

    public function actionTest2()
    {
        $model = new UserForm;

        $model->load(Yii::$app->request->post());  // 获取post请求值

        if ($model->validate()) {  // 成功提交表单后
            Yii::$app->session->setFlash("success", '提交表单成功');      // 提示框
        }

        return $this->render(test2, ['model' => $model]);
    }
}

视图层view:表单ActiveForm

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;

$form = ActiveForm::begin();
?>

<?= $form->field($model, 'name') ?>  
<?= $form->field($model, 'email') ?>

<div>
    <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end() ?>

4.3 #ActiveRecord 活动记录,操作数据库 #数据库

<?php

namespace app\models;

use yii\db\ActiveRecord;


class Article extends ActiveRecord
{
    

    public static function tableName()  // 设置要连接的表table
    {
    
        return 'test_my.rbid_change_info_test';
    }

    public static function getDb()  // 设置要连接的数据库
    {
    
        return \Yii::$app->db01;
    }
}

4.4 ActiveRecord对象的生命周期 #new #find #save #delete

4.4.1 查询操作 #find #findAll #findOne

find()返回的是对象ActiveQueryActiveQuery继承Query,可以使用QueryBuilder继续查询操作

findAll()findOne返回的是结果集数组

4.4.2 dml操作

dml操作的函数都有返回值(影响的记录数)

4.4.2.1 #save #validate #rules

save()可以用于插入/更新记录到数据库(推荐)

4.4.2.1.1 更新记录 #updateAll

推荐使用save()实现插入、更新操作

save()会触发model对象的字段值验证rules,触发validate()

4.4.2.1.2 新增记录 3.3.2.2

4.4.2.2 删除记录 #delete #deleteAll

4.4.3 关联查询

4.4.3.1 #hasMany 一对多关联

等价于:

4.4.3.2 #hasOne 一对一关联

4.4.3.3 删掉关联查询的缓存 #缓存

4.4.3.4 多次关联查询的性能优化 #with

5 #createCommand 操作数据库 #数据库 #Command

createCommand()返回的是对象

5.1 连接数据库

  • 操作数据库test_my下的表(dsn中指定了数据库)
    'dsn' => 'mysql:host=localhost;dbname=test_my;port=2039'
<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=test_my;port=2039',  // 可以指定要连接的数据库,可以不指定
    'username' => 'apollo-rw',   // 用户名
    'password' => 'QBT094bt',   // 密码
    'charset' => 'utf8'
];
  • 如果不指定要连接的数据库时,在操作表时,必须要写上表名,如test.tb1
    'dsn' => 'mysql:host=localhost;port=2039'
<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;port=2039',  // 可以指定要连接的数据库,可以不指定
    'username' => 'apollo-rw',   // 用户名
    'password' => 'QBT094bt',   // 密码
    'charset' => 'utf8'
];

5.1.1 不同数据库的dsn写法 #dsn

5.1.2 设置表前缀

<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;port=2039',
    'username' => 'apollo-rw',
    'password' => 'QBT094bt',
    'charset' => 'utf8',
    'tablePrefix' => 'tb_'
];

5.2 查询数据库 #select

5.2.1 指定数据库、表、列

5.2.2 返回结果集数组 #queryAll #queryOne #queryScalar #queryColumn

// 返回多行. 每行都是列名和值的关联数组.
// 如果该查询没有结果则返回空数组
$posts = Yii::$app->db->createCommand('SELECT * FROM post')
            ->queryAll();

// 返回一行 (第一行)
// 如果该查询没有结果则返回 false
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=1')
           ->queryOne();

// 返回一列 (第一列)
// 如果该查询没有结果则返回空数组
$titles = Yii::$app->db->createCommand('SELECT title FROM post')
             ->queryColumn();

// 返回一个标量值,第一行第一列
// 如果该查询没有结果则返回 false
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM post')
             ->queryScalar();

5.2.3 使用sql占位符,防止sql注入问题 #占位符

写法一:

$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
           ->bindValue(':id', $_GET['id'])
           ->bindValue(':status', 1)
           ->queryOne();

写法二:

$params = [':id' => $_GET['id'], ':status' => 1];

$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
           ->bindValues($params)
           ->queryOne();

写法三:推荐

$params = [':id' => $_GET['id'], ':status' => 1];

$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', $params)
           ->queryAll();

// 等价于
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', [':id' => $_GET['id'], ':status' => 1])
           ->queryAll();
5.2.3.1 例子


use Yii;

public function actionTest(){
    
	$sql = "select * from rbid_change_info_test where from_rbid=:from_rbid";

	$res = Yii::$app->db01->createCommand($sql)
		->bindValue(':from_rbid', $_GET['from_rbid'])
		->queryAll();

	$param = [
		'res'=>$res
	];

	return $this->render('test',$param);
}

5.3 DML操作 #dml

5.3.1 插入操作 #insert #batchInsert

5.3.2 修改操作 #update

5.3.3 删除操作 #delete

6 #QueryBuilder 查询构建器 #Query 操作数据库 #数据库

使用Query对象只能查询数据库,但可以使用createCommand() 来实现dml操作

6.1 对比Command、ActiveRecord、Query操作 #createCommand #ActiveRecord #all #find #one

6.2 连接指定表、数据库



que


use Yii;

public function actionTest2(){
    
	$db01 = Yii::$app->db01;  // 连接数据库

	$res = (new Query())
		->from('rbid_change_info_test')
		->Where(['like','from_name','贝纳通'])
		->andWhere(['<','month','2021-01-30'])
		->limit(10)
		->all($db01);

	$param = [
		res=>$res,
	];

	return $this->render(test2,$param);
}

6.3 查询 #select

6.3.1 查询指定表,表别名 #form

6.3.2 连接表 #join #leftJoin #rightJoin #innerJoin

6.3.3 全连接 #union

6.3.4 子查询

6.3.5 去重 #distinct

6.3.6 追加查询字段 #addSelect

6.3.7 排序 #order by

6.4 常用函数,返回结果集数组 #聚合函数 #all #one #count #exists #column

6.4.1 获取 #createCommand 操作数据库,返回要执行的sql语句 #Command

createCommand()返回的是对象,all()返回的是数组

获取createCommand后,可以执行dml操作
导入
Query对象只能进行select查询操作

6.4.2 设置索引列 #indexBy

6.5 条件查询 #where

6.5.1 等值查询

6.5.1.1 字符串格式

存在sql注入问题,可以通过占位符处理

6.5.1.2 哈希格式,多条件查询(推荐)

不会有sql注入问题

6.5.1.3 查询集合 #in

即查询 in

#

6.5.2 比较查询 #like

6.5.3 追加查询条件 #addWhere #orWhere

用于拼接多个查询条件


6.5.4 过滤条件查询 #filterWhere #andFilterWhere #orFilterWhere

在参数上和where的相同,但会跳过变量为空值的情况

6.5.4.1 filterWhere和where的区别

where在查询变量值时,需要判断变量值是否为空,否则会出现查询空值IS NULL的情况
filterWhere无法查询空值的情况,不需要判断变量值是否为空

6.5.5 使用占位符,避免sql注入问题 #addParams

6.6 排序 #orderBy #addOrderBy

6.7 分组 #groupBy

6.7.1 分组条件 #having #andHaving #orHaving #filterHaving

和where的使用方式一致


6.8 分页 #Pagination #limit #offset

6.8.1 例子

contoller层


use Yii;
use yii\data\Pagination;  
use yii\db\Qurraery;

public function actionTest()
{
	$db01 = Yii::$app->db01;  // 连接数据库

	$query = new Query();

	$res = $query
		->from('test_my.rbid_change_info_test');

	$totalCount = $res->count('*', $db01); //查询总记录数

	$pages = new Pagination([
		'totalCount' => $totalCount, //查询总记录数
		'pageSize' => 10, //每页记录数
	]);

	// 获取分页查询的数据
	$res = $res 
		->offset($pages->offset)
		->limit($pages->limit)
		->all($db01);

	$param = [
		res => $res,   //结果集
		pages => $pages,  // 分页对象
		totalCount => $totalCount,
	];

	return $this->render(test, $param);
}

视图层view

<!-- 分页处理 -->
<?php
if ($res) {
	echo LinkPager::widget([
		'pagination' => $pages,
		'nextPageLabel' => '下一页',
		'prevPageLabel' => '上一页',
		'firstPageLabel' => '首页',
		'lastPageLabel' => '尾页',
	]);
}
?>

6.9 管理事务 #beginTransaction #commit #rollBack #transaction


use Yii;

$db01 = Yii::$app->db01;  // 连接数据库

$transaction = $db01->beginTransaction();

$res
	->createCommand($db01)
	->delete('test_my.t', 'from_rbid=:from_rbid', [':from_rbid' => 11])
	->execute();

// $transaction->rollBack();
$transaction->commit();

7 #表单 #form

7.1 ActiveForm组件的表单控件 #ActiveForm #todo

需要绑定model对象,自动进行validate()校验字段
如果不符合rules校验规则,则无法提交表单

推荐使用ActiveForm或者原生的html表单控件,ActiveForm控件不方便设置样式

常用组件

常用组件

7.1.1 例子:设置ActiveForm的样式

  
<?php $form = ActiveForm::begin(); ?>  
  
<?= $form  
    ->field($model, 'name', ['options' => ['class' => 'form-group row'], 'labelOptions' => ['label' => '姓名', 'class' => 'col-form-label mr-4']])  
    ->textInput(['autofocus' => true, 'placeholder' => '输入姓名', 'class' => 'form-control col-sm-2'])  
?>  
  
<?= $form  
    ->field($model, 'email', ['options' => ['class' => 'form-group row'], 'labelOptions' => ['label' => '邮箱', 'class' => 'col-form-label mr-4']])  
    ->textInput(['class' => 'form-control col-sm-2', 'placeholder' => '输入邮箱'])  
?>  
  
<?=  
$form  
    ->field($model, 'textArea', ['options' => ['class' => 'form-group row'], 'labelOptions' => ['label' => '留言', 'class' => 'col-form-label mr-4']])  
    ->textarea(['rows' => 8, 'class' => 'col-sm-4', 'placeholder' => '输入留言'])  
?>  
  
<div class="from-group">  
    <input type="submit" value="submit" class='btn btn-primary'>  
</div>  
  
<?php ActiveForm::end() ?>

7.2 Html组件的表单控件

和html自己的表单控件一样,不会绑定model对象

7.2.1 方式一

7.2.2 方式二

7.2.3 #activeInput 控件和Model对象交互 #model

类似使用Input()函数创建控件,只是可以用model对象的字段值填充控件
比如使用 ActiveRecord 获取表的记录字段值来填充控件,或者给ActiveRecord 对象赋值(ActiveRecord继承Model

7.2.3.1 例子:使用model对象字段值填充表单控件 #model

7.3 #Url

7.3.1 Url::base #base

7.3.2 Url::home,项目首页 #home

7.3.3 Url::current #current

推荐用Url::to([''])代替Url::current()

7.3.4 Url::to,Url::toRoute #to #toRoute

7.3.4.1 例子:表单提交url
 <form action="<?=Url::to(['form'])?>" class="input-group">
 </form>

8 组件

8.1 面包屑 co#breadcrumbs

$this->params['breadcrumbs'][] = [label => 'Contact', url => ['/site/about']];  
$this->params['breadcrumbs'][] = helllo;  
$this->params['breadcrumbs'][] = abcd;

8.2 导入外部资源文件 #css #js

$this->registerJsFile('@web/js/test/test.js');
$this->registerCssFile('@web/css/test/test.css');

8.3 #Widget 自定义小部件

9 #ArrayHelper 数组工具类

9.1 获取值 #getValue #getColumn


9.2 建立映射表 #map

9.3 自定义索引 #indexq

10 控制台执行yii2脚本

在控制台执行的脚本,需要放在commands目录下,但无法使用Xdebug

action方法的返回值return无法输出内容,内部使用echo可以在console中输出内容

10.1 例子

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_20051917/article/details/126594916

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签