ThinkPHP01:数据库和模型

ThinkPHP01:数据库和模型

  • 一、开启调试模式
  • 二、配置文件
  • 三、URL解析
  • 四、数据库
  • 五、模型
    • 1. 定义模型
    • 2. 使用模型
      • ① 查询记录
      • ② 新增记录
      • ③ 删除记录
      • ④ 更新记录
    • 3. 字段设置
    • 4. 模型获取器
    • 5. 模型修改器
    • 6. 模型查询范围
    • 7. 模型数据集
    • 8. 模型的自动时间戳
    • 9. 模型的只读字段
    • 10. 模型类型和转换
    • 11. 模型软删除
  • 六、关联模型
    • 1. 关联模型定义
    • 2. 一对一关联查询
    • 3. 一对多关联查询
    • 4. 关联预载入
    • 5. 关联统计和输出
    • 6. 多对多关联查询
  • 七、操作JSON
    • 1. 数据库JSON
    • 2. 模型JSON
  • 八、事件
    • 1. 数据库事件
    • 2. 模型事件

一、开启调试模式

  • 根目录会自带一个.example.env文件。把.example删掉即可开启调试模式。
  • .env中设置APP_DEBUG = true
  • 调试模式下,在页面右下角会出现Trace调试小图标。

在这里插入图片描述

二、配置文件

  • 配置文件有两种形式:.env用于本地开发测试;config用于部署上线。
  • 本地测试时,.env优先于config。部署上线时,.env会被自动忽略。
  • 获取配置:
    public function config() {
        echo "env配置:" . env("database.hostname");
        echo "<br>";
        echo "config配置:" . config("database.connections.mysql.hostname");
    }
    

三、URL解析

  • ThinkPHP 默认单应用模式。
class Test {
    // 控制器默认操作, http://localhost:8000/test
    public function index() {
        return "index";
    }
    // http://localhost:8000/test/hello
    public function hello() {
        return "hello";
    }
    // http://localhost:8000/test/hello1?value=world
    public function hello1($value = "") {
        return "hello, ". $value;
    }
}
  • 修改默认的控制器文件目录,在config下的route.php中配置。

四、数据库

  • 查询整个表,当有前缀时使用 name(“member”)
use think\facade\Db;

class DataTest {
    public function index() {
        $dbs = Db::table('member')->select();
        return json($dbs);
    }
}
  • 单数据查询,find() 没有数据返回 null,findOrFail() 没有数据抛出异常, findOrEmpty() 没有数据返回空数组。
public function index2() {
    // 查询id为1
    $dbs = Db::table('member')->where('id',1)->find();
    // 查看sql语句
    return Db::getLastSql();
    return json($dbs);
}
  • 数据集查询,select() 返回所有数据,selectOrFail() 没有数据抛出异常,toArray()将select() 后的数据集转化为刷组。
  • 其他查询,value() 返回某个字段,column() 返回某个字段的多个值,如果数据量过大使用chunk() 分批处理数据,或游标查询cursor()。
  • 同一个对象实例第二次查询会保留第一次查询的值,使用 removeOption() 可以清理掉上一次查询保留的值。
  • 新增数据,使用 insert() 返回影响行数,如果添加不存在的字段数据会抛出异常,如果强行新增不存在的字段使用 strick(false) 忽略异常,insertGetId() 获取插入的ID,insertAll() 插入多条数据,replace() 可以实现replace into,save() 可以判断是否新增或修改。
public function index3() {
    $data = [
        "name" => "k",
        "age" => 12,
        "email" => "@@@"
    ];
    return $this->memberTable->insert($data);
}
  • 修改数据,使用update(),修改时执行函数操作使用 exp(),自增自减某个字段使用 inc()/dec(),使用 raw() 可以实现前面的所有操作。
  • 删除数据,使用delete(),默认根据主键删除。
  • 查询表达式,有 where()、whereLike()、whereBetween()、whereIn()、whereNull()。
  • 时间查询,有 where()、whereBetween()、whereBetweenTime()、whereTime()、whereYear()、whereMonth()、whereDay()、whereBetweenTimeField()。
  • 聚合查询,count()、max()、min()、avg()、sum()。子查询,fetchSql()、buildSql()、where闭包。原生查询,query()、execute()。
  • 链式查询,where()、whereRaw()、field()、fieldRaw()、withoutField()、alias()、limit()、page()、order()、orderRaw()、group()、having()。
  • 快捷查询,whereColumn()、whereXXX() XXX代表字段名、getByXXX()、getFieldByXXX()、when()、withAttr()。
  • 事务处理,transaction()、rollback()。

