PHP对接企业微信

news2025/1/17 21:41:31

前言

        最近在做项目中,要求在后台管理中有企业微信管理的相关功能。相关准备工作,需要准备好企业微信账号,添加自建应用,获得相应功能的权限,以及agentid、secre等。

        参考文档:

        企业微信开发文档

功能实现

        因功能接口比较多,这里以“客户敏感词”为例,以下为“敏感词”管理功能实现。

        1 想法思路

         企业微信接口有请求次数限制,后台操作频繁,避免多次请求企业微信接口,也为了相应速度考虑,我这里考虑将输入进行入库处理。每次新建敏感词,企业微信“新增敏感词”接口请求成功后,将数据添加到数据库,编辑和删除同理。这样敏感词列表、查看敏感词就可以减少对企业微信接口的请求。

        2 注意事项

         (1)敏感词这里需要依赖通讯录中的成员和部门,因此需要先开发这两个模块之后,再进行敏感词功能开发(成员和部门也做了入库处理,所以在下面代码中,我也是直接查询数据库的内容);

         (2)access_token 有三种:通讯录access_token、联系人access_token以及自建应用 access_token,要根据接口需要,看需要哪一种access_token,否则就会报错。敏感词这里使用的是自建应用 access_token。

         (3)要记得添加IP白名单。

        3 代码实现

  InterceptController.php

<?php
// +-----------------------xiaozhe-----------------------------------------------

namespace app\wework\controller;

use cmf\controller\AdminBaseController;
use app\wework\service\InterceptService;
use app\wework\service\WechatInterceptApi;
use app\wework\model\InterceptModel;
use app\wework\model\WeUserModel;
use app\admin\model\AdminMenuModel;

class InterceptController extends AdminBaseController
{
    
    // 敏感词列表
    public function index()
    {   
        // 接口请求敏感词列表
        // $wxinterceptApi = new WechatInterceptApi();
        // $list = $wxinterceptApi->getInterceptRuleList();
        // echo "<pre>";
        // print_r($list);
        // exit;
        $param = $this->request->param();
        $interceptService = new InterceptService();
        $data = $interceptService->getList($param);
        $data->appends($param);
        $this->assign('keyword', isset($param['keyword']) ? $param['keyword'] : '');
        $this->assign('lists', $data->items());
        $this->assign('page', $data->render());
        return $this->fetch();
    }


