【MySQL 15】使用 C/C++ 连接数据库

news2024/11/17 0:55:20

文章目录

  • 🌈 一、引入 MySQL 库
    • ⭐ 1. 下载库文件
    • ⭐ 2. 上传库文件
    • ⭐ 3. 引用库文件
    • ⭐ 4. 验证是否引入成功
  • 🌈二、MySQL 接口介绍
    • ⭐ 1. 初始化
    • ⭐2. 连接数据库
    • ⭐ 3. 关闭数据库连接
    • ⭐ 4. 设置编码格式
    • ⭐ 5. 发送 sql 指令
      • 🌙 5.1 向数据库表中插入数据
      • 🌙 5.2 修改数据库表中的数据
      • 🌙 5.3 删除数据库表中的数据
    • ⭐ 6. 获取查询结果
      • 🌙 6.1 获取查询结果的行数
      • 🌙 6.2 获取查询结果的列数
      • 🌙 6.3 获取查询结果的列属性
      • 🌙 6.4 获取查询结果的内容
      • 🌙 6.5 获取查询结果示例

🌈 一、引入 MySQL 库

⭐ 1. 下载库文件

  • 进入下载界面:[MySQL 官网]:MySQL :: MySQL Community Downloads,然后选择 CAPI 这一个选项。

image-20240827100749525

  • 再选择人家推荐得那个版本即可。

image-20240827100720929

  • 选择适合自己平台的,然后下载即可。

image-20240827101204876

⭐ 2. 上传库文件

  • 将刚刚下下来的解压包上传到 Linux 服务器上,可以专门建一个 third_part_lib 目录用于存储这些第三方库,

image-20240827101617217

  • 将下好的文件直接使用 rz -E 上传到云服务器上。

image-20240827101858495

  • 再将压缩包使用 tar -xzf 命令进行解压。

image-20240827102043405

  • 如果觉得解压之后的文件名太长了也可以换个名字,我这里是改成了 mysql-connector。

⭐ 3. 引用库文件

  • 在刚刚解压出来的 mysql-connector 目录中,有两个目录是最重要的。

image-20240827102448676

  • include 目录下存放着各种头文件。

image-20240827102534123

  • lib 目录下存放着所需的动静态库。

image-20240827102617417

  • 为了项目能够方便的使用这两个目录中的文件,可在项目目录下使用软链接的方式链接到 include 和 lib 这两个目录。

image-20240827103212115

⭐ 4. 验证是否引入成功

  • 通过调用 mysql_get_client_info 来判断库是否引入成功,该函数的作用就是获取客户端的版本信息。
// 文件名 test.cpp
#include <mysql.h>
#include <iostream>

using namespace std;

int main()
{
    cout << "mysql client version: " << mysql_get_client_info() << endl;

    return 0;
}
  • 对该文件进行编译,编译完成后再运行形成的 .exe 可执行程序,如果能成功显示客户端的版本信息则说明库引入成功。
g++ -o test.exe test.cpp -I./include -L./lib -lmysqlclient

image-20240827112313216

🌈二、MySQL 接口介绍

⭐ 1. 初始化

  • 要使用库,得先使用 mysql_init() 进行初始化构建一个 MySQL 对象。
MYSQL* 对象名 = mysql_init(MYSQL *mysql);
  • 该函数用来分配或初始化一个 MySQL 对象,用于连接 MySQL 服务器。
  • 如果传入得参数是个空指针,则 mysql_init 函数会自动分配一个 MySQL 对象并返回。
  • 如果传入得参数是一个地址,则 mysql_init 会在该地址处完成初始化。

⭐2. 连接数据库

MYSQL *mysql_real_connect(
    MYSQL *mysql,				// mysql_init 函数创建的 MySQL 对象
    const char *host,			// 需要连接的 MySQL 主机的 ip 地址,"127.0.0.1" 表示本机地址
    const char *user,			// 连接 MySQL 服务器时,所使用的用户的用户名
    const char *passwd,			// 连接 MySQL 服务器时,对应用户的用户密码
    const char *db,				// 连接 MySQL 服务器后,所要使用的数据库
    unsigned int port,			// 连接的 MySQL 服务器所对应的端口号
    const char *unix_socket,	// 连接时应该使用的套接字或命名管道,通常设置为 空指针
    unsigned long clientflag);	// 标志位组合,表示允许特定的功能,通常被置为 0
  • 如果数据库连接成功,则返回一个MySQL 对象,该对象与第一个参数的值相同。
  • 如果连接失败,则返回空指针 NULL / nullptr