五、模型

1. 定义模型

  • 定义语法,对应数据库中的member表,大驼峰命名。
    use think\Model;
    
    class Member extends Model {
    }
    
  • 如果要在模型中指定模型名。
    use think\Model;
    
    class MemberModel extends Model {
    	protected $name = 'member';
    }
    
  • 默认主键是 id,主动设置主键
    use think\Model;
    
    class MemberModel extends Model {
    	protected $pk = 'uid';
    }
    
  • 类名默认对应表名,主动设置表
    use think\Model;
    
    class MemberModel extends Model {
    	protected $table= 'member';
    }
    
  • 模型初始化,自动调用。
    use think\Model;
    
    class MemberModel extends Model {
    	protected static function init(){
    		parent::init();
    	}
    }
    

2. 使用模型

  • 控制器中引入模型

    use \app\model\Member as MemberModel;
    

① 查询记录

  • Db门面的查询功能,模型都支持。
  • 所有记录
    use \app\model\Member as MemberModel;
    
    class Member {
        public function index() {
            $member = MemberModel::select();
            $member = MemberModel::find(1);
            return $member;
        }
    }
    
  • 单条记录
    public function index() {
        $member = MemberModel::find(1);
        return $member;
    }
    

② 新增记录

  • 普通新增

    public function insert() {
        // 新增方式1
        $member = new MemberModel();
        $member->name = "李白";
        $member->age = 18;
        $member->email = "@";
        $member->save();
    
        // 新增方式2
        $member = new MemberModel();
        $member->save([
            'name' => "李黑",
            'age' => 19,
            'email' => "@"
        ]);
    }
    
  • 验证新增,设置允许写入的字段

    $member->allowField(['name', 'age'])->save([
        'name' => "李黑",
        'age' => 19,
        'email' => "@"
    ]);
    
  • replace新增

    $member->replace()->save();
    
  • 新增成功后,获取自增的ID

    $member->id;
    
  • 批量新增

    $member = new MemberModel();
    $dataAll = [
        [
            'name' => "黑李",
            'age' => 22,
            'email' => "@"
        ],
        [
            'name' => "白李",
            'age' => 24,
            'email' => "@"
        ],
    ];
    dump($member->saveAll($dataAll));
    
  • 使用静态方法 create(新增数组, 允许写入的字段, 是否replace),创建要新增的数据。

    $member = MemberModel::create([
        'name' => "白李",
        'age' => 24,
        'email' => "@"
    ], ['name', 'age'], true);
    echo $member->id;
    

③ 删除记录

  • 删除单个,默认根据主键删除。

    public function delete() {
        // 成员方法删除
        $member = MemberModel::find(1);
        $member->delete();
    
        // 静态方法删除
        MemberModel::destroy(2);
    }
    
  • 批量删除

    MemberModel::destroy([3, 4, 5]);
    
  • 通过闭包删除

    MemberModel::destroy(function ($query){
    	$query->where("age", "<", 10);
    });
    

④ 更新记录

  • 普通更新

    public function update() {
        $member = MemberModel::find(8);
        $member->name = "李四";
        $member->age = 120;
        $member->save();
    }
    
  • 强制更新

    $member->force()->save();
    
  • Db::raw() 执行SQL函数

    $member->age = Db::raw("age + 1");
    
  • allowField() 限制更新的字段(限制不了raw)。

  • saveAll() 批量更新,只能根据主键更新,返回被修改的数据集。

  • 静态方法update(数据数组, 限定记录, 限定字段)

    MemberModel::update([
        'name' => "占山",
        'age' => 15
    ], ['id' => 10], ['name']);
    

3. 字段设置

  • 模型的数据字段对应表字段,默认严格区分大小写。

    class Member extends Model {
    	// 是否严格区分大小写
    	protected $strict = false;
    	
    	// 设置字段
        protected $schema = [
            "id" => 'int',
            'name' => "string",
            "age" => "int",
            "email" => "string"
        ];
    }
    
  • $schema属性只对模型有效。如果需要Db类也有效,config/database.php 开启字段缓存。

    'fields_cache'    => true,
    
  • 在模型中处理数据

    class Member extends Model {
        public function getMemberName($id) {
            $data = $this->find($id);
            return $data->getAttr('name');
        }
    }
    

