当前位置: 首页 > news >正文

青少年编程与数学 02-004 Go语言Web编程 14课题、数据操作

青少年编程与数学 02-004 Go语言Web编程 14课题、数据操作

  • 一、数据操作
  • 二、CRUD
      • 说明:
  • 三、数据验证
      • 为什么需要数据验证?
      • Go Web应用中的数据验证示例
        • 步骤 1: 定义订单结构体
        • 步骤 2: 实现验证逻辑
        • 步骤 3: 在HTTP处理函数中使用验证
  • 四、数据格式化
      • 什么是数据格式化?
      • 为什么需要数据格式化?
      • GoWeb应用如何将查询结果格式化为JSON数据格式?
        • 步骤 1: 执行数据库查询
        • 步骤 2: 编写HTTP处理函数
        • 步骤 3: 启动HTTP服务器
  • 五、数据聚合
      • 什么是数据聚合?
      • Go Web应用如何对数据进行聚合?
        • 步骤 1: 定义数据库查询
        • 步骤 2: 编写Go代码进行聚合
  • 六、数据分页
      • 什么是数据分页?
      • Go Web应用如何对数据进行分页?
        • 步骤 1: 编写分页查询函数
        • 步骤 2: 编写HTTP处理函数
        • 步骤 3: 启动HTTP服务器
  • 七、重要性

课题摘要:本文探讨了Go Web应用中的数据操作方法,包括CRUD操作、数据验证、格式化、聚合和分页等。CRUD涵盖了数据的创建、读取、更新和删除,是数据处理的基础。数据验证确保输入符合预期格式和业务规则,而数据格式化则涉及将数据转换为特定格式如JSON。数据聚合通过对数据集进行求和、平均等操作提取高层次信息,而分页技术则提高大数据集的可管理性和性能。文章还强调了数据操作在应用程序设计中的重要性,包括数据管理、业务逻辑实现、用户体验提升、数据一致性和安全性保障等方面。通过这些方法,Go Web应用能高效、安全地处理数据,满足业务需求。


一、数据操作

在Go Web应用中,数据操作是核心功能之一,涉及到从数据库的增删改查(CRUD)到数据的格式化、验证和传输。以下是一些常见的数据操作:

  1. CRUD操作

    • 创建(Create):向数据库中插入新数据。通常涉及到接收用户输入的数据,验证数据的有效性,然后执行数据库插入操作。

    • 读取(Read):从数据库中检索数据。可以是单个记录的查询(GET)或多个记录的查询(MULTIGET)。

    • 更新(Update):修改数据库中已存在的数据。通常需要先检索数据,然后根据用户输入进行更新。

    • 删除(Delete):从数据库中删除数据。通常需要根据特定的标识符(如ID)来定位并删除记录。

  2. 数据验证

    • 在处理用户输入之前,验证数据的有效性是非常重要的一步,以确保数据符合预期的格式和约束。
  3. 数据格式化

    • 将数据转换为适合传输的格式,如JSON或XML,以便在Web应用和客户端之间交换。
  4. 数据查询

    • 构建查询以从数据库检索信息,可能涉及到复杂的查询逻辑和优化。
  5. 数据聚合

    • 对数据库中的数据进行汇总和分析,以提供报告或仪表板数据。
  6. 数据分页

    • 在处理大量数据时,为了提高性能和用户体验,常常需要实现数据分页。
  7. 文件上传和下载

    • 处理文件的上传和下载,包括文件的存储、检索和传输。
  8. 数据缓存

    • 为了提高性能,可能会对频繁访问的数据进行缓存。
  9. 数据同步

    • 在多服务或多数据库的环境中,保持数据的一致性和同步。
  10. 错误处理

    • 在数据操作过程中,处理可能出现的各种错误和异常情况。

这些操作通常涉及到与数据库的交互,如MySQL、PostgreSQL、MongoDB等,以及使用Go语言提供的数据库驱动和ORM(对象关系映射)工具。通过这些工具和库,Go Web应用可以高效地处理数据,提供动态的Web服务。

二、CRUD

当然,下面是添加了详细注释的Go Web应用示例代码,实现了对订单数据的CRUD操作:

package mainimport ("database/sql""encoding/json""fmt""log""net/http""strconv"_ "github.com/go-sql-driver/mysql" // 导入MySQL驱动
)// 数据库配置常量
const (userName = "your_username" // 数据库用户名password = "your_password" // 数据库密码ip       = "localhost"     // 数据库地址port     = "3306"         // 数据库端口dbName   = "your_dbname"  // 数据库名
)// DB 是数据库连接的全局变量
var DB *sql.DB// Order 定义订单结构体,对应数据库中的表结构
type Order struct {OrderNum  int    `json:"order_num"`  // 订单编号OrderDate string `json:"order_date"` // 订单日期CustID    int    `json:"cust_id"`    // 客户ID
}// initDB 初始化数据库连接
func initDB() {var err error// 构建数据库连接字符串DB, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", userName, password, ip, port, dbName))if err != nil {log.Fatal(err) // 如果连接失败,记录错误并退出}if err = DB.Ping(); err != nil {log.Fatal(err) // 测试连接是否成功,失败则退出}
}// init 在程序启动时调用,用于初始化数据库连接
func init() {initDB()
}// handleGet 处理GET请求,用于查询单个订单
func handleGet(w http.ResponseWriter, r *http.Request) {idStr := r.URL.Path[len("/order/"):] // 从URL路径中获取订单IDid, err := strconv.Atoi(idStr)      // 将ID转换为整数if err != nil {http.Error(w, "Invalid ID", http.StatusBadRequest) // 如果ID无效,返回400错误return}order := Order{} // 创建订单结构体实例// 查询订单数据err = DB.QueryRow("SELECT order_num, order_date, cust_id FROM orders WHERE order_num = ?", id).Scan(&order.OrderNum, &order.OrderDate, &order.CustID)if err != nil {http.Error(w, "Order not found", http.StatusNotFound) // 如果订单不存在,返回404错误return}w.Header().Set("Content-Type", "application/json") // 设置响应头为JSONjson.NewEncoder(w).Encode(order)                   // 将订单数据编码为JSON并返回
}// handleInsert 处理POST请求,用于创建新订单
func handleInsert(w http.ResponseWriter, r *http.Request) {decoder := json.NewDecoder(r.Body) // 创建JSON解码器var order Order                   // 创建订单结构体实例err := decoder.Decode(&order)      // 解码请求体到订单结构体if err != nil {http.Error(w, "Invalid request payload", http.StatusBadRequest) // 如果请求体无效,返回400错误return}// 插入订单数据到数据库result, err := DB.Exec("INSERT INTO orders (order_date, cust_id) VALUES (?, ?)", order.OrderDate, order.CustID)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError) // 如果插入失败,返回500错误return}w.Header().Set("Content-Type", "application/json") // 设置响应头为JSONorder.OrderNum, _ = result.LastInsertId()        // 获取新插入订单的IDjson.NewEncoder(w).Encode(order)                  // 将订单数据编码为JSON并返回
}// handleDelete 处理DELETE请求,用于删除订单
func handleDelete(w http.ResponseWriter, r *http.Request) {idStr := r.URL.Path[len("/order/"):] // 从URL路径中获取订单IDid, err := strconv.Atoi(idStr)      // 将ID转换为整数if err != nil {http.Error(w, "Invalid ID", http.StatusBadRequest) // 如果ID无效,返回400错误return}// 从数据库中删除订单_, err = DB.Exec("DELETE FROM orders WHERE order_num = ?", id)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError) // 如果删除失败,返回500错误return}w.WriteHeader(http.StatusOK) // 设置响应状态码为200
}func main() {// 注册路由处理函数http.HandleFunc("/order/", handleGet)http.HandleFunc("/order/", handleInsert)http.HandleFunc("/order/", handleDelete)log.Println("Server starting on port 8080") // 打印启动日志err := http.ListenAndServe(":8080", nil)    // 启动HTTP服务器if err != nil {log.Fatal(err) // 如果启动失败,记录错误并退出}
}

说明:

  • initDB:这个函数负责建立数据库连接,并在连接失败时终止程序。
  • handleGet:这个函数处理GET请求,用于根据ID查询单个订单。它从URL中提取订单ID,查询数据库,并返回订单的JSON表示。
  • handleInsert:这个函数处理POST请求,用于创建新订单。它从请求体中读取订单数据,插入到数据库,并返回新创建的订单的JSON表示。
  • handleDelete:这个函数处理DELETE请求,用于根据ID删除订单。它从URL中提取订单ID,并从数据库中删除对应的订单。

要运行这个应用,请确保你的MySQL数据库已经设置好,并且替换代码中的数据库配置信息。然后,使用go run main.go命令启动服务器,并使用HTTP客户端测试API。

三、数据验证

数据验证是确保输入数据符合特定格式、标准或业务规则的过程。在Web应用中,数据验证是至关重要的,因为它有助于防止无效数据、错误数据或恶意数据进入系统,从而保护系统安全和数据完整性。

为什么需要数据验证?

  1. 防止错误:确保用户输入的数据是正确的,避免因数据错误导致的程序错误。
  2. 增强安全性:防止SQL注入、跨站脚本(XSS)等安全攻击。
  3. 提高数据质量:确保存储在数据库中的数据是准确和有用的。
  4. 用户体验:给用户提供即时反馈,提升用户体验。

Go Web应用中的数据验证示例

假设我们有一个Go Web应用,用户可以提交订单信息,包括订单日期和客户ID。我们需要验证订单日期是否是有效的日期格式,以及客户ID是否是一个正整数。