举个栗子

  • 如果运行下面的代码之后能够成功显示 “数据库连接成功” 这几个字就说明连接成功了。
#include <mysql.h>
#include <iostream>

using std::cerr;
using std::cout;
using std::endl;
using std::string;

const string host = "127.0.0.1";  // 主机 ip
const string user = "connector";  // 用户名
const string passwd = "123456";   // 用户密码
const string db = "conn";         // 数据库
const int port = 3306;            // 端口号

int main()
{
    // 初始化一个 MYSQL 对象
    MYSQL *mfp = mysql_init(nullptr);
    if (nullptr == mfp)
    {
        cerr << "init MySQL error" << endl;
        return 1;
    }

    // 连接数据库
    if (nullptr == mysql_real_connect(mfp, host.c_str(), user.c_str(),
                                      passwd.c_str(), db.c_str(), port, nullptr, 0))
    {
        cerr << "数据库连接失败" << endl;
        return 2;
    }

    cout << "数据库连接成功" << endl;

    // 断连数据库
    mysql_close(mfp);

    return 0;
}

image-20240827165152070

⭐ 3. 关闭数据库连接

void mysql_close(MYSQL *sock);
  • 与数据库交互完毕后,需要关闭数据库连接。
  • sock 是使用 mysql_init 创建得 MYSQL 对象,如果传入得 MYSQL 对象是 由mysql_init 创建的,那么调用 mysql_close 就会释放该对象。

⭐ 4. 设置编码格式

  • 连接完数据库后,还要统一客户端和服务器的编码格式,避免在数据交互过程中出现乱码的情况。
int mysql_set_character_set(MYSQL *mysql, const char *csname);
  • mysql:该参数表示 MYSQL 对象
  • csname:该参数表示要设置的编码格式 (如 utf8 这种)。
  • 返回值为 0 则表示设置成功,其他则为设置失败。

⭐ 5. 发送 sql 指令

  • 在与数据库建立了连接之后,可以使用下面的指令向数据库对象发送 sql 指令。
int mysql_query(MYSQL *mysql, const char *q);
  • mysql:该参数表示 MYSQL 对象
  • q:该参数表示要执行的 sql 语句 (这里的 sql 可不带分号)。
  • 返回值为 0 则表示 sql 执行成功,反之则表示执行失败。

准备测试表

  • 在 conn 数据库中创建一张名为 user 的表,表中包含用户 id、姓名 name、年龄 age、电话 telphone 这四个字段。
    • 之后的操作都是基于这张表进行的。

image-20240827173542391

🌙 5.1 向数据库表中插入数据

  • 在调用 mysql_query 函数时,向 MySQL 服务器发送一条 insert 语句。
#include <mysql.h>
#include <iostream>

using std::cerr;
using std::cout;
using std::endl;
using std::string;

const string host = "127.0.0.1";  // 主机 ip
const string user = "connector";  // 用户名
const string passwd = "123456";   // 用户密码
const string db = "conn";         // 数据库
const int port = 3306;            // 端口号

int main()
{
    // 初始化一个 MYSQL 对象
    MYSQL *mfp = mysql_init(nullptr);
    if (nullptr == mfp)
    {
        cerr << "init MySQL error" << endl;
        return 1;
    }

    // 连接数据库
    if (nullptr == mysql_real_connect(mfp, host.c_str(), user.c_str(),
                                      passwd.c_str(), db.c_str(), port, nullptr, 0))
    {
        cerr << "数据库连接失败" << endl;
        return 2;
    }

    cout << "数据库连接成功" << endl;

    // 设置编码集
    if (0 != mysql_set_character_set(mfp, "utf8"))
    {
        cerr << "编码集设置失败" << endl;
        return 3;
    }

    /* ---------- 看这里 ---------- */
    // 发送 sql 请求
    const string sql = "insert into user values (1, '张三', 18, '12355667788')";
    if (0 != mysql_query(mfp, sql.c_str()))
    {
        cerr << "插入数据失败" << endl;
        return 4;
    }

    cout << "插入数据成功" << endl;

    // 断连数据库
    mysql_close(mfp);

    return 0;
}
  • 运行这段代码之后,能看到 MySQL 中的 user 表确实多出了这么一行数据。