4. 模型获取器

  • 一个获取器对应模型中的一个特殊方法,该方法是public,方法名格式固定getXxxAttr()

  • 获取器的作用是对模型实例的数据做出自动处理。

    class Member extends Model {
        // 获取器,获取数据时自动执行
        public function getAgeAttr($value) {
            if ($value < 18) {
                return "未成年";
            }else{
                return "已成年";
            }
        }
    }
    
  • 如果定义了获取器,并且需要获取原始值,使用getData()

  • 动态获取器withAttr()

    public function index6() {
        $var = MemberModel::select()->withAttr("email", function ($value) {
            return strtoupper($value);
        });
        return json($var);
    }
    

5. 模型修改器

  • 修改器的作用是在新增、修改数据时对数据进行格式化、过滤等处理,方法名格式固定setXxxAttr()

  • 修改器只对模型操作有效,对Db类无效。

    class Member extends Model {
        public function setEmailAttr($value) {
            return strtoupper($value);
        }
    }
    

6. 模型查询范围

  • 在模型中封装一个查询或写入的方法,方便控制器调用。方法名格式scopeXxx

    class Member extends Model {
        public function scopeAdult($query) {
            $query->where("age", ">=", 18)
                ->field("id, name, age")
                ->limit(3);
        }
    }
    
  • 调用只需要后缀,查询范围只支持find和select。

    use \app\model\Member as MemberModel;
    
    class Member {
        public function index7() {
            $select = MemberModel::adult()->select();
            return json($select);
        }
    }
    
  • 全局查询范围,任何查询都需要加上这个范围。

    class Member extends Model {
    	// 定义全局查询范围
        protected $globalScope = ['status'];
    
        public function scopeStatus($query) {
            $query->where("status", 1);
        }
    }
    

7. 模型数据集

  • 数据集继承于collection类。
  • 隐藏某个字段 hidden(),显示某个字段 visible(),添加获取器字段 append(),对字段进行函数处理 withAttr()

8. 模型的自动时间戳

  • 自动时间戳会自动写入create_time和update_time两个字段。默认值是int。

  • 全局开启自动时间戳,在config/database.php中设置

    'auto_timestamp'  => true,
    
  • 只想设置一个模型开启,在模型中设置

    protected $autoWriteTimestamp = true;
    
  • 自定义新增和修改的时间戳

    protected $createTime = "create_at";
    protected $updateTime = "update_at";
    
  • 不需要update_time

    protected $updateTime = false;
    

9. 模型的只读字段

  • 只读字段只支持模型,不支持数据库方式。

  • 只读字段在修改时无法被修改。

    protected $readonly = ['name','email'];
    
  • 动态设置只读字段。

    $member->readonly(['name','email'])->save();
    

10. 模型类型和转换

  • 类型转换会调用属性里的获取器等操作。

  • 设置类型转换可以在获取数据前将类型转换成需要的类型。

    protected $type = [
    	'name' => 'string',
    	'price' => 'float',
    	"create_time" => "datetime:Y-m-d"
    ];
    
  • 当字段不再使用时,可以设置为废弃字段。

    protected $disuse = ['status', 'uid'];
    

11. 模型软删除

  • 软删除不会物理删除记录,相当于全局查询范围。

  • 在模型中设置软删除的功能。

    use think\model\concern\SoftDelete;
    
    class Member extends Model {
        use SoftDelete;
        protected $deleteTime = "delete_time";
    }
    
  • 取消屏蔽软删除

    UserModel::withTrashed()->select();
    
  • 显示被软删除的记录

    UserModel::onlyTrashed()->select();
    
  • 还原软删除 restore()

    $user = UserModel::onlyTrashed()->find(300);
    $user->restore();
    
  • 物理删除

    UserModel::onlyTrashed()->find(298)->force()->delete();
    

六、关联模型