步骤 1: 定义订单结构体
package mainimport ("encoding/json""net/http""regexp""time"
)// Order 定义订单结构体
type Order struct {OrderDate string `json:"order_date"`CustID    int    `json:"cust_id"`
}
步骤 2: 实现验证逻辑
// ValidateOrder 验证订单信息
func ValidateOrder(order *Order) error {// 验证客户ID是否为正整数if order.CustID <= 0 {return errors.New("cust_id must be a positive integer")}// 验证订单日期是否符合YYYY-MM-DD格式// 正则表达式匹配日期格式datePattern := `^(?:19|20)\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$`if !regexp.MustCompile(datePattern).MatchString(order.OrderDate) {return errors.New("order_date must be in YYYY-MM-DD format")}// 尝试解析日期,确保它是有效的日期_, err := time.Parse("2006-01-02", order.OrderDate)if err != nil {return errors.New("order_date is not a valid date")}return nil
}
步骤 3: 在HTTP处理函数中使用验证
func submitOrderHandler(w http.ResponseWriter, r *http.Request) {// 只接受JSON格式的请求体r.Header.Set("Content-Type", "application/json")// 解析请求体中的JSON数据var order Orderif err := json.NewDecoder(r.Body).Decode(&order); err != nil {http.Error(w, "Invalid request body", http.StatusBadRequest)return}// 验证订单信息if err := ValidateOrder(&order); err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}// 如果验证通过,处理订单数据(例如,存储到数据库)// ...// 返回成功响应w.WriteHeader(http.StatusOK)w.Write([]byte("Order submitted successfully"))
}func main() {http.HandleFunc("/submit-order", submitOrderHandler)http.ListenAndServe(":8080", nil)
}

在这个示例中,我们定义了一个Order结构体来表示订单信息,并实现了一个ValidateOrder函数来验证订单日期和客户ID。在HTTP处理函数submitOrderHandler中,我们首先解析请求体中的JSON数据,然后调用ValidateOrder函数进行验证。如果验证失败,我们返回一个错误响应;如果验证成功,我们继续处理订单数据。

这个简单的示例展示了如何在Go Web应用中进行数据验证,以确保接收到的数据是有效和安全的。

四、数据格式化

什么是数据格式化?

数据格式化是指将数据转换成特定格式的过程。在编程和数据处理中,这通常涉及到将数据结构转换为可读性强、结构化的文本格式,比如JSON、XML或CSV。格式化的数据可以被人类阅读或由其他系统和应用程序处理。

为什么需要数据格式化?

  1. 可读性:格式化的数据更易于人类阅读和理解。
  2. 交换:格式化的数据可以在网络上传输,作为不同系统间的数据交换格式。
  3. 存储:格式化的数据可以被存储和检索,用于持久化存储。
  4. 标准化:使用标准化的格式(如JSON或XML)可以简化不同系统间的集成。

GoWeb应用如何将查询结果格式化为JSON数据格式?

在Go语言中,标准库encoding/json提供了将Go数据结构编码为JSON格式的工具。以下是一个简单的示例,展示了如何将从数据库查询得到的结果格式化为JSON数据格式。

步骤 1: 执行数据库查询

首先,我们需要从数据库中查询数据。这里假设我们已经有一个数据库连接DB和一个Order结构体。

package mainimport ("database/sql""encoding/json""log""net/http"_ "github.com/go-sql-driver/mysql"
)// Order 定义订单结构体
type Order struct {OrderNum  int    `json:"order_num"`OrderDate string `json:"order_date"`CustID    int    `json:"cust_id"`
}// QueryOrder 查询单个订单
func QueryOrder(db *sql.DB, orderNum int) (*Order, error) {var order Ordererr := db.QueryRow("SELECT order_num, order_date, cust_id FROM orders WHERE order_num = ?", orderNum).Scan(&order.OrderNum, &order.OrderDate, &order.CustID)if err != nil {return nil, err}return &order, nil
}
步骤 2: 编写HTTP处理函数

编写一个HTTP处理函数,用于处理请求并返回查询结果的JSON格式。

func getOrderHandler(w http.ResponseWriter, r *http.Request) {// 解析URL参数中的订单编号orderNumStr := r.URL.Query().Get("order_num")if orderNumStr == "" {http.Error(w, "Order number is required", http.StatusBadRequest)return}orderNum, err := strconv.Atoi(orderNumStr)if err != nil {http.Error(w, "Invalid order number", http.StatusBadRequest)return}// 从数据库查询订单db, err := sql.Open("mysql", "your_db_connection_string")if err != nil {http.Error(w, "Database connection failed", http.StatusInternalServerError)return}defer db.Close()order, err := QueryOrder(db, orderNum)if err != nil {http.Error(w, "Order not found", http.StatusNotFound)return}// 设置响应头为JSONw.Header().Set("Content-Type", "application/json")// 将订单数据编码为JSON格式encoder := json.NewEncoder(w)if err := encoder.Encode(order); err != nil {http.Error(w, "Failed to encode order data", http.StatusInternalServerError)return}
}
步骤 3: 启动HTTP服务器
func main() {http.HandleFunc("/get-order", getOrderHandler)log.Println("Server starting on port 8080")if err := http.ListenAndServe(":8080", nil); err != nil {log.Fatal("ListenAndServe: ", err)}
}

在这个示例中,我们定义了一个Order结构体来表示订单数据,并编写了一个QueryOrder函数来从数据库查询订单信息。在HTTP处理函数getOrderHandler中,我们首先解析请求参数中的订单编号,然后查询数据库,并将查询结果使用json.NewEncoder编码为JSON格式,最后将JSON数据写入HTTP响应中。

这个简单的示例展示了如何在Go Web应用中将数据库查询结果格式化为JSON数据格式,并返回给客户端。

五、数据聚合

什么是数据聚合?