image-20240827174955344

🌙 5.2 修改数据库表中的数据

  • 在调用 mysql_query 函数时,向 MySQL 服务器发送一条 update 语句。
    • 例:将张三的名字改成李四
#include <mysql.h>
#include <iostream>

using std::cerr;
using std::cout;
using std::endl;
using std::string;

const string host = "127.0.0.1";  // 主机 ip
const string user = "connector";  // 用户名
const string passwd = "123456";   // 用户密码
const string db = "conn";         // 数据库
const int port = 3306;            // 端口号

int main()
{
    // 初始化一个 MYSQL 对象
    MYSQL *mfp = mysql_init(nullptr);
    if (nullptr == mfp)
    {
        cerr << "init MySQL error" << endl;
        return 1;
    }

    // 连接数据库
    if (nullptr == mysql_real_connect(mfp, host.c_str(), user.c_str(),
                                      passwd.c_str(), db.c_str(), port, nullptr, 0))
    {
        cerr << "数据库连接失败" << endl;
        return 2;
    }

    cout << "数据库连接成功" << endl;

    // 设置编码集
    if (0 != mysql_set_character_set(mfp, "utf8"))
    {
        cerr << "编码集设置失败" << endl;
        return 3;
    }
    
    /* ---------- 看这里 ---------- */
    // 发送 sql 请求
    const string sql = "update user set name = '李四' where id = 1";
    if (0 != mysql_query(mfp, sql.c_str()))
    {
        cerr << "修改数据失败" << endl;
        return 4;
    }

    cout << "修改数据成功" << endl;

    // 断连数据库
    mysql_close(mfp);

    return 0;
}
  • 运行这段代码之后,再查看 user 表,发现张三的名字确实变成李四了。

image-20240827175448844

🌙 5.3 删除数据库表中的数据

  • 在调用 mysql_query 函数时,向 MySQL 服务器发送一条 delete 语句。
#include <mysql.h>
#include <iostream>

using std::cerr;
using std::cout;
using std::endl;
using std::string;

const string host = "127.0.0.1";  // 主机 ip
const string user = "connector";  // 用户名
const string passwd = "123456";   // 用户密码
const string db = "conn";         // 数据库
const int port = 3306;            // 端口号

int main()
{
    // 初始化一个 MYSQL 对象
    MYSQL *mfp = mysql_init(nullptr);
    if (nullptr == mfp)
    {
        cerr << "init MySQL error" << endl;
        return 1;
    }

    // 连接数据库
    if (nullptr == mysql_real_connect(mfp, host.c_str(), user.c_str(),
                                      passwd.c_str(), db.c_str(), port, nullptr, 0))
    {
        cerr << "数据库连接失败" << endl;
        return 2;
    }

    cout << "数据库连接成功" << endl;

    // 设置编码集
    if (0 != mysql_set_character_set(mfp, "utf8"))
    {
        cerr << "编码集设置失败" << endl;
        return 3;
    }

    /* ---------- 看这里 ---------- */
    // 发送 sql 请求
    const string sql = "delete from user where id = 1";
    if (0 != mysql_query(mfp, sql.c_str()))
    {
        cerr << "删除数据失败" << endl;
        return 4;
    }

    cout << "删除数据成功" << endl;

    // 断连数据库
    mysql_close(mfp);

    return 0;
}

image-20240827175712668

⭐ 6. 获取查询结果

  • 对数据库中的数据进行 增删改 操作时,只要调用 mysql_query 成功即可。
  • 而对数据库中的数据进行 查询 操作时,除了调用 mysql_query 函数,还需要能够获取 MySQL 返回的这些数据。
  • 当 mysql_query 函数成功执行 select 语句时,可以使用下面的函数获取查询结果。
    • 之后的四种查询结果都是根据该函数的返回值确定的。
MYSQL_RES* mysql_store_result(MYSQL *mysql);
  • 该函数会调用指定 MYSQL 对象中对应的函数指针来获取查询结果,并将获取到的查询结果保存到 MYSQL_RES 变量中进行返回。