    // 新增敏感词
    public function add()
    {
        if ($this->request->isPost()) {
            $data = $this->request->param();
            $interceptModel = new InterceptModel();
            $data['create_time'] = time();
            $data['user_id'] = cmf_get_current_admin_id();
            $data['group_id'] = 0;
            if ($data['applicable_type'] == 2) {
                // 选择员工的话,是员工名
                $userModel = new WeUserModel();
                $userList = $userModel->whereIn('userid',$data['applicable_range'])->column("userid","department_id");
                $group_arr = array_unique(array_keys($userList));
                $applicable_range['user_list'] = implode(",",$userList);
                $applicable_range['department_list'] = implode(",",$group_arr);
                $data['applicable_range'] = json_encode($applicable_range,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            } else {
                $userModel = new WeUserModel();
                $userList = $userModel->whereIn('department_id',$data['applicable_range'])->column("userid");
                $applicable_range['user_list'] = implode(",",$userList);
                $applicable_range['department_list'] = $data['applicable_range'];
                $data['applicable_range'] = json_encode($applicable_range,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            }
            if (!empty($data['semantics_list'])) {
                $data['semantics_list'] = implode(",",$data['semantics_list']);
            }

            // 敏感词接口新增
            $user_list = !empty($applicable_range['user_list']) ? explode(",",$applicable_range['user_list']) : [];
            $department_list = explode(",",$applicable_range['department_list']);
            $wx_intercept = array(
                'rule_name' => $data['rule_name'],
                'word_list' => explode(",",$data['word_list']),
                'semantics_list' => explode(",",$data['semantics_list']),
                'intercept_type' => $data['intercept_type'],
                'applicable_range' => array(
                    'user_list' =>  $user_list,
                    'department_list' => $department_list
                )
            );
            
            $wxinterceptApi = new WechatInterceptApi();
            $res = $wxinterceptApi->addInterceptRule($wx_intercept);
            if ($res['errcode'] != 0) {
                $this->error($res['errmsg'], url("Intercept/index"));
            }

            $data['rule_id'] = $res['rule_id'];
            $result = $interceptModel->save($data);
            if ($result) {
                $this->success('添加成功!', url("Intercept/index"));
            } else {
                $this->error('添加失败!', url("Intercept/index"));
            }
        }
        return $this->fetch();
    }

    // 编辑敏感词
    public function edit()
    {
        if ($this->request->isPost()) {
            $data = $this->request->param();
            $id = $data['id'] ?? 0;
            unset($data['id']);
            if ($data['applicable_type'] == 2) {
                // 选择员工的话,是员工名
                $userModel = new WeUserModel();
                $userList = $userModel->whereIn('userid',$data['applicable_range'])->column("userid","department_id");
                $group_arr = array_unique(array_keys($userList));
                $applicable_range['user_list'] = implode(",",$userList);
                $applicable_range['department_list'] = implode(",",$group_arr);
                $data['applicable_range'] = json_encode($applicable_range,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            } else {
                $userModel = new WeUserModel();
                $userList = $userModel->whereIn('department_id',$data['applicable_range'])->column("userid");
                $applicable_range['user_list'] = implode(",",$userList);
                $applicable_range['department_list'] = $data['applicable_range'];
                $data['applicable_range'] = json_encode($applicable_range,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            }
            
            $update_info = $data;
            $interceptModel = new InterceptModel();
            // 敏感词接口编辑
            // 查询原来的数据
            $rule_info = $interceptModel->field("rule_id,applicable_range")->where("id",$id)->find();

            $old_add_applicable_range = json_decode($rule_info['applicable_range'],true);
            $old_user_list = !empty($old_add_applicable_range['user_list']) ? explode(",",$old_add_applicable_range['user_list']) : [];
            $old_department_list = !empty($old_add_applicable_range['department_list']) ? explode(",",$old_add_applicable_range['department_list']) : [];
           
            $user_list = !empty($applicable_range['user_list']) ? explode(",",$applicable_range['user_list']) : [];
            $department_list = explode(",",$applicable_range['department_list']);
           
            $wx_intercept = array(
                'rule_id' => $rule_info['rule_id'],
                'rule_name' => $update_info['rule_name'],
                'word_list' => explode(",",$update_info['word_list']),
                'extra_rule' => array(
                    'semantics_list' => $data['semantics_list'],
                ),
                'intercept_type' => $data['intercept_type'],
                'add_applicable_range' => array(
                    'user_list' =>  $user_list,
                    'department_list' => $department_list
                ),
                'remove_applicable_range' => array(
                    'user_list' => $old_user_list,
                    'department_list' => $old_department_list
                )
            );
            
            $wxinterceptApi = new WechatInterceptApi();
            $res = $wxinterceptApi->updateInterceptRule($wx_intercept);
           
            if ($res['errcode'] != 0) {
                $this->error($res['errmsg'], url("Intercept/index"));
            }

            if (!empty($update_info['semantics_list'])) {
                $update_info['semantics_list'] = implode(",",$update_info['semantics_list']);
            }

            $result = $interceptModel->where("id",$id)->update($update_info);

            if ($result) {
                $this->success('编辑成功!', url("Intercept/index"));
            } else {
                $this->error('编辑失败!', url("Intercept/index"));
            }
        }
        $id = $this->request->param('id', 0, 'intval');
        if (empty($id)) {
            $this->error('请求参数有误!');
        }
        // 查询敏感词信息
        $interceptService = new InterceptService();
        $info = $interceptService->getInfo($id);
        // 接口请求敏感词详情
        // $wxinterceptApi = new WechatInterceptApi();
        // $list = $wxinterceptApi->getInterceptRuleInfo(['rule_id'=>$info['rule_id']]);
        // echo "<pre>";
        // print_r($list);
        // exit;
        $this->assign('info',$info);
        return $this->fetch();
    }

    // 删除敏感词
    public function delete()
    {
        $param = $this->request->param();
        $interceptModel = new InterceptModel();
        if (isset($param['id'])) {
            $id = $this->request->param('id', 0, 'intval');
            $rule_info = $interceptModel->field("rule_id")->where("id",$id)->find();
            $wxinterceptApi = new WechatInterceptApi();
            $wx_res = $wxinterceptApi->deleteInterceptRule(['rule_id'=>$rule_info['rule_id']]);
            if ($wx_res['errcode'] == 0) {
                $result = $interceptModel->where('id', $id)->delete();
                $this->success("删除成功!");
            } else {
                $this->error("删除失败!");
            }
        }
    }

    public function checkWorker()
    {
        $param = $this->request->param();
        $applicable_type = $param['type'] ?? 1;
        $applicable_range = $param['value'] ?? "";
        $interceptService = new InterceptService();
        $result = $interceptService->getWorkerList($param);
        $this->assign('menus', $result);
        $this->assign('applicable_range', explode(",",$applicable_range));
        $this->assign('applicable_type',$applicable_type);
        return $this->fetch();
    }

}

 InterceptService.php

<?php
// +----------------------------------------------------------------------
// xiaozhe
// +----------------------------------------------------------------------
namespace app\wework\service;

use app\wework\model\InterceptModel;
use app\wework\model\DepartModel;
use app\wework\model\WeUserModel;
use think\db\Query;

class InterceptService
{
    public function getList($filter)
    {
        $field = 'a.id,a.rule_name,a.word_list,a.intercept_type,a.applicable_type,a.user_id,a.create_time,a.update_time,u.user_nickname';
        $interceptModel = new InterceptModel();
        $result = $interceptModel
            ->alias("a")
            ->leftJoin("user u","a.user_id = u.id")
            ->field($field)
            ->where(function (Query $query) use ($filter) {
                $keyword = empty($filter['keyword']) ? '' : $filter['keyword'];
                if (!empty($keyword)) {
                    $query->where('a.title', 'like', "%$keyword%");
                }
            })
            ->paginate(15);
        return $result;
    }

    public function getInfo($id)
    {
        $interceptModel = new InterceptModel();
        $info = $interceptModel->where("id",$id)->find();
        if (!empty($info['semantics_list'])) {
            $info['semantics_list'] = explode(",",$info['semantics_list']);
        }
        if (!empty($info['applicable_range'])) {
            $info['applicable_range'] = json_decode($info['applicable_range'],true);
            $info['user_count'] = count(explode(",",$info['applicable_range']['user_list']));
            $info['depart_count'] = count(explode(",",$info['applicable_range']['department_list']));
            if ($info['applicable_type'] == 1) {
                // 部门
                $info['applicable_range_value'] = $info['applicable_range']['department_list'];
            } else {
                // 员工
                $userModel = new WeUserModel();
                $userIds = $userModel->whereIn("userid",$info['applicable_range']['user_list'])->whereIn("department_id",$info['applicable_range']['department_list'])->column("userid");
                $info['applicable_range_value'] = implode(",",$userIds);
            }
        }
        return $info;
    }

    public function getWorkerList($filter)
    {
        $type = $filter['type'];
        switch ($type) {
            case 1:
                // 部门
                $departmentModel = new DepartModel();
                $newList = $departmentModel->field("department_id as id,name,parentid as parent_id")->select()->toArray();
                break;
            case 2:
                // 员工
                $userModel = new WeUserModel();
                $newList = $userModel->field("userid as id,name")->select()->toArray();
                break;
            default:
                // code...
                break;
        }
        return $newList;
    }
    

}

WechatInterceptApi.php 

<?php 
// +----------------------------------------------------------------------
// | xiaozhe
// +----------------------------------------------------------------------
namespace app\wework\service;
use app\wework\model\ConfigModel;
use think\Db;
/**
* 企业微信接口
**/
class WechatInterceptApi 
{
    /**
    * 获取通讯录access_token
    **/
    public  function getStaffAccessToken(){
            $cache_key = 'staff_access_token';
            $res = cache($cache_key);
            if(empty($res)){
                // 读取配置
                $WeworkConfigModel = new ConfigModel();
                $info = $WeworkConfigModel->where("id",1)->find();
                $response = cmf_curl_get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$info['corpid']}&corpsecret={$info['user_secret']}");
                $arr = json_decode($response, true); 

                if($arr['errcode'] !== 0){
                    return '';
                }
                cache($cache_key, $arr['access_token'], 6900);
            }
            return $res;
    }
    /**
    * 获取客户联系人access_token
    **/
    static  public  function getCustomerAccessToken(){
            $cache_key = 'customer_access_token';
            $res = cache($cache_key);
            if(empty($res)){
                $WeworkConfigModel = new ConfigModel();
                $info = $WeworkConfigModel->where("id",1)->find();
                $response = cmf_curl_get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$info['corpid']}&corpsecret={$info['customer_secret']}");
                $arr = json_decode($response, true); 

                if($arr['errcode'] !== 0){
                    return '';
                }
                cache($cache_key, $arr['access_token'], 6900);
            }
            return $res;
    }
    /**
    * 获取自建应用 access_token
    **/
    public  function getSelfappAccessToken(){
                $cache_key = 'selfapp_access_token';
                $res = cache($cache_key);
                if(empty($res)){
                    $WeworkConfigModel = new ConfigModel();
                    $info = $WeworkConfigModel->where("id",1)->find();
                    
                    $response = cmf_curl_get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$info['corpid']}&corpsecret={$info['corpsecret']}");
                    $arr = json_decode($response, true); 
                   
                    if($arr['errcode'] !== 0){
                        return '';
                    }
                    cache($cache_key, $arr['access_token'], 6900);
                }
        return $res;
    }

    // 获取敏感词列表
    public function getInterceptRuleList()
    {
        $token = self::getSelfappAccessToken();
        $res = cmf_curl_get("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_intercept_rule_list?access_token=".$token,array());
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

    // 新增敏感词
    public function addInterceptRule($filter)
    {
        $token = self::getSelfappAccessToken();
        $res = self::curl_post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_intercept_rule?access_token=".$token,
            json_encode($filter)
        );
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

    // 获取敏感词详情
    public function getInterceptRuleInfo($filter)
    {
        $token = self::getSelfappAccessToken();
        $res = self::curl_post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_intercept_rule?access_token=".$token,
            json_encode($filter)
        );
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

    // 修改敏感词规则
    public function updateInterceptRule($filter)
    {
        $token = self::getSelfappAccessToken();
        $res = self::curl_post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/update_intercept_rule?access_token=".$token,
            json_encode($filter)
        );
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

    // 删除敏感词
    public function deleteInterceptRule($filter)
    {
        $token = self::getSelfappAccessToken();
        $res = self::curl_post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/del_intercept_rule?access_token=".$token,
            json_encode($filter)
        );
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

   public function curl_post($url,$data){
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS,$data); // Post提交的数据包
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
        $result = curl_exec($curl); // 执行操作
        return $result;
    }
}

(前端代码我就不放了哈,自行写一哈) 

实现效果

敏感词列表

新增敏感词