数据聚合是指将多个数据源或多个数据点组合成一个有意义的整体的过程。在数据库和数据分析领域,聚合通常涉及到对数据集进行求和、平均、计数、最大值、最小值等操作,以提供更高层次的数据视图。聚合操作可以帮助我们从大量数据中提取有用的信息和洞察。

Go Web应用如何对数据进行聚合?

在Go Web应用中,数据聚合通常涉及到以下几个步骤:

  1. 查询数据:从数据库中查询所需的原始数据。
  2. 处理数据:在服务器端对查询结果进行处理,执行聚合操作。
  3. 返回结果:将聚合后的结果返回给客户端。

以下是一个简单的示例,展示了如何在Go Web应用中对数据进行聚合。

步骤 1: 定义数据库查询

假设我们有一个订单数据库表,我们想要聚合每个客户的总订单金额。

CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,customer_id INT NOT NULL,order_amount DECIMAL(10, 2) NOT NULL
);
步骤 2: 编写Go代码进行聚合
package mainimport ("database/sql""encoding/json""fmt""log""net/http"_ "github.com/go-sql-driver/mysql"
)// OrderAggregate 定义聚合结果的结构体
type OrderAggregate struct {CustomerID int     `json:"customer_id"`TotalAmount float64 `json:"total_amount"`
}// getAggregateData 聚合订单数据
func getAggregateData(db *sql.DB) ([]OrderAggregate, error) {var aggregates []OrderAggregaterows, err := db.Query("SELECT customer_id, SUM(order_amount) as total_amount FROM orders GROUP BY customer_id")if err != nil {return nil, err}defer rows.Close()for rows.Next() {var aggregate OrderAggregateif err := rows.Scan(&aggregate.CustomerID, &aggregate.TotalAmount); err != nil {return nil, err}aggregates = append(aggregates, aggregate)}return aggregates, nil
}// aggregateHandler 处理聚合数据的HTTP请求
func aggregateHandler(w http.ResponseWriter, r *http.Request) {db, err := sql.Open("mysql", "your_db_connection_string")if err != nil {http.Error(w, "Database connection failed", http.StatusInternalServerError)return}defer db.Close()aggregates, err := getAggregateData(db)if err != nil {http.Error(w, "Failed to aggregate data", http.StatusInternalServerError)return}w.Header().Set("Content-Type", "application/json")if err := json.NewEncoder(w).Encode(aggregates); err != nil {http.Error(w, "Failed to encode response", http.StatusInternalServerError)}
}func main() {http.HandleFunc("/aggregate", aggregateHandler)log.Println("Server starting on port 8080")if err := http.ListenAndServe(":8080", nil); err != nil {log.Fatal("ListenAndServe: ", err)}
}

在这个示例中,我们定义了一个OrderAggregate结构体来存储聚合结果。getAggregateData函数执行SQL查询,使用GROUP BY子句对每个客户的订单金额进行求和。然后,我们在aggregateHandler中调用这个函数,并将结果编码为JSON格式返回给客户端。

这个简单的示例展示了如何在Go Web应用中对数据库中的数据进行聚合,并返回聚合后的结果。在实际应用中,聚合操作可能会更复杂,涉及到多个表的连接、多个字段的聚合等。

六、数据分页

什么是数据分页?

数据分页是一种将大量数据分割成多个页面的技术,每个页面包含固定数量的数据项。这样做的目的是为了提高用户体验,避免一次性加载过多数据导致的性能问题,同时也使得数据的浏览和导航更加方便。

Go Web应用如何对数据进行分页?

在Go Web应用中,数据分页通常涉及到以下几个步骤:

  1. 确定每页数据量:设定每个页面显示的数据条目数量。
  2. 接收分页参数:通常通过查询参数接收页码(page)和每页数据量(limit)。
  3. 计算偏移量:根据页码和每页数据量计算SQL查询的偏移量(offset)。
  4. 执行分页查询:使用计算出的偏移量执行数据库查询,获取当前页的数据。
  5. 返回分页结果:将当前页的数据和分页信息(如总页数、当前页码等)返回给客户端。

以下是一个简单的示例,展示了如何在Go Web应用中对数据进行分页。

步骤 1: 编写分页查询函数
package mainimport ("database/sql""net/http""strconv"_ "github.com/go-sql-driver/mysql"
)// paginateQuery 执行分页查询
func paginateQuery(db *sql.DB, query string, page int, pageSize int) (*sql.Rows, error) {offset := (page - 1) * pageSizereturn db.Query(query, offset, pageSize)
}
步骤 2: 编写HTTP处理函数
func ordersHandler(w http.ResponseWriter, r *http.Request) {pageStr := r.URL.Query().Get("page") // 获取页码pageSizeStr := r.URL.Query().Get("pageSize") // 获取每页数据量page, err := strconv.Atoi(pageStr)if err != nil || page <= 0 {page = 1 // 默认页码为1}pageSize, err := strconv.Atoi(pageSizeStr)if err != nil || pageSize <= 0 {pageSize = 10 // 默认每页10条数据}db, err := sql.Open("mysql", "your_db_connection_string")if err != nil {http.Error(w, "Database connection failed", http.StatusInternalServerError)return}defer db.Close()rows, err := paginateQuery(db, "SELECT * FROM orders LIMIT ? OFFSET ?", page, pageSize)if err != nil {http.Error(w, "Failed to query orders", http.StatusInternalServerError)return}defer rows.Close()// 处理rows,例如转换为JSON并返回// ...
}
步骤 3: 启动HTTP服务器
func main() {http.HandleFunc("/orders", ordersHandler)http.ListenAndServe(":8080", nil)
}