1. 关联模型定义

  • 关联模型是将表与表之间进行关联和具象化,更高效的操作数据。

  • 主表关联附表(正向关联),hasOne(附表模型, 外键, 主键) 一对一关联,外键默认为主表名_id

    class profile extends Model {
    }
    
    class Member extends Model {
        public function profile() {
            return $this->hasOne(Profile::class);
        }
    }
    
  • 附表关联主表(反向关联),belongsTo()

    class Profile extends Model {
        public function member() {
            return $this->belongsTo(Member::class, "user_id");
        }
    }
    
  • 调用模型

    use app\model\Member as MemberModel;
    class Grade {
        public function index() {
            $member = MemberModel::find(1);
            return $member->profile->hobby;
        }
    }
    
  • 关联方式

    函数说明
    hasOne一对一
    belongsTo一对一
    hasMany一对多
    hasOneThrough远程一对一
    hasManyThrough远程一对多
    belongsToMany多对多
    morphMany多态一对多
    morphTo多态
  • 正反向关联

    说明正向关联反向关联
    一对一hasOnebelongsTo
    一对多hasManybelongsTo
    多对多belongsToManybelongsToMany
    远程一对多hasManyThrough\
    多态一对一morphOnemorphTo
    多态一对多morphManymorphTo

2. 一对一关联查询

  • 一对一关联修改

    $member = MemberModel::find(1);
    $member ->profile->save(['hobby' => '吃饭']);
    
  • 一对一关联新增

    $member = MemberModel::find(1);
    $member ->profile()->save(['hobby' => '吃饭']);
    
  • 正向关联反向操作

    $member = MemberModel::hasWhere("prefile", ["id" => 2])->find();
    

3. 一对多关联查询

  • has() 方法查询关联附表的主表内容。

    MemberModel::has("profile", ">=", 2)->select();
    
  • together() 可以在删除主表内容时,同时删除附表关联的内容。

    $member = MemberModel::with('profile')->find(2);
    $member->together(['profile'])->delete();
    
  • 新增和一对一关联新增相同。

4. 关联预载入

  • 关联预载入可以减少查询次数提高性能,但不支持多次调用。

    $list = MemberModel::with(['profile'])->select([19, 20, 21]);
    foreach ($list as $member) {
    	dump($member->profile);
    }
    
  • 如果主表关联多个附表。

    $list = MemberModel::with(['profile', 'book'])->select([19, 20, 21]);
    foreach ($list as $member) {
    	dump($member->profile.$member->book);
    }
    
  • 延迟预载入

    $list = MemberModel::select([19, 20, 21]);
    $list->load(['profile']);
    foreach ($list as $member) {
    	dump($member->profile);
    }
    

5. 关联统计和输出

  • 统计主表在附表中有多少条记录,包括 withMax、withMin、withCount、withAvg等。

    public function index3() {
        $list = MemberModel::withCount(['profile'])->select([1,2,3]);
        foreach ($list as $member) {
            echo $member->profile_count . '<br>';
        }
    }
    
  • 关联统计输出采用 关联方法_统计方法

  • hiddenvisible控制隐藏和显示的字段,append添加额外字段。

    $list = MemberModel::withCount(['profile'])->select([1,2,3]);
    $list->hidden(['password', 'gender', 'profile.status']);
    

6. 多对多关联查询

  • 多对多中间表模型类 Pivot。

  • 在模型类中设置多对多关联,belongsToMany(关联模型, 中间表, 外键, 关联键)

    public function roles(){
    	return $this->belongsToMany(Role::class, Access::class);
    }
    
  • 使用

    // 获取用户
    $member = MemberModel::find(2);
    // 获取用户权限
    $roles = $member->roles;
    
  • 新增,需要通过用户表新增到中间表关联。

    $member = MemberModel::find(2);
    $member->roles->save(Role::find(5));
    $member->roles->saveAll([1, 2, 3]);
    $member->roles->attach(5, ["detail" => "测试"]);
    
  • 删除中间表数据

    $member = MemberModel::find(2);
    $member->detach(5);
    

七、操作JSON