MYSQL_RES 的内容

  • 该结构体会以行里的形式将查询的数据保存起来。
typedef struct st_mysql_res
{
    my_ulonglong row_count;
    MYSQL_FIELD *fields;
    MYSQL_DATA *data;
    MYSQL_ROWS *data_cursor;
    unsigned long *lengths; /* column lengths of current row */
    MYSQL *handle;          /* for unbuffered reads */
    const struct st_mysql_methods *methods;
    MYSQL_ROW row;        	/* If unbuffered read */
    MYSQL_ROW current_row; 	/* buffer to current row */
    MEM_ROOT field_alloc;
    unsigned int field_count, current_field;
    my_bool eof; 			/* Used by mysql_fetch_row */
    /* mysql_stmt_close() had to cancel this result */
    my_bool unbuffered_fetch_cancelled;
    void *extension;
} MYSQL_RES;

🌙 6.1 获取查询结果的行数

my_ulonglong mysql_num_rows(MYSQL_RES *res);
  • 该函数会从指定的 MYSQL_RES 对象中,获取查询结果的行数。

🌙 6.2 获取查询结果的列数

unsigned int mysql_num_fields(MYSQL_RES *res);
  • 该函数会从指定的 MYSQL_RES 对象中,获取查询结果的列数

🌙 6.3 获取查询结果的列属性

MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);
  • 该函数会从指定 MYSQL_RES 对象中,获取查询结果的列名。

MYSQL_FIELD 的内容

typedef struct st_mysql_field
{
    char *name;               /* Name of column */
    char *org_name;           /* Original column name, if an alias */
    char *table;              /* Table of column if column was a field */
    char *org_table;          /* Org table name, if table was an alias */
    char *db;                 /* Database for table */
    char *catalog;            /* Catalog for table */
    char *def;                /* Default value (set by mysql_list_fields) */
    unsigned long length;     /* Width of column (create length) */
    unsigned long max_length; /* Max width for selected set */
    unsigned int name_length;
    unsigned int org_name_length;
    unsigned int table_length;
    unsigned int org_table_length;
    unsigned int db_length;
    unsigned int catalog_length;
    unsigned int def_length;
    unsigned int flags;         /* Div flags */
    unsigned int decimals;      /* Number of decimals in field */
    unsigned int charsetnr;     /* Character set */
    enum enum_field_types type; /* Type of field. See mysql_com.h for types */
    void *extension;
} MYSQL_FIELD;

🌙 6.4 获取查询结果的内容

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
  • 该函数会从指定的 MYSQL_RES 对象中,获取查询结果中的单行数据。
  • 该函数的返回值实际上就是个二维数组,数组中保存着这一行中每一列的数据。

🌙 6.5 获取查询结果示例

  • 先往表中插入三条记录,方便之后的查询。

image-20240827191207966

#include <mysql.h>
#include <iostream>

using std::cerr;
using std::cout;
using std::endl;
using std::string;

const string host = "127.0.0.1"; // 主机 ip
const string user = "connector"; // 用户名
const string passwd = "123456";  // 用户密码
const string db = "conn";        // 数据库
const int port = 3306;           // 端口号

int main()
{
    // 初始化一个 MYSQL 对象
    MYSQL *mfp = mysql_init(nullptr);
    if (nullptr == mfp)
    {
        cerr << "init MySQL error" << endl;
        return 1;
    }

    // 连接数据库
    if (nullptr == mysql_real_connect(mfp, host.c_str(), user.c_str(),
                                      passwd.c_str(), db.c_str(), port, nullptr, 0))
    {
        cerr << "数据库连接失败" << endl;
        return 2;
    }

    cout << "数据库连接成功" << endl;

    // 设置编码集
    if (0 != mysql_set_character_set(mfp, "utf8"))
    {
        cerr << "编码集设置失败" << endl;
        return 3;
    }

    // 发送 sql 请求
    const string sql = "select * from user";
    if (0 != mysql_query(mfp, sql.c_str()))
    {
        cerr << "查询数据失败" << endl;
        return 4;
    }
    cout << "查询数据成功" << endl;

    // 获取查询结果
    MYSQL_RES *res = mysql_store_result(mfp);
    if (nullptr == res)
    {
        cerr << "调用 mysql_store_result 函数失败" << endl;
        return 5;
    }

    my_ulonglong rows = mysql_num_rows(res);      // 获取查询结果的行数
    my_ulonglong cols = mysql_num_fields(res);    // 获取查询结果的列数
    
    MYSQL_FIELD *fields = mysql_fetch_field(res); // 获取每一列的列明
    for (size_t i = 0; i < cols; i++)             // 打印所有的列名
        cout << fields[i].name << "\t";
    cout << endl;

    for (size_t i = 0; i < rows; i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);     // 获取第 i 行的数据

        for (size_t j = 0; j < cols; j++)         // 打印获取到的这行的第 j 列的数据
            cout << row[j] << "\t";
        cout << endl;
    }

    free(res);                                    //释放内存空间

    // 断连数据库
    mysql_close(mfp);

    return 0;
}
  • 运行上述代码之后的结果如下:

image-20240827193503423

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

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

相关文章

Ant Design vue 多层for循环form表单自定义校验

数据结构如下&#xff1a;三维数组。 注意&#xff1a;<a-form-model>一定得写在for外面&#xff01;&#xff01;&#xff01;&#xff01; <!-- 弹出框 --> <a-modal:title"title":dialog-style"{ top: 20px }":visible"visible&quo…

日历显示项目

日历显示&#xff1a; //头文件#ifndef __HEAD_DALY_H__ #define __HEAD_DALY_H__#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <stdint.h>uint32_t months[12]; extern bool is_leap(uint32_t …

02.标准化编程规范

1. 前言 在日常开发中&#xff0c;随着团队人员的变更&#xff0c;功能迭代&#xff0c;如果没有一套规范约束大家&#xff0c;就会导致项目中的代码充斥着各种代码风格&#xff0c;会导致后期维护起来十分困难&#xff0c;所以有必要去制定一套规范。互联网发展到今天&#x…

九月更新|用这个方法,小白在国内也能轻松使用ChatGPT,GPT新手使用手册(编程代码)

一、 ChatGPT可以做什么&#xff1f; ChatGPT能做的事情非常多&#xff01;它不仅仅是一个对话AI。以下是一些主要功能&#xff1a; 1. 回答问题&#xff1a;无论是学术问题、技术问题&#xff0c;还是生活琐事&#xff0c;ChatGPT都能提供帮助。 2. 写作助手&#xff1a;可以…

html+css 实现 带射灯的浮雕按钮

前言:哈喽,大家好,今天给大家分享html+css 实现 带射灯的浮雕按钮!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎点赞、收藏+关注哦 💕 文章目录 效果原理解析1.此按钮效果主要是运用了==css3属性的box-shadow和…

用实时计算释放当下企业大数据潜能

摘要&#xff1a;本文整理自阿里云高级产品解决方案架构师王启华&#xff08;敖北&#xff09;老师在 Flink Forward Asia 2023 中闭门会的分享。内容分为以下五个部分&#xff1a; 1. 实时计算在大数据计算发展中的趋势 2. 实时计算对于企业生产的意义 3. 阿里云飞天大数据产品…

Nginx实验-2

Nginx中的变量 变量可以分为内置变量和自定义变量 内置变量是由nginx模块自带&#xff0c;通过变量可以获取到众多的与客户端访问相关的值 [rootnginx ~]# cd /usr/local/nginx/ [rootnginx nginx]# cd conf.d/ [rootnginx conf.d]# ls status.conf vhost.conf [rootngin…

五种多目标优化算法(NSGA3、MOPSO、MOGWO、NGSA2、SPEA2)性能对比,包含47个多目标测试函数,6种评价指标,MATLAB代码

一、五种多目标算法及六种评价指标简介 多目标灰狼优化算法&#xff08;MOGWO&#xff09;&#xff1a; MOGWO是由Mirjalili等人在2016年提出的&#xff0c;基于灰狼优化算法&#xff08;GWO&#xff09;的多目标版本。它引入了存档机制和改进的头狼选择方式&#xff0c;以处理…

【Python报错已解决】`TypeError: an integer is required (got type bytes)`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法&#xff1a;2.1 方法一2.2 步骤二 三、其他解决…

39次8.29(了解docker-compose,docker-compose编排容器,配置harbor服务)