在这个示例中,我们定义了一个paginateQuery函数来执行分页查询。在HTTP处理函数ordersHandler中,我们首先解析请求参数中的页码和每页数据量,然后调用paginateQuery函数获取当前页的数据。最后,我们将当前页的数据返回给客户端。

请注意,这个示例假设你已经有一个名为orders的数据库表,并且你的数据库连接字符串是正确的。在实际应用中,你可能需要根据实际的数据库表结构和业务需求调整查询语句和处理逻辑。

七、重要性

数据操作在应用程序设计中的重要性不言而喻,它是构建现代应用程序的核心部分。以下是数据操作在应用程序设计中的几个关键重要性:

  1. 数据管理

    • 应用程序通常需要存储、检索和更新数据,数据操作提供了管理这些数据的基本能力。
  2. 业务逻辑实现

    • 数据操作是实现业务逻辑的基础,它们允许应用程序执行必要的操作来满足业务需求。
  3. 用户体验

    • 通过有效的数据操作,应用程序可以提供快速响应和流畅的用户体验,例如实时搜索、过滤和排序功能。
  4. 数据一致性和完整性

    • 正确的数据操作可以确保数据的一致性和完整性,防止数据损坏和丢失。
  5. 安全性

    • 数据操作需要考虑到安全性,包括数据的验证、授权和加密,以保护敏感数据不被未授权访问。
  6. 可扩展性

    • 良好的数据操作设计可以支持应用程序的扩展,处理不断增长的数据量和用户请求。
  7. 性能优化

    • 优化的数据操作可以提高应用程序的性能,减少响应时间和提高吞吐量。
  8. 数据分析和报告

    • 数据操作使得从数据库中提取和聚合数据成为可能,这对于数据分析和生成报告至关重要。
  9. 数据迁移和备份

    • 数据操作还包括数据迁移和备份,这对于数据恢复和灾难恢复计划是必要的。
  10. API和集成

    • 数据操作为应用程序提供了与其他系统和API集成的能力,允许数据在不同系统间流动。
  11. 国际化和本地化

    • 对于全球运营的应用程序,数据操作需要支持不同语言和地区的数据格式和规则。
  12. 法规遵从

    • 数据操作必须遵守相关的数据保护法规,如GDPR或HIPAA,确保数据处理符合法律要求。
  13. 测试和调试

    • 数据操作的代码需要被彻底测试和调试,以确保应用程序的稳定性和可靠性。

总之,数据操作是应用程序设计和开发中的基石,它们直接影响应用程序的功能、性能和用户体验。因此,设计健壮、高效和安全的数据操作机制对于任何应用程序的成功至关重要。

相关文章:

青少年编程与数学 02-004 Go语言Web编程 14课题、数据操作

青少年编程与数学 02-004 Go语言Web编程 14课题、数据操作 一、数据操作二、CRUD说明&#xff1a; 三、数据验证为什么需要数据验证&#xff1f;Go Web应用中的数据验证示例步骤 1: 定义订单结构体步骤 2: 实现验证逻辑步骤 3: 在HTTP处理函数中使用验证 四、数据格式化什么是数…...

Java 中 ConcurrentHashMap 和 HashMap 能存 null 吗?深挖原理和使用场景

前言 当你使用 HashMap 或 ConcurrentHashMap 时&#xff0c;可能会冒出一个经典问题&#xff1a;它们能存储 null 键或 null 值吗&#xff1f; 初学者可能觉得无所谓&#xff0c;试一下不就知道了&#xff0c;但在真实项目中&#xff0c;这个问题可能导致严重的 bug。今天我们…...

【JavaWeb后端学习笔记】Spring Task实现定时任务处理

Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 主要的应用场景有&#xff1a;纪念日提醒&#xff0c;处理订单未支付&#xff0c;还款提醒等。 1、corn表达式 使用Spring Task首先需要了解corn表达式&#xff0c;通过cor…...

【CSS in Depth 2 精译_087】14.4:CSS 中的浮动特效以及在文字环绕中的应用 + 14.5:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 14 章 蒙版、形状与剪切】 ✔️ 14.1 滤镜 14.1.1 滤镜的类型14.1.2 背景滤镜 14.2 蒙版 14.2.1 带渐变效果的蒙版特效14.2.2 基于亮度来定义蒙版14.2.3 其他蒙版属…...

探索 Python编程 调试案例:计算小程序中修复偶数的bug

在 学习Python 编程的过程里&#xff0c;会遇到各种各样的bug。而修复bug调试代码就像是一场充满挑战的侦探游戏。每一个隐藏的 bug 都是谜题&#xff0c;等待开发者去揭开真相&#xff0c;让程序可以顺利运行。今天&#xff0c;让我们通过一个实际案例&#xff0c;深入探索 Py…...

探索 CI/CD 工具的力量