1. 数据库JSON

  • 在数据库中写入JSON,使用数组方式。用json()指定JSON字段。

    public function insert(){
    	$data = [
    		"name" => "张三",
    		"list" => ["nikeName" => "zs", "gender" => "女"]
    	];
    	return Db::name("user")->json(["list"])->insert($data);
    }
    
  • 查询数据,需要转换JSON,也需要设置json()

    Db::name('user')->json(["list"])->find(15);
    
  • 修改JSON字段

    $data["list"] = ["nikeName" => "zs", "gender" => "女"];
    Db::name("user")->json(['list']->where('id', 1)->update($data);
    
    $data["list->gender"] = "男";
    Db::name("user")->json(["lsit"])->where('id', 1)->update($data);
    

2. 模型JSON

  • 在模型中设置JSON字段

    protected $json = ["list"];
    
  • 模型中通过JSON的数据查询

    UserModel::where('list->name', "小红")->find();
    
  • 更新数据

    $user = UserModel::find(1);
    $user->list->name = "小黑";
    $user->save();
    

八、事件

  • 在执行增删改查的时候,可以触发一些事情来执行额外的操作。

1. 数据库事件

  • 数据库事件只支持 find、select、update、delete、insert。
  • 数据库实践方法为 Db::event('事件名', '执行函数')
事件名说明
before_selectselect查询前回调
before_findfind查询前回调
after_insertinsert操作成功后回调
after_updateupdate操作成功后回调
after_deletedalete操作成功后回调
  • 在控制器端,事件一般写在初始化方法里(继承于 BaseController)。

    use app\BaseController;
    use think\facade\Db;
    
    class Member extends BaseController {
        public function initialize() {
            Db::event("before_select", function ($query) {
                echo "执行了批量查询";
            });
            
            Db::event("after_update", function ($query) {
                echo "修改被执行";
            });
        }
    }
    

2. 模型事件

  • 模型支持的事件类型更丰富。
class Member extends Model {
    protected static function onAfterRead($query){
        echo "一条数据被查询";
    }

    protected static function onBeforeUpdate(Model $model) {
        parent::onBeforeUpdate($model); // TODO: Change the autogenerated stub
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么VMware会给我多创建了两个网络呢?Windows和Linux为什么可以彼此ping的通呢

为什么VMware会给我多创建了两个网络呢&#xff1f;Windows和Linux为什么可以彼此ping的通呢 文章目录为什么VMware会给我多创建了两个网络呢&#xff1f;Windows和Linux为什么可以彼此ping的通呢桥接模式ANT模式&#xff08;VMnet8&#xff09;仅主机模式&#xff08;VMnet1&a…

学习系统编程No.6【进程控制】

引言&#xff1a; 北京时间&#xff1a;2023/3/19/15:16&#xff0c;刚刚睡醒&#xff0c;我发现我真的能睡&#xff0c;早上将反向迭代器剩下的一些知识学完&#xff0c;发现&#xff0c;昨天那篇博客发的有些匆忙了&#xff0c;最后有关反向迭代器的知识都没有把精华部分给分…

使用旧电脑玩Linux

今天给大家讲讲使用旧电脑玩Linux&#xff0c;大家应该都知道旧电脑的硬件一般比较落后&#xff0c;特别是一些非常老的电脑&#xff0c;目前还在使用的是机械硬盘&#xff0c;如是要跑windows可想而知&#xff0c;但是Linux系统对硬件性能的要求可比windows低的多了&#xff0…

常用React Hooks大合集(二)

React Hooks useRef useRef返回一个ref对象&#xff0c;返回的ref对象再组件的整个生命周期保持不变。 最常用的ref是两种用法&#xff1a; 用法一&#xff1a;引入DOM&#xff08;或者组件&#xff0c;但是需要是class组件&#xff09;元素&#xff1b;用法二&#xff1a;保…

C#中的DataGridView中添加按钮并操作数据

背景&#xff1a;最近在项目中有需求需要在DataGridView中添加“删除”、“修改”按钮&#xff0c;用来对数据的操作以及显示。 在DataGridView中显示需要的按钮 首先在DataGridView中添加需要的列&#xff0c;此列是用来存放按钮的。 然后在代码中“画”按钮。 if (e.Column…

JVM监控搭建

文章目录JVM监控搭建整体架构JolokiaTelegrafInfluxdbGrafanaJVM监控搭建 整体架构 JVM 的各种内存信息&#xff0c;会通过 JMX 接口进行暴露。 Jolokia 组件负责把 JMX 信息翻译成容易读取的 HTTP 请求。Telegraf 组件作为一个通用的监控 agent&#xff0c;和 JVM 进程部署在…

ChatGPT推出第四代GPT-4!不仅能聊天,还可以图片创作!

3月15日凌晨&#xff0c;OpenAI震撼发布了多模态预训练大模型 GPT-4。 根据官网发布的通告可以知道&#xff0c;GPT-4 实现了以下几个方面的飞跃式提升&#xff1a;强大的AI创作识图能力&#xff1b;文字输入限制提升至 2.5 万字&#xff1b;回答准确性显著提高&#xff1b;能够…

【基础算法】数组相关题目

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招算法的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于代码随想录进行的&#xff0c;每个算法代码参考leetcode高赞回答和…

DJ2-4 进程同步(第一节课)

目录 2.4.1 进程同步的基本概念 1. 两种形式的制约关系 2. 临界资源&#xff08;critical resource&#xff09; 3. 生产者-消费者问题 4. 临界区&#xff08;critical section&#xff09; 5. 同步机制应遵循的规则 2.4.2 硬件同步机制 1. 关中断 2. Test-and-Set …

人工智能前沿知识

本来想着初试完学习一下李沐大神的《动手学深度学习》这本书的&#xff0c;但是时间仓促&#xff0c;完全来不及。只能先自行了解一些知识&#xff0c;之后再深入了解。 这里为面试应答&#xff0c;问了chatgpt一些关于AI前沿的知识&#xff1a; 还需要再了解一番&#xff1a;…

网站经常被DDOS攻击的原因有哪些

过去这几年&#xff0c;互联网创业热潮非常火&#xff0c;几乎所有行业都向互联网转型。很多互联网公司都会经历被 DDoS 攻击&#xff0c;导致网站服务瘫痪&#xff0c;用户流失以及公司信用度的负面影响。什么是 DDOS 攻击呢&#xff1f;DDOS 攻击是通过控制大量僵尸网络向服务…

人工智能的几个研究方向

人工智能主要研究内容是&#xff1a;分布式人工智能与多智能主体系统、人工思维模型、知识系统、知识发现与数据挖掘、遗传与演化计算、人工生命、人工智能应用等等。 其中热门研究有以下几种。 一、计算机视觉 就包括图像识别&#xff0c;视频识别&#xff0c;具体应用有人…

Python 基础教程【3】:字符串、列表、元组

本文已收录于专栏&#x1f33b;《Python 基础》文章目录&#x1f315;1、字符串&#x1f95d;1.1 字符串基本操作&#x1f34a;1.1.1 字符串创建&#x1f34a;1.1.2 字符串元素读取&#x1f34a;1.1.3 字符串分片&#x1f34a;1.1.4 连接和重复&#x1f34a;1.1.5 关系运算&…

Java序列化与反序列化

优秀博文&#xff1a;IT-BLOG-CN 序列化&#xff1a;把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。 反序列化&#xff1a;把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。 一、序列化对象 【1】必须实现序列化接口Serializabl…

RK3568平台开发系列讲解(驱动基础篇)I2C协议介绍

🚀返回专栏总目录 文章目录 一、I2C基本读写过程二、通讯的起始和停止信号三、数据有效性四、地址及数据方向五、响应沉淀、分享、成长,让自己和他人都能有所收获!😄 📢I2C的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。 一、…

《网络安全入门到精通》 - 2.1 - Windows基础 - DOS命令Windows防火墙Windows共享文件

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「订阅专栏」&#xff1a;此文章已录入专栏《网络安全入门到精通》 Windows基础一、DOS命令1、目录文件操作dir 列出目录文件cd 切换目录md 创建目录rd 删除目录move 移动文件或目…

4.网络爬虫—Post请求(实战演示)

网络爬虫—Post请求实战演示POST请求GET请求POST请求和GET请求的区别获取二进制数据爬[百度官网](https://www.baidu.com/)logo实战发送post请求百度翻译实战使用session发送请求模拟登录17k小说网常见问题前言&#xff1a; &#x1f4dd;​&#x1f4dd;​此专栏文章是专门针对…

数据结构笔记

文章目录第一章&#xff1a;数据结构与算法第二章&#xff1a;稀疏数组和队列一 、稀疏sparsearray 数组&#xff08;一&#xff09;案例需求&#xff08;二&#xff09;稀疏数组介绍&#xff08;三&#xff09;应用实列&#xff08;四&#xff09;代码实现二、队列&#xff08…

动态规划算法

一、前言动态规划是一种常用的算法&#xff0c;在算法领域十分重要&#xff0c;但对于新手来说&#xff0c;理解起来有一定的挑战性&#xff0c;这篇博客将明确步骤来一步一步讲解动态规划到底该如何理解与运用。二、解析动态规划算法1.特点①把原来的问题分解成了【要点相同】…

【Linux】软件包管理器 yum

什么是软件包和软件包管理器 在 Linux 下需要安装软件时&#xff0c; 最原始的办法就是下载到程序的源代码&#xff0c; 进行编译得到可执行程序。但是这样太麻烦了&#xff0c;所以有些人就把一些常用的软件提前编译好, 做成软件包 ( 就相当于windows上的软件安装程序)放在服…