ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD

news2024/11/27 22:41:21

ThinkPHP6 模型层的模型属性,表映射关系,以及模型层的CRUD及如何在控制层中使用模型层

1. model 模型层的默认映射规则

模型,即mvc模式中的model层,model层用来对接数据库,操作数据库的增删改查。

在tp6中,模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写的方式。(和控制层,视图层一样,也需要导入相应的类库think\Model

模型名与数据库的对应关系,例如下表:

模型名约定对应数据表(假设数据库的前缀定义是 robin_
Userrobin_user
StudentInforobin_student_info

当然也可以不像上面这样写,这时候就需要自己在对应的模型类中,通过属性protected $table = "xxx"来设定。

2. 举例:自定义model映射表名

假定你的表名叫stu_info,然后你的模型类为Student,那么为了使其相对应,就需要修改一下属性。那么写个小例子测试一下:

config/database.php 默认配置:

<?php

return [
    // 默认使用的数据库连接配置
    'default'         => env('database.driver', 'mysql'),

    // 自定义时间查询规则
    'time_query_rule' => [],

    // 自动写入时间戳字段
    // true为自动识别类型 false关闭
    // 字符串则明确指定时间字段类型 支持 int timestamp datetime date
    'auto_timestamp'  => true,

    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',

    // 时间字段配置 配置格式:create_time,update_time
    'datetime_field'  => '',

    // 数据库连接配置信息
    'connections'     => [
        'mysql' => [
            // 数据库类型
            'type'            => env('database.type', 'mysql'),
            // 服务器地址
            'hostname'        => env('database.hostname', '127.0.0.1'),
            // 数据库名
            'database'        => env('database.database', 'phpdemo'),
            // 用户名
            'username'        => env('database.username', 'root'),
            // 密码
            'password'        => env('database.password', 'root'),
            // 端口
            'hostport'        => env('database.hostport', '3306'),
            // 数据库连接参数
            'params'          => [],
            // 数据库编码默认采用utf8
            'charset'         => env('database.charset', 'utf8'),
            // 数据库表前缀  设定为 robin_
            'prefix'          => env('database.prefix', 'robin_'),

            // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
            'deploy'          => 0,
            // 数据库读写是否分离 主从式有效
            'rw_separate'     => false,
            // 读写分离后 主服务器数量
            'master_num'      => 1,
            // 指定从服务器序号
            'slave_no'        => '',
            // 是否严格检查字段是否存在
            'fields_strict'   => true,
            // 是否需要断线重连
            'break_reconnect' => false,
            // 监听SQL
            'trigger_sql'     => env('app_debug', true),
            // 开启字段缓存
            'fields_cache'    => false,
        ],

        // 更多的数据库配置信息
    ],
];

model层

<?php
namespace app\model;

use think\Model; // 引入模型基类

class Student extends Model
{
    // 将数据表名设定为为指定的 stu_info ,如果不配置的话,我们找到的对应的表名应为robin_student
    protected $table = "stu_info";

    public function queryAll(){
        $data = Student::select();
        return $data->toArray();
    }
}

控制器层

<?php
namespace app\controller;

use app\BaseController;
use app\model\Student;
use think\facade\View; // 使用模板引擎
use think\model;

class test extends BaseController{

    public function index(){
        // 这里拿控制器测试一下,能否查到正确的数据
        $model = new Student();
        $data = $model->queryAll();
        dump($data) ;
    }
}

在这里插入图片描述

成功查到,这里只是顺带说明一下,后面会详细的说…

3. 如何在控制器中使用模型层

在控制器中使用模型层,只需要将think\model引入,然后在控制器的方法中实例化模型对象即可.

单应用目录结构如下:

在app目录下,controller ,view ,model处于同级目录。

在这里插入图片描述

控制器:

<?php
namespace app\controller;

use app\BaseController;
use app\model\Student;
use think\model; // 使用模型

class test extends BaseController{

    public function index(){
        // 实例化模型层对象
        $model = new Student();
        // 调用模型对象的方法
        $data = $model->queryAll();
        dump($data) ;
    }
}

模型层:

<?php
namespace app\model;

use think\Model; // 引入模型基类

class Student extends Model
{
    protected $table = "stu_info";

    public function queryAll(){
        $data = Student::select();
        return $data->toArray();
    }
}

4. 模型层设置属性(自定义表名,主键…)

常用的模型设置属性包括(以下属性都不是必须设置的,是为了灵活的结合项目使用):

属性描述
name模型名(相当于不带数据表前后缀的表名,默认为当前模型类名)
table数据表名(默认自动获取)
suffix数据表后缀(默认为空)
pk主键名(默认为id
connection数据库连接(默认读取数据库配置)
query模型使用的查询类名称
field模型允许写入的字段列表(数组)
schema模型对应数据表字段及类型
type模型需要自动转换的字段及类型
strict是否严格区分字段大小写(默认为true)
disuse数据表废弃字段(数组)

上述的模型设置属性,都可以自定义配置,即修改默认的模型设置。

假定我现在有一张下面的数据表(vendors),其中主键为vend_id(与默认配置不符合)

在这里插入图片描述

那么我的模型层可以修改成下面的样子

<?php
namespace app\model;

use think\Model; // 引入模型基类

class Vendors extends Model
{
    // 自定义表名
    protected $table = "vendors";

    // 自定义主键名
    protected $pk = "vend_id";
    
    public function queryAll(){
        // 查询主键为1002的数据信息
        $data = Vendors::find("1002");
        return $data->toArray();
    }
}

写个控制器测试下:

<?php
namespace app\controller;

use app\BaseController;
use app\model\Vendors;
use think\model;

class test extends BaseController{

    public function index(){
        $model = new Vendors();
        $data = $model->queryAll();
        // 输出
        dump($data) ;
    }
}

在这里插入图片描述

其余的模型设置也是一样,根据自己不同的需求去进行修改对应的属性即可。

5. 模型的crud 增删改查

5.1 新增数据 create saveAll

新增数据的最佳实践原则:使用create方法新增数据,使用saveAll批量新增数据。

create

create 为 类提供的静态方法,可以直接通过类名来调用。

create 方法源码如下:

/**
 * 写入数据
 * @access public
 * @param array  $data       数据数组
 * @param array  $allowField 允许字段
 * @param bool   $replace    使用Replace
 * @param string $suffix     数据表后缀
 * @return static
 */
public static function create(array $data, array $allowField = [], bool $replace = false, string $suffix = ''): Model
{
    $model = new static();

    if (!empty($allowField)) {
        $model->allowField($allowField);
    }

    if (!empty($suffix)) {
        $model->setSuffix($suffix);
    }

    $model->replace($replace)->save($data);

    return $model;
}

根据源码,我们只需要将新增的数据封装为一个数组即可完成最简单的添加,例如:

<?php
namespace app\model;

use think\Model; // 引入模型基类

class Student extends Model
{
    protected $table = "stu_info";

    // ...

    // 新增一个添加表数据的方法
    public function insertSt(){
        $st = Student::create([
            'name'=>'张张',
            'birth'=>time("y-m-d"),
            'subject'=>'php',
            'snum'=>'202004041020',
            'label'=>'测试新增'
        ]);
        // 这里将st对象返回
        return $st;
    }
}

控制器修改调用一下:

<?php
namespace app\controller;

use app\BaseController;
use app\model\Student;
use app\model\Vendors;
use think\model;

class test extends BaseController{

    public function index(){
        $model = new Student();
        $data = $model->insertSt();
        // 打印数据
        dump($data) ;
    }
}

测试一下,新增成功

在这里插入图片描述

在这里插入图片描述

saveAll

saveAll方法新增数据默认会自动识别数据是需要新增还是更新操作,当数据中存在主键的时候会认为是更新操作。

saveAll方法新增数据返回的是包含新增模型(带自增ID)的数据集对象。

saveAll方法需要类模型对象来调用,不是静态方法。

saveAll源码:

/**
 * 保存多个数据到当前数据对象
 * @access public
 * @param iterable $dataSet 数据
 * @param boolean  $replace 是否自动识别更新和写入
 * @return Collection
 * @throws \Exception
 */
public function saveAll(iterable $dataSet, bool $replace = true): Collection
{
    $db = $this->db();

    $result = $db->transaction(function () use ($replace, $dataSet) {

        $pk = $this->getPk();

        $result = [];
        $suffix = $this->getSuffix();
		
        // 迭代器
        foreach ($dataSet as $key => $data) {
            if ($replace) {
                $exists = true;
                foreach ((array) $pk as $field) {
                    // 主键判断,设定exists
                    if (!isset($data[$field])) {
                        $exists = false;
                    }
                }
            }
			// 判断主键是否存在,存在则为更新操作
            if ($replace && !empty($exists)) {
                $result[$key] = static::update($data, [], [], $suffix);
            } else {
                $result[$key] = static::create($data, $this->field, $this->replace, $suffix);
            }
        }

        return $result;
    });

    return $this->toCollection($result);
}

分析下源码,为啥saveAll可以批量添加数据,是因为其内部有一个iterable的迭代器,然后在迭代过程中进行了一些判断是否使新增还是更新操作,以完成批量新增。

前面的例子使用了create添加单个数据,现在我们使用saveAll来批量添加数据:

模型:

<?php
namespace app\model;

use think\Model; // 引入模型基类

class Student extends Model
{
    protected $table = "stu_info";

 	// 批量新增
    public function insertStMul(){
        $st = new Student();
        $list = [
            [
                'name'=>'demo1',
                'birth'=>'2023-05-21',
                'subject'=>'php',
                'snum'=>'202004041021',
                'label'=>'测试批量新增1'
            ],[
                'name'=>'demo2',
                'birth'=>'2023-05-21',
                'subject'=>'php',
                'snum'=>'202004041022',
                'label'=>'测试批量新增2'
            ]
        ];
        $coll = $st->saveAll($list);
        return $coll;
    }
}

控制器:

<?php
namespace app\controller;

use app\BaseController;
use app\model\Student;
use app\model\Vendors;
use think\facade\View; // 使用模板引擎
use think\model;

class test extends BaseController{

    public function index(){
        $model = new Student();
        $data = $model->insertStMul();
        dump($data) ;
    }
}

在这里插入图片描述

在这里插入图片描述

5.2 删除数据 delete destory

删除的最佳实践原则是:如果删除当前模型数据,用delete方法,如果需要直接删除数据,使用destroy静态方法。

delete

delete 方法返回值类型为布尔值,源码如下:

/**
 * 删除当前的记录
 * @access public
 * @return bool
 */
public function delete(): bool
{
    if (!$this->exists || $this->isEmpty() || false === $this->trigger('BeforeDelete')) {
        return false;
    }

    // 读取更新条件
    $where = $this->getWhere();

    $db = $this->db();

    $db->transaction(function () use ($where, $db) {
        // 删除当前模型数据
        $db->where($where)->delete();

        // 关联删除
        if (!empty($this->relationWrite)) {
            $this->autoRelationDelete();
        }
    });

    $this->trigger('AfterDelete');

    $this->exists   = false;
    $this->lazySave = false;

    return true;
}

使用delete方法()删除模型数据,可以在查询后调用delete方法。

$user = User::find(1);
$user->delete();

或者直接使用对象删除

$user = new User();
// 删除id为1 的数据
$user->where('id','=',1)->delete();

destory

destory 为静态方法,可以直接通过类来调用,然后返回值为布尔值。

destroy方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的

源码如下:

/**
 * 删除记录
 * @access public
 * @param mixed $data  主键列表 支持闭包查询条件
 * @param bool  $force 是否强制删除
 * @return bool
 */
public static function destroy($data, bool $force = false): bool
{
    if (empty($data) && 0 !== $data) {
        return false;
    }

    $model = new static();

    $query = $model->db();

    if (is_array($data) && key($data) !== 0) {
        $query->where($data);
        $data = null;
    } elseif ($data instanceof \Closure) {
        $data($query);
        $data = null;
    }

    $resultSet = $query->select($data);

    foreach ($resultSet as $result) {
        $result->force($force)->delete();
    }

    return true;
}

使用destory()方法时,直接通过类调用即可(根据主键删除)

User::destroy(1);
// 支持批量删除多个数据
User::destroy([1,2,3]);

destory()闭包删除的方式:

User::destroy(function($query){
    $query->where('id','>',10);
});

5.3 修改更新数据 save update

更新的最佳实践原则是:如果需要使用模型事件,那么就先查询后更新(save),如果不需要使用事件或者不查询直接更新,直接使用静态的Update方法进行条件更新,如非必要,尽量不要使用批量更新。

save 先查询后更新(推荐)

在取出数据后,更改字段内容后使用save方法更新数据。这种方式是最佳的更新方式

$user = User::find(1);
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();

save方法成功返回true,并只有当before_update事件返回false的时候返回false,有错误则会抛出异常。

tip:save方法更新数据,只会更新变化的数据,对于没有变化的数据是不会进行重新更新的。

save源码:

/**
 * 保存当前数据对象
 * @access public
 * @param array  $data     数据
 * @param string $sequence 自增序列名
 * @return bool
 */
public function save(array $data = [], string $sequence = null): bool
{
    // 数据对象赋值
    $this->setAttrs($data);

    if ($this->isEmpty() || false === $this->trigger('BeforeWrite')) {
        return false;
    }

    $result = $this->exists ? $this->updateData() : $this->insertData($sequence);

    if (false === $result) {
        return false;
    }

    // 写入回调
    $this->trigger('AfterWrite');

    // 重新记录原始数据
    $this->origin   = $this->data;
    $this->get      = [];
    $this->lazySave = false;

    return true;
}

update 直接更新

使用模型的静态update方法更新:

User::update(['name' => 'thinkphp'], ['id' => 1]);

模型的update方法返回模型的对象实例

如果你的第一个参数中包含主键数据,可以无需传入第二个参数(更新条件)

User::update(['name' => 'thinkphp', 'id' => 1]);

如果你需要只允许更新指定字段,可以使用

User::update(['name' => 'thinkphp', 'email' => 'thinkphp@qq.com'], ['id' => 1], ['name']);

上面的代码只会更新name字段的数据。

update源码:

/**
 * 更新数据
 * @access public
 * @param array  $data       数据数组
 * @param mixed  $where      更新条件
 * @param array  $allowField 允许字段
 * @param string $suffix     数据表后缀
 * @return static
 */
public static function update(array $data, $where = [], array $allowField = [], string $suffix = '')
{
    $model = new static();

    if (!empty($allowField)) {
        $model->allowField($allowField);
    }

    if (!empty($where)) {
        $model->setUpdateWhere($where);
    }

    if (!empty($suffix)) {
        $model->setSuffix($suffix);
    }

    $model->exists(true)->save($data);

    return $model;
}

update方法底层还是使用了save方法。

5.4 查询数据 find select 查询构造器

模型查询和数据库查询方法的区别主要在于,模型中的查询的数据在获取的时候会经过获取器的处理,以及更加对象化的获取方式。

模型查询除了使用自身的查询方法外,一样可以使用数据库的查询构造器,返回的都是模型对象实例。但如果直接调用查询对象的方法,IDE可能无法完成自动提示。

获取单个数据 find

find 方法返回值为当前模型对象。默认参数为null值,传入的话会视为主键条件。

find源码:

/**
 * 查找单条记录
 * @access public
 * @param mixed $data 查询数据
 * @return array|Model|null|static|mixed
 * @throws Exception
 * @throws ModelNotFoundException
 * @throws DataNotFoundException
 */
public function find($data = null)
{
    if (!is_null($data)) {
        // AR模式分析主键条件
        $this->parsePkWhere($data);
    }

    if (empty($this->options['where']) && empty($this->options['order'])) {
        $result = [];
    } else {
        $result = $this->connection->find($this);
    }

    // 数据处理
    if (empty($result)) {
        return $this->resultToEmpty();
    }

    if (!empty($this->model)) {
        // 返回模型对象
        $this->resultToModel($result);
    } else {
        $this->result($result);
    }

    return $result;
}

获取单个数据的方法:

// 取出主键为1的数据
$user = User::find(1);
echo $user->name;

// 使用查询构造器查询满足条件的数据
$user = User::where('name', 'thinkphp')->find();
echo $user->name;

模型使用find方法查询,如果数据不存在返回Null,否则返回当前模型的对象实例。

使用isEmpty方法来判断当前是否为一个空模型。

$user = User::where('name', 'thinkphp')->findOrEmpty();
if (!$user->isEmpty()) {
    echo $user->name;
}

如果是在模型内部获取数据,不要使用$this->name的方式来获取数据,而是使用$this->getAttr('name') 替代。

获取多个数据 select

select 可以查询多条数据,返回值为collection。参数默认不写为null值,给出后会视为主键条件。

select 源码:

/**
 * 查找记录
 * @access public
 * @param mixed $data 数据
 * @return Collection|array|static[]
 * @throws Exception
 * @throws ModelNotFoundException
 * @throws DataNotFoundException
 */
public function select($data = null): Collection
{
    if (!is_null($data)) {
        // 主键条件分析
        $this->parsePkWhere($data);
    }

    $resultSet = $this->connection->select($this);

    // 返回结果处理
    if (!empty($this->options['fail']) && count($resultSet) == 0) {
        $this->throwNotFound();
    }

    // 数据列表读取后的处理
    if (!empty($this->model)) {
        // 生成模型对象
        $resultSet = $this->resultSetToModelCollection($resultSet);
    } else {
        $this->resultSet($resultSet);
    }

    return $resultSet;
}

例如,取出多个数据:

// 根据主键获取多个数据
$list = User::select([1,2,3]);
// 对数据集进行遍历操作
foreach($list as $key=>$user){
    echo $user->name;
}

使用查询构造器 (链式操作)

在模型中仍然可以调用数据库的链式操作和查询方法,可以充分利用数据库的查询构造器的优势。

例如:

User::where('id',10)->find();
User::where('status',1)->order('id desc')->select();
User::where('status',1)->limit(10)->select();

使用查询构造器直接使用静态方法调用即可,无需先实例化模型。

获取某个字段或者某个列的值:

// 获取某个用户的积分
User::where('id',10)->value('score');
// 获取某个列的所有值
User::where('status',1)->column('name');
// 以id为索引
User::where('status',1)->column('name','id');

valuecolumn方法返回的不再是一个模型对象实例,而是纯粹的值或者某个列的数组。

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

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

相关文章

springboot整合sharding-jdbc实现分库分表详解

目录 一、为什么需要分库分表 1.1 分库分表的优势 二、分库分表基本概念 2.1 垂直分表 2.2 水平分表 2.3 垂直分库 2.4 水平分库 三、分库分表带来的问题 3.1 分布式事务问题 3.2 跨节点关联查询问题 3.3 跨节点分页、排序问题 3.4 主键避重问题 四、分库分表常用…

Java --- 云尚办公之菜单管理模块

一、菜单管理 数据库表&#xff1a; CREATE TABLE sys_menu (id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 编号,parent_id BIGINT(20) NOT NULL DEFAULT 0 COMMENT 所属上级,name VARCHAR(20) NOT NULL DEFAULT COMMENT 名称,type TINYINT(3) NOT NULL DEFAULT 0 COMMEN…

LSTM预测汇率涨跌分析

前言 本文主要是采用lstm对汇率涨跌进行预测&#xff0c;是一个二分类的预测问题。 步骤解析 数据构造 原始数据是单变量数据 import pandas as pdfile_path r"./huilv.csv" data pd.read_csv(file_path, usecols[1],encodinggbk) data[level] -1 美元 l…

打造高效接口自动化框架,YAML测试用例封装技巧大揭秘!

目录 前言&#xff1a; 一、框架介绍 本框架包含两个部分&#xff1a; 本框架的构建目标是&#xff1a; 二、框架目录结构 三、规范YAML测试用例封装步骤 四、框架使用 五、总结 前言&#xff1a; 本文介绍了一个基于Python和PyTest的接口自动化框架封装项目实战&#…

最佳实践,高效编写Web自动化测试强制交互方法封装技巧

目录 前言&#xff1a; 一、Web自动化测试的基本原理 二、封装强制交互方法 1、输入框强制交互 2、其他强制交互 三、封装基础类方法 四、总结 前言&#xff1a; Web自动化测试是现代软件开发中必不可少的部分。Web自动化测试可以帮助测试人员快速地验证页面功能并发现潜…

Fiddler 抓包工具下载安装基本使用(详)

在做软件测试或者Bug定位的时候会用到一些抓包工具&#xff0c;当然抓包工具还要一些其他用途可以做一些API的抓取&#xff0c;那么本篇内容就来讲 Fiddler 抓包工具的下载安装以及如何来实际的应用。讲了这些可能有的读者还不知道这个"Fiddler"怎么读呢&#xff1f;…

详解flutter刷新流程,让你的应用更流畅

本文已授权公众号【缦图技术团队】发布 详解flutter刷新流程&#xff0c;让你的应用更流畅 一、概述 Flutter 是谷歌推出的高性能、跨端UI框架&#xff0c;可以通过一套代码&#xff0c;支持 iOS、Android、Windows/MAC/Linux 等多个平台&#xff0c;且能达到原生性能。Flutte…

pthread_getspecific和pthread_setspecific详解

写在前面 在Linux系统中使用C/C进行多线程编程时&#xff0c;我们遇到最多的就是对同一变量的多线程读写问题&#xff0c;大多情况下遇到这类问题都是通过锁机制来处理&#xff0c;但这对程序的性能带来了很大的影响&#xff0c;当然对于那些系统原生支持原子操作的数据类型来…

【CV】Yolov8:ultralytics目标检测、关键点检测、语义分割

note Yolov8提供了一个全新的 SOTA 模型&#xff0c;包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例分割模型。和 YOLOv5 一样&#xff0c;基于缩放系数也提供了 N/S/M/L/X 尺度的不同大小模型&#xff0c;用于满足不同场景需求骨干网络和 Neck 部分可能参…

KVM(一)Linux部署KVM及新建虚拟机

目录 一、准备工作 1.1 防火墙、SElinux 二、安装KVM 2.1 yum源 2.2 安装工具包 2.3 安装KVM组件 2.4 查看磁盘/新建目录 2.5 安装Linux GUI可视化界面 三、KVM桌面版新建虚拟机 3.1 挂载目录 3.2 新建raw/qcow2文件 3.3 新建虚拟机 3.4 KVM命令行新建虚拟机 一、…

Linux rootfs

前言 通过《initrd&init进程》我们知道rootfs 是文件系统的根目录&#xff0c;其包含了操作系统所需的所有文件和目录&#xff0c;包括程序、库文件、配置文件、设备文件等&#xff0c;它是系统启动时必须加载的文件系统之一。当系统启动后&#xff0c;内核会首先挂载 roo…

本地Jrebel 许可服务器搭建

一、下载 下载 JrebelLicenseServer.zip 二、解压 解压后进入 bin 目录 三、服务安装|启动|停止|删除|... 安装服务&#xff1a;JrebelLicenseServer.bat install启动服务&#xff1a;JrebelLicenseServer.bat start停止服务&#xff1a;JrebelLicenseServer.bat stop删除服…

【Three.js】第一、二章 入门指南和基础知识

01.介绍 Three.js 非常庞大&#xff0c;你可以用它做无数的事情。 在第一章中&#xff0c;我们将学习所有基础知识&#xff0c;例如创建第一个场景、渲染、添加对象、选择正确的材料、添加纹理、为所有内容制作动画&#xff0c;甚至将其放到网上。有些人可能会觉得这部分有点…

如何轻松掌握接口测试——POST请求和COOKIE使用技巧?

目录 引言 请求方法&#xff1a; POST请求方法&#xff1a;添加资源&#xff08;对服务端已存在的资源也可以做修改和删除操作&#xff09; 实战练习 实战练习2 COOKIE&#xff1a; Status Code&#xff1a;协议状态码 接口文档 结语 引言 对于初学者或者没有接口测试…

[笔记]渗透测试工具Burpsuit《一》Burpsuit介绍

文章目录 前言一、安装配置1.1 环境1.2 安装过程1.3 科技过程 二、常用功能2.1 Manual penetration testing features2.2 Advanced/custom automated attacks2.3 Automated scanning for vulnerabilities2.4 Productivity tools2.5 Extensions 三、拓展功能 前言 Burp Suite(b…

设计原则-单一职责原则

在编程大环境中&#xff0c;评价代码组织方式质量的好坏涉及到各个方面&#xff0c;如代码的可读性、可维护性、可复用性、稳定性等各个方面。而在面向对象语言中也可以通过以下各个方面&#xff1a; 类中方法的设计类中属性的设计类(接口、抽象类、普通类)的设计类与类之间的…

IMU 积分进行航迹推算

IMU 积分进行航迹推算 Reference https://github.com/gaoxiang12/slam_in_autonomous_driving 1.0 递推方程推导 \quad 连续时间内的 IMU 运动学方程&#xff1a; R ˙ R ω ∧ q 1 2 q ω ˙ p ˙ v v ˙ a \dot{\mathbf{R}}\mathbf{R}\omega ^{\wedge} \\ \dot{\mathbf{…

[CTF/网络安全] 攻防世界 weak_auth 解题详析

[CTF/网络安全] 攻防世界 weak_auth 解题详析 弱认证弱认证绕过方法姿势Burp Suite 爆破 总结 题目描述&#xff1a;小宁写了一个登陆验证页面&#xff0c;随手就设了一个密码。 弱认证 weak_auth翻译&#xff1a;弱认证 这个术语通常用来描述一种较弱的安全认证方法或机制&am…

HTML语法、常用标签、表单,CSS选择器。简单登录页面的实现

HTML和CSS粗略介绍 文章目录 HTML和CSS粗略介绍HTML页面第一个HTML页面添加图片和视频 HTML语法规范div标签span标签转义字符 HTML常用标签换行和分割线标题超链接列表元素表格 HTML表单输入框和按钮多行文本 CSS样式CSS选择器input标签选择器id选择器类选择器 组合选择器和优先…

【HackTheBox Bagel】打靶记录

一、namp扫描到5000 8000 22 端口 二、访问8000端口&#xff0c;看到跳转到域名bagel.htb&#xff0c;加入到hosts 看到该url 像文件包含&#xff0c;尝试fuzz一波 尝试找公私钥均未果&#xff0c;找到了cmdline 进一步对其包含 HTTP/1.1 200 OK Server: Werkzeug/2.2.2 …