CI/CD 工具是什么&#xff1f; CI/CD 工具是开发者的“生产力加速器”。它通过自动化代码构建、测试、部署等流程&#xff0c;消除了繁琐的手动操作&#xff0c;确保开发和运维的无缝衔接。借助这些工具&#xff0c;开发者不仅能够更快地发布产品&#xff0c;还能更早发现问题…...

MySQL和Oracle的区别

MySQL和Oracle的区别 MySQL是轻量型数据库&#xff0c;并且免费&#xff0c;没有服务恢复数据。 Oracle是重量型数据库&#xff0c;收费&#xff0c;Oracle公司对Oracle数据库有任何服务。 1.对事务的提交 MySQL默认是自动提交&#xff0c;而Oracle默认不自动提交&#xff0…...

亚马逊云科技 re:Invent 2024重磅发布!Amazon Bedrock Data Automation 预览版震撼登场

AWS re:Invent 2024 已圆满落幕&#xff01; 在本次大会中&#xff0c;隆重推出了一项全新功能&#xff1a; Amazon Bedrock Data Automation&#xff08;预览版&#xff09;震撼登场&#xff01; New Amazon Bedrock capabilities enhance data processing and retrieval | …...

SQL语句练习

阅读《SQL必知必会》&#xff08;第五版&#xff09;然后结合往常表做的练习记录 这里使用的数据库时sqlite3,使用的工具时navicat 表资源链接https://wenku.baidu.com/view/349fb3639b6648d7c1c74652.html 表录入后如上图所示。后面如果有多张表之间的操作&#xff0c;在引入…...

保姆级教程Docker部署RabbitMQ镜像

目录 1、创建挂载目录 2、运行RabbitMQ容器 3、Compose运行RabbitMQ容器 4、开启界面插件 5、查看RabbitMQ运行状态 6、常见问题处理 1、创建挂载目录 # 创建宿主机rabbitMQ挂载目录 sudo mkdir -p /data/docker/rabbitmq/log# 修改log目录权限 sudo chmod 777 /data/do…...