 编辑敏感词

 

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

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

相关文章

MacBook 逆水寒下载安装使用教程,支持最新版本 MacOS 流畅不闪退

最近 MacBook 系统更新到了 MacOS 14.1 很多朋友的逆水寒玩不了了&#xff0c;我尝试了一番可以正常玩了&#xff0c;看图&#xff1a; 其实操作也很简单&#xff0c;我们从头开始&#xff0c;因为 MacOS 系统的更新所以我们也需要更新新版本的 playCover 来适配新的系统&#…

【Vue第3章】使用Vue脚手架_Vue2_笔记

笔记 脚手架文件结构 ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ├── src │ ├── assets: 存放静态资源 │ │ └── logo.png │ │── component: 存放组件 │ │ └── HelloWorld.vue …

配置禁止BT下载的示例

如图1所示,企业内用户通过交换机连接到RouterA的Eth2/0/0,并通过RouterA的GE0/0/1接口连接到WAN侧网络。 现在要求在RouterA上通过配置基于智能应用控制SAC(Smart Application Control)的流分类,禁止企业用户进行BT下载。 图1 配置禁止BT下载的组网图: 操作步骤 1.Rout…

[原创][6]探究C#多线程开发细节-“ConcurrentDictionary<T,T>解决多线程的无顺序性的问题“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

电商系统架构演进

聊聊电商系统架构演进 具体以电子商务网站为例&#xff0c; 展示web应用的架构演变过程。 1.0时代 这个时候是一个web项目里包含了所有的模块&#xff0c;一个数据库里包含了所需要的所有表&#xff0c;这时候网站访问量增加时&#xff0c;首先遇到瓶颈的是应用服务器连接数&a…

【动态规划】03使用最小花费爬楼梯(easy1)

题目链接&#xff1a;leetcode使用最小花费爬楼梯 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求达到楼梯顶部的最低花费. 由题可得&#xff1a; cost[i] 是从楼梯第 i 个…

AI并行计算:CUDA和ROCm

1 介绍 1.1 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是Nvidia于2006年推出的一套通用并行计算架构&#xff0c;旨在解决在GPU上的并行计算问题。其易用性和便捷性能够方便开发者方便的进行GPU编程&#xff0c;充分利用GPU的并行能力&#xff0…

利用管道、信号量、信号、共享内存和消息队列进行多进程通信

一.管道&#xff08;分为命名管道和匿名管道&#xff09; 管道的特点&#xff1a; ①无论是命名管道还是匿名管道&#xff0c;写入管道的数据都存放在内存之中。 ②管道是一种半双工的通信方式&#xff08;半双工是指终端A能发信号给终端B&#xff0c;终端B也能发信号给终端…

ISIS默认路由下发的各种机制

作者简介&#xff1a;大家好&#xff0c;我是Asshebaby&#xff0c;热爱网工&#xff0c;有网络方面不懂的可以加我一起探讨 :1125069544 个人主页&#xff1a;Asshebaby博客 当前专栏&#xff1a; 网络HCIP内容 特色专栏&#xff1a; 常见的项目配置 本文内容&am…

VC++使用GetProcessTimes获取进程创建时间、销毁时间、用户态时间、内核态时间

一、GetProcessTimes函数简介&#xff08;微软MSDN&#xff09; 微软提供了一个非常有用的API函数GetProcessTimes用来获取进程创建时间、销毁时间、用户态时间、内核态时间&#xff0c;msdn连接为&#xff1a;GetProcessTimes 函数 (processthreadsapi.h) 其函数原型为&#…

网络管理相关

管理功能分为管理站manager和代理agent两部分。 网络管理&#xff1a; 网络管理系统中&#xff0c;每一个网络节点都包含有一组与管理有关的软件&#xff0c;叫做网络管理实体NME。 管理站的另外一组软件叫做网络管理应用NMA&#xff0c;提供用户接口&#xff0c;根据用户命令显…

渗透测试(Lab1.0)

1、用搜索引擎Google或百度搜索麻省理工学院网站中文件名包含“network security”的pdf文档&#xff0c;截图搜索得到的页面。 2、照片中的女生在哪里旅行&#xff1f; 截图搜索到的地址信息。 搜索餐厅的名字&#xff0c;找一下关键词 3、手机位置定位 通过LAC&#xff0…

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

Javascript 函数介绍

Javascript 函数介绍 很多教程书一上来就讲解一堆语法&#xff0c;例如函数定义、函数调用什么。等读者看完了函数这一章都没搞懂什么是函数。 在讲解什么叫函数之前&#xff0c;我们先看下面一段代码&#xff1a; <!DOCTYPE html> <html xmlns"http://www.w3.…

介绍java spring 提供的默认数据库持久化技术 JdbcTemplate基本演示

之前 我们说过spring贴心的内嵌了三种数据源形式 其中默认为HikariCP 其实 spring 也提供了持久化数据库连接技术 这个技术其实大部分都接触过 那就是 JDBC 随着时代的发展 用他的人也越来越少了 那么 我们要演示 JdbcTemplate 导入 mybatis 或 mybatis-plus 的片段 就要注掉了…

nacos服务的分级存储

举例说明 一个服务可以有多个实例&#xff0c;比如我们当前有4个实例&#xff0c;都叫做nacos-user-service服务 ip地址端口服务器所属地区集群192.168.xxx.xxx18080广东GD192.168.xxx.xxx18081广东GD192.168.xxx.xxx18082广西GX192.168.xxx.xxx18083广西GX所以我们可以将nacos…

跨境电商独立站怎么获取流量 跨境电商引流的两个方法

独立站有着比SaaS和中心化站点不一样的特点&#xff0c;今天介绍两种引流的主要玩法&#xff1a; 独立站的第一种玩法是通过数据&#xff0c;找到爆款&#xff0c;搭建独立站&#xff0c;企业站加电商功能、交易、订单配送功能&#xff0c;搜索引擎seo引流法&#xff0c;外联渠…

服务器RAID系统的常见故障,结合应用场景谈谈常规的维修处理流程

常见的服务器RAID系统故障包括硬盘故障、控制器故障、电源故障、写入错误和热插拔错误。下面结合这些故障的应用场景和常规维修处理流程来详细讨论&#xff1a; 硬盘故障&#xff1a; 应用场景&#xff1a;在服务器RAID系统中&#xff0c;硬盘故障是最常见的问题之一。硬盘可能…

[MySQL--基础]事务的基础知识

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录&#xff1a;生活中最重要的决定就是要做出决定。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法 MySQL数据库 事务的目录&#x1f4d5; 前言事务简介&#x1f680;事务操作&#x1f680;准…

【头歌系统Python实验】顺序与选择结构

目录 第1关&#xff1a;顺序结构 第2关&#xff1a;选择结构&#xff1a;if-else 第3关&#xff1a;选择结构 &#xff1a; 三元操作符 如果对你有帮助的话&#xff0c;不妨点赞收藏评论一下吧&#xff0c;爱你么么哒&#x1f618;❤️❤️❤️ 第1关&#xff1a;顺序结构 …