1.使用使用docker-compose编排容器 1.YAML ⽂件的格式和语法 1&#xff09;YAML ⽂件格式 yaml 是⼀种标记语⾔很直观的数据序列化格式&#xff0c;可读性很⾼。 类似于 xml 描述性语⾔&#xff0c;语法⽐xml简单的很多。 yaml 数据结构通过缩进进⾏表示&#xff0c;连续的…

AI绘画与《黑神话:悟空》的碰撞,擦出不一样的火花!

在当今数字时代&#xff0c;利用人工智能技术创造艺术作品已成为一种引人注目的趋势。 特别是在社交媒体平台上&#xff0c;如小红书&#xff0c;通过展示AI绘画作品可以吸引大量关注&#xff0c;增加曝光率&#xff0c;并且为自己带来潜在的商业机会。 如果你是《黑神话&…

sql-labs31-35关通关攻略

第三十一关 一.判断闭合 1“” 二.查询数据库 http://127.0.0.1/Less-31/?id-1%22)%20union%20select%201,2,database()--http://127.0.0.1/Less-31/?id-1%22)%20union%20select%201,2,database()-- 三.查表 http://127.0.0.1/Less-31/?id-1%22)%20union%20select%201,…

java实现ocr功能(Tesseract OCR)

1、pom文件中引入依赖 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.4</version> </dependency> 2、下载语言库文件&#xff08;不要放到resources下&#xff0c;可…

Python TensorFlow 实战指南

引言 TensorFlow 是一个功能强大的开源库&#xff0c;被广泛应用于数值计算和机器学习任务。本指南旨在帮助读者理解如何使用 Python 和 TensorFlow 构建机器学习模型。我们将从基础开始&#xff0c;逐步深入到更复杂的主题。 第一部分&#xff1a;入门 第1章&#xff1a;T…

基于vue框架的仓库物流信息管理系统设计和实现0a6d7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;供应商,商品分类,商品信息,商品入库,车辆信息,订单出库,订单发货,订单抵达,用户 开题报告内容 基于Vue框架的仓库物流信息管理系统设计和实现 开题报告 一、研究背景与意义 随着全球电子商务的蓬勃发展和物流行业的迅速崛起&#xff…

电子设备网络新航向:SEO携手新媒体,打造强势品牌曝光

电子设备企业怎么有效地进行网络推广&#xff0c;把业务越做越好呢&#xff1f;根据湖南竑图网络13年从事互联网优化经验来看&#xff0c;可以给大家分享几点&#xff0c;希望对各位企业老板和高管有一定作用&#xff01; 一、关键词优化。搜索关键词依旧是传统企业获取精准流量…

Three.js Cesium.js 案例聚集地

对于大多数的开发者来言&#xff0c;看了很多文档可能遇见不到什么有用的&#xff0c;就算有用从文档上看&#xff0c;把代码复制到自己的本地大多数也是不能用的&#xff0c;非常浪费时间和学习成本&#xff0c; 尤其是three.js &#xff0c; cesium.js 这种难度较高&#xff…

kubesphere-devops环境-修改maven源到阿里云

文章目录 前言一、maven配置文件在kubesphere中的位置二、修改configmap&#xff0c;增加阿里源信息总结 前言 使用kubesphere搭建了devops环境&#xff0c;但是在构建maven的时候&#xff0c;发现使用的是官方的镜像&#xff0c;修改为阿里云的mirrors 一、maven配置文件在ku…

用Django框架+爬虫技术实现自动获取可画(Canva)团队会员资格的方法

可画(canva)是一个非常流行的在线平面设计平台,因为它无需专业训练和技能就可以利用其丰富的资源设计出美观、酷炫的作品,这些作品可以是视频、广告、演示文稿、网站页面、社交媒体界面、商业标识等等,因而它受到了极其广泛的设计专业和非专业人群的喜爱。在可画平台上,不…

PHP房产管理多终端系统灵活应对各种管理需求系统小程序源码

房产管理多终端系统&#xff0c;灵活应对万变管理需求&#x1f3e0;&#x1f4bc; &#x1f308; 开篇&#xff1a;房产管理的挑战与机遇 在房产行业日益繁荣的今天&#xff0c;管理需求也变得复杂多样。&#x1f914; 无论是大型房企还是小型中介&#xff0c;都面临着房源信息…