P6打卡—Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import matplotlib.pyplot as plt import torchvisiondevicetorch.device("cuda" if torch.cuda.is_…...

clickhouse-介绍、安装、数据类型、sql

1、介绍 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用SQL查询实时生成分析数据报告。 OLAP&#xff08;On-Line A…...

基于单片机的智能婴儿床监护系统多功能婴儿床摇篮系统

功能介绍 以STM32单片机为控制核心蓝牙传输控制可以进行哭闹检测、尿床检测、音乐播放、语音提醒、哭闹时可以进行摇床有不同的模式自动模式和睡眠模式 实物可做&#xff0c;其他功能也可以 电路图 PCB 源代码 u8 Temperature_High; //室内温度高阈值 u8 Temperature_…...

微服务??

1、微服务架构的定义是什么&#xff1f; 微服务架构是一种将应用程序拆分为多个小型、独立服务的架构风格&#xff0c;每个服务专注于完成特定功能&#xff0c;通过轻量级通信协议&#xff08;如HTTP/REST、gRPC&#xff09;进行协作。 2、微服务和单体架构有哪些主要区别&am…...

14-zookeeper环境搭建

0、环境 java&#xff1a;1.8zookeeper&#xff1a;3.5.6 1、下载 zookeeper下载点击这里。 2、安装 下载完成后解压&#xff0c;放到你想放的目录里。先看一下zookeeper的目录结构&#xff0c;如下图&#xff1a; 进入conf目录&#xff0c;复制zoo_sample.cfg&#xff0…...

计算机网络 八股青春版

什么是HTTP&#xff1f;HTTP和HTTPS的区别 HTTP HTTP是超文本运输协议&#xff0c;是一种无状态&#xff08;每次请求都是独立的&#xff09;的应用层协议。用于在客户端和服务器之间传输超文本数据&#xff08;如HTML文件&#xff09;。默认端口是80数据以明文形式传输&#…...

快速解决oracle 11g中exp无法导出空表的问题

在一些生产系统中&#xff0c;有些时候我们为了进行oracle数据库部分数据的备份和迁移&#xff0c;会使用exp进行数据的导出。但在实际导出的时候&#xff0c;我们发现导出的时候&#xff0c;发现很多空表未进行导出。今天我们给出一个快速解决该问题的办法。 一、问题复现 我…...

Unity 6 Preview(预览版)新增功能

原文链接&#xff1a;Unity - 手册&#xff1a;Unity 6 预览版中的新增功能 目录 原文链接&#xff1a;Unity - 手册&#xff1a;Unity 6 预览版中的新增功能 编辑器和工作流程 UI 工具包 实体 图形 URP HDRP &#xff08;HDRP&#xff09; 多人游戏 游戏对象的 Netc…...

Halcon单相机+机器人=眼在手上#标定心得

首先&#xff0c;这个标定板肯定是放在我们要作业的工作台上的 目的 **1&#xff0c;得到标定物&#xff08;工作台&#xff09;与机器人底座之间的pose转换关系。2&#xff0c;得到相机与机器人末端tool的的转换关系。 两个不确定的定量 1&#xff0c;标定板与机器人底座b…...

Django 模板分割及多语言支持案例【需求文档】-->【实现方案】

Django 模板分割及多语言支持案例 这个案例旨在提供一个清晰的示范&#xff0c;展示如何将复杂的页面分解为多个可复用的模板组件&#xff0c;使代码更加模块化和易于管理。希望这篇案例文章对你有所帮助。 概述 在 Django 项目开发中&#xff0c;使用模板分割和多语言支持能…...

【hackmyvm】Diophante 靶场

1. 基本信息^toc 这里写目录标题 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描2.3. knock 3. WordPress利用3.1. wpscan扫描3.2. smtp上传后门 4. 提权4.1. 提权leonard用户4.2. LD劫持提权root 靶机链接 https://hackmyvm.eu/machines/machine.php?vmDiophante 作者…...

基于MATLAB的图像增强

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 一、背景及意义介绍背景图像采集过程中的局限性 意义 二、概述三、代码结构及说明&#xff08;一&#xff09;整体结构&#xff08;二&#xf…...

P10425 [蓝桥杯 2024 省 B] R 格式

题目描述&#xff1a; 小蓝最近在研究一种浮点数的表示方法&#xff1a;R 格式。对于一个大于 00 的浮点数 d&#xff0c;可以用 R 格式的整数来表示。给定一个转换参数 n&#xff0c;将浮点数转换为 R 格式整数的做法是&#xff1a; 将浮点数乘以 2^n。四舍五入到最接近的整…...

《软件工程文档攻略:解锁软件开发的“秘籍”》

《软件工程文档攻略&#xff1a;解锁软件开发的“秘籍”》 一、引言&#xff08;一&#xff09;简述软件工程文档的重要地位 二、软件文档的分类及作用&#xff08;一&#xff09;按形式分类1. 工作表格2. 文档或文件 &#xff08;二&#xff09;按产生和使用范围分类1. 开发文…...

Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...

sqlilabs靶场二十一关二十五关攻略

第二十一关 第一步 可以发现cookie是经过64位加密的 我们试试在这里注入 选择给他编码 发现可以成功注入 爆出表名 爆出字段 爆出数据 第二十二关 跟二十一关一模一样 闭合换成" 第二十三关 第二十三关重新回到get请求&#xff0c;会发现输入单引号报错&#xff0c…...

时间管理系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…...

长轮询DeferredResult原理

DeferredResult常用来实现客户端长轮询&#xff0c;可以将异步处理的结果在特定时间内&#xff08;如果设置了超时时间&#xff09;返回给客户端。 Slf4j RestController RequestMapping("/demo") public class DemoDeferredResult {GetMapping("/deferredResu…...

TouchGFX移植(5)增加触屏驱动

一&#xff09;增加驱动代码gt9xxx.c和ctiic.c到工程中的BSP目录下: 二&#xff09;更改触摸文件STM32TouchController.cpp 1&#xff09;在STM32TouchController.cpp文件中增加&#xff1a; #include “gt9xxx.h” 2&#xff09;增加gt9xxx_init(); void STM32TouchControlle…...

(九)腾讯cloudstudio(ubuntu)+akiaaa大神 Stable Diffusion整合包 AI绘画教程

一、说明 在网上转了一圈&#xff0c;发现确实akiaaa大神的整合包不错&#xff0c;看看这界面就比我前面的流弊多了&#xff0c;后面我们就要把这个界面一步一步干出来 二、环境准备 这里和前面的一样 &#xff08;七&#xff09;腾讯cloudstudioStable-Diffusion-webui AI绘…...

设计模式-访问者设计模式

介绍 访问者模式&#xff08;Visitor&#xff09;&#xff0c;表示一个作用于某对象结构中的各元素的操作&#xff0c;它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。 问题&#xff1a;在一个机构里面有两种员工&#xff0c;1.Teacher 2.Engineer 员…...

深度学习实战车辆目标跟踪【bytetrack/deepsort】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化&#xff0c;该数据集包含丰富的车辆目标图像样本…...

lammps中EDGE、INF、NULL等常量的含义

在lammps命令中,有几个比较常见的量:EDGE、INF、NULL,不少初学者不知道什么意思,本文详细介绍一下这几个量的含义及用法。 1. EDGE EDGE表示当前box的边界,常用到需要设置坐标的命令中,如region、fix wall/reflect。 EDGE仅表示当前box边界的坐标值,当box尺寸发生变化后…...

Mono里建立调试C#脚本运行环境

前面已经介绍了怎么样来执行一个嵌入式的脚本框架, 这个框架是mono编写的一个简单的例子。 如果不清楚,可以参考前文: https://blog.csdn.net/caimouse/article/details/144632391?spm=1001.2014.3001.5501 本文主要来介绍一下,我们的C#脚本是长得怎么样的,它大体如下…...

241221面经

1&#xff0c;JVM 的实现中堆、栈和方法区的区别是什么&#xff1f; 堆&#xff08;Heap&#xff09; 功能 堆是 JVM 内存中最大的一块&#xff0c;主要用于存储对象实例。无论是通过new关键字创建的对象&#xff0c;还是数组&#xff0c;都在堆上分配内存。它是被所有线程共享…...

【论文复刻】新型基础设施建设是否促进了绿色技术创新的“量质齐升”—来自国家智慧城市试点的证据(C刊《中国人口·资源与环境》

一、数据来源&#xff1a;住建部、国家知识产权局、中国城市统计年鉴&#xff0c;内含原始数据、处理代码和基准回归 二、数据范围&#xff1a; DID 为了延长政策效应估计的时间区间&#xff0c;将住建部公布的首批国家智慧城市作为处理组&#xff0c;非试点城市作为对照组。将…...

libreoffice表格python宏教程 一

一、安装python宏扩展 LibreOffice自带了一个宏编辑器&#xff0c;但是只能用basic语言&#xff0c;无法用Python。 所以&#xff0c;我们必须在单独的编辑器中编写Python代码。 需要安装apso扩展&#xff0c;此扩展可以创建删除管理python宏文件&#xff0c;同时还能设置偏好…...

C/C++语言基础--C++STL库之仿函数、函数对象、bind、function简介

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 STL无疑是C史上一个重要的发明&#xff0c;未来我将更新STL有关的知识点&#xff0c;入门绝对够了(看目录就知道了&#x1f440;)这是第二篇&#xff0c;讲仿函数C语言后面也会继续更新知识点&#xff0c;如…...

前端导出PDF的组件及方法

前端导出PDF的组件及方法 在Web应用程序中&#xff0c;导出PDF文件是一项常见的需求。无论是为了打印、分享还是存档&#xff0c;能够将网页内容转换为PDF格式都非常有用。幸运的是&#xff0c;前端开发者有多种方法和组件可以实现这一功能。在本文中&#xff0c;我们将详细介…...

大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

水文知识图谱构建-学习+代码

文章目录 水文模型知识图谱构建与应用&#xff08;核心&#xff09;面向水利防汛抢险的知识图谱构建与应用知识图谱在水利工程中的构建与应用代码 水文模型知识图谱构建与应用&#xff08;核心&#xff09; 水文模型知识图谱构建与应用 题目&#xff1a;水文模型知识图谱构建…...

python rabbitmq实现简单/持久/广播/组播/topic/rpc消息异步发送可配置Django

windows首先安装rabbitmq 点击参考安装 1、环境介绍 Python 3.10.16 其他通过pip安装的版本(Django、pika、celery这几个必须要有最好版本一致) amqp 5.3.1 asgiref 3.8.1 async-timeout 5.0.1 billiard 4.2.1 celery 5.4.0 …...

clickhouse优化记录

一、注重使用分区键来加快查询 在大数据量的情况下&#xff0c;如果查询语句中&#xff0c;可以使用分区键来进行查询&#xff0c;可以极大缩小数据的查询范围&#xff0c;加快查询速度。 二、使用order by的列&#xff0c;适用最左前缀匹配原则 比如表的结构是 order by(id…...

RabbitMQ如何构建集群?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ如何构建集群&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ如何构建集群&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在RabbitMQ中&#xff0c;集群&#xff08;Cluster&#x…...

Python解压tar压缩文件

import tarfile import os# 解压文件def untar(self, log_tar_file, destination_dir):# 打开tar文件tar_file_path for tar_file_path in glob.glob(os.path.join(log_tar_file, **/*.tar), recursiveTrue):print(日志压缩文件&#xff1a;,tar_file_path)if ! tar_file_pat…...

Mac升级macOS 15 Sequoia后,无法ssh连接本地虚拟机

现象 macOS 15后&#xff0c;无法ssh连接本地启动的虚拟机&#xff0c;提示错误&#xff1a; No route to host&#xff0c;也ping不通。包括UTM、Parallels Desktop这两个虚拟机软件。之前都是没问题的&#xff0c;通过一些简单排查&#xff0c;目前没发现什么问题。 在虚拟…...

Unity录屏插件-使用Recorder录制视频

目录 1.Recorder的下载 2.Recorder面板 2.1常规录制属性 2.2录制器配置 2.2.1添加录制器 2.2.2配置Input属性 2.2.3配置 Output Format 属性 2.2.4配置 Output File 属性 3.Recorder的使用 3.1录制Game View视频 3.1.1Recorder配置与场景搭建 3.1.2开始录制 3.1.3…...

[ESP]从零开始的Arduino IDE安装与ESP环境配置教程

一、前言 最近也是在比赛方面比较忙&#xff0c;没有更多的时间和精力去更新长文章了。这几周都更倾向于环境搭建的教程&#xff0c;这类教程写起来确实方便&#xff0c;也不怎么费时间&#xff0c;一个下午基本可以搞定&#xff0c;哈哈&#xff0c;我保证不是在为自己想摆烂找…...

重拾设计模式--状态模式

文章目录 状态模式&#xff08;State Pattern&#xff09;概述状态模式UML图作用&#xff1a;状态模式的结构环境&#xff08;Context&#xff09;类&#xff1a;抽象状态&#xff08;State&#xff09;类&#xff1a;具体状态&#xff08;Concrete State&#xff09;类&#x…...

2024年全球办公键盘行业总体规模、主要企业国内外市场占有率及排名

根据QYResearch研究团队调研统计&#xff0c;2023年全球办公键盘市场销售额达到了 亿元&#xff0c;预计2030年将达到 亿元&#xff0c;年复合增长率&#xff08;CAGR&#xff09;为 %&#xff08;2024-2030&#xff09;。中国市场在过去几年变化较快&#xff0c;2023年市场规模…...